@hjmds/design-contracts 1.27.2 → 1.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/dist/activity-chip.d.ts +1 -1
  2. package/dist/activity-chip.js +1 -1
  3. package/dist/activity-chip.js.map +1 -1
  4. package/dist/auth-screen.d.ts +71 -5
  5. package/dist/auth-screen.d.ts.map +1 -1
  6. package/dist/auth-screen.js +60 -2
  7. package/dist/auth-screen.js.map +1 -1
  8. package/dist/base-recipes.d.ts +1 -1
  9. package/dist/base-recipes.js +1 -1
  10. package/dist/base-recipes.js.map +1 -1
  11. package/dist/behaviors.d.ts +1 -1
  12. package/dist/breadcrumb.d.ts +1 -1
  13. package/dist/breadcrumb.js +1 -1
  14. package/dist/breadcrumb.js.map +1 -1
  15. package/dist/calendar.d.ts +1 -1
  16. package/dist/calendar.js +2 -2
  17. package/dist/calendar.js.map +1 -1
  18. package/dist/catalog.d.ts +131 -87
  19. package/dist/catalog.d.ts.map +1 -1
  20. package/dist/component-contracts.d.ts +1 -1
  21. package/dist/component-contracts.js +1 -1
  22. package/dist/component-contracts.js.map +1 -1
  23. package/dist/component-recipes.d.ts +85 -57
  24. package/dist/component-recipes.d.ts.map +1 -1
  25. package/dist/component-recipes.js +95 -60
  26. package/dist/component-recipes.js.map +1 -1
  27. package/dist/conversation-row.d.ts +2 -2
  28. package/dist/conversation-row.d.ts.map +1 -1
  29. package/dist/conversation-row.js +6 -4
  30. package/dist/conversation-row.js.map +1 -1
  31. package/dist/counter-badge-recipe.d.ts +1 -1
  32. package/dist/counter-badge-recipe.js +1 -1
  33. package/dist/counter-badge-recipe.js.map +1 -1
  34. package/dist/data-table.d.ts +4 -4
  35. package/dist/data-table.js +4 -4
  36. package/dist/data-table.js.map +1 -1
  37. package/dist/date-picker.d.ts +1 -1
  38. package/dist/design-profile.d.ts.map +1 -1
  39. package/dist/design-profile.js +19 -16
  40. package/dist/design-profile.js.map +1 -1
  41. package/dist/file-picker.d.ts +1 -1
  42. package/dist/file-picker.js +1 -1
  43. package/dist/file-picker.js.map +1 -1
  44. package/dist/foundations.d.ts +18 -14
  45. package/dist/foundations.d.ts.map +1 -1
  46. package/dist/foundations.js +18 -13
  47. package/dist/foundations.js.map +1 -1
  48. package/dist/heading.d.ts +13 -13
  49. package/dist/heading.js.map +1 -1
  50. package/dist/number-field.d.ts +1 -1
  51. package/dist/otp-field.d.ts +1 -1
  52. package/dist/password-field.d.ts +1 -1
  53. package/dist/result.d.ts +1 -1
  54. package/dist/result.js +2 -2
  55. package/dist/result.js.map +1 -1
  56. package/dist/semantic-colors.d.ts +10 -0
  57. package/dist/semantic-colors.d.ts.map +1 -1
  58. package/dist/semantic-colors.js +6 -0
  59. package/dist/semantic-colors.js.map +1 -1
  60. package/dist/sheet.d.ts +7 -4
  61. package/dist/sheet.d.ts.map +1 -1
  62. package/dist/sheet.js +8 -5
  63. package/dist/sheet.js.map +1 -1
  64. package/dist/side-panel.d.ts +1 -1
  65. package/dist/side-panel.js +2 -2
  66. package/dist/side-panel.js.map +1 -1
  67. package/dist/steps.d.ts +1 -1
  68. package/dist/steps.js +1 -1
  69. package/dist/steps.js.map +1 -1
  70. package/dist/tag.d.ts +1 -1
  71. package/dist/tag.js +1 -1
  72. package/dist/tag.js.map +1 -1
  73. package/dist/timeline.d.ts +1 -1
  74. package/dist/timeline.js +1 -1
  75. package/dist/timeline.js.map +1 -1
  76. package/dist/top.d.ts +4 -4
  77. package/dist/top.d.ts.map +1 -1
  78. package/dist/top.js +3 -1
  79. package/dist/top.js.map +1 -1
  80. package/dist/version.d.ts +1 -1
  81. package/dist/version.js +1 -1
  82. package/dist/version.js.map +1 -1
  83. package/docs/activity-chip.md +5 -1
  84. package/docs/auth-screen.md +2 -0
  85. package/docs/design-profile.md +14 -10
  86. package/docs/generated/component-maturity.md +1 -1
  87. package/docs/generated/renderer-evidence.json +9 -5
  88. package/docs/generated/renderer-evidence.md +1 -1
  89. package/docs/generated/showcase-manifest.json +1 -1
  90. package/docs/heading.md +14 -9
  91. package/docs/sheet.md +2 -0
  92. package/docs/top.md +4 -3
  93. package/docs/usage/README.md +1 -1
  94. package/docs/usage/components/auth-screen-layout.md +26 -9
  95. package/docs/usage/components/bottom-cta.md +6 -2
  96. package/docs/usage/components/breadcrumb.md +5 -1
  97. package/docs/usage/components/checkbox-group.md +5 -1
  98. package/docs/usage/components/collapsible.md +1 -0
  99. package/docs/usage/components/effect-surface.md +2 -2
  100. package/docs/usage/components/heading.md +14 -12
  101. package/docs/usage/components/list-row.md +7 -3
  102. package/docs/usage/components/list.md +5 -4
  103. package/docs/usage/components/notification-item.md +5 -1
  104. package/docs/usage/components/photo-source-sheet.md +1 -1
  105. package/docs/usage/components/screen-layout.md +7 -3
  106. package/docs/usage/components/search-screen.md +1 -1
  107. package/docs/usage/components/section.md +5 -1
  108. package/docs/usage/components/segmented-control.md +1 -1
  109. package/docs/usage/components/sheet.md +17 -13
  110. package/docs/usage/components/skeleton.md +41 -15
  111. package/docs/usage/components/statistic.md +5 -1
  112. package/docs/usage/components/switch.md +3 -2
  113. package/docs/usage/components/tag.md +5 -1
  114. package/docs/usage/components/text.md +6 -4
  115. package/docs/usage/components/top.md +1 -1
  116. package/docs/usage/compositions/adaptive-content.md +5 -1
  117. package/docs/usage/compositions/compound-controls.md +2 -1
  118. package/docs/usage/compositions/design-profile-comparison.md +1 -1
  119. package/docs/usage/compositions/family-drawer.md +5 -3
  120. package/docs/usage/compositions/input-sheet.md +1 -1
  121. package/docs/usage/compositions/interaction-flow-apply.md +3 -3
  122. package/docs/usage/compositions/photo-source.md +3 -3
  123. package/docs/usage/compositions/selection-motion.md +5 -1
  124. package/docs/usage/compositions/visual-foundations.md +5 -4
  125. package/docs/usage/screens/common-login.md +9 -7
  126. package/docs/usage/screens/landing.md +15 -14
  127. package/docs/usage/screens/notification-settings.md +4 -2
  128. package/docs/usage/tokens/typography.md +21 -13
  129. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"design-profile.js","sourceRoot":"","sources":["../src/design-profile.ts"],"names":[],"mappings":"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","sourcesContent":["import { THEMES, type ResolvedTheme, type ThemeColors } from \"./colors.js\";\nimport { radius, fontFamily, typography, heading, shadow, fontWeight, type FontWeightValue, type FontFamilyRoles } from \"./foundations.js\";\nimport { checkPaletteContrast, resolveSurfaceFillOpacity } from \"./palette-contrast.js\";\nimport { resolveEffectSurface, type EffectSurfaceDescriptor } from \"./effect-surface.js\";\nimport type { ContentTransitionPreset } from \"./content-transition.js\";\n\n/** A product chooses one portable profile; the renderer owns each host translation.\n * Keep business state/callbacks outside it so a visual change cannot replace a draft.\n * See docs/design-profile.md for the staged renderer integration and coverage limits. */\nexport type HjmDesignPreset = \"neutral\" | \"retro\" | \"paper\" | \"forest\" | \"minimal\" | \"editorial\" | \"brutalist\" | \"glass\" | \"aurora\" | \"terminal\" | \"clay\";\ntype RadiusTokens = Readonly<Record<keyof typeof radius, number>>;\ntype TypeToken = Readonly<{ fontSize: number; lineHeight: number; fontWeight: FontWeightValue }>;\ntype TypographyTokens = Readonly<Record<keyof typeof typography, TypeToken>>;\ntype HeadingTokens = Readonly<Record<keyof typeof heading, TypeToken>>;\ntype ShadowToken = Readonly<{ color: string; opacity: number; radius: number; offsetY: number }>;\ntype ShadowTokens = Readonly<Record<keyof typeof shadow, ShadowToken>>;\ntype SurfaceMaterial = Readonly<{\n /** Host-relative strength; Web maps 1 to 32px, Native host calibrates its own blur. */\n blurStrength: number;\n /** Requested semantic fill; the renderer raises opacity when background contrast requires it. */\n fillOpacity: number;\n insetShadows: readonly Readonly<ShadowToken & { offsetX: number }>[];\n}>;\ntype Palette = Readonly<Record<ResolvedTheme, Readonly<ThemeColors>>>;\nexport type HjmDesignProfile = Readonly<{\n id: string;\n palette: Palette;\n tokens: Readonly<{\n radius: RadiusTokens;\n fontFamily: FontFamilyRoles;\n typography: TypographyTokens;\n heading: HeadingTokens;\n shadow: ShadowTokens;\n }>;\n material: Readonly<Record<\"canvas\" | \"card\", EffectSurfaceDescriptor | null> & { surface?: SurfaceMaterial | null }>;\n interactions: Readonly<{\n contentTransition: ContentTransitionPreset;\n selectionMotion: \"none\" | \"slide\";\n }>;\n compositions: Readonly<{\n collection: \"rows\" | \"cards\" | \"grid\";\n toolbar: \"inline\" | \"collapsible\";\n }>;\n screens: Readonly<{ overview: \"dashboard\" | \"editorial\" | \"landscape\" }>;\n}>;\n\n/** A custom app profile is data, not a mutable global registry or renderer import.\n * Partial records inherit the selected preset independently in light and dark. */\nexport type HjmDesignProfileInput = Readonly<{\n extends?: HjmDesignPreset;\n id?: string;\n palette?: Readonly<Partial<Record<ResolvedTheme, Readonly<Partial<ThemeColors>>>>>;\n tokens?: Readonly<{\n radius?: Readonly<Partial<RadiusTokens>>;\n fontFamily?: Readonly<Partial<HjmDesignProfile[\"tokens\"][\"fontFamily\"]>>;\n typography?: Readonly<Partial<Record<keyof typeof typography, Partial<TypeToken>>>>;\n heading?: Readonly<Partial<Record<keyof typeof heading, Partial<TypeToken>>>>;\n shadow?: Readonly<Partial<Record<keyof typeof shadow, Partial<ShadowToken>>>>;\n }>;\n material?: Readonly<Partial<Pick<HjmDesignProfile[\"material\"], \"canvas\" | \"card\">> & { surface?: Partial<SurfaceMaterial> | null }>;\n interactions?: Readonly<Partial<HjmDesignProfile[\"interactions\"]>>;\n compositions?: Readonly<Partial<HjmDesignProfile[\"compositions\"]>>;\n screens?: Readonly<Partial<HjmDesignProfile[\"screens\"]>>;\n}>;\n\nconst neutral: HjmDesignProfile = {\n id: \"neutral\", palette: THEMES,\n tokens: { radius, fontFamily, typography, heading, shadow },\n material: { canvas: null, card: null, surface: null },\n interactions: { contentTransition: \"fade\", selectionMotion: \"none\" },\n compositions: { collection: \"rows\", toolbar: \"inline\" },\n screens: { overview: \"dashboard\" },\n};\n\n/** System serif stack for editorial's display/reading roles; nothing is downloaded. `ui-serif` comes first because\n * Safari maps it to New York and Native translates it to the host serif (Chrome skips it). AppleMyungjo/Batang/\n * Noto Serif KR give Hangul a serif face where installed; otherwise Hangul falls back to the host font. */\nconst serifStack = [\"ui-serif\", \"Iowan Old Style\", \"Georgia\", \"AppleMyungjo\", \"Batang\", \"Noto Serif KR\", \"serif\"] as const;\n\n/** Profiles deliberately differ in interaction and arrangement, not just hue.\n * No font asset is bundled or implied: custom font loading remains product-owned. */\nconst presetInputs: Readonly<Record<Exclude<HjmDesignPreset, \"neutral\">, HjmDesignProfileInput>> = {\n retro: {\n id: \"retro\",\n palette: {\n light: { bg: \"#fff8e8\", surface: \"#fffdf5\", surfaceAlt: \"#eee0c5\", surfaceAccent: \"#f6d4a0\", border: \"#d1bd96\", borderControl: \"#75604b\", primary: \"#973c20\", contentBrand: \"#80321a\", text: \"#2c2119\", textBody: \"#413123\", textMuted: \"#594637\", textSub: \"#695646\", textWeak: \"#857461\" },\n dark: { bg: \"#211a16\", surface: \"#2d241d\", surfaceAlt: \"#3b3025\", surfaceAccent: \"#5e3827\", border: \"#807260\", borderControl: \"#b7a387\", primary: \"#af5437\", contentBrand: \"#ffc38b\", text: \"#fff5e1\", textBody: \"#ead8bb\", textMuted: \"#d5c1a3\", textSub: \"#bea88b\", textWeak: \"#a18e74\" },\n },\n tokens: { radius: { sm: 2, md: 4, lg: 6, xl: 8 } },\n material: { canvas: { layers: [\"noise\"], intensity: 0.08, active: false, seed: \"retro\" } },\n interactions: { contentTransition: \"slide\", selectionMotion: \"none\" },\n compositions: { collection: \"grid\", toolbar: \"inline\" },\n screens: { overview: \"dashboard\" },\n },\n paper: {\n id: \"paper\",\n palette: {\n light: { bg: \"#f9f5ed\", surface: \"#fffdf8\", surfaceAlt: \"#eee8dc\", surfaceAccent: \"#e7dac8\", border: \"#d6cabb\", borderControl: \"#776b5c\", primary: \"#665039\", contentBrand: \"#58432e\", text: \"#28231c\", textBody: \"#40382d\", textMuted: \"#5b5145\", textSub: \"#6e6253\", textWeak: \"#887b69\" },\n dark: { bg: \"#1b1916\", surface: \"#27231e\", surfaceAlt: \"#332d25\", surfaceAccent: \"#4f4132\", border: \"#847561\", borderControl: \"#b8a68c\", primary: \"#83684c\", contentBrand: \"#e3bf91\", text: \"#f8f0e1\", textBody: \"#e5d9c4\", textMuted: \"#d0c0a6\", textSub: \"#b8a78d\", textWeak: \"#a18e72\" },\n },\n tokens: { radius: { sm: 4, md: 6, lg: 8, xl: 12 } },\n // A-02's ruled-paper finding is distinct from grain. A static low-opacity\n // tile adds that voice without rotating controls or aligning content baselines.\n material: { canvas: { layers: [\"grain\", \"ruled\"], ruledSpacing: 24, intensity: 0.06, active: false, seed: \"paper\" } },\n interactions: { contentTransition: \"fade\", selectionMotion: \"none\" },\n compositions: { collection: \"rows\", toolbar: \"collapsible\" },\n screens: { overview: \"editorial\" },\n },\n forest: {\n id: \"forest\",\n palette: {\n light: { bg: \"#f2f7ef\", surface: \"#fbfdf8\", surfaceAlt: \"#e0ebda\", surfaceAccent: \"#d5e8c9\", border: \"#bdcdb5\", borderControl: \"#65765c\", primary: \"#285c35\", contentBrand: \"#23512d\", text: \"#1d2b1b\", textBody: \"#30422c\", textMuted: \"#485c41\", textSub: \"#5c6e54\", textWeak: \"#7b8b71\" },\n dark: { bg: \"#111c15\", surface: \"#1b2a1e\", surfaceAlt: \"#293a2a\", surfaceAccent: \"#304d32\", border: \"#6b816a\", borderControl: \"#95ac8d\", primary: \"#477c54\", contentBrand: \"#a8d994\", text: \"#eff7e9\", textBody: \"#d8e9cf\", textMuted: \"#bdd4b3\", textSub: \"#a1bd94\", textWeak: \"#87a17b\" },\n },\n tokens: { radius: { sm: 10, md: 16, lg: 24, xl: 32 } },\n material: { canvas: { layers: [\"mesh\", \"glow\"], intensity: 0.1, active: false, seed: \"forest\" } },\n interactions: { contentTransition: \"rise\", selectionMotion: \"slide\" },\n compositions: { collection: \"cards\", toolbar: \"collapsible\" },\n screens: { overview: \"landscape\" },\n },\n // minimal, editorial and terminal looked alike in light mode (near-white, only terminal's font differed) at the\n // 2026-10-17 user review. Each now carries its identity through palette, type, elevation and arrangement together.\n // minimal: achromatic hairlines on white, no shadow anywhere (overlays rely on their border and scrim), quiet\n // medium-weight headings, airy body leading and framed cards for the generous card padding.\n minimal: {\n id: \"minimal\",\n palette: {\n light: { bg: \"#ffffff\", surface: \"#fafafa\", surfaceAlt: \"#f2f2f2\", surfaceAccent: \"#ededed\", border: \"#e6e6e6\", borderControl: \"#767676\", primary: \"#3d3d3d\", contentBrand: \"#2e2e2e\", text: \"#111111\", textBody: \"#2b2b2b\", textMuted: \"#4a4a4a\", textSub: \"#5e5e5e\", textWeak: \"#8a8a8a\" },\n dark: { bg: \"#101010\", surface: \"#151515\", surfaceAlt: \"#1c1c1c\", surfaceAccent: \"#2a2a2a\", border: \"#333333\", borderControl: \"#8f8f8f\", primary: \"#6e6e6e\", contentBrand: \"#e2e2e2\", text: \"#f2f2f2\", textBody: \"#dedede\", textMuted: \"#c6c6c6\", textSub: \"#a3a3a3\", textWeak: \"#8a8a8a\" },\n },\n tokens: { radius: { sm: 4, md: 8, lg: 12, xl: 16 }, shadow: { raised: { opacity: 0 }, floating: { opacity: 0 } },\n typography: { heading: { fontWeight: fontWeight.medium }, body: { lineHeight: 26 } },\n heading: { level1: { fontWeight: fontWeight.medium }, level2: { fontWeight: fontWeight.medium } } },\n interactions: { contentTransition: \"fade\", selectionMotion: \"none\" },\n compositions: { collection: \"cards\", toolbar: \"inline\" }, screens: { overview: \"dashboard\" },\n },\n // editorial: serif display and reading roles over a warm ink-on-paper palette with a deep wine accent, the largest\n // display scale of the presets, flat print corners, and rows, which the shared layout divides with rule lines.\n editorial: {\n id: \"editorial\",\n palette: {\n light: { bg: \"#fdfbf7\", surface: \"#f7f3ec\", surfaceAlt: \"#efe9df\", surfaceAccent: \"#f1e4ea\", border: \"#cfc5b8\", borderControl: \"#6f655a\", primary: \"#7a1f3d\", contentBrand: \"#6b1a35\", text: \"#1b1714\", textBody: \"#2e2823\", textMuted: \"#4a423b\", textSub: \"#5f564d\", textWeak: \"#8a7f73\" },\n dark: { bg: \"#14110e\", surface: \"#1c1814\", surfaceAlt: \"#26211b\", surfaceAccent: \"#3f2430\", border: \"#5e554b\", borderControl: \"#a3988b\", primary: \"#ad4566\", contentBrand: \"#f2b8c9\", text: \"#f6f0e7\", textBody: \"#e6ddd1\", textMuted: \"#cfc4b6\", textSub: \"#b0a596\", textWeak: \"#958a7c\" },\n },\n tokens: { radius: { sm: 0, md: 2, lg: 2, xl: 4 }, fontFamily: { display: serifStack, reading: serifStack }, shadow: { raised: { opacity: 0 } },\n typography: { heading: { fontSize: 30, lineHeight: 40, fontWeight: fontWeight.medium }, body: { lineHeight: 26 } },\n heading: { level1: { fontSize: 56, lineHeight: 66, fontWeight: fontWeight.medium }, level2: { fontSize: 42, lineHeight: 52, fontWeight: fontWeight.medium } } },\n interactions: { contentTransition: \"rise\", selectionMotion: \"none\" },\n compositions: { collection: \"rows\", toolbar: \"collapsible\" }, screens: { overview: \"editorial\" },\n },\n brutalist: {\n id: \"brutalist\",\n // level1/2 stay heavy (800) on purpose: the foundation display headings became bold (700) on 2026-10-17,\n // but the user kept brutalist at 800 after comparing it in Storybook, because thick borders and hard\n // shadows need the heaviest headings to hold their weight. Do not align this with the 700 default.\n // docs/design-profile.md documents the same exception.\n palette: { light: { primary: \"#171717\", contentBrand: \"#171717\", surfaceAccent: \"#e8ed91\", border: \"#171717\" }, dark: { primary: \"#727272\", contentBrand: \"#f0f3a3\", surfaceAccent: \"#393a1c\", border: \"#cccccc\" } },\n tokens: { radius: { sm: 0, md: 0, lg: 0, xl: 0 }, shadow: { raised: { radius: 0, offsetY: 4, opacity: 0.25 }, floating: { radius: 0, offsetY: 6, opacity: 0.3 } }, typography: { heading: { fontSize: 30, lineHeight: 38, fontWeight: fontWeight.heavy } }, heading: { level1: { fontSize: 48, lineHeight: 56, fontWeight: fontWeight.heavy }, level2: { fontSize: 38, lineHeight: 46, fontWeight: fontWeight.heavy } } },\n\n interactions: { contentTransition: \"slide\", selectionMotion: \"none\" },\n compositions: { collection: \"cards\", toolbar: \"inline\" }, screens: { overview: \"editorial\" },\n },\n glass: {\n id: \"glass\",\n palette: { // Stronger ink tiers keep glass visibly translucent under the existing\n // contrast rules; the neutral weak/subtle tiers required an opaque fill.\n light: { primary: \"#435e91\", contentBrand: \"#354c78\", surfaceAccent: \"#e4ecf7\", textSub: \"#5b6879\", textWeak: \"#748292\" }, dark: { primary: \"#5673a3\", contentBrand: \"#c1d8ff\", surfaceAccent: \"#233654\" } },\n tokens: { radius: { sm: 12, md: 18, lg: 26, xl: 36 }, shadow: { floating: { radius: 24, opacity: 0.12, offsetY: 8 } } },\n material: { canvas: { layers: [\"mesh\"], intensity: 0.16, active: false, seed: \"glass\" }, card: { layers: [\"glow\"], intensity: 0.06, active: false, seed: \"glass-card\" }, surface: { blurStrength: 0.75, fillOpacity: 0.88, insetShadows: [] } },\n interactions: { contentTransition: \"fade\", selectionMotion: \"slide\" },\n compositions: { collection: \"cards\", toolbar: \"inline\" }, screens: { overview: \"landscape\" },\n },\n aurora: {\n id: \"aurora\",\n palette: { light: { primary: \"#62409b\", contentBrand: \"#58388b\", surfaceAccent: \"#ece2fa\" }, dark: { primary: \"#8161b1\", contentBrand: \"#dbc3ff\", surfaceAccent: \"#392651\" } },\n tokens: { radius: { sm: 8, md: 14, lg: 22, xl: 30 } },\n material: { canvas: { layers: [\"mesh\", \"glow\"], intensity: 0.2, active: true, period: 30, seed: \"aurora\" } },\n interactions: { contentTransition: \"scale\", selectionMotion: \"slide\" },\n compositions: { collection: \"grid\", toolbar: \"collapsible\" }, screens: { overview: \"landscape\" },\n },\n // terminal: monospace for every role (display/reading follow ui), square corners, no shadow, ruled rows, green\n // phosphor primary with amber brand text. Dark is a black console. Light cannot be a black console: the accent\n // foregrounds (ACCENTS.light, used by notices and status text) are fixed dark inks that the profile palette does not\n // replace, so a dark light-mode canvas would pass the palette check yet leave them unreadable. Light therefore uses\n // the darkest green-grey canvas on which those inks still reach 4.5:1 (about 4.6 on bg, 5.0 on surface).\n terminal: {\n id: \"terminal\",\n palette: {\n light: { bg: \"#c8d4c4\", surface: \"#d1dbcd\", surfaceAlt: \"#ccd7c8\", surfaceAccent: \"#cadbc5\", border: \"#6f8069\", borderControl: \"#33463a\", primary: \"#164f25\", contentBrand: \"#5c3200\", text: \"#04160a\", textBody: \"#0b2412\", textMuted: \"#15301c\", textSub: \"#1f3a26\", textWeak: \"#4a5d4d\", danger: \"#7f0e0e\" },\n dark: { bg: \"#050a06\", surface: \"#0b130d\", surfaceAlt: \"#122016\", surfaceAccent: \"#173a20\", border: \"#2f6b3e\", borderControl: \"#4fae66\", primary: \"#1f7a3a\", contentBrand: \"#ffb84d\", text: \"#9cf5ae\", textBody: \"#86e39a\", textMuted: \"#74cf89\", textSub: \"#62b877\", textWeak: \"#4d9a61\", danger: \"#ff8a7a\" },\n },\n tokens: { radius: { sm: 0, md: 0, lg: 0, xl: 0 }, fontFamily: { ui: fontFamily.code }, shadow: { raised: { opacity: 0 }, floating: { radius: 0, offsetY: 0, opacity: 0 } } },\n interactions: { contentTransition: \"fade\", selectionMotion: \"none\" },\n compositions: { collection: \"rows\", toolbar: \"collapsible\" }, screens: { overview: \"dashboard\" },\n },\n clay: {\n id: \"clay\",\n palette: { light: { primary: \"#904663\", contentBrand: \"#803b57\", surfaceAccent: \"#f7e1eb\" }, dark: { primary: \"#a25e7d\", contentBrand: \"#f1bed4\", surfaceAccent: \"#482b3a\" } },\n tokens: { radius: { sm: 14, md: 22, lg: 32, xl: 44 }, shadow: { raised: { radius: 16, offsetY: 6, opacity: 0.12 }, floating: { radius: 28, offsetY: 12, opacity: 0.18 } } },\n material: { card: { layers: [\"grain\"], intensity: 0.04, active: false, seed: \"clay\" }, surface: { blurStrength: 0, fillOpacity: 1, insetShadows: [\n { color: \"#ffffff\", opacity: 0.22, radius: 10, offsetX: 3, offsetY: 4 },\n { color: \"#000000\", opacity: 0.12, radius: 12, offsetX: -3, offsetY: -4 },\n ] } },\n interactions: { contentTransition: \"scale\", selectionMotion: \"slide\" },\n compositions: { collection: \"cards\", toolbar: \"collapsible\" }, screens: { overview: \"dashboard\" },\n },\n};\n\nfunction freeze<T>(value: T): T {\n if (value !== null && typeof value === \"object\") {\n for (const item of Object.values(value)) freeze(item);\n Object.freeze(value);\n }\n return value;\n}\n\nfunction choose<T extends string>(value: T, allowed: readonly T[], field: string): void {\n if (!allowed.includes(value)) throw new TypeError(`Unsupported design profile ${field}`);\n}\n\nfunction merge(base: HjmDesignProfile, input: HjmDesignProfileInput): HjmDesignProfile {\n for (const role of Object.keys(input.material ?? {})) {\n if (![\"canvas\", \"card\", \"surface\"].includes(role)) throw new TypeError(\"Unsupported design profile material role\");\n }\n const requestedSurface = input.material?.surface;\n if (requestedSurface !== undefined && requestedSurface !== null && (typeof requestedSurface !== \"object\" || Array.isArray(requestedSurface))) throw new TypeError(\"Invalid design profile surface material\");\n for (const key of Object.keys(requestedSurface ?? {})) {\n if (![\"blurStrength\", \"fillOpacity\", \"insetShadows\"].includes(key)) throw new TypeError(\"Unsupported design profile surface material field\");\n }\n const palette = {\n light: { ...base.palette.light, ...input.palette?.light },\n dark: { ...base.palette.dark, ...input.palette?.dark },\n };\n // fromEntries loses fixed keys; iteration over the complete base preserves every role.\n const type = Object.fromEntries(Object.entries(base.tokens.typography).map(([key, value]) => [key, { ...value, ...input.tokens?.typography?.[key as keyof TypographyTokens] }])) as unknown as TypographyTokens;\n // Display levels need their own roles: deriving them from body text would erase\n // the hierarchy. Keep the original level3–5 typography aliases, with explicit\n // heading overrides last, and preserve inherited heading values on empty input.\n const aliases = { level3: \"heading\", level4: \"titleLarge\", level5: \"title\" } as const;\n for (const key of Object.keys(input.tokens?.heading ?? {})) {\n if (!Object.prototype.hasOwnProperty.call(heading, key)) throw new TypeError(\"Unsupported design profile heading level\");\n }\n const headings = Object.fromEntries(Object.entries(base.tokens.heading).map(([key, value]) => {\n const level = key as keyof HeadingTokens;\n const alias = level in aliases ? aliases[level as keyof typeof aliases] : undefined;\n return [level, { ...value, ...(alias ? input.tokens?.typography?.[alias] : undefined), ...input.tokens?.heading?.[level] }];\n })) as unknown as HeadingTokens;\n // The complete base shadow record has the same key-preservation guarantee.\n const elevation = Object.fromEntries(Object.entries(base.tokens.shadow).map(([key, value]) => [key, { ...value, ...input.tokens?.shadow?.[key as keyof ShadowTokens] }])) as unknown as ShadowTokens;\n const requestedFonts = input.tokens?.fontFamily;\n for (const role of Object.keys(requestedFonts ?? {})) {\n if (![\"ui\", \"code\", \"display\", \"reading\"].includes(role)) throw new TypeError(\"Unsupported design profile font role\");\n const families = requestedFonts?.[role as keyof FontFamilyRoles];\n if (families !== undefined && (!Array.isArray(families) || !families.length || families.some(family => typeof family !== \"string\" || !family.trim()))) throw new TypeError(\"Design profile font families must not be empty\");\n }\n const display = requestedFonts?.display ?? base.tokens.fontFamily.display;\n const reading = requestedFonts?.reading ?? base.tokens.fontFamily.reading;\n const profile: HjmDesignProfile = {\n id: input.id ?? base.id, palette,\n tokens: {\n radius: { ...base.tokens.radius, ...input.tokens?.radius },\n // Copy caller-owned arrays: freezing the resolved profile must never freeze app input.\n fontFamily: { ui: [...(input.tokens?.fontFamily?.ui ?? base.tokens.fontFamily.ui)], code: [...(input.tokens?.fontFamily?.code ?? base.tokens.fontFamily.code)],\n ...(display ? { display: [...display] } : {}), ...(reading ? { reading: [...reading] } : {}) },\n typography: type, heading: headings, shadow: elevation,\n },\n material: { ...base.material, ...input.material, surface: input.material?.surface === null ? null\n : input.material?.surface === undefined ? base.material.surface ?? null\n : { blurStrength: 0, fillOpacity: 1, insetShadows: [], ...base.material.surface, ...input.material.surface } },\n interactions: { ...base.interactions, ...input.interactions },\n compositions: { ...base.compositions, ...input.compositions },\n screens: { ...base.screens, ...input.screens },\n };\n if (!profile.id.trim()) throw new TypeError(\"Design profile id must not be empty\");\n for (const mode of [\"light\", \"dark\"] as const) {\n for (const [key, value] of Object.entries(palette[mode])) {\n if (!(key in THEMES[mode]) || !/^#[0-9a-f]{6}$/i.test(value)) throw new TypeError(`Invalid design profile palette ${mode}.${key}`);\n }\n if (checkPaletteContrast(palette[mode]).length) throw new RangeError(`Design profile ${mode} palette fails required contrast pairs`);\n }\n for (const [key, value] of Object.entries(profile.tokens.radius)) {\n if (!(key in radius) || !Number.isFinite(value) || value < 0 || value > 999) throw new RangeError(\"Invalid design profile radius\");\n }\n // Circles/pills retain their semantic geometry; product corners apply to other roles.\n if (profile.tokens.radius.full !== radius.full) throw new RangeError(\"Design profile must preserve full radius\");\n for (const value of [...Object.values(type), ...Object.values(headings)]) {\n if (!Number.isFinite(value.fontSize) || value.fontSize < 11 || value.fontSize > 96 || !Number.isFinite(value.lineHeight) || value.lineHeight < value.fontSize || value.lineHeight > 144) throw new RangeError(\"Invalid design profile typography\");\n choose(value.fontWeight, [\"400\", \"500\", \"600\", \"700\", \"800\"], \"fontWeight\");\n }\n for (const families of Object.values(profile.tokens.fontFamily)) {\n if (!Array.isArray(families) || !families.length || families.some(family => typeof family !== \"string\" || !family.trim())) throw new TypeError(\"Design profile font families must not be empty\");\n }\n for (const token of Object.values(elevation)) {\n if (!/^#[0-9a-f]{6}$/i.test(token.color) || !Number.isFinite(token.opacity) || token.opacity < 0 || token.opacity > 1 || !Number.isFinite(token.radius) || token.radius < 0 || token.radius > 96 || !Number.isFinite(token.offsetY) || Math.abs(token.offsetY) > 96) throw new RangeError(\"Invalid design profile shadow\");\n }\n const surface = profile.material.surface;\n if (surface) {\n // Keep a readable semantic fill rather than copying a low-alpha reference card.\n // Native can fail to supply blur and must always retain its opaque fallback.\n if (!Number.isFinite(surface.blurStrength) || surface.blurStrength < 0 || surface.blurStrength > 1 || !Number.isFinite(surface.fillOpacity) || surface.fillOpacity < 0.85 || surface.fillOpacity > 1) throw new RangeError(\"Invalid design profile surface material\");\n if (!Array.isArray(surface.insetShadows) || surface.insetShadows.length > 2) throw new RangeError(\"Invalid design profile inset shadows\");\n for (const token of surface.insetShadows) {\n if (!/^#[0-9a-f]{6}$/i.test(token.color) || !Number.isFinite(token.opacity) || token.opacity < 0 || token.opacity > 1 || !Number.isFinite(token.radius) || token.radius < 0 || token.radius > 96 || !Number.isFinite(token.offsetY) || Math.abs(token.offsetY) > 96 || !Number.isFinite(token.offsetX) || Math.abs(token.offsetX) > 96) throw new RangeError(\"Invalid design profile inset shadow\");\n }\n }\n const effects = Object.fromEntries(([\"canvas\", \"card\"] as const).map(role => {\n const descriptor = profile.material[role];\n if (descriptor === null) return [role, null];\n resolveEffectSurface(descriptor);\n // Deep-copy material data as well: a preset resolver must not own caller state.\n return [role, { ...descriptor, ...(descriptor.layers ? { layers: [...descriptor.layers] } : {}), ...(descriptor.colors ? { colors: descriptor.colors.map(color => ({ ...color })) } : {}) }];\n })) as Pick<HjmDesignProfile[\"material\"], \"canvas\" | \"card\">;\n const material = { ...effects, surface: surface ? { ...surface, insetShadows: surface.insetShadows.map(token => ({ ...token })) } : null };\n choose(profile.interactions.contentTransition, [\"fade\", \"rise\", \"slide\", \"scale\"], \"contentTransition\");\n choose(profile.interactions.selectionMotion, [\"none\", \"slide\"], \"selectionMotion\");\n choose(profile.compositions.collection, [\"rows\", \"cards\", \"grid\"], \"collection\");\n choose(profile.compositions.toolbar, [\"inline\", \"collapsible\"], \"toolbar\");\n choose(profile.screens.overview, [\"dashboard\", \"editorial\", \"landscape\"], \"overview\");\n return freeze({ ...profile, material });\n}\n\nexport const hjmDesignPresets: Readonly<Record<HjmDesignPreset, HjmDesignProfile>> = freeze({\n neutral: merge(neutral, {}),\n retro: merge(neutral, presetInputs.retro),\n paper: merge(neutral, presetInputs.paper),\n forest: merge(neutral, presetInputs.forest),\n minimal: merge(neutral, presetInputs.minimal),\n editorial: merge(neutral, presetInputs.editorial),\n brutalist: merge(neutral, presetInputs.brutalist),\n glass: merge(neutral, presetInputs.glass),\n aurora: merge(neutral, presetInputs.aurora),\n terminal: merge(neutral, presetInputs.terminal),\n clay: merge(neutral, presetInputs.clay),\n});\n\nexport function defineHjmDesignProfile(input: HjmDesignProfileInput = {}): HjmDesignProfile {\n const base = hjmDesignPresets[input.extends ?? \"neutral\"];\n if (!base) throw new TypeError(\"Unknown HJM design preset\");\n return merge(base, input);\n}\n\n/** Resolve the readable fill against black/white backdrop extremes using the\n * final product palette, including brandPalette overrides. Blur is decorative:\n * it cannot be used as evidence of text contrast over arbitrary app content. */\nexport function resolveDesignProfileSurfaceMaterial(profile: HjmDesignProfile | undefined, palette: Readonly<ThemeColors>): SurfaceMaterial | null {\n const material = profile?.material.surface;\n if (!material) return null;\n // Transparency requires a real backdrop effect. Plain/clay surfaces stay solid\n // on both hosts instead of becoming tint-only imitations of a glass material.\n if (!material.blurStrength) return { ...material, fillOpacity: 1 };\n return { ...material, fillOpacity: resolveSurfaceFillOpacity(material.fillOpacity, palette) };\n}\n"]}
