@hjmds/design-contracts 1.18.0 โ†’ 1.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/dist/action-session.d.ts +16 -0
  2. package/dist/action-session.d.ts.map +1 -1
  3. package/dist/action-session.js +18 -0
  4. package/dist/action-session.js.map +1 -1
  5. package/dist/behaviors.d.ts +7 -6
  6. package/dist/behaviors.d.ts.map +1 -1
  7. package/dist/behaviors.js +4 -3
  8. package/dist/behaviors.js.map +1 -1
  9. package/dist/bottom-navigation.d.ts +4 -0
  10. package/dist/bottom-navigation.d.ts.map +1 -1
  11. package/dist/bottom-navigation.js +11 -0
  12. package/dist/bottom-navigation.js.map +1 -1
  13. package/dist/carousel.d.ts +3 -0
  14. package/dist/carousel.d.ts.map +1 -1
  15. package/dist/carousel.js.map +1 -1
  16. package/dist/catalog.d.ts +42 -0
  17. package/dist/catalog.d.ts.map +1 -1
  18. package/dist/component-recipes.d.ts +42 -0
  19. package/dist/component-recipes.d.ts.map +1 -1
  20. package/dist/component-recipes.js +14 -1
  21. package/dist/component-recipes.js.map +1 -1
  22. package/dist/field-group.d.ts +14 -0
  23. package/dist/field-group.d.ts.map +1 -1
  24. package/dist/field-group.js +9 -0
  25. package/dist/field-group.js.map +1 -1
  26. package/dist/form.d.ts.map +1 -1
  27. package/dist/form.js +10 -3
  28. package/dist/form.js.map +1 -1
  29. package/dist/screen-patterns.d.ts +4 -0
  30. package/dist/screen-patterns.d.ts.map +1 -1
  31. package/dist/screen-patterns.js +12 -3
  32. package/dist/screen-patterns.js.map +1 -1
  33. package/dist/toast.d.ts +10 -1
  34. package/dist/toast.d.ts.map +1 -1
  35. package/dist/toast.js +43 -2
  36. package/dist/toast.js.map +1 -1
  37. package/dist/version.d.ts +1 -1
  38. package/dist/version.js +1 -1
  39. package/dist/version.js.map +1 -1
  40. package/docs/action-session.md +2 -0
  41. package/docs/asset.md +7 -0
  42. package/docs/bottom-navigation.md +11 -0
  43. package/docs/brand-boundary.md +3 -3
  44. package/docs/collection-rail.md +4 -0
  45. package/docs/compound-controls.md +8 -3
  46. package/docs/consumer-policy.md +39 -120
  47. package/docs/generated/component-maturity.md +1 -1
  48. package/docs/generated/renderer-evidence.json +3 -3
  49. package/docs/generated/renderer-evidence.md +1 -1
  50. package/docs/generated/showcase-manifest.json +1 -1
  51. package/docs/gravity-letters.md +2 -0
  52. package/docs/grid-reveal.md +2 -0
  53. package/docs/layout.md +2 -2
  54. package/docs/load-more.md +5 -0
  55. package/docs/migration-native-legacy-removal.md +30 -17
  56. package/docs/optional-adapters.md +4 -0
  57. package/docs/screen-patterns.md +23 -1
  58. package/docs/toast.md +41 -2
  59. package/docs/usage/README.md +248 -245
  60. package/docs/usage/SELECTION.md +43 -0
  61. package/docs/usage/STANDARD.md +22 -10
  62. package/docs/usage/components/accordion.md +5 -3
  63. package/docs/usage/components/agreement.md +6 -9
  64. package/docs/usage/components/alert-dialog.md +12 -6
  65. package/docs/usage/components/asset.md +10 -4
  66. package/docs/usage/components/auth-provider-button.md +2 -2
  67. package/docs/usage/components/avatar.md +8 -6
  68. package/docs/usage/components/badge.md +4 -4
  69. package/docs/usage/components/bottom-cta.md +4 -4
  70. package/docs/usage/components/bottom-info.md +2 -2
  71. package/docs/usage/components/bottom-navigation.md +16 -5
  72. package/docs/usage/components/button.md +2 -2
  73. package/docs/usage/components/card.md +1 -1
  74. package/docs/usage/components/carousel.md +12 -4
  75. package/docs/usage/components/chat-message.md +6 -2
  76. package/docs/usage/components/chat-screen.md +5 -5
  77. package/docs/usage/components/checkbox-group.md +1 -1
  78. package/docs/usage/components/checkbox.md +2 -2
  79. package/docs/usage/components/chip.md +2 -2
  80. package/docs/usage/components/code-block.md +3 -4
  81. package/docs/usage/components/collapsible.md +6 -4
  82. package/docs/usage/components/combobox.md +2 -2
  83. package/docs/usage/components/command-palette.md +1 -1
  84. package/docs/usage/components/comment-thread-screen.md +7 -4
  85. package/docs/usage/components/container.md +1 -1
  86. package/docs/usage/components/content-transition.md +2 -2
  87. package/docs/usage/components/context-menu.md +2 -2
  88. package/docs/usage/components/counter-badge.md +3 -3
  89. package/docs/usage/components/data-table.md +1 -1
  90. package/docs/usage/components/date-picker.md +4 -4
  91. package/docs/usage/components/description-list.md +3 -3
  92. package/docs/usage/components/design-system-provider.md +2 -2
  93. package/docs/usage/components/dialog.md +14 -3
  94. package/docs/usage/components/divider.md +2 -2
  95. package/docs/usage/components/editor-screen.md +5 -3
  96. package/docs/usage/components/effect-surface.md +1 -1
  97. package/docs/usage/components/empty-state.md +6 -6
  98. package/docs/usage/components/field.md +5 -3
  99. package/docs/usage/components/file-picker.md +6 -3
  100. package/docs/usage/components/form.md +1 -1
  101. package/docs/usage/components/heading.md +3 -3
  102. package/docs/usage/components/icon-button.md +3 -3
  103. package/docs/usage/components/icon.md +1 -1
  104. package/docs/usage/components/image.md +5 -4
  105. package/docs/usage/components/keyboard-dock.md +1 -1
  106. package/docs/usage/components/layout.md +1 -1
  107. package/docs/usage/components/link.md +2 -2
  108. package/docs/usage/components/list-detail-screen.md +6 -6
  109. package/docs/usage/components/list-row.md +13 -4
  110. package/docs/usage/components/list.md +5 -4
  111. package/docs/usage/components/masonry.md +2 -1
  112. package/docs/usage/components/media-selection-screen.md +11 -5
  113. package/docs/usage/components/mentions.md +2 -2
  114. package/docs/usage/components/menu.md +3 -2
  115. package/docs/usage/components/menubar.md +2 -2
  116. package/docs/usage/components/message-composer.md +3 -3
  117. package/docs/usage/components/moderation-screen.md +3 -2
  118. package/docs/usage/components/notice.md +2 -2
  119. package/docs/usage/components/notification-inbox-screen.md +1 -1
  120. package/docs/usage/components/notification-item.md +2 -2
  121. package/docs/usage/components/number-field.md +3 -3
  122. package/docs/usage/components/otp-field.md +1 -1
  123. package/docs/usage/components/overview-screen.md +1 -1
  124. package/docs/usage/components/permission-screen.md +1 -1
  125. package/docs/usage/components/photo-source-sheet.md +1 -1
  126. package/docs/usage/components/popover.md +2 -2
  127. package/docs/usage/components/profile-screen.md +1 -1
  128. package/docs/usage/components/progress.md +2 -2
  129. package/docs/usage/components/qr-code.md +2 -2
  130. package/docs/usage/components/radio-group.md +1 -2
  131. package/docs/usage/components/radio.md +1 -2
  132. package/docs/usage/components/result.md +1 -1
  133. package/docs/usage/components/saved-items-screen.md +4 -2
  134. package/docs/usage/components/screen-layout.md +4 -3
  135. package/docs/usage/components/search-field.md +1 -1
  136. package/docs/usage/components/search-screen.md +4 -4
  137. package/docs/usage/components/section.md +3 -3
  138. package/docs/usage/components/segmented-control.md +4 -4
  139. package/docs/usage/components/select.md +2 -3
  140. package/docs/usage/components/settings-screen.md +11 -49
  141. package/docs/usage/components/sheet.md +10 -5
  142. package/docs/usage/components/sidebar.md +1 -1
  143. package/docs/usage/components/skeleton.md +1 -1
  144. package/docs/usage/components/skip-nav.md +1 -1
  145. package/docs/usage/components/slider.md +2 -2
  146. package/docs/usage/components/spinner.md +2 -2
  147. package/docs/usage/components/splitter.md +1 -1
  148. package/docs/usage/components/statistic.md +5 -4
  149. package/docs/usage/components/steps.md +2 -2
  150. package/docs/usage/components/surface.md +2 -3
  151. package/docs/usage/components/switch.md +1 -1
  152. package/docs/usage/components/tabs.md +4 -4
  153. package/docs/usage/components/tag.md +2 -2
  154. package/docs/usage/components/tags-input.md +4 -4
  155. package/docs/usage/components/text-area.md +2 -3
  156. package/docs/usage/components/text.md +85 -4
  157. package/docs/usage/components/timeline.md +2 -2
  158. package/docs/usage/components/toast.md +17 -7
  159. package/docs/usage/components/toggle-group.md +3 -3
  160. package/docs/usage/components/tooltip.md +1 -1
  161. package/docs/usage/components/top-bar.md +5 -4
  162. package/docs/usage/components/top.md +3 -3
  163. package/docs/usage/components/transfer-list.md +5 -4
  164. package/docs/usage/components/upload-item.md +3 -3
  165. package/docs/usage/components/virtual-list.md +1 -0
  166. package/docs/usage/compositions/action-feedback.md +42 -6
  167. package/docs/usage/compositions/action-recovery-optimistic.md +6 -1
  168. package/docs/usage/compositions/action-recovery-save.md +19 -23
  169. package/docs/usage/compositions/action-recovery-undo.md +6 -1
  170. package/docs/usage/compositions/activity-status.md +11 -5
  171. package/docs/usage/compositions/collection-detail.md +2 -0
  172. package/docs/usage/compositions/command-records.md +15 -5
  173. package/docs/usage/compositions/common-message.md +4 -2
  174. package/docs/usage/compositions/common-notification.md +5 -3
  175. package/docs/usage/compositions/compound-controls.md +13 -5
  176. package/docs/usage/compositions/content-transition-comparison.md +2 -2
  177. package/docs/usage/compositions/date-entry.md +10 -5
  178. package/docs/usage/compositions/date-time-selection.md +3 -3
  179. package/docs/usage/compositions/design-profile-comparison.md +7 -5
  180. package/docs/usage/compositions/disclosure.md +1 -1
  181. package/docs/usage/compositions/document-resource.md +10 -3
  182. package/docs/usage/compositions/expo-interactions.md +3 -2
  183. package/docs/usage/compositions/family-drawer.md +9 -4
  184. package/docs/usage/compositions/field-group.md +7 -1
  185. package/docs/usage/compositions/floating-action-button.md +18 -18
  186. package/docs/usage/compositions/illustrated-outcome.md +3 -2
  187. package/docs/usage/compositions/input-sheet.md +6 -2
  188. package/docs/usage/compositions/interaction-adapters.md +1 -1
  189. package/docs/usage/compositions/interaction-flow-apply.md +6 -3
  190. package/docs/usage/compositions/interaction-flow-draft.md +5 -2
  191. package/docs/usage/compositions/interaction-flow-search.md +5 -2
  192. package/docs/usage/compositions/live-list.md +7 -5
  193. package/docs/usage/compositions/navigation-bar-collection.md +8 -7
  194. package/docs/usage/compositions/optional-adapters.md +1 -1
  195. package/docs/usage/compositions/origin-dialog.md +5 -5
  196. package/docs/usage/compositions/paper-surface.md +1 -1
  197. package/docs/usage/compositions/photo-source.md +1 -1
  198. package/docs/usage/compositions/purpose-input-comment.md +5 -3
  199. package/docs/usage/compositions/purpose-input-message.md +5 -3
  200. package/docs/usage/compositions/reference-first.md +63 -42
  201. package/docs/usage/compositions/reference-review.md +60 -50
  202. package/docs/usage/compositions/reference-settings.md +60 -50
  203. package/docs/usage/compositions/selection-scope.md +48 -35
  204. package/docs/usage/compositions/stea-order-progress.md +1 -0
  205. package/docs/usage/compositions/stea-otp-verify.md +5 -3
  206. package/docs/usage/compositions/stea-pixel-empty.md +3 -3
  207. package/docs/usage/compositions/time-selection.md +6 -5
  208. package/docs/usage/compositions/upload-recovery.md +10 -1
  209. package/docs/usage/compositions/video-dialog.md +10 -3
  210. package/docs/usage/compositions/web-additions.md +5 -5
  211. package/docs/usage/compositions/web-navigation.md +1 -1
  212. package/docs/usage/screens/common-chat.md +21 -8
  213. package/docs/usage/screens/common-comments.md +13 -1
  214. package/docs/usage/screens/common-inbox.md +19 -6
  215. package/docs/usage/screens/common-login.md +19 -7
  216. package/docs/usage/screens/common-profile.md +22 -9
  217. package/docs/usage/screens/common-saved.md +16 -2
  218. package/docs/usage/screens/common-search.md +24 -4
  219. package/docs/usage/screens/common-settings.md +22 -50
  220. package/docs/usage/screens/common-shell.md +14 -2
  221. package/docs/usage/screens/dashboard.md +52 -109
  222. package/docs/usage/screens/discovery-gallery.md +57 -148
  223. package/docs/usage/screens/flow-collection.md +38 -9
  224. package/docs/usage/screens/flow-editor.md +25 -7
  225. package/docs/usage/screens/flow-media.md +23 -7
  226. package/docs/usage/screens/flow-moderation.md +15 -2
  227. package/docs/usage/screens/flow-onboarding.md +3 -3
  228. package/docs/usage/screens/flow-permission.md +17 -3
  229. package/docs/usage/screens/landing.md +37 -20
  230. package/docs/usage/screens/mockup-studio.md +22 -7
  231. package/docs/usage/screens/notification-settings.md +18 -4
  232. package/docs/usage/screens/product-bento.md +18 -9
  233. package/docs/usage/screens/reference-comparison.md +29 -10
  234. package/docs/usage/tokens/color.md +6 -3
  235. package/docs/usage/tokens/elevation-opacity.md +4 -2
  236. package/docs/usage/tokens/font-roles.md +2 -2
  237. package/docs/usage/tokens/layers.md +3 -3
  238. package/docs/usage/tokens/motion.md +2 -2
  239. package/docs/usage/tokens/radius.md +4 -2
  240. package/docs/usage/tokens/spacing.md +3 -3
  241. package/docs/usage/tokens/theme-studio.md +2 -2
  242. package/docs/usage/tokens/typography-studio.md +14 -8
  243. package/docs/usage/tokens/typography.md +15 -5
  244. package/package.json +1 -1
