@hjmds/design-contracts 1.26.1 → 1.27.1

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 (278) hide show
  1. package/dist/agreement.d.ts +1 -0
  2. package/dist/agreement.d.ts.map +1 -1
  3. package/dist/agreement.js +2 -1
  4. package/dist/agreement.js.map +1 -1
  5. package/dist/auth-screen.d.ts +1 -1
  6. package/dist/behaviors.d.ts +1 -1
  7. package/dist/calendar.d.ts +1 -0
  8. package/dist/calendar.d.ts.map +1 -1
  9. package/dist/calendar.js +4 -1
  10. package/dist/calendar.js.map +1 -1
  11. package/dist/catalog.d.ts +78 -30
  12. package/dist/catalog.d.ts.map +1 -1
  13. package/dist/catalog.js +10 -5
  14. package/dist/catalog.js.map +1 -1
  15. package/dist/chart.d.ts +2 -0
  16. package/dist/chart.d.ts.map +1 -1
  17. package/dist/chart.js +1 -1
  18. package/dist/chart.js.map +1 -1
  19. package/dist/component-definitions.d.ts +1 -0
  20. package/dist/component-definitions.d.ts.map +1 -1
  21. package/dist/component-definitions.js +1 -0
  22. package/dist/component-definitions.js.map +1 -1
  23. package/dist/component-recipes.d.ts +53 -6
  24. package/dist/component-recipes.d.ts.map +1 -1
  25. package/dist/component-recipes.js +64 -10
  26. package/dist/component-recipes.js.map +1 -1
  27. package/dist/data-table.d.ts +11 -0
  28. package/dist/data-table.d.ts.map +1 -1
  29. package/dist/data-table.js +5 -0
  30. package/dist/data-table.js.map +1 -1
  31. package/dist/description-list.d.ts +3 -0
  32. package/dist/description-list.d.ts.map +1 -1
  33. package/dist/description-list.js +5 -1
  34. package/dist/description-list.js.map +1 -1
  35. package/dist/design-profile-layout.d.ts +28 -0
  36. package/dist/design-profile-layout.d.ts.map +1 -1
  37. package/dist/design-profile-layout.js +27 -3
  38. package/dist/design-profile-layout.js.map +1 -1
  39. package/dist/design-profile.d.ts.map +1 -1
  40. package/dist/design-profile.js +40 -8
  41. package/dist/design-profile.js.map +1 -1
  42. package/dist/field-group.d.ts +13 -0
  43. package/dist/field-group.d.ts.map +1 -1
  44. package/dist/field-group.js +17 -2
  45. package/dist/field-group.js.map +1 -1
  46. package/dist/foundations.d.ts +24 -11
  47. package/dist/foundations.d.ts.map +1 -1
  48. package/dist/foundations.js +40 -7
  49. package/dist/foundations.js.map +1 -1
  50. package/dist/heading.d.ts +5 -5
  51. package/dist/image-choice.d.ts +23 -0
  52. package/dist/image-choice.d.ts.map +1 -0
  53. package/dist/image-choice.js +26 -0
  54. package/dist/image-choice.js.map +1 -0
  55. package/dist/index.d.ts +1 -1
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +1 -1
  58. package/dist/index.js.map +1 -1
  59. package/dist/masonry.d.ts +8 -0
  60. package/dist/masonry.d.ts.map +1 -1
  61. package/dist/masonry.js +12 -1
  62. package/dist/masonry.js.map +1 -1
  63. package/dist/number-field.d.ts +2 -2
  64. package/dist/number-field.d.ts.map +1 -1
  65. package/dist/number-field.js +4 -2
  66. package/dist/number-field.js.map +1 -1
  67. package/dist/qr-code-recipe.d.ts +1 -0
  68. package/dist/qr-code-recipe.d.ts.map +1 -1
  69. package/dist/qr-code-recipe.js +3 -1
  70. package/dist/qr-code-recipe.js.map +1 -1
  71. package/dist/recipes.d.ts +1 -1
  72. package/dist/recipes.d.ts.map +1 -1
  73. package/dist/recipes.js +1 -1
  74. package/dist/recipes.js.map +1 -1
  75. package/dist/result.d.ts +9 -0
  76. package/dist/result.d.ts.map +1 -1
  77. package/dist/result.js +5 -0
  78. package/dist/result.js.map +1 -1
  79. package/dist/screen-patterns.d.ts +139 -2
  80. package/dist/screen-patterns.d.ts.map +1 -1
  81. package/dist/screen-patterns.js +140 -1
  82. package/dist/screen-patterns.js.map +1 -1
  83. package/dist/sheet.d.ts +15 -1
  84. package/dist/sheet.d.ts.map +1 -1
  85. package/dist/sheet.js +20 -1
  86. package/dist/sheet.js.map +1 -1
  87. package/dist/showcase.d.ts +27 -27
  88. package/dist/showcase.js +27 -27
  89. package/dist/showcase.js.map +1 -1
  90. package/dist/tag.d.ts +10 -2
  91. package/dist/tag.d.ts.map +1 -1
  92. package/dist/tag.js +3 -2
  93. package/dist/tag.js.map +1 -1
  94. package/dist/tags-input.d.ts +6 -0
  95. package/dist/tags-input.d.ts.map +1 -1
  96. package/dist/tags-input.js +3 -1
  97. package/dist/tags-input.js.map +1 -1
  98. package/dist/text-formats.d.ts +2 -2
  99. package/dist/top.d.ts +2 -2
  100. package/dist/transfer-list.d.ts +1 -1
  101. package/dist/transfer-list.d.ts.map +1 -1
  102. package/dist/transfer-list.js +2 -1
  103. package/dist/transfer-list.js.map +1 -1
  104. package/dist/upload-item.d.ts +1 -10
  105. package/dist/upload-item.d.ts.map +1 -1
  106. package/dist/upload-item.js +1 -2
  107. package/dist/upload-item.js.map +1 -1
  108. package/dist/version.d.ts +1 -1
  109. package/dist/version.js +1 -1
  110. package/dist/version.js.map +1 -1
  111. package/docs/activity-chip.md +4 -3
  112. package/docs/catalog-freeze.json +5 -2
  113. package/docs/chart.md +1 -1
  114. package/docs/consumer-policy.md +13 -6
  115. package/docs/description-list.md +4 -0
  116. package/docs/design-profile.md +28 -2
  117. package/docs/font-roles.md +1 -1
  118. package/docs/generated/component-maturity.md +5 -4
  119. package/docs/generated/renderer-evidence.json +92 -6
  120. package/docs/generated/renderer-evidence.md +5 -3
  121. package/docs/generated/showcase-manifest.json +49 -1
  122. package/docs/gravity-letters.md +7 -2
  123. package/docs/masonry.md +4 -2
  124. package/docs/screen-patterns.md +5 -2
  125. package/docs/showcase.md +7 -9
  126. package/docs/stable-promotion.md +13 -1
  127. package/docs/usage/README.md +40 -10
  128. package/docs/usage/SELECTION.md +30 -4
  129. package/docs/usage/STANDARD.md +11 -2
  130. package/docs/usage/components/account-switcher.md +98 -0
  131. package/docs/usage/components/activity-chip.md +4 -4
  132. package/docs/usage/components/badge.md +1 -1
  133. package/docs/usage/components/bezier-editor.md +99 -0
  134. package/docs/usage/components/bottom-cta.md +2 -1
  135. package/docs/usage/components/button.md +26 -12
  136. package/docs/usage/components/carousel.md +4 -4
  137. package/docs/usage/components/chart.md +1 -0
  138. package/docs/usage/components/chat-message.md +18 -12
  139. package/docs/usage/components/chat-screen.md +6 -3
  140. package/docs/usage/components/cohort-retention-table.md +83 -0
  141. package/docs/usage/components/collapsible.md +7 -2
  142. package/docs/usage/components/comment-thread-row.md +102 -0
  143. package/docs/usage/components/comment-thread-screen.md +27 -13
  144. package/docs/usage/components/composition-layout.md +1 -0
  145. package/docs/usage/components/context-menu.md +32 -15
  146. package/docs/usage/components/conversation-row.md +11 -4
  147. package/docs/usage/components/conversion-funnel.md +85 -0
  148. package/docs/usage/components/correlation-matrix.md +80 -0
  149. package/docs/usage/components/data-table.md +4 -0
  150. package/docs/usage/components/description-list.md +2 -1
  151. package/docs/usage/components/editor-screen.md +9 -5
  152. package/docs/usage/components/effect-surface.md +4 -2
  153. package/docs/usage/components/empty-state.md +2 -2
  154. package/docs/usage/components/event-attendance-card.md +104 -0
  155. package/docs/usage/components/expandable-search.md +105 -0
  156. package/docs/usage/components/file-picker.md +5 -0
  157. package/docs/usage/components/filter-recovery.md +97 -0
  158. package/docs/usage/components/follow-profile-card.md +100 -0
  159. package/docs/usage/components/heading.md +6 -2
  160. package/docs/usage/components/histogram-explorer.md +89 -0
  161. package/docs/usage/components/icon-button.md +18 -2
  162. package/docs/usage/components/icon-tile.md +12 -4
  163. package/docs/usage/components/image-choice-group.md +81 -0
  164. package/docs/usage/components/import-field-mapping.md +94 -0
  165. package/docs/usage/components/inline-edit.md +105 -0
  166. package/docs/usage/components/keyboard-avoidance-context.md +60 -0
  167. package/docs/usage/components/keyboard-avoiding.md +5 -1
  168. package/docs/usage/components/list-detail-screen.md +4 -4
  169. package/docs/usage/components/list.md +1 -1
  170. package/docs/usage/components/masonry.md +6 -7
  171. package/docs/usage/components/media-selection-screen.md +7 -5
  172. package/docs/usage/components/media-transport.md +104 -0
  173. package/docs/usage/components/message-composer.md +13 -3
  174. package/docs/usage/components/moderation-screen.md +5 -2
  175. package/docs/usage/components/notification-inbox-screen.md +3 -3
  176. package/docs/usage/components/notification-row.md +64 -8
  177. package/docs/usage/components/onboarding-screen.md +1 -1
  178. package/docs/usage/components/overview-screen.md +9 -3
  179. package/docs/usage/components/pagination.md +18 -3
  180. package/docs/usage/components/password-rules-field.md +90 -0
  181. package/docs/usage/components/permission-screen.md +1 -1
  182. package/docs/usage/components/photo-source-sheet.md +1 -1
  183. package/docs/usage/components/popover.md +6 -3
  184. package/docs/usage/components/pricing-choice.md +85 -0
  185. package/docs/usage/components/profile-summary.md +56 -8
  186. package/docs/usage/components/progress.md +3 -3
  187. package/docs/usage/components/qr-code.md +5 -9
  188. package/docs/usage/components/repeatable-field-group.md +92 -0
  189. package/docs/usage/components/reply-composer.md +83 -0
  190. package/docs/usage/components/reply-message.md +85 -0
  191. package/docs/usage/components/result.md +3 -3
  192. package/docs/usage/components/saved-items-screen.md +7 -5
  193. package/docs/usage/components/screen-layout.md +21 -10
  194. package/docs/usage/components/search-field.md +1 -1
  195. package/docs/usage/components/section.md +2 -2
  196. package/docs/usage/components/selection-action-bar.md +89 -0
  197. package/docs/usage/components/settings-screen.md +13 -11
  198. package/docs/usage/components/sheet.md +19 -7
  199. package/docs/usage/components/shortcut-recorder.md +77 -0
  200. package/docs/usage/components/split-action.md +94 -0
  201. package/docs/usage/components/streaming-answer.md +94 -0
  202. package/docs/usage/components/switch.md +6 -2
  203. package/docs/usage/components/table-column-settings.md +88 -0
  204. package/docs/usage/components/target-summary.md +79 -0
  205. package/docs/usage/components/text.md +11 -5
  206. package/docs/usage/components/toggle-feedback-button.md +94 -0
  207. package/docs/usage/components/top-bar.md +8 -12
  208. package/docs/usage/components/transfer-task.md +87 -0
  209. package/docs/usage/compositions/action-recovery-optimistic.md +18 -14
  210. package/docs/usage/compositions/action-recovery-save.md +18 -14
  211. package/docs/usage/compositions/action-recovery-undo.md +18 -14
  212. package/docs/usage/compositions/activity-status.md +1 -1
  213. package/docs/usage/compositions/adaptive-content.md +2 -1
  214. package/docs/usage/compositions/collection-detail.md +6 -5
  215. package/docs/usage/compositions/collection-editing.md +13 -6
  216. package/docs/usage/compositions/command-records.md +5 -4
  217. package/docs/usage/compositions/communication.md +7 -5
  218. package/docs/usage/compositions/compound-controls.md +7 -3
  219. package/docs/usage/compositions/content-transition-comparison.md +10 -5
  220. package/docs/usage/compositions/data-layouts.md +12 -16
  221. package/docs/usage/compositions/data-workflows.md +7 -4
  222. package/docs/usage/compositions/date-time-selection.md +5 -5
  223. package/docs/usage/compositions/design-profile-comparison.md +22 -6
  224. package/docs/usage/compositions/disclosure.md +14 -9
  225. package/docs/usage/compositions/document-resource.md +1 -1
  226. package/docs/usage/compositions/environment-matrix.md +16 -12
  227. package/docs/usage/compositions/expo-interactions.md +9 -8
  228. package/docs/usage/compositions/family-drawer.md +9 -5
  229. package/docs/usage/compositions/field-group.md +7 -3
  230. package/docs/usage/compositions/interaction-adapters.md +11 -9
  231. package/docs/usage/compositions/interaction-flow-apply.md +17 -15
  232. package/docs/usage/compositions/interaction-flow-search.md +11 -7
  233. package/docs/usage/compositions/live-list.md +12 -8
  234. package/docs/usage/compositions/navigation-bar-collection.md +8 -3
  235. package/docs/usage/compositions/optional-motion.md +2 -2
  236. package/docs/usage/compositions/paper-surface.md +11 -6
  237. package/docs/usage/compositions/purpose-input-comment.md +10 -4
  238. package/docs/usage/compositions/purpose-input-message.md +10 -4
  239. package/docs/usage/compositions/reference-first.md +4 -4
  240. package/docs/usage/compositions/reference-review.md +4 -4
  241. package/docs/usage/compositions/reference-settings.md +4 -4
  242. package/docs/usage/compositions/selection-motion.md +2 -1
  243. package/docs/usage/compositions/social-compositions.md +7 -6
  244. package/docs/usage/compositions/stea-event-ticket.md +2 -4
  245. package/docs/usage/compositions/stea-order-progress.md +19 -21
  246. package/docs/usage/compositions/stea-pixel-empty.md +26 -26
  247. package/docs/usage/compositions/task-controls.md +7 -2
  248. package/docs/usage/compositions/texture-comparison.md +5 -5
  249. package/docs/usage/compositions/toast-layout.md +7 -3
  250. package/docs/usage/compositions/toggle-feedback.md +1 -1
  251. package/docs/usage/compositions/visual-foundations.md +10 -5
  252. package/docs/usage/compositions/web-additions.md +5 -1
  253. package/docs/usage/screens/common-chat.md +5 -3
  254. package/docs/usage/screens/common-comments.md +14 -9
  255. package/docs/usage/screens/common-conversation-list.md +109 -0
  256. package/docs/usage/screens/common-inbox.md +5 -3
  257. package/docs/usage/screens/common-login.md +7 -4
  258. package/docs/usage/screens/common-profile.md +16 -12
  259. package/docs/usage/screens/common-saved.md +12 -8
  260. package/docs/usage/screens/common-search.md +16 -8
  261. package/docs/usage/screens/common-settings.md +12 -11
  262. package/docs/usage/screens/common-shell.md +12 -10
  263. package/docs/usage/screens/dashboard.md +59 -56
  264. package/docs/usage/screens/discovery-gallery.md +18 -9
  265. package/docs/usage/screens/flow-collection.md +10 -6
  266. package/docs/usage/screens/flow-editor.md +9 -6
  267. package/docs/usage/screens/flow-media.md +12 -7
  268. package/docs/usage/screens/flow-moderation.md +9 -3
  269. package/docs/usage/screens/flow-onboarding.md +13 -8
  270. package/docs/usage/screens/flow-permission.md +5 -3
  271. package/docs/usage/screens/landing.md +20 -14
  272. package/docs/usage/screens/mockup-studio.md +100 -88
  273. package/docs/usage/screens/notification-settings.md +9 -7
  274. package/docs/usage/screens/product-bento.md +22 -10
  275. package/docs/usage/screens/reference-comparison.md +2 -2
  276. package/docs/usage/tokens/font-roles.md +18 -2
  277. package/docs/usage/tokens/typography.md +22 -11
  278. package/package.json +7 -1
