시스템 상태 화면
404 · 403 · 500 · 점검. 무슨 일이 생겼는지 한 문장, 할 수 있는 일 하나 이상을 둡니다.
셸 밖에서는 SystemLayout(로고 · 가운데 빈 상태 · 바닥 정보)의 전체 화면이고, 셸 안에서는 내비를 그대로 두고 본문 자리에 Empty(page)만 둡니다. 빨강은 서버가 실패한 500 의 아이콘에만 쓰고, 찾을 수 없음 · 권한 없음 · 점검은 중립 · 정보로 말합니다. 오프라인은 화면을 막지 않고 셸 위 Banner(warn) 와 보낼 대기열로 다룹니다.
- import
- import { SystemLayout } from "@uyoolabs/ui/ui";
- 쓰는 경우
- 라우터의 not-found · 오류 경계 · 점검 응답처럼 셸을 그릴 수 없거나 그리지 않는 전체 화면에 씁니다.
- 쓰지 않는 경우
- 셸 안 화면에서 쓰지 않습니다(Empty page 로). 404 · 403 · 점검을 빨강으로 말하지 않습니다. 큰 일러스트 · 농담 문구로 원인을 가리지 않습니다. 스택 트레이스 · 내부 경로를 보이지 않습니다. 카드 하나의 실패로 화면 전체를 500 으로 바꾸지 않습니다. 오프라인 때 전체 화면을 막지 않습니다.
- 제목 · 포커스
- 브레드크럼이 없는 화면이라 제목이 h1 입니다(결정 #23). 문서 제목(<title>)이 상태를 말하고, 앱이 첫 포커스를 제목(tabIndex=-1)으로 옮깁니다.
셸 밖 — SystemLayout
머리(로고 · 상태 페이지) · 가운데 빈 상태 · 바닥(요청 ID · 시각).
uyoolabs
문제가 생겼습니다
잠시 뒤 다시 시도합니다. 계속되면 아래 요청 ID 로 지원팀에 문의합니다.
500 · 서버 오류
셸 안 — Empty(page)
내비를 남겨 다른 곳으로 갈 길을 둡니다.
이 프로젝트를 볼 권한이 없습니다
결제 프로젝트는 관리자만 봅니다.
상태별 규칙
P-System-States 보드의 조립 규칙입니다.
| 상태 | 원인 · 코드 | 톤 · 아이콘 | 할 수 있는 일 |
|---|---|---|---|
| 찾을 수 없음 | 404 · 지움 · 주소 바뀜 | 중립 · 검색 | 홈 · 검색. 지운 것은 누가 언제 + 되돌리기(30일) |
| 권한 없음 | 403 | 중립 · 자물쇠 | 권한 요청(누구에게) · 다른 계정. 숨겨야 하는 자원은 404 로 답합니다(있음을 드러내지 않는다) |
| 문제가 생김 | 500 · 502 · 504 | 오류 — 아이콘만 빨강 | 다시 시도 · 지원팀 · 요청 ID 복사 · 시각 |
| 점검 중 | 503 + Retry-After · 예정 공지 | 정보 · 렌치 | 상태 페이지. 끝나면 자동으로 다시 불러옵니다. 예정 시각은 UTC → 현지(시간대 글자) |
키보드
| 키 | 동작 |
|---|---|
| Tab | 머리 링크 → 동작 버튼 → 바닥의 요청 ID 복사 → 바닥 링크 순서입니다. 제목은 탭 순서에 없습니다. |
| EnterSpace | 동작 버튼 · 복사 버튼을 누릅니다. |
props
소스의 타입과 JSDoc 에서 생성한 표입니다. 컴포넌트를 고치면 pnpm gen 으로 다시 만듭니다.
SystemLayout
| prop | 타입 | 기본값 | 설명 |
|---|---|---|---|
| status필수 | "not-found" | "forbidden" | "error" | "maintenance" | — | 아이콘 · 톤 · 기본 문구를 정한다. 빨강은 error(서버가 실패한 5xx)의 아이콘에만 쓴다 |
| title | ReactNode | — | 없으면 status 의 기본 제목. 셸 밖 화면이라 h1 이다(W2-5 결정 #23) |
| description | ReactNode | — | 없으면 status 의 기본 설명(원인 + 할 일) |
| code | string | — | 상태 코드 · 경로('404 · /w/hanbit/docs/old'). 작게 mono. 스택 · 내부 경로는 넣지 않는다 |
| actions | ReactNode | — | 할 수 있는 일(홈으로 · 다시 시도 · 권한 요청). Button size="sm" |
| icon | ReactNode | — | 없으면 status 의 아이콘(검색 · 자물쇠 · 경고 · 렌치) |
| titleAs | "h1" | "h2" | "h1" | 제목 요소. 기본 h1. 문서 · 견본처럼 한 화면에 여럿 둘 때만 h2 |
| titleId | string | — | 제목 id. 앱이 첫 포커스를 이 제목으로 옮긴다(tabIndex=-1) |
| logo | ReactNode | — | 머리 왼쪽 로고 자리 |
| headerEnd | ReactNode | — | 머리 오른쪽(상태 페이지 링크 · 로그인한 계정) |
| requestId | string | — | 지원팀이 서버 기록을 찾을 요청 ID. 주면 바닥 줄에 복사 버튼과 함께 보인다 |
| occurredAt | string | Date | — | 일이 생긴 시각(UTC). requestId 옆에 timeZone 의 시각으로 보인다 |
| timeZone | string | "Asia/Seoul" | IANA 시간대. 기본 서울 |
| footer | ReactNode | — | 바닥 줄의 나머지(도움말 · 개인정보 처리방침 · 언어 · 마지막 확인 시각) |
| children | ReactNode | — | 빈 상태 대신 다른 몸을 그릴 때 |
| landmark | boolean | true | false 면 몸을 main 대신 div 로 그린다(문서 · 견본 안에 여러 장 둘 때). 기본 true |
| lang | "ko" | "en" | "ja" | — | |
| labels | Partial<SystemLayoutLabels> | — | |
| className | string | — |