1
+ {"version":3,"file":"design-profile.js","sourceRoot":"","sources":["../src/design-profile.ts"],"names":[],"mappings":"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","sourcesContent":["import { THEMES, type ResolvedTheme, type ThemeColors } from \"./colors.js\";\nimport { radius, fontFamily, typography, heading, shadow, fontWeight, type FontWeightValue, type FontFamilyRoles } from \"./foundations.js\";\nimport { checkPaletteContrast, resolveSurfaceFillOpacity } from \"./palette-contrast.js\";\nimport { resolveEffectSurface, type EffectSurfaceDescriptor } from \"./effect-surface.js\";\nimport type { ContentTransitionPreset } from \"./content-transition.js\";\n\n/** A product chooses one portable profile; the renderer owns each host translation.\n * Keep business state/callbacks outside it so a visual change cannot replace a draft.\n * See docs/design-profile.md for the staged renderer integration and coverage limits. */\nexport type HjmDesignPreset = \"neutral\" | \"retro\" | \"paper\" | \"forest\" | \"minimal\" | \"editorial\" | \"brutalist\" | \"glass\" | \"aurora\" | \"terminal\" | \"clay\";\ntype RadiusTokens = Readonly<Record<keyof typeof radius, number>>;\ntype TypeToken = Readonly<{ fontSize: number; lineHeight: number; fontWeight: FontWeightValue }>;\ntype TypographyTokens = Readonly<Record<keyof typeof typography, TypeToken>>;\ntype HeadingTokens = Readonly<Record<keyof typeof heading, TypeToken>>;\ntype ShadowToken = Readonly<{ color: string; opacity: number; radius: number; offsetY: number }>;\ntype ShadowTokens = Readonly<Record<keyof typeof shadow, ShadowToken>>;\ntype SurfaceMaterial = Readonly<{\n /** Host-relative strength; Web maps 1 to 32px, Native host calibrates its own blur. */\n blurStrength: number;\n /** Requested semantic fill; the renderer raises opacity when background contrast requires it. */\n fillOpacity: number;\n insetShadows: readonly Readonly<ShadowToken & { offsetX: number }>[];\n}>;\ntype Palette = Readonly<Record<ResolvedTheme, Readonly<ThemeColors>>>;\nexport type HjmDesignProfile = Readonly<{\n id: string;\n palette: Palette;\n tokens: Readonly<{\n radius: RadiusTokens;\n fontFamily: FontFamilyRoles;\n typography: TypographyTokens;\n heading: HeadingTokens;\n shadow: ShadowTokens;\n }>;\n material: Readonly<Record<\"canvas\" | \"card\", EffectSurfaceDescriptor | null> & { surface?: SurfaceMaterial | null }>;\n interactions: Readonly<{\n contentTransition: ContentTransitionPreset;\n selectionMotion: \"none\" | \"slide\";\n }>;\n compositions: Readonly<{\n collection: \"rows\" | \"cards\" | \"grid\";\n toolbar: \"inline\" | \"collapsible\";\n }>;\n screens: Readonly<{ overview: \"dashboard\" | \"editorial\" | \"landscape\" }>;\n}>;\n\n/** A custom app profile is data, not a mutable global registry or renderer import.\n * Partial records inherit the selected preset independently in light and dark. */\nexport type HjmDesignProfileInput = Readonly<{\n extends?: HjmDesignPreset;\n id?: string;\n palette?: Readonly<Partial<Record<ResolvedTheme, Readonly<Partial<ThemeColors>>>>>;\n tokens?: Readonly<{\n radius?: Readonly<Partial<RadiusTokens>>;\n fontFamily?: Readonly<Partial<HjmDesignProfile[\"tokens\"][\"fontFamily\"]>>;\n typography?: Readonly<Partial<Record<keyof typeof typography, Partial<TypeToken>>>>;\n heading?: Readonly<Partial<Record<keyof typeof heading, Partial<TypeToken>>>>;\n shadow?: Readonly<Partial<Record<keyof typeof shadow, Partial<ShadowToken>>>>;\n }>;\n material?: Readonly<Partial<Pick<HjmDesignProfile[\"material\"], \"canvas\" | \"card\">> & { surface?: Partial<SurfaceMaterial> | null }>;\n interactions?: Readonly<Partial<HjmDesignProfile[\"interactions\"]>>;\n compositions?: Readonly<Partial<HjmDesignProfile[\"compositions\"]>>;\n screens?: Readonly<Partial<HjmDesignProfile[\"screens\"]>>;\n}>;\n\nconst neutral: HjmDesignProfile = {\n id: \"neutral\", palette: THEMES,\n tokens: { radius, fontFamily, typography, heading, shadow },\n material: { canvas: null, card: null, surface: null },\n interactions: { contentTransition: \"fade\", selectionMotion: \"none\" },\n compositions: { collection: \"rows\", toolbar: \"inline\" },\n screens: { overview: \"dashboard\" },\n};\n\n/** System serif stack for editorial's display/reading roles; nothing is downloaded. `ui-serif` comes first because\n * Safari maps it to New York and Native translates it to the host serif (Chrome skips it). AppleMyungjo/Batang/\n * Noto Serif KR give Hangul a serif face where installed; otherwise Hangul falls back to the host font. */\nconst serifStack = [\"ui-serif\", \"Iowan Old Style\", \"Georgia\", \"AppleMyungjo\", \"Batang\", \"Noto Serif KR\", \"serif\"] as const;\n\n/** Profiles deliberately differ in interaction and arrangement, not just hue.\n * No font asset is bundled or implied: custom font loading remains product-owned. */\nconst presetInputs: Readonly<Record<Exclude<HjmDesignPreset, \"neutral\">, HjmDesignProfileInput>> = {\n retro: {\n id: \"retro\",\n palette: {\n light: { bg: \"#fff8e8\", surface: \"#fffdf5\", surfaceAlt: \"#eee0c5\", surfaceAccent: \"#f6d4a0\", border: \"#d1bd96\", borderControl: \"#75604b\", primary: \"#973c20\", contentBrand: \"#80321a\", text: \"#2c2119\", textBody: \"#413123\", textMuted: \"#594637\", textSub: \"#695646\", textWeak: \"#857461\" },\n dark: { bg: \"#211a16\", surface: \"#2d241d\", surfaceAlt: \"#3b3025\", surfaceAccent: \"#5e3827\", border: \"#807260\", borderControl: \"#b7a387\", primary: \"#af5437\", contentBrand: \"#ffc38b\", text: \"#fff5e1\", textBody: \"#ead8bb\", textMuted: \"#d5c1a3\", textSub: \"#bea88b\", textWeak: \"#a18e74\" },\n },\n tokens: { radius: { sm: 2, md: 4, lg: 6, xl: 8 } },\n material: { canvas: { layers: [\"noise\"], intensity: 0.08, active: false, seed: \"retro\" } },\n interactions: { contentTransition: \"slide\", selectionMotion: \"none\" },\n compositions: { collection: \"grid\", toolbar: \"inline\" },\n screens: { overview: \"dashboard\" },\n },\n paper: {\n id: \"paper\",\n palette: {\n light: { bg: \"#f9f5ed\", surface: \"#fffdf8\", surfaceAlt: \"#eee8dc\", surfaceAccent: \"#e7dac8\", border: \"#d6cabb\", borderControl: \"#776b5c\", primary: \"#665039\", contentBrand: \"#58432e\", text: \"#28231c\", textBody: \"#40382d\", textMuted: \"#5b5145\", textSub: \"#6e6253\", textWeak: \"#887b69\" },\n dark: { bg: \"#1b1916\", surface: \"#27231e\", surfaceAlt: \"#332d25\", surfaceAccent: \"#4f4132\", border: \"#847561\", borderControl: \"#b8a68c\", primary: \"#83684c\", contentBrand: \"#e3bf91\", text: \"#f8f0e1\", textBody: \"#e5d9c4\", textMuted: \"#d0c0a6\", textSub: \"#b8a78d\", textWeak: \"#a18e72\" },\n },\n tokens: { radius: { sm: 4, md: 6, lg: 8, xl: 12 } },\n // A-02's ruled-paper finding is distinct from grain. A static low-opacity\n // tile adds that voice without rotating controls or aligning content baselines.\n material: { canvas: { layers: [\"grain\", \"ruled\"], ruledSpacing: 24, intensity: 0.06, active: false, seed: \"paper\" } },\n interactions: { contentTransition: \"fade\", selectionMotion: \"none\" },\n compositions: { collection: \"rows\", toolbar: \"collapsible\" },\n screens: { overview: \"editorial\" },\n },\n forest: {\n id: \"forest\",\n palette: {\n light: { bg: \"#f2f7ef\", surface: \"#fbfdf8\", surfaceAlt: \"#e0ebda\", surfaceAccent: \"#d5e8c9\", border: \"#bdcdb5\", borderControl: \"#65765c\", primary: \"#285c35\", contentBrand: \"#23512d\", text: \"#1d2b1b\", textBody: \"#30422c\", textMuted: \"#485c41\", textSub: \"#5c6e54\", textWeak: \"#7b8b71\" },\n dark: { bg: \"#111c15\", surface: \"#1b2a1e\", surfaceAlt: \"#293a2a\", surfaceAccent: \"#304d32\", border: \"#6b816a\", borderControl: \"#95ac8d\", primary: \"#477c54\", contentBrand: \"#a8d994\", text: \"#eff7e9\", textBody: \"#d8e9cf\", textMuted: \"#bdd4b3\", textSub: \"#a1bd94\", textWeak: \"#87a17b\" },\n },\n tokens: { radius: { sm: 10, md: 16, lg: 24, xl: 32 } },\n material: { canvas: { layers: [\"mesh\", \"glow\"], intensity: 0.1, active: false, seed: \"forest\" } },\n interactions: { contentTransition: \"rise\", selectionMotion: \"slide\" },\n compositions: { collection: \"cards\", toolbar: \"collapsible\" },\n screens: { overview: \"landscape\" },\n },\n // minimal, editorial and terminal looked alike in light mode (near-white, only terminal's font differed) at the\n // 2026-10-17 user review. Each now carries its identity through palette, type, elevation and arrangement together.\n // minimal: achromatic hairlines on white, no shadow anywhere (overlays rely on their border and scrim), the shared\n // medium-weight headings, airy body leading and framed cards for the generous card padding.\n minimal: {\n id: \"minimal\",\n palette: {\n light: { bg: \"#ffffff\", surface: \"#fafafa\", surfaceAlt: \"#f2f2f2\", surfaceAccent: \"#ededed\", border: \"#e6e6e6\", borderControl: \"#767676\", primary: \"#3d3d3d\", contentBrand: \"#2e2e2e\", text: \"#111111\", textBody: \"#2b2b2b\", textMuted: \"#4a4a4a\", textSub: \"#5e5e5e\", textWeak: \"#8a8a8a\" },\n dark: { bg: \"#101010\", surface: \"#151515\", surfaceAlt: \"#1c1c1c\", surfaceAccent: \"#2a2a2a\", border: \"#333333\", borderControl: \"#8f8f8f\", primary: \"#6e6e6e\", contentBrand: \"#e2e2e2\", text: \"#f2f2f2\", textBody: \"#dedede\", textMuted: \"#c6c6c6\", textSub: \"#a3a3a3\", textWeak: \"#8a8a8a\" },\n },\n tokens: { radius: { sm: 4, md: 8, lg: 12, xl: 16 }, shadow: { raised: { opacity: 0 }, floating: { opacity: 0 } },\n typography: { body: { lineHeight: 26 } } },\n interactions: { contentTransition: \"fade\", selectionMotion: \"none\" },\n compositions: { collection: \"cards\", toolbar: \"inline\" }, screens: { overview: \"dashboard\" },\n },\n // editorial: serif display and reading roles over a warm ink-on-paper palette with a deep wine accent, airy body\n // leading, flat print corners, and rows, which the shared layout divides with rule lines. Its enlarged 56/42/30\n // headings were removed with the display tier (2026-10-17 user decision, \"큰 글자 정책은 없애\").\n editorial: {\n id: \"editorial\",\n palette: {\n light: { bg: \"#fdfbf7\", surface: \"#f7f3ec\", surfaceAlt: \"#efe9df\", surfaceAccent: \"#f1e4ea\", border: \"#cfc5b8\", borderControl: \"#6f655a\", primary: \"#7a1f3d\", contentBrand: \"#6b1a35\", text: \"#1b1714\", textBody: \"#2e2823\", textMuted: \"#4a423b\", textSub: \"#5f564d\", textWeak: \"#8a7f73\" },\n dark: { bg: \"#14110e\", surface: \"#1c1814\", surfaceAlt: \"#26211b\", surfaceAccent: \"#3f2430\", border: \"#5e554b\", borderControl: \"#a3988b\", primary: \"#ad4566\", contentBrand: \"#f2b8c9\", text: \"#f6f0e7\", textBody: \"#e6ddd1\", textMuted: \"#cfc4b6\", textSub: \"#b0a596\", textWeak: \"#958a7c\" },\n },\n tokens: { radius: { sm: 0, md: 2, lg: 2, xl: 4 }, fontFamily: { display: serifStack, reading: serifStack }, shadow: { raised: { opacity: 0 } },\n typography: { body: { lineHeight: 26 } } },\n interactions: { contentTransition: \"rise\", selectionMotion: \"none\" },\n compositions: { collection: \"rows\", toolbar: \"collapsible\" }, screens: { overview: \"editorial\" },\n },\n brutalist: {\n id: \"brutalist\",\n // Headings stay heavy (800) on purpose: the foundation headings became lighter on 2026-10-17, but the user\n // kept brutalist at 800 after comparing it in Storybook, because thick borders and hard shadows need the\n // heaviest headings to hold their weight. Do not align this with the 500 default. Only the weight differs:\n // the enlarged 48/38/30 sizes were removed with the display tier the same day (\"큰 글자 정책은 없애\"), so\n // sizes follow the shared scale. `typography.heading` carries Heading level1–3 through the profile alias.\n // docs/design-profile.md documents the same exception.\n palette: { light: { primary: \"#171717\", contentBrand: \"#171717\", surfaceAccent: \"#e8ed91\", border: \"#171717\" }, dark: { primary: \"#727272\", contentBrand: \"#f0f3a3\", surfaceAccent: \"#393a1c\", border: \"#cccccc\" } },\n tokens: { radius: { sm: 0, md: 0, lg: 0, xl: 0 }, shadow: { raised: { radius: 0, offsetY: 4, opacity: 0.25 }, floating: { radius: 0, offsetY: 6, opacity: 0.3 } }, typography: { heading: { fontWeight: fontWeight.heavy } } },\n\n interactions: { contentTransition: \"slide\", selectionMotion: \"none\" },\n compositions: { collection: \"cards\", toolbar: \"inline\" }, screens: { overview: \"editorial\" },\n },\n glass: {\n id: \"glass\",\n palette: { // Stronger ink tiers keep glass visibly translucent under the existing\n // contrast rules; the neutral weak/subtle tiers required an opaque fill.\n light: { primary: \"#435e91\", contentBrand: \"#354c78\", surfaceAccent: \"#e4ecf7\", textSub: \"#5b6879\", textWeak: \"#748292\" }, dark: { primary: \"#5673a3\", contentBrand: \"#c1d8ff\", surfaceAccent: \"#233654\" } },\n tokens: { radius: { sm: 12, md: 18, lg: 26, xl: 36 }, shadow: { floating: { radius: 24, opacity: 0.12, offsetY: 8 } } },\n material: { canvas: { layers: [\"mesh\"], intensity: 0.16, active: false, seed: \"glass\" }, card: { layers: [\"glow\"], intensity: 0.06, active: false, seed: \"glass-card\" }, surface: { blurStrength: 0.75, fillOpacity: 0.88, insetShadows: [] } },\n interactions: { contentTransition: \"fade\", selectionMotion: \"slide\" },\n compositions: { collection: \"cards\", toolbar: \"inline\" }, screens: { overview: \"landscape\" },\n },\n aurora: {\n id: \"aurora\",\n palette: { light: { primary: \"#62409b\", contentBrand: \"#58388b\", surfaceAccent: \"#ece2fa\" }, dark: { primary: \"#8161b1\", contentBrand: \"#dbc3ff\", surfaceAccent: \"#392651\" } },\n tokens: { radius: { sm: 8, md: 14, lg: 22, xl: 30 } },\n material: { canvas: { layers: [\"mesh\", \"glow\"], intensity: 0.2, active: true, period: 30, seed: \"aurora\" } },\n interactions: { contentTransition: \"scale\", selectionMotion: \"slide\" },\n compositions: { collection: \"grid\", toolbar: \"collapsible\" }, screens: { overview: \"landscape\" },\n },\n // terminal: monospace for every role (display/reading follow ui), square corners, no shadow, ruled rows, green\n // phosphor primary with amber brand text. Dark is a black console. Light cannot be a black console: the accent\n // foregrounds (ACCENTS.light, used by notices and status text) are fixed dark inks that the profile palette does not\n // replace, so a dark light-mode canvas would pass the palette check yet leave them unreadable. Light therefore uses\n // the darkest green-grey canvas on which those inks still reach 4.5:1 (about 4.6 on bg, 5.0 on surface).\n terminal: {\n id: \"terminal\",\n palette: {\n light: { bg: \"#c8d4c4\", surface: \"#d1dbcd\", surfaceAlt: \"#ccd7c8\", surfaceAccent: \"#cadbc5\", border: \"#6f8069\", borderControl: \"#33463a\", primary: \"#164f25\", contentBrand: \"#5c3200\", text: \"#04160a\", textBody: \"#0b2412\", textMuted: \"#15301c\", textSub: \"#1f3a26\", textWeak: \"#4a5d4d\", danger: \"#7f0e0e\" },\n dark: { bg: \"#050a06\", surface: \"#0b130d\", surfaceAlt: \"#122016\", surfaceAccent: \"#173a20\", border: \"#2f6b3e\", borderControl: \"#4fae66\", primary: \"#1f7a3a\", contentBrand: \"#ffb84d\", text: \"#9cf5ae\", textBody: \"#86e39a\", textMuted: \"#74cf89\", textSub: \"#62b877\", textWeak: \"#4d9a61\", danger: \"#ff8a7a\" },\n },\n tokens: { radius: { sm: 0, md: 0, lg: 0, xl: 0 }, fontFamily: { ui: fontFamily.code }, shadow: { raised: { opacity: 0 }, floating: { radius: 0, offsetY: 0, opacity: 0 } } },\n interactions: { contentTransition: \"fade\", selectionMotion: \"none\" },\n compositions: { collection: \"rows\", toolbar: \"collapsible\" }, screens: { overview: \"dashboard\" },\n },\n clay: {\n id: \"clay\",\n palette: { light: { primary: \"#904663\", contentBrand: \"#803b57\", surfaceAccent: \"#f7e1eb\" }, dark: { primary: \"#a25e7d\", contentBrand: \"#f1bed4\", surfaceAccent: \"#482b3a\" } },\n tokens: { radius: { sm: 14, md: 22, lg: 32, xl: 44 }, shadow: { raised: { radius: 16, offsetY: 6, opacity: 0.12 }, floating: { radius: 28, offsetY: 12, opacity: 0.18 } } },\n material: { card: { layers: [\"grain\"], intensity: 0.04, active: false, seed: \"clay\" }, surface: { blurStrength: 0, fillOpacity: 1, insetShadows: [\n { color: \"#ffffff\", opacity: 0.22, radius: 10, offsetX: 3, offsetY: 4 },\n { color: \"#000000\", opacity: 0.12, radius: 12, offsetX: -3, offsetY: -4 },\n ] } },\n interactions: { contentTransition: \"scale\", selectionMotion: \"slide\" },\n compositions: { collection: \"cards\", toolbar: \"collapsible\" }, screens: { overview: \"dashboard\" },\n },\n};\n\nfunction freeze<T>(value: T): T {\n if (value !== null && typeof value === \"object\") {\n for (const item of Object.values(value)) freeze(item);\n Object.freeze(value);\n }\n return value;\n}\n\nfunction choose<T extends string>(value: T, allowed: readonly T[], field: string): void {\n if (!allowed.includes(value)) throw new TypeError(`Unsupported design profile ${field}`);\n}\n\nfunction merge(base: HjmDesignProfile, input: HjmDesignProfileInput): HjmDesignProfile {\n for (const role of Object.keys(input.material ?? {})) {\n if (![\"canvas\", \"card\", \"surface\"].includes(role)) throw new TypeError(\"Unsupported design profile material role\");\n }\n const requestedSurface = input.material?.surface;\n if (requestedSurface !== undefined && requestedSurface !== null && (typeof requestedSurface !== \"object\" || Array.isArray(requestedSurface))) throw new TypeError(\"Invalid design profile surface material\");\n for (const key of Object.keys(requestedSurface ?? {})) {\n if (![\"blurStrength\", \"fillOpacity\", \"insetShadows\"].includes(key)) throw new TypeError(\"Unsupported design profile surface material field\");\n }\n const palette = {\n light: { ...base.palette.light, ...input.palette?.light },\n dark: { ...base.palette.dark, ...input.palette?.dark },\n };\n // fromEntries loses fixed keys; iteration over the complete base preserves every role.\n const type = Object.fromEntries(Object.entries(base.tokens.typography).map(([key, value]) => [key, { ...value, ...input.tokens?.typography?.[key as keyof TypographyTokens] }])) as unknown as TypographyTokens;\n // Every heading level follows a typography role, with explicit heading overrides last, and preserves\n // inherited heading values on empty input. Deprecated level1/2 follow `heading` like level3 since the\n // display tier was removed (2026-10-17 user decision, \"큰 글자 정책은 없애\").\n const aliases = { level1: \"heading\", level2: \"heading\", level3: \"heading\", level4: \"titleLarge\", level5: \"title\" } as const;\n for (const key of Object.keys(input.tokens?.heading ?? {})) {\n if (!Object.prototype.hasOwnProperty.call(heading, key)) throw new TypeError(\"Unsupported design profile heading level\");\n }\n const headings = Object.fromEntries(Object.entries(base.tokens.heading).map(([key, value]) => {\n const level = key as keyof HeadingTokens;\n const alias = level in aliases ? aliases[level as keyof typeof aliases] : undefined;\n return [level, { ...value, ...(alias ? input.tokens?.typography?.[alias] : undefined), ...input.tokens?.heading?.[level] }];\n })) as unknown as HeadingTokens;\n // The complete base shadow record has the same key-preservation guarantee.\n const elevation = Object.fromEntries(Object.entries(base.tokens.shadow).map(([key, value]) => [key, { ...value, ...input.tokens?.shadow?.[key as keyof ShadowTokens] }])) as unknown as ShadowTokens;\n const requestedFonts = input.tokens?.fontFamily;\n for (const role of Object.keys(requestedFonts ?? {})) {\n if (![\"ui\", \"code\", \"display\", \"reading\"].includes(role)) throw new TypeError(\"Unsupported design profile font role\");\n const families = requestedFonts?.[role as keyof FontFamilyRoles];\n if (families !== undefined && (!Array.isArray(families) || !families.length || families.some(family => typeof family !== \"string\" || !family.trim()))) throw new TypeError(\"Design profile font families must not be empty\");\n }\n const display = requestedFonts?.display ?? base.tokens.fontFamily.display;\n const reading = requestedFonts?.reading ?? base.tokens.fontFamily.reading;\n const profile: HjmDesignProfile = {\n id: input.id ?? base.id, palette,\n tokens: {\n radius: { ...base.tokens.radius, ...input.tokens?.radius },\n // Copy caller-owned arrays: freezing the resolved profile must never freeze app input.\n fontFamily: { ui: [...(input.tokens?.fontFamily?.ui ?? base.tokens.fontFamily.ui)], code: [...(input.tokens?.fontFamily?.code ?? base.tokens.fontFamily.code)],\n ...(display ? { display: [...display] } : {}), ...(reading ? { reading: [...reading] } : {}) },\n typography: type, heading: headings, shadow: elevation,\n },\n material: { ...base.material, ...input.material, surface: input.material?.surface === null ? null\n : input.material?.surface === undefined ? base.material.surface ?? null\n : { blurStrength: 0, fillOpacity: 1, insetShadows: [], ...base.material.surface, ...input.material.surface } },\n interactions: { ...base.interactions, ...input.interactions },\n compositions: { ...base.compositions, ...input.compositions },\n screens: { ...base.screens, ...input.screens },\n };\n if (!profile.id.trim()) throw new TypeError(\"Design profile id must not be empty\");\n for (const mode of [\"light\", \"dark\"] as const) {\n for (const [key, value] of Object.entries(palette[mode])) {\n if (!(key in THEMES[mode]) || !/^#[0-9a-f]{6}$/i.test(value)) throw new TypeError(`Invalid design profile palette ${mode}.${key}`);\n }\n if (checkPaletteContrast(palette[mode]).length) throw new RangeError(`Design profile ${mode} palette fails required contrast pairs`);\n }\n for (const [key, value] of Object.entries(profile.tokens.radius)) {\n if (!(key in radius) || !Number.isFinite(value) || value < 0 || value > 999) throw new RangeError(\"Invalid design profile radius\");\n }\n // Circles/pills retain their semantic geometry; product corners apply to other roles.\n if (profile.tokens.radius.full !== radius.full) throw new RangeError(\"Design profile must preserve full radius\");\n // No profile may enlarge text past the HJM ceiling, `typography.heading` (2026-10-17 user decision, \"글자 너무 커\",\n // \"큰 글자 정책은 없애\"). Before, up to 96 was allowed and presets drew 30–56px headings.\n for (const value of [...Object.values(type), ...Object.values(headings)]) {\n if (!Number.isFinite(value.fontSize) || value.fontSize < 11 || value.fontSize > typography.heading.fontSize || !Number.isFinite(value.lineHeight) || value.lineHeight < value.fontSize || value.lineHeight > 144) throw new RangeError(\"Invalid design profile typography\");\n choose(value.fontWeight, [\"400\", \"500\", \"600\", \"700\", \"800\"], \"fontWeight\");\n }\n for (const families of Object.values(profile.tokens.fontFamily)) {\n if (!Array.isArray(families) || !families.length || families.some(family => typeof family !== \"string\" || !family.trim())) throw new TypeError(\"Design profile font families must not be empty\");\n }\n for (const token of Object.values(elevation)) {\n if (!/^#[0-9a-f]{6}$/i.test(token.color) || !Number.isFinite(token.opacity) || token.opacity < 0 || token.opacity > 1 || !Number.isFinite(token.radius) || token.radius < 0 || token.radius > 96 || !Number.isFinite(token.offsetY) || Math.abs(token.offsetY) > 96) throw new RangeError(\"Invalid design profile shadow\");\n }\n const surface = profile.material.surface;\n if (surface) {\n // Keep a readable semantic fill rather than copying a low-alpha reference card.\n // Native can fail to supply blur and must always retain its opaque fallback.\n if (!Number.isFinite(surface.blurStrength) || surface.blurStrength < 0 || surface.blurStrength > 1 || !Number.isFinite(surface.fillOpacity) || surface.fillOpacity < 0.85 || surface.fillOpacity > 1) throw new RangeError(\"Invalid design profile surface material\");\n if (!Array.isArray(surface.insetShadows) || surface.insetShadows.length > 2) throw new RangeError(\"Invalid design profile inset shadows\");\n for (const token of surface.insetShadows) {\n if (!/^#[0-9a-f]{6}$/i.test(token.color) || !Number.isFinite(token.opacity) || token.opacity < 0 || token.opacity > 1 || !Number.isFinite(token.radius) || token.radius < 0 || token.radius > 96 || !Number.isFinite(token.offsetY) || Math.abs(token.offsetY) > 96 || !Number.isFinite(token.offsetX) || Math.abs(token.offsetX) > 96) throw new RangeError(\"Invalid design profile inset shadow\");\n }\n }\n const effects = Object.fromEntries(([\"canvas\", \"card\"] as const).map(role => {\n const descriptor = profile.material[role];\n if (descriptor === null) return [role, null];\n resolveEffectSurface(descriptor);\n // Deep-copy material data as well: a preset resolver must not own caller state.\n return [role, { ...descriptor, ...(descriptor.layers ? { layers: [...descriptor.layers] } : {}), ...(descriptor.colors ? { colors: descriptor.colors.map(color => ({ ...color })) } : {}) }];\n })) as Pick<HjmDesignProfile[\"material\"], \"canvas\" | \"card\">;\n const material = { ...effects, surface: surface ? { ...surface, insetShadows: surface.insetShadows.map(token => ({ ...token })) } : null };\n choose(profile.interactions.contentTransition, [\"fade\", \"rise\", \"slide\", \"scale\"], \"contentTransition\");\n choose(profile.interactions.selectionMotion, [\"none\", \"slide\"], \"selectionMotion\");\n choose(profile.compositions.collection, [\"rows\", \"cards\", \"grid\"], \"collection\");\n choose(profile.compositions.toolbar, [\"inline\", \"collapsible\"], \"toolbar\");\n choose(profile.screens.overview, [\"dashboard\", \"editorial\", \"landscape\"], \"overview\");\n return freeze({ ...profile, material });\n}\n\nexport const hjmDesignPresets: Readonly<Record<HjmDesignPreset, HjmDesignProfile>> = freeze({\n neutral: merge(neutral, {}),\n retro: merge(neutral, presetInputs.retro),\n paper: merge(neutral, presetInputs.paper),\n forest: merge(neutral, presetInputs.forest),\n minimal: merge(neutral, presetInputs.minimal),\n editorial: merge(neutral, presetInputs.editorial),\n brutalist: merge(neutral, presetInputs.brutalist),\n glass: merge(neutral, presetInputs.glass),\n aurora: merge(neutral, presetInputs.aurora),\n terminal: merge(neutral, presetInputs.terminal),\n clay: merge(neutral, presetInputs.clay),\n});\n\nexport function defineHjmDesignProfile(input: HjmDesignProfileInput = {}): HjmDesignProfile {\n const base = hjmDesignPresets[input.extends ?? \"neutral\"];\n if (!base) throw new TypeError(\"Unknown HJM design preset\");\n return merge(base, input);\n}\n\n/** Resolve the readable fill against black/white backdrop extremes using the\n * final product palette, including brandPalette overrides. Blur is decorative:\n * it cannot be used as evidence of text contrast over arbitrary app content. */\nexport function resolveDesignProfileSurfaceMaterial(profile: HjmDesignProfile | undefined, palette: Readonly<ThemeColors>): SurfaceMaterial | null {\n const material = profile?.material.surface;\n if (!material) return null;\n // Transparency requires a real backdrop effect. Plain/clay surfaces stay solid\n // on both hosts instead of becoming tint-only imitations of a glass material.\n if (!material.blurStrength) return { ...material, fillOpacity: 1 };\n return { ...material, fillOpacity: resolveSurfaceFillOpacity(material.fillOpacity, palette) };\n}\n"]}
@@ -98,7 +98,7 @@ export declare const filePickerRecipe: {
98
98
  alpha?: number;
99
99
  }>;
