@hjmds/design-contracts 1.41.2 → 1.43.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 (150) hide show
  1. package/dist/affix.d.ts +18 -0
  2. package/dist/affix.d.ts.map +1 -1
  3. package/dist/affix.js +13 -1
  4. package/dist/affix.js.map +1 -1
  5. package/dist/alert-dialog.d.ts +32 -0
  6. package/dist/alert-dialog.d.ts.map +1 -1
  7. package/dist/alert-dialog.js +52 -0
  8. package/dist/alert-dialog.js.map +1 -1
  9. package/dist/behaviors.d.ts +6 -5
  10. package/dist/behaviors.d.ts.map +1 -1
  11. package/dist/behaviors.js +1 -1
  12. package/dist/behaviors.js.map +1 -1
  13. package/dist/catalog.d.ts +168 -15
  14. package/dist/catalog.d.ts.map +1 -1
  15. package/dist/catalog.js +4 -4
  16. package/dist/catalog.js.map +1 -1
  17. package/dist/character-count.d.ts +103 -0
  18. package/dist/character-count.d.ts.map +1 -0
  19. package/dist/character-count.js +68 -0
  20. package/dist/character-count.js.map +1 -0
  21. package/dist/chart.d.ts +30 -0
  22. package/dist/chart.d.ts.map +1 -1
  23. package/dist/chart.js +18 -0
  24. package/dist/chart.js.map +1 -1
  25. package/dist/collection-rail.d.ts +13 -1
  26. package/dist/collection-rail.d.ts.map +1 -1
  27. package/dist/collection-rail.js +9 -2
  28. package/dist/collection-rail.js.map +1 -1
  29. package/dist/communication.d.ts +25 -0
  30. package/dist/communication.d.ts.map +1 -1
  31. package/dist/communication.js +3 -0
  32. package/dist/communication.js.map +1 -1
  33. package/dist/component-recipes.d.ts +172 -2
  34. package/dist/component-recipes.d.ts.map +1 -1
  35. package/dist/component-recipes.js +122 -8
  36. package/dist/component-recipes.js.map +1 -1
  37. package/dist/design-system-provider.d.ts +13 -2
  38. package/dist/design-system-provider.d.ts.map +1 -1
  39. package/dist/design-system-provider.js +19 -3
  40. package/dist/design-system-provider.js.map +1 -1
  41. package/dist/foundations.d.ts +15 -0
  42. package/dist/foundations.d.ts.map +1 -1
  43. package/dist/foundations.js +7 -0
  44. package/dist/foundations.js.map +1 -1
  45. package/dist/icon-button-recipe.d.ts +33 -0
  46. package/dist/icon-button-recipe.d.ts.map +1 -1
  47. package/dist/icon-button-recipe.js +36 -1
  48. package/dist/icon-button-recipe.js.map +1 -1
  49. package/dist/image.d.ts +13 -0
  50. package/dist/image.d.ts.map +1 -1
  51. package/dist/image.js +17 -0
  52. package/dist/image.js.map +1 -1
  53. package/dist/index.d.ts +2 -2
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +2 -2
  56. package/dist/index.js.map +1 -1
  57. package/dist/recipes.d.ts +1 -1
  58. package/dist/recipes.d.ts.map +1 -1
  59. package/dist/recipes.js +1 -1
  60. package/dist/recipes.js.map +1 -1
  61. package/dist/screen-patterns.d.ts +95 -0
  62. package/dist/screen-patterns.d.ts.map +1 -1
  63. package/dist/screen-patterns.js +83 -2
  64. package/dist/screen-patterns.js.map +1 -1
  65. package/dist/selection-helpers.d.ts +6 -0
  66. package/dist/selection-helpers.d.ts.map +1 -1
  67. package/dist/selection-helpers.js +12 -0
  68. package/dist/selection-helpers.js.map +1 -1
  69. package/dist/sidebar.d.ts +17 -2
  70. package/dist/sidebar.d.ts.map +1 -1
  71. package/dist/sidebar.js +8 -2
  72. package/dist/sidebar.js.map +1 -1
  73. package/dist/steps.d.ts +19 -19
  74. package/dist/steps.d.ts.map +1 -1
  75. package/dist/steps.js +21 -9
  76. package/dist/steps.js.map +1 -1
  77. package/dist/timeline.d.ts +41 -0
  78. package/dist/timeline.d.ts.map +1 -1
  79. package/dist/timeline.js +47 -1
  80. package/dist/timeline.js.map +1 -1
  81. package/dist/top.d.ts +21 -2
  82. package/dist/top.d.ts.map +1 -1
  83. package/dist/top.js +17 -1
  84. package/dist/top.js.map +1 -1
  85. package/dist/version.d.ts +1 -1
  86. package/dist/version.js +1 -1
  87. package/dist/version.js.map +1 -1
  88. package/docs/affix.md +7 -0
  89. package/docs/avatar-fallback.md +19 -0
  90. package/docs/brand-boundary.md +24 -2
  91. package/docs/chart.md +7 -0
  92. package/docs/collection-rail.md +4 -1
  93. package/docs/generated/component-maturity.md +1 -1
  94. package/docs/generated/renderer-evidence.json +10 -6
  95. package/docs/generated/renderer-evidence.md +1 -1
  96. package/docs/generated/showcase-manifest.json +12 -5
  97. package/docs/image.md +5 -0
  98. package/docs/list-row.md +8 -0
  99. package/docs/optional-adapters.md +3 -0
  100. package/docs/overlay-stack.md +27 -0
  101. package/docs/screen-patterns.md +39 -2
  102. package/docs/sidebar.md +15 -0
  103. package/docs/steps.md +23 -19
  104. package/docs/theme-palette.md +3 -3
  105. package/docs/theming.md +1 -0
  106. package/docs/timeline.md +18 -1
  107. package/docs/top.md +7 -0
  108. package/docs/usage/README.md +9 -2
  109. package/docs/usage/components/affix.md +18 -4
  110. package/docs/usage/components/alert-dialog.md +28 -0
  111. package/docs/usage/components/avatar.md +30 -9
  112. package/docs/usage/components/badge.md +20 -5
  113. package/docs/usage/components/chart.md +19 -1
  114. package/docs/usage/components/chat-message.md +5 -0
  115. package/docs/usage/components/chat-room-actions.md +58 -0
  116. package/docs/usage/components/chat-room-create.md +58 -0
  117. package/docs/usage/components/chat-room-details.md +58 -0
  118. package/docs/usage/components/chat-room-invite.md +58 -0
  119. package/docs/usage/components/chat-room-members.md +58 -0
  120. package/docs/usage/components/chat-room-profile.md +58 -0
  121. package/docs/usage/components/checkbox-group.md +24 -1
  122. package/docs/usage/components/choice-row.md +19 -4
  123. package/docs/usage/components/composition-layout.md +6 -2
  124. package/docs/usage/components/counter-badge.md +2 -2
  125. package/docs/usage/components/design-system-provider.md +2 -1
  126. package/docs/usage/components/divider.md +12 -1
  127. package/docs/usage/components/field.md +51 -0
  128. package/docs/usage/components/icon-button.md +48 -4
  129. package/docs/usage/components/icon-tile.md +13 -2
  130. package/docs/usage/components/image.md +25 -0
  131. package/docs/usage/components/list-row.md +8 -4
  132. package/docs/usage/components/list.md +1 -1
  133. package/docs/usage/components/notification-item.md +5 -1
  134. package/docs/usage/components/permission-screen.md +25 -4
  135. package/docs/usage/components/screen-layout.md +27 -1
  136. package/docs/usage/components/segmented-control.md +16 -3
  137. package/docs/usage/components/select.md +1 -0
  138. package/docs/usage/components/settings-screen.md +5 -4
  139. package/docs/usage/components/sheet.md +2 -1
  140. package/docs/usage/components/sidebar.md +34 -6
  141. package/docs/usage/components/steps.md +29 -8
  142. package/docs/usage/components/surface.md +2 -1
  143. package/docs/usage/components/text-area.md +2 -1
  144. package/docs/usage/components/timeline.md +25 -4
  145. package/docs/usage/components/top.md +15 -2
  146. package/docs/usage/compositions/chat-room.md +110 -0
  147. package/docs/usage/screens/common-settings.md +3 -2
  148. package/docs/usage/screens/flow-permission.md +3 -3
  149. package/docs/usage/tokens/elevation-opacity.md +14 -2
  150. package/package.json +7 -1
