diff --git a/.storybook/manager.js b/.storybook/manager.js index f31a097..bc20103 100644 --- a/.storybook/manager.js +++ b/.storybook/manager.js @@ -38,7 +38,7 @@ addons.setConfig({ }, theme: create({ base: 'light', - brandTitle: 'Hanmac Design System', + brandTitle: '한맥 디자인 시스템', brandUrl: './', brandTarget: '_self', fontBase: "'Hanmac Manager Noto Sans KR', 'Noto Sans KR', 'Malgun Gothic', sans-serif", diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index 9f246aa..741e0f3 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -25,7 +25,7 @@ const preview: Preview = { includeNames: true, order: [ "Foundation", - ["Hanmac Color", "Company Colors", "Typography", "Layout"], + ["한맥 컬러", "가족사 컬러", "Typography"], "Components", [ "Form", @@ -47,8 +47,8 @@ const preview: Preview = { ["Data", ["Data Table", "Filter Bar"], "Layout", ["GNB", "LNB", "Dashboard Layout", "Loading Screen"]], "SW", ["Header", ["SW Header", "*"], "Footer", ["SW Footer", "*"], "Popup", "Viewer", "Theme"], - "OrgChart", - ["Overview", "Department Colors", "Full Composition", "Expanded OrgChart"], + "조직도", + ["개요", "부서별 색상", "전체 구성", "확장 조직도"], "노선도", "*", // With includeNames, keeps the Loader group after the Runtime Contract Stories (its place without names). diff --git a/src/center/center-facility.stories.tsx b/src/center/center-facility.stories.tsx index 4532fb1..32d5ccf 100644 --- a/src/center/center-facility.stories.tsx +++ b/src/center/center-facility.stories.tsx @@ -16,7 +16,7 @@ import { withRepresentation } from "./center-shared" // Owners: ui-viz docs/visualization/facility.md and facility-assets.md (128 approved SVG references, shipped unchanged). // The display scale (Q2b) is HOLD and Facility has no Selected / Hover state. const meta = { - title: "노선도/Facility", + title: "노선도/시설물", id: "center-graphic-facility", component: TunnelFacility, parameters: { layout: "padded" }, @@ -31,23 +31,25 @@ const page = (name: string, Demo: ComponentType): Story => ({ render: () => ( - + {withRepresentation(() => )} ), }) -export const Tunnel: Story = page("터널", TunnelReferenceDemo) -export const Bridge: Story = page("교량", BridgeReferenceDemo) -export const Intersection: Story = page("교차로", IntersectionReferenceDemo) -export const Junction: Story = page("분기점", JunctionReferenceDemo) -export const Interchange: Story = page("나들목", InterchangeReferenceDemo) -export const Roadside: Story = page("휴게소 · 졸음쉼터", RoadsideReferenceDemo) +// `name` is repeated as a literal because Storybook's static indexer cannot read it through page(); it drives the sidebar label. +export const Tunnel: Story = { ...page("터널", TunnelReferenceDemo), name: "터널" } +export const Bridge: Story = { ...page("교량", BridgeReferenceDemo), name: "교량" } +export const Intersection: Story = { ...page("교차로", IntersectionReferenceDemo), name: "교차로" } +export const Junction: Story = { ...page("분기점", JunctionReferenceDemo), name: "분기점" } +export const Interchange: Story = { ...page("나들목", InterchangeReferenceDemo), name: "나들목" } +export const Roadside: Story = { ...page("휴게소 · 졸음쉼터", RoadsideReferenceDemo), name: "휴게소 · 졸음쉼터" } // Linked facilities are a standalone section heading followed by item cards. // Keep the reference data/artwork and road-class grouping owned by the package. export const Linked: Story = { ...page("연계 시설물", LinkedFacilityReferenceDemo), + name: "연계 시설물", render: () => ( diff --git a/src/center/center-information.stories.tsx b/src/center/center-information.stories.tsx index e9852ec..e544dd9 100644 --- a/src/center/center-information.stories.tsx +++ b/src/center/center-information.stories.tsx @@ -6,7 +6,7 @@ import { withRepresentation } from "./center-shared" // Owner: ui-viz docs/patterns/center-information-presentation.md and center-information-{box,table,emphasis}.md. // Single-line ellipsis is resolved; multi-line overflow, exact placement and the presentation scale (Q3) are not. const meta = { - title: "노선도/Information", + title: "노선도/정보", id: "center-graphic-information", parameters: { layout: "fullscreen", controls: { disable: true } }, } satisfies Meta @@ -15,11 +15,11 @@ type Story = StoryObj // Common Story page. The CENTER representation wraps only the specimen, so the page title is never scaled with the graphic. export const Information: Story = { - name: "Information", + name: "정보", render: () => ( - - + + {withRepresentation(() => (
diff --git a/src/center/center-spatial.stories.tsx b/src/center/center-spatial.stories.tsx index ed3fefb..91cd86d 100644 --- a/src/center/center-spatial.stories.tsx +++ b/src/center/center-spatial.stories.tsx @@ -7,7 +7,7 @@ import { withRepresentation } from "./center-shared" // Owners: ui-viz docs/visualization/route.md, spatial-map.md, spatial-section.md, composition.md. // Route layer order Shadow -> Outline -> Primary Stroke is CONFIRMED; the whole-map layer order is Candidate and line join is TBD. const meta = { - title: "노선도/Spatial", + title: "노선도/노선·공간", id: "center-graphic-spatial", component: RouteLine, parameters: { layout: "fullscreen", controls: { disable: true } }, @@ -17,11 +17,11 @@ type Story = StoryObj // Common Story page. The CENTER representation wraps only the specimen, so the page title is never scaled with the graphic. export const Spatial: Story = { - name: "Spatial", + name: "노선·공간", render: () => ( - - + + {withRepresentation(() => )} diff --git a/src/center/center-title.stories.tsx b/src/center/center-title.stories.tsx index 9979f44..6413075 100644 --- a/src/center/center-title.stories.tsx +++ b/src/center/center-title.stories.tsx @@ -6,7 +6,7 @@ import { withRepresentation } from "./center-shared" // Owner: ui-viz docs/components/center-title.md. Title Resolution B numeric output is TBD; the per-Type palette is SCOPED_DESIGN_APPROVAL. const meta = { - title: "노선도/Title", + title: "노선도/제목", id: "center-graphic-title", component: CenterTitle, parameters: { layout: "padded" }, @@ -17,12 +17,12 @@ type Story = StoryObj // Representative Story: the four title types. Named after the area so Storybook shows it as a single sidebar item. // Common Story page. The CENTER representation wraps only the specimen, so the page title is never scaled with the graphic. export const Compositions: Story = { - name: "Title", + name: "제목", parameters: { layout: "fullscreen", controls: { disable: true } }, render: () => ( - - + + {withRepresentation(() => )} diff --git a/src/foundation/color.stories.tsx b/src/foundation/color.stories.tsx index 62c1cf7..1157979 100644 --- a/src/foundation/color.stories.tsx +++ b/src/foundation/color.stories.tsx @@ -35,13 +35,13 @@ function ColorChip({ prefix, stage, values }: { prefix: PalettePrefix; stage: Co function ColorReferencePage() { const values = useResolvedProperties(colorProperties) - return + return {palettes.map(palette =>
{stages.map(stage => )}
)}
} -// The sidebar name is "Hanmac Color"; `id` keeps the existing Story ID (foundation-color--all) stable. -const meta = { title: "Foundation/Hanmac Color", id: "foundation-color", parameters: { layout: "fullscreen" } } satisfies Meta +// The sidebar name is "한맥 컬러"; `id` keeps the existing Story ID (foundation-color--all) stable. +const meta = { title: "Foundation/한맥 컬러", id: "foundation-color", parameters: { layout: "fullscreen" } } satisfies Meta export default meta -export const All: StoryObj = { name: "Hanmac Color", render: () => } +export const All: StoryObj = { name: "한맥 컬러", render: () => } diff --git a/src/foundation/company-colors.stories.tsx b/src/foundation/company-colors.stories.tsx index e19cad1..9ff045d 100644 --- a/src/foundation/company-colors.stories.tsx +++ b/src/foundation/company-colors.stories.tsx @@ -4,7 +4,15 @@ import { ReferencePage, ReferenceSection } from "./reference" // Company colors come from the existing OrgChart presets; HEX values are never duplicated here. // The chip markup and classes are shared with Foundation/Color (foundation.css). -const companies = Object.values(companyColorPresets) +// Display order only. PC rows: 한맥기술/삼안 · 장헌/피티씨 · 장헌산업/한라산업개발/바론컨설턴트. +// Row starts (jangheon, jangheon-industry) are pinned to column 1 in foundation.css via the section ids; companies not listed follow in preset order. +const companyRows = [["hanmac", "saman"], ["jangheon", "ptc"], ["jangheon-industry", "halla", "baron"]] +const presetCompanies = Object.values(companyColorPresets) +const listedIds = companyRows.flat() +const companies = [ + ...companyRows.flatMap(ids => ids.flatMap(id => presetCompanies.filter(company => company.companyId === id))), + ...presetCompanies.filter(company => !listedIds.includes(company.companyId)), +] function CompanyColorChip({ label, hex, main }: { label: string; hex: string; main: boolean }) { return
@@ -14,9 +22,9 @@ function CompanyColorChip({ label, hex, main }: { label: string; hex: string; ma } function CompanyColorsPage() { - return + return
- {companies.map(company => + {companies.map(company =>
{company.secondary.map((hex, index) => )} @@ -25,6 +33,7 @@ function CompanyColorsPage() {
} -const meta = { title: "Foundation/Company Colors", parameters: { layout: "fullscreen" } } satisfies Meta +// The sidebar name is "가족사 컬러"; `id` keeps the existing Story ID (foundation-company-colors--all) stable. +const meta = { title: "Foundation/가족사 컬러", id: "foundation-company-colors", parameters: { layout: "fullscreen" } } satisfies Meta export default meta -export const All: StoryObj = { name: "Company Colors", render: () => } +export const All: StoryObj = { name: "가족사 컬러", render: () => } diff --git a/src/foundation/foundation.css b/src/foundation/foundation.css index 7bf35f0..5a95199 100644 --- a/src/foundation/foundation.css +++ b/src/foundation/foundation.css @@ -41,6 +41,9 @@ chips up to 3 per row (min 100px each, 3 -> 2 -> 1). Chip size stays at one third even when a company has fewer chips. */ .hm-foundation .hm-company-grid { display: grid; gap: 48px 32px; grid-template-columns: repeat(auto-fill, minmax(max(316px, (100% - 64px) / 3), 1fr)); } .hm-foundation .hm-company-grid > .sb-page-section { min-width: 0; margin-top: 0; } +/* Row starts for the 2 / 2 / 3 company layout (한맥·삼안 / 장헌·피티씨 / 장헌산업·한라산업개발·바론컨설턴트). */ +.hm-foundation .hm-company-grid > #company-jangheon, +.hm-foundation .hm-company-grid > #company-jangheon-industry { grid-column-start: 1; } .hm-foundation .hm-brand-color-row[data-company-id] { display: grid; gap: 8px; overflow: visible; padding-bottom: 0; grid-template-columns: repeat(auto-fill, minmax(max(100px, (100% - 16px) / 3), 1fr)); } /* Typography: compact specification page. Font Family one line, Font Weight small cards, Specimens as comparison tables diff --git a/src/foundation/layout.stories.tsx b/src/foundation/layout.stories.tsx index 7c536a7..b3f8dcd 100644 --- a/src/foundation/layout.stories.tsx +++ b/src/foundation/layout.stories.tsx @@ -30,6 +30,7 @@ function LayoutReferencePage() {
} -const meta = { title: "Foundation/Layout", parameters: { layout: "fullscreen" } } satisfies Meta +// Hidden from the sidebar with the verification tag; the Story ID and direct URL (foundation-layout--all) stay available. +const meta = { title: "Foundation/Layout", tags: ["verification"], parameters: { layout: "fullscreen" } } satisfies Meta export default meta export const All: StoryObj = { name: "Layout", render: () => } diff --git a/src/org-chart/department-colors-preview.css b/src/org-chart/department-colors-preview.css index 343f396..4bfe34a 100644 --- a/src/org-chart/department-colors-preview.css +++ b/src/org-chart/department-colors-preview.css @@ -1,7 +1,7 @@ /* Department Colors Storybook adapter only. The actual Tunnel sample/stage frame comes from center-stories.css; this sheet never selects employee cards. */ .hm-orgchart-department-preview .hm-orgchart-department-colors-design { - grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--sb-center-column-gap); } @@ -43,6 +43,12 @@ background: transparent; } +@media (max-width: 960px) { + .hm-orgchart-department-preview .hm-orgchart-department-colors-design { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + @media (max-width: 760px) { .hm-orgchart-department-preview .hm-orgchart-department-colors-design { grid-template-columns: minmax(0, 1fr); diff --git a/src/org-chart/org-chart-cards.stories.tsx b/src/org-chart/org-chart-cards.stories.tsx index 589dad3..e3f2d53 100644 --- a/src/org-chart/org-chart-cards.stories.tsx +++ b/src/org-chart/org-chart-cards.stories.tsx @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; import { CoreComponentPreview } from './core-component-preview'; import { organizationStylePresets } from '../../packages/org-chart/src/core/style-presets'; -const meta = { title: 'OrgChart/Components/Cards', tags: ['internal'], component: CoreComponentPreview, parameters: { layout: 'padded', controls: { disable: true } } } satisfies Meta; +const meta = { title: '조직도/Components/Cards', id: 'orgchart-components-cards', tags: ['internal'], component: CoreComponentPreview, parameters: { layout: 'padded', controls: { disable: true } } } satisfies Meta; export default meta; type Story = StoryObj; function organization(variant: number): Story { diff --git a/src/org-chart/org-chart-department-colors.stories.tsx b/src/org-chart/org-chart-department-colors.stories.tsx index b3cd009..803d3f5 100644 --- a/src/org-chart/org-chart-department-colors.stories.tsx +++ b/src/org-chart/org-chart-department-colors.stories.tsx @@ -2,7 +2,7 @@ import { StrictMode } from 'react'; import type { Meta, StoryObj } from '@storybook/react-vite'; import { DepartmentTypographyPreview } from './org-chart-page-previews'; -const meta = { title: 'OrgChart/Department Colors', component: DepartmentTypographyPreview, parameters: { layout: 'fullscreen', controls: { disable: true } }, decorators: [(Story) => ] } satisfies Meta; +const meta = { title: '조직도/부서별 색상', component: DepartmentTypographyPreview, parameters: { layout: 'fullscreen', controls: { disable: true } }, decorators: [(Story) => ] } satisfies Meta; export default meta; type Story = StoryObj; -export const DepartmentColors: Story = { name: 'Department Colors', parameters: { __id: 'orgchart--department-colors' } }; +export const DepartmentColors: Story = { name: '부서별 색상', parameters: { __id: 'orgchart--department-colors' } }; diff --git a/src/org-chart/org-chart-expanded.stories.tsx b/src/org-chart/org-chart-expanded.stories.tsx index 100a8b7..ebd294b 100644 --- a/src/org-chart/org-chart-expanded.stories.tsx +++ b/src/org-chart/org-chart-expanded.stories.tsx @@ -50,7 +50,7 @@ function ExpandedPreview() { })), []); return - + {/* Preview first: the chart sits right under the page title; its own header already names it, so no section header. */}
{error ?

{error}

: null} @@ -61,7 +61,7 @@ function ExpandedPreview() { ; } -const meta = { title: 'OrgChart/Expanded OrgChart', component: ExpandedPreview, parameters: { layout: 'fullscreen', controls: { disable: true } }, decorators: [(Story) => ] } satisfies Meta; +const meta = { title: '조직도/확장 조직도', component: ExpandedPreview, parameters: { layout: 'fullscreen', controls: { disable: true } }, decorators: [(Story) => ] } satisfies Meta; export default meta; type Story = StoryObj; -export const ExpandedOrgChart: Story = { name: 'Expanded OrgChart', parameters: { __id: 'orgchart--expanded-org-chart' } }; +export const ExpandedOrgChart: Story = { name: '확장 조직도', parameters: { __id: 'orgchart--expanded-org-chart' } }; diff --git a/src/org-chart/org-chart-full-composition.stories.tsx b/src/org-chart/org-chart-full-composition.stories.tsx index 95a0956..6e06b8d 100644 --- a/src/org-chart/org-chart-full-composition.stories.tsx +++ b/src/org-chart/org-chart-full-composition.stories.tsx @@ -2,7 +2,7 @@ import { StrictMode } from 'react'; import type { Meta, StoryObj } from '@storybook/react-vite'; import { CompositionPreview } from './org-chart-page-previews'; -const meta = { title: 'OrgChart/Full Composition', component: CompositionPreview, parameters: { layout: 'fullscreen', controls: { disable: true } }, decorators: [(Story) => ] } satisfies Meta; +const meta = { title: '조직도/전체 구성', component: CompositionPreview, parameters: { layout: 'fullscreen', controls: { disable: true } }, decorators: [(Story) => ] } satisfies Meta; export default meta; type Story = StoryObj; -export const FullComposition: Story = { name: 'Full Composition', parameters: { __id: 'orgchart--full-composition' } }; +export const FullComposition: Story = { name: '전체 구성', parameters: { __id: 'orgchart--full-composition' } }; diff --git a/src/org-chart/org-chart-overview-internal.stories.tsx b/src/org-chart/org-chart-overview-internal.stories.tsx index 9914fa0..87047f2 100644 --- a/src/org-chart/org-chart-overview-internal.stories.tsx +++ b/src/org-chart/org-chart-overview-internal.stories.tsx @@ -3,7 +3,7 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; import { CoreComponentPreview } from './core-component-preview'; import './org-chart-stories.css'; -const meta = { title: 'OrgChart/Verification/Overview', component: CoreComponentPreview, tags: ['internal'], parameters: { layout: 'padded', controls: { disable: true } }, decorators: [(Story) => ] } satisfies Meta; +const meta = { title: '조직도/Verification/Overview', component: CoreComponentPreview, tags: ['internal'], parameters: { layout: 'padded', controls: { disable: true } }, decorators: [(Story) => ] } satisfies Meta; export default meta; type Story = StoryObj; // Literal IDs preserve every existing direct URL after moving the hidden CSF entries. diff --git a/src/org-chart/org-chart-p1.stories.tsx b/src/org-chart/org-chart-p1.stories.tsx index c52c331..55090b0 100644 --- a/src/org-chart/org-chart-p1.stories.tsx +++ b/src/org-chart/org-chart-p1.stories.tsx @@ -2,7 +2,7 @@ import { StrictMode } from 'react'; import type { Meta, StoryObj } from '@storybook/react-vite'; import { OverviewPreview } from './org-chart-page-previews'; -const meta = { title: 'OrgChart/Overview', component: OverviewPreview, parameters: { layout: 'fullscreen', controls: { disable: true } }, decorators: [(Story) => ] } satisfies Meta; +const meta = { title: '조직도/개요', component: OverviewPreview, parameters: { layout: 'fullscreen', controls: { disable: true } }, decorators: [(Story) => ] } satisfies Meta; export default meta; type Story = StoryObj; -export const LogoPersonnelSummary: Story = { name: 'Overview', parameters: { __id: 'orgchart--logo-personnel-summary' } }; +export const LogoPersonnelSummary: Story = { name: '개요', parameters: { __id: 'orgchart--logo-personnel-summary' } }; diff --git a/src/org-chart/org-chart-page-previews.tsx b/src/org-chart/org-chart-page-previews.tsx index 1628445..5066d03 100644 --- a/src/org-chart/org-chart-page-previews.tsx +++ b/src/org-chart/org-chart-page-previews.tsx @@ -19,7 +19,7 @@ export function CompositionPreview() { const host = useRef(null); useLayoutEffect(() => centerCompositionPreview(host.current!), []); return - +
@@ -30,7 +30,7 @@ export function CompositionPreview() { export function DepartmentTypographyPreview() { return - +
@@ -39,7 +39,7 @@ export function DepartmentTypographyPreview() { export function OverviewPreview() { return - +
diff --git a/src/org-chart/org-chart-summary.stories.tsx b/src/org-chart/org-chart-summary.stories.tsx index 0264860..a197fb2 100644 --- a/src/org-chart/org-chart-summary.stories.tsx +++ b/src/org-chart/org-chart-summary.stories.tsx @@ -5,7 +5,8 @@ import { CoreComponentPreview } from "./core-component-preview" // and automatic Raw Count. Acquired logo mapping stays in the shared Core/asset // layer; Stories do not duplicate summary UI or add employee data fields. const meta = { - title: "OrgChart/Components/Summaries", + title: "조직도/Components/Summaries", + id: "orgchart-components-summaries", tags: ["internal"], component: CoreComponentPreview, args: { kind: "PositionSummary" }, diff --git a/src/org-chart/org-chart.stories.tsx b/src/org-chart/org-chart.stories.tsx index 0205fd4..4858d1e 100644 --- a/src/org-chart/org-chart.stories.tsx +++ b/src/org-chart/org-chart.stories.tsx @@ -167,7 +167,8 @@ function MultipleContent() { } const meta = { - title: "OrgChart/Content", + title: "조직도/콘텐츠", + id: "orgchart-content", tags: ["internal"], component: OrgChart, parameters: { @@ -190,28 +191,28 @@ export default meta type Story = StoryObj export const BasicOrganization: Story = { - name: "Basic Organization", + name: "기본 조직도", render: args => , } export const OrganizationHierarchy: Story = { - name: "Organization Hierarchy", + name: "조직 계층", args: { dataSource: hierarchySource }, render: args => , } export const EmployeeCards: Story = { - name: "Employee Cards", + name: "직원 카드", args: { dataSource: employeeSource }, render: args => , } export const OrganizationSummary: Story = { - name: "Organization Summary", + name: "조직 요약", render: args => , } export const JSONDataUpdate: Story = { name: "JSON Data Update", render: () => } -export const LoadingEmptyError: Story = { name: "Loading / Empty / Error", render: () => } +export const LoadingEmptyError: Story = { name: "로딩 / 비어 있음 / 오류", render: () => } export const ResponsiveContainer: Story = { name: "Responsive Container", render: () => } export const MultipleInstances: Story = { name: "Multiple Instances", render: () => } diff --git a/src/sw/sw-header.stories.tsx b/src/sw/sw-header.stories.tsx index 9046645..addbc25 100644 --- a/src/sw/sw-header.stories.tsx +++ b/src/sw/sw-header.stories.tsx @@ -450,7 +450,7 @@ const LOGO_CASES: { title: string; props: Partial }[] = [ ] export const LogoSlot: Story = { - name: "Logo", + name: "로고", parameters: { controls: { disable: true } }, render: () => ( @@ -780,17 +780,21 @@ function StyleHeader({ onLog, showState, ...props }: StyleHostProps) { const MORE_WIDTHS = [1920, 1440, 1280, 950, 860, 760] export const ResponsiveMore: Story = { - name: "Responsive More", + name: "화면 너비", parameters: { controls: { disable: true } }, render: () => ( -
+
{MORE_WIDTHS.map(width => ( // 2026-10-23: the 1920 row stays inside the Story column (as SW Viewer › Responsive) and is hidden on narrow pages.
- + {/* Same structure as the Logo page (no black frame). This page only shows widths, so the five field dropdowns are + held closed with the public controlled props; the open callbacks and header data are unchanged. */} +
+ +
))} diff --git a/src/sw/sw-process-header.stories.tsx b/src/sw/sw-process-header.stories.tsx index 5aee9af..e49f993 100644 --- a/src/sw/sw-process-header.stories.tsx +++ b/src/sw/sw-process-header.stories.tsx @@ -141,7 +141,10 @@ const FIGMA_FRAMES: { node: string; step: string; documentTitle?: string }[] = [ { node: "873:17421", step: "body-plan" }, ] -// One page (2026-11-03): the Default header, then the three Multi Step frames; each header keeps its own state. +// The representative page keeps only the middle frame (project open); the three frames stay in the MultiStep verification story. +const OPEN_PROJECT_FRAME = FIGMA_FRAMES[1] + +// One page: the Default header, then the project-open Multi Step frame; each header keeps its own state. export const ProcessHeader: Story = { name: "Step Header", render: () => ( @@ -151,11 +154,7 @@ export const ProcessHeader: Story = { -
- {FIGMA_FRAMES.map(frame => ( -
- ))} -
+
), @@ -164,7 +163,7 @@ export const ProcessHeader: Story = { const WIDTHS = [1920, 1366, 1100] export const Responsive: Story = { - name: "Responsive More", + name: "화면 너비", render: () => ( diff --git a/src/sw/sw-property-panel.stories.tsx b/src/sw/sw-property-panel.stories.tsx index 36970dc..cb6f4bb 100644 --- a/src/sw/sw-property-panel.stories.tsx +++ b/src/sw/sw-property-panel.stories.tsx @@ -12,6 +12,6 @@ const meta = { export default meta export const PropertyPanelCompare: StoryObj = { - name: "Property Panel", // 2026-10-22 (user request): was "Property Panel · 4개 비교"; ID unchanged + name: "속성창", // 2026-10-22 (user request): was "Property Panel · 4개 비교"; ID unchanged render: () => , } diff --git a/src/sw/sw-viewer-stories.css b/src/sw/sw-viewer-stories.css index 8a04922..5909fbe 100644 --- a/src/sw/sw-viewer-stories.css +++ b/src/sw/sw-viewer-stories.css @@ -46,5 +46,3 @@ .sw-viewer-story-steps { margin: 0; padding-left: 20px; font-size: 14px; } .sw-viewer-story-context { display: flex; align-items: center; justify-content: center; height: 160px; border: 1px dashed #9a9284; border-radius: 4px; background: #f5f0e5; color: #3e3523; font-size: 13px; } .sw-viewer-story-mode { display: flex; gap: 16px; margin-bottom: 8px; font-size: 13px; } -/* Room below a single header row so its logo menu / document list are not cut by the scroller. */ -.sw-viewer-story-menu-row { padding-bottom: 120px; } diff --git a/src/sw/sw-viewer.stories.tsx b/src/sw/sw-viewer.stories.tsx index c393119..85af3b2 100644 --- a/src/sw/sw-viewer.stories.tsx +++ b/src/sw/sw-viewer.stories.tsx @@ -1,7 +1,7 @@ import { useRef, useState, type ReactNode } from "react" import type { Meta, StoryObj } from "@storybook/react-vite" import { - SWHeader, SWHeaderWindowControls, SWViewerButton, SWViewerHeader, SWViewerHint, SWViewerMenu, SWViewerPanel, SWViewerSection, + SWHeader, SWViewerButton, SWViewerHeader, SWViewerHint, SWViewerMenu, SWViewerPanel, SWViewerSection, type SWViewerHeaderGroup, type SWViewerMenuEntry, } from "@hm-design/sw" import "@hm-design/sw/styles.css" @@ -59,21 +59,12 @@ function AboutPanel({ demo }: { demo: ViewerDemo }) { } // 2026-10-22 (user request): the Viewer Header screens have no 1440px maximum; they fill the Story column. -function ViewerScreen({ width = null as number | null, initialDocument = SAMPLES[1].name as string | null, open = [] as ("layers" | "options" | "properties")[], windowControls = false }) { +function ViewerScreen({ width = null as number | null, initialDocument = SAMPLES[1].name as string | null, open = [] as ("layers" | "options" | "properties")[] }) { const demo = useViewerDemo({ initialDocument, initialPanels: open }) - // 2026-10-21 new viewer version: SWHeader's own minimize / close (SWHeaderWindowControls, same icons, size, hover) - // at the right end after the existing trailing items (the `trailing` slot, no new API). The program owns the real - // window actions (onMinimize / onClose, as in SWHeader); the Story only logs them. - const trailing = windowControls ? ( - <> - {demo.trailing} - demo.record("minimize")} onClose={() => demo.record("close")} /> - - ) : demo.trailing return ( <> - }> + }> @@ -87,15 +78,12 @@ export const ViewerHeader: Story = { name: "Viewer Header", render: () => ( - {/* 2026-10-22 (user request): page title and the two sections only. The minimize / close version keeps - SWHeaderWindowControls at the right end of `trailing`; the program owns the real window actions. */} + {/* The minimize / close example was removed from this Story; the component keeps supporting it + (SWHeaderWindowControls at the right end of `trailing`, VIEWER.md §2.1). */} - -
-
), } @@ -280,7 +268,7 @@ export const SettingsPanel: Story = { export const ContentVariants: Story = { // 2026-10-21: the one settings-popup Story (former 설정창 and 같은 프레임, 다른 내부 콘텐츠 pages); ID kept. // 2026-10-22 (user request): the 축척 지정 demo popup was removed. - name: "Settings Popup", + name: "설정창", render: () => { const demo = useViewerDemo({ initialDocument: SAMPLES[1].name, initialPanels: ["layers", "properties", "options"] }) return ( @@ -327,7 +315,7 @@ export const VariableSize: Story = { } export const Logo: Story = { - name: "Logo", + name: "로고", render: () => { const demo = useViewerDemo({ initialDocument: SAMPLES[1].name }) const rows: { title: string; props: { logoSrc?: string; logo?: ReactNode; logoAlt?: string } }[] = [ @@ -355,7 +343,7 @@ export const Logo: Story = { } export const Responsive: Story = { - name: "Responsive More", + name: "화면 너비", render: () => { const demo = useViewerDemo({ initialDocument: SAMPLES[1].name }) return ( @@ -369,7 +357,8 @@ export const Responsive: Story = { // as the SW Header / Footer 1920 rows (sw-story-responsive-hidden, sw-stories.css), e.g. a 1920px screen.
{/* The row width is a maximum (2026-10-22): on a narrower screen the header shrinks with it instead of scrolling. */} -
+ {/* Same structure as the Logo page (no scroller / bottom padding), so the spacing matches it. */} +
))}