package/dist/toast.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"toast.js","sourceRoot":"","sources":["../src/toast.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ToastTone } from \"./component-recipes.js\";\n\nexport { liquidToastRecipe, resolveLiquidToastLayout, buildLiquidToastGeometry, validateLiquidToastAnchor } from \"./toast-liquid.js\";\nexport type { LiquidToastAnchor, LiquidToastLayout } from \"./toast-liquid.js\";\n\nexport type ToastId = string;\nexport type ToastPresentation = \"standard\" | \"liquid\";\nexport type ToastAnnouncementPriority = \"normal\" | \"high\";\nexport type ToastPauseReason =\n | \"pointer\"\n | \"focus\"\n | \"window\"\n | \"gesture\"\n | \"programmatic\"\n | \"presentation\"\n | \"occlusion\";\nexport type ToastDismissReason =\n | \"timeout\"\n | \"action\"\n | \"close-action\"\n | \"escape\"\n | \"swipe\"\n | \"programmatic\"\n | \"queue-overflow\"\n | \"interrupted\";\nexport type ToastDuplicatePolicy = \"update\" | \"ignore\";\nexport type ToastTimerUpdatePolicy = \"preserve\" | \"restart\";\nexport type ToastOverflowPolicy = \"discard-oldest\" | \"discard-newest\";\n\nexport type ToastActionDescriptor = Readonly<{\n label: string;\n accessibilityLabel?: string;\n onAction(): void;\n dismissOnAction?: boolean;\n}>;\n\n/**\n * Ordered steps of a background task shown inside the toast panel (1.20 panel toast).\n * `current` is the zero-based index of the running step; earlier steps read as done.\n */\nexport type ToastProgressDescriptor = Readonly<{\n steps: readonly string[];\n current: number;\n}>;\n\n/**\n * Renderer-neutral copy and behavior for one notification. Copy stays plain\n * text so Web and Native can announce the exact same message without accepting\n * renderer nodes in the core package. `media` is the one exception: a decorative\n * leading visual (product mascot, avatar, icon) that the core never inspects and\n * only passes through to the renderer, which hides it from assistive technology.\n * 2026-10-10 BurnTok asked for its review mascot inside the toast; a renderer-only\n * field was rejected because the store resolves descriptors and would drop it.\n */\nexport type ToastDescriptor = Readonly<{\n /** Stable product-owned identity used for in-place de-duplication. */\n id: ToastId;\n title?: string;\n description: string;\n tone?: ToastTone;\n /** Optional Native presentation; unsupported renderers retain the standard surface. */\n presentation?: ToastPresentation;\n /** High priority interrupts; normal priority waits for a graceful announcement. */\n priority?: ToastAnnouncementPriority;\n /** Optional localized announcement when visible copy needs extra context. */\n announcement?: string;\n /** `null` persists; short durations clamp to the configured floor. */\n durationMs?: number | null;\n action?: ToastActionDescriptor;\n /** Decorative leading visual that replaces the tone badge (ReactNode on Web/Native). */\n media?: unknown;\n /** Step progress of a running task, announced with the current step label. */\n progress?: ToastProgressDescriptor;\n /** Required localized name for the icon-only close affordance. */\n closeLabel: string;\n onDismiss?: (reason: ToastDismissReason) => void;\n}>;\n\nexport type ResolvedToastActionDescriptor = Readonly<{\n label: string;\n accessibilityLabel: string;\n onAction(): void;\n dismissOnAction: boolean;\n}>;\n\nexport type ResolvedToastDescriptor = Readonly<{\n id: ToastId;\n title: string | null;\n description: string;\n tone: ToastTone;\n presentation: ToastPresentation;\n priority: ToastAnnouncementPriority;\n announcement: string;\n durationMs: number | null;\n action: ResolvedToastActionDescriptor | null;\n media: unknown;\n progress: ToastProgressDescriptor | null;\n closeLabel: string;\n onDismiss: ((reason: ToastDismissReason) => void) | null;\n}>;\n\nexport type ToastAnnouncement = Readonly<{\n message: string;\n priority: ToastAnnouncementPriority;\n}>;\n\nexport const toastBehaviorDefaults = {\n // 2026-10-02: product chose 3s over 5s for both presentations; actions may persist.\n durationMs: 3000,\n minimumDurationMs: 3000,\n priority: \"normal\",\n dismissOnAction: true,\n maxVisible: 1,\n maxQueued: 20,\n duplicatePolicy: \"update\",\n timerUpdatePolicy: \"preserve\",\n overflowPolicy: \"discard-oldest\",\n} as const satisfies Readonly<{\n durationMs: number;\n minimumDurationMs: number;\n priority: ToastAnnouncementPriority;\n dismissOnAction: boolean;\n maxVisible: number;\n maxQueued: number;\n duplicatePolicy: ToastDuplicatePolicy;\n timerUpdatePolicy: ToastTimerUpdatePolicy;\n overflowPolicy: ToastOverflowPolicy;\n}>;\n\nconst toastTones: readonly ToastTone[] = [\n \"neutral\",\n \"info\",\n \"success\",\n \"warning\",\n \"danger\",\n];\n\nfunction assertCopy(value: string, field: string): void {\n if (value.trim().length === 0) {\n throw new TypeError(`Toast ${field} must not be empty`);\n }\n}\n\n/** Rejects ambiguous identity and inaccessible copy before anything is queued. */\nexport function validateToastDescriptor(descriptor: ToastDescriptor): void {\n assertCopy(descriptor.id, \"id\");\n if (descriptor.id !== descriptor.id.trim()) {\n throw new TypeError(\"Toast id must not start or end with whitespace\");\n }\n assertCopy(descriptor.description, \"description\");\n assertCopy(descriptor.closeLabel, \"closeLabel\");\n if (descriptor.title !== undefined) assertCopy(descriptor.title, \"title\");\n if (descriptor.announcement !== undefined) {\n assertCopy(descriptor.announcement, \"announcement\");\n }\n if (descriptor.tone !== undefined && !toastTones.includes(descriptor.tone)) {\n throw new TypeError(`Unsupported Toast tone: ${String(descriptor.tone)}`);\n }\n if (\n descriptor.priority !== undefined &&\n descriptor.priority !== \"normal\" &&\n descriptor.priority !== \"high\"\n ) {\n throw new TypeError(`Unsupported Toast priority: ${String(descriptor.priority)}`);\n }\n if (descriptor.presentation !== undefined && ![\"standard\", \"liquid\"].includes(descriptor.presentation)) {\n throw new TypeError(`Unsupported Toast presentation: ${String(descriptor.presentation)}`);\n }\n if (descriptor.durationMs !== undefined && descriptor.durationMs !== null) {\n if (!Number.isFinite(descriptor.durationMs) || descriptor.durationMs <= 0) {\n throw new RangeError(\"Toast durationMs must be a positive finite number or null\");\n }\n }\n if (descriptor.progress !== undefined) {\n const { steps, current } = descriptor.progress;\n // Two to five steps keep the dot row on one line at the 320pt compact width.\n if (!Array.isArray(steps) || steps.length < 2 || steps.length > 5) {\n throw new RangeError(\"Toast progress needs 2 to 5 steps\");\n }\n steps.forEach((step, index) => assertCopy(step, `progress.steps[${index}]`));\n if (!Number.isInteger(current) || current < 0 || current >= steps.length) {\n throw new RangeError(\"Toast progress current must index an existing step\");\n }\n }\n if (descriptor.action) {\n assertCopy(descriptor.action.label, \"action.label\");\n if (descriptor.action.accessibilityLabel !== undefined) {\n assertCopy(descriptor.action.accessibilityLabel, \"action.accessibilityLabel\");\n }\n }\n}\n\n/** Actions persist by default; timed notices follow the shared 3-second floor. */\nexport function resolveToastDuration(descriptor: ToastDescriptor): number | null {\n validateToastDescriptor(descriptor);\n if (descriptor.durationMs === null) return null;\n if (descriptor.durationMs === undefined) {\n return descriptor.action ? null : toastBehaviorDefaults.durationMs;\n }\n return Math.max(descriptor.durationMs, toastBehaviorDefaults.minimumDurationMs);\n}\n\nexport function resolveToastDescriptor(\n descriptor: ToastDescriptor,\n): ResolvedToastDescriptor {\n validateToastDescriptor(descriptor);\n const title = descriptor.title ?? null;\n const base = title === null ? descriptor.description : `${title}. ${descriptor.description}`;\n // The visible step dots are decorative; the running step label is part of the spoken message.\n const announcement =\n descriptor.announcement ??\n (descriptor.progress ? `${base}. ${descriptor.progress.steps[descriptor.progress.current]}` : base);\n const action = descriptor.action\n ? {\n label: descriptor.action.label,\n accessibilityLabel:\n descriptor.action.accessibilityLabel ?? descriptor.action.label,\n onAction: descriptor.action.onAction,\n dismissOnAction:\n descriptor.action.dismissOnAction ?? toastBehaviorDefaults.dismissOnAction,\n }\n : null;\n\n return {\n id: descriptor.id,\n title,\n description: descriptor.description,\n tone: descriptor.tone ?? \"neutral\",\n presentation: descriptor.presentation ?? \"standard\",\n priority: descriptor.priority ?? toastBehaviorDefaults.priority,\n announcement,\n durationMs: resolveToastDuration(descriptor),\n action,\n media: descriptor.media ?? null,\n progress: descriptor.progress ?? null,\n closeLabel: descriptor.closeLabel,\n onDismiss: descriptor.onDismiss ?? null,\n };\n}\n\nexport function resolveToastAnnouncement(\n descriptor: ToastDescriptor,\n): ToastAnnouncement {\n const resolved = resolveToastDescriptor(descriptor);\n return { message: resolved.announcement, priority: resolved.priority };\n}\n\nexport type ToastPhase = \"queued\" | \"visible\" | \"closing\" | \"closed\";\nexport type ToastTimerStatus =\n | \"waiting\"\n | \"running\"\n | \"paused\"\n | \"persistent\"\n | \"stopped\";\n\nexport type ToastTimerSnapshot = Readonly<{\n status: ToastTimerStatus;\n durationMs: number | null;\n remainingMs: number | null;\n pausedBy: readonly ToastPauseReason[];\n}>;\n\nexport type ToastSessionSnapshot = Readonly<{\n revision: number;\n phase: ToastPhase;\n descriptor: ResolvedToastDescriptor;\n timer: ToastTimerSnapshot;\n actionInvoked: boolean;\n dismissReason: ToastDismissReason | null;\n}>;\n\nexport type ToastSession = Readonly<{\n getSnapshot(): ToastSessionSnapshot;\n subscribe(listener: () => void): () => void;\n /** Starts visibility and the timer. Queued time is never counted. */\n show(): boolean;\n update(descriptor: ToastDescriptor, timerPolicy?: ToastTimerUpdatePolicy): boolean;\n pause(reason: ToastPauseReason): boolean;\n resume(reason: ToastPauseReason): boolean;\n /** Advances a renderer-owned clock; no global timer or Date dependency exists. */\n advanceTime(elapsedMs: number): boolean;\n invokeAction(): boolean;\n dismiss(reason: ToastDismissReason): boolean;\n /** Renderers call this once exit motion or immediate reduced-motion exit finishes. */\n completeExit(): boolean;\n interrupt(): boolean;\n}>;\n\nfunction assertElapsedTime(elapsedMs: number): void {\n if (!Number.isFinite(elapsedMs) || elapsedMs < 0) {\n throw new RangeError(\"Toast elapsed time must be a non-negative finite number\");\n }\n}\n\n/** Owns one notification's action, timer, and dismiss lifecycle exactly once. */\nexport function createToastSession(descriptor: ToastDescriptor): ToastSession {\n let resolved = resolveToastDescriptor(descriptor);\n let phase: ToastPhase = \"queued\";\n let revision = 0;\n let elapsedMs = 0;\n let actionInvoked = false;\n let dismissReason: ToastDismissReason | null = null;\n let dismissNotified = false;\n let cachedSnapshot: ToastSessionSnapshot | null = null;\n const pausedBy = new Set<ToastPauseReason>();\n const listeners = new Set<() => void>();\n\n const notify = () => {\n cachedSnapshot = null;\n for (const listener of listeners) listener();\n };\n const timerSnapshot = (): ToastTimerSnapshot => {\n if (resolved.durationMs === null) {\n return {\n status: \"persistent\",\n durationMs: null,\n remainingMs: null,\n pausedBy: [...pausedBy],\n };\n }\n const remainingMs = Math.max(0, resolved.durationMs - elapsedMs);\n const status: ToastTimerStatus =\n phase === \"queued\"\n ? \"waiting\"\n : phase !== \"visible\"\n ? \"stopped\"\n : pausedBy.size > 0\n ? \"paused\"\n : \"running\";\n return {\n status,\n durationMs: resolved.durationMs,\n remainingMs,\n pausedBy: [...pausedBy],\n };\n };\n const snapshot = (): ToastSessionSnapshot => {\n cachedSnapshot ??= {\n revision,\n phase,\n descriptor: resolved,\n timer: timerSnapshot(),\n actionInvoked,\n dismissReason,\n };\n return cachedSnapshot;\n };\n const announceDismiss = (reason: ToastDismissReason) => {\n if (dismissNotified) return;\n dismissNotified = true;\n resolved.onDismiss?.(reason);\n };\n const finishImmediately = (reason: ToastDismissReason): boolean => {\n if (phase === \"closed\") return false;\n phase = \"closed\";\n dismissReason = reason;\n pausedBy.clear();\n notify();\n announceDismiss(reason);\n return true;\n };\n\n const session: ToastSession = {\n getSnapshot: snapshot,\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n show() {\n if (phase !== \"queued\") return false;\n phase = \"visible\";\n notify();\n return true;\n },\n update(nextDescriptor, timerPolicy = toastBehaviorDefaults.timerUpdatePolicy) {\n if (phase === \"closing\" || phase === \"closed\") return false;\n if (nextDescriptor.id !== resolved.id) {\n throw new TypeError(\"A Toast session cannot change its stable id\");\n }\n if (timerPolicy !== \"preserve\" && timerPolicy !== \"restart\") {\n throw new TypeError(`Unsupported Toast timer update policy: ${String(timerPolicy)}`);\n }\n const next = resolveToastDescriptor(nextDescriptor);\n resolved = next;\n revision += 1;\n actionInvoked = false;\n dismissReason = null;\n dismissNotified = false;\n if (phase === \"queued\" || timerPolicy === \"restart\") elapsedMs = 0;\n\n if (\n phase === \"visible\" &&\n resolved.durationMs !== null &&\n elapsedMs >= resolved.durationMs\n ) {\n elapsedMs = resolved.durationMs;\n phase = \"closing\";\n dismissReason = \"timeout\";\n }\n notify();\n return true;\n },\n pause(reason) {\n if (phase !== \"visible\" || pausedBy.has(reason)) return false;\n pausedBy.add(reason);\n notify();\n return true;\n },\n resume(reason) {\n if (phase !== \"visible\" || !pausedBy.delete(reason)) return false;\n notify();\n return true;\n },\n advanceTime(deltaMs) {\n assertElapsedTime(deltaMs);\n if (\n deltaMs === 0 ||\n phase !== \"visible\" ||\n resolved.durationMs === null ||\n pausedBy.size > 0\n ) {\n return false;\n }\n elapsedMs = Math.min(resolved.durationMs, elapsedMs + deltaMs);\n if (elapsedMs >= resolved.durationMs) {\n phase = \"closing\";\n dismissReason = \"timeout\";\n }\n notify();\n return true;\n },\n invokeAction() {\n const action = resolved.action;\n if (phase !== \"visible\" || action === null || actionInvoked) return false;\n const invokedRevision = revision;\n actionInvoked = true;\n notify();\n try {\n action.onAction();\n } finally {\n if (\n action.dismissOnAction &&\n phase === \"visible\" &&\n revision === invokedRevision\n ) {\n phase = \"closing\";\n dismissReason = \"action\";\n pausedBy.clear();\n notify();\n }\n }\n return true;\n },\n dismiss(reason) {\n if (phase === \"closing\" || phase === \"closed\") return false;\n if (phase === \"queued\") return finishImmediately(reason);\n phase = \"closing\";\n dismissReason = reason;\n pausedBy.clear();\n notify();\n return true;\n },\n completeExit() {\n if (phase !== \"closing\" || dismissReason === null) return false;\n return finishImmediately(dismissReason);\n },\n interrupt() {\n if (phase === \"closed\") return false;\n return finishImmediately(\"interrupted\");\n },\n };\n\n return session;\n}\n\nexport type ToastStoreOptions = Readonly<{\n maxVisible?: number;\n maxQueued?: number;\n duplicatePolicy?: ToastDuplicatePolicy;\n timerUpdatePolicy?: ToastTimerUpdatePolicy;\n overflowPolicy?: ToastOverflowPolicy;\n}>;\n\ntype ResolvedToastStoreOptions = Readonly<{\n maxVisible: number;\n maxQueued: number;\n duplicatePolicy: ToastDuplicatePolicy;\n timerUpdatePolicy: ToastTimerUpdatePolicy;\n overflowPolicy: ToastOverflowPolicy;\n}>;\n\nexport type ToastPublishOptions = Readonly<{\n duplicatePolicy?: ToastDuplicatePolicy;\n timerUpdatePolicy?: ToastTimerUpdatePolicy;\n}>;\n\nexport type ToastPublishResult =\n | Readonly<{ outcome: \"added\"; id: ToastId; position: \"visible\" | \"queued\" }>\n | Readonly<{ outcome: \"updated\"; id: ToastId; position: \"visible\" | \"queued\" }>\n | Readonly<{ outcome: \"ignored\"; id: ToastId; reason: \"duplicate\" | \"closing\" }>\n | Readonly<{ outcome: \"discarded\"; id: ToastId; reason: \"queue-overflow\" }>;\n\nexport type ToastStoreSnapshot = Readonly<{\n visible: readonly ToastSessionSnapshot[];\n queued: readonly ToastSessionSnapshot[];\n}>;\n\nexport type ToastStore = Readonly<{\n getSnapshot(): ToastStoreSnapshot;\n subscribe(listener: () => void): () => void;\n publish(descriptor: ToastDescriptor, options?: ToastPublishOptions): ToastPublishResult;\n invokeAction(id: ToastId): boolean;\n dismiss(id: ToastId, reason: ToastDismissReason): boolean;\n /** Stable-id programmatic close shortcut. */\n close(id: ToastId): boolean;\n pause(id: ToastId, reason: ToastPauseReason): boolean;\n resume(id: ToastId, reason: ToastPauseReason): boolean;\n pauseAll(reason: ToastPauseReason): number;\n resumeAll(reason: ToastPauseReason): number;\n advanceTime(elapsedMs: number): number;\n completeExit(id: ToastId): boolean;\n /** Provider teardown closes every item exactly once without waiting for motion. */\n dispose(): boolean;\n}>;\n\nfunction resolveStoreOptions(options: ToastStoreOptions): ResolvedToastStoreOptions {\n const resolved = {\n maxVisible: options.maxVisible ?? toastBehaviorDefaults.maxVisible,\n maxQueued: options.maxQueued ?? toastBehaviorDefaults.maxQueued,\n duplicatePolicy: options.duplicatePolicy ?? toastBehaviorDefaults.duplicatePolicy,\n timerUpdatePolicy:\n options.timerUpdatePolicy ?? toastBehaviorDefaults.timerUpdatePolicy,\n overflowPolicy: options.overflowPolicy ?? toastBehaviorDefaults.overflowPolicy,\n };\n if (!Number.isInteger(resolved.maxVisible) || resolved.maxVisible < 1) {\n throw new RangeError(\"Toast maxVisible must be an integer of at least one\");\n }\n if (!Number.isInteger(resolved.maxQueued) || resolved.maxQueued < 0) {\n throw new RangeError(\"Toast maxQueued must be a non-negative integer\");\n }\n if (resolved.duplicatePolicy !== \"update\" && resolved.duplicatePolicy !== \"ignore\") {\n throw new TypeError(\n `Unsupported Toast duplicate policy: ${String(resolved.duplicatePolicy)}`,\n );\n }\n if (\n resolved.timerUpdatePolicy !== \"preserve\" &&\n resolved.timerUpdatePolicy !== \"restart\"\n ) {\n throw new TypeError(\n `Unsupported Toast timer update policy: ${String(resolved.timerUpdatePolicy)}`,\n );\n }\n if (\n resolved.overflowPolicy !== \"discard-oldest\" &&\n resolved.overflowPolicy !== \"discard-newest\"\n ) {\n throw new TypeError(\n `Unsupported Toast overflow policy: ${String(resolved.overflowPolicy)}`,\n );\n }\n return resolved;\n}\n\n/**\n * Bounded FIFO coordinator. Visible items keep their slot through exit motion;\n * queued items begin timing only after promotion into a vacated slot.\n */\nexport function createToastStore(options: ToastStoreOptions = {}): ToastStore {\n const configuration = resolveStoreOptions(options);\n const sessions = new Map<ToastId, ToastSession>();\n const unsubscribers = new Map<ToastId, () => void>();\n const visibleIds: ToastId[] = [];\n const queuedIds: ToastId[] = [];\n const listeners = new Set<() => void>();\n const globalPauseReasons = new Set<ToastPauseReason>();\n let disposed = false;\n let cachedSnapshot: ToastStoreSnapshot | null = null;\n\n const notify = () => {\n cachedSnapshot = null;\n for (const listener of listeners) listener();\n };\n const positionOf = (id: ToastId): \"visible\" | \"queued\" =>\n visibleIds.includes(id) ? \"visible\" : \"queued\";\n const snapshot = (): ToastStoreSnapshot => {\n cachedSnapshot ??= {\n visible: visibleIds\n .map((id) => sessions.get(id)?.getSnapshot())\n .filter((entry): entry is ToastSessionSnapshot => entry !== undefined),\n queued: queuedIds\n .map((id) => sessions.get(id)?.getSnapshot())\n .filter((entry): entry is ToastSessionSnapshot => entry !== undefined),\n };\n return cachedSnapshot;\n };\n const removeId = (ids: ToastId[], id: ToastId) => {\n const index = ids.indexOf(id);\n if (index >= 0) ids.splice(index, 1);\n };\n const detachWithoutPromotion = (id: ToastId): ToastSession | undefined => {\n const session = sessions.get(id);\n removeId(visibleIds, id);\n removeId(queuedIds, id);\n sessions.delete(id);\n unsubscribers.get(id)?.();\n unsubscribers.delete(id);\n cachedSnapshot = null;\n return session;\n };\n const promote = () => {\n while (!disposed && visibleIds.length < configuration.maxVisible) {\n const id = queuedIds.shift();\n if (id === undefined) return;\n const session = sessions.get(id);\n if (!session) continue;\n visibleIds.push(id);\n session.show();\n for (const reason of globalPauseReasons) session.pause(reason);\n }\n };\n const removeClosed = (id: ToastId) => {\n removeId(visibleIds, id);\n removeId(queuedIds, id);\n sessions.delete(id);\n unsubscribers.get(id)?.();\n unsubscribers.delete(id);\n promote();\n };\n const attach = (session: ToastSession) => {\n const id = session.getSnapshot().descriptor.id;\n sessions.set(id, session);\n const unsubscribe = session.subscribe(() => {\n if (session.getSnapshot().phase === \"closed\") removeClosed(id);\n notify();\n });\n unsubscribers.set(id, unsubscribe);\n };\n const discard = (descriptor: ToastDescriptor): ToastPublishResult => {\n createToastSession(descriptor).dismiss(\"queue-overflow\");\n return { outcome: \"discarded\", id: descriptor.id, reason: \"queue-overflow\" };\n };\n const assertActive = () => {\n if (disposed) throw new Error(\"Cannot use a disposed Toast store\");\n };\n\n const store: ToastStore = {\n getSnapshot: snapshot,\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n publish(descriptor, publishOptions = {}) {\n assertActive();\n validateToastDescriptor(descriptor);\n const existing = sessions.get(descriptor.id);\n if (existing) {\n if (existing.getSnapshot().phase === \"closing\") {\n return { outcome: \"ignored\", id: descriptor.id, reason: \"closing\" };\n }\n const duplicatePolicy =\n publishOptions.duplicatePolicy ?? configuration.duplicatePolicy;\n if (duplicatePolicy !== \"update\" && duplicatePolicy !== \"ignore\") {\n throw new TypeError(\n `Unsupported Toast duplicate policy: ${String(duplicatePolicy)}`,\n );\n }\n if (duplicatePolicy === \"ignore\") {\n return { outcome: \"ignored\", id: descriptor.id, reason: \"duplicate\" };\n }\n existing.update(\n descriptor,\n publishOptions.timerUpdatePolicy ?? configuration.timerUpdatePolicy,\n );\n return {\n outcome: \"updated\",\n id: descriptor.id,\n position: positionOf(descriptor.id),\n };\n }\n\n if (visibleIds.length >= configuration.maxVisible) {\n if (configuration.maxQueued === 0) return discard(descriptor);\n if (queuedIds.length >= configuration.maxQueued) {\n if (configuration.overflowPolicy === \"discard-newest\") {\n return discard(descriptor);\n }\n const oldestQueuedId = queuedIds[0];\n if (oldestQueuedId !== undefined) {\n const oldestQueued = detachWithoutPromotion(oldestQueuedId);\n let dismissedWithoutError = false;\n try {\n oldestQueued?.dismiss(\"queue-overflow\");\n dismissedWithoutError = true;\n } finally {\n // A throwing onDismiss must not leave external-store consumers\n // with a stale snapshot of the removed queue entry.\n if (!dismissedWithoutError) notify();\n }\n // onDismiss/store subscribers may synchronously publish or dispose.\n // Restart from the public entry point so capacity, duplicates, and\n // disposed state use the actual post-callback store.\n return store.publish(descriptor, publishOptions);\n }\n }\n }\n\n const session = createToastSession(descriptor);\n attach(session);\n if (visibleIds.length < configuration.maxVisible) {\n visibleIds.push(descriptor.id);\n session.show();\n for (const reason of globalPauseReasons) session.pause(reason);\n return { outcome: \"added\", id: descriptor.id, position: \"visible\" };\n }\n queuedIds.push(descriptor.id);\n notify();\n return { outcome: \"added\", id: descriptor.id, position: \"queued\" };\n },\n invokeAction(id) {\n assertActive();\n return sessions.get(id)?.invokeAction() ?? false;\n },\n dismiss(id, reason) {\n assertActive();\n return sessions.get(id)?.dismiss(reason) ?? false;\n },\n close(id) {\n assertActive();\n return sessions.get(id)?.dismiss(\"programmatic\") ?? false;\n },\n pause(id, reason) {\n assertActive();\n return sessions.get(id)?.pause(reason) ?? false;\n },\n resume(id, reason) {\n assertActive();\n return sessions.get(id)?.resume(reason) ?? false;\n },\n pauseAll(reason) {\n assertActive();\n globalPauseReasons.add(reason);\n return [...visibleIds].reduce(\n (count, id) => count + (sessions.get(id)?.pause(reason) ? 1 : 0),\n 0,\n );\n },\n resumeAll(reason) {\n assertActive();\n globalPauseReasons.delete(reason);\n return [...visibleIds].reduce(\n (count, id) => count + (sessions.get(id)?.resume(reason) ? 1 : 0),\n 0,\n );\n },\n advanceTime(deltaMs) {\n assertActive();\n assertElapsedTime(deltaMs);\n return [...visibleIds].reduce(\n (count, id) => count + (sessions.get(id)?.advanceTime(deltaMs) ? 1 : 0),\n 0,\n );\n },\n completeExit(id) {\n assertActive();\n return sessions.get(id)?.completeExit() ?? false;\n },\n dispose() {\n if (disposed) return false;\n disposed = true;\n globalPauseReasons.clear();\n let firstError: unknown;\n for (const session of [...sessions.values()]) {\n try {\n session.interrupt();\n } catch (error) {\n firstError ??= error;\n }\n }\n notify();\n listeners.clear();\n if (firstError !== undefined) throw firstError;\n return true;\n },\n };\n\n return store;\n}\n"]}
1
+ {"version":3,"file":"toast.js","sourceRoot":"","sources":["../src/toast.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ToastTone } from \"./component-recipes.js\";\n\nexport { liquidToastRecipe, resolveLiquidToastLayout, buildLiquidToastGeometry, validateLiquidToastAnchor } from \"./toast-liquid.js\";\nexport type { LiquidToastAnchor, LiquidToastLayout } from \"./toast-liquid.js\";\n\nexport type ToastId = string;\nexport type ToastPresentation = \"standard\" | \"liquid\";\nexport type ToastAnnouncementPriority = \"normal\" | \"high\";\nexport type ToastPauseReason =\n | \"pointer\"\n | \"focus\"\n | \"window\"\n | \"gesture\"\n | \"programmatic\"\n | \"presentation\"\n | \"occlusion\";\nexport type ToastDismissReason =\n | \"timeout\"\n | \"action\"\n | \"press\"\n | \"close-action\"\n | \"escape\"\n | \"swipe\"\n | \"programmatic\"\n | \"queue-overflow\"\n | \"interrupted\";\nexport type ToastDuplicatePolicy = \"update\" | \"ignore\";\nexport type ToastTimerUpdatePolicy = \"preserve\" | \"restart\";\nexport type ToastOverflowPolicy = \"discard-oldest\" | \"discard-newest\";\n\nexport type ToastActionDescriptor = Readonly<{\n label: string;\n accessibilityLabel?: string;\n onAction(): void;\n dismissOnAction?: boolean;\n}>;\n\n/**\n * Ordered steps of a background task shown inside the toast panel (1.20 panel toast).\n * `current` is the zero-based index of the running step; earlier steps read as done.\n */\nexport type ToastProgressDescriptor = Readonly<{\n steps: readonly string[];\n current: number;\n}>;\n\n/**\n * Renderer-neutral copy and behavior for one notification. Copy stays plain\n * text so Web and Native can announce the exact same message without accepting\n * renderer nodes in the core package. `media` is the one exception: a decorative\n * leading visual (product mascot, avatar, icon) that the core never inspects and\n * only passes through to the renderer, which hides it from assistive technology.\n * 2026-10-10 BurnTok asked for its review mascot inside the toast; a renderer-only\n * field was rejected because the store resolves descriptors and would drop it.\n */\nexport type ToastDescriptor = Readonly<{\n /** Stable product-owned identity used for in-place de-duplication. */\n id: ToastId;\n title?: string;\n description: string;\n tone?: ToastTone;\n /** Optional Native presentation; unsupported renderers retain the standard surface. */\n presentation?: ToastPresentation;\n /** High priority interrupts; normal priority waits for a graceful announcement. */\n priority?: ToastAnnouncementPriority;\n /** Optional localized announcement when visible copy needs extra context. */\n announcement?: string;\n /** `null` persists; short durations clamp to the configured floor. */\n durationMs?: number | null;\n action?: ToastActionDescriptor;\n /** Whole-card activation; sibling action/close controls remain independent. */\n press?: Readonly<{ accessibilityLabel: string; onPress(): void }>;\n /** Decorative leading visual that replaces the tone badge (ReactNode on Web/Native). */\n media?: unknown;\n /** Step progress of a running task, announced with the current step label. */\n progress?: ToastProgressDescriptor;\n /** Required localized name for the icon-only close affordance. */\n closeLabel: string;\n onDismiss?: (reason: ToastDismissReason) => void;\n}>;\n\nexport type ResolvedToastActionDescriptor = Readonly<{\n label: string;\n accessibilityLabel: string;\n onAction(): void;\n dismissOnAction: boolean;\n}>;\n\nexport type ResolvedToastDescriptor = Readonly<{\n id: ToastId;\n title: string | null;\n description: string;\n tone: ToastTone;\n presentation: ToastPresentation;\n priority: ToastAnnouncementPriority;\n announcement: string;\n durationMs: number | null;\n action: ResolvedToastActionDescriptor | null;\n press: NonNullable<ToastDescriptor[\"press\"]> | null;\n media: unknown;\n progress: ToastProgressDescriptor | null;\n closeLabel: string;\n onDismiss: ((reason: ToastDismissReason) => void) | null;\n}>;\n\nexport type ToastAnnouncement = Readonly<{\n message: string;\n priority: ToastAnnouncementPriority;\n}>;\n\nexport const toastBehaviorDefaults = {\n // 2026-10-02: product chose 3s over 5s for both presentations; actions may persist.\n durationMs: 3000,\n minimumDurationMs: 3000,\n priority: \"normal\",\n dismissOnAction: true,\n maxVisible: 1,\n maxQueued: 20,\n duplicatePolicy: \"update\",\n timerUpdatePolicy: \"preserve\",\n overflowPolicy: \"discard-oldest\",\n} as const satisfies Readonly<{\n durationMs: number;\n minimumDurationMs: number;\n priority: ToastAnnouncementPriority;\n dismissOnAction: boolean;\n maxVisible: number;\n maxQueued: number;\n duplicatePolicy: ToastDuplicatePolicy;\n timerUpdatePolicy: ToastTimerUpdatePolicy;\n overflowPolicy: ToastOverflowPolicy;\n}>;\n\nconst toastTones: readonly ToastTone[] = [\n \"neutral\",\n \"info\",\n \"success\",\n \"warning\",\n \"danger\",\n];\n\nfunction assertCopy(value: string, field: string): void {\n if (value.trim().length === 0) {\n throw new TypeError(`Toast ${field} must not be empty`);\n }\n}\n\n/** Rejects ambiguous identity and inaccessible copy before anything is queued. */\nexport function validateToastDescriptor(descriptor: ToastDescriptor): void {\n assertCopy(descriptor.id, \"id\");\n if (descriptor.id !== descriptor.id.trim()) {\n throw new TypeError(\"Toast id must not start or end with whitespace\");\n }\n assertCopy(descriptor.description, \"description\");\n assertCopy(descriptor.closeLabel, \"closeLabel\");\n if (descriptor.title !== undefined) assertCopy(descriptor.title, \"title\");\n if (descriptor.announcement !== undefined) {\n assertCopy(descriptor.announcement, \"announcement\");\n }\n if (descriptor.tone !== undefined && !toastTones.includes(descriptor.tone)) {\n throw new TypeError(`Unsupported Toast tone: ${String(descriptor.tone)}`);\n }\n if (\n descriptor.priority !== undefined &&\n descriptor.priority !== \"normal\" &&\n descriptor.priority !== \"high\"\n ) {\n throw new TypeError(`Unsupported Toast priority: ${String(descriptor.priority)}`);\n }\n if (descriptor.presentation !== undefined && ![\"standard\", \"liquid\"].includes(descriptor.presentation)) {\n throw new TypeError(`Unsupported Toast presentation: ${String(descriptor.presentation)}`);\n }\n if (descriptor.durationMs !== undefined && descriptor.durationMs !== null) {\n if (!Number.isFinite(descriptor.durationMs) || descriptor.durationMs <= 0) {\n throw new RangeError(\"Toast durationMs must be a positive finite number or null\");\n }\n }\n if (descriptor.progress !== undefined) {\n const { steps, current } = descriptor.progress;\n // Two to five steps keep the dot row on one line at the 320pt compact width.\n if (!Array.isArray(steps) || steps.length < 2 || steps.length > 5) {\n throw new RangeError(\"Toast progress needs 2 to 5 steps\");\n }\n steps.forEach((step, index) => assertCopy(step, `progress.steps[${index}]`));\n if (!Number.isInteger(current) || current < 0 || current >= steps.length) {\n throw new RangeError(\"Toast progress current must index an existing step\");\n }\n }\n if (descriptor.press) {\n assertCopy(descriptor.press.accessibilityLabel, \"press.accessibilityLabel\");\n if (typeof descriptor.press.onPress !== \"function\") {\n throw new TypeError(\"Toast press.onPress must be a function\");\n }\n }\n if (descriptor.action) {\n assertCopy(descriptor.action.label, \"action.label\");\n if (descriptor.action.accessibilityLabel !== undefined) {\n assertCopy(descriptor.action.accessibilityLabel, \"action.accessibilityLabel\");\n }\n }\n}\n\n/** Actions persist by default; timed notices follow the shared 3-second floor. */\nexport function resolveToastDuration(descriptor: ToastDescriptor): number | null {\n validateToastDescriptor(descriptor);\n if (descriptor.durationMs === null) return null;\n if (descriptor.durationMs === undefined) {\n return descriptor.action || descriptor.press ? null : toastBehaviorDefaults.durationMs;\n }\n return Math.max(descriptor.durationMs, toastBehaviorDefaults.minimumDurationMs);\n}\n\nexport function resolveToastDescriptor(\n descriptor: ToastDescriptor,\n): ResolvedToastDescriptor {\n validateToastDescriptor(descriptor);\n const title = descriptor.title ?? null;\n const base = title === null ? descriptor.description : `${title}. ${descriptor.description}`;\n // The visible step dots are decorative; the running step label is part of the spoken message.\n const announcement =\n descriptor.announcement ??\n (descriptor.progress ? `${base}. ${descriptor.progress.steps[descriptor.progress.current]}` : base);\n const action = descriptor.action\n ? {\n label: descriptor.action.label,\n accessibilityLabel:\n descriptor.action.accessibilityLabel ?? descriptor.action.label,\n onAction: descriptor.action.onAction,\n dismissOnAction:\n descriptor.action.dismissOnAction ?? toastBehaviorDefaults.dismissOnAction,\n }\n : null;\n\n return {\n id: descriptor.id,\n title,\n description: descriptor.description,\n tone: descriptor.tone ?? \"neutral\",\n presentation: descriptor.presentation ?? \"standard\",\n priority: descriptor.priority ?? toastBehaviorDefaults.priority,\n announcement,\n durationMs: resolveToastDuration(descriptor),\n action,\n press: descriptor.press ?? null,\n media: descriptor.media ?? null,\n progress: descriptor.progress ?? null,\n closeLabel: descriptor.closeLabel,\n onDismiss: descriptor.onDismiss ?? null,\n };\n}\n\nexport function resolveToastAnnouncement(\n descriptor: ToastDescriptor,\n): ToastAnnouncement {\n const resolved = resolveToastDescriptor(descriptor);\n return { message: resolved.announcement, priority: resolved.priority };\n}\n\nexport type ToastPhase = \"queued\" | \"visible\" | \"closing\" | \"closed\";\nexport type ToastTimerStatus =\n | \"waiting\"\n | \"running\"\n | \"paused\"\n | \"persistent\"\n | \"stopped\";\n\nexport type ToastTimerSnapshot = Readonly<{\n status: ToastTimerStatus;\n durationMs: number | null;\n remainingMs: number | null;\n pausedBy: readonly ToastPauseReason[];\n}>;\n\nexport type ToastSessionSnapshot = Readonly<{\n revision: number;\n phase: ToastPhase;\n descriptor: ResolvedToastDescriptor;\n timer: ToastTimerSnapshot;\n actionInvoked: boolean;\n pressInvoked: boolean;\n dismissReason: ToastDismissReason | null;\n}>;\n\nexport type ToastSession = Readonly<{\n getSnapshot(): ToastSessionSnapshot;\n subscribe(listener: () => void): () => void;\n /** Starts visibility and the timer. Queued time is never counted. */\n show(): boolean;\n update(descriptor: ToastDescriptor, timerPolicy?: ToastTimerUpdatePolicy): boolean;\n pause(reason: ToastPauseReason): boolean;\n resume(reason: ToastPauseReason): boolean;\n /** Advances a renderer-owned clock; no global timer or Date dependency exists. */\n advanceTime(elapsedMs: number): boolean;\n invokeAction(): boolean;\n invokePress(): boolean;\n dismiss(reason: ToastDismissReason): boolean;\n /** Renderers call this once exit motion or immediate reduced-motion exit finishes. */\n completeExit(): boolean;\n interrupt(): boolean;\n}>;\n\nfunction assertElapsedTime(elapsedMs: number): void {\n if (!Number.isFinite(elapsedMs) || elapsedMs < 0) {\n throw new RangeError(\"Toast elapsed time must be a non-negative finite number\");\n }\n}\n\n/** Owns one notification's action, timer, and dismiss lifecycle exactly once. */\nexport function createToastSession(descriptor: ToastDescriptor): ToastSession {\n let resolved = resolveToastDescriptor(descriptor);\n let phase: ToastPhase = \"queued\";\n let revision = 0;\n let elapsedMs = 0;\n let actionInvoked = false;\n let pressInvoked = false;\n let invokingControl = false;\n let dismissReason: ToastDismissReason | null = null;\n let dismissNotified = false;\n let cachedSnapshot: ToastSessionSnapshot | null = null;\n const pausedBy = new Set<ToastPauseReason>();\n const listeners = new Set<() => void>();\n\n const notify = () => {\n cachedSnapshot = null;\n for (const listener of listeners) listener();\n };\n const timerSnapshot = (): ToastTimerSnapshot => {\n if (resolved.durationMs === null) {\n return {\n status: \"persistent\",\n durationMs: null,\n remainingMs: null,\n pausedBy: [...pausedBy],\n };\n }\n const remainingMs = Math.max(0, resolved.durationMs - elapsedMs);\n const status: ToastTimerStatus =\n phase === \"queued\"\n ? \"waiting\"\n : phase !== \"visible\"\n ? \"stopped\"\n : pausedBy.size > 0\n ? \"paused\"\n : \"running\";\n return {\n status,\n durationMs: resolved.durationMs,\n remainingMs,\n pausedBy: [...pausedBy],\n };\n };\n const snapshot = (): ToastSessionSnapshot => {\n cachedSnapshot ??= {\n revision,\n phase,\n descriptor: resolved,\n timer: timerSnapshot(),\n actionInvoked,\n pressInvoked,\n dismissReason,\n };\n return cachedSnapshot;\n };\n const announceDismiss = (reason: ToastDismissReason) => {\n if (dismissNotified) return;\n dismissNotified = true;\n resolved.onDismiss?.(reason);\n };\n const finishImmediately = (reason: ToastDismissReason): boolean => {\n if (phase === \"closed\") return false;\n phase = \"closed\";\n dismissReason = reason;\n pausedBy.clear();\n notify();\n announceDismiss(reason);\n return true;\n };\n\n const session: ToastSession = {\n getSnapshot: snapshot,\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n show() {\n if (phase !== \"queued\") return false;\n phase = \"visible\";\n notify();\n return true;\n },\n update(nextDescriptor, timerPolicy = toastBehaviorDefaults.timerUpdatePolicy) {\n if (phase === \"closing\" || phase === \"closed\") return false;\n if (nextDescriptor.id !== resolved.id) {\n throw new TypeError(\"A Toast session cannot change its stable id\");\n }\n if (timerPolicy !== \"preserve\" && timerPolicy !== \"restart\") {\n throw new TypeError(`Unsupported Toast timer update policy: ${String(timerPolicy)}`);\n }\n const next = resolveToastDescriptor(nextDescriptor);\n resolved = next;\n revision += 1;\n actionInvoked = false;\n pressInvoked = false;\n dismissReason = null;\n dismissNotified = false;\n if (phase === \"queued\" || timerPolicy === \"restart\") elapsedMs = 0;\n\n if (\n phase === \"visible\" &&\n resolved.durationMs !== null &&\n elapsedMs >= resolved.durationMs\n ) {\n elapsedMs = resolved.durationMs;\n phase = \"closing\";\n dismissReason = \"timeout\";\n }\n notify();\n return true;\n },\n pause(reason) {\n if (phase !== \"visible\" || pausedBy.has(reason)) return false;\n pausedBy.add(reason);\n notify();\n return true;\n },\n resume(reason) {\n if (phase !== \"visible\" || !pausedBy.delete(reason)) return false;\n notify();\n return true;\n },\n advanceTime(deltaMs) {\n assertElapsedTime(deltaMs);\n if (\n deltaMs === 0 ||\n phase !== \"visible\" ||\n resolved.durationMs === null ||\n pausedBy.size > 0\n ) {\n return false;\n }\n elapsedMs = Math.min(resolved.durationMs, elapsedMs + deltaMs);\n if (elapsedMs >= resolved.durationMs) {\n phase = \"closing\";\n dismissReason = \"timeout\";\n }\n notify();\n return true;\n },\n invokeAction() {\n const action = resolved.action;\n if (phase !== \"visible\" || action === null || actionInvoked || invokingControl) return false;\n const invokedRevision = revision;\n actionInvoked = true;\n invokingControl = true;\n notify();\n try {\n action.onAction();\n } finally {\n invokingControl = false;\n if (\n action.dismissOnAction &&\n phase === \"visible\" &&\n revision === invokedRevision\n ) {\n phase = \"closing\";\n dismissReason = \"action\";\n pausedBy.clear();\n notify();\n }\n }\n return true;\n },\n invokePress() {\n const press = resolved.press;\n if (phase !== \"visible\" || press === null || pressInvoked || invokingControl) return false;\n const invokedRevision = revision;\n pressInvoked = true;\n invokingControl = true;\n notify();\n try {\n press.onPress();\n } finally {\n invokingControl = false;\n // Match the reference's callback-then-dismiss ordering without closing a new\n // revision published by navigation, or re-entering another control mid-callback.\n if (phase === \"visible\" && revision === invokedRevision) {\n phase = \"closing\";\n dismissReason = \"press\";\n pausedBy.clear();\n notify();\n }\n }\n return true;\n },\n dismiss(reason) {\n if (phase === \"closing\" || phase === \"closed\") return false;\n if (phase === \"queued\") return finishImmediately(reason);\n phase = \"closing\";\n dismissReason = reason;\n pausedBy.clear();\n notify();\n return true;\n },\n completeExit() {\n if (phase !== \"closing\" || dismissReason === null) return false;\n return finishImmediately(dismissReason);\n },\n interrupt() {\n if (phase === \"closed\") return false;\n return finishImmediately(\"interrupted\");\n },\n };\n\n return session;\n}\n\nexport type ToastStoreOptions = Readonly<{\n maxVisible?: number;\n maxQueued?: number;\n duplicatePolicy?: ToastDuplicatePolicy;\n timerUpdatePolicy?: ToastTimerUpdatePolicy;\n overflowPolicy?: ToastOverflowPolicy;\n}>;\n\ntype ResolvedToastStoreOptions = Readonly<{\n maxVisible: number;\n maxQueued: number;\n duplicatePolicy: ToastDuplicatePolicy;\n timerUpdatePolicy: ToastTimerUpdatePolicy;\n overflowPolicy: ToastOverflowPolicy;\n}>;\n\nexport type ToastPublishOptions = Readonly<{\n duplicatePolicy?: ToastDuplicatePolicy;\n timerUpdatePolicy?: ToastTimerUpdatePolicy;\n}>;\n\nexport type ToastPublishResult =\n | Readonly<{ outcome: \"added\"; id: ToastId; position: \"visible\" | \"queued\" }>\n | Readonly<{ outcome: \"updated\"; id: ToastId; position: \"visible\" | \"queued\" }>\n | Readonly<{ outcome: \"ignored\"; id: ToastId; reason: \"duplicate\" | \"closing\" }>\n | Readonly<{ outcome: \"discarded\"; id: ToastId; reason: \"queue-overflow\" }>;\n\nexport type ToastStoreSnapshot = Readonly<{\n visible: readonly ToastSessionSnapshot[];\n queued: readonly ToastSessionSnapshot[];\n}>;\n\nexport type ToastStore = Readonly<{\n getSnapshot(): ToastStoreSnapshot;\n subscribe(listener: () => void): () => void;\n publish(descriptor: ToastDescriptor, options?: ToastPublishOptions): ToastPublishResult;\n invokeAction(id: ToastId): boolean;\n invokePress(id: ToastId): boolean;\n dismiss(id: ToastId, reason: ToastDismissReason): boolean;\n /** Stable-id programmatic close shortcut. */\n close(id: ToastId): boolean;\n pause(id: ToastId, reason: ToastPauseReason): boolean;\n resume(id: ToastId, reason: ToastPauseReason): boolean;\n pauseAll(reason: ToastPauseReason): number;\n resumeAll(reason: ToastPauseReason): number;\n advanceTime(elapsedMs: number): number;\n completeExit(id: ToastId): boolean;\n /** Provider teardown closes every item exactly once without waiting for motion. */\n dispose(): boolean;\n}>;\n\nfunction resolveStoreOptions(options: ToastStoreOptions): ResolvedToastStoreOptions {\n const resolved = {\n maxVisible: options.maxVisible ?? toastBehaviorDefaults.maxVisible,\n maxQueued: options.maxQueued ?? toastBehaviorDefaults.maxQueued,\n duplicatePolicy: options.duplicatePolicy ?? toastBehaviorDefaults.duplicatePolicy,\n timerUpdatePolicy:\n options.timerUpdatePolicy ?? toastBehaviorDefaults.timerUpdatePolicy,\n overflowPolicy: options.overflowPolicy ?? toastBehaviorDefaults.overflowPolicy,\n };\n if (!Number.isInteger(resolved.maxVisible) || resolved.maxVisible < 1) {\n throw new RangeError(\"Toast maxVisible must be an integer of at least one\");\n }\n if (!Number.isInteger(resolved.maxQueued) || resolved.maxQueued < 0) {\n throw new RangeError(\"Toast maxQueued must be a non-negative integer\");\n }\n if (resolved.duplicatePolicy !== \"update\" && resolved.duplicatePolicy !== \"ignore\") {\n throw new TypeError(\n `Unsupported Toast duplicate policy: ${String(resolved.duplicatePolicy)}`,\n );\n }\n if (\n resolved.timerUpdatePolicy !== \"preserve\" &&\n resolved.timerUpdatePolicy !== \"restart\"\n ) {\n throw new TypeError(\n `Unsupported Toast timer update policy: ${String(resolved.timerUpdatePolicy)}`,\n );\n }\n if (\n resolved.overflowPolicy !== \"discard-oldest\" &&\n resolved.overflowPolicy !== \"discard-newest\"\n ) {\n throw new TypeError(\n `Unsupported Toast overflow policy: ${String(resolved.overflowPolicy)}`,\n );\n }\n return resolved;\n}\n\n/**\n * Bounded FIFO coordinator. Visible items keep their slot through exit motion;\n * queued items begin timing only after promotion into a vacated slot.\n */\nexport function createToastStore(options: ToastStoreOptions = {}): ToastStore {\n const configuration = resolveStoreOptions(options);\n const sessions = new Map<ToastId, ToastSession>();\n const unsubscribers = new Map<ToastId, () => void>();\n const visibleIds: ToastId[] = [];\n const queuedIds: ToastId[] = [];\n const listeners = new Set<() => void>();\n const globalPauseReasons = new Set<ToastPauseReason>();\n let disposed = false;\n let cachedSnapshot: ToastStoreSnapshot | null = null;\n\n const notify = () => {\n cachedSnapshot = null;\n for (const listener of listeners) listener();\n };\n const positionOf = (id: ToastId): \"visible\" | \"queued\" =>\n visibleIds.includes(id) ? \"visible\" : \"queued\";\n const snapshot = (): ToastStoreSnapshot => {\n cachedSnapshot ??= {\n visible: visibleIds\n .map((id) => sessions.get(id)?.getSnapshot())\n .filter((entry): entry is ToastSessionSnapshot => entry !== undefined),\n queued: queuedIds\n .map((id) => sessions.get(id)?.getSnapshot())\n .filter((entry): entry is ToastSessionSnapshot => entry !== undefined),\n };\n return cachedSnapshot;\n };\n const removeId = (ids: ToastId[], id: ToastId) => {\n const index = ids.indexOf(id);\n if (index >= 0) ids.splice(index, 1);\n };\n const detachWithoutPromotion = (id: ToastId): ToastSession | undefined => {\n const session = sessions.get(id);\n removeId(visibleIds, id);\n removeId(queuedIds, id);\n sessions.delete(id);\n unsubscribers.get(id)?.();\n unsubscribers.delete(id);\n cachedSnapshot = null;\n return session;\n };\n const promote = () => {\n while (!disposed && visibleIds.length < configuration.maxVisible) {\n const id = queuedIds.shift();\n if (id === undefined) return;\n const session = sessions.get(id);\n if (!session) continue;\n visibleIds.push(id);\n session.show();\n for (const reason of globalPauseReasons) session.pause(reason);\n }\n };\n const removeClosed = (id: ToastId) => {\n removeId(visibleIds, id);\n removeId(queuedIds, id);\n sessions.delete(id);\n unsubscribers.get(id)?.();\n unsubscribers.delete(id);\n promote();\n };\n const attach = (session: ToastSession) => {\n const id = session.getSnapshot().descriptor.id;\n sessions.set(id, session);\n const unsubscribe = session.subscribe(() => {\n if (session.getSnapshot().phase === \"closed\") removeClosed(id);\n notify();\n });\n unsubscribers.set(id, unsubscribe);\n };\n const discard = (descriptor: ToastDescriptor): ToastPublishResult => {\n createToastSession(descriptor).dismiss(\"queue-overflow\");\n return { outcome: \"discarded\", id: descriptor.id, reason: \"queue-overflow\" };\n };\n const assertActive = () => {\n if (disposed) throw new Error(\"Cannot use a disposed Toast store\");\n };\n\n const store: ToastStore = {\n getSnapshot: snapshot,\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n publish(descriptor, publishOptions = {}) {\n assertActive();\n validateToastDescriptor(descriptor);\n const existing = sessions.get(descriptor.id);\n if (existing) {\n if (existing.getSnapshot().phase === \"closing\") {\n return { outcome: \"ignored\", id: descriptor.id, reason: \"closing\" };\n }\n const duplicatePolicy =\n publishOptions.duplicatePolicy ?? configuration.duplicatePolicy;\n if (duplicatePolicy !== \"update\" && duplicatePolicy !== \"ignore\") {\n throw new TypeError(\n `Unsupported Toast duplicate policy: ${String(duplicatePolicy)}`,\n );\n }\n if (duplicatePolicy === \"ignore\") {\n return { outcome: \"ignored\", id: descriptor.id, reason: \"duplicate\" };\n }\n existing.update(\n descriptor,\n publishOptions.timerUpdatePolicy ?? configuration.timerUpdatePolicy,\n );\n return {\n outcome: \"updated\",\n id: descriptor.id,\n position: positionOf(descriptor.id),\n };\n }\n\n if (visibleIds.length >= configuration.maxVisible) {\n if (configuration.maxQueued === 0) return discard(descriptor);\n if (queuedIds.length >= configuration.maxQueued) {\n if (configuration.overflowPolicy === \"discard-newest\") {\n return discard(descriptor);\n }\n const oldestQueuedId = queuedIds[0];\n if (oldestQueuedId !== undefined) {\n const oldestQueued = detachWithoutPromotion(oldestQueuedId);\n let dismissedWithoutError = false;\n try {\n oldestQueued?.dismiss(\"queue-overflow\");\n dismissedWithoutError = true;\n } finally {\n // A throwing onDismiss must not leave external-store consumers\n // with a stale snapshot of the removed queue entry.\n if (!dismissedWithoutError) notify();\n }\n // onDismiss/store subscribers may synchronously publish or dispose.\n // Restart from the public entry point so capacity, duplicates, and\n // disposed state use the actual post-callback store.\n return store.publish(descriptor, publishOptions);\n }\n }\n }\n\n const session = createToastSession(descriptor);\n attach(session);\n if (visibleIds.length < configuration.maxVisible) {\n visibleIds.push(descriptor.id);\n session.show();\n for (const reason of globalPauseReasons) session.pause(reason);\n return { outcome: \"added\", id: descriptor.id, position: \"visible\" };\n }\n queuedIds.push(descriptor.id);\n notify();\n return { outcome: \"added\", id: descriptor.id, position: \"queued\" };\n },\n invokePress(id) {\n assertActive();\n return sessions.get(id)?.invokePress() ?? false;\n },\n invokeAction(id) {\n assertActive();\n return sessions.get(id)?.invokeAction() ?? false;\n },\n dismiss(id, reason) {\n assertActive();\n return sessions.get(id)?.dismiss(reason) ?? false;\n },\n close(id) {\n assertActive();\n return sessions.get(id)?.dismiss(\"programmatic\") ?? false;\n },\n pause(id, reason) {\n assertActive();\n return sessions.get(id)?.pause(reason) ?? false;\n },\n resume(id, reason) {\n assertActive();\n return sessions.get(id)?.resume(reason) ?? false;\n },\n pauseAll(reason) {\n assertActive();\n globalPauseReasons.add(reason);\n return [...visibleIds].reduce(\n (count, id) => count + (sessions.get(id)?.pause(reason) ? 1 : 0),\n 0,\n );\n },\n resumeAll(reason) {\n assertActive();\n globalPauseReasons.delete(reason);\n return [...visibleIds].reduce(\n (count, id) => count + (sessions.get(id)?.resume(reason) ? 1 : 0),\n 0,\n );\n },\n advanceTime(deltaMs) {\n assertActive();\n assertElapsedTime(deltaMs);\n return [...visibleIds].reduce(\n (count, id) => count + (sessions.get(id)?.advanceTime(deltaMs) ? 1 : 0),\n 0,\n );\n },\n completeExit(id) {\n assertActive();\n return sessions.get(id)?.completeExit() ?? false;\n },\n dispose() {\n if (disposed) return false;\n disposed = true;\n globalPauseReasons.clear();\n let firstError: unknown;\n for (const session of [...sessions.values()]) {\n try {\n session.interrupt();\n } catch (error) {\n firstError ??= error;\n }\n }\n notify();\n listeners.clear();\n if (firstError !== undefined) throw firstError;\n return true;\n },\n };\n\n return store;\n}\n"]}
package/dist/version.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  /** Package release shown by documentation surfaces. Kept in sync by a test. */
2
- export declare const designSystemVersion: "1.18.0";
2
+ export declare const designSystemVersion: "1.19.0";
3
3
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  /** Package release shown by documentation surfaces. Kept in sync by a test. */
2
- export const designSystemVersion = "1.18.0";
2
+ export const designSystemVersion = "1.19.0";
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAiB,CAAC","sourcesContent":["/** Package release shown by documentation surfaces. Kept in sync by a test. */\nexport const designSystemVersion = \"1.18.0\" as const;\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAiB,CAAC","sourcesContent":["/** Package release shown by documentation surfaces. Kept in sync by a test. */\nexport const designSystemVersion = \"1.19.0\" as const;\n"]}
@@ -29,6 +29,8 @@ await save.run(() => api.save(submitted), { retryable: true });
29
29
  - optimisticValue๋Š” ์ €์œ„ํ—˜ ๋ณ€๊ฒฝ์—๋งŒ ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰์‹œ pending ๊ฐ’์œผ๋กœ ๋ณด์ด๊ณ , ์„ฑ๊ณต ์‹œ ์„œ๋ฒ„๊ฐ€