@@ -10,6 +10,10 @@ const neutral = {
10
10
  compositions: { collection: "rows", toolbar: "inline" },
11
11
  screens: { overview: "dashboard" },
12
12
  };
13
+ /** System serif stack for editorial's display/reading roles; nothing is downloaded. `ui-serif` comes first because
14
+ * Safari maps it to New York and Native translates it to the host serif (Chrome skips it). AppleMyungjo/Batang/
15
+ * Noto Serif KR give Hangul a serif face where installed; otherwise Hangul falls back to the host font. */
16
+ const serifStack = ["ui-serif", "Iowan Old Style", "Georgia", "AppleMyungjo", "Batang", "Noto Serif KR", "serif"];
13
17
  /** Profiles deliberately differ in interaction and arrangement, not just hue.
14
18
  * No font asset is bundled or implied: custom font loading remains product-owned. */
15
19
  const presetInputs = {
@@ -51,24 +55,44 @@ const presetInputs = {
51
55
  compositions: { collection: "cards", toolbar: "collapsible" },
52
56
  screens: { overview: "landscape" },
53
57
  },
58
+ // minimal, editorial and terminal looked alike in light mode (near-white, only terminal's font differed) at the
59
+ // 2026-10-17 user review. Each now carries its identity through palette, type, elevation and arrangement together.
60
+ // minimal: achromatic hairlines on white, no shadow anywhere (overlays rely on their border and scrim), quiet
61
+ // medium-weight headings, airy body leading and framed cards for the generous card padding.
54
62
  minimal: {
55
63
  id: "minimal",
56
- palette: { light: { primary: "#404040", contentBrand: "#333333", surfaceAccent: "#eeeeee" }, dark: { primary: "#727272", contentBrand: "#dddddd", surfaceAccent: "#303030" } },
57
- tokens: { radius: { sm: 4, md: 8, lg: 12, xl: 16 }, shadow: { raised: { opacity: 0 }, floating: { opacity: 0.08 } } },
64
+ palette: {
65
+ 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" },
66
+ 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" },
67
+ },
68
+ tokens: { radius: { sm: 4, md: 8, lg: 12, xl: 16 }, shadow: { raised: { opacity: 0 }, floating: { opacity: 0 } },
69
+ typography: { heading: { fontWeight: fontWeight.medium }, body: { lineHeight: 26 } },
70
+ heading: { level1: { fontWeight: fontWeight.medium }, level2: { fontWeight: fontWeight.medium } } },
58
71
  interactions: { contentTransition: "fade", selectionMotion: "none" },
59
- compositions: { collection: "rows", toolbar: "inline" }, screens: { overview: "dashboard" },
72
+ compositions: { collection: "cards", toolbar: "inline" }, screens: { overview: "dashboard" },
60
73
  },
74
+ // editorial: serif display and reading roles over a warm ink-on-paper palette with a deep wine accent, the largest
75
+ // display scale of the presets, flat print corners, and rows, which the shared layout divides with rule lines.
61
76
  editorial: {
62
77
  id: "editorial",
63
- palette: { light: { primary: "#59435f", contentBrand: "#513a57", surfaceAccent: "#eee4f0" }, dark: { primary: "#846b8e", contentBrand: "#ead0f2", surfaceAccent: "#392a3e" } },
64
- tokens: { radius: { sm: 0, md: 2, lg: 4, xl: 8 }, typography: { heading: { fontSize: 28, lineHeight: 38, fontWeight: fontWeight.medium }, body: { lineHeight: 24 } }, heading: { level1: { fontSize: 44, lineHeight: 54, fontWeight: fontWeight.medium }, level2: { fontSize: 34, lineHeight: 44, fontWeight: fontWeight.medium } } },
78
+ palette: {
79
+ 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" },
80
+ 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" },
81
+ },
82
+ tokens: { radius: { sm: 0, md: 2, lg: 2, xl: 4 }, fontFamily: { display: serifStack, reading: serifStack }, shadow: { raised: { opacity: 0 } },
83
+ typography: { heading: { fontSize: 30, lineHeight: 40, fontWeight: fontWeight.medium }, body: { lineHeight: 26 } },
84
+ heading: { level1: { fontSize: 56, lineHeight: 66, fontWeight: fontWeight.medium }, level2: { fontSize: 42, lineHeight: 52, fontWeight: fontWeight.medium } } },
65
85
  interactions: { contentTransition: "rise", selectionMotion: "none" },
66
86
  compositions: { collection: "rows", toolbar: "collapsible" }, screens: { overview: "editorial" },
67
87
  },
68
88
  brutalist: {
69
89
  id: "brutalist",
90
+ // level1/2 stay heavy (800) on purpose: the foundation display headings became bold (700) on 2026-10-17,
91
+ // but the user kept brutalist at 800 after comparing it in Storybook, because thick borders and hard
92
+ // shadows need the heaviest headings to hold their weight. Do not align this with the 700 default.
93
+ // docs/design-profile.md documents the same exception.
70
94
  palette: { light: { primary: "#171717", contentBrand: "#171717", surfaceAccent: "#e8ed91", border: "#171717" }, dark: { primary: "#727272", contentBrand: "#f0f3a3", surfaceAccent: "#393a1c", border: "#cccccc" } },
71
- 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 }, level2: { fontSize: 38, lineHeight: 46 } } },
95
+ 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 } } },
72
96
  interactions: { contentTransition: "slide", selectionMotion: "none" },