@@ -1 +1 @@
1
- {"version":3,"file":"collection-rail.js","sourceRoot":"","sources":["../src/collection-rail.ts"],"names":[],"mappings":"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","sourcesContent":["import { validateItems } from \"./interaction-adapters.js\";\nimport { layout, spacing } from \"./foundations.js\";\n\nexport type CollectionRailItem<Id extends string = string> = Readonly<{ id: Id; label: string }>;\nexport type CollectionRailDensity = \"compact\" | \"comfortable\";\nexport type CollectionRailIntent = \"previous\" | \"next\" | \"first\" | \"last\";\n\n// A finite rail exposes every item's independent actions. Carousel's single\n// selected/inert panel is therefore not its state engine (docs/collection-rail.md).\nexport const collectionRailRecipe = {\n itemMaxWidth: { compact: layout.readingMaxWidth / 3, comfortable: layout.readingMaxWidth / 2 },\n gap: spacing.md,\n edgeHint: spacing.xl,\n defaults: { density: \"comfortable\" },\n} as const;\n\nexport type CollectionRailLayout = Readonly<{\n count: number; viewport: number; itemWidth: number; gap: number; contentWidth: number; maxOffset: number;\n}>;\n\nexport function validateCollectionRail(items: readonly CollectionRailItem[], initialKey?: string): void {\n validateItems(items);\n if (initialKey !== undefined && !items.some(item => item.id === initialKey)) {\n throw new RangeError(\"CollectionRail defaultStartKey must identify an item\");\n }\n}\n\nexport function resolveCollectionRailLayout(\n count: number, viewport: number, density: CollectionRailDensity = collectionRailRecipe.defaults.density,\n gap: number = collectionRailRecipe.gap,\n): CollectionRailLayout {\n if (!Number.isSafeInteger(count) || count < 0) throw new RangeError(\"CollectionRail count must be a nonnegative integer\");\n if (!Number.isFinite(viewport) || viewport < 0 || !Number.isFinite(gap) || gap < 0) {\n throw new RangeError(\"CollectionRail measurements must be finite and nonnegative\");\n }\n if (!(density in collectionRailRecipe.itemMaxWidth)) throw new TypeError(\"Unknown CollectionRail density\");\n // The hint uses the shared spacing rhythm, not the reference's fixed card px.\n // At extremely narrow widths showing readable content takes priority over peek.\n const available = viewport > collectionRailRecipe.edgeHint ? viewport - collectionRailRecipe.edgeHint : viewport;\n const itemWidth = Math.min(collectionRailRecipe.itemMaxWidth[density], available);\n const contentWidth = count === 0 ? 0 : count * itemWidth + (count - 1) * gap;\n return { count, viewport, itemWidth, gap, contentWidth, maxOffset: Math.max(0, contentWidth - viewport) };\n}\n\nexport function clampCollectionRailOffset(layout: CollectionRailLayout, offset: number): number {\n if (!Number.isFinite(offset)) throw new RangeError(\"CollectionRail offset must be finite\");\n return Math.min(layout.maxOffset, Math.max(0, offset));\n}\n\n// Hosts round subpixel measurements differently. Half a CSS pixel/dp avoids\n// an enabled end button that can no longer move; it is not an overscroll allowance.\nconst alignmentTolerance = 0.5;\n\nexport function resolveCollectionRailViewport(layout: CollectionRailLayout, offset: number) {\n const start = clampCollectionRailOffset(layout, offset);\n const stride = layout.itemWidth + layout.gap;\n const startIndex = layout.count === 0 ? -1 : Math.min(layout.count - 1, Math.floor((start + alignmentTolerance) / (stride || 1)));\n return { offset: start, startIndex, atStart: start <= alignmentTolerance, atEnd: start >= layout.maxOffset - alignmentTolerance };\n}\n\nexport function getCollectionRailTargetOffset(layout: CollectionRailLayout, offset: number, intent: CollectionRailIntent): number {\n const current = clampCollectionRailOffset(layout, offset);\n if (intent === \"first\") return 0;\n if (intent === \"last\") return layout.maxOffset;\n const stride = layout.itemWidth + layout.gap;\n if (!stride) return 0;\n const target = intent === \"next\"\n ? (Math.floor((current + alignmentTolerance) / stride) + 1) * stride\n : (Math.ceil((current - alignmentTolerance) / stride) - 1) * stride;\n return clampCollectionRailOffset(layout, target);\n}\n\nexport function getCollectionRailItemOffset(layout: CollectionRailLayout, index: number): number {\n if (!Number.isInteger(index) || index < 0 || index >= layout.count) throw new RangeError(\"CollectionRail item index is unavailable\");\n return clampCollectionRailOffset(layout, index * (layout.itemWidth + layout.gap));\n}\n\n/** Reveal a focused item's full bounds, without treating it as a selection. */\nexport function getCollectionRailRevealOffset(layout: CollectionRailLayout, offset: number, index: number): number {\n getCollectionRailItemOffset(layout, index);\n const current = clampCollectionRailOffset(layout, offset);\n const start = index * (layout.itemWidth + layout.gap), end = start + layout.itemWidth;\n return clampCollectionRailOffset(layout, start < current ? start : end > current + layout.viewport ? end - layout.viewport : current);\n}\n\n/** Native uses an explicitly LTR scroll host; its RTL row is physically reversed. */\nexport function getCollectionRailPhysicalOffset(layout: CollectionRailLayout, logicalOffset: number, direction: \"ltr\" | \"rtl\"): number {\n const offset = clampCollectionRailOffset(layout, logicalOffset);\n return direction === \"rtl\" ? layout.maxOffset - offset : offset;\n}\n\nexport function getCollectionRailKeyboardIntent(key: string, direction: \"ltr\" | \"rtl\"): CollectionRailIntent | undefined {\n if (key === \"Home\") return \"first\";\n if (key === \"End\") return \"last\";\n if (key === \"ArrowRight\") return direction === \"rtl\" ? \"previous\" : \"next\";\n if (key === \"ArrowLeft\") return direction === \"rtl\" ? \"next\" : \"previous\";\n return undefined;\n}\n"]}
1
+ {"version":3,"file":"collection-rail.js","sourceRoot":"","sources":["../src/collection-rail.ts"],"names":[],"mappings":"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","sourcesContent":["import { validateItems } from \"./interaction-adapters.js\";\nimport { layout, spacing } from \"./foundations.js\";\n\nexport type CollectionRailItem<Id extends string = string> = Readonly<{ id: Id; label: string }>;\nexport type CollectionRailDensity = \"compact\" | \"comfortable\" | \"chip\";\nexport type CollectionRailIntent = \"previous\" | \"next\" | \"first\" | \"last\";\n\n// A finite rail exposes every item's independent actions. Carousel's single\n// selected/inert panel is therefore not its state engine (docs/collection-rail.md).\nexport const collectionRailRecipe = {\n /**\n * `chip` (2026-10-23): Yajalal's home strip of 145pt mini scoreboards used a raw ScrollView because every rail item\n * took card width (240+). Chips are uniform, so a narrow step keeps the shared one-stride geometry; content-sized\n * items were not added because previous/next, the start anchor and focus reveal step by a single item width.\n */\n itemMaxWidth: { compact: layout.readingMaxWidth / 3, comfortable: layout.readingMaxWidth / 2, chip: layout.readingMaxWidth / 5 },\n gap: spacing.md,\n /** Gap per density as a spacing step (profile-aware on Native); chips sit closer than cards. */\n gapSteps: { compact: \"md\", comfortable: \"md\", chip: \"xs\" },\n edgeHint: spacing.xl,\n defaults: { density: \"comfortable\" },\n} as const;\n\nexport type CollectionRailLayout = Readonly<{\n count: number; viewport: number; itemWidth: number; gap: number; contentWidth: number; maxOffset: number;\n}>;\n\nexport function validateCollectionRail(items: readonly CollectionRailItem[], initialKey?: string): void {\n validateItems(items);\n if (initialKey !== undefined && !items.some(item => item.id === initialKey)) {\n throw new RangeError(\"CollectionRail defaultStartKey must identify an item\");\n }\n}\n\nexport function resolveCollectionRailLayout(\n count: number, viewport: number, density: CollectionRailDensity = collectionRailRecipe.defaults.density,\n gap: number = spacing[collectionRailRecipe.gapSteps[density] ?? \"md\"],\n): CollectionRailLayout {\n if (!Number.isSafeInteger(count) || count < 0) throw new RangeError(\"CollectionRail count must be a nonnegative integer\");\n if (!Number.isFinite(viewport) || viewport < 0 || !Number.isFinite(gap) || gap < 0) {\n throw new RangeError(\"CollectionRail measurements must be finite and nonnegative\");\n }\n if (!(density in collectionRailRecipe.itemMaxWidth)) throw new TypeError(\"Unknown CollectionRail density\");\n // The hint uses the shared spacing rhythm, not the reference's fixed card px.\n // At extremely narrow widths showing readable content takes priority over peek.\n const available = viewport > collectionRailRecipe.edgeHint ? viewport - collectionRailRecipe.edgeHint : viewport;\n const itemWidth = Math.min(collectionRailRecipe.itemMaxWidth[density], available);\n const contentWidth = count === 0 ? 0 : count * itemWidth + (count - 1) * gap;\n return { count, viewport, itemWidth, gap, contentWidth, maxOffset: Math.max(0, contentWidth - viewport) };\n}\n\nexport function clampCollectionRailOffset(layout: CollectionRailLayout, offset: number): number {\n if (!Number.isFinite(offset)) throw new RangeError(\"CollectionRail offset must be finite\");\n return Math.min(layout.maxOffset, Math.max(0, offset));\n}\n\n// Hosts round subpixel measurements differently. Half a CSS pixel/dp avoids\n// an enabled end button that can no longer move; it is not an overscroll allowance.\nconst alignmentTolerance = 0.5;\n\nexport function resolveCollectionRailViewport(layout: CollectionRailLayout, offset: number) {\n const start = clampCollectionRailOffset(layout, offset);\n const stride = layout.itemWidth + layout.gap;\n const startIndex = layout.count === 0 ? -1 : Math.min(layout.count - 1, Math.floor((start + alignmentTolerance) / (stride || 1)));\n return { offset: start, startIndex, atStart: start <= alignmentTolerance, atEnd: start >= layout.maxOffset - alignmentTolerance };\n}\n\nexport function getCollectionRailTargetOffset(layout: CollectionRailLayout, offset: number, intent: CollectionRailIntent): number {\n const current = clampCollectionRailOffset(layout, offset);\n if (intent === \"first\") return 0;\n if (intent === \"last\") return layout.maxOffset;\n const stride = layout.itemWidth + layout.gap;\n if (!stride) return 0;\n const target = intent === \"next\"\n ? (Math.floor((current + alignmentTolerance) / stride) + 1) * stride\n : (Math.ceil((current - alignmentTolerance) / stride) - 1) * stride;\n return clampCollectionRailOffset(layout, target);\n}\n\nexport function getCollectionRailItemOffset(layout: CollectionRailLayout, index: number): number {\n if (!Number.isInteger(index) || index < 0 || index >= layout.count) throw new RangeError(\"CollectionRail item index is unavailable\");\n return clampCollectionRailOffset(layout, index * (layout.itemWidth + layout.gap));\n}\n\n/** Reveal a focused item's full bounds, without treating it as a selection. */\nexport function getCollectionRailRevealOffset(layout: CollectionRailLayout, offset: number, index: number): number {\n getCollectionRailItemOffset(layout, index);\n const current = clampCollectionRailOffset(layout, offset);\n const start = index * (layout.itemWidth + layout.gap), end = start + layout.itemWidth;\n return clampCollectionRailOffset(layout, start < current ? start : end > current + layout.viewport ? end - layout.viewport : current);\n}\n\n/** Native uses an explicitly LTR scroll host; its RTL row is physically reversed. */\nexport function getCollectionRailPhysicalOffset(layout: CollectionRailLayout, logicalOffset: number, direction: \"ltr\" | \"rtl\"): number {\n const offset = clampCollectionRailOffset(layout, logicalOffset);\n return direction === \"rtl\" ? layout.maxOffset - offset : offset;\n}\n\nexport function getCollectionRailKeyboardIntent(key: string, direction: \"ltr\" | \"rtl\"): CollectionRailIntent | undefined {\n if (key === \"Home\") return \"first\";\n if (key === \"End\") return \"last\";\n if (key === \"ArrowRight\") return direction === \"rtl\" ? \"previous\" : \"next\";\n if (key === \"ArrowLeft\") return direction === \"rtl\" ? \"next\" : \"previous\";\n return undefined;\n}\n"]}
@@ -26,4 +26,29 @@ export type SearchResponse<T> = Readonly<{
26
26
  }>;