100
100
  readonly textVariant: "label";
101
- readonly fontWeight: "700";
101
+ readonly fontWeight: "500";
102
102
  };
103
103
  readonly dropzone: {
104
104
  readonly borderStyle: "dashed";
@@ -162,7 +162,7 @@ export const filePickerRecipe = {
162
162
  radius: "md",
163
163
  color: semanticColors.content.brand,
164
164
  textVariant: "label",
165
- fontWeight: fontWeight.bold,
165
+ fontWeight: fontWeight.medium,
166
166
  },
167
167
  dropzone: {
168
168
  borderStyle: "dashed",
@@ -1 +1 @@
1
- {"version":3,"file":"file-picker.js","sourceRoot":"","sources":["../src/file-picker.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ColorReference } from \"./color-references.js\";\nimport type { BehaviorContract } from \"./behaviors.js\";\nimport { focusIndicatorContract } from \"./component-contracts.js\";\nimport {\n control,\n fontWeight,\n opacity,\n radius,\n spacing,\n stroke,\n type FontWeightValue,\n type TextVariant,\n} from \"./foundations.js\";\nimport { semanticColors } from \"./semantic-colors.js\";\n\nexport type FilePickerMode = \"single\" | \"multiple\";\n\n/**\n * MIME pattern (\"image/png\", \"image\" + wildcard subtype, or wildcard/wildcard)\n * or extension (\".pdf\"). Extensions exist because native pickers do not\n * always resolve a MIME type.\n */\nexport type FilePickerAcceptPattern = string;\n\nexport type FilePickerDescriptor = Readonly<{\n mode?: FilePickerMode;\n accept?: readonly FilePickerAcceptPattern[];\n maxSizeBytes?: number;\n /** Only meaningful when `mode` is `\"multiple\"` — single mode is always capped at one. */\n maxCount?: number;\n}>;\n\nexport type ResolvedFilePickerDescriptor = Readonly<{\n mode: FilePickerMode;\n accept?: readonly FilePickerAcceptPattern[];\n maxSizeBytes?: number;\n maxCount?: number;\n}>;\n\nexport const filePickerDefaults = {\n mode: \"single\",\n} as const satisfies Readonly<{ mode: FilePickerMode }>;\n\n/** A file the platform picker or drop target produced, before FilePicker judges it. */\nexport type FilePickerCandidate = Readonly<{\n id: string;\n name: string;\n /** `\"\"` when the platform could not resolve a MIME type. */\n mimeType: string;\n sizeBytes: number;\n}>;\n\nexport type FilePickerRejectionReason = \"unsupported-type\" | \"too-large\" | \"count-exceeded\";\n\nexport type FilePickerRejection =\n | Readonly<{ file: FilePickerCandidate; reason: \"unsupported-type\"; accept: readonly FilePickerAcceptPattern[] }>\n | Readonly<{ file: FilePickerCandidate; reason: \"too-large\"; maxSizeBytes: number }>\n | Readonly<{ file: FilePickerCandidate; reason: \"count-exceeded\"; maxCount: number }>;\n\n/**\n * `accepted` and `rejected` are reported together on purpose: a rejection\n * never has to be inferred by diffing two lists, and the rest of the batch\n * staying selected is visible in the same result (identity.md's \"what broke\n * + what stayed fine\").\n */\nexport type FilePickerSelectionResult = Readonly<{\n accepted: readonly FilePickerCandidate[];\n rejected: readonly FilePickerRejection[];\n}>;\n\nconst ACCEPT_PATTERN = /^(\\*\\/\\*|[a-z0-9.+-]+\\/(?:\\*|[a-z0-9.+-]+)|\\.[a-z0-9]+)$/i;\n\nfunction assertNonEmpty(value: string, field: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`FilePicker ${field} must not be empty`);\n }\n}\n\nexport function validateFilePickerDescriptor(descriptor: FilePickerDescriptor): void {\n const mode = descriptor.mode ?? filePickerDefaults.mode;\n if (mode !== \"single\" && mode !== \"multiple\") {\n throw new TypeError(`Unsupported FilePicker mode: ${String(mode)}`);\n }\n if (descriptor.accept !== undefined) {\n if (descriptor.accept.length === 0) {\n throw new TypeError(\"FilePicker accept must not be empty when provided\");\n }\n const seen = new Set<string>();\n for (const pattern of descriptor.accept) {\n if (!ACCEPT_PATTERN.test(pattern)) {\n throw new TypeError(`Unsupported FilePicker accept pattern: ${pattern}`);\n }\n const normalized = pattern.toLowerCase();\n if (seen.has(normalized)) {\n throw new TypeError(`Duplicate FilePicker accept pattern: ${pattern}`);\n }\n seen.add(normalized);\n }\n }\n if (descriptor.maxSizeBytes !== undefined) {\n if (!Number.isFinite(descriptor.maxSizeBytes) || descriptor.maxSizeBytes <= 0) {\n throw new RangeError(\"FilePicker maxSizeBytes must be a positive finite number\");\n }\n }\n if (descriptor.maxCount !== undefined) {\n if (mode !== \"multiple\") {\n throw new TypeError(\"FilePicker maxCount only applies when mode is \\\"multiple\\\"\");\n }\n if (!Number.isInteger(descriptor.maxCount) || descriptor.maxCount < 1) {\n throw new RangeError(\"FilePicker maxCount must be a positive integer\");\n }\n }\n}\n\nexport function resolveFilePickerDescriptor(\n descriptor: FilePickerDescriptor,\n): ResolvedFilePickerDescriptor {\n validateFilePickerDescriptor(descriptor);\n return { ...descriptor, mode: descriptor.mode ?? filePickerDefaults.mode };\n}\n\nexport function validateFilePickerCandidate(candidate: FilePickerCandidate): void {\n assertNonEmpty(candidate.id, \"candidate id\");\n assertNonEmpty(candidate.name, \"candidate name\");\n if (typeof candidate.mimeType !== \"string\") {\n throw new TypeError('FilePicker candidate mimeType must be a string (use \"\" when unknown)');\n }\n if (!Number.isFinite(candidate.sizeBytes) || candidate.sizeBytes < 0) {\n throw new RangeError(\"FilePicker candidate sizeBytes must be a non-negative finite number\");\n }\n}\n\n/** Splits `\"type/subtype\"` into a fixed-length tuple so both sides are always `string`. */\nfunction splitOnSlash(value: string): readonly [string, string] {\n const slash = value.indexOf(\"/\");\n if (slash === -1) return [value, \"\"];\n return [value.slice(0, slash), value.slice(slash + 1)];\n}\n\nfunction fileExtension(name: string): string {\n const dot = name.lastIndexOf(\".\");\n return dot === -1 ? \"\" : name.slice(dot).toLowerCase();\n}\n\nfunction matchesPattern(candidate: FilePickerCandidate, pattern: string): boolean {\n if (pattern.startsWith(\".\")) {\n return fileExtension(candidate.name) === pattern.toLowerCase();\n }\n if (pattern === \"*/*\") return true;\n if (!candidate.mimeType) return false;\n const [patternType, patternSubtype] = splitOnSlash(pattern.toLowerCase());\n const [fileType, fileSubtype] = splitOnSlash(candidate.mimeType.toLowerCase());\n if (patternType !== \"*\" && patternType !== fileType) return false;\n return patternSubtype === \"*\" || patternSubtype === fileSubtype;\n}\n\n/**\n * `undefined`/empty `accept` means unrestricted. Exported so a Web renderer's\n * live drag-over preview and the post-drop judgment share one rule.\n */\nexport function matchesFilePickerAccept(\n candidate: FilePickerCandidate,\n accept: readonly FilePickerAcceptPattern[] | undefined,\n): boolean {\n if (accept === undefined || accept.length === 0) return true;\n return accept.some((pattern) => matchesPattern(candidate, pattern));\n}\n\n/**\n * Judges one selection batch against the descriptor. `existingCount` is a\n * read-only input — like Select's `selectedItem` — for products that let\n * users add files across repeated picks; FilePicker never accumulates a\n * selection list itself.\n */\nexport function resolveFilePickerSelection(\n candidates: readonly FilePickerCandidate[],\n descriptor: FilePickerDescriptor,\n existingCount = 0,\n): FilePickerSelectionResult {\n const resolved = resolveFilePickerDescriptor(descriptor);\n for (const candidate of candidates) validateFilePickerCandidate(candidate);\n if (!Number.isInteger(existingCount) || existingCount < 0) {\n throw new RangeError(\"FilePicker existingCount must be a non-negative integer\");\n }\n\n const accepted: FilePickerCandidate[] = [];\n const rejected: FilePickerRejection[] = [];\n\n for (const candidate of candidates) {\n if (!matchesFilePickerAccept(candidate, resolved.accept)) {\n rejected.push({ file: candidate, reason: \"unsupported-type\", accept: resolved.accept ?? [] });\n continue;\n }\n if (resolved.maxSizeBytes !== undefined && candidate.sizeBytes > resolved.maxSizeBytes) {\n rejected.push({ file: candidate, reason: \"too-large\", maxSizeBytes: resolved.maxSizeBytes });\n continue;\n }\n accepted.push(candidate);\n }\n\n const effectiveMaxCount = resolved.mode === \"single\" ? 1 : resolved.maxCount;\n if (effectiveMaxCount !== undefined) {\n const room = Math.max(0, effectiveMaxCount - existingCount);\n if (accepted.length > room) {\n const overflow = accepted.splice(room);\n for (const candidate of overflow) {\n rejected.push({ file: candidate, reason: \"count-exceeded\", maxCount: effectiveMaxCount });\n }\n }\n }\n\n return { accepted, rejected };\n}\n\nexport type FilePickerTriggerPlatform = \"web\" | \"native\";\nexport type FilePickerTrigger = \"button\" | \"dropzone\";\n\n/**\n * Drag-and-drop is a Web-only enhancement. `validateFilePickerTriggers`\n * enforces the roadmap's adaptive gate: Native never gets a dropzone, and no\n * platform may ship a dropzone without an always-reachable button — the same\n * \"automatic mode keeps a manual fallback\" principle as LoadMore\n * (`src/load-more.ts`).\n */\nexport const filePickerTriggerDefaults = {\n web: [\"button\", \"dropzone\"],\n native: [\"button\"],\n} as const satisfies Record<FilePickerTriggerPlatform, readonly FilePickerTrigger[]>;\n\nexport function validateFilePickerTriggers(\n platform: FilePickerTriggerPlatform,\n triggers: readonly FilePickerTrigger[],\n): void {\n if (triggers.length === 0) {\n throw new TypeError(\"FilePicker triggers must not be empty\");\n }\n if (!triggers.includes(\"button\")) {\n throw new TypeError(\"FilePicker must always expose a button trigger, even with a dropzone\");\n }\n if (platform === \"native\" && triggers.includes(\"dropzone\")) {\n throw new TypeError(\"FilePicker dropzone trigger is a Web-only enhancement\");\n }\n}\n\nexport type FilePickerDensity = \"compact\" | \"regular\";\n\nexport const filePickerRecipe = {\n slots: [\"root\", \"trigger\", \"dropzone\", \"hint\", \"error\"] as const,\n defaults: { density: \"regular\" },\n trigger: {\n minHeight: control.minTouchTarget,\n paddingHorizontal: spacing.md,\n radius: \"md\",\n color: semanticColors.content.brand,\n textVariant: \"label\",\n fontWeight: fontWeight.bold,\n },\n dropzone: {\n borderStyle: \"dashed\",\n borderWidth: stroke.default,\n borderColor: semanticColors.border.default,\n activeBorderColor: semanticColors.border.focus,\n activeBackground: semanticColors.interaction.focus,\n radius: \"lg\",\n padding: spacing.xl,\n },\n hint: {\n color: semanticColors.content.secondary,\n textVariant: \"label\",\n },\n error: {\n color: semanticColors.content.danger,\n textVariant: \"label\",\n },\n states: {\n focus: focusIndicatorContract,\n disabledOpacity: opacity.disabled,\n },\n} as const satisfies {\n slots: readonly [\"root\", \"trigger\", \"dropzone\", \"hint\", \"error\"];\n defaults: { density: FilePickerDensity };\n trigger: {\n minHeight: number;\n paddingHorizontal: number;\n radius: keyof typeof radius;\n color: ColorReference;\n textVariant: TextVariant;\n fontWeight: FontWeightValue;\n };\n dropzone: {\n borderStyle: \"dashed\";\n borderWidth: number;\n borderColor: ColorReference;\n activeBorderColor: ColorReference;\n activeBackground: ColorReference;\n radius: keyof typeof radius;\n padding: number;\n };\n hint: { color: ColorReference; textVariant: TextVariant };\n error: { color: ColorReference; textVariant: TextVariant };\n states: { focus: typeof focusIndicatorContract; disabledOpacity: number };\n};\n\n/**\n * No `open`/dismiss axis: the platform picker sheet is transient OS chrome\n * FilePicker does not model, unlike Select/Sheet which own their surface.\n */\nexport const filePickerBehavior = {\n controlled: [],\n inputs: [\"descriptor\", \"existingCount\"],\n events: [\"onSelect\"],\n configuration: { mode: [\"single\", \"multiple\"] },\n defaults: filePickerDefaults,\n stateAxes: {\n availability: [\"enabled\", \"disabled\"],\n interaction: [\"idle\", \"hover\", \"focusVisible\", \"pressed\", \"dragged\"],\n },\n web: {\n roles: [\"button\"],\n keyboard: [\"Tab\", \"Enter\", \"Space\"],\n focus: \"native\",\n },\n native: {\n roles: [\"button\"],\n states: [\"disabled\"],\n actions: [\"activate\"],\n },\n scenarios: [\n \"selecting-files-never-mutates-already-accepted-items\",\n \"rejected-files-report-a-reason-without-blocking-the-rest-of-the-batch\",\n \"type-and-size-are-judged-at-selection-time-not-upload-time\",\n \"count-cap-accounts-for-already-selected-items-across-repeated-picks\",\n \"single-mode-behaves-as-an-implicit-one-file-count-cap\",\n \"web-dropzone-is-always-paired-with-a-reachable-button-trigger\",\n \"native-never-exposes-a-dropzone-trigger\",\n \"rejection-is-announced-without-relying-on-color-alone\",\n ],\n} as const satisfies BehaviorContract;\n"]}
1
+ {"version":3,"file":"file-picker.js","sourceRoot":"","sources":["../src/file-picker.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ColorReference } from \"./color-references.js\";\nimport type { BehaviorContract } from \"./behaviors.js\";\nimport { focusIndicatorContract } from \"./component-contracts.js\";\nimport {\n control,\n fontWeight,\n opacity,\n radius,\n spacing,\n stroke,\n type FontWeightValue,\n type TextVariant,\n} from \"./foundations.js\";\nimport { semanticColors } from \"./semantic-colors.js\";\n\nexport type FilePickerMode = \"single\" | \"multiple\";\n\n/**\n * MIME pattern (\"image/png\", \"image\" + wildcard subtype, or wildcard/wildcard)\n * or extension (\".pdf\"). Extensions exist because native pickers do not\n * always resolve a MIME type.\n */\nexport type FilePickerAcceptPattern = string;\n\nexport type FilePickerDescriptor = Readonly<{\n mode?: FilePickerMode;\n accept?: readonly FilePickerAcceptPattern[];\n maxSizeBytes?: number;\n /** Only meaningful when `mode` is `\"multiple\"` — single mode is always capped at one. */\n maxCount?: number;\n}>;\n\nexport type ResolvedFilePickerDescriptor = Readonly<{\n mode: FilePickerMode;\n accept?: readonly FilePickerAcceptPattern[];\n maxSizeBytes?: number;\n maxCount?: number;\n}>;\n\nexport const filePickerDefaults = {\n mode: \"single\",\n} as const satisfies Readonly<{ mode: FilePickerMode }>;\n\n/** A file the platform picker or drop target produced, before FilePicker judges it. */\nexport type FilePickerCandidate = Readonly<{\n id: string;\n name: string;\n /** `\"\"` when the platform could not resolve a MIME type. */\n mimeType: string;\n sizeBytes: number;\n}>;\n\nexport type FilePickerRejectionReason = \"unsupported-type\" | \"too-large\" | \"count-exceeded\";\n\nexport type FilePickerRejection =\n | Readonly<{ file: FilePickerCandidate; reason: \"unsupported-type\"; accept: readonly FilePickerAcceptPattern[] }>\n | Readonly<{ file: FilePickerCandidate; reason: \"too-large\"; maxSizeBytes: number }>\n | Readonly<{ file: FilePickerCandidate; reason: \"count-exceeded\"; maxCount: number }>;\n\n/**\n * `accepted` and `rejected` are reported together on purpose: a rejection\n * never has to be inferred by diffing two lists, and the rest of the batch\n * staying selected is visible in the same result (identity.md's \"what broke\n * + what stayed fine\").\n */\nexport type FilePickerSelectionResult = Readonly<{\n accepted: readonly FilePickerCandidate[];\n rejected: readonly FilePickerRejection[];\n}>;\n\nconst ACCEPT_PATTERN = /^(\\*\\/\\*|[a-z0-9.+-]+\\/(?:\\*|[a-z0-9.+-]+)|\\.[a-z0-9]+)$/i;\n\nfunction assertNonEmpty(value: string, field: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`FilePicker ${field} must not be empty`);\n }\n}\n\nexport function validateFilePickerDescriptor(descriptor: FilePickerDescriptor): void {\n const mode = descriptor.mode ?? filePickerDefaults.mode;\n if (mode !== \"single\" && mode !== \"multiple\") {\n throw new TypeError(`Unsupported FilePicker mode: ${String(mode)}`);\n }\n if (descriptor.accept !== undefined) {\n if (descriptor.accept.length === 0) {\n throw new TypeError(\"FilePicker accept must not be empty when provided\");\n }\n const seen = new Set<string>();\n for (const pattern of descriptor.accept) {\n if (!ACCEPT_PATTERN.test(pattern)) {\n throw new TypeError(`Unsupported FilePicker accept pattern: ${pattern}`);\n }\n const normalized = pattern.toLowerCase();\n if (seen.has(normalized)) {\n throw new TypeError(`Duplicate FilePicker accept pattern: ${pattern}`);\n }\n seen.add(normalized);\n }\n }\n if (descriptor.maxSizeBytes !== undefined) {\n if (!Number.isFinite(descriptor.maxSizeBytes) || descriptor.maxSizeBytes <= 0) {\n throw new RangeError(\"FilePicker maxSizeBytes must be a positive finite number\");\n }\n }\n if (descriptor.maxCount !== undefined) {\n if (mode !== \"multiple\") {\n throw new TypeError(\"FilePicker maxCount only applies when mode is \\\"multiple\\\"\");\n }\n if (!Number.isInteger(descriptor.maxCount) || descriptor.maxCount < 1) {\n throw new RangeError(\"FilePicker maxCount must be a positive integer\");\n }\n }\n}\n\nexport function resolveFilePickerDescriptor(\n descriptor: FilePickerDescriptor,\n): ResolvedFilePickerDescriptor {\n validateFilePickerDescriptor(descriptor);\n return { ...descriptor, mode: descriptor.mode ?? filePickerDefaults.mode };\n}\n\nexport function validateFilePickerCandidate(candidate: FilePickerCandidate): void {\n assertNonEmpty(candidate.id, \"candidate id\");\n assertNonEmpty(candidate.name, \"candidate name\");\n if (typeof candidate.mimeType !== \"string\") {\n throw new TypeError('FilePicker candidate mimeType must be a string (use \"\" when unknown)');\n }\n if (!Number.isFinite(candidate.sizeBytes) || candidate.sizeBytes < 0) {\n throw new RangeError(\"FilePicker candidate sizeBytes must be a non-negative finite number\");\n }\n}\n\n/** Splits `\"type/subtype\"` into a fixed-length tuple so both sides are always `string`. */\nfunction splitOnSlash(value: string): readonly [string, string] {\n const slash = value.indexOf(\"/\");\n if (slash === -1) return [value, \"\"];\n return [value.slice(0, slash), value.slice(slash + 1)];\n}\n\nfunction fileExtension(name: string): string {\n const dot = name.lastIndexOf(\".\");\n return dot === -1 ? \"\" : name.slice(dot).toLowerCase();\n}\n\nfunction matchesPattern(candidate: FilePickerCandidate, pattern: string): boolean {\n if (pattern.startsWith(\".\")) {\n return fileExtension(candidate.name) === pattern.toLowerCase();\n }\n if (pattern === \"*/*\") return true;\n if (!candidate.mimeType) return false;\n const [patternType, patternSubtype] = splitOnSlash(pattern.toLowerCase());\n const [fileType, fileSubtype] = splitOnSlash(candidate.mimeType.toLowerCase());\n if (patternType !== \"*\" && patternType !== fileType) return false;\n return patternSubtype === \"*\" || patternSubtype === fileSubtype;\n}\n\n/**\n * `undefined`/empty `accept` means unrestricted. Exported so a Web renderer's\n * live drag-over preview and the post-drop judgment share one rule.\n */\nexport function matchesFilePickerAccept(\n candidate: FilePickerCandidate,\n accept: readonly FilePickerAcceptPattern[] | undefined,\n): boolean {\n if (accept === undefined || accept.length === 0) return true;\n return accept.some((pattern) => matchesPattern(candidate, pattern));\n}\n\n/**\n * Judges one selection batch against the descriptor. `existingCount` is a\n * read-only input — like Select's `selectedItem` — for products that let\n * users add files across repeated picks; FilePicker never accumulates a\n * selection list itself.\n */\nexport function resolveFilePickerSelection(\n candidates: readonly FilePickerCandidate[],\n descriptor: FilePickerDescriptor,\n existingCount = 0,\n): FilePickerSelectionResult {\n const resolved = resolveFilePickerDescriptor(descriptor);\n for (const candidate of candidates) validateFilePickerCandidate(candidate);\n if (!Number.isInteger(existingCount) || existingCount < 0) {\n throw new RangeError(\"FilePicker existingCount must be a non-negative integer\");\n }\n\n const accepted: FilePickerCandidate[] = [];\n const rejected: FilePickerRejection[] = [];\n\n for (const candidate of candidates) {\n if (!matchesFilePickerAccept(candidate, resolved.accept)) {\n rejected.push({ file: candidate, reason: \"unsupported-type\", accept: resolved.accept ?? [] });\n continue;\n }\n if (resolved.maxSizeBytes !== undefined && candidate.sizeBytes > resolved.maxSizeBytes) {\n rejected.push({ file: candidate, reason: \"too-large\", maxSizeBytes: resolved.maxSizeBytes });\n continue;\n }\n accepted.push(candidate);\n }\n\n const effectiveMaxCount = resolved.mode === \"single\" ? 1 : resolved.maxCount;\n if (effectiveMaxCount !== undefined) {\n const room = Math.max(0, effectiveMaxCount - existingCount);\n if (accepted.length > room) {\n const overflow = accepted.splice(room);\n for (const candidate of overflow) {\n rejected.push({ file: candidate, reason: \"count-exceeded\", maxCount: effectiveMaxCount });\n }\n }\n }\n\n return { accepted, rejected };\n}\n\nexport type FilePickerTriggerPlatform = \"web\" | \"native\";\nexport type FilePickerTrigger = \"button\" | \"dropzone\";\n\n/**\n * Drag-and-drop is a Web-only enhancement. `validateFilePickerTriggers`\n * enforces the roadmap's adaptive gate: Native never gets a dropzone, and no\n * platform may ship a dropzone without an always-reachable button — the same\n * \"automatic mode keeps a manual fallback\" principle as LoadMore\n * (`src/load-more.ts`).\n */\nexport const filePickerTriggerDefaults = {\n web: [\"button\", \"dropzone\"],\n native: [\"button\"],\n} as const satisfies Record<FilePickerTriggerPlatform, readonly FilePickerTrigger[]>;\n\nexport function validateFilePickerTriggers(\n platform: FilePickerTriggerPlatform,\n triggers: readonly FilePickerTrigger[],\n): void {\n if (triggers.length === 0) {\n throw new TypeError(\"FilePicker triggers must not be empty\");\n }\n if (!triggers.includes(\"button\")) {\n throw new TypeError(\"FilePicker must always expose a button trigger, even with a dropzone\");\n }\n if (platform === \"native\" && triggers.includes(\"dropzone\")) {\n throw new TypeError(\"FilePicker dropzone trigger is a Web-only enhancement\");\n }\n}\n\nexport type FilePickerDensity = \"compact\" | \"regular\";\n\nexport const filePickerRecipe = {\n slots: [\"root\", \"trigger\", \"dropzone\", \"hint\", \"error\"] as const,\n defaults: { density: \"regular\" },\n trigger: {\n minHeight: control.minTouchTarget,\n paddingHorizontal: spacing.md,\n radius: \"md\",\n color: semanticColors.content.brand,\n textVariant: \"label\",\n fontWeight: fontWeight.medium,\n },\n dropzone: {\n borderStyle: \"dashed\",\n borderWidth: stroke.default,\n borderColor: semanticColors.border.default,\n activeBorderColor: semanticColors.border.focus,\n activeBackground: semanticColors.interaction.focus,\n radius: \"lg\",\n padding: spacing.xl,\n },\n hint: {\n color: semanticColors.content.secondary,\n textVariant: \"label\",\n },\n error: {\n color: semanticColors.content.danger,\n textVariant: \"label\",\n },\n states: {\n focus: focusIndicatorContract,\n disabledOpacity: opacity.disabled,\n },\n} as const satisfies {\n slots: readonly [\"root\", \"trigger\", \"dropzone\", \"hint\", \"error\"];\n defaults: { density: FilePickerDensity };\n trigger: {\n minHeight: number;\n paddingHorizontal: number;\n radius: keyof typeof radius;\n color: ColorReference;\n textVariant: TextVariant;\n fontWeight: FontWeightValue;\n };\n dropzone: {\n borderStyle: \"dashed\";\n borderWidth: number;\n borderColor: ColorReference;\n activeBorderColor: ColorReference;\n activeBackground: ColorReference;\n radius: keyof typeof radius;\n padding: number;\n };\n hint: { color: ColorReference; textVariant: TextVariant };\n error: { color: ColorReference; textVariant: TextVariant };\n states: { focus: typeof focusIndicatorContract; disabledOpacity: number };\n};\n\n/**\n * No `open`/dismiss axis: the platform picker sheet is transient OS chrome\n * FilePicker does not model, unlike Select/Sheet which own their surface.\n */\nexport const filePickerBehavior = {\n controlled: [],\n inputs: [\"descriptor\", \"existingCount\"],\n events: [\"onSelect\"],\n configuration: { mode: [\"single\", \"multiple\"] },\n defaults: filePickerDefaults,\n stateAxes: {\n availability: [\"enabled\", \"disabled\"],\n interaction: [\"idle\", \"hover\", \"focusVisible\", \"pressed\", \"dragged\"],\n },\n web: {\n roles: [\"button\"],\n keyboard: [\"Tab\", \"Enter\", \"Space\"],\n focus: \"native\",\n },\n native: {\n roles: [\"button\"],\n states: [\"disabled\"],\n actions: [\"activate\"],\n },\n scenarios: [\n \"selecting-files-never-mutates-already-accepted-items\",\n \"rejected-files-report-a-reason-without-blocking-the-rest-of-the-batch\",\n \"type-and-size-are-judged-at-selection-time-not-upload-time\",\n \"count-cap-accounts-for-already-selected-items-across-repeated-picks\",\n \"single-mode-behaves-as-an-implicit-one-file-count-cap\",\n \"web-dropzone-is-always-paired-with-a-reachable-button-trigger\",\n \"native-never-exposes-a-dropzone-trigger\",\n \"rejection-is-announced-without-relying-on-color-alone\",\n ],\n} as const satisfies BehaviorContract;\n"]}
@@ -95,17 +95,17 @@ export declare const typography: {
95
95
  readonly title: {
96
96
  readonly fontSize: 18;
97
97
  readonly lineHeight: 26;
98
- readonly fontWeight: "600";
98
+ readonly fontWeight: "500";
99
99
  };
100
100
  readonly titleLarge: {
101
101
  readonly fontSize: 20;
102
102
  readonly lineHeight: 28;
103
- readonly fontWeight: "600";
103
+ readonly fontWeight: "500";
104
104
  };
105
105
  readonly heading: {
106
106
  readonly fontSize: 24;
107
107
  readonly lineHeight: 32;
108
- readonly fontWeight: "600";
108
+ readonly fontWeight: "500";
109
109
  };
110
110
  };
111
111
  export type TextVariant = keyof typeof typography;
@@ -113,34 +113,38 @@ export type TextVariant = keyof typeof typography;
113
113
  export declare function resolveTextFontRole(variant: TextVariant, role?: FontRole): FontRole;
114
114
  /**
115
115
  * Document heading hierarchy without widening the established `TextVariant`
116
- * union. Levels 3–5 reuse the existing semantic styles; larger levels are
117
- * additive display roles for dense product pages and documentation.
116
+ * union. Every level reuses a semantic text style, so no heading exceeds `typography.heading`.
118
117
  */
119
118
  export declare const heading: {
119
+ /**
120
+ * @deprecated Same as `level3` since the display tier was removed (2026-10-17 user decision, "큰 글자
121
+ * 정책은 없애"; it was 40/48/600). Kept so existing consumers keep compiling; use `level3`.
122
+ */
120
123
  readonly level1: {
121
- readonly fontSize: 40;
122
- readonly lineHeight: 48;
123
- readonly fontWeight: "700";
124
+ readonly fontSize: 24;
125
+ readonly lineHeight: 32;
126
+ readonly fontWeight: "500";
124
127
  };
128
+ /** @deprecated Same as `level3` since the display tier was removed (was 32/40/600); use `level3`. */
125
129
  readonly level2: {
126
- readonly fontSize: 32;
127
- readonly lineHeight: 40;
128
- readonly fontWeight: "700";
130
+ readonly fontSize: 24;
131
+ readonly lineHeight: 32;
132
+ readonly fontWeight: "500";
129
133
  };
130
134
  readonly level3: {
131
135
  readonly fontSize: 24;
132
136
  readonly lineHeight: 32;
133
- readonly fontWeight: "600";
137
+ readonly fontWeight: "500";
134
138
  };
135
139
  readonly level4: {
136
140
  readonly fontSize: 20;
137
141
  readonly lineHeight: 28;
138
- readonly fontWeight: "600";
142
+ readonly fontWeight: "500";
139
143
  };
140
144
  readonly level5: {
141
145
  readonly fontSize: 18;
142
146
  readonly lineHeight: 26;
143
- readonly fontWeight: "600";
147
+ readonly fontWeight: "500";
144
148
  };
145
149
  };
146
150
  export type HeadingLevel = keyof typeof heading;
@@ -1 +1 @@
1
- {"version":3,"file":"foundations.d.ts","sourceRoot":"","sources":["../src/foundations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"foundations.d.ts","sourceRoot":"","sources":["../src/foundations.ts"],"names":[],"mappings":"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"}
@@ -93,16 +93,19 @@ export const numeric = {
93
93
  };
94
94
  export const typography = {
95
95
  caption: { fontSize: 11, lineHeight: 16, fontWeight: fontWeight.regular },
96
- // Label (form labels, section subtitles) sits between body 400 and titles 600: at 600 it competed with
97
- // titles, and Text rendered it 400 outside a profile, too weak against body (2026-10-17 user decision).
96
+ // Label (form labels, section subtitles) stays 500 between body 400 and the titles: at 600 it competed
97
+ // with titles, and Text rendered it 400 outside a profile, too weak against body (2026-10-17 user decision).
98
98
  label: { fontSize: 12, lineHeight: 18, fontWeight: fontWeight.medium },
99
99
  body: { fontSize: 14, lineHeight: 20, fontWeight: fontWeight.regular },
100
100
  bodyLarge: { fontSize: 16, lineHeight: 24, fontWeight: fontWeight.regular },
101
- // Title steps are semibold (2026-10-17 user review: 800, then 700, still read too heavy on route
102
- // titles). Display levels 1–2 are bold, see `heading`.
103
- title: { fontSize: 18, lineHeight: 26, fontWeight: fontWeight.semibold },
104
- titleLarge: { fontSize: 20, lineHeight: 28, fontWeight: fontWeight.semibold },
105
- heading: { fontSize: 24, lineHeight: 32, fontWeight: fontWeight.semibold },
101
+ // Title steps are medium (2026-10-17 user review: 800, then 700, then 600 still read too heavy —
102
+ // "굵기 좀더 줄여").
103
+ title: { fontSize: 18, lineHeight: 26, fontWeight: fontWeight.medium },
104
+ titleLarge: { fontSize: 20, lineHeight: 28, fontWeight: fontWeight.medium },
105
+ // `heading` is the largest text HJM draws. 2026-10-17 user decision ("글자 너무 커", "큰 글자 정책은 없애"):
106
+ // the 40/32 display tier looked far too big on the service-intro screen and was removed; design profiles
107
+ // reject any type step above this size (design-profile.ts `merge`).
108
+ heading: { fontSize: 24, lineHeight: 32, fontWeight: fontWeight.medium },
106
109
  };
107
110
  /** Visual variants choose a default family role; semantics and sizes remain independent. */
108
111
  export function resolveTextFontRole(variant, role) {
@@ -119,14 +122,16 @@ export function resolveTextFontRole(variant, role) {
119
122
  }
120
123
  /**
121
124
  * Document heading hierarchy without widening the established `TextVariant`
122
- * union. Levels 3–5 reuse the existing semantic styles; larger levels are
123
- * additive display roles for dense product pages and documentation.
125
+ * union. Every level reuses a semantic text style, so no heading exceeds `typography.heading`.
124
126
  */
125
127
  export const heading = {
126
- // Bold, not heavy: Pretendard 800 read heavy and rough at 32–40px (2026-10-17 user decision), while
127
- // staying one step above the semibold title levels 3–5.
128
- level1: { fontSize: 40, lineHeight: 48, fontWeight: fontWeight.bold },
129
- level2: { fontSize: 32, lineHeight: 40, fontWeight: fontWeight.bold },
128
+ /**
129
+ * @deprecated Same as `level3` since the display tier was removed (2026-10-17 user decision, "큰 글자
130
+ * 정책은 없애"; it was 40/48/600). Kept so existing consumers keep compiling; use `level3`.
131
+ */
132
+ level1: typography.heading,
133
+ /** @deprecated Same as `level3` since the display tier was removed (was 32/40/600); use `level3`. */
134
+ level2: typography.heading,
130
135
  level3: typography.heading,
131
136
  level4: typography.titleLarge,
132
137
  level5: typography.title,