73
97
  compositions: { collection: "cards", toolbar: "inline" }, screens: { overview: "editorial" },
74
98
  },
@@ -91,10 +115,18 @@ const presetInputs = {
91
115
  interactions: { contentTransition: "scale", selectionMotion: "slide" },
92
116
  compositions: { collection: "grid", toolbar: "collapsible" }, screens: { overview: "landscape" },
93
117
  },
118
+ // terminal: monospace for every role (display/reading follow ui), square corners, no shadow, ruled rows, green
119
+ // phosphor primary with amber brand text. Dark is a black console. Light cannot be a black console: the accent
120
+ // foregrounds (ACCENTS.light, used by notices and status text) are fixed dark inks that the profile palette does not
121
+ // replace, so a dark light-mode canvas would pass the palette check yet leave them unreadable. Light therefore uses
122
+ // the darkest green-grey canvas on which those inks still reach 4.5:1 (about 4.6 on bg, 5.0 on surface).
94
123
  terminal: {
95
124
  id: "terminal",
96
- palette: { light: { primary: "#235837", contentBrand: "#245435", surfaceAccent: "#deefdf" }, dark: { primary: "#467f54", contentBrand: "#95e2a6", surfaceAccent: "#203b28" } },
97
- tokens: { radius: { sm: 2, md: 4, lg: 6, xl: 8 }, fontFamily: { ui: fontFamily.code }, shadow: { raised: { opacity: 0 }, floating: { radius: 0, offsetY: 0, opacity: 0 } } },
125
+ palette: {
126
+ 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" },
127
+ 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" },
128
+ },
129
+ 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 } } },
98
130
  interactions: { contentTransition: "fade", selectionMotion: "none" },