27
27
  }>[];
28
28
  }>;
29
+ /** Room data stays controlled: only the product can acknowledge persistence or grant permissions. */
30
+ export type ChatRoomProfileValue = Readonly<{
31
+ name: string;
32
+ description: string;
33
+ photoUrl: string | null;
34
+ }>;
35
+ export type ChatRoomMember = Readonly<{
36
+ id: string;
37
+ name: string;
38
+ detail?: string;
39
+ photoUrl?: string;
40
+ selected?: boolean;
41
+ disabled?: boolean;
42
+ }>;
43
+ export type ChatRoomConfirmation = Readonly<{
44
+ destructive?: boolean;
45
+ label: string;
46
+ title: string;
47
+ description: string;
48
+ confirmLabel: string;
49
+ cancelLabel: string;
50
+ errorLabel: string;
51
+ onConfirm: () => void | Promise<void>;
52
+ }>;
53
+ export declare function canSubmitChatRoom(profile: ChatRoomProfileValue, memberIds?: readonly string[]): boolean;
29
54
  //# sourceMappingURL=communication.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"communication.d.ts","sourceRoot":"","sources":["../src/communication.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AACzI,4FAA4F;AAC5F,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,SAAK;;;;;EAG9E;AACD,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AACpF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAC,IAAI,GAAE,IAAI,CAEjE;AACD,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,QAAQ,CAAC;IAAE,MAAM,EAAE,CAAC,CAAC;IAAC,WAAW,EAAE,SAAS,QAAQ,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAA,KAAK,CAAC,EAAC,QAAQ,CAAC;YAAC,KAAK,EAAC,MAAM,CAAC;YAAA,GAAG,EAAC,MAAM,CAAA;SAAC,CAAC,CAAA;KAAC,CAAC,EAAE,CAAA;CAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"communication.d.ts","sourceRoot":"","sources":["../src/communication.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AACzI,4FAA4F;AAC5F,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,SAAK;;;;;EAG9E;AACD,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AACpF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAC,IAAI,GAAE,IAAI,CAEjE;AACD,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,QAAQ,CAAC;IAAE,MAAM,EAAE,CAAC,CAAC;IAAC,WAAW,EAAE,SAAS,QAAQ,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAA,KAAK,CAAC,EAAC,QAAQ,CAAC;YAAC,KAAK,EAAC,MAAM,CAAC;YAAA,GAAG,EAAC,MAAM,CAAA;SAAC,CAAC,CAAA;KAAC,CAAC,EAAE,CAAA;CAAE,CAAC,CAAC;AAEtJ,qGAAqG;AACrG,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAAC;AAC5G,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAChJ,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAAC;AAChO,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,EAAE,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAEvG"}