30
30
  ๋ฐ˜ํ™˜ํ•œ ๊ฐ’์„ ํ™•์ •ํ•œ๋‹ค. ์‹คํŒจํ•˜๋ฉด ์ง์ „ ํ™•์ธ ๊ฐ’์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค. ๊ฐ์ฒด ๊ฐ’์€ ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ๋กœ ์ „๋‹ฌํ•œ๋‹ค.
31
31
  - reset(value)๋Š” ์„ธ๋Œ€๋ฅผ ๋ฐ”๊ฟ” ์ด์ „ ์‘๋‹ต๊ณผ ์žฌ์‹œ๋„๋ฅผ ๋ฌดํšจํ™”ํ•œ๋‹ค. ์‹ค์ œ ์„œ๋ฒ„ ์ž‘์—…์„ ์ทจ์†Œํ•˜์ง€ ์•Š๋Š”๋‹ค.
32
+ ์™„๋ฃŒ ์•Œ๋ฆผ ๊ตฌ๋…์ž๊ฐ€ ๋™๊ธฐ์ ์œผ๋กœ resetํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ์ž‘์—…์„ ์‹œ์ž‘ํ•œ ๊ฒฝ์šฐ์—๋„ ์ด์ „ run์€ ignored๋ฅผ
33
+ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด์ „ ์ €์žฅ์˜ ํ›„์† ์ฒ˜๋ฆฌ๊ฐ€ ์ƒˆ ์—”ํ‹ฐํ‹ฐ์˜ ํŽธ์ง‘์ฐฝ์„ ๋‹ซ์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.
32
34
  ์ œํ’ˆ์€ ๊ณ„์ •ยท์—”ํ‹ฐํ‹ฐ ๋ณ€๊ฒฝ ์‹œ ํ•„์š”ํ•œ ์ทจ์†Œ/์žฌ์กฐํšŒ/์บ์‹œ ๋ฌดํšจํ™”๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์˜ค๋ž˜๋œ ์ž‘์—…์ด ์„œ๋ฒ„์—
