# Patterns
Composition and responsive rules for LafLabs Web Design 2026.10.3.
## Collection row (`collection-row`)
A full-width row separated by space and one-pixel rules. / 여백과 1px 선으로 반복 항목을 나누는 전체 폭 행입니다.
- Keep rules and spacing between items instead of wrapping each item in a card. / 카드로 감싸지 않고 항목 사이의 선과 간격을 유지합니다.
- Align name, description, and status or action to shared columns. / 이름, 설명, 상태나 동작의 열을 같은 기준선에 맞춥니다.
- Do not animate padding on hover. / hover에서 padding을 움직이지 않습니다.
- Related components: `button`, `separator`, `status-label`, `text-link`
## Contrast band (`contrast-band`)
A restrained Ink surface divides the flow of the light public theme. / 밝은 공개 화면 안에서 Ink 면을 제한적으로 사용해 흐름을 나눕니다.
- Use a dark band only for a clear content shift, such as the company statement. / 어두운 구간은 회사 소개처럼 분명한 내용 전환에만 씁니다.
- Use white for primary text and Blue Light for short highlights. / 기본 텍스트는 흰색, 짧은 강조는 Blue Light를 사용합니다.
- Do not restore legacy Page Navy as the default surface for new public pages. / legacy인 Page Navy를 새 공개 화면의 기본 배경으로 되살리지 않습니다.
- Related components: `logo`, `button-link`, `text-link`
## Document surface (`document-surface`)
A shared shell and reading rhythm connect document indices and detail pages. / 목록과 읽기 화면은 같은 shell과 본문 리듬을 유지합니다.
- Keep body measure, heading levels, dates, and metadata placement consistent. / 본문 폭, 제목 단계, 날짜와 메타데이터 위치를 문서마다 바꾸지 않습니다.
- Use Code Block for multiline code and distinguish it from inline identifiers. / 코드는 Code Block으로 표시하고 inline 식별자와 구분합니다.
- Use direct links between document indices and reading surfaces. / 목록과 본문 사이의 이동은 직접적인 링크로 제공합니다.
- Related components: `field`, `code-block`, `panel`, `separator`, `text-link`
## Editorial heading (`editorial-heading`)
A short heading and only the necessary copy establish a section's purpose. / 짧은 제목과 필요한 설명만으로 구간의 목적을 밝힙니다.
- Do not stack an eyebrow, number, and subtitle by default. / 보조 라벨, 번호, 부제를 습관처럼 겹치지 않습니다.
- Constrain heading and description measures separately to clarify hierarchy. / 제목과 설명의 폭을 따로 제한해 위계를 분명히 합니다.
- Add a Text Link only when the section needs an onward destination. / 다음 목적지가 필요할 때만 Text Link를 붙입니다.
- Related components: `text-link`
## Responsive collapse (`responsive-collapse`)
Desktop relationships become a one-column reading order on small screens. / 넓은 화면의 관계를 작은 화면에서 한 열의 읽기 순서로 바꿉니다.
- Stack complex grids at 1080px and simplify navigation and actions at 720px. / 1080px에서 복잡한 grid를 쌓고 720px에서 탐색과 동작을 정리합니다.
- Reorder the same content for reading instead of shrinking a desktop diagram. / 데스크톱 도식을 축소하지 말고 같은 내용을 읽기 순서로 다시 배치합니다.
- Keep a 44px target area on small screens. / 작은 화면의 동작 영역은 44px를 유지합니다.
- Related components: `button`, `button-group`, `field`, `segmented-control`
## Selected work (`selected-work`)
An editorial module pairing a real image with verified project copy. / 실제 이미지와 확인된 설명을 한 편집 모듈에 묶습니다.
- Use real images from public and never fabricate a product screen. / public에 있는 실제 이미지만 사용하며 가짜 화면은 만들지 않습니다.
- Show product status and destinations only when current data provides them. / 제품 상태와 목적지는 현재 데이터에 있을 때만 표시합니다.
- Provide previous and next actions as named, keyboard-operable buttons. / 이전과 다음 동작은 이름 있는 button으로 만들고 키보드 조작을 지원합니다.
- Related components: `button`, `segmented-control`, `text-link`
## Site chrome (`site-chrome`)
The existing Site Header and Footer frame every public surface. / 기존 Site Header와 Footer가 모든 공개 화면을 감쌉니다.
- Do not add a second fixed navbar inside a page. / 페이지 안에 두 번째 고정 내비게이션을 만들지 않습니다.
- Keep logo, locale, search, and document navigation in their established chrome positions. / 로고, 언어 선택, 검색, 문서 이동은 기존 공통 영역에 둡니다.
- Place page-local navigation inside the content shell. / 현재 페이지의 로컬 탐색은 콘텐츠 shell 안에 둡니다.
- Related components: `logo`, `segmented-control`, `button`, `text-link`
## System states (`system-states`)
Loading, empty, and error states share one visual and verbal grammar. / loading, empty, error 상태를 같은 화면 문법으로 설명합니다.
- Name the state and the next available action in short copy. / 상태와 다음 동작을 짧은 문장으로 알립니다.
- Provide a retry action for errors when recovery is available. / error에는 가능한 경우 retry 동작을 제공합니다.
- Do not fill empty states with invented example data. / empty 상태를 임의의 예시 데이터로 채우지 않습니다.
- Related components: `alert`, `button`, `empty-state`, `panel`, `skeleton`, `status-label`, `text-link`
# Recipes
Use a published Recipe before assembling a recurring documented task. Preserve the declared component semantics, state behavior, and task order instead of inventing a replacement abstraction.
## Collection state surface (`collection-state-surface`)
Explains loading, results, empty, and error states consistently in one collection surface. / 하나의 목록 영역에서 loading, 결과, empty, error 상태를 일관되게 설명합니다.
- Category: **system-state**
- Components: `panel`, `table`, `item`, `pagination`, `skeleton`, `empty-state`, `alert`, `status-label`, `button`
- Related Patterns: `collection-row`, `system-states`, `responsive-collapse`
- Use: Use when a table or list waits for asynchronous data and has multiple outcomes. / 표나 목록이 비동기 데이터를 기다리고 여러 결과 상태를 가질 때 사용합니다.
- Avoid: Do not use for immediate static content or one form-submission result. / 즉시 표시되는 정적 콘텐츠나 단일 폼 제출 결과에는 사용하지 않습니다.
- Accessibility: Name the state and next action in text without announcing loading or errors twice. / 상태 제목과 다음 동작을 텍스트로 제공하고 loading과 error를 중복 발표하지 않습니다.
- Anatomy:
1. Collection name and scope / 컬렉션 이름과 범위
2. Current state body / 현재 상태의 본문
3. State-specific next action / 상태별 다음 동작
4. Pagination when results exist / 결과가 있을 때의 페이지 이동
- States and inspection:
- `loading` [fixture]: Reserve space with a Skeleton matching the final collection structure. / 최종 목록 구조와 같은 Skeleton으로 공간을 유지합니다.
- `populated` [fixture]: Shows comparable columns, explicit status, and pagination. / 실제 비교 가능한 열과 상태, 페이지 이동을 표시합니다.
- `empty` [fixture]: Explains why the collection is empty and the first available action without fake results. / 빈 이유와 가능한 첫 행동을 설명하고 가짜 결과를 만들지 않습니다.
- `error` [fixture]: Keeps the error and recoverable retry action inside the collection context. / 오류와 복구 가능한 재시도 동작을 목록 맥락 안에 둡니다.
- Responsive behavior:
- On small screens, keep essential comparisons and reflow the rest into Item rows. / 작은 화면에서는 비교에 필요한 열만 유지하고 나머지는 Item 행으로 재배치합니다.
- Never hide the state title or retry action behind horizontal overflow. / 상태 제목과 재시도 동작은 가로 overflow 밖으로 숨기지 않습니다.
- Source paths: `components/design-system/recipes/collection-state-surface-demo.tsx`
### Usage shape
```tsx
import {
Item,
ItemActions,
ItemContent,
ItemTitle,
} from "@/components/ui/item"
import {
Pagination,
PaginationContent,
PaginationItem,
PaginationLink,
} from "@/components/ui/pagination"
import { Panel, PanelContent, PanelHeader, PanelTitle } from "@/components/ui/panel"
import { StatusLabel } from "@/components/ui/status-label"
import { Table, TableBody, TableCell, TableRow } from "@/components/ui/table"