@@ -8,4 +8,7 @@ export function validateReplyTarget(target) {
8
8
  if (target !== null && !target.id.trim())
9
9
  throw new TypeError("Reply target requires the actual message ID");
10
10
  }
11
+ export function canSubmitChatRoom(profile, memberIds) {
12
+ return profile.name.trim().length > 0 && (memberIds === undefined || (memberIds.length > 0 && memberIds.every(id => id.trim().length > 0) && new Set(memberIds).size === memberIds.length));
13
+ }
11
14
  //# sourceMappingURL=communication.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"communication.js","sourceRoot":"","sources":["../src/communication.ts"],"names":[],"mappings":"AACA,4FAA4F;AAC5F,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,GAAW,EAAE,SAAS,GAAG,EAAE;IAC9E,IAAG,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAE,GAAG,IAAE,CAAC,IAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAE,SAAS,GAAC,CAAC,IAAE,SAAS,GAAC,CAAC;QAAC,MAAM,IAAI,UAAU,CAAC,wDAAwD,CAAC,CAAC;IAC5K,OAAO,EAAE,IAAI,EAAC,KAAK,CAAC,MAAM,EAAC,GAAG,EAAC,IAAI,EAAC,KAAK,CAAC,MAAM,GAAC,GAAG,IAAE,SAAS,EAAC,QAAQ,EAAC,KAAK,CAAC,MAAM,GAAC,GAAG,EAAE,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAwB;IAC3D,IAAG,MAAM,KAAG,IAAI,IAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAAC,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;AACxG,CAAC","sourcesContent":["export type ComposerLengthFeedback = Readonly<{ label: string; formatCount: (used: number, max: number) => string; threshold?: number }>;\n/** Match the controlled text/maxLength UTF-16 unit; do not silently trim a user's draft. */\nexport function resolveComposerLimit(value: string, max: number, threshold = .8) {\n if(!Number.isSafeInteger(max)||max<=0||!Number.isFinite(threshold)||threshold<0||threshold>1)throw new RangeError(\"Composer limit must be positive and threshold in [0,1]\");\n return { used:value.length,max,near:value.length/max>=threshold,exceeded:value.length>max };\n}\nexport type ReplyTarget = Readonly<{ id: string; author: string; excerpt: string }>;\nexport function validateReplyTarget(target: ReplyTarget|null):void {\n if(target!==null&&!target.id.trim())throw new TypeError(\"Reply target requires the actual message ID\");\n}\nexport type SearchResponse<T> = Readonly<{ result: T; suggestions: readonly Readonly<{query: string;match?:Readonly<{start:number;end:number}>}>[] }>;\n"]}
1
+ {"version":3,"file":"communication.js","sourceRoot":"","sources":["../src/communication.ts"],"names":[],"mappings":"AACA,4FAA4F;AAC5F,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,GAAW,EAAE,SAAS,GAAG,EAAE;IAC9E,IAAG,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAE,GAAG,IAAE,CAAC,IAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAE,SAAS,GAAC,CAAC,IAAE,SAAS,GAAC,CAAC;QAAC,MAAM,IAAI,UAAU,CAAC,wDAAwD,CAAC,CAAC;IAC5K,OAAO,EAAE,IAAI,EAAC,KAAK,CAAC,MAAM,EAAC,GAAG,EAAC,IAAI,EAAC,KAAK,CAAC,MAAM,GAAC,GAAG,IAAE,SAAS,EAAC,QAAQ,EAAC,KAAK,CAAC,MAAM,GAAC,GAAG,EAAE,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAwB;IAC3D,IAAG,MAAM,KAAG,IAAI,IAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAAC,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;AACxG,CAAC;AAOD,MAAM,UAAU,iBAAiB,CAAC,OAA6B,EAAE,SAA6B;IAC7F,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7L,CAAC","sourcesContent":["export type ComposerLengthFeedback = Readonly<{ label: string; formatCount: (used: number, max: number) => string; threshold?: number }>;\n/** Match the controlled text/maxLength UTF-16 unit; do not silently trim a user's draft. */\nexport function resolveComposerLimit(value: string, max: number, threshold = .8) {\n if(!Number.isSafeInteger(max)||max<=0||!Number.isFinite(threshold)||threshold<0||threshold>1)throw new RangeError(\"Composer limit must be positive and threshold in [0,1]\");\n return { used:value.length,max,near:value.length/max>=threshold,exceeded:value.length>max };\n}\nexport type ReplyTarget = Readonly<{ id: string; author: string; excerpt: string }>;\nexport function validateReplyTarget(target: ReplyTarget|null):void {\n if(target!==null&&!target.id.trim())throw new TypeError(\"Reply target requires the actual message ID\");\n}\nexport type SearchResponse<T> = Readonly<{ result: T; suggestions: readonly Readonly<{query: string;match?:Readonly<{start:number;end:number}>}>[] }>;\n\n/** Room data stays controlled: only the product can acknowledge persistence or grant permissions. */\nexport type ChatRoomProfileValue = Readonly<{ name: string; description: string; photoUrl: string | null }>;\nexport type ChatRoomMember = Readonly<{ id: string; name: string; detail?: string; photoUrl?: string; selected?: boolean; disabled?: boolean }>;\nexport type ChatRoomConfirmation = Readonly<{ destructive?: boolean; label: string; title: string; description: string; confirmLabel: string; cancelLabel: string; errorLabel: string; onConfirm: () => void | Promise<void> }>;\nexport function canSubmitChatRoom(profile: ChatRoomProfileValue, memberIds?: readonly string[]): boolean {\n return profile.name.trim().length > 0 && (memberIds === undefined || (memberIds.length > 0 && memberIds.every(id => id.trim().length > 0) && new Set(memberIds).size === memberIds.length));\n}\n"]}
@@ -1,5 +1,6 @@
1
+ import { type ResolvedTheme, type ThemeColors } from "./colors.js";
1
2
  import { control, spacing, type FontWeightValue, type TextVariant } from "./foundations.js";