33
35
  ๋ฐ˜์˜๋์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋ฉด ์ด helper๋งŒ์œผ๋กœ ์ •ํ•ฉ์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
34
36
  - ์ž๋™ ์žฌ์‹œ๋„ยท๋„คํŠธ์›Œํฌยทํƒ€์ด๋จธยท์ €์žฅ์†Œยท์ „์—ญ ์‹ฑ๊ธ€ํ„ด์€ ์—†๋‹ค. ์„ธ์…˜์„ ์—”ํ‹ฐํ‹ฐ๋ณ„๋กœ ์œ ์ง€ํ•œ๋‹ค.
package/docs/asset.md CHANGED
@@ -19,6 +19,13 @@
19
19
  ๋œป์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค(์—์–ด๋ฆฌ์˜ ๋™๋ฌผ). ์ •์ง€ ํ™”๋ฉด์„ ์ œํ’ˆ์ด ์ฃผ์ง€ ๋ชปํ•˜๋ฉด ์žฌ์ƒ๋งŒ ๋ฉˆ์ถ˜๋‹ค.
20
20
  `shouldAnimateAsset(kind, reducedMotion)`์ด ์ด ํŒ๋‹จ์„ ๊ฐ–๋Š”๋‹ค.
21
21
 
22
+ **์žฌ์ƒ ํ—ˆ์šฉ์€ ์ž‘์—… ์„ฑ๊ณต์ด๋‚˜ 1ํšŒ ์žฌ์ƒ ์ด๋ฒคํŠธ๊ฐ€ ์•„๋‹ˆ๋‹ค.** 2026-10-12 ์ž‘์€ ์บ๋ฆญํ„ฐ ๋ชจ์…˜
23
+ ๋ฆฌํฌํŠธ ๋Œ€์กฐ์—์„œ ํ”Œ๋ ˆ์ด์–ด ๊ธฐ๋ณธ ๋ฐ˜๋ณต๊ณผ ์„ฑ๊ณต ํŒ์ •์˜ ๊ฒฝ๊ณ„๋ฅผ ๋ณด๊ฐ•ํ–ˆ๋‹ค. ์Šฌ๋กฏ์˜ `animate`๊ฐ€
24
+ ๋ฐ”๋€Œ๋ฉด ์ œํ’ˆ ์žฌ์ƒ๊ธฐ๋„ ์ •์ง€ ํ‘œํ˜„์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ , ๋กœ๋“œ ์‹คํŒจ์—๋„ ์ƒํƒœ์™€ ํ–‰๋™์„ ๋‚จ๊ธด๋‹ค.
25
+ 1ํšŒ ํ‘œํ˜„์˜ ๋ฐ˜๋ณต ์˜ต์…˜๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ์˜ ์žฌ์ง„์ž… ์žฌ์ƒ ๋ฐฉ์ง€๋Š” ์ œํ’ˆ์ด ์†Œ์œ ํ•œ๋‹ค. ์žฌ์ƒ ์™„๋ฃŒ๋ฅผ
26
+ ์„œ๋ฒ„ ํ™•์ •์ด๋‚˜ ๋‹ค์Œ ๋ฒ„ํŠผ์˜ ํ™œ์„ฑํ™” ์กฐ๊ฑด์œผ๋กœ ์“ฐ์ง€ ์•Š๋Š”๋‹ค
27
+ ([์ฑ„ํƒ ๊ธฐ์ค€๊ณผ ๊ณต์‹ ๊ทผ๊ฑฐ](../../../docs/INTERACTION_QUALITY.md#์บ๋ฆญํ„ฐ๋งค์ฒด-๋ชจ์…˜์˜-์ฑ„ํƒ-๊ธฐ์ค€)).
28
+
22
29
  **๋ณด์กฐ ํ‘œ์‹์€ ์•ก์ž ๋ฐ”๊นฅ ๋ชจ์„œ๋ฆฌ์— ๋ถ™๋Š”๋‹ค.** ์žฌ์ƒ ์•„์ด์ฝ˜์ด ๋งค์ฒด ์œ„์— ์˜ฌ๋ผ๊ฐ€๋ฉด ๊ฐ€์žฅ ์ค‘์š”ํ•œ
23
30
  ํ”„๋ ˆ์ž„ ๊ฐ€์šด๋ฐ๋ฅผ ๊ฐ€๋ฆฐ๋‹ค.
24
31
 
@@ -158,3 +158,14 @@ Spint reproduced the first/last pressed background covering the rounded frame. E
158
158
  use the frame radius minus its border width on their logical outer corners; interior corners keep
159
159
  the item radius. This preserves the existing public API, router activation and focus behavior. Do not
160
160
  clip the entire elevated surface as a workaround: that also clips its shadow and focus outline.
161
+
162
+
163
+ ### ์„ ํƒ ์นด๋“œ (2026-10-12)
164
+
165
+ Spint์—์„œ ๋ชจ๋“  ์ด๋ฆ„ยท๋™์ผ ๋„ˆ๋น„๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์„ ํƒํ•œ ๋ชฉ์ ์ง€๋ฅผ ๋ถ„๋ช…ํžˆ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด
166
+ `configuration={{ presentation: "floating", distribution: "equal", density: "compact", selection: "tile" }}`๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
167
+ ๊ธฐ๋ณธ `selection: "emphasis"`๋Š” ๊ธฐ์กด ์™ธํ˜•์„ ์œ ์ง€ํ•œ๋‹ค. `tile`์€ floatingยทequalยทvisible labels์—๋งŒ ํ—ˆ์šฉ๋œ๋‹ค.
168
+ WebยทNative ๋ชจ๋‘ ๋ง‰๋Œ€์—๋Š” surfaceAccent, ์„ ํƒํ•œ ํ•ญ๋ชฉ์—๋Š” primary/onPrimary๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
169
+ ์—ฐํ•œ ์„ ํƒ ์นด๋“œ๊ฐ€ ๋„ํฌ์™€ ๊ตฌ๋ถ„๋˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ์— ๋”ฐ๋ผ ์„ ํƒํ•œ ์นด๋“œ ์ „์ฒด๋ฅผ ๋ธŒ๋žœ๋“œ ์ƒ‰์œผ๋กœ ์ฑ„์šด๋‹ค.
170
+ ์•ˆ์ชฝ ์—ฌ๋ฐฑ๊ณผ ์นด๋“œ ์‚ฌ์ด ๊ฐ„๊ฒฉ์€ spacing.xxs, ์นด๋“œ ๋ชจ์„œ๋ฆฌ๋Š” radius.lg๋‹ค.
171
+ ๋ผ์šฐํŒ…ยท๋ˆ„๋ฆ„ ๋ฐฉ์ง€ยทํ‚ค๋ณด๋“œยท์ ‘๊ทผ์„ฑยท๋ฐฐ์ง€๋Š” ๊ธฐ์กด BottomNavigation ๊ณ„์•ฝ์„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ฅธ๋‹ค.
@@ -1,6 +1,6 @@
1
1
  # ๋ธŒ๋žœ๋“œ ๊ฒฝ๊ณ„ โ€” ์ œํ’ˆ์ด ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ทธ ๊ฒฝ๋กœ
2
2
 
3
- ์ƒํƒœ: ๊ทœ๋ฒ” ยท ๊ฒ€ํ† ์ผ: 2026-10-07 ยท ์ด ๋ฌธ์„œ๊ฐ€ ๋ธŒ๋žœ๋“œยทํ…Œ๋งˆ ์ฃผ์ž… ๊ทœ์น™์˜ ๋‹จ์ผ ์›๋ณธ์ด๋‹ค.
3
+ ์ƒํƒœ: ๊ทœ๋ฒ” ยท ๊ฒ€ํ† ์ผ: 2026-10-13 ยท ์ด ๋ฌธ์„œ๊ฐ€ ๋ธŒ๋žœ๋“œยทํ…Œ๋งˆ ์ฃผ์ž… ๊ทœ์น™์˜ ๋‹จ์ผ ์›๋ณธ์ด๋‹ค.
4
4
  [theming.md](./theming.md)๋Š” ์‚ฌ์šฉ๋ฒ• ์˜ˆ์‹œ, [consumer-policy.md](./consumer-policy.md)๋Š” ์ฑ„ํƒ ์ •์ฑ…,
5
5
  [design-system-provider.md](./design-system-provider.md)๋Š” ํ™˜๊ฒฝ ์ถ• ์„ค๊ณ„๋ฅผ ๋‹ค๋ฃจ๋ฉฐ ๋ธŒ๋žœ๋“œ ๊ทœ์น™์€ ์—ฌ๊ธฐ๋กœ ๋งํฌํ•œ๋‹ค.
6
6
 
@@ -25,7 +25,7 @@ CSS ๋ณ€์ˆ˜ ์žฌ์ •์˜, ์ œํ’ˆ ์ž์ฒด ํ† ํฐ ์ƒ์„ฑ๊ธฐ)์˜€๊ณ , ๋ฌธ์„œ ์„ธ ๊ฐœ๊ฐ€
25
25
  17๊ฐœ key๋ฅผ ๋ชจ๋‘ ์ฑ„์šด `brandPalette`๋Š” ํ—ˆ์šฉ๋˜์ง€๋งŒ ์•„๋ž˜ ๋Œ€๋น„ ๊ฒ€์‚ฌ๋ฅผ ๋ฐ˜๋“œ์‹œ ํ†ต๊ณผํ•ด์•ผ ํ•œ๋‹ค.
26
26
 
27
27
  2026-10-07 ์‚ฌ์šฉ์ž ์š”์ฒญ์œผ๋กœ ์ƒ‰๋ฟ ์•„๋‹ˆ๋ผ ์งˆ๊ฐยท์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ณธ ์ „ํ™˜ยท๊ตฌ์„ฑยทํ™”๋ฉด ๋ฐฐ์น˜๋ฅผ ํ•œ ๋ฒˆ ์„ ํƒํ•˜๋Š”
28
- [๋””์ž์ธ ํ”„๋กœํ•„](./design-profile.md)์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค(ํ˜„์žฌ ์‹คํ—˜ยท๋ฏธ๊ฒŒ์‹œ). `defineHjmDesignProfile`๋กœ ์ •๊ทœํ™”ํ•œ
28
+ [๋””์ž์ธ ํ”„๋กœํ•„](./design-profile.md)์„ ์ œ๊ณตํ•œ๋‹ค. ์ œ๊ณต ๋ฒ„์ „๊ณผ ์ง€์› ์ถ•์€ ํ•ด๋‹น ๊ณ„์•ฝ์„ ๋”ฐ๋ฅธ๋‹ค. `defineHjmDesignProfile`๋กœ ์ •๊ทœํ™”ํ•œ
29
29
  ์•ฑ ์†Œ์œ  ๋ฐ์ดํ„ฐ๋ฅผ Provider์˜ `designProfile`๋กœ ์ฃผ์ž…ํ•œ๋‹ค. CSS/์ „์ฒด value ์šฐํšŒ๋‚˜ ํ…Œ๋งˆ๋ณ„ ์ƒํƒœ ์—”์ง„ ๋ณต์ œ๋Š”
30
30
  ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. `brandPalette`๋Š” ํ”„๋กœํ•„์˜ ํ•ด๋‹น light/dark ํŒ”๋ ˆํŠธ ์œ„์— ๋ณ‘ํ•ฉ๋œ๋‹ค. ๊ธ€๊ผด ์ž์‚ฐยท๋กœ๊ณ ยท๋ฌธ๊ตฌยท๋ฐ์ดํ„ฐ๋Š”
31
31
  ์ œํ’ˆ ์†Œ์œ ์ด๋ฉฐ ํ˜„์žฌ ์—ฐ๊ฒฐ ๋ฒ”์œ„์™€ ๋ฏธ์ง€์› ํ‘œํ˜„์€ ํ”„๋กœํ•„ ๊ณ„์•ฝ์— ๋ช…์‹œํ•œ๋‹ค.
@@ -68,7 +68,7 @@ HJM ๊ธฐ๋ณธ lightยทdark ํŒ”๋ ˆํŠธ๋„ ๊ฐ™์€ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•œ๋‹ค(`test/palette-
68
68
 
69
69
  ### ๊ธฐ์กด ์žฌ์ •์˜๋Š” ์ถ”์ ๋˜๋Š” ๋ถ€์ฑ„๋‹ค
70
70
 
71
- 2026-09-26 ๊ธฐ์ค€ ์ œํ’ˆ web stylesheet์˜ `.hjm-*` ์žฌ์ •์˜: ๋‹ค์—๋ฆฌ 61์ค„, ๋ฒˆ๋š 26์ค„. ์ œํ’ˆ์€ ์ด ๋ชฉ๋ก์„ ํ•œ ๊ณณ์— ๋ชจ์œผ๊ณ ,
71
+ ๊ธฐ์กด ์ œํ’ˆ stylesheet์˜ ์žฌ์ •์˜๋Š” ์ œํ’ˆ์˜ ๊ธฐ์กด ์ž‘์—… ๊ธฐ๋ก ํ•œ ๊ณณ์—์„œ ์ถ”์ ํ•˜๊ณ ,
72
72
  ๊ฐ ์ค„์„ (1) `brandPalette` key, (2) HJM recipe ์ถ• ์š”์ฒญ(์ด์Šˆ), (3) ์‚ญ์ œ ์ค‘ ํ•˜๋‚˜๋กœ ์˜ฎ๊ธด๋‹ค. ์ƒˆ ์žฌ์ •์˜๋Š” ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.
73
73
 
74
74
  ### ์ด๊ด€ ๊ฒฝ๋กœ: ๋ ˆ์ด์–ด๋œ stylesheet (opt-in)
@@ -46,3 +46,7 @@ Native host ๋ฒˆ์—ญ ํšŒ๊ท€๋Š” ์‹ค์ œ OS touch/VoiceOver/ํ‚ค๋ณด๋“œ ์„ฑ๋Šฅ๊ณผ ๊ตฌ
46
46
  ๊ณต์‹ host ๊ทผ๊ฑฐ: [React Native ScrollView](https://reactnative.dev/docs/scrollview),
47
47
  [Web scrollLeft](https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollLeft),
48
48
  [ResizeObserver](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver).
49
+
50
+ 2026-10-13 ํ‚ค๋ณด๋“œ ๋ณต๊ตฌ ๊ฒ€์ˆ˜: Web์—์„œ ์ดˆ์ ์ด ์žˆ๋˜ ์นด๋“œ๊ฐ€ ์‚ญ์ œ๋˜๋ฉด ๋ ˆ์ผ์˜ ์ด๋ฆ„ ์žˆ๋Š”
51
+ list viewport์— ์ดˆ์ ์„ ๋Œ๋ ค ๋‹ค์Œ ํ‚ค๋ณด๋“œ ํƒ์ƒ‰์„ ์ด์–ด ๊ฐ„๋‹ค. ์ƒ์กดํ•˜๋Š” ์ž…๋ ฅ๊ณผ ๋ ˆ์ผ ๋ฐ–์˜
52
+ ์ดˆ์ ์€ ์˜ฎ๊ธฐ์ง€ ์•Š๋Š”๋‹ค. Native์˜ ์‹ค์ œ ์ ‘๊ทผ์„ฑ ์ดˆ์  ๋ณต๊ตฌ๋Š” ์ด Web ๋™์ž‘์˜ ๊ฒ€์ฆ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.
@@ -1,6 +1,6 @@
1
1
  # Compound controls
2
2
 
3
- Reviewed: 2026-10-01. Web and React Native expose identical optional entry names:
3
+ Reviewed: 2026-10-13. Web and React Native expose identical optional entry names:
4
4
  `/duration-field`, `/inline-confirm`, `/reaction-picker`, `/notification-bell`.
5
5
  These are compositions of existing canonical controls, not replacements for them.
6
6
  The 2026-10-01 visual integration request calls for reusable interactions as well as
@@ -25,9 +25,14 @@ Use for a local explicit confirmation when an overlay would interrupt the contex
25
25
  Pass `label`, `prompt`, `confirmLabel`, `cancelLabel`, `pendingLabel`,
26
26
  `successLabel`, `errorLabel`, and `onConfirm(): void | Promise<void>`.
27
27
  The existing AlertDialog session owns async deduplication, pending and retry.
28
- No action runs on the initial trigger. Pending disables both actions; rejection
28
+ No action runs on the initial trigger. If props change while the prompt is open,
29
+ confirmation uses the current `onConfirm`, matching the currently displayed prompt
30
+ (2026-10-13 stale-action regression). Pending blocks both actions; Web loading retains the confirmation button focus. Rejection
29
31
  shows the supplied safe error text and permits retry. Web initially focuses cancel,
30
- Escape cancels, and cancellation restores trigger focus. Native exposes the
32
+ Escape cancels, and cancellation restores trigger focus. On success, Web moves focus from
33
+ the retiring confirmation group to the result, while preserving intentional focus elsewhere.
34
+ The 2026-10-13 example audit found that native-disabled DOM buttons lost keyboard focus
35
+ during pending; the existing loading contract now blocks repeats without losing focus. Native exposes the
31
36
  controls and live error text through its host accessibility APIs.
32
37
  Native keeps the localized status text available to assistive technology. iOS
33
38
  receives one explicit announcement per prompt/pending/error/success transition;
@@ -2,12 +2,15 @@
2
2
 
3
3
  ์ƒํƒœ: **Normative**
4
4
  ์ •์ฑ… ๋ฒ„์ „: **2.0.0**
5
- ๊ฒ€ํ† ์ผ: 2026-10-06 ยท Web `layoutStyle` ์ „์ˆ˜ ์ œ๊ณต(์ด์ „: 2026-10-02 deprecated API ์ œ๊ฑฐ)
5
+ ๊ฒ€ํ† ์ผ: 2026-10-13 ยท ํ˜„์žฌ ์†Œ๋น„ ๊ณ„์•ฝ๊ณผ ๋ณ€๊ฒฝ ๋ฒ”์œ„ ๊ฒ€์ฆ
6
6
  ์ ์šฉ ๋Œ€์ƒ: ์‹ ๊ทœ HJM WebยทReact Native ์•ฑ๊ณผ ๊ธฐ์กด ์•ฑ์˜ ์ƒˆ ํ™”๋ฉด
7
7
 
8
8
  ์ด ์›๋ฌธ์€ `@hjmds/design-contracts/consumer-policy.md`์—์„œ ์ œ๊ณตํ•œ๋‹ค. ์†Œ๋น„ ์•ฑ์€ ์„ค์น˜ํ•œ
9
9
  ํŒจํ‚ค์ง€ ๋ฒ„์ „์˜ ์ •์ฑ…๊ณผ HJM-APP-STANDARD release snapshot์„ ํ•จ๊ป˜ ํ™•์ธํ•œ๋‹ค. ์ด checkout์˜
10
- 1.11 ์†Œ์Šค ๊ฐฑ์‹ ์„ ์•„์ง ์„ค์น˜ํ•˜์ง€ ์•Š์€ ์•ฑ์— ์ž๋™ ์ ์šฉ๋œ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•˜์ง€ ์•Š๋Š”๋‹ค.
10
+ ๋ฏธ๊ฒŒ์‹œ ๋ณ€๊ฒฝ์„ ์„ค์น˜๋œ ํŒจํ‚ค์ง€์˜ ๊ธฐ๋Šฅ์œผ๋กœ ํŒ๋‹จํ•˜์ง€ ์•Š๋Š”๋‹ค.
11
+
12
+ 2026-10-13 ์ง€์นจ ์ ๊ฒ€์—์„œ ์ข…๋ฃŒ๋œ foundation bridge์™€ ์Šคํƒ€์ผ ์ œ๊ฑฐ ์˜ˆ์ • ์กฐ๊ฑด์ด ํ˜„์žฌ ๊ทœ์น™์—
13
+ ๋‚จ์•„ ์žˆ์—ˆ๋‹ค. ํ•ด๋‹น ๋ ˆ๊ฑฐ์‹œ ์ ˆ์ฐจ๋Š” ์ œ๊ฑฐํ•˜๊ณ  ๊ณผ๊ฑฐ ๋ฒ„์ „์˜ ์ด๊ด€ํ‘œ์™€ ๊ฒ€์ฆ ๊ธฐ๋ก์€ ๋ณด์กดํ•œ๋‹ค.
11
14
 
12
15
  ์ด ๋ฌธ์„œ๋Š” "HJM๋‹ต๊ฒŒ ๋ณด์ธ๋‹ค"๋ฅผ ํŠน์ • ํ™”๋ฉด ๋ณต์ œ๋กœ ์ •์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ œํ’ˆ์ด ๊ณต์œ ํ•ด์•ผ
13
16
  ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ณด ์œ„๊ณ„, semantic role, ์ƒํƒœ ํ”ผ๋“œ๋ฐฑ, ์ ‘๊ทผ์„ฑ ํ’ˆ์งˆ๊ณผ ํ”Œ๋žซํผ๋ณ„ ํ–‰๋™์ž…๋‹ˆ๋‹ค.
@@ -24,6 +27,10 @@
24
27
  - ์•ฑ runtime์€ granular subpath๋ฅผ ์šฐ์„ ํ•˜๊ณ  catalogยทshowcaseยทevidence entry๋Š” CI๋‚˜
25
28
  tooling์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(SHOULD).
26
29
 
30
+ ์ €์žฅ์†Œ์˜ `module.contract.json` ์†Œ๋น„ ๋ชฉ๋ก์€ ํ˜ธํ™˜์„ฑ ๊ฒ€ํ†  ๋Œ€์ƒ์„ ๊ธฐ๋กํ•˜๋ฉฐ ์„ค์น˜ยท๋ฐฐํฌ ์™„๋ฃŒ๋ฅผ
31
+ ๋œปํ•˜์ง€ ์•Š๋Š”๋‹ค. 2026-10-13 ์‹ค์ œ package ์˜์กด์„ฑ์„ ๋Œ€์กฐํ•ด ๋ˆ„๋ฝ๋œ Utilverse์™€ App Release Hub๋ฅผ
32
+ ์ถ”๊ฐ€ํ–ˆ๋‹ค. Hub๋Š” ์ •์ฑ… ์‚ฌ์ดํŠธ ์ƒ์„ฑ์— colors/foundations๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ renderer ์ด๊ด€๊ณผ ๊ตฌ๋ถ„ํ•œ๋‹ค.
33
+
27
34
  ## 2. ์„ฑ์ˆ™๋„๋ณ„ ์ฑ„ํƒ
28
35
 
29
36
  | ์‚ฌ์šฉํ•  surface ์ƒํƒœ | ์‹ ๊ทœ ์•ฑ ๊ธฐ๋ณธ ์ •์ฑ… | ์ถ”๊ฐ€ ์กฐ๊ฑด |
@@ -34,7 +41,8 @@
34
41
  | `deprecated` | ์‹ ๊ทœ ์‚ฌ์šฉ ๊ธˆ์ง€ | ๊ณต์ง€๋œ migration ๊ธฐํ•œ ์•ˆ์— ์ œ๊ฑฐ |
35
42
 
36
43
  `surfaceStatus`๊ฐ€ ์‚ฌ์šฉ ํ”Œ๋žซํผ์˜ ์ฑ„ํƒ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค. contract `status`๊ฐ€ stable์ด์–ด๋„
37
- ๋‹ค๋ฅธ renderer๊นŒ์ง€ ์•ˆ์ •ํ™”๋๋‹ค๋Š” ๋œป์€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด TopBar๋Š” Web stable / Native beta์ž…๋‹ˆ๋‹ค.
44
+ ๋‹ค๋ฅธ renderer๊นŒ์ง€ ์•ˆ์ •ํ™”๋๋‹ค๋Š” ๋œป์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ฐ’์€ ์„ค์น˜ ๋ฒ„์ „์˜
45
+ [์„ฑ์ˆ™๋„ ํ‘œ](generated/component-maturity.md)๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Storybook์˜ ๋ฐฐํฌ/์‹คํ—˜์€ API ์•ˆ์ •์„ฑ์ด๋‚˜ npm ๊ฒŒ์‹œ ์ƒํƒœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
38
46
 
39
47
  ์‹ ๊ทœ ์•ฑ scaffold์˜ ๊ธฐ๋ณธ ์„ ํƒ์€ Stable Core์ž…๋‹ˆ๋‹ค(SHOULD). Beta ์‚ฌ์šฉ์€ ์ •์ฑ… ์˜ˆ์™ธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
40
48
  ์•ฑ์˜ ๊ธฐ์กด contract ๋˜๋Š” TASKS ํ•œ ๊ณณ์— ์ปดํฌ๋„ŒํŠธยทํ‘œ๋ฉด, ์‚ฌ์šฉํ•˜๋Š” ์ด์œ , ๋‹ด๋‹น์ž์™€ ๊ด€๋ จ ํšŒ๊ท€
@@ -42,40 +50,12 @@
42
50
  ์žฌ๊ฒ€ํ†  ๋‚ ์งœ๋Š” ์š”๊ตฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๊ธฐ๊ธฐยท๋ธŒ๋ผ์šฐ์ € QA๋Š” ๋ฐ”๋€ ์‚ฌ์šฉ์ž ํ๋ฆ„๊ณผ ํ”Œ๋žซํผ ์œ„ํ—˜์—
43
51
  ๋งž์ถฐ ์•ฑ ๋ฆด๋ฆฌ์Šค์—์„œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. Beta๋ผ๋Š” ์ด์œ ๋งŒ์œผ๋กœ ์ œํ’ˆ ์ „์ฒด QA๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
44
52
 
45
- 2026-09-29 ์ ๊ฒ€์—์„œ HJM ์ž์ฒด ๊ฒ€์ฆ์„ ํ†ต๊ณผํ•œ ํ‘œ์‹œ ์ปดํฌ๋„ŒํŠธ๋„ ์ œํ’ˆ ์ˆ˜ยท๋ฐฐํฌ ์ด๋ ฅ ๋•Œ๋ฌธ์—
46
- ์Šน๊ฒฉ์ด ๋ง‰ํ˜”์Šต๋‹ˆ๋‹ค. 1.4.0์€ ์ปดํฌ๋„ŒํŠธ ํ˜ธํ™˜์„ฑ ์•ฝ์†๊ณผ ์ œํ’ˆ ๋ฆด๋ฆฌ์Šค ๊ฒ€์ฆ์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
47
- [์Šน๊ฒฉ ๊ธฐ์ค€](stable-promotion.md)์„ ๋”ฐ๋ฅด๋ฉฐ ๊ธฐ์กด versioned app profile์˜ ๊ฒ€์‚ฌ ์š”๊ฑด์€ ๊ทธ
48
- profile์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ฐฑ์‹ ํ•˜๊ธฐ ์ „๊นŒ์ง€ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
49
-
50
- ### 2.1 Stable Core์™€ ํ•„์ˆ˜ foundation bridge
51
-
52
- 1.5.0์—์„œ Stable Core๋Š” 17๊ฐœ ์ปดํฌ๋„ŒํŠธ์˜€์Šต๋‹ˆ๋‹ค. 1.4๊นŒ์ง€์˜ `Surface`, `Button`, `Field`, `TextArea`์—
53
- ๋”ํ•ด, ์ฒซ ์ œํ’ˆ ํ™”๋ฉด์— ํ•„์š”ํ•œ foundation์ธ `Text`, `Icon`, `Stack`, `Container`,
54
- `DesignSystemProvider`์™€ ์„ธ ์ œํ’ˆ ์ด์ƒ์ด ์“ฐ๋Š” `IconButton`, `Badge`, `Card`, `Tag`, `Notice`,
55
- `Progress`, `Spinner`, `Skeleton`์ด stable๋กœ ์Šน๊ฒฉ๋์Šต๋‹ˆ๋‹ค. ์Šน๊ฒฉ ๊ทผ๊ฑฐ๋Š” ์ด๋ฆ„๋ฟ์ด๋˜ ์‹œ๋‚˜๋ฆฌ์˜ค ์ฆ๊ฑฐ๋ฅผ
56
- ์‹ค์ œ ๊ณ„์‚ฐ ์Šคํƒ€์ผ ๊ฒ€์‚ฌ๋กœ ๋ฐ”๊พผ ๋’ค ๋‘ renderer์—์„œ ์š”๊ตฌ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ๋ชจ๋‘ ํ†ต๊ณผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค
57
- ([Stable Core](stable-core.md)). ์ด๋ฒˆ ๊ฐœ์ •์—์„œ๋Š” `Divider`, `Section`, `ListRow`, `Statistic`,
58
- `DescriptionList`, `EmptyState`, `Result`, `Heading`, `Top`, `BottomCTA`๋ฅผ ์–‘์ชฝ์—์„œ ์Šน๊ฒฉํ•˜๊ณ ,
59
- `TopBar`๋Š” ๊ณ„์•ฝยทWeb๋งŒ ์Šน๊ฒฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณ„์•ฝ/Web stable์€ 28๊ฐœ, Native stable์€ 27๊ฐœ์ž…๋‹ˆ๋‹ค.
60
- ๋ฐฐํฌ๋œ ํŒจํ‚ค์ง€์˜ catalog๊ฐ€ ์†Œ๋น„ ์•ฑ์˜ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค. ๋‚จ์€ beta๋ฅผ `stable`๋กœ
61
- ๊ฐ„์ฃผํ•˜๊ฑฐ๋‚˜ `betaAdoptions: []`๋กœ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(MUST NOT).
62
-
63
- HJM-APP-STANDARD๊ฐ€ versioned `requiredFoundations` ๋ชฉ๋ก์„ ์„ ์–ธํ•œ ๊ฒฝ์šฐ ๋‹ค์Œ bridge๋ฅผ
64
- ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
65
-
66
- - ํ•„์ˆ˜ foundation์˜ ์ฑ„ํƒ ์ด์œ ์™€ ์ตœ์†Œ ๋ชฉ๋ก์€ ์ค‘์•™ profile์ด ์†Œ์œ ํ•ฉ๋‹ˆ๋‹ค. ์•ฑ๋งˆ๋‹ค ๊ฐ™์€
67
- ์„ ํƒ ์ด์œ ๋ฅผ ์ƒˆ๋กœ ๋ฐœ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(MUST).
68
- - ๊ฐ ์•ฑ์€ ์‹ค์ œ adapter์™€ ์‚ฌ์šฉ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ evidence๋ฅผ ์†Œ์œ ํ•ฉ๋‹ˆ๋‹ค(MUST). `draft` /
69
- `incubating` contract์—์„œ๋Š” evidence๊ฐ€ `planned`์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, `active` ๋˜๋Š” release gate๋Š”
70
- timestamp๊ฐ€ ์žˆ๋Š” `verified` evidence ์—†์ด๋Š” ํ†ต๊ณผํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค(MUST NOT).
71
- - ์ค‘์•™ ํ•„์ˆ˜ ๋ชฉ๋ก ๋ฐ–์˜ `beta`๋Š” ์ œํ’ˆ๋ณ„ optional adoption์ด๋ฉฐ ยง2์˜ ๊ฐ„๋‹จํ•œ ์ฑ„ํƒ ๊ธฐ๋ก์„
72
- ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ „ profile์ด ADRยทverified evidence๋ฅผ ์š”๊ตฌํ•˜๋ฉด ํ•ด๋‹น profile ๊ฐฑ์‹  ๋•Œ ์ด๊ด€ํ•ฉ๋‹ˆ๋‹ค.
73
- - foundation์ด catalog์—์„œ `stable`๋กœ ์Šน๊ฒฉ๋˜๋ฉด ๊ธฐ์กด ํ‘œ์ค€์˜ ์˜๋ฏธ๋ฅผ ์กฐ์šฉํžˆ ๋ฐ”๊พธ์ง€ ์•Š๊ณ 
74
- ๋‹ค์Œ versioned app profile์—์„œ bridge ๋ชฉ๋ก์„ ์ค„์ž…๋‹ˆ๋‹ค(MUST).
75
-
76
- ์ด bridge๋Š” ์„ฑ์ˆ™๋„ ์˜ˆ์™ธ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ณต๊ฐœ๋œ ์ž„์‹œ ์ฑ„ํƒ ๊ณ„์•ฝ์ž…๋‹ˆ๋‹ค. 1.5.0์—์„œ bridge์˜ ๋‹ค์„ฏ
77
- foundation์ด ๋ชจ๋‘ stable์ด ๋์œผ๋ฏ€๋กœ, ์ค‘์•™ app profile์˜ ๋‹ค์Œ ๊ฐœ์ •์—์„œ `requiredFoundations`
78
- ๋ชฉ๋ก์„ ๋น„์›๋‹ˆ๋‹ค. ๊ฐœ์ • ์ „๊นŒ์ง€ ๊ธฐ์กด profile์„ ์“ฐ๋Š” ์•ฑ์˜ evidence ์š”๊ตฌ๋Š” ์กฐ์šฉํžˆ ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
53
+ ์ปดํฌ๋„ŒํŠธ ์Šน๊ฒฉ์€ [์Šน๊ฒฉ ๊ธฐ์ค€](stable-promotion.md)์„ ๋”ฐ๋ฅด๊ณ  ๊ณผ๊ฑฐ ํŒ์ •์€
54
+ [Stable Core ๊ธฐ๋ก](stable-core.md)์— ๋ณด์กดํ•œ๋‹ค. ํ˜„์žฌ ๊ทœ์น™์— ์ด์ „ ๋ฒ„์ „์˜ ๊ฐœ์ˆ˜๋‚˜ ์ž„์‹œ foundation
55
+ bridge๋ฅผ ๋ณต์ œํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ตฌ๋ฒ„์ „ ์†Œ๋น„์ž๋Š” ์„ค์น˜๋œ ์ •์ฑ…ยทprofile๊ณผ ํ•ด๋‹น ์ด๊ด€ํ‘œ๋ฅผ ํ™•์ธํ•œ๋‹ค.
56
+
57
+ ํ™”๋ฉด์€ [์„ ํƒ ๊ธฐ์ค€](usage/SELECTION.md)์— ๋”ฐ๋ผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ, ๊ณต๊ฐœ ์Šฌ๋กฏ ํ™•์žฅ, ์ œํ’ˆ ์ „์šฉ ๊ตฌ์„ฑ ์ค‘ ๊ณ ๋ฅธ๋‹ค.
58
+ ์ด๋ฆ„์ด ๊ฐ™๋‹ค๋Š” ์ด์œ ๋กœ ์ €์žฅยท์Šคํฌ๋กคยท๊ถŒํ•œ ํ๋ฆ„์ด ๋‹ค๋ฅธ ํ™”๋ฉด์— ๊ณตํ†ต API๋ฅผ ๊ฐ•์ œํ•˜์ง€ ์•Š๋Š”๋‹ค.
79
59
 
80
60
  ## 3. ์ฝ”๋“œ ๊ฒฝ๊ณ„
81
61
 
@@ -85,83 +65,22 @@ foundation์ด ๋ชจ๋‘ stable์ด ๋์œผ๋ฏ€๋กœ, ์ค‘์•™ app profile์˜ ๋‹ค์Œ ๊ฐœ์ •
85
65
  ๋˜๋Š” ์ œํ’ˆ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(MUST).
86
66
  - ๋„๋ฉ”์ธ ์ƒํƒœ๋Š” ํ™”๋ฉด๋งˆ๋‹ค ์ƒ‰์„ ์ •ํ•˜์ง€ ์•Š๊ณ  ์ œํ’ˆ ์–ด๋Œ‘ํ„ฐ์—์„œ HJM `AccentTone`๊ณผ component
87
67
  variant์— ๋งคํ•‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(MUST).
88
- - HJM component์˜ `style` escape hatch๋Š” ๋ฐฐ์น˜์šฉ margin, width, flex์™€ ํ™”๋ฉด composition์—๋งŒ
68
+ - HJM component์˜ `layoutStyle`์€ ๋ฐฐ์น˜์šฉ margin, width, flex์™€ ํ™”๋ฉด composition์—๋งŒ
89
69
  ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(SHOULD). color, typography, radius, control height์™€ interaction state๋ฅผ
90
70
  ๋ฎ์–ด์“ฐ๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค(MUST NOT).
91
71
  - ํ”Œ๋žซํผ primitive๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ ‘๊ทผ์„ฑ ๋˜๋Š” ํ”Œ๋žซํผ ๊ด€์Šต ๋•Œ๋ฌธ์— ํ•„์š”ํ•œ adapter์—
92
72
  ํ•œ์ •ํ•˜๊ณ , ๊ทธ ์ด์œ ๋ฅผ ํ•ด๋‹น adapter test๋กœ ๊ณ ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(MUST).
93
73
 
94
- ### 3.1 React Native legacy style compatibility boundary
95
-
96
- 2026-10-02 ์ „์ฒด ์†Œ๋น„ ๋ฒ„์ „์—… ๊ฒฐ์ •์— ๋”ฐ๋ผ deprecated ๊ณต๊ฐœ ์Šคํƒ€์ผ ํ†ต๋กœ๋Š” 1.11์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
97
- ์ •ํ™•ํ•œ ์ œ๊ฑฐ ์†์„ฑ๊ณผ ๋Œ€์ฒด API๋Š” [1.11 ์ด๊ด€ํ‘œ](migration-native-legacy-removal.md)๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
98
- 1.x ์„ค์น˜๋ณธ์˜ caller-last ํ˜ธํ™˜ ๋™์ž‘์€ ์—ญ์‚ฌ์  ๋™์ž‘์ด๋ฉฐ ํ˜„์žฌ ์†Œ์Šค์— ์œ ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
99
-
100
- - ๋ฐฐ์น˜์—๋Š” `layoutStyle`์„ ์“ฐ๊ณ , ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ์™ธ๋ถ€ composition wrapper๋ฅผ ์”๋‹ˆ๋‹ค.
101
- Web์€ 2026-10-06๋ถ€ํ„ฐ ํ™”๋ฉด ํ๋ฆ„ ์•ˆ์— ๋ฃจํŠธ๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ๊ณต๊ฐœ ์ปดํฌ๋„ŒํŠธ๊ฐ€ `layoutStyle`์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
102
- ์‚ฌ์šฉ ์ง€์นจ์„ ์“ฐ๋‹ค๊ฐ€ ์ผ๋ถ€ ์ปดํฌ๋„ŒํŠธ์—๋งŒ ์ด prop์ด ์žˆ์–ด wrapper๋‚˜ ๋‚ด๋ถ€ input์— ๊ฑธ๋ฆฌ๋Š” `style`๋กœ
103
- ๋ฐฐ์น˜ํ•˜๋˜ ๊ฒƒ์„ ํ™•์ธํ•ด ๋„“ํ˜”์Šต๋‹ˆ๋‹ค. ์ œ์™ธ ๋Œ€์ƒ์€ providerยทportal/viewport layerยทrecipe๊ฐ€ ์œ„์น˜๋ฅผ ๊ณ ์ •ํ•˜๋Š”
104
- ์š”์†Œ์ด๋ฉฐ ๊ทธ ๋ชฉ๋ก๊ณผ ์ด์œ ๋Š” `@hjmds/react`์˜ `composition-style.ts`์™€ ๊ฐ props ํƒ€์ž… ์ฃผ์„์— ์žˆ์Šต๋‹ˆ๋‹ค.
105
- - `HjmCompositionStyle` / `layoutStyle`์€ margin, width, flex ๊ณ„์—ด๊ณผ `alignSelf`๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. color,
106
- typography, padding, gap, border, radius, height, opacity, transform์€ recipe/semantic API ์†Œ์œ ์ž…๋‹ˆ๋‹ค.
107
- - ๋‚ด๋ถ€ ์กฐํ•ฉ์˜ ์Šคํƒ€์ผ์€ ๋น„๊ณต๊ฐœ renderer์— ๋‘๋ฉฐ ์•ฑ์—์„œ ํ•ด๋‹น ๋‚ด๋ถ€ ํŒŒ์ผ์„ importํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
108
- - ์ •์‹ ํ”Œ๋žซํผ hostยท์ œํ’ˆ ์†Œ์œ  ์Šฌ๋กฏยท์ด๋ฏธ์ง€ renderer ์Šคํƒ€์ผ์„ deprecated ๋ณ„์นญ๊ณผ ํ˜ผ๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
109
-
110
- ์†Œ๋น„ ์•ฑ์˜ legacy prop์ด ์‹ค์ œ๋กœ ๋ฌด์—‡์„ ๋ฎ์–ด์“ฐ๊ณ  ์žˆ์—ˆ๋Š”์ง€ ํ™•์ธํ•œ ๋’ค, ๋ฐฐ์น˜๊ฐ€ ์•„๋‹Œ ๊ฐ’์€
111
- semantic axis๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ๊ทธ ์ถ•๊ณผ ๋Œ€์ฒด ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค.
112
-
113
- | ์ œํ’ˆ์ด ๋ฎ์–ด์ผ๋˜ ๊ฒƒ | semantic axis |
114
- | --- | --- |
115
- | ์ปจํŠธ๋กค์— `minHeight: 44`๋ฅผ ๋‹ค์‹œ ์–น์–ด compact recipe์˜ 36pt๋ฅผ ๊ฐ€๋ฆฌ๊ธฐ | provider ํ™˜๊ฒฝ์˜ `minimumVisualTarget` |
116
- | Button `borderRadius: 999`๋กœ pill ๋งŒ๋“ค๊ธฐ | `shape="pill"` |
117
- | Button `justifyContent: "flex-start"`๋กœ ๋ผ๋ฒจ ์ขŒ์ธก ์ •๋ ฌ | `align="leading"` |
118
- | ListRow leading slot์— 40pt ์›ํ˜• avatar ํ”„๋ ˆ์ž„์„ ์ œํ’ˆ์ด ๋‹ค์‹œ ๊ณ„์‚ฐ | `leadingShape` (`listRowRecipe.leadingSize`๋ฅผ renderer๊ฐ€ ๋ฐ”์ธ๋”ฉ) |
119
- | ์ค‘์ฒฉ web Provider์˜ `display: contents` ์ธ๋ผ์ธ ์ค‘ํ™” | `host="contents"` |
120
- | secondary ์ปจํŠธ๋กค ํ…Œ๋‘๋ฆฌ๋ฅผ ์ œํ’ˆ boundary ์ƒ‰์œผ๋กœ ๋ฎ๊ธฐ | `borderControl` semantic key + `semanticColors.border.control` |
121
-
122
- ### Web renderer์˜ ์บ์Šค์ผ€์ด๋“œ
123
-
124
- `@hjmds/react/styles.css`๋Š” **CSS ๋ ˆ์ด์–ด ๋ฐ–**์— ์žˆ๋‹ค(๋ ˆ์ด์–ด๋œ opt-in ํŒŒ์ผ๊ณผ ์ „ํ™˜ ์กฐ๊ฑด์€
125
- [brand-boundary.md ยง3](./brand-boundary.md#3-css-์žฌ์ •์˜๋Š”-์ง€์›ํ•˜๋Š”-ํ…Œ๋งˆ-๊ฒฝ๋กœ๊ฐ€-์•„๋‹ˆ๋‹ค)). Tailwind 4๋ฅผ ์“ฐ๋Š” ์†Œ๋น„ ์•ฑ์˜
126
- ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” `@layer utilities` ์•ˆ์— ๋“ค์–ด๊ฐ€๊ณ , ๋ ˆ์ด์–ด ๋ฐ– ๊ทœ์น™์€ ๋ ˆ์ด์–ด ์•ˆ ๊ทœ์น™์„
127
- ์ด๊ธด๋‹ค. ๋”ฐ๋ผ์„œ HJM ์ปดํฌ๋„ŒํŠธ์— `px-0`ยท`rounded-none`ยท`justify-start` ๊ฐ™์€
128
- ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ๋ถ™์—ฌ recipe ๊ฐ’์„ ๋ฎ์œผ๋ ค๋Š” ์‹œ๋„๋Š” **์กฐ์šฉํžˆ ์•„๋ฌด ์ผ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.**
129
-
130
- ์ด๊ฑด ๊ฒฐํ•จ์ด ์•„๋‹ˆ๋ผ ์ด ์ •์ฑ…์ด ์˜๋„ํ•œ ๊ฒฐ๊ณผ๋‹ค โ€” recipe ์†Œ์œ  ๊ฐ’์€ ์ง€๋‚˜๊ฐ€๋Š”
131
- ์œ ํ‹ธ๋ฆฌํ‹ฐ๋กœ ํ”๋“ค๋ฆฌ๋ฉด ์•ˆ ๋œ๋‹ค. ๋‹ค๋งŒ **์กฐ์šฉํ•˜๋‹ค**๋Š” ์ ์ด ๋ฌธ์ œ๋ผ, ์†Œ๋น„ ์•ฑ์€ ๋‹ค์Œ์„
132
- ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
133
-
134
- - ์œ ํ‹ธ๋ฆฌํ‹ฐ๋กœ recipe ๊ฐ’์„ ๋ฎ๋Š” ์ฝ”๋“œ๋Š” ๋ฆฌ๋ทฐ์—์„œ ๊ฑธ๋Ÿฌ์•ผ ํ•œ๋‹ค. ํ•„์š”ํ•œ ๊ฐ’์€ semantic
135
- axis๋กœ ์š”์ฒญํ•œ๋‹ค.
136
- - HJM์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์€ `.hjm-*` ์žฌ์ •์˜๋กœ ์šฐํšŒํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ณ„์•ฝ ๊ณต๋ฐฑ์œผ๋กœ ์˜ฌ๋ฆฐ๋‹ค. ๊ธฐ์กด ์žฌ์ •์˜๋Š”
137
- ์ถ”์ ๋˜๋Š” ๋ถ€์ฑ„์ด๋ฉฐ ์ด๊ด€ ๊ฒฝ๋กœ(opt-in `styles.layered.css`)์™€ ๊ทœ์น™์€ [brand-boundary.md](./brand-boundary.md)๊ฐ€ ์ •ํ•œ๋‹ค.
138
- - ์ธ๋ผ์ธ `style`์€ ๋ชจ๋“  ๊ทœ์น™์„ ์ด๊ธฐ๋ฏ€๋กœ ์ด๊ด€ ์ „์—๋Š” ๋ณด์ด๋˜ ๊ฐ’์ด ์ด๊ด€ ํ›„ ์กฐ์šฉํžˆ
139
- ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด๊ด€์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹ค์ œ ๋ Œ๋”๋ฅผ ํ™•์ธํ•˜๋ฉฐ ์ง„ํ–‰ํ•œ๋‹ค.
140
-
141
- > `ThemeColors`์— semantic key๋ฅผ ๋”ํ•˜๋Š” ๊ฒƒ์€ `brandPalette` ๋ถ€๋ถ„ ์ฃผ์ž… ์†Œ๋น„์ž์—๊ฒŒ๋Š”
142
- > ๋ฌดํ•ดํ•˜์ง€๋งŒ, **์™„์ „ํ•œ ํŒ”๋ ˆํŠธ๋ฅผ ์ง์ ‘ ์„ ์–ธํ•˜๋Š” ์†Œ๋น„์ž์—๊ฒŒ๋Š” ํƒ€์ž… ํŒŒ๊ดด์ **์ด๋‹ค.
143
- > 0.x train์—์„œ๋Š” patch๋กœ ๋‚ด๋ณด๋‚ด๋˜ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ์— ๊ทธ ์‚ฌ์‹ค์„ ์ ๊ณ , ์†Œ๋น„์ž๋Š” ์ƒˆ key๋ฅผ
144
- > ์ฑ„์›Œ์•ผ ํ•œ๋‹ค. 1.0 ์ดํ›„์—๋Š” ์ด ํ˜•ํƒœ์˜ ์ถ”๊ฐ€๋ฅผ minor ์ด์ƒ์œผ๋กœ ์˜ฌ๋ฆฐ๋‹ค.
145
- | ํ† ๊ธ€ ButtonยทIconButton์˜ selected ๋ฐฐ๊ฒฝยทํ…Œ๋‘๋ฆฌ๋ฅผ ์ œํ’ˆ style๋กœ ์น ํ•˜๊ธฐ | `selected` (`buttonRecipe.states.selected`, `iconButtonRecipe.states.selected`) |
146
- | `link` tone Button์—์„œ `paddingHorizontal: 0`์œผ๋กœ ์ธ๋ผ์ธ ์ •๋ ฌ ๋ณต์› | tone๋ณ„ `paddingHorizontal` (link=0) |
147
- | Web ListRow์˜ 1ํ–‰/2ํ–‰ ์ตœ์†Œ ๋†’์ดยทpaddingยทgap์„ ์ œํ’ˆ์ด ๋‹ค์‹œ ๊ณ„์‚ฐ | `--hjm-list-row-*` ๋ณ€์ˆ˜๋กœ density recipe๋ฅผ stylesheet์— ๋ฐ”์ธ๋”ฉ |
148
- | Web Switch์— size ์ถ•์ด ์—†์–ด track/thumb ํฌ๊ธฐ๋ฅผ ์ œํ’ˆ ๋ณ€์ˆ˜๋กœ ๊ตฌํ˜„ | `size` prop + `--hjm-switch-*` (`switchRecipe.sizes` ๋ฐ”์ธ๋”ฉ) |
149
- | Surface์— `overflow: hidden`์„ ์–น์–ด ์ž์‹ ์ด๋ฏธ์ง€์˜ ๋ผ์šด๋“œ ์ฝ”๋„ˆ ์นจ๋ฒ” ๋ง‰๊ธฐ | `surfaceRecipe[tone].clipsContent` (elevated tone์€ ๊ทธ๋ฆผ์ž๊ฐ€ ์ž˜๋ฆฌ๋ฏ€๋กœ ์˜ˆ์™ธ) |
150
- | ChipยทListRowยทImageยทLoadMoreยทDescriptionList์˜ ๋ฐฐ์น˜์šฉ `style` | ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ `layoutStyle` |
151
-
152
- legacy raw style surface๋Š” ๋‹ค์Œ ์กฐ๊ฑด์ด ๋ชจ๋‘ ์ถฉ์กฑ๋œ ๋’ค ๊ณต์ง€๋œ breaking train์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
153
-
154
- 1. Stable Core๊ฐ€ canonical `layoutStyle` ๋˜๋Š” ๋™๋“ฑํ•œ ์ข์€ composition API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
155
- 2. HJM showcase์™€ ๊ด€๋ฆฌ ์ค‘์ธ ์•ฑ์ด ์ƒˆ API๋กœ ์ด๋™ํ•˜๊ณ  light/dark, large text, RTL๊ณผ touch-target
156
- evidence๋ฅผ ๋‹ค์‹œ ๊ฒ€์ฆํ•œ๋‹ค.
157
- 3. ์ตœ์†Œ ํ•œ fixed release train ๋™์•ˆ deprecation๊ณผ migration ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
158
- 4. ์ œ๊ฑฐ Changeset์ด ์˜ํ–ฅ์„ ๋ฐ›๋Š” prop๊ณผ semantic ๋Œ€์•ˆ์„ ์—ด๊ฑฐํ•œ๋‹ค.
159
-
160
- 2026-09-23 ์†Œ๋น„ ๊ฐ์‚ฌ์—์„œ 1.3.5์—๋„ deprecated prop์ด ๋‚จ์•„ ์žˆ์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์˜
161
- โ€œ1.0.0 ์ด์ „ ์ œ๊ฑฐโ€ ๊ธฐํ•œ์€ ์‹ค์ œ release/API์™€ ์–ด๊ธ‹๋‚˜๋ฏ€๋กœ ํ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ๊ฒŒ์‹œํ•œ 1.x์˜ ํƒ€์ž…๊ณผ
162
- ๋Ÿฐํƒ€์ž„์„ minor์—์„œ ์‚ญ์ œํ•˜๋Š” ๋Œ€์‹ , ์œ„ ๋„ค ์กฐ๊ฑด๊ณผ ์†Œ๋น„ ์•ฑ๋ณ„ ์ด๊ด€ ๋ชฉ๋ก์„ ์ถฉ์กฑํ•œ ๋‹ค์Œ major์—์„œ
163
- ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. 1.4๋Š” semantic API์™€ ์ด๊ด€ ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” train์ด๋ฉฐ, ๊ธฐ์กด prop์„ ์ƒˆ ํ™”๋ฉด์— ์“ฐ๋Š”
164
- ๊ฒƒ์€ ๊ณ„์† ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค. 2026-10-02 ์‚ฌ์šฉ์ž์˜ ์ „์ฒด ์ด๊ด€ ๊ฒฐ์ •์œผ๋กœ ์ œ๊ฑฐ train์„ 1.11๋กœ ํ™•์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
74
+ ### 3.1 ๋ฐฐ์น˜์™€ ์‹œ๊ฐ ๊ฐ’
75
+
76
+ - ๋ฐฐ์น˜์—๋Š” `layoutStyle`์„ ์“ฐ๊ณ , ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ์™ธ๋ถ€ composition wrapper๋ฅผ ์“ด๋‹ค.
77
+ ์ง€์› ์†์„ฑ์€ ๊ฐ renderer์˜ `HjmCompositionStyle` ํƒ€์ž…๊ณผ ์ปดํฌ๋„ŒํŠธ Props๋ฅผ ๋”ฐ๋ฅธ๋‹ค.
78
+ - ์ƒ‰ยท๊ธ€๊ผดยท๋ชจ์„œ๋ฆฌยท๋†’์ดยท์ƒํƒœ ํ‘œํ˜„์€ semantic API, `brandPalette`, `designProfile`๋กœ ์ง€์ •ํ•œ๋‹ค.
79
+ ์•ฑ์—์„œ ๋‚ด๋ถ€ selector๋‚˜ ์ œ๊ฑฐ๋œ `style`ยท`labelStyle` ๋ณ„์นญ์œผ๋กœ ๋ฎ์ง€ ์•Š๋Š”๋‹ค.
80
+ - ํ”Œ๋žซํผ hostยท์ œํ’ˆ ์†Œ์œ  ์Šฌ๋กฏยท์ด๋ฏธ์ง€ renderer์˜ ์ •์‹ style์€ ์ œ๊ฑฐ๋œ ๋ณ„์นญ๊ณผ ๊ตฌ๋ถ„ํ•œ๋‹ค.
81
+ - CSS ๋ ˆ์ด์–ด์™€ ๊ธฐ์กด ์žฌ์ •์˜์˜ ์ด๊ด€์€ [๋ธŒ๋žœ๋“œ ๊ฒฝ๊ณ„](brand-boundary.md#3-css-์žฌ์ •์˜๋Š”-์ง€์›ํ•˜๋Š”-ํ…Œ๋งˆ-๊ฒฝ๋กœ๊ฐ€-์•„๋‹ˆ๋‹ค)๊ฐ€ ์†Œ์œ ํ•œ๋‹ค.
82
+ - ์ œ๊ฑฐ๋œ API์™€ ๋Œ€์ฒด prop์€ [Native ํ˜ธํ™˜ API ์ด๊ด€ํ‘œ](migration-native-legacy-removal.md)์— ๋ณด์กดํ•œ๋‹ค.
83
+ ์ข…๋ฃŒ๋œ ์ œ๊ฑฐ ์˜ˆ์ • ์กฐ๊ฑด์ด๋‚˜ 0.x ๋ฒ„์ „ ๊ทœ์น™์„ ํ˜„์žฌ ์†Œ๋น„ ๊ฒฝ๋กœ๋กœ ์•ˆ๋‚ดํ•˜์ง€ ์•Š๋Š”๋‹ค.
165
84
 
166
85
  ๊ถŒ์žฅ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ํด๋”๋ช…์€ stack ๊ด€์Šต์— ๋งž์ถฐ๋„ ์—ญํ• ์€ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
167
86
 
@@ -195,27 +114,28 @@ on-color ๋Œ€๋น„, ์ƒ‰์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ ํ‘œ์ง€, reduce-motion์„ ์ œ
195
114
 
196
115
  ## 5. ํ•„์ˆ˜ ๊ฒ€์ฆ๊ณผ evidence
197
116
 
198
- ์•ฑ CI๋Š” ์ตœ์†Œํ•œ ๋‹ค์Œ์„ ์‹คํŒจ ์กฐ๊ฑด์œผ๋กœ ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(MUST).
117
+ ๋‹ค์Œ ์ œํ’ˆ ๊ณ„์•ฝ์„ ์œ ์ง€ํ•˜๊ณ , ๋ณ€๊ฒฝํ•œ ์ฝ”๋“œ์™€ ์ง์ ‘ ์†Œ๋น„ํ•˜๋Š” ํ‘œ๋ฉด์˜ ํƒ€์ž…ยท๋นŒ๋“œยท๊ด€๋ จ ๋™์ž‘์„ ๊ฒ€์‚ฌํ•œ๋‹ค.
118
+ ๊ฐ™์€ SHAยท๊ฐ™์€ ๋ฒ”์œ„์˜ ์„ฑ๊ณต์€ ์žฌ์‚ฌ์šฉํ•˜๋ฉฐ ์ „์ฒด ํšŒ๊ท€๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•œ๋‹ค.
119
+ ๋ฌธ์„œ ํ˜•์‹ยทStorybook ๋ถ„๋ฅ˜ยท๊ฒ€์‚ฌ ๋ช…๋ น ๋ฌธ์ž์—ด์€ ์ œํ’ˆ ๋ฐฐํฌ์˜ ์ฐจ๋‹จ ์กฐ๊ฑด์ด ์•„๋‹ˆ๋‹ค.
199
120
 
200
121
  1. contracts/renderer exact version ์ผ์น˜์™€ ๊ธˆ์ง€ dependency ํ˜•์‹ ๊ฒ€์‚ฌ
201
- 2. versioned `requiredFoundations` ์ „์ฒด์˜ ์„ ์–ธ๊ณผ lifecycle์— ๋งž๋Š” app evidence ๊ฒ€์‚ฌ
122
+ 2. ์„ค์น˜๋œ catalogยท์•ฑ profile๊ณผ ์‹ค์ œ ์‚ฌ์šฉ ํ‘œ๋ฉด์˜ ์ผ์น˜
202
123
  3. HJM Provider ์กด์žฌ์™€ ์ œํ’ˆ theme adapter ์กด์žฌ ๊ฒ€์‚ฌ
203
124
  4. ์›์‹œ ์ƒ‰ยท๊ฐ„๊ฒฉยทradius์˜ ํ™”๋ฉด ๋ ˆ์ด์–ด ์œ ์ž… ๋ฐฉ์ง€ ๊ฒ€์‚ฌ
204
125
  5. typecheck, unit/component test, production build
205
- 6. light/dark, 100โ€“200% ๊ธ€์ž ํฌ๊ธฐ, LTR/RTL, reduce motion ์ค‘ ์•ฑ์ด ์ง€์›ํ•œ๋‹ค๊ณ  ์„ ์–ธํ•œ ํ™˜๊ฒฝ
126
+ 6. ์˜ํ–ฅ ํ™”๋ฉด์˜ light/dark, ์ง€์› ๋ฐฉํ–ฅ๊ณผ reduced motion ๋“ฑ ๋ณ€๊ฒฝ์— ๊ด€๋ จ๋œ ํ™˜๊ฒฝ
206
127
  7. optional Beta component๋ฅผ ์“ด๋‹ค๋ฉด ยง2์˜ ์ฑ„ํƒ ๊ธฐ๋ก๊ณผ ๋ณ€๊ฒฝํ•œ ์‚ฌ์šฉ์ž ํ๋ฆ„์˜ ํšŒ๊ท€ ๊ฒ€์‚ฌ
207
128
 
208
129
  ์•ฑ์ด ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํ”Œ๋žซํผ์ด๋‚˜ ํ™˜๊ฒฝ์€ ๊ฐ€์งœ ํ†ต๊ณผ script๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ  app contract์—์„œ
209
130
  `not-applicable`๊ณผ ์ด์œ ๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(MUST).
210
131
 
211
- ## 6. ์˜ˆ์™ธ์™€ ๋ณ€๊ฒฝ ์ ˆ์ฐจ
132
+ OS ์ตœ๋Œ€ ๊ธ€์ž ๋ฐ ๊ทธ ์ตœ๋Œ€๊ฐ’ ๋ชจ์‚ฌ๋Š” ์„ค๊ณ„ยท๊ฒ€์ฆยทํ›„์† ์กฐ๊ฑด์—์„œ ์ œ์™ธํ•œ๋‹ค.
212
133
 
213
- ํ•„์ˆ˜ ๊ทœ์น™์˜ ์˜ˆ์™ธ๋Š” ์•”๋ฌต์ ์œผ๋กœ ๋‘์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ADR์—๋Š” ๋‹ค์Œ์„ ๋ชจ๋‘ ๊ธฐ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
134
+ ## 6. ์˜ˆ์™ธ์™€ ๋ณ€๊ฒฝ ์ ˆ์ฐจ
214
135
 
215
- - ์œ„๋ฐ˜ํ•˜๋Š” ์ •์ฑ… ํ•ญ๋ชฉ๊ณผ ์‚ฌ์šฉ์ž ๊ฐ€์น˜
216
- - ๊ฒ€ํ† ํ•œ ๋Œ€์•ˆ๊ณผ ์„ ํƒ ์ด์œ 
217
- - ์œ„ํ—˜, ๋ณด์™„ ํ…Œ์ŠคํŠธ์™€ ๋‹ด๋‹น์ž
218
- - ๋งŒ๋ฃŒ ๋˜๋Š” ์žฌ๊ฒ€ํ†  ๋‚ ์งœ
136
+ ๊ณ„์•ฝ ๋ณ€๊ฒฝ์ด๋‚˜ ์˜ˆ์™ธ์˜ ์ด์œ ยท์˜ํ–ฅยท๊ฒ€์‚ฌ ๊ฒฐ๊ณผยท๋ฏธํ™•์ธ ๋ฒ”์œ„๋Š” ๊ธฐ์กด ๊ณ„์•ฝ ๋ฌธ์„œ, TASKS ๋˜๋Š” ์ปค๋ฐ‹์— ๋‚จ๊ธด๋‹ค.
137
+ ์ž‘์€ ์ˆ˜์ •์— ๋ณ„๋„ ADR, ๊ณ ์ • ํ•ญ๋ชฉ ์ˆ˜, ์ค‘๋ณต ์Šน์ธ์„ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ž„์‹œ ์šฐํšŒ์—๋Š” ์ œ๊ฑฐ ์กฐ๊ฑด์„ ์ ๋Š”๋‹ค.
138
+ ๊ณต๊ฐœ APIยท๋ฐ์ดํ„ฐยทํ˜ธํ™˜์„ฑ์„ ๋ฐ”๊พธ๋ฉด ํ•ด๋‹น ๊ณ„์•ฝ๊ณผ migration์„ ๊ฐฑ์‹ ํ•œ๋‹ค.
219
139
 
220
140
  ๊ณตํ†ต API๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ํ•œ ์ œํ’ˆ์˜ local override๋ณด๋‹ค ์ ์ ˆํ•˜๋ฉด ์ œํ’ˆ ์ฝ”๋“œ๋ฅผ ๋ณต์ œํ•˜์ง€ ์•Š๊ณ 
221
141
  HJM์— Changeset๊ณผ Web/RN evidence๋ฅผ ๋จผ์ € ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์ œํ’ˆ ์˜๋ฏธ๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด ๊ณตํ†ต
@@ -226,8 +146,7 @@ package๋กœ ์Šน๊ฒฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
226
146
  ๋‹ค์Œ ์งˆ๋ฌธ์— ๋ชจ๋‘ "์˜ˆ"๋ผ๊ณ  ๋‹ตํ•  ์ˆ˜ ์žˆ์–ด์•ผ HJM ์ฑ„ํƒ์ด ์™„๋ฃŒ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
227
147
 
228
148
  - exact fixed-train dependency์™€ Provider๊ฐ€ CI์—์„œ ๊ฒ€์ฆ๋˜๋Š”๊ฐ€?
229
- - Stable์€ ๊ธฐ๋ณธ ์‚ฌ์šฉํ•˜๊ณ (1.5.0 ์ด์ „ profile์ด๋ฉด ํ•„์ˆ˜ foundation์€ ์ค‘์•™ ๋ชฉ๋ก+์•ฑ evidence๋กœ),
230
- optional Beta๋Š” ์ฑ„ํƒ ๊ธฐ๋ก๊ณผ ๊ด€๋ จ ํšŒ๊ท€ ๊ฒ€์‚ฌ๋กœ ์ถ”์ ๋˜๋Š”๊ฐ€?
149
+ - ์„ค์น˜ ๋ฒ„์ „์˜ surfaceStatus๋ฅผ ๋”ฐ๋ฅด๊ณ  optional Beta๋Š” ์ฑ„ํƒ ๊ธฐ๋ก๊ณผ ๊ด€๋ จ ํšŒ๊ท€ ๊ฒ€์‚ฌ๋กœ ์ถ”์ ๋˜๋Š”๊ฐ€?
231
150
  - screen ์ฝ”๋“œ๊ฐ€ semantic tokenยทcomponent๋ฅผ ์šฐํšŒํ•˜์ง€ ์•Š๋Š”๊ฐ€?
232
151
  - ๊ฐ™์€ ์ƒํƒœ๊ฐ€ Web/RN์—์„œ ๊ฐ™์€ ์˜๋ฏธ์™€ ์ž์—ฐ์Šค๋Ÿฌ์šด ํ”Œ๋žซํผ ํ–‰๋™์„ ๊ฐ–๋Š”๊ฐ€?
233
152
  - ๋กœ๊ณ ๋ฅผ ์ œ๊ฑฐํ•ด๋„ ์ œํ’ˆ์˜ ํ•ต์‹ฌ ์ฝ˜ํ…์ธ ์™€ ์ •๋ณด ๊ตฌ์กฐ๊ฐ€ ๋‹ค๋ฅธ ์ œํ’ˆ๊ณผ ๊ตฌ๋ถ„๋˜๋Š”๊ฐ€?
@@ -1,6 +1,6 @@
1
1
  # Component maturity and evidence manifest
2
2
 
3
- > Generated from `@hjmds/design-contracts` 1.18.0. Do not edit this file directly; run `pnpm contracts:sync`.
3
+ > Generated from `@hjmds/design-contracts` 1.19.0. Do not edit this file directly; run `pnpm contracts:sync`.
4
4
 
5
5
  This document is the human-readable projection of the same catalog and Showcase manifest consumed by product CI.
6
6