- Ship an AI guide in the package (ai/: usage rules, component catalog, design rules, composition patterns) via package.json files. - Add examples A-D that import only public exports: default header, viewer header, feature header, and a consumer-side search extension that reuses SWHeaderInput and the public SW tokens. - Add SW-only checks: docs/API consistency, tarball consumer project (React 19 + TS + Vite typecheck/build) and a browser check (27/27). - No runtime source or public API change; README gains a pointer section. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
6.8 KiB
6.8 KiB
SW 디자인 규칙
출처: @hm-design/sw styles.css(원본 src/theme/sw.css)의 토큰과 규칙, Figma 이지빔 SW rj6wpsfk24lOWvWiVRAANP node 26:8944와 사용자 확정값. 이 문서에 없는 값은 확정값이 아닙니다. 새 컴포넌트에 임의 값을 만들지 말고 아래 토큰을 var(--…)로 읽으세요.
- 토큰은
.hm-sw-header와.hm-sw-theme(<SWTheme>)에만 정의됩니다. 새 컴포넌트는 그 안에 렌더링합니다. - SW는
@hm-design/ui토큰을 쓰지 않습니다. UI 패키지 토큰을 복제하거나 섞지 않습니다. - Light/Dark 분기 없음. 전역 선택자(
html,body,*) 없음.
1. 크기·간격
| 항목 | 값 | 토큰 |
|---|---|---|
| Header 높이 / 면 높이 | 49px / 48px | --hm-sw-header-height / --hm-sw-header-bar-height |
| 면 사이 간격 | 2px | (Header bar gap) |
| 필드 높이 | 38px(면 안 위아래 5px) | --hm-sw-header-field-height |
| 필드 사이 간격 | 4px | --hm-sw-header-gap |
| 로고 슬롯 | 32 × 17 (홈 80 × 48 안 12, 16) | --hm-sw-header-logo-width / -height |
| 필드 폭 | 레이어 234, 색상 192, 선스타일 284, 문자·치수스타일 164 | — |
| 상세보기 / 창 영역 | 157 × 38 / 240 × 48(pill 85 × 42, 창 이동 88, 버튼 32 × 2) | — |
| 필드 내부 | padding 0 10px 0 11px, 텍스트 사이 12px | — |
2. 색·표면
| 역할 | 값 | 토큰 |
|---|---|---|
| Header 배경 | #060606 |
--hm-sw-header-background |
| 기본 글자 / 제목 | #F6F4F2 / #F0F7F5 |
--hm-sw-header-text-color / --hm-sw-header-title-color |
| Selected·On·Hover 글자 | #FFC600 |
--hm-sw-header-selected-color |
| 화살표 | #47AF91 |
--hm-sw-header-arrow-color |
| 파일명 면 | 세로 gradient, 테두리 #0E4C3A |
--hm-sw-header-document-background, --hm-sw-header-document-border-color |
| 객체 수정 면 | gradient, 테두리 #135643, radius 6px |
--hm-sw-header-object-background, -object-border-color, -object-radius |
| 속성 필드 면 | 검정 45–40% gradient, 테두리 #08251C, radius 3px, shadow 0 1px 4px rgba(9,39,30,.7) |
--hm-sw-header-property-background, -property-border-color, -property-radius, -property-shadow |
| 인쇄·K pill | rgba(0,0,0,.8), 테두리 #092920 |
--hm-sw-header-pill-background, -pill-border-color |
| 문서 Dropdown | #103127, 테두리 #041611 |
--hm-sw-header-document-menu-* |
| 필드 Dropdown(레이어·색상·선·문자·치수) | #27241D, 테두리 #000, radius 3px, 행 Hover #62533D + 글자 #FF5C00 |
--hm-sw-header-layer-menu-*, --hm-sw-header-layer-row-hover-* |
| Input | 글자 #E60403, 편집 #0F0D0A |
--hm-sw-header-input-* |
| Tooltip | rgba(0,0,0,.8) / #FFF |
--hm-sw-header-tooltip-* |
사용자 확정 면 3개(파일명·객체 수정·속성 필드)는 기본값 유지를 권장합니다.
3. Typography
| 항목 | 값 |
|---|---|
| 글꼴 | Noto Sans KR → Malgun Gothic → Apple SD Gothic Neo (Figma Dotum 대체, 의도된 결정). 폰트 파일은 앱이 로드 |
| 기본 / 라벨 | 14px / 12px (--hm-sw-header-font-size / --hm-sw-header-label-size) |
| Weight | 400, 500, 700만 사용(600 없음). 값·제목·토글 700 |
| 자간 | 값 0.04em, 라벨 0.02em, 파일명 0.06em |
| Text Stroke | Figma Stroke가 있는 텍스트만 검정 외곽선: 14·16px --hm-sw-header-text-outline(1.3px), 12px --hm-sw-header-label-outline(1px). 자기 색 Stroke 없음. More·Tooltip·+ New/Open 제외 |
| 말줄임 | 값은 한 줄 ellipsis, title로 전체 표시 |
4. 상태
| 상태 | 규칙 |
|---|---|
| Hover(테두리 있는 버튼·필드·More·인쇄·K) | 1px 테두리가 노란 세로 gradient로 바뀜(--hm-sw-header-hover-border-gradient, 폭 --hm-sw-header-hover-border-width). 크기·배경·그림자 변화 없음, 자기 Dropdown이 열린 필드는 Hover 없음 |
| Hover(파일명, 속성Bar/속성창 토글) | 글자만 #FFC600. 링·배경 없음 |
| Hover(필드 미리보기) | 텍스트·선/폰트/치수 미리보기 #FFC600 |
| Selected / On | 글자·단색 아이콘 #FFC600(data-selected="true"), 배경·테두리 변화 없음 |
| Expanded(Dropdown 열림) | 필드 테두리 #081813, 아래 모서리 직각, 필드+목록을 감싸는 1px 노란 링 |
| Focus | 2px #F0F7F5 outline, offset −2px(:focus-visible) |
| Disabled | opacity 0.4, 커서 기본. 창 버튼은 disabled 영향 없음 |
| 목록 행 | Hover와 Selected가 같은 강조(#62533D + #FF5C00) |
5. Overlay·Dropdown
- 필드 Dropdown은 필드 바로 아래(
top: 100%)에 겹쳐 열립니다. Portal·Dim 없음,z-index30. 화면(또는 Header) 밖으로 나가면 좌우만 보정합니다. 부모에overflow: hidden을 두지 않습니다. - 목록 최대 높이 240px(8행), 넘치면 내부 스크롤. 색상 팔레트 118px.
- 속성창·K 가이드는
position: fixedOverlay(뷰포트 안 보정, Portal·Dim 없음). - 한 번에 하나의 Dropdown(SWHeader). 단독 사용 시 각 컴포넌트가 바깥 클릭으로 스스로 닫힙니다.
6. Motion
| 대상 | 규칙 |
|---|---|
| 창 이동 Hover | 1.4s 반복(커서 상승 → 약 444ms 문구 → 오른쪽 위 이동 → 약 888ms부터 유지). Drag(:active) 중 정지. Reduced Motion: 원본 아이콘과 정적 Tooltip |
| K 가이드 | 원본 이미지 Pan/Zoom 반복(400ms 대기 후 1022·1022·511·511ms 전환). Reduced Motion 정적 |
| 레이어 토글 | 배경·아이콘 300ms ease-out |
| 기타 | Hover·Selected는 즉시 전환(Transition 없음) |
7. 반응형 (SWHeader 전용)
Container hm-sw-header 기준 Breakpoint: < 1800 선/문자/치수스타일 → More, < 1180 그리기모드 숨김, < 1080 상세보기 → More·창 이동 24px(창 영역 176), < 900 색상 → More, < 640 인쇄·K → More·창 이동 숨김(창 영역 64), < 520 레이어 상태 아이콘 숨김. More에서 고른 필드는 첫 칸(레이어 자리)에 표시되고 Dropdown이 바로 열립니다(UI 상태만, 데이터 Callback 없음).
조합 Header(개별 컴포넌트)에는 이 규칙이 적용되지 않습니다. 필요한 컨트롤만 배치하고 폭 정책은 소비 앱이 정합니다.
8. 새 컴포넌트 체크리스트
<SWTheme>(또는SWHeader의tools) 안에서 렌더링한다.- 표면·크기·색은 위 토큰만 쓴다. 필드형이면 38px·속성 필드 면·12px 라벨 + 14px 700 값.
- Hover/Focus/Disabled/Selected를 §4 규칙대로 구현한다(테두리형은 gradient 링, 텍스트형은 글자만
#FFC600). - 입력이 필요하면
SWHeaderInput을 재사용한다. - 값은 Props, 동작은 Callback. CAD 데이터를 내부에서 바꾸지 않는다.
hm-sw-*class를 새로 쓰거나 덮어쓰지 않는다(자기 접두사 사용, 예:app-).