2
- export { iconButtonEdges, iconButtonRecipe, resolveIconButtonEdgeOverhang, resolveIconButtonPresentation, type IconButtonEdge, type IconButtonShape, type IconButtonSize, type IconButtonTone, type ResolvedIconButtonPresentation, } from "./icon-button-recipe.js";
3
+ export { iconButtonEdges, iconButtonRecipe, resolveIconButtonBadgeOffset, resolveIconButtonEdgeOverhang, resolveIconButtonPresentation, validateIconButtonElevation, type IconButtonEdge, type IconButtonShape, type IconButtonSize, type IconButtonTone, type ResolvedIconButtonPresentation, } from "./icon-button-recipe.js";
3
4
  export { counterBadgeDefaults, counterBadgeRecipe, formatCounterBadgeCount, type CounterBadgeSize, type CounterBadgeTone, type CounterBadgeVariant, } from "./counter-badge-recipe.js";
4
5
  export { progressRecipe, resolveProgressSegments, type ProgressShape, type ProgressSize, type ProgressTone, } from "./progress-recipe.js";
5
6
  export type { BottomNavigationDensity, BottomNavigationDistribution, BottomNavigationPresentation, } from "./bottom-navigation-defaults.js";
@@ -297,7 +298,20 @@ export declare const selectionGroupRecipe: {
297
298
  readonly states: {
298
299
  readonly disabledOpacity: 0.5;
299
300
  };
301
+ /**
302
+ * CheckboxGroup `presentation="chips"` overflow (2026-10-23), the same meaning as SegmentedControl `overflow`:
303
+ * `wrap` breaks chips onto more lines, `scroll` keeps one horizontal line. Yajalal TeamGameFilter.tsx built a
304
+ * multi-select chip rail from a raw ScrollView because only single-select SegmentedControl could scroll.
305
+ * The scroll content keeps `scrollInset` on every side (and the scroller pulls back by the same amount, so the
306
+ * chips stay aligned with the column): the focus ring (2 + offset 2) and the small chip hit slop (4) would
307
+ * otherwise be clipped by the scrollport, and the last chip ends with the same gap as the first starts.
308
+ */
309
+ readonly overflow: {
310
+ readonly default: "wrap";
311
+ readonly scrollInset: 4;
312
+ };
300
313
  };
314
+ export type SelectionGroupOverflow = "wrap" | "scroll";
301
315
  export type SelectionGroupOrientation = keyof typeof selectionGroupRecipe.orientations;
302
316
  export type SelectionGroupPresentation = keyof typeof selectionGroupRecipe.orientations.vertical.gap;
303
317
  export type BadgeTone = "neutral"
@@ -313,9 +327,29 @@ export type BadgeTone = "neutral"
313
327
  | "strong" | "brand" | "info" | "success" | "warning" | "attention" | "danger";
314
328
  export type BadgeSize = "small" | "medium";
315
329
  export type BadgeVariant = "filled" | "outline";
330
+ /**
331
+ * Values a `leading`/`trailing` render callback receives. `strokeWidth` follows the Icon weight scale like
332
+ * BottomNavigation's icon context, so a product glyph renderer (Lucide etc.) draws the same line weight as HJM Icon.
333
+ * Before 2026-10-23 the context had no stroke, so Diairy passed a whole Icon node instead of the callback.
334
+ */
316
335
  export type BadgeAdornmentContext = Readonly<{
317
336
  color: string;
318
337
  size: number;
338
+ strokeWidth: number;
339
+ }>;
340
+ /**
341
+ * Product-defined classification color for one Badge (game series, contract grade…), one value per theme.
342
+ * Classification is not a status or the brand: before 2026-10-23 Yajalal nested an HjmNativeProvider with a
343
+ * brandPalette around a single Badge to paint it, which also re-scoped every token under it (brand-boundary §1).
344
+ * The product owns the hue; HJM owns the frame and picks/validates the label ink (WCAG AA 4.5).
345
+ */
346
+ export type BadgeCategoryColor = Readonly<Record<ResolvedTheme, string>>;
347
+ export type ResolvedBadgeCategoryColor = Readonly<{
348
+ /** Plate fill; null for the outline variant. */
349
+ background: string | null;
350
+ content: string;
351
+ /** Outline stroke; null for the filled variant. */
352
+ border: string | null;
319
353
  }>;