99
131
  compositions: { collection: "rows", toolbar: "collapsible" }, screens: { overview: "dashboard" },
100
132
  },
@@ -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/** 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: {\n id: \"minimal\",\n palette: { light: { primary: \"#404040\", contentBrand: \"#333333\", surfaceAccent: \"#eeeeee\" }, dark: { primary: \"#727272\", contentBrand: \"#dddddd\", surfaceAccent: \"#303030\" } },\n tokens: { radius: { sm: 4, md: 8, lg: 12, xl: 16 }, shadow: { raised: { opacity: 0 }, floating: { opacity: 0.08 } } },\n\n interactions: { contentTransition: \"fade\", selectionMotion: \"none\" },\n compositions: { collection: \"rows\", toolbar: \"inline\" }, screens: { overview: \"dashboard\" },\n },\n editorial: {\n id: \"editorial\",\n palette: { light: { primary: \"#59435f\", contentBrand: \"#513a57\", surfaceAccent: \"#eee4f0\" }, dark: { primary: \"#846b8e\", contentBrand: \"#ead0f2\", surfaceAccent: \"#392a3e\" } },\n tokens: { radius: { sm: 0, md: 2, lg: 4, xl: 8 }, typography: { heading: { fontSize: 28, lineHeight: 38, fontWeight: fontWeight.medium }, body: { lineHeight: 24 } }, heading: { level1: { fontSize: 44, lineHeight: 54, fontWeight: fontWeight.medium }, level2: { fontSize: 34, lineHeight: 44, fontWeight: fontWeight.medium } } },\n\n interactions: { contentTransition: \"rise\", selectionMotion: \"none\" },\n compositions: { collection: \"rows\", toolbar: \"collapsible\" }, screens: { overview: \"editorial\" },\n },\n brutalist: {\n id: \"brutalist\",\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 }, level2: { fontSize: 38, lineHeight: 46 } } },\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: {\n id: \"terminal\",\n palette: { light: { primary: \"#235837\", contentBrand: \"#245435\", surfaceAccent: \"#deefdf\" }, dark: { primary: \"#467f54\", contentBrand: \"#95e2a6\", surfaceAccent: \"#203b28\" } },\n tokens: { radius: { sm: 2, md: 4, lg: 6, xl: 8 }, fontFamily: { ui: fontFamily.code }, shadow: { raised: { opacity: 0 }, floating: { radius: 0, offsetY: 0, opacity: 0 } } },\n\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), 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"]}
@@ -7,9 +7,22 @@ export declare const fieldGroupRecipe: {
7
7
  readonly gap: "md";
8
8
  readonly headingGap: "sm";
9
9
  readonly supportGap: "xs";
10
+ /** The group name outranks its members' semibold body labels; a plain legend read weaker than "시/분/초" (2026-10-17 review). */
11
+ readonly heading: {
12
+ readonly textVariant: "bodyLarge";
13
+ readonly emphasis: "medium";
14
+ };
10
15
  readonly inline: {
16
+ /** @deprecated Renderers read `minWidth` (scaled by text size) so Web and Native wrap at the same width. */
11
17
  readonly minCharacters: 10;
12
18
  readonly minWidth: number;
19
+ /** Parts stop growing here so short values do not float in ~400px fields on desktop (2026-10-17 review). */
20
+ readonly maxWidth: number;
21
+ /**
22
+ * Parts of one value (hours/minutes/seconds, year/month/day) share a row only when all of them fit;
23
+ * otherwise every part stacks. Partial wrapping left seconds alone on a second row at 402pt.
24
+ */
25
+ readonly wrap: "all-or-none";
13
26
  };
