Combine Task A (e8409ef, SW 0.2.0 integrated improvement) with Task B
(396539d, Figma-based SWHomeMenu / SWHomeMenuSection / SWHomeMenuItem /
SWRecentFiles). Task B's 84 new files are taken unchanged except for the
public-import Storybook update and joining the popup Escape stack.
- Export the home menu from @hm-design/sw
- SWHeader homeMenu / homeMenuOpen / defaultHomeMenuOpen /
onHomeMenuOpenChange: hidden by default, the logo toggles it (onHomeClick
is not called while homeMenu is set), placed from the measured header,
closes with / closes the document and field dropdowns
- Logo aria-expanded / aria-controls; menu layer CSS (z-index 20)
- AI catalog / patterns / design rules, example G, README, usage guide
- Storybook SW/Home Menu uses @hm-design/sw; integration story
Verified: SW typecheck, tsc -b, SW build, Storybook build, AI docs 22/22,
28/28 existing SW shots pixel-identical, regression 96 PASS / 0 FAIL,
home menu checks 22/22. Not run: tarball consumer install.
5.2 KiB
5.2 KiB
AI 가이드 초안 — SW 로고 클릭 메뉴 (SWHomeMenu)
상태: 통합 전 초안입니다(Task B 2단계, 2026-10-19). 통합 승인 후
packages/sw/ai/COMPONENT_CATALOG.md·COMPOSITION_PATTERNS.md·DESIGN_RULES.md로 옮깁니다. 지금은@hm-design/sw진입점에서 export되지 않으므로 소스 경로packages/sw/src/components/sw-home-menu를 사용합니다. 기준: Figmarj6wpsfk24lOWvWiVRAANP26:10591(메뉴), 26:11355…26:11631(타일 15개), 26:12604…(섹션 제목), 662:67267·662:67331·662:67471(최근파일 하위 패널). 구현:SWHomeMenu.tsx,SWRecentFiles.tsx,theme/sw-home-menu.css.
1. 무엇인가
- SW Header의 로고(홈) 버튼을 누르면 Header 위에 겹쳐 나타나는 2단 메뉴입니다. 기본은 숨김이고, 로고를 다시 누르면 닫힙니다.
- 구성: 섹션(제목 badge + 타일 그룹) 여러 개 → 섹션마다 80 × 46 타일 여러 개. 타일 하나가 하위 패널(예: 최근파일 목록)을 열 수 있습니다.
- 운영체제 파일 선택창이 아닙니다. "찾아열기" 같은 항목의 실제 동작(파일 대화상자 등)은 host가
onSelect에서 수행합니다.
2. 최소 사용법
import { SWHeader, SWTheme } from "@hm-design/sw"
import { SWHomeMenu, type SWHomeMenuSectionData } from "@hm-design/sw" // 통합 후 경로
const sections: SWHomeMenuSectionData[] = [
{ id: "file", title: "작업중인 파일", items: [
{ id: "save", label: "저장", icon: <SaveIcon />, toggle: false, onSelect: () => host.save() },
{ id: "export", label: "내보내기", icon: <ExportIcon /> },
] },
]
function App() {
const [open, setOpen] = useState(false)
return (
<div style={{ position: "relative" }}>
<SWHeader onHomeClick={() => setOpen(v => !v)} /* 기존 props */ />
{/* 통합 전: host가 위치를 지정합니다(Header 객체 수정 영역 왼쪽 - 2px, 창 영역 왼쪽까지). */}
<div style={{ position: "absolute", top: 0, left: objectAreaLeft - 2, maxWidth: windowLeft - objectAreaLeft + 2, zIndex: 3 }}>
<SWTheme><SWHomeMenu sections={sections} open={open} onOpenChange={setOpen} /></SWTheme>
</div>
</div>
)
}
3. 데이터 규칙 (새 메뉴를 만들 때)
| 하고 싶은 것 | 방법 |
|---|---|
| 항목 추가 | 섹션 items에 { id, label, icon }을 추가합니다. 폭·구분선·모서리·섹션 폭은 자동입니다 |
| 섹션 추가 | { id, title, items }를 추가합니다. 제목 badge 폭은 글자 + 46px로 자동입니다 |
| 숨김 | hidden: true. 자리를 남기지 않습니다 |
| 비활성 | disabled: true. 기존 SW 규칙대로 opacity .4이며 Hover가 없습니다 |
| 실행만 하는 버튼 | toggle: false. Active(Variant3)가 되지 않습니다 |
| 켜고 끄는 버튼 | 기본값(toggle 생략)입니다. 클릭하면 Active, 다시 클릭하면 Default입니다 |
| Active 제어 | activeIds + onActiveChange(controlled) 또는 defaultActiveIds. 하나만 켜려면 selection="single" |
| 하위 패널 | panel: <SWRecentFiles files={…} onFileOpen={…} />. 패널은 한 번에 하나만 열리고 열린 동안 하단 강조가 전체 외곽선이 됩니다 |
| 아이콘 | currentColor SVG 하나를 권장합니다(Default #B6B4AF, Hover·Active #FF5C00 자동). 색이 고정된 이미지 쌍이면 hoverIcon을 함께 줍니다 |
| 이벤트 | 항목 onSelect(event) → 메뉴 onItemSelect(event). event.active는 클릭 후 상태입니다 |
4. 상태와 닫기 (Figma 기준 + 접근성 보완)
| 동작 | 결과 | 근거 |
|---|---|---|
| 로고 클릭 | 열기 / 다시 클릭하면 닫기 | Figma btn_home ON_CLICK → OVERLAY, 재클릭 닫기는 사용자 확정 |
| 타일 Hover | Variant2: 주황 gradient 1px 테두리, 아이콘·글자 #FF5C00, 1px 위·왼쪽 이동 |
Figma Default ON_HOVER → V2 |
| 타일 클릭 | Variant3(Active, V2와 같은 모양) → 다시 클릭하면 Default | Figma V2 → V3 → Default |
| 메뉴 빈 곳 클릭 | 닫기 | Figma Group ON_CLICK → CLOSE (closeOnBackgroundClick) |
| Escape | 열린 패널을 먼저 닫고, 다시 누르면 메뉴를 닫은 뒤 로고로 Focus 복귀 | Figma 없음 · 접근성 (closeOnEscape) |
| 메뉴 밖 클릭 | 기본은 닫지 않음 | Figma overlay에 바깥 동작 없음 (closeOnOutsideClick) |
| ←/→/Home/End | 타일 사이 이동. 열린 패널 타일에서 ↓를 누르면 패널로 이동, ↑/↓로 행 이동, Enter로 파일 열기 | Figma 없음 · 접근성 |
| 최근파일 행 선택 | onFileOpen(file) 후 메뉴 닫기(closeOnOpen) |
Figma 없음 · 검토 대상 |
5. 하지 말 것
- 타일·섹션·제목을 Figma 화면별로 따로 만들지 않습니다. 모든 메뉴는
sections데이터 하나로 표현합니다. hm-sw-home-menu*class를 소비 코드에서 붙여 외형을 만들지 않습니다(className은 확장용입니다).- 새 색·크기를 임의로 정하지 않습니다. 필요한 값은
--hm-sw-home-menu-*·--hm-sw-recent-files-*토큰을style로 덮어씁니다. - Font Weight는 400/500/700만 씁니다(타일 라벨·파일명 700, 섹션 제목 400).
- 홈 버튼이나 창 영역을 메뉴 안에 다시 그리지 않습니다. 그것은
SWHeader가 담당합니다.