320
354
  export declare const badgeRecipe: {
321
355
  readonly slots: readonly ["root", "icon", "label", "trailing"];
@@ -523,7 +557,25 @@ export declare const badgeRecipe: {
523
557
  readonly radius: "sm";
524
558
  readonly borderWidth: 1;
525
559
  readonly fontWeight: "700";
560
+ /** Adornment line weight handed to `leading`/`trailing` callbacks (Icon `regular`). */
561
+ readonly iconStrokeWidth: 2;
562
+ /**
563
+ * `categoryColor` ink. Filled plates take whichever of the light ink (`onStatusFill`, as the status plates) or the
564
+ * dark ink (light theme `text`) reads better on the product fill; outline badges use the color itself as label and
565
+ * stroke. Either way the label must reach `minimumContrast` or the badge throws — the product must pick another
566
+ * shade per theme instead of shipping an unreadable classification.
567
+ */
568
+ readonly category: {
569
+ readonly darkInk: string;
570
+ readonly minimumContrast: 4.5;
571
+ };
526
572
  };
573
+ /** Resolves a product classification color for the active theme and verifies label contrast (AA 4.5). */
574
+ export declare function resolveBadgeCategoryColor(color: BadgeCategoryColor, options: Readonly<{
575
+ theme: ResolvedTheme;
576
+ variant: BadgeVariant;
577
+ palette: Readonly<ThemeColors>;
578
+ }>): ResolvedBadgeCategoryColor;
527
579
  export type SearchFieldSize = "medium" | "large";
528
580
  /** Search is a field specialization with stable affordance and clear targets. */
529
581
  export declare const searchFieldRecipe: {
@@ -710,11 +762,19 @@ export declare const chipRecipe: {
710
762
  readonly offset: 2;
711
763
  };
712
764
  };
765
+ /**
766
+ * Divider line pattern (2026-10-23). `dashed` separates parts of one surface that continue the same story ("the next
767
+ * story starts here") where a solid rule would split a card into two. Diairy drew it twice — Web `.cozy-nest-next`
768
+ * `border-block-start: 1px dashed` and an SVG `DashedRule` on Native because RN `borderStyle: "dashed"` on one side
769
+ * renders solid on iOS (2026-09-19 simulator) — with different dash lengths.
770
+ */
771
+ export type DividerLineStyle = "solid" | "dashed";
713
772
  export declare const dividerRecipe: {
714
773
  readonly slots: readonly ["root", "label"];
715
774
  readonly defaults: {
716
775
  readonly orientation: "horizontal";
717
776
  readonly inset: "none";
777
+ readonly lineStyle: "solid";
718
778
  };
719
779
  readonly color: Readonly<{
720
780
  source: "theme";
@@ -727,7 +787,15 @@ export declare const dividerRecipe: {
727
787
  readonly start: 16;
728
788
  readonly both: 16;
729
789
  };
790
+ /** Dash and gap along the line, at `thickness`; the pattern starts with a dash at the line's start edge. */
791
+ readonly lineStyles: {
792
+ readonly dashed: {
793
+ readonly dash: 4;
794
+ readonly gap: 4;
795
+ };
796
+ };
730
797
  };
798
+ export declare function validateDividerLineStyle(value: unknown): asserts value is DividerLineStyle;
731
799
  export declare const listRecipe: {
732
800
  readonly slots: readonly ["root", "item", "separator"];
733
801
  readonly defaults: {
@@ -767,12 +835,19 @@ export declare const listRecipe: {
767
835
  export type ListRowDensity = "compact" | "comfortable" | "relaxed" | "spacious";
768
836
  /** Frame geometry the ListRow paints around its leading slot. */
769
837
  export type ListRowLeadingShape = "square" | "circle";
838
+ /**
839
+ * Fixed mark at the row's trailing end. `disclosure`: activating the row opens another screen (iOS disclosure
840
+ * indicator). 2026-10-23 audit: products drew the chevron into `trailing` themselves (Yajalal ChevronRight ×10,
841
+ * Utilverse UiGlyph "next" ×24, Spint ×3), each with its own size, color and RTL handling.
842
+ */
843
+ export type ListRowTrailingAccessory = "none" | "disclosure";
770
844
  export declare const listRowRecipe: {
771
- readonly slots: readonly ["root", "leading", "content", "title", "description", "trailing"];
845
+ readonly slots: readonly ["root", "leading", "content", "title", "description", "trailing", "accessory"];
772
846
  readonly defaults: {
773
847
  readonly density: "comfortable";
774
848
  readonly selected: false;
775
849
  readonly tone: "default";
850
+ readonly trailingAccessory: "none";
776
851
  };
777
852
  readonly tones: {
778
853
  readonly default: {
@@ -869,6 +944,24 @@ export declare const listRowRecipe: {
869
944
  readonly glyph: "sm";
870
945
  readonly textVariant: "caption";
871
946
  };
947
+ /**
948
+ * Order inside the row command: leading → content → trailing → accessory; a `trailingAction` stays outside, after
949
+ * it. The mark is decorative (the row's link/button role already says it is activatable), follows the reading
950
+ * direction (`chevronEnd` mirrors in RTL) and sits `gap` after any trailing value, the iOS detail → chevron pairing.
951
+ */
952
+ readonly accessories: {
953
+ readonly disclosure: {
954
+ readonly icon: "chevronEnd";
955
+ readonly glyph: "sm";
956
+ readonly weight: "regular";
957
+ readonly color: Readonly<{
958
+ source: "theme";
959
+ key: "textWeak";
960
+ alpha?: number;
961
+ }>;
962
+ readonly gap: 8;
963
+ };
964
+ };
872
965
  readonly states: {
873
966
  readonly pressedBackground: Readonly<{
874
967
  source: "theme";
@@ -883,6 +976,19 @@ export declare const listRowRecipe: {
883
976
  readonly disabledOpacity: 0.5;
884
977
  };
885
978
  };
979
+ /**
980
+ * ChoiceRow per-item picture (2026-10-23: utilverse's shell theme row showed ThemeArtwork per choice and so rebuilt
981
+ * ListRow + Sheet + RadioGroup instead of ChoiceRow). The sheet draws each item's `leading` in the same box as the
982
+ * row's ListRow leading (40, centered, clipped), so the selected art reads the same in the row and in the sheet.
983
+ * When any item has a picture, items without one keep the empty box so every label starts on one line.
984
+ */
985
+ export declare const choiceRowRecipe: {
986
+ readonly itemLeading: {
987
+ readonly size: 40;
988
+ readonly align: "center";
989
+ };
990
+ };
991
+ export declare function validateListRowTrailingAccessory(value: unknown): asserts value is ListRowTrailingAccessory;
886
992
  export type AccordionDensity = "compact" | "comfortable";
887
993
  export declare const accordionRecipe: {
888
994
  readonly slots: readonly ["root", "item", "header", "trigger", "title", "indicator", "panel", "divider"];
@@ -3182,10 +3288,19 @@ export declare const avatarRecipe: {
3182
3288
  readonly defaults: {
3183
3289
  readonly size: "medium";
3184
3290
  readonly shape: "circle";
3291
+ readonly frame: "outlined";
3292
+ readonly accessoryPlacement: "bottom-end";
3185
3293
  };
3294
+ /**
3295
+ * 2026-10-23: 번뚝 UserAvatar(22·28·32·44)와 Native의 24 하한 때문에 Avatar를 쓰지 못했다. 임의 px 대신
3296
+ * 실사용 지름을 단계로 둔다. `touch` 44는 터치 대상 지름이자 Native의 기존 기본값이다(Avatar 자체는 누르는 대상이 아님).
3297
+ */
3186
3298
  readonly sizes: {
3299
+ readonly xxsmall: 22;
3300
+ readonly xsmall: 28;
3187
3301
  readonly small: 32;
3188
3302
  readonly medium: 40;
3303
+ readonly touch: 44;
3189
3304
  readonly large: 48;
3190
3305
  readonly xlarge: 64;
3191
3306
  };
@@ -3193,6 +3308,47 @@ export declare const avatarRecipe: {
3193
3308
  readonly rounded: "md";
3194
3309
  readonly circle: "full";
3195
3310
  };
3311
+ /**
3312
+ * 테두리·배경 표현. `outlined`가 기존 모습이다. `surface`는 테두리 없이 바탕만, `none`은 제품 그림(생성 SVG 등)이
3313
+ * 액자를 채울 때 바탕·테두리를 모두 뺀다 — 번뚝은 투명한 원 안에 SVG를 채운다(2026-10-23).
3314
+ */
3315
+ readonly frames: {
3316
+ readonly outlined: {
3317
+ readonly background: Readonly<{
3318
+ source: "theme";
3319
+ key: "bg";
3320
+ alpha?: number;
3321
+ }>;
3322
+ readonly border: Readonly<{
3323
+ source: "theme";
3324
+ key: "border";
3325
+ alpha?: number;
3326
+ }>;
3327
+ readonly borderWidth: 1;
3328
+ };
3329
+ readonly surface: {
3330
+ readonly background: Readonly<{
3331
+ source: "theme";
3332
+ key: "bg";
3333
+ alpha?: number;
3334
+ }>;
3335
+ readonly border: null;
3336
+ readonly borderWidth: 0;
3337
+ };
3338
+ readonly none: {
3339
+ readonly background: null;
3340
+ readonly border: null;
3341
+ readonly borderWidth: 0;
3342
+ };
3343
+ };
3344
+ /**
3345
+ * 모서리 표식(팀 배지·상태 점·편집 표시). `offset`은 Asset·IconTile과 같이 상자 모서리 **바깥으로** 나가는 거리다.
3346
+ * Avatar는 0이라 경계 상자 모서리에 붙어 행 배치가 바뀌지 않는다. 야잘알 PlayerAvatar가 `right: 0, bottom: 0`으로
3347
+ * 팀 배지를 얹던 자리다(2026-10-23).
3348
+ */
3349
+ readonly accessory: {
3350
+ readonly offset: 0;
3351
+ };
3196
3352
  readonly background: Readonly<{
3197
3353
  source: "theme";
3198
3354
  key: "bg";
@@ -3215,6 +3371,20 @@ export declare const avatarRecipe: {
3215
3371
  * Initials text step for an avatar diameter, shared by Web size tokens and Native numeric sizes
3216
3372
  * (2026-10-17 comparison: Native drew 12pt brand-colored initials at every size).
3217
3373
  */
3374
+ export type AvatarFrame = keyof typeof avatarRecipe.frames;
3375
+ /** Corner a small mark sits on. Shared by Avatar and IconTile so products name the corner the same way. */
3376
+ export type CornerAccessoryPlacement = "top-end" | "bottom-end";
3377
+ export declare const cornerAccessoryPlacements: readonly ["top-end", "bottom-end"];
3378
+ /**
3379
+ * Diameter for an Avatar `size`: a named step, or (Native compatibility) a number of points. Numbers below the
3380
+ * smallest step are rejected — the 24 floor rejected Burntok's 22 even though initials still fit at 22 (label 12).
3381
+ */
3382
+ export declare function resolveAvatarSize(size: AvatarSize | number): number;
3383
+ export declare function validateAvatarPresentation(options: Readonly<{
3384
+ shape?: string;
3385
+ frame?: string;
3386
+ accessoryPlacement?: string;
3387
+ }>): void;
3218
3388
  export declare function resolveAvatarInitialsTextVariant(size: number): "label" | "body" | "title";
3219
3389
  export type StatisticDensity = "compact" | "comfortable";
3220
3390
  export type StatisticPresentation = "plain" | "surface";
@@ -1 +1 @@
1
- {"version":3,"file":"component-recipes.d.ts","sourceRoot":"","sources":["../src/component-recipes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"component-recipes.d.ts","sourceRoot":"","sources":["../src/component-recipes.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,13 @@
1
1
  import { solidAccentColor } from "./color-references.js";
2
+ import { THEMES } from "./colors.js";
3
+ import { contrastRatio } from "./palette-contrast.js";
2
4
  import { collectionItemContract, fieldFrameContract, floatingSurfaceContract, focusIndicatorContract, formSupportContract, } from "./component-contracts.js";
3
5
  import { backdrop, breakpoint, control, glyph, layer, largeTextThreshold, layout, fontWeight, motion, motionPreset, opacity, radius, spacing, stroke, typography, } from "./foundations.js";
4
6
  import { buttonRecipe } from "./base-recipes.js";
5
7
  import { semanticColors } from "./semantic-colors.js";
6
8
  import { tooltipDescriptorDefaults } from "./tooltip.js";
7
9
  import { bottomNavigationRecipeDefaults } from "./bottom-navigation-defaults.js";
8
- export { iconButtonEdges, iconButtonRecipe, resolveIconButtonEdgeOverhang, resolveIconButtonPresentation, } from "./icon-button-recipe.js";
10
+ export { iconButtonEdges, iconButtonRecipe, resolveIconButtonBadgeOffset, resolveIconButtonEdgeOverhang, resolveIconButtonPresentation, validateIconButtonElevation, } from "./icon-button-recipe.js";
9
11
  export { counterBadgeDefaults, counterBadgeRecipe, formatCounterBadgeCount, } from "./counter-badge-recipe.js";
10
12
  export { progressRecipe, resolveProgressSegments, } from "./progress-recipe.js";
11
13
  export const textRecipe = {
@@ -136,6 +138,15 @@ export const selectionGroupRecipe = {
136
138
  error: formSupportContract.error,
137
139
  supportGap: formSupportContract.gap,
138
140
  states: { disabledOpacity: opacity.disabled },
141
+ /**
142
+ * CheckboxGroup `presentation="chips"` overflow (2026-10-23), the same meaning as SegmentedControl `overflow`:
143
+ * `wrap` breaks chips onto more lines, `scroll` keeps one horizontal line. Yajalal TeamGameFilter.tsx built a
144
+ * multi-select chip rail from a raw ScrollView because only single-select SegmentedControl could scroll.
145
+ * The scroll content keeps `scrollInset` on every side (and the scroller pulls back by the same amount, so the
146
+ * chips stay aligned with the column): the focus ring (2 + offset 2) and the small chip hit slop (4) would
147
+ * otherwise be clipped by the scrollport, and the last chip ends with the same gap as the first starts.
148
+ */
149
+ overflow: { default: "wrap", scrollInset: spacing.xxs },
139
150
  };
140
151
  export const badgeRecipe = {
141
152
  slots: ["root", "icon", "label", "trailing"],
@@ -181,7 +192,40 @@ export const badgeRecipe = {
181
192
  radius: "sm",
182
193
  borderWidth: stroke.default,
183
194
  fontWeight: fontWeight.bold,
195
+ /** Adornment line weight handed to `leading`/`trailing` callbacks (Icon `regular`). */
196
+ iconStrokeWidth: iconRecipe.weights.regular,
197
+ /**
198
+ * `categoryColor` ink. Filled plates take whichever of the light ink (`onStatusFill`, as the status plates) or the
199
+ * dark ink (light theme `text`) reads better on the product fill; outline badges use the color itself as label and
200
+ * stroke. Either way the label must reach `minimumContrast` or the badge throws — the product must pick another
201
+ * shade per theme instead of shipping an unreadable classification.
202
+ */
203
+ category: { darkInk: THEMES.light.text, minimumContrast: 4.5 },
184
204
  };
205
+ /** Resolves a product classification color for the active theme and verifies label contrast (AA 4.5). */
206
+ export function resolveBadgeCategoryColor(color, options) {
207
+ const { theme, variant, palette } = options;
208
+ const value = color?.[theme];
209
+ if (typeof value !== "string")
210
+ throw new TypeError(`Badge categoryColor needs a ${theme} color`);
211
+ const minimum = badgeRecipe.category.minimumContrast;
212
+ if (variant === "outline") {
213
+ for (const background of [palette.bg, palette.surface]) {
214
+ const ratio = contrastRatio(value, background);
215
+ if (ratio < minimum) {
216
+ throw new RangeError(`Badge categoryColor ${value} reads ${ratio.toFixed(2)}:1 on the ${theme} background ${background}; outline labels need ${minimum}:1`);
217
+ }
218
+ }
219
+ return { background: null, content: value, border: value };
220
+ }
221
+ const [content, ratio] = [palette.onStatusFill, badgeRecipe.category.darkInk]
222
+ .map(ink => [ink, contrastRatio(ink, value)])
223
+ .reduce((best, next) => (next[1] > best[1] ? next : best));
224
+ if (ratio < minimum) {
225
+ throw new RangeError(`Badge categoryColor ${value} (${theme}) reaches only ${ratio.toFixed(2)}:1 with either label ink; filled badges need ${minimum}:1`);
226
+ }
227
+ return { background: value, content, border: null };
228
+ }
185
229
  /** Search is a field specialization with stable affordance and clear targets. */
186
230
  export const searchFieldRecipe = {
187
231
  slots: ["root", "leading", "input", "trailing", "clear", "spinner"],
@@ -292,7 +336,7 @@ export const chipRecipe = {
292
336
  };
293
337
  export const dividerRecipe = {
294
338
  slots: ["root", "label"],
295
- defaults: { orientation: "horizontal", inset: "none" },
339
+ defaults: { orientation: "horizontal", inset: "none", lineStyle: "solid" },
296
340
  color: semanticColors.border.default,
297
341
  thickness: stroke.subtle,
298
342
  insets: {
@@ -300,7 +344,15 @@ export const dividerRecipe = {
300
344
  start: spacing.md,
301
345
  both: spacing.md,
302
346
  },
347
+ /** Dash and gap along the line, at `thickness`; the pattern starts with a dash at the line's start edge. */
348
+ lineStyles: {
349
+ dashed: { dash: 4, gap: 4 },
350
+ },
303
351
  };
352
+ export function validateDividerLineStyle(value) {
353
+ if (value !== "solid" && value !== "dashed")
354
+ throw new TypeError(`Unsupported Divider lineStyle: ${String(value)}`);
355
+ }
304
356
  /**
305
357
  * How far a ListRow surface (pressed, hover, selected, focus ring) reaches past the row text on each inline side.
306
358
  * 2026-10-17 user decision: the row text sits on its container's content edge (the 16 screen gutter on a default
@@ -336,8 +388,8 @@ export const listRecipe = {
336
388
  background: null,
337
389
  };
338
390
  export const listRowRecipe = {
339
- slots: ["root", "leading", "content", "title", "description", "trailing"],
340
- defaults: { density: "comfortable", selected: false, tone: "default" },
391
+ slots: ["root", "leading", "content", "title", "description", "trailing", "accessory"],
392
+ defaults: { density: "comfortable", selected: false, tone: "default", trailingAccessory: "none" },
341
393
  // Destructive destinations keep semantic emphasis without renderer-specific title styles.
342
394
  tones: { default: { titleColor: semanticColors.content.body }, danger: { titleColor: semanticColors.content.danger } },
343
395
  density: {
@@ -396,12 +448,33 @@ export const listRowRecipe = {
396
448
  glyph: "sm",
397
449
  textVariant: "caption",
398
450
  },
451
+ /**
452
+ * Order inside the row command: leading → content → trailing → accessory; a `trailingAction` stays outside, after
453
+ * it. The mark is decorative (the row's link/button role already says it is activatable), follows the reading
454
+ * direction (`chevronEnd` mirrors in RTL) and sits `gap` after any trailing value, the iOS detail → chevron pairing.
455
+ */
456
+ accessories: {
457
+ disclosure: { icon: "chevronEnd", glyph: "sm", weight: "regular", color: semanticColors.content.decorative, gap: spacing.xs },
458
+ },
399
459
  states: {
400
460
  pressedBackground: semanticColors.canvas,
401
461
  selectedBackground: semanticColors.selection.background,
402
462
  disabledOpacity: opacity.disabled,
403
463
  },
404
464
  };
465
+ /**
466
+ * ChoiceRow per-item picture (2026-10-23: utilverse's shell theme row showed ThemeArtwork per choice and so rebuilt
467
+ * ListRow + Sheet + RadioGroup instead of ChoiceRow). The sheet draws each item's `leading` in the same box as the
468
+ * row's ListRow leading (40, centered, clipped), so the selected art reads the same in the row and in the sheet.
469
+ * When any item has a picture, items without one keep the empty box so every label starts on one line.
470
+ */
471
+ export const choiceRowRecipe = {
472
+ itemLeading: { size: listRowLeadingSize, align: "center" },
473
+ };
474
+ export function validateListRowTrailingAccessory(value) {
475
+ if (value !== "none" && value !== "disclosure")
476
+ throw new TypeError(`Unsupported ListRow trailingAccessory: ${String(value)}`);
477
+ }
405
478
  export const accordionRecipe = {
406
479
  slots: ["root", "item", "header", "trigger", "title", "indicator", "panel", "divider"],
407
480
  defaults: { density: "comfortable", allowsMultipleExpanded: false },
@@ -1311,19 +1384,60 @@ export const avatarRecipe = {
1311
1384
  * 픽셀로 적으면 네 벌이 되기 때문이다. 남은 인원은 제품이 문구로 만든다("+3").
1312
1385
  */
1313
1386
  overlapRatio: 0.3,
1314
- defaults: { size: "medium", shape: "circle" },
1315
- sizes: { small: 32, medium: 40, large: 48, xlarge: 64 },
1387
+ defaults: { size: "medium", shape: "circle", frame: "outlined", accessoryPlacement: "bottom-end" },
1388
+ /**
1389
+ * 2026-10-23: 번뚝 UserAvatar(22·28·32·44)와 Native의 24 하한 때문에 Avatar를 쓰지 못했다. 임의 px 대신
1390
+ * 실사용 지름을 단계로 둔다. `touch` 44는 터치 대상 지름이자 Native의 기존 기본값이다(Avatar 자체는 누르는 대상이 아님).
1391
+ */
1392
+ sizes: { xxsmall: 22, xsmall: 28, small: 32, medium: 40, touch: 44, large: 48, xlarge: 64 },
1316
1393
  shapes: { rounded: "md", circle: "full" },
1394
+ /**
1395
+ * 테두리·배경 표현. `outlined`가 기존 모습이다. `surface`는 테두리 없이 바탕만, `none`은 제품 그림(생성 SVG 등)이
1396
+ * 액자를 채울 때 바탕·테두리를 모두 뺀다 — 번뚝은 투명한 원 안에 SVG를 채운다(2026-10-23).
1397
+ */
1398
+ frames: {
1399
+ outlined: { background: semanticColors.canvas, border: semanticColors.border.default, borderWidth: 1 },
1400
+ surface: { background: semanticColors.canvas, border: null, borderWidth: 0 },
1401
+ none: { background: null, border: null, borderWidth: 0 },
1402
+ },
1403
+ /**
1404
+ * 모서리 표식(팀 배지·상태 점·편집 표시). `offset`은 Asset·IconTile과 같이 상자 모서리 **바깥으로** 나가는 거리다.
1405
+ * Avatar는 0이라 경계 상자 모서리에 붙어 행 배치가 바뀌지 않는다. 야잘알 PlayerAvatar가 `right: 0, bottom: 0`으로
1406
+ * 팀 배지를 얹던 자리다(2026-10-23).
1407
+ */
1408
+ accessory: { offset: 0 },
1317
1409
  background: semanticColors.canvas,
1318
1410
  content: semanticColors.content.secondary,
1319
1411
  border: semanticColors.border.default,
1320
1412
  /** Initials use the strong emphasis step; their size follows the avatar (Web `.hjm-avatar[data-size]` steps). */
1321
1413
  initialsWeight: "strong",
1322
1414
  };
1415
+ export const cornerAccessoryPlacements = ["top-end", "bottom-end"];
1323
1416
  /**
1324
- * Initials text step for an avatar diameter, shared by Web size tokens and Native numeric sizes
1325
- * (2026-10-17 comparison: Native drew 12pt brand-colored initials at every size).
1417
+ * Diameter for an Avatar `size`: a named step, or (Native compatibility) a number of points. Numbers below the
1418
+ * smallest step are rejected — the 24 floor rejected Burntok's 22 even though initials still fit at 22 (label 12).
1326
1419
  */
1420
+ export function resolveAvatarSize(size) {
1421
+ if (typeof size === "number") {
1422
+ if (!Number.isFinite(size) || size < avatarRecipe.sizes.xxsmall) {
1423
+ throw new RangeError(`Avatar size must be at least ${avatarRecipe.sizes.xxsmall}`);
1424
+ }
1425
+ return size;
1426
+ }
1427
+ const step = avatarRecipe.sizes[size];
1428
+ if (step === undefined)
1429
+ throw new TypeError(`Unsupported Avatar size: ${String(size)}`);
1430
+ return step;
1431
+ }
1432
+ export function validateAvatarPresentation(options) {
1433
+ if (options.shape !== undefined && !(options.shape in avatarRecipe.shapes))
1434
+ throw new TypeError(`Unsupported Avatar shape: ${options.shape}`);
1435
+ if (options.frame !== undefined && !(options.frame in avatarRecipe.frames))
1436
+ throw new TypeError(`Unsupported Avatar frame: ${options.frame}`);
1437
+ if (options.accessoryPlacement !== undefined && !cornerAccessoryPlacements.includes(options.accessoryPlacement)) {
1438
+ throw new TypeError(`Unsupported Avatar accessoryPlacement: ${options.accessoryPlacement}`);
1439
+ }
1440
+ }
1327
1441
  export function resolveAvatarInitialsTextVariant(size) {
1328
1442
  if (size < avatarRecipe.sizes.medium)
1329
1443
  return "label";