14
27
  };
15
28
  /** Related-input grouping contract. Values and submit/validation timing remain product-owned. */
@@ -1 +1 @@
1
- {"version":3,"file":"field-group.d.ts","sourceRoot":"","sources":["../src/field-group.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAClD,sGAAsG;AACtG,eAAO,MAAM,gBAAgB;;;;;;;;;;;CAMnB,CAAC;AAEX,iGAAiG;AACjG,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8FAA8F;IAC9F,KAAK,CAAC,EAAE,QAAQ,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACnE,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACrC,CAAC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;IAC9C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,wFAAwF;IACxF,OAAO,EAAE,SAAS,QAAQ,CAAC;QAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;QAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;CACzG,CAAC,CAAC;AAMH,6FAA6F;AAC7F,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,wBAAwB,EAAE;iBAItE,SAAS,wBAAwB,EAAE;IAQhD,yFAAyF;;UAEnF,IAAI,SAAS,OAAO,EAAE,MAAM,MAAM,YAAY,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,IAAI;EAOxG;AAUD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,oBAAoB,GAAG,QAAQ,CAAC;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,SAAS,wBAAwB,EAAE,CAAC;CAC7C,CAAC,CA2CD"}
1
+ {"version":3,"file":"field-group.d.ts","sourceRoot":"","sources":["../src/field-group.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAClD,sGAAsG;AACtG,eAAO,MAAM,gBAAgB;;;;;;;IAK3B,8HAA8H;;;;;;QAG5H,4GAA4G;;;QAK5G,4GAA4G;;QAE5G;;;WAGG;;;CAGG,CAAC;AAEX,iGAAiG;AACjG,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8FAA8F;IAC9F,KAAK,CAAC,EAAE,QAAQ,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACnE,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACrC,CAAC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;IAC9C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,wFAAwF;IACxF,OAAO,EAAE,SAAS,QAAQ,CAAC;QAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;QAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;CACzG,CAAC,CAAC;AAMH,6FAA6F;AAC7F,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,wBAAwB,EAAE;iBAItE,SAAS,wBAAwB,EAAE;IAQhD,yFAAyF;;UAEnF,IAAI,SAAS,OAAO,EAAE,MAAM,MAAM,YAAY,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,IAAI;EAOxG;AAUD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,oBAAoB,GAAG,QAAQ,CAAC;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,SAAS,wBAAwB,EAAE,CAAC;CAC7C,CAAC,CA2CD"}
@@ -1,11 +1,26 @@
1
- import { spacing } from "./foundations.js";
1
+ import { control, spacing } from "./foundations.js";
2
2
  /** Date and duration parts share grouping, spacing and wrapping rather than rebuilding a fieldset. */
3
3
  export const fieldGroupRecipe = {
4
4
  defaults: { layout: "stack" },
5
5
  gap: "md",
6
6
  headingGap: "sm",
7
7
  supportGap: "xs",
8
- inline: { minCharacters: 10, minWidth: spacing.xxxl * 3 },
8
+ /** The group name outranks its members' semibold body labels; a plain legend read weaker than "시/분/초" (2026-10-17 review). */
9
+ heading: { textVariant: "bodyLarge", emphasis: "medium" },
10
+ inline: {
11
+ /** @deprecated Renderers read `minWidth` (scaled by text size) so Web and Native wrap at the same width. */
12
+ minCharacters: 10,
13
+ // Two 44pt steppers and a two-digit value: 120 (and Web's 10ch, about 96px) left a DurationField NumberField no
14
+ // room to draw its value at 402pt (2026-10-17 review).
15
+ minWidth: control.minTouchTarget * 2 + spacing.xxxl,
16
+ /** Parts stop growing here so short values do not float in ~400px fields on desktop (2026-10-17 review). */
17
+ maxWidth: (control.minTouchTarget * 2 + spacing.xxxl) * 1.5,
18
+ /**
19
+ * Parts of one value (hours/minutes/seconds, year/month/day) share a row only when all of them fit;
20
+ * otherwise every part stacks. Partial wrapping left seconds alone on a second row at 402pt.
21
+ */
22
+ wrap: "all-or-none",
23
+ },
9
24
  };
10
25
  function requireText(value, name) {
11
26
  if (typeof value !== "string" || !value.trim())
@@ -1 +1 @@
1
- {"version":3,"file":"field-group.js","sourceRoot":"","sources":["../src/field-group.ts"],"names":[],"mappings":"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","sourcesContent":["import { spacing } from \"./foundations.js\";\n\nexport type FieldGroupLayout = \"stack\" | \"inline\";\n/** Date and duration parts share grouping, spacing and wrapping rather than rebuilding a fieldset. */\nexport const fieldGroupRecipe = {\n defaults: { layout: \"stack\" },\n gap: \"md\",\n headingGap: \"sm\",\n supportGap: \"xs\",\n inline: { minCharacters: 10, minWidth: spacing.xxxl * 3 },\n} as const;\n\n/** Related-input grouping contract. Values and submit/validation timing remain product-owned. */\nexport type FieldGroupMember = Readonly<{\n id: string;\n label: string;\n description?: string;\n error?: string;\n disabled?: boolean;\n}>;\n\nexport type FieldGroupDescriptor = Readonly<{\n label: string;\n description?: string;\n disabled?: boolean;\n /** An empty fieldIds list is a group-only error, not a reason to mark every field invalid. */\n error?: Readonly<{ message: string; fieldIds: readonly string[] }>;\n fields: readonly FieldGroupMember[];\n}>;\n\nexport type ResolvedFieldGroupMember = Readonly<{\n id: string;\n label: string;\n groupLabel: string;\n disabled: boolean;\n invalid: boolean;\n /** Renderers associate these messages without replacing a field's own help or error. */\n support: readonly Readonly<{ scope: \"group\" | \"field\"; kind: \"description\" | \"error\"; text: string }>[];\n}>;\n\nfunction requireText(value: unknown, name: string): asserts value is string {\n if (typeof value !== \"string\" || !value.trim()) throw new TypeError(`Field group ${name} must be nonempty text`);\n}\n\n/** Late native events and retained callbacks must use the current committed group policy. */\nexport function createFieldGroupEditSession(fields: readonly ResolvedFieldGroupMember[]) {\n let enabled = new Set(fields.filter(field => !field.disabled).map(field => field.id));\n const members = new Map(fields.map(field => [field.id, {}]));\n return {\n update(next: readonly ResolvedFieldGroupMember[]) {\n const current = new Set(next.map(field => field.id));\n // A reused id is a new mounted field after removal. Checking only enabled ids\n // would revive queued events from the old field and overwrite the new draft.\n for (const id of members.keys()) if (!current.has(id)) members.delete(id);\n for (const id of current) if (!members.has(id)) members.set(id, {});\n enabled = new Set(next.filter(field => !field.disabled).map(field => field.id));\n },\n /** Effect cleanup blocks events without treating Strict Mode replay as field removal. */\n suspend() { enabled.clear(); },\n guard<Args extends unknown[]>(id: string, callback: (...args: Args) => void): (...args: Args) => void {\n // A new host binds during render, before its committed policy enables it.\n if (!members.has(id)) members.set(id, {});\n const member = members.get(id);\n return (...args) => { if (members.get(id) === member && enabled.has(id)) callback(...args); };\n },\n };\n}\n\nfunction optionalText(value: unknown, name: string): void {\n if (value !== undefined) requireText(value, name);\n}\n\nfunction optionalBoolean(value: unknown): void {\n if (value !== undefined && typeof value !== \"boolean\") throw new TypeError(\"Field group disabled must be boolean\");\n}\n\nexport function resolveFieldGroup(descriptor: FieldGroupDescriptor): Readonly<{\n label: string;\n description: string | undefined;\n error: string | undefined;\n disabled: boolean;\n fields: readonly ResolvedFieldGroupMember[];\n}> {\n requireText(descriptor.label, \"label\");\n optionalText(descriptor.description, \"description\");\n optionalBoolean(descriptor.disabled);\n if (!Array.isArray(descriptor.fields)) throw new TypeError(\"Field group fields must be an array\");\n const ids = new Set<string>();\n for (const field of descriptor.fields) {\n requireText(field.id, \"field id\");\n requireText(field.label, \"field label\");\n optionalText(field.description, \"field description\");\n optionalText(field.error, \"field error\");\n optionalBoolean(field.disabled);\n if (ids.has(field.id)) throw new TypeError(\"Field group field ids must be unique\");\n ids.add(field.id);\n }\n if (descriptor.error !== undefined) {\n requireText(descriptor.error.message, \"error\");\n const affected = descriptor.error.fieldIds;\n // A typo or removed field must not silently lose its validation feedback.\n // Products update the visible error with their dynamic field list atomically.\n if (!Array.isArray(affected) || new Set(affected).size !== affected.length || affected.some(id => !ids.has(id))) {\n throw new TypeError(\"Field group error must reference distinct current field ids\");\n }\n }\n const disabled = descriptor.disabled ?? false;\n return Object.freeze({\n label: descriptor.label,\n description: descriptor.description,\n error: descriptor.error?.message,\n disabled,\n fields: Object.freeze(descriptor.fields.map(field => {\n const groupError = descriptor.error?.fieldIds.includes(field.id) ? descriptor.error.message : undefined;\n const support: ResolvedFieldGroupMember[\"support\"][number][] = [];\n if (descriptor.description !== undefined) support.push({ scope: \"group\", kind: \"description\", text: descriptor.description });\n if (field.description !== undefined) support.push({ scope: \"field\", kind: \"description\", text: field.description });\n if (field.error !== undefined) support.push({ scope: \"field\", kind: \"error\", text: field.error });\n if (groupError !== undefined) support.push({ scope: \"group\", kind: \"error\", text: groupError });\n return Object.freeze({ id: field.id, label: field.label, groupLabel: descriptor.label,\n // Group unlock restores independently disabled members; it never enables them.\n disabled: disabled || (field.disabled ?? false), invalid: field.error !== undefined || groupError !== undefined,\n support: Object.freeze(support.map(message => Object.freeze(message))) });\n })),\n });\n}\n"]}
1
+ {"version":3,"file":"field-group.js","sourceRoot":"","sources":["../src/field-group.ts"],"names":[],"mappings":"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","sourcesContent":["import { control, spacing } from \"./foundations.js\";\n\nexport type FieldGroupLayout = \"stack\" | \"inline\";\n/** Date and duration parts share grouping, spacing and wrapping rather than rebuilding a fieldset. */\nexport const fieldGroupRecipe = {\n defaults: { layout: \"stack\" },\n gap: \"md\",\n headingGap: \"sm\",\n supportGap: \"xs\",\n /** The group name outranks its members' semibold body labels; a plain legend read weaker than \"시/분/초\" (2026-10-17 review). */\n heading: { textVariant: \"bodyLarge\", emphasis: \"medium\" },\n inline: {\n /** @deprecated Renderers read `minWidth` (scaled by text size) so Web and Native wrap at the same width. */\n minCharacters: 10,\n // Two 44pt steppers and a two-digit value: 120 (and Web's 10ch, about 96px) left a DurationField NumberField no\n // room to draw its value at 402pt (2026-10-17 review).\n minWidth: control.minTouchTarget * 2 + spacing.xxxl,\n /** Parts stop growing here so short values do not float in ~400px fields on desktop (2026-10-17 review). */\n maxWidth: (control.minTouchTarget * 2 + spacing.xxxl) * 1.5,\n /**\n * Parts of one value (hours/minutes/seconds, year/month/day) share a row only when all of them fit;\n * otherwise every part stacks. Partial wrapping left seconds alone on a second row at 402pt.\n */\n wrap: \"all-or-none\",\n },\n} as const;\n\n/** Related-input grouping contract. Values and submit/validation timing remain product-owned. */\nexport type FieldGroupMember = Readonly<{\n id: string;\n label: string;\n description?: string;\n error?: string;\n disabled?: boolean;\n}>;\n\nexport type FieldGroupDescriptor = Readonly<{\n label: string;\n description?: string;\n disabled?: boolean;\n /** An empty fieldIds list is a group-only error, not a reason to mark every field invalid. */\n error?: Readonly<{ message: string; fieldIds: readonly string[] }>;\n fields: readonly FieldGroupMember[];\n}>;\n\nexport type ResolvedFieldGroupMember = Readonly<{\n id: string;\n label: string;\n groupLabel: string;\n disabled: boolean;\n invalid: boolean;\n /** Renderers associate these messages without replacing a field's own help or error. */\n support: readonly Readonly<{ scope: \"group\" | \"field\"; kind: \"description\" | \"error\"; text: string }>[];\n}>;\n\nfunction requireText(value: unknown, name: string): asserts value is string {\n if (typeof value !== \"string\" || !value.trim()) throw new TypeError(`Field group ${name} must be nonempty text`);\n}\n\n/** Late native events and retained callbacks must use the current committed group policy. */\nexport function createFieldGroupEditSession(fields: readonly ResolvedFieldGroupMember[]) {\n let enabled = new Set(fields.filter(field => !field.disabled).map(field => field.id));\n const members = new Map(fields.map(field => [field.id, {}]));\n return {\n update(next: readonly ResolvedFieldGroupMember[]) {\n const current = new Set(next.map(field => field.id));\n // A reused id is a new mounted field after removal. Checking only enabled ids\n // would revive queued events from the old field and overwrite the new draft.\n for (const id of members.keys()) if (!current.has(id)) members.delete(id);\n for (const id of current) if (!members.has(id)) members.set(id, {});\n enabled = new Set(next.filter(field => !field.disabled).map(field => field.id));\n },\n /** Effect cleanup blocks events without treating Strict Mode replay as field removal. */\n suspend() { enabled.clear(); },\n guard<Args extends unknown[]>(id: string, callback: (...args: Args) => void): (...args: Args) => void {\n // A new host binds during render, before its committed policy enables it.\n if (!members.has(id)) members.set(id, {});\n const member = members.get(id);\n return (...args) => { if (members.get(id) === member && enabled.has(id)) callback(...args); };\n },\n };\n}\n\nfunction optionalText(value: unknown, name: string): void {\n if (value !== undefined) requireText(value, name);\n}\n\nfunction optionalBoolean(value: unknown): void {\n if (value !== undefined && typeof value !== \"boolean\") throw new TypeError(\"Field group disabled must be boolean\");\n}\n\nexport function resolveFieldGroup(descriptor: FieldGroupDescriptor): Readonly<{\n label: string;\n description: string | undefined;\n error: string | undefined;\n disabled: boolean;\n fields: readonly ResolvedFieldGroupMember[];\n}> {\n requireText(descriptor.label, \"label\");\n optionalText(descriptor.description, \"description\");\n optionalBoolean(descriptor.disabled);\n if (!Array.isArray(descriptor.fields)) throw new TypeError(\"Field group fields must be an array\");\n const ids = new Set<string>();\n for (const field of descriptor.fields) {\n requireText(field.id, \"field id\");\n requireText(field.label, \"field label\");\n optionalText(field.description, \"field description\");\n optionalText(field.error, \"field error\");\n optionalBoolean(field.disabled);\n if (ids.has(field.id)) throw new TypeError(\"Field group field ids must be unique\");\n ids.add(field.id);\n }\n if (descriptor.error !== undefined) {\n requireText(descriptor.error.message, \"error\");\n const affected = descriptor.error.fieldIds;\n // A typo or removed field must not silently lose its validation feedback.\n // Products update the visible error with their dynamic field list atomically.\n if (!Array.isArray(affected) || new Set(affected).size !== affected.length || affected.some(id => !ids.has(id))) {\n throw new TypeError(\"Field group error must reference distinct current field ids\");\n }\n }\n const disabled = descriptor.disabled ?? false;\n return Object.freeze({\n label: descriptor.label,\n description: descriptor.description,\n error: descriptor.error?.message,\n disabled,\n fields: Object.freeze(descriptor.fields.map(field => {\n const groupError = descriptor.error?.fieldIds.includes(field.id) ? descriptor.error.message : undefined;\n const support: ResolvedFieldGroupMember[\"support\"][number][] = [];\n if (descriptor.description !== undefined) support.push({ scope: \"group\", kind: \"description\", text: descriptor.description });\n if (field.description !== undefined) support.push({ scope: \"field\", kind: \"description\", text: field.description });\n if (field.error !== undefined) support.push({ scope: \"field\", kind: \"error\", text: field.error });\n if (groupError !== undefined) support.push({ scope: \"group\", kind: \"error\", text: groupError });\n return Object.freeze({ id: field.id, label: field.label, groupLabel: descriptor.label,\n // Group unlock restores independently disabled members; it never enables them.\n disabled: disabled || (field.disabled ?? false), invalid: field.error !== undefined || groupError !== undefined,\n support: Object.freeze(support.map(message => Object.freeze(message))) });\n })),\n });\n}\n"]}
@@ -22,10 +22,23 @@ export declare const radius: {
22
22
  * family (or their OS default mapping), rather than receiving a CSS stack.
23
23
  */
24
24
  export declare const fontFamily: {
25
- readonly ui: readonly ["Inter", "Pretendard", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"];
26
- readonly code: readonly ["ui-monospace", "SFMono-Regular", "Consolas", "Liberation Mono", "monospace"];
25
+ readonly ui: readonly ["Pretendard Variable", "Pretendard", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"];
26
+ readonly code: readonly ["ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Monaco", "Cascadia Mono", "Consolas", "Liberation Mono", "monospace"];
27
27
  };
28
28
  export type FontFamily = keyof typeof fontFamily;
29
+ /**
30
+ * Native has no variable-weight selection on every platform, so each weight is its own registered face.
31
+ * Keys match the asset map exported by `@hjmds/react-native/fonts`; 400 doubles as the family name inputs use.
32
+ */
33
+ export declare const pretendardNativeFaces: {
34
+ readonly "400": "Pretendard";
35
+ readonly "500": "Pretendard-Medium";
36
+ readonly "600": "Pretendard-SemiBold";
37
+ readonly "700": "Pretendard-Bold";
38
+ readonly "800": "Pretendard-ExtraBold";
39
+ };
40
+ /** Nearest bundled face for a CSS/RN font weight ("normal", "bold", 100–900). */
41
+ export declare function resolvePretendardNativeFace(weight: string | number | undefined): (typeof pretendardNativeFaces)[keyof typeof pretendardNativeFaces];
29
42
  /** Display/reading roles are optional so existing ui/code product profiles retain their fonts. */
30
43
  export type FontRole = "ui" | "display" | "reading" | "code";
31
44
  export type FontFamilyRoles = Readonly<{
@@ -67,7 +80,7 @@ export declare const typography: {
67
80
  readonly label: {
68
81
  readonly fontSize: 12;
69
82
  readonly lineHeight: 18;
70
- readonly fontWeight: "600";
83
+ readonly fontWeight: "500";
71
84
  };
72
85
  readonly body: {
73
86
  readonly fontSize: 14;
@@ -82,17 +95,17 @@ export declare const typography: {
82
95
  readonly title: {
83
96
  readonly fontSize: 18;
84
97
  readonly lineHeight: 26;
85
- readonly fontWeight: "700";
98
+ readonly fontWeight: "600";
86
99
  };
87
100
  readonly titleLarge: {
88
101
  readonly fontSize: 20;
89
102
  readonly lineHeight: 28;
90
- readonly fontWeight: "800";
103
+ readonly fontWeight: "600";
91
104
  };
92
105
  readonly heading: {
93
106
  readonly fontSize: 24;
94
107
  readonly lineHeight: 32;
95
- readonly fontWeight: "800";
108
+ readonly fontWeight: "600";
96
109
  };
97
110
  };
98
111
  export type TextVariant = keyof typeof typography;
@@ -107,27 +120,27 @@ export declare const heading: {
107
120
  readonly level1: {
108
121
  readonly fontSize: 40;
109
122
  readonly lineHeight: 48;
110
- readonly fontWeight: "800";
123
+ readonly fontWeight: "700";
111
124
  };
112
125
  readonly level2: {
113
126
  readonly fontSize: 32;
114
127
  readonly lineHeight: 40;
115
- readonly fontWeight: "800";
128
+ readonly fontWeight: "700";
116
129
  };
117
130
  readonly level3: {
118
131
  readonly fontSize: 24;
119
132
  readonly lineHeight: 32;
120
- readonly fontWeight: "800";
133
+ readonly fontWeight: "600";
121
134
  };
122
135
  readonly level4: {
123
136
  readonly fontSize: 20;
124
137
  readonly lineHeight: 28;
125
- readonly fontWeight: "800";
138
+ readonly fontWeight: "600";
126
139
  };
127
140
  readonly level5: {
128
141
  readonly fontSize: 18;
129
142
  readonly lineHeight: 26;
130
- readonly fontWeight: "700";
143
+ readonly fontWeight: "600";
131
144
  };
132
145
  };
133
146
  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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"}