diff --git a/.storybook/main.ts b/.storybook/main.ts index 0b2c1b2..200f60c 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -1,5 +1,58 @@ import type { StorybookConfig } from "@storybook/react-vite" -import { readFileSync } from "node:fs" +import { readFileSync, realpathSync } from "node:fs" +import { fileURLToPath } from "node:url" +import path from "node:path" +import type { Plugin } from "vite" + +// Checkouts that share another checkout's node_modules (a linked git worktree whose node_modules is a junction) also +// inherit that checkout's node_modules/@hm-design/* links. Those links point at the other checkout's packages/ui and its +// compiled dist, so Storybook would show the other checkout's tokens (a stale palette) instead of this checkout's. +// Only in that case, resolve the five @hm-design/ui entry points to this checkout's own source. Nothing is built, the +// other checkout's node_modules and dist are only read, and a checkout whose links already point at its own +// packages/ui keeps the unchanged dist-based resolution. +const checkoutRoot = fileURLToPath(new URL("../", import.meta.url)) +const localUiRoot = path.join(checkoutRoot, "packages/ui") +function uiLinkedElsewhere() { + try { + return realpathSync(path.join(checkoutRoot, "node_modules/@hm-design/ui")) !== realpathSync(localUiRoot) + } catch { + return false + } +} +const localUiAliases = [ + [/^@hm-design\/ui$/, "src/index.ts"], + [/^@hm-design\/ui\/theme$/, "src/theme/index.ts"], + [/^@hm-design\/ui\/theme\.css$/, "src/theme.css"], + [/^@hm-design\/ui\/tailwind\.css$/, "src/tailwind.css"], + [/^@hm-design\/ui\/dashboard-status\.css$/, "src/patterns/dashboard-status/dashboard-status.css"], +].map(([find, file]) => ({ find: find as RegExp, replacement: path.join(localUiRoot, file as string) })) + +// @hm-design/ui's dist/theme.css declares the bundled font with a relative URL. When node_modules/@hm-design/ui is +// symlinked to a checkout outside this Vite root, Vite rewrites that URL to /@fs/ and the dev preview +// gets a 403 ("outside of Vite serving allow list"). Point only that font URL at the /fonts static directory the +// Manager already uses, instead of widening server.fs.allow. theme.css is inlined through @import, so the rewrite +// runs on the already-resolved CSS and is limited to the exact ".../ui/dist/fonts/NotoSansKR-variable.ttf" URL. +// Dev server only: the static build emits the font as a bundled asset. +const UI_DIST_FONT_URL = /[^"'()\\\s]*\/ui\/dist\/fonts\/NotoSansKR-variable\.ttf/g +const FONT_STATIC_URL = "/fonts/NotoSansKR-variable.ttf" + +const hmUiThemeFontPath: Plugin = { + name: "hm-ui-theme-font-path", + apply: "serve" as const, + enforce: "post" as const, + transform(code: string, id: string) { + const file = id.split("?")[0] + if (!file.endsWith(".css") || !code.includes("NotoSansKR-variable.ttf")) return null + const next = code.replace(UI_DIST_FONT_URL, FONT_STATIC_URL) + if (next === code) { + if (!code.includes(FONT_STATIC_URL)) { + this.warn(`[hm-ui-theme-font-path] ${file}: found NotoSansKR-variable.ttf but not at ".../ui/dist/fonts/"; the URL was left unchanged and Preview may fail to load Noto Sans KR.`) + } + return null + } + return { code: next, map: null } + }, +} const config: StorybookConfig = { stories: ["../src/**/*.stories.@(ts|tsx)"], @@ -21,6 +74,13 @@ const config: StorybookConfig = { viteFinal: (config) => { config.server ??= {} config.server.watch = { ...config.server.watch, ignored: ["**/_local/**", "**/storybook-static/**"] } + config.plugins = [...(config.plugins ?? []), hmUiThemeFontPath] + if (uiLinkedElsewhere()) { + config.resolve ??= {} + const existing = config.resolve.alias + const current = Array.isArray(existing) ? existing : Object.entries(existing ?? {}).map(([find, replacement]) => ({ find, replacement })) + config.resolve.alias = [...localUiAliases, ...current] + } return config }, framework: "@storybook/react-vite", diff --git a/.storybook/manager.css b/.storybook/manager.css index bde02b5..3682277 100644 --- a/.storybook/manager.css +++ b/.storybook/manager.css @@ -61,13 +61,15 @@ background: var(--hm-fg-on-green-secondary); } #storybook-sidebar-region .sidebar-header { - margin: 0 20px 24px 0; + margin: 0 20px 0px 0; padding: 0; color: var(--color-fg-on-green-primary); } +/* The Settings button is hidden, so the title uses the full header width. */ +#storybook-sidebar-region .sidebar-header > div { margin-right: 0; } #storybook-sidebar-region .sidebar-header > div a { color: var(--color-fg-on-green-primary); - font: 700 20px/30px var(--hm-manager-font); + font: 700 16px/30px var(--hm-manager-font); white-space: normal; /* §6 Text Border: brand title keeps the original 1px (no shadow). */ -webkit-text-stroke: 1px var(--effect-text-border-color); @@ -78,7 +80,6 @@ } #storybook-sidebar-region [role='search'] { margin-right: 20px; - margin-bottom: 24px; } #storybook-sidebar-region .search-field { min-height: 44px; @@ -104,21 +105,25 @@ } /* Storybook's named creation action only; search/filter remain available. */ #storybook-sidebar-region button[aria-label='Create a new story'] { display: none; } +/* Storybook Settings menu trigger only; sidebar search, tag filter and expand/collapse remain. */ +#storybook-sidebar-region .sidebar-header button[aria-label='Settings'] { display: none; } +/* Storybook sidebar search landmark (input, icon, shortcut hint, tag filter); the tree and header remain. */ +#storybook-sidebar-region [role='search'] { display: none; } #storybook-explorer-tree .sidebar-subheading { position: relative; margin: 0; padding: 0 20px 0 0; - min-height: 56px; + min-height: 48px; color: var(--hm-fg-on-green-secondary); } #storybook-explorer-tree .sidebar-subheading[data-hm-section]:not([data-hm-section='0']) { - margin-top: 40px; + margin-top: 24px; } #storybook-explorer-tree .sidebar-subheading[data-hm-section]:not([data-hm-section='0'])::before { content: ''; position: absolute; - top: -20px; + top: -12px; left: 0; right: 20px; height: 2px; @@ -126,9 +131,9 @@ mask-image: linear-gradient(90deg, transparent, #000 20%, #000 80%, transparent); } #storybook-explorer-tree .sidebar-subheading > button { - min-height: 56px; + min-height: 48px; color: inherit; - font: 700 16px/28px var(--hm-manager-font); + font: 700 14px/28px var(--hm-manager-font); letter-spacing: 0; text-transform: none; } @@ -136,7 +141,7 @@ position: relative; margin: 0; padding: 0; - min-height: 56px; + min-height: 48px; overflow: visible; border: 0; border-radius: 0; @@ -163,22 +168,30 @@ display: flex; align-items: center; gap: 12px; - min-height: 56px; + min-height: 48px; height: auto; width: 100%; margin: 0; - padding: 14px 32px 14px 18px; + padding: 10px 32px 10px 18px; border: 0; border-radius: 4px 0 0 4px; background: transparent; color: inherit; - font: 700 18px/28px var(--hm-manager-font); + font: 700 14px/28px var(--hm-manager-font); text-align: left; text-decoration: none; white-space: normal; overflow: visible; text-overflow: clip; } +/* Sub rows (depth 2+): 42px (7px + 28px line + 7px), shorter than the 48px top-level rows. */ +#storybook-explorer-tree .sidebar-item:is([data-hm-depth='2'], [data-hm-depth='3'], [data-hm-depth='4']) { + min-height: 42px; +} +#storybook-explorer-tree .sidebar-item:is([data-hm-depth='2'], [data-hm-depth='3'], [data-hm-depth='4']) > :is(a[id], button[id]:not([data-testid])) { + min-height: 42px; + padding-block: 7px; +} #storybook-explorer-tree .sidebar-item[data-hm-depth='2'] > :is(a[id], button[id]:not([data-testid])) { margin-left: 32px; width: calc(100% - 32px); @@ -188,6 +201,10 @@ margin-left: 44px; width: calc(100% - 44px); } +/* Menu item labels and section heading labels (.sidebar-subheading) are both 14px / 700. */ +#storybook-explorer-tree .sidebar-item .hm-manager-label { + font-size: 14px; +} #storybook-explorer-tree .hm-manager-label { min-width: 0; white-space: normal; @@ -198,8 +215,10 @@ } /* D-093 D-014 (§6 Text Border): non-selected labels, including hover and the yellow current parent, use the specimen's 1.5px border plus lower shadow. - Thickness and offset are REVIEW VALUEs. Selected labels carry no effect. */ -#storybook-explorer-tree .sidebar-item[data-selected='false'] .hm-manager-label { + Thickness and offset are REVIEW VALUEs. Selected labels carry no effect. + Section heading labels (Foundation, Components, ...) share this exact rule. */ +#storybook-explorer-tree .sidebar-item[data-selected='false'] .hm-manager-label, +#storybook-explorer-tree .sidebar-subheading .hm-manager-label { -webkit-text-stroke: 1.5px var(--effect-text-border-color); paint-order: stroke fill; text-shadow: 1px 2px 1px var(--effect-text-border-color); diff --git a/.storybook/manager.js b/.storybook/manager.js index fef8d37..59d1b9c 100644 --- a/.storybook/manager.js +++ b/.storybook/manager.js @@ -28,13 +28,108 @@ toolbarStyle.textContent = ` ` document.head.appendChild(toolbarStyle) +// Sidebar display names only. Story titles, Story IDs and storySort stay English; items not listed keep item.name. +const koreanLabels = { + foundation: '기본 요소', + components: '컴포넌트', + 'components-form': '폼 요소', + 'components-navigation': '내비게이션', + 'components-overlay': '오버레이', + 'components-data-display': '데이터 표시', + 'components-disclosure': '영역 확장·조절', + 'components-search-date': '검색·날짜', + 'components-feedback': '알림·피드백', + 'components-form-button': '버튼', + 'components-form-input': '입력창', + 'components-form-textarea': '여러 줄 입력창', + 'components-form-select': '선택 목록', + 'components-form-checkbox': '체크박스', + 'components-form-radio-group': '라디오 버튼 그룹', + 'components-form-switch': '스위치', + 'components-form-slider': '슬라이더', + 'components-form-toggle': '토글 버튼', + 'components-navigation-tabs': '탭', + 'components-navigation-breadcrumb': '이동 경로', + 'components-navigation-pagination': '페이지네이션', + 'components-navigation-navigation-menu': '내비게이션 메뉴', + 'components-navigation-menubar': '메뉴바', + 'components-overlay-dialog': '대화상자', + 'components-overlay-alert-dialog': '확인·경고 대화상자', + 'components-overlay-sheet': '시트 패널', + 'components-overlay-drawer': '드로어', + 'components-overlay-dropdown-menu': '드롭다운 메뉴', + 'components-overlay-context-menu': '컨텍스트 메뉴', + 'components-overlay-popover': '팝오버', + 'components-overlay-tooltip': '툴팁', + 'components-overlay-hover-card': '호버 카드', + 'components-data-display-card': '카드', + 'components-data-display-table': '테이블', + 'components-data-display-badge': '배지', + 'components-data-display-avatar': '아바타', + 'components-data-display-progress': '진행률', + 'components-data-display-skeleton': '스켈레톤', + 'components-data-display-separator': '구분선', + 'components-data-display-aspect-ratio': '화면 비율', + 'components-data-display-carousel': '캐러셀', + 'components-data-display-scroll-area': '스크롤 영역', + 'components-disclosure-accordion': '아코디언', + 'components-disclosure-collapsible': '접기·펼치기', + 'components-disclosure-resizable': '크기 조절', + 'components-search-date-command': '명령어 검색', + 'components-search-date-combobox': '콤보박스', + 'components-search-date-calendar': '달력', + 'components-search-date-date-picker': '날짜 선택기', + 'components-feedback-alert': '알림 메시지', + 'components-feedback-sonner': '토스트 알림', + patterns: 'UI 패턴', + 'patterns-data': '데이터 조회', + 'patterns-data-data-table': '데이터 테이블', + 'patterns-data-filter-bar': '필터 바', + 'patterns-layout': '화면 구성', + 'patterns-layout-gnb': '전체 메뉴 (GNB)', + 'patterns-layout-lnb': '좌측 메뉴 (LNB)', + 'patterns-layout-dashboard-layout': '대시보드', + 'patterns-layout-page-header': '페이지 헤더', + chart: '차트', + 'chart-bar-chart--bar': '막대 차트', + 'chart-line-chart--line': '선 차트', + 'chart-donut-chart--donut': '도넛 차트', + 'chart-pie-chart--pie': '원형 차트', + 'chart-radar-chart--radar': '레이더 차트', + 'chart-area-chart--area': '영역 차트', + 'chart-radial-chart--radial': '원형 막대 차트', + sw: 'SW UI', + 'sw-header': '헤더', + 'sw-header--overview': 'SW 헤더', + 'sw-header--responsive-more': '화면 너비 대응', + 'sw-viewer--responsive': '화면 너비 대응', + 'sw-step-header--responsive': '화면 너비 대응', + 'sw-footer--responsive': '화면 너비 대응', + 'sw-viewer': '뷰어', + 'sw-viewer--viewer-header': '뷰어 헤더', + 'sw-step-header': '단계별', + 'sw-step-header--process-header': '단계별 헤더', + 'sw-popup': '팝업', +} + +// A component with one visible Story is shown as that Story (`--all`) under the component's name. +// A real Story named "All" under an expanded component keeps its own name. +const koreanLabel = (item) => { + const hoisted = item.type === 'story' && item.name !== 'All' ? koreanLabels[item.id.replace(/--all$/, '')] : undefined + return koreanLabels[item.id] ?? hoisted ?? item.name +} + addons.setConfig({ layout: { showPanel: false, + showToolbar: false, + // LNB width 246px. recentVisibleSizes keeps the same width when the sidebar is collapsed and expanded again. + navSize: 246, + recentVisibleSizes: { navSize: 246 }, }, theme: create({ base: 'light', - brandTitle: 'HM Design System', + brandTitle: '한맥 디자인 시스템', brandUrl: './', brandTarget: '_self', fontBase: "'Hanmac Manager Noto Sans KR', 'Noto Sans KR', 'Malgun Gothic', sans-serif", @@ -48,7 +143,7 @@ addons.setConfig({ barSelectedColor: '#123328', }), sidebar: { - renderLabel: (item) => createElement('span', { className: 'hm-manager-label' }, item.name), + renderLabel: (item) => createElement('span', { className: 'hm-manager-label' }, koreanLabel(item)), }, }) diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index c90981f..1f8613d 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -25,7 +25,7 @@ const preview: Preview = { includeNames: true, order: [ "Foundation", - ["Color", "Company Colors", "Typography", "Layout"], + ["한맥 컬러", "가족사 컬러", "폰트"], "Components", [ "Form", @@ -47,11 +47,11 @@ const preview: Preview = { ["Data", ["Data Table", "Filter Bar"], "Layout", ["GNB", "LNB", "Dashboard Layout", "Loading Screen"]], "Chart", ["Bar Chart", "Line Chart", "Donut Chart", "Pie Chart", "Radar Chart", "Area Chart", "Radial Chart"], - "OrgChart", - ["Overview", "Department Colors", "Full Composition", "Expanded OrgChart"], - "Center Graphic", "SW", - ["Header", ["SW Header", "*"], "Footer", ["SW Footer", "*"], "Popup", "Viewer", "Theme"], + ["Header", ["SW Header", "*"], "Viewer", "Step Header", "Popup", "하단 명령어바", ["SW 하단 명령어바", "*"], "Theme"], + "조직도", + ["개요", "부서별 색상", "전체 구성", "확장 조직도"], + "노선도", "*", // With includeNames, keeps the Loader group after the Runtime Contract Stories (its place without names). "Theme", diff --git a/.storybook/qa/STORY-INVENTORY.md b/.storybook/qa/STORY-INVENTORY.md index 1f8b092..0351b1d 100644 --- a/.storybook/qa/STORY-INVENTORY.md +++ b/.storybook/qa/STORY-INVENTORY.md @@ -6,56 +6,56 @@ This is a classification record. No Story IDs, exports or titles are renamed. HI ## Summary -- PRIMARY: 89 -- VERIFICATION: 252 -- UTILITY: 38 +- PRIMARY: 82 +- VERIFICATION: 256 +- UTILITY: 49 - LEGACY / DUPLICATE: 0 -- KEEP: 89 -- HIDE: 290 +- KEEP: 82 +- HIDE: 305 - MERGE_CANDIDATE: 33 - DELETE_CANDIDATE: 0 - Story files: 89 -- Stories: 379 +- Stories: 387 - Hierarchy: Foundation → Components → Patterns → Center Graphic → Theme ## Full inventory -### Center Graphic/Facility +### 노선도/시설물 Source: `src/center/center-facility.stories.tsx`; meta.tags: [] -- Tunnel — Tunnel; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. -- Bridge — Bridge; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. -- Intersection — Intersection; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. -- Junction — Junction; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. -- Interchange — Interchange; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. -- Roadside — Roadside; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. -- Linked — Linked; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- Tunnel — 터널; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- Bridge — 교량; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- Intersection — 교차로; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- Junction — 분기점; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- Interchange — 나들목; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- Roadside — 휴게소 · 졸음쉼터; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- Linked — 연계 시설물; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. - TunnelPlayground — 직접 테스트 (터널); tags: ["verification"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. -### Center Graphic/Information +### 노선도/정보 Source: `src/center/center-information.stories.tsx`; meta.tags: [] -- Information — Information; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- Information — 정보; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. -### Center Graphic/Overview +### 노선도/Overview Source: `src/center/center-overview.stories.tsx`; meta.tags: [] - Overview — Overview; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. -### Center Graphic/Spatial +### 노선도/노선·공간 Source: `src/center/center-spatial.stories.tsx`; meta.tags: [] -- Spatial — Spatial; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- Spatial — 노선·공간; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. -### Center Graphic/Title +### 노선도/사업명 Source: `src/center/center-title.stories.tsx`; meta.tags: [] -- Compositions — Title; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- Compositions — 사업명; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. - Playground — Playground; tags: ["verification"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. ### Chart/Area Chart @@ -213,6 +213,7 @@ Source: `src/components/checkbox.stories.tsx`; meta.tags: [] - Indeterminate — Indeterminate; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - Disabled — Disabled; tags: ["verification"]; VERIFICATION; HIDE; MERGE_CANDIDATE. Representative board may cover the same specimen; keep direct QA until behavioral equivalence is reviewed. - Error — Error; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. +- LongLabel — Long Label; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - Playground — Playground; tags: ["verification"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. ### Components/Disclosure/Collapsible @@ -316,9 +317,9 @@ Source: `src/components/input.stories.tsx`; meta.tags: [] ### Components/Form/Label -Source: `src/components/label.stories.tsx`; meta.tags: [] +Source: `src/components/label.stories.tsx`; meta.tags: ["internal"] -- All — Label; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- All — Label; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. ### Components/Navigation/Menubar @@ -509,6 +510,8 @@ Source: `src/components/textarea.stories.tsx`; meta.tags: [] - InvalidFocus — Invalid Focus; tags: ["verification","play-fn"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - ErrorMessage — Error Message; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - Required — Required; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. +- Multiline — Multiline · Wrap; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. +- ResizeNone — Resize · none; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - Readonly — Readonly; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - Disabled — Disabled; tags: ["verification"]; VERIFICATION; HIDE; MERGE_CANDIDATE. Representative board may cover the same specimen; keep direct QA until behavioral equivalence is reviewed. - LongContent — Long Content; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. @@ -516,13 +519,14 @@ Source: `src/components/textarea.stories.tsx`; meta.tags: [] ### Components/Form/Toggle Group -Source: `src/components/toggle-group.stories.tsx`; meta.tags: [] +Source: `src/components/toggle-group.stories.tsx`; meta.tags: ["internal"] -- All — Toggle Group; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. -- SingleSelection — Single; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. -- MultipleSelection — Multiple; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. -- VerticalGroup — Vertical; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. -- ContentNodes — Content Nodes; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. +- All — Toggle Group; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. +- SingleSelection — Single; tags: ["internal","verification"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. +- MultipleSelection — Multiple; tags: ["internal","verification"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. +- VerticalGroup — Vertical; tags: ["internal","verification"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. +- ManyOptions — Many Options; tags: ["internal","verification"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. +- ContentNodes — Content Nodes; tags: ["internal","verification"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. ### Components/Form/Toggle @@ -541,31 +545,31 @@ Source: `src/components/tooltip.stories.tsx`; meta.tags: [] - All — Tooltip; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. - Open — Open; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. -### Foundation/Color +### Foundation/한맥 컬러 Source: `src/foundation/color.stories.tsx`; meta.tags: [] -- All — Color; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- All — 한맥 컬러; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. -### Foundation/Company Colors +### Foundation/가족사 컬러 Source: `src/foundation/company-colors.stories.tsx`; meta.tags: [] -- All — Company Colors; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- All — 가족사 컬러; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. ### Foundation/Layout -Source: `src/foundation/layout.stories.tsx`; meta.tags: [] +Source: `src/foundation/layout.stories.tsx`; meta.tags: ["verification"] -- All — Layout; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- All — Layout; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. -### Foundation/Typography +### Foundation/폰트 Source: `src/foundation/typography.stories.tsx`; meta.tags: [] -- All — Typography; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- All — 폰트; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. -### OrgChart/Components/Cards +### 조직도/Components/Cards Source: `src/org-chart/org-chart-cards.stories.tsx`; meta.tags: ["internal"] @@ -579,25 +583,25 @@ Source: `src/org-chart/org-chart-cards.stories.tsx`; meta.tags: ["internal"] - OrganizationLeader — 조직장; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - Employee — 일반 직원; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. -### OrgChart/Department Colors +### 조직도/부서별 색상 Source: `src/org-chart/org-chart-department-colors.stories.tsx`; meta.tags: [] -- DepartmentColors — Department Colors; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- DepartmentColors — 부서별 색상; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. -### OrgChart/Expanded OrgChart +### 조직도/확장 조직도 Source: `src/org-chart/org-chart-expanded.stories.tsx`; meta.tags: [] -- ExpandedOrgChart — Expanded OrgChart; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- ExpandedOrgChart — 확장 조직도; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. -### OrgChart/Full Composition +### 조직도/전체 구성 Source: `src/org-chart/org-chart-full-composition.stories.tsx`; meta.tags: [] -- FullComposition — Full Composition; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- FullComposition — 전체 구성; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. -### OrgChart/Verification/Overview +### 조직도/Verification/Overview Source: `src/org-chart/org-chart-overview-internal.stories.tsx`; meta.tags: ["internal"] @@ -605,13 +609,13 @@ Source: `src/org-chart/org-chart-overview-internal.stories.tsx`; meta.tags: ["in - PositionSummary — Position Summary; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - AffiliationSummary — Affiliation Summary; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. -### OrgChart/Overview +### 조직도/개요 Source: `src/org-chart/org-chart-p1.stories.tsx`; meta.tags: [] -- LogoPersonnelSummary — Overview; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- LogoPersonnelSummary — 개요; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. -### OrgChart/Components/Summaries +### 조직도/Components/Summaries Source: `src/org-chart/org-chart-summary.stories.tsx`; meta.tags: ["internal"] @@ -619,16 +623,16 @@ Source: `src/org-chart/org-chart-summary.stories.tsx`; meta.tags: ["internal"] - AffiliationSummary — Affiliation Summary; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - StatusSummary — Status Summary; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. -### OrgChart/Content +### 조직도/콘텐츠 Source: `src/org-chart/org-chart.stories.tsx`; meta.tags: ["internal"] -- BasicOrganization — Basic Organization; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. -- OrganizationHierarchy — Organization Hierarchy; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. -- EmployeeCards — Employee Cards; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. -- OrganizationSummary — Organization Summary; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. +- BasicOrganization — 기본 조직도; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. +- OrganizationHierarchy — 조직 계층; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. +- EmployeeCards — 직원 카드; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. +- OrganizationSummary — 조직 요약; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - JSONDataUpdate — JSON Data Update; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. -- LoadingEmptyError — Loading / Empty / Error; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. +- LoadingEmptyError — 로딩 / 비어 있음 / 오류; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - ResponsiveContainer — Responsive Container; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - MultipleInstances — Multiple Instances; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. @@ -650,6 +654,8 @@ Source: `src/patterns/dashboard-layout.stories.tsx`; meta.tags: [] Source: `src/patterns/data-table.stories.tsx`; meta.tags: [] - All — Data Table; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- Overview — Overview; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. +- BasicSearch — Basic Search; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - WithFilterBarStory — With Filter Bar; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - Loading — Loading; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - Empty — Empty; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. @@ -669,6 +675,7 @@ Source: `src/patterns/gnb.stories.tsx`; meta.tags: [] - Default — Default; tags: ["verification"]; VERIFICATION; HIDE; MERGE_CANDIDATE. Representative board may cover the same specimen; keep direct QA until behavioral equivalence is reviewed. - Sticky — Sticky; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - Sidebar — GNB Sidebar; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. +- BrownSidebar — Brown Sidebar; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - NavigationMenuOpen — Navigation Menu Open; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - ShortDepthOpen — Short Depth Open; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - RightEdgeLongDepth — Right Edge Long Depth; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. @@ -711,26 +718,27 @@ Source: `src/patterns/lnb.stories.tsx`; meta.tags: [] ### Patterns/Layout/Loading Screen -Source: `src/patterns/loading-screen.stories.tsx`; meta.tags: [] +Source: `src/patterns/loading-screen.stories.tsx`; meta.tags: ["internal"] -- All — Loading Screen; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. -- Inline — Inline; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. +- All — Loading Screen; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. +- Inline — Inline; tags: ["internal","verification"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. ### Patterns/Layout/Page Header -Source: `src/patterns/page-header.stories.tsx`; meta.tags: [] +Source: `src/patterns/page-header.stories.tsx`; meta.tags: ["verification"] -- All — Page Header; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- All — Page Header; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. +- FullPage — Full Page; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. -### SW/Footer +### SW/하단 명령어바 Source: `src/sw/sw-footer.stories.tsx`; meta.tags: [] -- FullFooter — SW Footer; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- FullFooter — SW 하단 명령어바; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. - ToolGroups — 도구 그룹별 표시; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - FigmaVariants — Figma 디자인별 Variant (35 노드); tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - CustomContent — 도구 및 메뉴 변경 예제; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. -- Responsive — Responsive More; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- Responsive — 화면 너비; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. - Parts — 개별 부품 (조합용); tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. ### SW/Header @@ -743,7 +751,7 @@ Source: `src/sw/sw-header-dropdown.stories.tsx`; meta.tags: [] Source: `src/sw/sw-header-home-menu.stories.tsx`; meta.tags: [] -- HomeMenu — Home Menu; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- HomeMenu — Home Menu; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - HomeMenuCaptureDefault — Home Menu · 비교 캔버스 · Default; tags: ["!autodocs","verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - HomeMenuHeaderComposition — Home Menu · Header 조합 · 로고 클릭; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - HomeMenuDynamicData — Home Menu · Props · 데이터 변경; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. @@ -768,9 +776,9 @@ Source: `src/sw/sw-header.stories.tsx`; meta.tags: [] - Overview — SW Header; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. - InteractiveStates — Interactive States; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - WindowMoveMotion — Window Move Motion; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. -- LogoSlot — Logo; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- LogoSlot — 로고; tags: ["internal"]; UTILITY; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - DocumentDropdown — Document Dropdown; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. -- ResponsiveMore — Responsive More; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- ResponsiveMore — 화면 너비; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. - KGuide — K Guide; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. ### SW/Popup @@ -785,7 +793,7 @@ Source: `src/sw/sw-popup.stories.tsx`; meta.tags: [] Source: `src/sw/sw-process-header.stories.tsx`; meta.tags: [] - ProcessHeader — Step Header; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. -- Responsive — Responsive More; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- Responsive — 화면 너비; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. - SplitOpen — 화면 분할; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - MultiStep — Multi Step; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - FixedWidths — Fixed Widths; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. @@ -799,7 +807,7 @@ Source: `src/sw/sw-process-header.stories.tsx`; meta.tags: [] Source: `src/sw/sw-property-panel.stories.tsx`; meta.tags: [] -- PropertyPanelCompare — Property Panel; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- PropertyPanelCompare — 속성창; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. ### SW/Theme @@ -816,10 +824,10 @@ Source: `src/sw/sw-viewer.stories.tsx`; meta.tags: [] - States — Item States; tags: ["verification"]; VERIFICATION; HIDE; MERGE_CANDIDATE. Representative board may cover the same specimen; keep direct QA until behavioral equivalence is reviewed. - Dropdowns — Header + Dropdown; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. - SettingsPanel — Settings Popup; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. -- ContentVariants — Settings Popup; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- ContentVariants — 설정창; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. - VariableSize — Variable Size Popups; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. -- Logo — Logo; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. -- Responsive — Responsive More; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- Logo — 로고; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. +- Responsive — 화면 너비; tags: []; PRIMARY; KEEP. Representative story or distinct reference page. - CompareWithSWHeader — SWHeader vs Viewer Header; tags: ["verification"]; VERIFICATION; HIDE. Keep direct URL and tag-filter access; excluded from default sidebar. ### Theme/Designer Playground diff --git a/.storybook/qa/story-inventory.json b/.storybook/qa/story-inventory.json index eca3520..dd61760 100644 --- a/.storybook/qa/story-inventory.json +++ b/.storybook/qa/story-inventory.json @@ -1,16 +1,16 @@ { "summary": { "storyFiles": 89, - "stories": 379, + "stories": 387, "categories": { - "PRIMARY": 89, - "VERIFICATION": 252, - "UTILITY": 38, + "PRIMARY": 82, + "VERIFICATION": 256, + "UTILITY": 49, "LEGACY / DUPLICATE": 0 }, "decisions": { - "KEEP": 89, - "HIDE": 290, + "KEEP": 82, + "HIDE": 305, "MERGE_CANDIDATE": 33, "DELETE_CANDIDATE": 0 }, @@ -25,13 +25,13 @@ "inventory": [ { "file": "src/center/center-facility.stories.tsx", - "title": "Center Graphic/Facility", + "title": "노선도/시설물", "metaTags": [], "stories": [ { "id": "center-graphic-facility--tunnel", "exportName": "Tunnel", - "name": "Tunnel", + "name": "터널", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -42,7 +42,7 @@ { "id": "center-graphic-facility--bridge", "exportName": "Bridge", - "name": "Bridge", + "name": "교량", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -53,7 +53,7 @@ { "id": "center-graphic-facility--intersection", "exportName": "Intersection", - "name": "Intersection", + "name": "교차로", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -64,7 +64,7 @@ { "id": "center-graphic-facility--junction", "exportName": "Junction", - "name": "Junction", + "name": "분기점", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -75,7 +75,7 @@ { "id": "center-graphic-facility--interchange", "exportName": "Interchange", - "name": "Interchange", + "name": "나들목", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -86,7 +86,7 @@ { "id": "center-graphic-facility--roadside", "exportName": "Roadside", - "name": "Roadside", + "name": "휴게소 · 졸음쉼터", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -97,7 +97,7 @@ { "id": "center-graphic-facility--linked", "exportName": "Linked", - "name": "Linked", + "name": "연계 시설물", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -124,13 +124,13 @@ }, { "file": "src/center/center-information.stories.tsx", - "title": "Center Graphic/Information", + "title": "노선도/정보", "metaTags": [], "stories": [ { "id": "center-graphic-information--information", "exportName": "Information", - "name": "Information", + "name": "정보", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -142,7 +142,7 @@ }, { "file": "src/center/center-overview.stories.tsx", - "title": "Center Graphic/Overview", + "title": "노선도/Overview", "metaTags": [], "stories": [ { @@ -164,13 +164,13 @@ }, { "file": "src/center/center-spatial.stories.tsx", - "title": "Center Graphic/Spatial", + "title": "노선도/노선·공간", "metaTags": [], "stories": [ { "id": "center-graphic-spatial--spatial", "exportName": "Spatial", - "name": "Spatial", + "name": "노선·공간", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -182,13 +182,13 @@ }, { "file": "src/center/center-title.stories.tsx", - "title": "Center Graphic/Title", + "title": "노선도/사업명", "metaTags": [], "stories": [ { "id": "center-graphic-title--compositions", "exportName": "Compositions", - "name": "Title", + "name": "사업명", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -1187,6 +1187,21 @@ "candidate": null, "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." }, + { + "id": "components-form-checkbox--long-label", + "exportName": "LongLabel", + "name": "Long Label", + "storyTags": [ + "verification" + ], + "effectiveTags": [ + "verification" + ], + "category": "VERIFICATION", + "decision": "HIDE", + "candidate": null, + "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." + }, { "id": "components-form-checkbox--playground", "exportName": "Playground", @@ -1982,18 +1997,22 @@ { "file": "src/components/label.stories.tsx", "title": "Components/Form/Label", - "metaTags": [], + "metaTags": [ + "internal" + ], "stories": [ { "id": "components-form-label--all", "exportName": "All", "name": "Label", "storyTags": [], - "effectiveTags": [], - "category": "PRIMARY", - "decision": "KEEP", + "effectiveTags": [ + "internal" + ], + "category": "UTILITY", + "decision": "HIDE", "candidate": null, - "reason": "Representative story or distinct reference page." + "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." } ] }, @@ -3510,6 +3529,36 @@ "candidate": null, "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." }, + { + "id": "components-form-textarea--multiline", + "exportName": "Multiline", + "name": "Multiline · Wrap", + "storyTags": [ + "verification" + ], + "effectiveTags": [ + "verification" + ], + "category": "VERIFICATION", + "decision": "HIDE", + "candidate": null, + "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." + }, + { + "id": "components-form-textarea--resize-none", + "exportName": "ResizeNone", + "name": "Resize · none", + "storyTags": [ + "verification" + ], + "effectiveTags": [ + "verification" + ], + "category": "VERIFICATION", + "decision": "HIDE", + "candidate": null, + "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." + }, { "id": "components-form-textarea--readonly", "exportName": "Readonly", @@ -3575,18 +3624,22 @@ { "file": "src/components/toggle-group.stories.tsx", "title": "Components/Form/Toggle Group", - "metaTags": [], + "metaTags": [ + "internal" + ], "stories": [ { "id": "components-form-toggle-group--all", "exportName": "All", "name": "Toggle Group", "storyTags": [], - "effectiveTags": [], - "category": "PRIMARY", - "decision": "KEEP", + "effectiveTags": [ + "internal" + ], + "category": "UTILITY", + "decision": "HIDE", "candidate": null, - "reason": "Representative story or distinct reference page." + "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." }, { "id": "components-form-toggle-group--single-selection", @@ -3596,9 +3649,10 @@ "verification" ], "effectiveTags": [ + "internal", "verification" ], - "category": "VERIFICATION", + "category": "UTILITY", "decision": "HIDE", "candidate": null, "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." @@ -3611,9 +3665,10 @@ "verification" ], "effectiveTags": [ + "internal", "verification" ], - "category": "VERIFICATION", + "category": "UTILITY", "decision": "HIDE", "candidate": null, "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." @@ -3626,9 +3681,26 @@ "verification" ], "effectiveTags": [ + "internal", "verification" ], - "category": "VERIFICATION", + "category": "UTILITY", + "decision": "HIDE", + "candidate": null, + "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." + }, + { + "id": "components-form-toggle-group--many-options", + "exportName": "ManyOptions", + "name": "Many Options", + "storyTags": [ + "verification" + ], + "effectiveTags": [ + "internal", + "verification" + ], + "category": "UTILITY", "decision": "HIDE", "candidate": null, "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." @@ -3641,9 +3713,10 @@ "verification" ], "effectiveTags": [ + "internal", "verification" ], - "category": "VERIFICATION", + "category": "UTILITY", "decision": "HIDE", "candidate": null, "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." @@ -3763,13 +3836,13 @@ }, { "file": "src/foundation/color.stories.tsx", - "title": "Foundation/Color", + "title": "Foundation/한맥 컬러", "metaTags": [], "stories": [ { "id": "foundation-color--all", "exportName": "All", - "name": "Color", + "name": "한맥 컬러", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -3781,13 +3854,13 @@ }, { "file": "src/foundation/company-colors.stories.tsx", - "title": "Foundation/Company Colors", + "title": "Foundation/가족사 컬러", "metaTags": [], "stories": [ { "id": "foundation-company-colors--all", "exportName": "All", - "name": "Company Colors", + "name": "가족사 컬러", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -3800,30 +3873,34 @@ { "file": "src/foundation/layout.stories.tsx", "title": "Foundation/Layout", - "metaTags": [], + "metaTags": [ + "verification" + ], "stories": [ { "id": "foundation-layout--all", "exportName": "All", "name": "Layout", "storyTags": [], - "effectiveTags": [], - "category": "PRIMARY", - "decision": "KEEP", + "effectiveTags": [ + "verification" + ], + "category": "VERIFICATION", + "decision": "HIDE", "candidate": null, - "reason": "Representative story or distinct reference page." + "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." } ] }, { "file": "src/foundation/typography.stories.tsx", - "title": "Foundation/Typography", + "title": "Foundation/폰트", "metaTags": [], "stories": [ { "id": "foundation-typography--all", "exportName": "All", - "name": "Typography", + "name": "폰트", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -3835,7 +3912,7 @@ }, { "file": "src/org-chart/org-chart-cards.stories.tsx", - "title": "OrgChart/Components/Cards", + "title": "조직도/Components/Cards", "metaTags": [ "internal" ], @@ -3961,13 +4038,13 @@ }, { "file": "src/org-chart/org-chart-department-colors.stories.tsx", - "title": "OrgChart/Department Colors", + "title": "조직도/부서별 색상", "metaTags": [], "stories": [ { "id": "orgchart--department-colors", "exportName": "DepartmentColors", - "name": "Department Colors", + "name": "부서별 색상", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -3979,13 +4056,13 @@ }, { "file": "src/org-chart/org-chart-expanded.stories.tsx", - "title": "OrgChart/Expanded OrgChart", + "title": "조직도/확장 조직도", "metaTags": [], "stories": [ { "id": "orgchart--expanded-org-chart", "exportName": "ExpandedOrgChart", - "name": "Expanded OrgChart", + "name": "확장 조직도", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -3997,13 +4074,13 @@ }, { "file": "src/org-chart/org-chart-full-composition.stories.tsx", - "title": "OrgChart/Full Composition", + "title": "조직도/전체 구성", "metaTags": [], "stories": [ { "id": "orgchart--full-composition", "exportName": "FullComposition", - "name": "Full Composition", + "name": "전체 구성", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -4015,7 +4092,7 @@ }, { "file": "src/org-chart/org-chart-overview-internal.stories.tsx", - "title": "OrgChart/Verification/Overview", + "title": "조직도/Verification/Overview", "metaTags": [ "internal" ], @@ -4063,13 +4140,13 @@ }, { "file": "src/org-chart/org-chart-p1.stories.tsx", - "title": "OrgChart/Overview", + "title": "조직도/개요", "metaTags": [], "stories": [ { "id": "orgchart--logo-personnel-summary", "exportName": "LogoPersonnelSummary", - "name": "Overview", + "name": "개요", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -4081,7 +4158,7 @@ }, { "file": "src/org-chart/org-chart-summary.stories.tsx", - "title": "OrgChart/Components/Summaries", + "title": "조직도/Components/Summaries", "metaTags": [ "internal" ], @@ -4129,7 +4206,7 @@ }, { "file": "src/org-chart/org-chart.stories.tsx", - "title": "OrgChart/Content", + "title": "조직도/콘텐츠", "metaTags": [ "internal" ], @@ -4137,7 +4214,7 @@ { "id": "orgchart-content--basic-organization", "exportName": "BasicOrganization", - "name": "Basic Organization", + "name": "기본 조직도", "storyTags": [], "effectiveTags": [ "internal" @@ -4150,7 +4227,7 @@ { "id": "orgchart-content--organization-hierarchy", "exportName": "OrganizationHierarchy", - "name": "Organization Hierarchy", + "name": "조직 계층", "storyTags": [], "effectiveTags": [ "internal" @@ -4163,7 +4240,7 @@ { "id": "orgchart-content--employee-cards", "exportName": "EmployeeCards", - "name": "Employee Cards", + "name": "직원 카드", "storyTags": [], "effectiveTags": [ "internal" @@ -4176,7 +4253,7 @@ { "id": "orgchart-content--organization-summary", "exportName": "OrganizationSummary", - "name": "Organization Summary", + "name": "조직 요약", "storyTags": [], "effectiveTags": [ "internal" @@ -4202,7 +4279,7 @@ { "id": "orgchart-content--loading-empty-error", "exportName": "LoadingEmptyError", - "name": "Loading / Empty / Error", + "name": "로딩 / 비어 있음 / 오류", "storyTags": [], "effectiveTags": [ "internal" @@ -4379,6 +4456,36 @@ "candidate": null, "reason": "Representative story or distinct reference page." }, + { + "id": "patterns-data-data-table--overview", + "exportName": "Overview", + "name": "Overview", + "storyTags": [ + "verification" + ], + "effectiveTags": [ + "verification" + ], + "category": "VERIFICATION", + "decision": "HIDE", + "candidate": null, + "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." + }, + { + "id": "patterns-data-data-table--basic-search", + "exportName": "BasicSearch", + "name": "Basic Search", + "storyTags": [ + "verification" + ], + "effectiveTags": [ + "verification" + ], + "category": "VERIFICATION", + "decision": "HIDE", + "candidate": null, + "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." + }, { "id": "patterns-data-data-table--with-filter-bar-story", "exportName": "WithFilterBarStory", @@ -4520,6 +4627,21 @@ "candidate": null, "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." }, + { + "id": "patterns-layout-gnb--brown-sidebar", + "exportName": "BrownSidebar", + "name": "Brown Sidebar", + "storyTags": [ + "verification" + ], + "effectiveTags": [ + "verification" + ], + "category": "VERIFICATION", + "decision": "HIDE", + "candidate": null, + "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." + }, { "id": "patterns-layout-gnb--navigation-menu-open", "exportName": "NavigationMenuOpen", @@ -5038,18 +5160,22 @@ { "file": "src/patterns/loading-screen.stories.tsx", "title": "Patterns/Layout/Loading Screen", - "metaTags": [], + "metaTags": [ + "internal" + ], "stories": [ { "id": "patterns-layout-loading-screen--all", "exportName": "All", "name": "Loading Screen", "storyTags": [], - "effectiveTags": [], - "category": "PRIMARY", - "decision": "KEEP", + "effectiveTags": [ + "internal" + ], + "category": "UTILITY", + "decision": "HIDE", "candidate": null, - "reason": "Representative story or distinct reference page." + "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." }, { "id": "patterns-layout-loading-screen--inline", @@ -5058,6 +5184,44 @@ "storyTags": [ "verification" ], + "effectiveTags": [ + "internal", + "verification" + ], + "category": "UTILITY", + "decision": "HIDE", + "candidate": null, + "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." + } + ] + }, + { + "file": "src/patterns/page-header.stories.tsx", + "title": "Patterns/Layout/Page Header", + "metaTags": [ + "verification" + ], + "stories": [ + { + "id": "patterns-layout-page-header--all", + "exportName": "All", + "name": "Page Header", + "storyTags": [], + "effectiveTags": [ + "verification" + ], + "category": "VERIFICATION", + "decision": "HIDE", + "candidate": null, + "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." + }, + { + "id": "patterns-layout-page-header--full-page", + "exportName": "FullPage", + "name": "Full Page", + "storyTags": [ + "verification" + ], "effectiveTags": [ "verification" ], @@ -5068,33 +5232,15 @@ } ] }, - { - "file": "src/patterns/page-header.stories.tsx", - "title": "Patterns/Layout/Page Header", - "metaTags": [], - "stories": [ - { - "id": "patterns-layout-page-header--all", - "exportName": "All", - "name": "Page Header", - "storyTags": [], - "effectiveTags": [], - "category": "PRIMARY", - "decision": "KEEP", - "candidate": null, - "reason": "Representative story or distinct reference page." - } - ] - }, { "file": "src/sw/sw-footer.stories.tsx", - "title": "SW/Footer", + "title": "SW/하단 명령어바", "metaTags": [], "stories": [ { "id": "sw-footer--full-footer", "exportName": "FullFooter", - "name": "SW Footer", + "name": "SW 하단 명령어바", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -5150,7 +5296,7 @@ { "id": "sw-footer--responsive", "exportName": "Responsive", - "name": "Responsive More", + "name": "화면 너비", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -5206,12 +5352,16 @@ "id": "sw-header--home-menu", "exportName": "HomeMenu", "name": "Home Menu", - "storyTags": [], - "effectiveTags": [], - "category": "PRIMARY", - "decision": "KEEP", + "storyTags": [ + "internal" + ], + "effectiveTags": [ + "internal" + ], + "category": "UTILITY", + "decision": "HIDE", "candidate": null, - "reason": "Representative story or distinct reference page." + "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." }, { "id": "sw-header--home-menu-capture-default", @@ -5442,13 +5592,17 @@ { "id": "sw-header--logo-slot", "exportName": "LogoSlot", - "name": "Logo", - "storyTags": [], - "effectiveTags": [], - "category": "PRIMARY", - "decision": "KEEP", + "name": "로고", + "storyTags": [ + "internal" + ], + "effectiveTags": [ + "internal" + ], + "category": "UTILITY", + "decision": "HIDE", "candidate": null, - "reason": "Representative story or distinct reference page." + "reason": "Keep direct URL and tag-filter access; excluded from default sidebar." }, { "id": "sw-header--document-dropdown", @@ -5468,7 +5622,7 @@ { "id": "sw-header--responsive-more", "exportName": "ResponsiveMore", - "name": "Responsive More", + "name": "화면 너비", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -5549,7 +5703,7 @@ { "id": "sw-step-header--responsive", "exportName": "Responsive", - "name": "Responsive More", + "name": "화면 너비", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -5687,7 +5841,7 @@ { "id": "sw-header--property-panel-compare", "exportName": "PropertyPanelCompare", - "name": "Property Panel", + "name": "속성창", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -5798,7 +5952,7 @@ { "id": "sw-viewer--content-variants", "exportName": "ContentVariants", - "name": "Settings Popup", + "name": "설정창", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -5824,7 +5978,7 @@ { "id": "sw-viewer--logo", "exportName": "Logo", - "name": "Logo", + "name": "로고", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", @@ -5835,7 +5989,7 @@ { "id": "sw-viewer--responsive", "exportName": "Responsive", - "name": "Responsive More", + "name": "화면 너비", "storyTags": [], "effectiveTags": [], "category": "PRIMARY", diff --git a/docs/components/badge.md b/docs/components/badge.md index 30e16db..b9646ea 100644 --- a/docs/components/badge.md +++ b/docs/components/badge.md @@ -32,7 +32,7 @@ | variant | 면 | 글자 | 테두리 | |---|---|---|---| -| `default` | `--hm-sem-action-primary` (Primary Green `#123328`) | `--hm-sem-on-action-primary` (White) | 면과 동일 | +| `default` | `--hm-sem-action-primary` (Primary Green `#164434`) | `--hm-sem-on-action-primary` (White) | 면과 동일 | | `secondary` | `--hm-sem-bg-subtle` | `--hm-sem-fg-secondary` | 면과 동일 | | `destructive` | `--hm-sem-action-destructive` | White | 면과 동일 | | `outline` | `--hm-sem-bg-surface` | `--hm-sem-fg-primary` | `--hm-sem-stroke-default` | diff --git a/docs/components/breadcrumb.md b/docs/components/breadcrumb.md index 53ed71f..d0280c7 100644 --- a/docs/components/breadcrumb.md +++ b/docs/components/breadcrumb.md @@ -69,7 +69,7 @@ Component Mapping 위치: `packages/ui/src/theme/breadcrumb.css` (`--hm-breadcru ## 9. Storybook -- 대표 Story `All`("Breadcrumb"): Basic(3 depth), Ellipsis(Dropdown Menu 조합), Long path, Custom link(asChild)와 custom separator를 한 페이지에 둔다. +- 대표 Story `All`("Breadcrumb"): Variants(Basic(3 depth), Ellipsis(Dropdown Menu 조합), Custom link(asChild)와 custom separator)를 PC 균등 3열로, Usage(Long path, 최대 900px)를 한 페이지에 둔다(2026-11-09 Overview 제거). - verification: `Basic`, `Ellipsis`, `Long Path`. ## 10. 사용자 확정 결정 diff --git a/docs/components/button.md b/docs/components/button.md index 281502f..94a2343 100644 --- a/docs/components/button.md +++ b/docs/components/button.md @@ -150,7 +150,7 @@ CVA 구조, `data-slot`, `asChild`(Radix `Slot`), `className` 확장, focus-visi ## 11. Storybook - 대표 Story `All`("Button")이 기본 sidebar의 유일한 Button 항목이다 → 1뎁스. -- `All`의 구역: Overview → Sizes → Variants → States. 기본 버튼·크기·허용 조합·Brand/Standard 상태를 보여준다. Red Solid와 Outline은 Variants와 Standard States에도 포함되며, 삭제·취소 세트와 Long Label은 verification Story에서 따로 확인한다. +- `All`의 구역: Sizes → Variants → States(2026-11-09 Overview 제거; 단독 Overview 버튼은 Sizes의 Brand Medium과 같아 통합). 기본 버튼·크기·허용 조합·Brand/Standard 상태를 보여준다. Red Solid와 Outline은 Variants와 Standard States에도 포함되며, 삭제·취소 세트와 Long Label은 verification Story에서 따로 확인한다. PC에서는 Sizes·Variants가 같은 3열(Brand / Standard Solid / Standard Outline)을 쓰고 States의 Solid·Outline 표는 좌우 2열이다. - verification(`tags: ["verification"]`, 기본 sidebar 제외): `Roles`, `Sizes`, `States`("Brand States"), `StandardStates`, `LongLabel`, `KoreanLabels`, `IconTextNarrow`, `Destructive`, `Playground`(HM 전용), `Compatibility`(ghost/link, default/outline 별칭). Controls는 조합별 선택을 제한하지 않으므로 §6.1의 허용 조합을 직접 지킨다. Verification은 기술 점검용이며 운영 화면의 사용 위치·세트 규칙은 §5가 우선한다. - 대표 경로/ID: `Components/Form/Button → All` (`components-form-button--all`), `Components/Overlay/Dialog → All` (`components-overlay-dialog--all`), `Components/Overlay/Alert Dialog → All` (`components-overlay-alert-dialog--all`), `Patterns/Data/Filter Bar → Filter Bar` (`patterns-data-filter-bar--all`). 삭제 세트 점검 ID는 `components-form-button--destructive`(verification)다. - 운영 규칙은 `프로젝트-지침.md` §6.3, §7 참조. diff --git a/docs/components/checkbox.md b/docs/components/checkbox.md index b7b1bc8..f837ade 100644 --- a/docs/components/checkbox.md +++ b/docs/components/checkbox.md @@ -100,8 +100,8 @@ Radix 구조·ARIA(`role=checkbox`, `aria-checked`)·키보드, `data-slot`, `cn ## 9. Storybook -- 대표 Story `All`("Checkbox"): `unchecked`, `checked`, `indeterminate`, `hover`, `focus`, `error`, `disabled`, `long`. Focus는 `play`로 실제 focus. `indeterminate`는 controlled 예시를 겸해 클릭하면 checked가 된다(Radix, 2026-10-22 별도 `interactive` 구역 통합). `hover`는 Unchecked·Checked를 Storybook 전용 `data-sb-hover`(`.storybook/pseudo-states.ts`)로 고정해 보여 준다. Checkbox API가 아니며 소비 코드에 붙이지 않는다. -- verification: `Unchecked`, `Checked`, `Indeterminate`, `Disabled`, `Error`, `Playground`. +- 대표 Story `All`("Checkbox"): States `unchecked`, `checked`, `indeterminate`, `hover`, `focus`, `disabled`(PC 3열 × 2행)와 Validation `error`. Overview·Usage 구역은 2026-11-09에 없앴고 `long`(Long Label) 예시는 숨김 verification Story `LongLabel`로 옮겼다. 옵션 Label은 Story에서만 `--hm-label-text`를 `--foreground`로 덮어 기본 텍스트 색으로 보이며(공용 Label은 그대로, 비활성 Checkbox 옆 Label은 `peer-disabled`로 보조색 유지), 예시 제목은 보조색이다. Focus는 `play`로 실제 focus. `indeterminate`는 controlled 예시를 겸해 클릭하면 checked가 된다(Radix, 2026-10-22 별도 `interactive` 구역 통합). `hover`는 Unchecked·Checked를 Storybook 전용 `data-sb-hover`(`.storybook/pseudo-states.ts`)로 고정해 보여 준다. Checkbox API가 아니며 소비 코드에 붙이지 않는다. +- verification: `Unchecked`, `Checked`, `Indeterminate`, `Disabled`, `Error`, `LongLabel`("Long Label"), `Playground`. ## 10. 사용자 확정 결정 diff --git a/docs/components/label.md b/docs/components/label.md index da2127e..dfb0e96 100644 --- a/docs/components/label.md +++ b/docs/components/label.md @@ -88,7 +88,7 @@ Radix Label 동작·접근성, `data-slot`, `cn(..., className)`, `select-none`, ## 9. Storybook -- 대표 Story `All`("Label"): 구역 `default`(htmlFor), `required`(소비 조합), `disabled`, `long`. +- 대표 Story `All`("Label"): States(`default`(htmlFor), `disabled`)와 Usage(`select`(부서 선택), `required`(소비 조합), `long`)(2026-11-09 Overview 제거). - 별도 verification Story 없음(구역이 단순). ## 10. 사용자 확정 결정 diff --git a/docs/components/menubar.md b/docs/components/menubar.md index 1d16227..ab0cce6 100644 --- a/docs/components/menubar.md +++ b/docs/components/menubar.md @@ -76,7 +76,7 @@ Radix 구조·ARIA(`role=menubar`, `menu`, `menuitem*`)·키보드 모델(Down/E ## 9. Storybook -- 대표 Story `All`("Menubar"): 파일(item+shortcut, disabled, separator, sub menu 내보내기, destructive 종료), 편집, 보기(Label, Checkbox, Radio Group)를 가진 실제 bar. +- 대표 Story `All`("Menubar"): 구역 제목은 Basic(2026-11-09 Overview에서 변경, 열린 메뉴용 고정 min-height 384px 제거). 파일(item+shortcut, disabled, separator, sub menu 내보내기, destructive 종료), 편집, 보기(Label, Checkbox, Radio Group)를 가진 실제 bar. - 숨김 verification: `TriggerFocus`, `OpenFocus`. `OpenFocus`는 검수 목적으로 Story의 `play`에서 실제 열린 menu의 Trigger에 focus를 준다. 일반 Story/Production은 Radix 기본대로 메뉴 항목에 focus를 이동한다. - Focus 검수는 일반 Story의 computed style 기준으로 한다. Designer의 `.hm-designer button:focus-visible` 장식 outline을 컴포넌트 ring의 근거로 사용하지 않는다. diff --git a/docs/components/navigation-menu.md b/docs/components/navigation-menu.md index 6f246b6..0560dab 100644 --- a/docs/components/navigation-menu.md +++ b/docs/components/navigation-menu.md @@ -72,7 +72,7 @@ Radix 구조·동작(hover open delay, Arrow 키와 Tab 이동, Escape 닫힘, f ## 9. Storybook -- 대표 Story `All`("Navigation Menu"): `Viewport(기본)`과 `viewport={false}` 두 구성을 한 페이지에 둔다. 제품(설명 있는 3 링크), 자료(2열 4 링크), 회사(현재 위치 링크), 문의(일반 링크), 준비 중(disabled Trigger). +- 대표 Story `All`("Navigation Menu"): Variants 한 구역에 `Viewport(기본)`과 `viewport={false}` 두 구성을 PC 균등 2열로 둔다(2026-11-09 Overview 제거, 닫힌 메뉴용 min-height 256px는 PC에서만 해제하고 1000px 미만 1열에서는 유지). 제품(설명 있는 3 링크), 자료(2열 4 링크), 회사(현재 위치 링크), 문의(일반 링크), 준비 중(disabled Trigger). - verification: `Default`, `No Viewport`. - Story의 Content 폭은 `style` 인라인으로 지정한다(새 Story 파일의 Tailwind 임의값 클래스가 개발 서버에서 생성되지 않는 일이 있었다). diff --git a/docs/components/pagination.md b/docs/components/pagination.md index 9dc1f6e..8fdd862 100644 --- a/docs/components/pagination.md +++ b/docs/components/pagination.md @@ -27,7 +27,7 @@ | Page link | 34 × 34px(min-width 34), radius 4px(`--hm-radius-control-md`), 14 / 20 / 500, `--hm-sem-fg-primary` | | Previous / Next | 높이 34px, padding `0 12px`, 아이콘 16px, 라벨 `hidden sm:block`("Previous"/"Next", 모바일은 아이콘만) | | 간격 | 목록 gap 4px | -| Current Page | 배경 `--hm-sem-action-primary`(Primary Green `#123328`), 글자 `--hm-sem-on-action-primary`(흰색), weight 700 | +| Current Page | 배경 `--hm-sem-action-primary`(Primary Green `#164434`), 글자 `--hm-sem-on-action-primary`(흰색), weight 700 | | Ellipsis | 34 × 34 영역, 아이콘 16px, `--hm-sem-fg-secondary` | ## 4. 상태 규격 @@ -67,7 +67,7 @@ Component Mapping 위치: `packages/ui/src/theme/pagination.css` (`--hm-paginati ## 9. Storybook -- 대표 Story `All`("Pagination"): First page, Middle page, Last page, Long range with ellipsis(1 … 9 10 11 … 20)를 한 페이지에 둔다. 각 Specimen이 local state를 가지고 클릭 시 현재 페이지가 실제로 바뀐다(`#page-N` href + `preventDefault`). +- 대표 Story `All`("Pagination"): Variants 한 구역에 First page, Middle page, Last page, Long range with ellipsis(1 … 9 10 11 … 20)를 PC 2열 × 2행으로 둔다(2026-11-09 Overview / States / Usage 통합, 버튼 묶음은 칸 안 왼쪽 정렬). 각 Specimen이 local state를 가지고 클릭 시 현재 페이지가 실제로 바뀐다(`#page-N` href + `preventDefault`). - verification: `First Page`, `Last Page`, `Long Range`. ## 10. 사용자 확정 결정 diff --git a/docs/components/radio-group.md b/docs/components/radio-group.md index d207cc1..d6fe9ce 100644 --- a/docs/components/radio-group.md +++ b/docs/components/radio-group.md @@ -57,7 +57,7 @@ shadcn `size-4 border-input text-primary shadow-xs dark:` class 제거 → theme ## 9. Storybook -대표 Story `All`: `vertical`, `horizontal`, `hover`, `focus`, `error`, `disabled-item`, `disabled-group`. Focus는 `play`로 실제 focus. `hover`는 첫 항목을 Storybook 전용 `data-sb-hover`로 고정해 보여 주며 RadioGroupItem API가 아니다. verification: `Vertical`, `Horizontal`, `Disabled`, `Error`. +대표 Story `All`: Variants(`vertical`, `horizontal`; 2026-11-09 Overview 제거로 Vertical이 Variants 첫 항목), States(`hover`, `focus`, `disabled-item`, `disabled-group`), Validation(`error`). Focus는 `play`로 실제 focus. `hover`는 첫 항목을 Storybook 전용 `data-sb-hover`로 고정해 보여 주며 RadioGroupItem API가 아니다. verification: `Vertical`, `Horizontal`, `Disabled`, `Error`. ## 10. 사용자 확정 결정 diff --git a/docs/components/select.md b/docs/components/select.md index 6a0052d..165e889 100644 --- a/docs/components/select.md +++ b/docs/components/select.md @@ -98,7 +98,7 @@ Radix Root/Trigger/Portal/Content/Viewport/Item/ItemText 구조, 키보드 조 ## 9. Storybook -- 대표 Story `All`("Select"): Sizes(Medium / Large 비교, 각 Trigger로 실제 목록 열기) → States(`selected`, `disabled`, `disabled-placeholder`) → Invalid / Focus(`invalid`, `invalid-disabled`). 2026-10-22 Overview의 `default`·로드 시 열린 `open` 예시는 대표 화면에서 뺐다. 열린 목록은 숨김 `Open`, 크기별 수치 목록은 숨김 `Sizes`("Compare Sizes")에서 확인한다. size 생략 시 Large(§5)는 그대로다. +- 대표 Story `All`("Select"): Sizes(Medium / Large 비교, 각 Trigger로 실제 목록 열기) → States(`selected`, `disabled`, `disabled-placeholder`) → Validation(`invalid`, `invalid-disabled`; 2026-11-09 `Invalid / Focus`에서 제목 변경, Focus 예시가 없다). PC에서는 세 구역이 같은 3열 칸을 쓰고 Sizes·Validation은 첫 두 칸만 채운다. 2026-10-22 Overview의 `default`·로드 시 열린 `open` 예시는 대표 화면에서 뺐다. 열린 목록은 숨김 `Open`, 크기별 수치 목록은 숨김 `Sizes`("Compare Sizes")에서 확인한다. size 생략 시 Large(§5)는 그대로다. - verification(`tags: ["verification"]`): `Default`, `Open`, `Selected`, `Disabled`, `Sizes`("Compare Sizes"), `Medium`, `Large`, `LongContent`, `Scroll`, `Playground`(HM 전용). - `Disabled` Story 구성: Trigger 비활성 상태들(placeholder 포함). - `InvalidFocus` verification Story: 앞/뒤 버튼 사이의 Invalid Trigger와 Disabled Invalid Trigger. Tab / Shift+Tab, Enter / Space, Escape 및 focus return을 실제 키보드로 확인한다. diff --git a/docs/components/slider.md b/docs/components/slider.md index 804a2b7..a0ea50c 100644 --- a/docs/components/slider.md +++ b/docs/components/slider.md @@ -74,7 +74,7 @@ Radix 구조·동작(pointer drag, track 클릭 이동, 키보드, thumb 정렬/ ## 9. Storybook -- 대표 Story `All`("Slider"): Single(값 label), Range(두 thumb, `minStepsBetweenThumbs` 5), Step(25), Disabled, Vertical을 한 페이지에 둔다. 값 label은 Story 조합(local state)이다. +- 대표 Story `All`("Slider"): Variants(Single, Range(두 thumb, `minStepsBetweenThumbs` 5), Step(25), Vertical)와 States(Disabled) 두 구역으로 둔다(2026-11-09 Overview 제거, PC 4열). 값 label은 Story 조합(local state)이다. - verification: `Single`, `Range`, `Disabled`, `Focus`(실제 thumb focus). 기본 Sidebar에서 숨긴다. ## 10. 사용자 확정 결정 diff --git a/docs/components/switch.md b/docs/components/switch.md index f73be9a..286d2e6 100644 --- a/docs/components/switch.md +++ b/docs/components/switch.md @@ -56,7 +56,7 @@ shadcn의 `h-[1.15rem] w-8`, `border`, `shadow-xs`, `dark:` class 제거 → the ## 9. Storybook -대표 Story `All`: `off`, `on`, `hover`, `focus`, `disabled`(2026-10-22 `interactive` 구역 제거, 모든 예시가 실제 클릭으로 토글). `hover`는 Off·On을 Storybook 전용 `data-sb-hover`로 고정해 보여 주며 Switch API가 아니다. Focus는 `play`로 실제 focus. verification: `Off`, `On`, `Disabled`. +대표 Story `All`: States 한 구역에 `off`, `on`, `hover`, `focus`, `disabled`(2026-11-09 Overview 제거, PC 5열; 2026-10-22 `interactive` 구역 제거, 모든 예시가 실제 클릭으로 토글). `hover`는 Off·On을 Storybook 전용 `data-sb-hover`로 고정해 보여 주며 Switch API가 아니다. Focus는 `play`로 실제 focus. verification: `Off`, `On`, `Disabled`. ## 10. 사용자 확정 결정 diff --git a/docs/components/tabs.md b/docs/components/tabs.md index f297244..63d12b3 100644 --- a/docs/components/tabs.md +++ b/docs/components/tabs.md @@ -67,8 +67,8 @@ import { Tabs, TabsList, TabsTrigger, TabsContent } from "@hm-design/ui" | 상태 | 면 | 테두리 | 전경 | |---|---|---|---| | Default (`data-state="inactive"`) | `rgba(189,223,212,.45)` | top/right `rgba(38,102,81,.35)`, bottom `#DEDBD2` | `#266651` | -| Selected (`data-state="active"`) | `#FFFFFF` (`--hm-sem-bg-surface`) | top/right/left `#DEDBD2`, bottom 1px 표면색(기준선을 덮어 콘텐츠와 연결), `z-index: 2` | `#123328` | -| Hover (비선택만, `:hover`) | 기본 면 + Black 20% overlay (`linear-gradient`) | 변화 없음 | `#123328` | +| Selected (`data-state="active"`) | `#FFFFFF` (`--hm-sem-bg-surface`) | top/right/left `#DEDBD2`, bottom 1px 표면색(기준선을 덮어 콘텐츠와 연결), `z-index: 2` | `#164434` | +| Hover (비선택만, `:hover`) | 기본 면 + Black 20% overlay (`linear-gradient`) | 변화 없음 | `#164434` | | Hover (선택) | 적용 안 함 | — | — | | Focus (`:focus-visible`) | shadcn ring 유지 | — | — | | Disabled | shadcn 기본 `opacity-50`, 클릭 불가 | — | — | @@ -126,12 +126,12 @@ Radix Tabs 구조·ARIA(`role=tablist/tab/tabpanel`, `aria-selected`)·roving ta ## 9. Storybook -- 대표 Story `All`("Tabs"): **Overview**는 fill / panelSurface를 생략한 기본 Primary다. 같은 Primary가 반복되던 **Default API** 구역(`fill`만, `fill` + `panelSurface="content"` 명시)은 2026-10-22 숨김 verification `DefaultApi`로 옮겼다. **Variants**는 명시적 Secondary, **States**는 기본 Primary + 8개 탭 + 260px wrapper Overflow다. 기존 대표 Story ID와 메뉴를 유지한다. Hover는 실제 포인터로 확인한다. +- 대표 Story `All`("Tabs"): **Variants**는 Primary(fill / panelSurface를 생략한 기본)·Secondary(`panelSurface="surface"`)·Overflow(20개 탭, 이전 States의 Overflow 예시)를 PC 균등 3열로 두고, **Usage**는 Card 내부 · Secondary / 페이지 직접 배치 · Primary 2열이다(2026-11-09 Overview·States 구역을 Variants로 통합, 이 페이지의 위아래 패딩만 줄여 1280×900 한 화면). 같은 Primary가 반복되던 **Default API** 구역(`fill`만, `fill` + `panelSurface="content"` 명시)은 2026-10-22 숨김 verification `DefaultApi`로 옮겼다. 기존 대표 Story ID와 메뉴를 유지한다. Hover는 실제 포인터로 확인한다. - verification(`tags: ["verification"]`): `DefaultApi`, `Secondary`, `SelectedFirst`, `SelectedLast`, `Focus`, `Disabled`, `Overflow`, `SecondaryOverflow`, `LongLabel`. Primary 기준이며 Secondary는 같은 CSS 경로를 쓴다. Focus는 `play`로 실제 focus를 준다. - `LongLabel`은 짧은 라벨, 긴 라벨 1개, 긴 라벨 여러 개, 260px 좁은 container를 함께 검증한다. 라벨은 `nowrap`·무말줄임이며 실제 필요 폭이 넘을 때 이동 버튼으로 전환한다. - non-fill Story(`Selected`, `SelectedMiddle`, `Fill`, `FillContent`, `FillOverflow`와 대표의 non-fill 구역)는 2026-10-06에 제거했다. API(`fill=false`, Legacy profile CSS)는 유지한다(§10). - 2026-10-08 숨김 `Compatibility`(`verification` 태그 + **VERIFICATION ONLY** 표시)는 Legacy `fill={false}` / `fill={false} panelSurface="surface"` 동일성과 `panelSurface="surface"`만 명시한 경우의 Secondary 전환을 확인한다. 일반 Story 메뉴를 추가하지 않는다. -- Overview / Variants / States, `DefaultApi` 및 Fill verification 예제의 콘텐츠 panel은 `px-0 py-6`로 통일해 D-01을 실제로 반영한다. Primary는 상위 content 면, Secondary는 상위 surface 면에 연결하며 내부 패널의 별도 border·배경·radius를 제거한다. Compatibility의 Legacy non-fill 두 예제만 이전 `border bg-card rounded-b p-4`를 보존한다. +- Variants / Usage, `DefaultApi` 및 Fill verification 예제의 콘텐츠 panel은 `px-0 py-6`로 통일해 D-01을 실제로 반영한다. Primary는 상위 content 면, Secondary는 상위 surface 면에 연결하며 내부 패널의 별도 border·배경·radius를 제거한다. Compatibility의 Legacy non-fill 두 예제만 이전 `border bg-card rounded-b p-4`를 보존한다. - **Usage**(2026-10-09 추가)는 공개 Card / Input / Textarea / Table을 조합해 Card 내부 Secondary와 페이지 content 면 위 Primary를 보여준다. 두 예제 모두 `TabsContent`는 `px-0 py-6`이며 별도 배경·border·radius를 추가하지 않는다. 대표 Story ID·기존 구역·verification Story는 유지한다. ## 10. 사용자 확정 결정 diff --git a/docs/components/textarea.md b/docs/components/textarea.md index 6c4865d..d5cc7d6 100644 --- a/docs/components/textarea.md +++ b/docs/components/textarea.md @@ -86,8 +86,8 @@ native `