--sys-stage코드로.
홈, 문서, 위키와 프로젝트가 같은 언어로 보이고 작동하도록 토큰과 컴포넌트, 행동 규칙을 하나의 계약으로 관리합니다.
화면마다 값을 고르지 않고 의미가 있는 역할을 선택합니다.
--sys-*shadcn/uiBase UI색상, 타이포그래피, 간격과 레이아웃의 공통 기준입니다.
--sys-stage--sys-workbench--sys-sheet페이지와 컴포넌트가 놓이는 다섯 단계의 기본 재질
--sys-stageoklch(0.125 0.023 236)--sys-workbenchoklch(0.17 0.028 236)--sys-workbench-strongoklch(0.205 0.032 236)--sys-sheetoklch(0.975 0.014 218)--sys-sheet-mutedoklch(0.94 0.024 218)텍스트와 경계가 표면 위에서 만드는 기본 대비
--sys-inkoklch(0.17 0.025 236)--sys-ink-mutedoklch(0.35 0.032 232)--sys-ink-inverseoklch(0.955 0.012 218)--sys-ink-inverse-mutedoklch(0.75 0.026 220)--sys-ruleoklch(0.79 0.025 220)--sys-rule-inverseoklch(0.31 0.035 234)행동과 LIKELION TUK의 인상을 만드는 고유 색
--sys-brand-boldoklch(0.49 0.17 234)--sys-brand-accentoklch(0.86 0.075 215)--sys-brand-on-boldoklch(0.955 0.012 218)--sys-brand-on-accentoklch(0.12 0.025 236)--color-signaloklch(0.86 0.17 96)정보·성공·주의·위험·포커스를 구분하는 상태 색
--sys-information-on-darkoklch(0.78 0.075 215)--sys-positive-on-darkoklch(0.76 0.10 155)--sys-warning-on-darkoklch(0.80 0.11 80)--sys-danger-on-darkoklch(0.74 0.15 25)--sys-focusoklch(0.63 0.18 235)--sys-focus-on-darkoklch(0.86 0.075 215)페이지 기본 재질
--background--sys-sheet--background--sys-workbench한 단계 구분되는 구획
--muted--sys-sheet-muted--muted--sys-workbench-strong제목·본문 기본 전경
--foreground--sys-ink--foreground--sys-ink-inverse설명·보조 메타데이터
--muted-foreground--sys-ink-muted--muted-foreground--sys-ink-inverse-muted행·패널·입력 경계
--border--sys-rule--border--sys-rule-inverse행동 그룹의 대표 행동 1개
--primary--sys-brand-bold--primary--sys-action-on-darkhover·selected의 낮은 강조
--accent--sys-action-subtle--accent--sys-action-subtle-on-dark키보드 focus-visible 전용
--ring--sys-focus--ring--sys-focus-on-dark--sys-type-display-*clamp(4rem, 10vw, 10rem) · 700 · 0.82 · −0.08emHome hero와 signature scene 전용상상력.
--sys-type-section-*clamp(2.3rem, 4.8vw, 4.6rem) · 700 · 1.10 · −0.06em에디토리얼 route의 주요 section작동하는 결과까지.
--sys-type-title-*clamp(1.75rem, 3vw, 3rem) · 700 · 1.10 · −0.04emfeature·route·large panel 제목만들면서 배우는 기록
--sys-type-heading-*1.25rem / 20px · 600 · 1.40 · −0.025emcomponent·dialog·panel 제목프로젝트 공개 상태
--sys-type-body-lg-*1rem / 16px · 400 · 1.75rem / 28px · 0긴 본문과 읽기 중심 화면설명은 읽는 속도를 방해하지 않는 폭과 행간을 유지합니다.
--sys-type-body-*0.875rem / 14px · 400 · 1.5rem / 24px · 0짧은 설명·목록·component body현재 상태와 다음 행동을 짧고 분명하게 설명합니다.
--sys-type-ui-*0.875rem / 14px · 500 · 1.25rem / 20px · 0button·tab·field label프로젝트 저장
--sys-type-meta-*0.75rem / 12px · 600 · 1rem / 16px · +0.06em짧은 분류·상태·기술 labelCORE · UPDATED 07.27
--sys-type-code-*0.75rem / 12px · 400 · 1.25rem / 20px · 0token·경로·코드·식별자--sys-action
| Token | Value | Preview | Use |
|---|---|---|---|
--sys-space-0-5 | 2px | optical correction only | |
--sys-space-1 | 4px | micro inset·icon correction | |
--sys-space-1-5 | 6px | compact control anatomy only | |
--sys-space-2 | 8px | icon–label·dense inline gap | |
--sys-space-3 | 12px | field stack·compact cell padding | |
--sys-space-4 | 16px | default control group·row padding | |
--sys-space-5 | 20px | large control padding·small gutter | |
--sys-space-6 | 24px | panel padding·default grid gap | |
--sys-space-8 | 32px | compact content block | |
--sys-space-10 | 40px | subsection separation | |
--sys-space-12 | 48px | large content group | |
--sys-space-16 | 64px | major content break | |
--sys-space-20 | 80px | large layout break | |
--sys-space-24 | 96px | page section minimum | |
--sys-space-36 | 144px | editorial section maximum |
100rem max--sys-container-maxwide 화면의 외곽선--sys-gutter20–72px responsive page inset--sys-reading-max긴 본문 최대 폭--sys-grid-columnsdesktop composition--sys-section-space96–160px section rhythm--sys-navigation-heightglobal navigation--sys-radius-control0pxbutton·input·badge의 Core 기본값
--sys-radius-surface0pxpanel·dialog·empty의 구조 경계
--sys-radius-workbench6pxDocs 같은 고밀도 작업면 내부에만 허용
--sys-radius-round999remavatar·progress dot only
| Token | Preview | Value | Use |
|---|---|---|---|
--sys-rule-hair | 1px | section·row·panel boundary | |
--sys-rule-strong | 2px | selected·focus·active indicator | |
--sys-shadow-raised | 0 1px 2px oklch(0.08 0.02 232 / 0.18), 0 12px 32px -20px oklch(0.08 0.02 232 / 0.42) | popover·floating toolbar | |
--sys-shadow-overlay | 0 2px 8px oklch(0.08 0.02 232 / 0.22), 0 28px 72px -24px oklch(0.08 0.02 232 / 0.58) | dialog·modal only |
--sys-icon-sm16pxbutton·metadata
--sys-icon-md20pxnavigation·field affordance
--sys-icon-lg24pxempty state·feature marker
프로젝트와 위키에서 사용하는 핵심 UI와 상태를 확인합니다. 이 섹션에 명시된 항목만 새 화면에서 지원하는 공개 컴포넌트 계약입니다.
Docs · console · dark tool
Wiki · record · editorial
import { ArrowRight } from "lucide-react"
import { Button } from "@/components/ui/button"
export function ProjectActions() { return ( <div className="flex flex-wrap gap-2"> <Button type="button">프로젝트 추가</Button> <Button type="button" variant="outline"> 문서 보기 <ArrowRight data-icon="inline-end" aria-hidden="true" /> </Button> </div> )}한 화면에서 위계 차이만 빠르게 비교합니다.
defaultsurface가 매핑한 대표 행동 1개
secondary대표 행동을 보조하는 안전한 행동
outline동일 위계의 보조 행동
ghosttoolbar와 낮은 위계 행동
destructive되돌리기 어려운 행동
link문장 안의 action; navigation은 Link 사용
색을 제거하고 실제 높이와 label 밀도만 비교합니다.
xs비터치 dense utility
smtable·toolbar
default기본 Button
lg강조 action
touchroute CTA·mobile hit area
xs비터치 dense utility
smtable·toolbar
default기본 Button
lg강조 action
touchroute CTA·mobile hit area
아이콘·shortcut·result meta
입력값·clear affordance
import { SearchField } from "@/components/ui/search-field"
<SearchField id="project-search" label="프로젝트 검색" name="project-search" placeholder="이름 또는 파트로 검색…" description="이름과 파트를 함께 검색합니다."/>한 문맥 안의 관련 패널
목표, 담당 파트와 최근 변경을 같은 상세 문맥에서 확인합니다.
결과 집합의 조건
전체 프로젝트 12개
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
<Tabs defaultValue="overview"> <TabsList aria-label="프로젝트 상세 보기"> <TabsTrigger value="overview">개요</TabsTrigger> <TabsTrigger value="activity">활동</TabsTrigger> </TabsList> <TabsContent value="overview">프로젝트 개요</TabsContent> <TabsContent value="activity">최근 활동</TabsContent></Tabs>active indicator · radius 0
상태 1개 · 메타데이터는 neutral
색은 좁은 면적에서만 의미 전달
import { Badge } from "@/components/ui/badge"import { StatusBadge } from "@/components/ui/status-badge"
<div className="flex items-center gap-2"> <Badge variant="neutral">Frontend</Badge> <StatusBadge tone="positive">공개</StatusBadge></div>Neutral분류·미결정
--borderInformation진행·검토·정보
--status-informationPositive완료·공개·정상
--status-positiveWarning주의·보완·지연
--status-warningDanger오류·실패·위험
--status-dangerfirst-use · filtered-empty · error
첫 프로젝트를 추가해 결과 영역을 시작하세요.
검색어를 지우거나 필터 범위를 넓혀 보세요.
연결을 확인한 뒤 같은 위치에서 다시 시도하세요.
import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyTitle,} from "@/components/ui/empty"
<Empty size="compact"> <EmptyHeader> <EmptyTitle>등록된 프로젝트가 없습니다.</EmptyTitle> <EmptyDescription>첫 프로젝트를 추가해 시작하세요.</EmptyDescription> </EmptyHeader> <EmptyContent><Button size="sm">프로젝트 추가</Button></EmptyContent></Empty>inline은 본문 rhythm을 상속
standalone은 44px hit area
색 기준은 외부 레퍼런스새 창에서 열림와 함께 검증합니다.
사람 위키import { ArrowRight } from "lucide-react"import { TextLink } from "@/components/ui/text-link"
<p> 시작하기 전에 <TextLink href="/docs" mode="inline">환경 설정 문서</TextLink>를 확인하세요.</p><TextLink href="/docs"> 기술 문서 <ArrowRight aria-hidden="true" /></TextLink>상위 경로는 링크 · 현재 위치는 텍스트
긴 경로는 중간 단계를 접어 유지
import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator,} from "@/components/ui/breadcrumb"
<Breadcrumb> <BreadcrumbList> <BreadcrumbItem><BreadcrumbLink href="/docs">문서</BreadcrumbLink></BreadcrumbItem> <BreadcrumbSeparator /> <BreadcrumbItem><BreadcrumbLink href="/docs">시작하기</BreadcrumbLink></BreadcrumbItem> <BreadcrumbSeparator /> <BreadcrumbItem><BreadcrumbPage>소개</BreadcrumbPage></BreadcrumbItem> </BreadcrumbList></Breadcrumb>현재 섹션은 선과 텍스트로 함께 표시
하위 제목은 한 단계 들여쓰기
import { OnThisPage } from "@/components/ui/on-this-page"
<OnThisPage items={[ { id: "role", label: "문서의 역할" }, { id: "tracks", label: "4개의 트랙" }, { id: "usage", label: "사용 방법" }, ]} activeId="role"/>명사형 열 · 행 hover · 숫자 정렬
import { Table, TableBody, TableCaption, TableCell, TableHead, TableHeader, TableRow,} from "@/components/ui/table"import { StatusBadge } from "@/components/ui/status-badge"
<Table> <TableCaption>최근 업데이트 순 · 3개 프로젝트</TableCaption> <TableHeader> <TableRow> <TableHead>프로젝트</TableHead> <TableHead>상태</TableHead> <TableHead className="text-right">업데이트</TableHead> </TableRow> </TableHeader> <TableBody> <TableRow interactive> <TableCell>StudyMate</TableCell> <TableCell><StatusBadge tone="positive">공개</StatusBadge></TableCell> <TableCell className="text-right tabular-nums">07.27</TableCell> </TableRow> </TableBody></Table>grows with wrapped content되돌릴 수 없는 작업에만 사용
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger,} from "@/components/ui/alert-dialog"
<AlertDialog> <AlertDialogTrigger render={<Button variant="destructive" />}> 프로젝트 삭제 </AlertDialogTrigger> <AlertDialogContent> <AlertDialogHeader> <AlertDialogTitle>StudyMate 프로젝트를 삭제할까요?</AlertDialogTitle> <AlertDialogDescription> 공개 이미지 4개와 활동 기록 18개가 함께 제거됩니다. 이 작업은 되돌릴 수 없습니다. </AlertDialogDescription> </AlertDialogHeader> <AlertDialogFooter> <AlertDialogCancel>취소</AlertDialogCancel> <AlertDialogAction variant="destructive">StudyMate 삭제</AlertDialogAction> </AlertDialogFooter> </AlertDialogContent></AlertDialog>export const project = { name: "StudyMate", status: "published", stack: ["Next.js", "TypeScript"],}import { DocsCodeBlock } from "@/components/ui/docs-code-block"
<DocsCodeBlock language="typescript" code={code} />상호작용, 접근성, 모션과 반응형 동작의 공통 규칙입니다.
| State | Visual | Timing | Accessibility |
|---|---|---|---|
| Hover | fill 또는 rule의 대비를 한 단계 높임 | 160ms | 필수 정보는 hover에만 두지 않음 |
| Press | 색 또는 1px 이하 변위로 즉시 피드백 | 160ms fast transition | reduced motion에서는 변위 없이 같은 상태를 전달 |
| Focus | 단일 2px outline + 2px offset · 복합 필드 3px ring | 즉시 | :focus-visible; surface별 --ring 매핑 |
| Disabled | 크기는 유지하고 대비를 낮춤 | 없음 | disabled 또는 이유가 있는 aria-disabled |
| Loading | label 폭과 control 위치 유지 | 작업 중 | aria-busy와 구체적인 진행 문구 |
| Empty | 기존 결과 영역을 유지 | 없음 | 빈 이유와 다음 행동 |
| Error | 원인 가까이에 Danger 역할 사용 | 없음 | 수정 또는 재시도 방법 |
| Cursor | pointer·text·not-allowed·wait·grab·resize | 즉시 | 커서만으로 상태를 전달하지 않음 |
| Area | Requirement |
|---|---|
| Semantics | 행동은 button, 이동은 Link, 데이터 비교는 table을 사용합니다. |
| Focus | 단일 컨트롤은 2px outline과 2px offset, 복합 필드는 3px group ring을 가집니다. |
| Forms | label·name·autocomplete를 제공하고 오류는 해당 field 바로 뒤에 둡니다. |
| Async | 변경 결과는 aria-live, 진행 중 control은 aria-busy로 전달합니다. |
| Content | 빈 값, 긴 이름, 좁은 폭에서도 정보와 다음 행동을 잃지 않습니다. |
| Motion | reduced motion에서 이동을 제거하고 같은 정보 구조를 유지합니다. |
| Role | Preview | Token | Duration | Use |
|---|---|---|---|---|
| Instant | --sys-motion-instant | 100ms | press · immediate acknowledgement | |
| Fast | --sys-motion-fast | 160ms | hover · compact feedback | |
| State | --sys-motion-state | 260ms | selection · filter · result change | |
| Layout | --sys-motion-layout | 420ms | panel · nearby layout transition | |
| Enter / Exit | --sys-motion-enter / --sys-motion-exit | 520ms / 210ms | entrance는 맥락을 보여주고 exit는 짧게 |
Reduced motion에서는 애니메이션 대신 완료 상태를 즉시 보여줍니다.
| Range | Width | Required behavior |
|---|---|---|
| Compact | 320–639px | 1열, secondary navigation은 overlay로 전환, table horizontal scroll |
| Small | 640–767px | 2열 허용, primary action full-width 해제 |
| Medium | 768–1023px | navigation 확장, secondary rail 조건부 표시 |
| Large | 1024–1279px | 12열 grid, 2–3열 composition |
| Wide | 1280px+ | 100rem container, reading width 유지, 외곽 여백만 확장 |