@hjmds/design-contracts 0.8.2

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 (353) hide show
  1. package/README.md +208 -0
  2. package/dist/alert-dialog.d.ts +102 -0
  3. package/dist/alert-dialog.d.ts.map +1 -0
  4. package/dist/alert-dialog.js +136 -0
  5. package/dist/alert-dialog.js.map +1 -0
  6. package/dist/base-recipes.d.ts +184 -0
  7. package/dist/base-recipes.d.ts.map +1 -0
  8. package/dist/base-recipes.js +129 -0
  9. package/dist/base-recipes.js.map +1 -0
  10. package/dist/behaviors.d.ts +1254 -0
  11. package/dist/behaviors.d.ts.map +1 -0
  12. package/dist/behaviors.js +972 -0
  13. package/dist/behaviors.js.map +1 -0
  14. package/dist/bottom-navigation-defaults.d.ts +13 -0
  15. package/dist/bottom-navigation-defaults.d.ts.map +1 -0
  16. package/dist/bottom-navigation-defaults.js +10 -0
  17. package/dist/bottom-navigation-defaults.js.map +1 -0
  18. package/dist/bottom-navigation.d.ts +114 -0
  19. package/dist/bottom-navigation.d.ts.map +1 -0
  20. package/dist/bottom-navigation.js +223 -0
  21. package/dist/bottom-navigation.js.map +1 -0
  22. package/dist/breadcrumb.d.ts +97 -0
  23. package/dist/breadcrumb.d.ts.map +1 -0
  24. package/dist/breadcrumb.js +99 -0
  25. package/dist/breadcrumb.js.map +1 -0
  26. package/dist/calendar.d.ts +285 -0
  27. package/dist/calendar.d.ts.map +1 -0
  28. package/dist/calendar.js +297 -0
  29. package/dist/calendar.js.map +1 -0
  30. package/dist/card.d.ts +39 -0
  31. package/dist/card.d.ts.map +1 -0
  32. package/dist/card.js +50 -0
  33. package/dist/card.js.map +1 -0
  34. package/dist/carousel.d.ts +180 -0
  35. package/dist/carousel.d.ts.map +1 -0
  36. package/dist/carousel.js +172 -0
  37. package/dist/carousel.js.map +1 -0
  38. package/dist/catalog.d.ts +7158 -0
  39. package/dist/catalog.d.ts.map +1 -0
  40. package/dist/catalog.js +220 -0
  41. package/dist/catalog.js.map +1 -0
  42. package/dist/collection.d.ts +123 -0
  43. package/dist/collection.d.ts.map +1 -0
  44. package/dist/collection.js +211 -0
  45. package/dist/collection.js.map +1 -0
  46. package/dist/color-references.d.ts +46 -0
  47. package/dist/color-references.d.ts.map +1 -0
  48. package/dist/color-references.js +39 -0
  49. package/dist/color-references.js.map +1 -0
  50. package/dist/colors.d.ts +56 -0
  51. package/dist/colors.d.ts.map +1 -0
  52. package/dist/colors.js +90 -0
  53. package/dist/colors.js.map +1 -0
  54. package/dist/command-palette.d.ts +240 -0
  55. package/dist/command-palette.d.ts.map +1 -0
  56. package/dist/command-palette.js +97 -0
  57. package/dist/command-palette.js.map +1 -0
  58. package/dist/component-contracts.d.ts +137 -0
  59. package/dist/component-contracts.d.ts.map +1 -0
  60. package/dist/component-contracts.js +53 -0
  61. package/dist/component-contracts.js.map +1 -0
  62. package/dist/component-definitions.d.ts +135 -0
  63. package/dist/component-definitions.d.ts.map +1 -0
  64. package/dist/component-definitions.js +142 -0
  65. package/dist/component-definitions.js.map +1 -0
  66. package/dist/component-recipes.d.ts +3583 -0
  67. package/dist/component-recipes.d.ts.map +1 -0
  68. package/dist/component-recipes.js +1503 -0
  69. package/dist/component-recipes.js.map +1 -0
  70. package/dist/component-references.d.ts +416 -0
  71. package/dist/component-references.d.ts.map +1 -0
  72. package/dist/component-references.js +140 -0
  73. package/dist/component-references.js.map +1 -0
  74. package/dist/content-state.d.ts +104 -0
  75. package/dist/content-state.d.ts.map +1 -0
  76. package/dist/content-state.js +116 -0
  77. package/dist/content-state.js.map +1 -0
  78. package/dist/counter-badge-recipe.d.ts +80 -0
  79. package/dist/counter-badge-recipe.d.ts.map +1 -0
  80. package/dist/counter-badge-recipe.js +44 -0
  81. package/dist/counter-badge-recipe.js.map +1 -0
  82. package/dist/counter-badge.d.ts +12 -0
  83. package/dist/counter-badge.d.ts.map +1 -0
  84. package/dist/counter-badge.js +21 -0
  85. package/dist/counter-badge.js.map +1 -0
  86. package/dist/data-table.d.ts +203 -0
  87. package/dist/data-table.d.ts.map +1 -0
  88. package/dist/data-table.js +182 -0
  89. package/dist/data-table.js.map +1 -0
  90. package/dist/date-picker.d.ts +268 -0
  91. package/dist/date-picker.d.ts.map +1 -0
  92. package/dist/date-picker.js +168 -0
  93. package/dist/date-picker.js.map +1 -0
  94. package/dist/description-list.d.ts +68 -0
  95. package/dist/description-list.d.ts.map +1 -0
  96. package/dist/description-list.js +85 -0
  97. package/dist/description-list.js.map +1 -0
  98. package/dist/design-system-provider.d.ts +80 -0
  99. package/dist/design-system-provider.d.ts.map +1 -0
  100. package/dist/design-system-provider.js +147 -0
  101. package/dist/design-system-provider.js.map +1 -0
  102. package/dist/evidence.d.ts +49 -0
  103. package/dist/evidence.d.ts.map +1 -0
  104. package/dist/evidence.js +133 -0
  105. package/dist/evidence.js.map +1 -0
  106. package/dist/file-picker.d.ts +183 -0
  107. package/dist/file-picker.d.ts.map +1 -0
  108. package/dist/file-picker.js +224 -0
  109. package/dist/file-picker.js.map +1 -0
  110. package/dist/floating-action-button.d.ts +143 -0
  111. package/dist/floating-action-button.d.ts.map +1 -0
  112. package/dist/floating-action-button.js +149 -0
  113. package/dist/floating-action-button.js.map +1 -0
  114. package/dist/form.d.ts +143 -0
  115. package/dist/form.d.ts.map +1 -0
  116. package/dist/form.js +206 -0
  117. package/dist/form.js.map +1 -0
  118. package/dist/foundations.d.ts +300 -0
  119. package/dist/foundations.d.ts.map +1 -0
  120. package/dist/foundations.js +238 -0
  121. package/dist/foundations.js.map +1 -0
  122. package/dist/grid.d.ts +75 -0
  123. package/dist/grid.d.ts.map +1 -0
  124. package/dist/grid.js +133 -0
  125. package/dist/grid.js.map +1 -0
  126. package/dist/icon-button-recipe.d.ts +99 -0
  127. package/dist/icon-button-recipe.d.ts.map +1 -0
  128. package/dist/icon-button-recipe.js +53 -0
  129. package/dist/icon-button-recipe.js.map +1 -0
  130. package/dist/icon.d.ts +41 -0
  131. package/dist/icon.d.ts.map +1 -0
  132. package/dist/icon.js +147 -0
  133. package/dist/icon.js.map +1 -0
  134. package/dist/image.d.ts +82 -0
  135. package/dist/image.d.ts.map +1 -0
  136. package/dist/image.js +100 -0
  137. package/dist/image.js.map +1 -0
  138. package/dist/index.d.ts +58 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +66 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/layout.d.ts +118 -0
  143. package/dist/layout.d.ts.map +1 -0
  144. package/dist/layout.js +118 -0
  145. package/dist/layout.js.map +1 -0
  146. package/dist/link.d.ts +57 -0
  147. package/dist/link.d.ts.map +1 -0
  148. package/dist/link.js +142 -0
  149. package/dist/link.js.map +1 -0
  150. package/dist/load-more.d.ts +64 -0
  151. package/dist/load-more.d.ts.map +1 -0
  152. package/dist/load-more.js +124 -0
  153. package/dist/load-more.js.map +1 -0
  154. package/dist/mentions.d.ts +67 -0
  155. package/dist/mentions.d.ts.map +1 -0
  156. package/dist/mentions.js +107 -0
  157. package/dist/mentions.js.map +1 -0
  158. package/dist/number-field.d.ts +208 -0
  159. package/dist/number-field.d.ts.map +1 -0
  160. package/dist/number-field.js +247 -0
  161. package/dist/number-field.js.map +1 -0
  162. package/dist/otp-field.d.ts +152 -0
  163. package/dist/otp-field.d.ts.map +1 -0
  164. package/dist/otp-field.js +117 -0
  165. package/dist/otp-field.js.map +1 -0
  166. package/dist/pagination.d.ts +181 -0
  167. package/dist/pagination.d.ts.map +1 -0
  168. package/dist/pagination.js +226 -0
  169. package/dist/pagination.js.map +1 -0
  170. package/dist/password-field.d.ts +187 -0
  171. package/dist/password-field.d.ts.map +1 -0
  172. package/dist/password-field.js +120 -0
  173. package/dist/password-field.js.map +1 -0
  174. package/dist/popover.d.ts +152 -0
  175. package/dist/popover.d.ts.map +1 -0
  176. package/dist/popover.js +137 -0
  177. package/dist/popover.js.map +1 -0
  178. package/dist/progress-recipe.d.ts +43 -0
  179. package/dist/progress-recipe.d.ts.map +1 -0
  180. package/dist/progress-recipe.js +16 -0
  181. package/dist/progress-recipe.js.map +1 -0
  182. package/dist/recipes.d.ts +31 -0
  183. package/dist/recipes.d.ts.map +1 -0
  184. package/dist/recipes.js +46 -0
  185. package/dist/recipes.js.map +1 -0
  186. package/dist/responsive.d.ts +27 -0
  187. package/dist/responsive.d.ts.map +1 -0
  188. package/dist/responsive.js +66 -0
  189. package/dist/responsive.js.map +1 -0
  190. package/dist/result.d.ts +111 -0
  191. package/dist/result.d.ts.map +1 -0
  192. package/dist/result.js +97 -0
  193. package/dist/result.js.map +1 -0
  194. package/dist/selection-helpers.d.ts +16 -0
  195. package/dist/selection-helpers.d.ts.map +1 -0
  196. package/dist/selection-helpers.js +52 -0
  197. package/dist/selection-helpers.js.map +1 -0
  198. package/dist/semantic-colors.d.ts +275 -0
  199. package/dist/semantic-colors.d.ts.map +1 -0
  200. package/dist/semantic-colors.js +84 -0
  201. package/dist/semantic-colors.js.map +1 -0
  202. package/dist/sheet.d.ts +51 -0
  203. package/dist/sheet.d.ts.map +1 -0
  204. package/dist/sheet.js +69 -0
  205. package/dist/sheet.js.map +1 -0
  206. package/dist/showcase.d.ts +153 -0
  207. package/dist/showcase.d.ts.map +1 -0
  208. package/dist/showcase.js +210 -0
  209. package/dist/showcase.js.map +1 -0
  210. package/dist/side-panel.d.ts +199 -0
  211. package/dist/side-panel.d.ts.map +1 -0
  212. package/dist/side-panel.js +111 -0
  213. package/dist/side-panel.js.map +1 -0
  214. package/dist/slider.d.ts +138 -0
  215. package/dist/slider.d.ts.map +1 -0
  216. package/dist/slider.js +150 -0
  217. package/dist/slider.js.map +1 -0
  218. package/dist/splitter.d.ts +113 -0
  219. package/dist/splitter.d.ts.map +1 -0
  220. package/dist/splitter.js +99 -0
  221. package/dist/splitter.js.map +1 -0
  222. package/dist/statistic.d.ts +41 -0
  223. package/dist/statistic.d.ts.map +1 -0
  224. package/dist/statistic.js +76 -0
  225. package/dist/statistic.js.map +1 -0
  226. package/dist/steps.d.ts +196 -0
  227. package/dist/steps.d.ts.map +1 -0
  228. package/dist/steps.js +160 -0
  229. package/dist/steps.js.map +1 -0
  230. package/dist/tag.d.ts +128 -0
  231. package/dist/tag.d.ts.map +1 -0
  232. package/dist/tag.js +93 -0
  233. package/dist/tag.js.map +1 -0
  234. package/dist/timeline.d.ts +147 -0
  235. package/dist/timeline.d.ts.map +1 -0
  236. package/dist/timeline.js +127 -0
  237. package/dist/timeline.js.map +1 -0
  238. package/dist/toast.d.ts +164 -0
  239. package/dist/toast.d.ts.map +1 -0
  240. package/dist/toast.js +529 -0
  241. package/dist/toast.js.map +1 -0
  242. package/dist/tokens.d.ts +9 -0
  243. package/dist/tokens.d.ts.map +1 -0
  244. package/dist/tokens.js +9 -0
  245. package/dist/tokens.js.map +1 -0
  246. package/dist/tooltip.d.ts +44 -0
  247. package/dist/tooltip.d.ts.map +1 -0
  248. package/dist/tooltip.js +88 -0
  249. package/dist/tooltip.js.map +1 -0
  250. package/dist/tour.d.ts +218 -0
  251. package/dist/tour.d.ts.map +1 -0
  252. package/dist/tour.js +211 -0
  253. package/dist/tour.js.map +1 -0
  254. package/dist/transfer-list.d.ts +207 -0
  255. package/dist/transfer-list.d.ts.map +1 -0
  256. package/dist/transfer-list.js +193 -0
  257. package/dist/transfer-list.js.map +1 -0
  258. package/dist/tree-select.d.ts +78 -0
  259. package/dist/tree-select.d.ts.map +1 -0
  260. package/dist/tree-select.js +132 -0
  261. package/dist/tree-select.js.map +1 -0
  262. package/dist/tree.d.ts +206 -0
  263. package/dist/tree.d.ts.map +1 -0
  264. package/dist/tree.js +223 -0
  265. package/dist/tree.js.map +1 -0
  266. package/dist/upload-item.d.ts +173 -0
  267. package/dist/upload-item.d.ts.map +1 -0
  268. package/dist/upload-item.js +156 -0
  269. package/dist/upload-item.js.map +1 -0
  270. package/dist/version.d.ts +3 -0
  271. package/dist/version.d.ts.map +1 -0
  272. package/dist/version.js +3 -0
  273. package/dist/version.js.map +1 -0
  274. package/docs/affix.md +63 -0
  275. package/docs/anchor.md +59 -0
  276. package/docs/ant-design-coverage.md +119 -0
  277. package/docs/app-provider.md +50 -0
  278. package/docs/app-rn-adoption.md +227 -0
  279. package/docs/architecture.md +320 -0
  280. package/docs/authoring-brief.md +87 -0
  281. package/docs/border-beam.md +66 -0
  282. package/docs/bottom-navigation.md +127 -0
  283. package/docs/breadcrumb.md +82 -0
  284. package/docs/calendar.md +154 -0
  285. package/docs/carousel.md +130 -0
  286. package/docs/cascader.md +93 -0
  287. package/docs/catalog-decision-status.md +306 -0
  288. package/docs/color-picker.md +72 -0
  289. package/docs/command-palette.md +116 -0
  290. package/docs/confirm-popover.md +93 -0
  291. package/docs/consistency-audit.md +383 -0
  292. package/docs/consumer-release-gate.md +90 -0
  293. package/docs/content-state.md +156 -0
  294. package/docs/context-panel.md +88 -0
  295. package/docs/cross-platform-core-normalization.md +118 -0
  296. package/docs/data-table.md +79 -0
  297. package/docs/date-picker.md +84 -0
  298. package/docs/description-list.md +75 -0
  299. package/docs/design-system-provider.md +139 -0
  300. package/docs/dropdown.md +78 -0
  301. package/docs/expansion-roadmap.md +285 -0
  302. package/docs/file-picker.md +59 -0
  303. package/docs/floating-action-button.md +111 -0
  304. package/docs/form.md +134 -0
  305. package/docs/generated/component-maturity.md +103 -0
  306. package/docs/generated/renderer-evidence.json +5597 -0
  307. package/docs/generated/renderer-evidence.md +132 -0
  308. package/docs/generated/showcase-manifest.json +3732 -0
  309. package/docs/icon.md +22 -0
  310. package/docs/identity.md +121 -0
  311. package/docs/image.md +84 -0
  312. package/docs/implementation-0.5.md +85 -0
  313. package/docs/layout-primitives.md +107 -0
  314. package/docs/layout.md +83 -0
  315. package/docs/library-reference-decisions.md +123 -0
  316. package/docs/link.md +67 -0
  317. package/docs/load-more.md +31 -0
  318. package/docs/mentions.md +82 -0
  319. package/docs/migration-0.2.md +108 -0
  320. package/docs/migration-0.3.md +72 -0
  321. package/docs/migration-0.5.md +82 -0
  322. package/docs/migration-0.6.md +197 -0
  323. package/docs/notification.md +54 -0
  324. package/docs/number-field.md +82 -0
  325. package/docs/otp-field.md +103 -0
  326. package/docs/pagination.md +139 -0
  327. package/docs/password-field.md +98 -0
  328. package/docs/popover.md +124 -0
  329. package/docs/promotion-candidates.md +169 -0
  330. package/docs/qr-code.md +69 -0
  331. package/docs/rating.md +58 -0
  332. package/docs/responsive-grid.md +90 -0
  333. package/docs/result.md +96 -0
  334. package/docs/showcase.md +97 -0
  335. package/docs/side-panel.md +71 -0
  336. package/docs/slider.md +79 -0
  337. package/docs/splitter.md +55 -0
  338. package/docs/statistic.md +16 -0
  339. package/docs/steps.md +115 -0
  340. package/docs/tag.md +57 -0
  341. package/docs/time-picker.md +88 -0
  342. package/docs/timeline.md +146 -0
  343. package/docs/toast.md +127 -0
  344. package/docs/tooltip.md +58 -0
  345. package/docs/tour.md +136 -0
  346. package/docs/transfer-list.md +94 -0
  347. package/docs/tree-select.md +101 -0
  348. package/docs/tree.md +123 -0
  349. package/docs/upload-item.md +68 -0
  350. package/docs/utility.md +53 -0
  351. package/docs/virtual-list.md +70 -0
  352. package/docs/watermark.md +58 -0
  353. package/package.json +402 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bottom-navigation.js","sourceRoot":"","sources":["../src/bottom-navigation.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type BottomNavigationDensity,\n type BottomNavigationDistribution,\n type BottomNavigationPresentation,\n bottomNavigationRecipeDefaults,\n} from \"./bottom-navigation-defaults.js\";\nimport { formatCounterBadgeCount } from \"./counter-badge.js\";\nimport {\n type SemanticIconName,\n} from \"./icon.js\";\nimport type { DesignSystemDirection } from \"./design-system-provider.js\";\n\nexport type BottomNavigationDirection = DesignSystemDirection;\nexport type BottomNavigationKeyboardBehavior = \"hide\" | \"remain\";\n\nexport type BottomNavigationConfiguration = Readonly<{\n presentation?: BottomNavigationPresentation;\n distribution?: BottomNavigationDistribution;\n density?: BottomNavigationDensity;\n direction?: BottomNavigationDirection;\n keyboardBehavior?: BottomNavigationKeyboardBehavior;\n}>;\n\nexport type ResolvedBottomNavigationConfiguration = Readonly<{\n presentation: BottomNavigationPresentation;\n distribution: BottomNavigationDistribution;\n density: BottomNavigationDensity;\n direction: BottomNavigationDirection;\n keyboardBehavior: BottomNavigationKeyboardBehavior;\n}>;\n\n/**\n * Bottom navigation only accepts numeric counters. A silent status dot is too\n * ambiguous for a persistent, top-level destination.\n */\nexport type BottomNavigationCounterBadge = Readonly<{\n count: number;\n max?: number;\n /** Product-localized copy, for example \"3 unread messages\". */\n accessibilityLabel: string;\n}>;\n\n/**\n * BottomNavigation owns icon appearance through its density and state recipe.\n * Products may extend the semantic name registry, but never override size,\n * tone, stroke weight, accessibility, or logical direction at the call site.\n */\nexport type BottomNavigationIconDescriptor<\n IconName extends string = SemanticIconName,\n> = Readonly<{\n name: IconName;\n decorative?: true;\n accessibilityLabel?: never;\n size?: never;\n tone?: never;\n weight?: never;\n directionality?: never;\n}>;\n\nexport type ResolvedBottomNavigationIconDescriptor<\n IconName extends string = SemanticIconName,\n> = Readonly<{\n name: IconName;\n decorative: true;\n}>;\n\n/**\n * Items are stable top-level destinations, never actions. The icon is always\n * decorative because the visible/item accessibility label already names it.\n */\nexport type BottomNavigationItemDescriptor<\n Key extends string = string,\n IconName extends string = SemanticIconName,\n> = Readonly<{\n id: Key;\n label: string;\n accessibilityLabel?: string;\n icon: BottomNavigationIconDescriptor<IconName>;\n badge?: BottomNavigationCounterBadge;\n disabled?: boolean;\n}>;\n\n/** The router owns selectedKey; the design-system never keeps a second copy. */\nexport type BottomNavigationDescriptor<\n Key extends string = string,\n IconName extends string = SemanticIconName,\n> = Readonly<{\n accessibilityLabel: string;\n items: readonly BottomNavigationItemDescriptor<Key, IconName>[];\n selectedKey: Key;\n}>;\n\n/**\n * The resolved badge intentionally has no accessible label. Renderers hide its\n * subtree and use only the item's resolvedAccessibilityLabel, preventing the\n * counter from being announced twice.\n */\nexport type ResolvedBottomNavigationCounterBadge = Readonly<{\n visibleLabel: string;\n hiddenFromAccessibility: true;\n}>;\n\nexport type ResolvedBottomNavigationItemDescriptor<\n Key extends string = string,\n IconName extends string = SemanticIconName,\n> = Readonly<{\n id: Key;\n label: string;\n icon: ResolvedBottomNavigationIconDescriptor<IconName>;\n disabled: boolean;\n badge: ResolvedBottomNavigationCounterBadge | null;\n resolvedAccessibilityLabel: string;\n}>;\n\nexport type ResolvedBottomNavigationDescriptor<\n Key extends string = string,\n IconName extends string = SemanticIconName,\n> = Readonly<{\n accessibilityLabel: string;\n items: readonly ResolvedBottomNavigationItemDescriptor<Key, IconName>[];\n selectedKey: Key;\n}>;\n\nexport type BottomNavigationActivation<Key extends string = string> = Readonly<{\n key: Key;\n reason: \"navigate\" | \"reselect\";\n}>;\n\n/**\n * `maxItems` follows the platform bars rather than Material's five-destination\n * guidance: iOS tab bars and Android navigation bars both render six labelled\n * destinations without collapsing, and products that ship six need the shared\n * contract to describe them instead of routing around it.\n */\nexport const bottomNavigationBehaviorDefaults = {\n direction: \"ltr\",\n keyboardBehavior: \"hide\",\n minItems: 2,\n maxItems: 6,\n} as const satisfies Readonly<{\n direction: BottomNavigationDirection;\n keyboardBehavior: BottomNavigationKeyboardBehavior;\n minItems: number;\n maxItems: number;\n}>;\n\nfunction validateTrimmedCopy(value: unknown, field: string): asserts value is string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`${field} must not be empty`);\n }\n if (value !== value.trim()) {\n throw new TypeError(`${field} must not start or end with whitespace`);\n }\n}\n\nfunction isObject(value: unknown): value is Readonly<Record<string, unknown>> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nconst configurationKeys = new Set([\n \"presentation\",\n \"distribution\",\n \"density\",\n \"direction\",\n \"keyboardBehavior\",\n]);\nconst descriptorKeys = new Set([\"accessibilityLabel\", \"items\", \"selectedKey\"]);\nconst itemKeys = new Set([\n \"id\",\n \"label\",\n \"accessibilityLabel\",\n \"icon\",\n \"badge\",\n \"disabled\",\n]);\nconst iconKeys = new Set([\"name\", \"decorative\"]);\nconst badgeKeys = new Set([\"count\", \"max\", \"accessibilityLabel\"]);\n\nfunction rejectUnknownKeys(\n value: Readonly<Record<string, unknown>>,\n allowed: ReadonlySet<string>,\n field: string,\n): void {\n for (const key of Object.keys(value)) {\n if (!allowed.has(key)) {\n throw new TypeError(`Unsupported BottomNavigation ${field} field: ${key}`);\n }\n }\n}\n\nfunction normalizedCopy(value: string): string {\n return value.normalize(\"NFKC\").toLocaleLowerCase();\n}\n\nfunction validateBadge(badge: BottomNavigationCounterBadge): void {\n if (!isObject(badge)) {\n throw new TypeError(\"BottomNavigation badge must be an object\");\n }\n rejectUnknownKeys(badge, badgeKeys, \"badge\");\n if (!Number.isSafeInteger(badge.count) || badge.count < 0) {\n throw new TypeError(\"BottomNavigation badge count must be a non-negative safe integer\");\n }\n if (\n badge.max !== undefined &&\n (!Number.isSafeInteger(badge.max) || badge.max < 1)\n ) {\n throw new TypeError(\"BottomNavigation badge max must be a positive safe integer\");\n }\n validateTrimmedCopy(\n badge.accessibilityLabel,\n \"BottomNavigation badge accessibilityLabel\",\n );\n}\n\nfunction validateItem<Key extends string, IconName extends string>(\n item: BottomNavigationItemDescriptor<Key, IconName>,\n): void {\n if (!isObject(item)) {\n throw new TypeError(\"BottomNavigation item must be an object\");\n }\n rejectUnknownKeys(item, itemKeys, \"item\");\n validateTrimmedCopy(item.id, \"BottomNavigation item id\");\n validateTrimmedCopy(item.label, \"BottomNavigation item label\");\n if (item.accessibilityLabel !== undefined) {\n validateTrimmedCopy(\n item.accessibilityLabel,\n \"BottomNavigation item accessibilityLabel\",\n );\n if (\n !normalizedCopy(item.accessibilityLabel).includes(\n normalizedCopy(item.label),\n )\n ) {\n throw new TypeError(\n \"BottomNavigation item accessibilityLabel must include the visible label\",\n );\n }\n }\n if (!isObject(item.icon)) {\n throw new TypeError(\"BottomNavigation item icon must be an object\");\n }\n if (item.icon.decorative !== undefined && item.icon.decorative !== true) {\n throw new TypeError(\"BottomNavigation item icon must be decorative\");\n }\n rejectUnknownKeys(item.icon, iconKeys, \"item icon\");\n validateTrimmedCopy(item.icon.name, \"BottomNavigation item icon name\");\n if (item.disabled !== undefined && typeof item.disabled !== \"boolean\") {\n throw new TypeError(\"BottomNavigation item disabled must be a boolean\");\n }\n if (item.badge !== undefined) validateBadge(item.badge);\n}\n\nconst presentations = new Set<BottomNavigationPresentation>([\"bar\", \"floating\"]);\nconst distributions = new Set<BottomNavigationDistribution>([\"equal\", \"center-gap\"]);\nconst densities = new Set<BottomNavigationDensity>([\"compact\", \"regular\"]);\nconst directions = new Set<BottomNavigationDirection>([\"ltr\", \"rtl\"]);\nconst keyboardBehaviors = new Set<BottomNavigationKeyboardBehavior>([\n \"hide\",\n \"remain\",\n]);\n\nexport function validateBottomNavigationConfiguration(\n configuration: BottomNavigationConfiguration,\n itemCount: number,\n): void {\n if (!isObject(configuration)) {\n throw new TypeError(\"BottomNavigation configuration must be an object\");\n }\n rejectUnknownKeys(configuration, configurationKeys, \"configuration\");\n if (\n !Number.isSafeInteger(itemCount) ||\n itemCount < bottomNavigationBehaviorDefaults.minItems ||\n itemCount > bottomNavigationBehaviorDefaults.maxItems\n ) {\n throw new RangeError(\n `BottomNavigation configuration requires ${bottomNavigationBehaviorDefaults.minItems} to ${bottomNavigationBehaviorDefaults.maxItems} destinations`,\n );\n }\n if (\n configuration.presentation !== undefined &&\n !presentations.has(configuration.presentation)\n ) {\n throw new TypeError(\n `Unsupported BottomNavigation presentation: ${String(configuration.presentation)}`,\n );\n }\n if (\n configuration.distribution !== undefined &&\n !distributions.has(configuration.distribution)\n ) {\n throw new TypeError(\n `Unsupported BottomNavigation distribution: ${String(configuration.distribution)}`,\n );\n }\n if (configuration.density !== undefined && !densities.has(configuration.density)) {\n throw new TypeError(\n `Unsupported BottomNavigation density: ${String(configuration.density)}`,\n );\n }\n if (\n configuration.direction !== undefined &&\n !directions.has(configuration.direction)\n ) {\n throw new TypeError(\n `Unsupported BottomNavigation direction: ${String(configuration.direction)}`,\n );\n }\n if (\n configuration.keyboardBehavior !== undefined &&\n !keyboardBehaviors.has(configuration.keyboardBehavior)\n ) {\n throw new TypeError(\n `Unsupported BottomNavigation keyboardBehavior: ${String(configuration.keyboardBehavior)}`,\n );\n }\n if (configuration.distribution === \"center-gap\" && itemCount % 2 !== 0) {\n throw new RangeError(\n \"BottomNavigation center-gap distribution requires an even destination count\",\n );\n }\n}\n\nexport function resolveBottomNavigationConfiguration(\n configuration: BottomNavigationConfiguration,\n itemCount: number,\n): ResolvedBottomNavigationConfiguration {\n validateBottomNavigationConfiguration(configuration, itemCount);\n return {\n presentation:\n configuration.presentation ?? bottomNavigationRecipeDefaults.presentation,\n distribution:\n configuration.distribution ?? bottomNavigationRecipeDefaults.distribution,\n density: configuration.density ?? bottomNavigationRecipeDefaults.density,\n direction: configuration.direction ?? bottomNavigationBehaviorDefaults.direction,\n keyboardBehavior:\n configuration.keyboardBehavior ??\n bottomNavigationBehaviorDefaults.keyboardBehavior,\n };\n}\n\nexport function validateBottomNavigationDescriptor<\n Key extends string,\n IconName extends string,\n>(descriptor: BottomNavigationDescriptor<Key, IconName>): void {\n if (!isObject(descriptor)) {\n throw new TypeError(\"BottomNavigation descriptor must be an object\");\n }\n rejectUnknownKeys(descriptor, descriptorKeys, \"descriptor\");\n validateTrimmedCopy(\n descriptor.accessibilityLabel,\n \"BottomNavigation accessibilityLabel\",\n );\n if (!Array.isArray(descriptor.items)) {\n throw new TypeError(\"BottomNavigation items must be an array\");\n }\n validateTrimmedCopy(\n descriptor.selectedKey,\n \"BottomNavigation selectedKey\",\n );\n if (\n descriptor.items.length < bottomNavigationBehaviorDefaults.minItems ||\n descriptor.items.length > bottomNavigationBehaviorDefaults.maxItems\n ) {\n throw new RangeError(\n `BottomNavigation must contain ${bottomNavigationBehaviorDefaults.minItems} to ${bottomNavigationBehaviorDefaults.maxItems} destinations`,\n );\n }\n\n const ids = new Set<Key>();\n for (const item of descriptor.items) {\n validateItem(item);\n if (ids.has(item.id)) {\n throw new TypeError(`Duplicate BottomNavigation item id: ${item.id}`);\n }\n ids.add(item.id);\n }\n\n const selected = descriptor.items.find(\n (item) => item.id === descriptor.selectedKey,\n );\n if (!selected) {\n throw new RangeError(\n `BottomNavigation selectedKey must exist: ${descriptor.selectedKey}`,\n );\n }\n if (selected.disabled) {\n throw new RangeError(\"BottomNavigation selected destination must be enabled\");\n }\n}\n\nexport function resolveBottomNavigationItem<\n Key extends string,\n IconName extends string,\n>(\n item: BottomNavigationItemDescriptor<Key, IconName>,\n): ResolvedBottomNavigationItemDescriptor<Key, IconName> {\n validateItem(item);\n const baseAccessibilityLabel = item.accessibilityLabel ?? item.label;\n const visibleBadgeLabel = item.badge\n ? formatCounterBadgeCount(item.badge.count, item.badge.max)\n : null;\n const badge = visibleBadgeLabel\n ? ({\n visibleLabel: visibleBadgeLabel,\n hiddenFromAccessibility: true,\n } as const)\n : null;\n\n return {\n id: item.id,\n label: item.label,\n icon: { name: item.icon.name, decorative: true },\n disabled: item.disabled ?? false,\n badge,\n resolvedAccessibilityLabel:\n badge && item.badge\n ? `${baseAccessibilityLabel}, ${item.badge.accessibilityLabel}`\n : baseAccessibilityLabel,\n };\n}\n\nexport function resolveBottomNavigationDescriptor<\n Key extends string,\n IconName extends string,\n>(\n descriptor: BottomNavigationDescriptor<Key, IconName>,\n): ResolvedBottomNavigationDescriptor<Key, IconName> {\n validateBottomNavigationDescriptor(descriptor);\n return {\n accessibilityLabel: descriptor.accessibilityLabel,\n items: descriptor.items.map(resolveBottomNavigationItem),\n selectedKey: descriptor.selectedKey,\n };\n}\n\n/**\n * Produces navigation intent without mutating selectedKey. A renderer forwards\n * the request to its router, which updates selectedKey only after navigation.\n */\nexport function resolveBottomNavigationActivation<\n Key extends string,\n IconName extends string,\n>(\n descriptor: BottomNavigationDescriptor<Key, IconName>,\n key: Key,\n): BottomNavigationActivation<Key> | null {\n validateBottomNavigationDescriptor(descriptor);\n const item = descriptor.items.find((candidate) => candidate.id === key);\n if (!item || item.disabled) return null;\n return {\n key,\n reason: key === descriptor.selectedKey ? \"reselect\" : \"navigate\",\n };\n}\n"]}
@@ -0,0 +1,97 @@
1
+ import { type LinkDestination } from "./link.js";
2
+ /**
3
+ * Every ancestor crumb is a destination; the final crumb is the current page
4
+ * and never carries one. Position decides which crumb is current, so the
5
+ * discriminant is enforced by `validateBreadcrumbDescriptor`, not the type.
6
+ */
7
+ export type BreadcrumbItemDescriptor<Id extends string = string> = Readonly<{
8
+ id: Id;
9
+ label: string;
10
+ destination?: LinkDestination;
11
+ }>;
12
+ export type BreadcrumbDescriptor<Id extends string = string> = Readonly<{
13
+ items: readonly BreadcrumbItemDescriptor<Id>[];
14
+ }>;
15
+ export type ResolvedBreadcrumbItemDescriptor<Id extends string = string> = Readonly<{
16
+ id: Id;
17
+ label: string;
18
+ current: false;
19
+ destination: LinkDestination;
20
+ }> | Readonly<{
21
+ id: Id;
22
+ label: string;
23
+ current: true;
24
+ }>;
25
+ export type ResolvedBreadcrumbDescriptor<Id extends string = string> = Readonly<{
26
+ items: readonly ResolvedBreadcrumbItemDescriptor<Id>[];
27
+ }>;
28
+ export declare function validateBreadcrumbDescriptor<Id extends string>(descriptor: BreadcrumbDescriptor<Id>): void;
29
+ export declare function resolveBreadcrumbDescriptor<Id extends string>(descriptor: BreadcrumbDescriptor<Id>): ResolvedBreadcrumbDescriptor<Id>;
30
+ /**
31
+ * Crumbs read as an inline trail, not standalone buttons, so this mirrors
32
+ * Link's inline treatment (underline + focus indicator, no forced 44-unit
33
+ * row height) rather than the collection-item or field-frame grammar.
34
+ */
35
+ export declare const breadcrumbRecipe: {
36
+ readonly slots: readonly ["root", "list", "item", "link", "current", "separator"];
37
+ readonly gap: 4;
38
+ readonly link: {
39
+ readonly color: Readonly<{
40
+ source: "theme";
41
+ key: "textMuted";
42
+ alpha?: number;
43
+ }>;
44
+ readonly textVariant: "label";
45
+ readonly focus: {
46
+ readonly color: Readonly<{
47
+ source: "theme";
48
+ key: "contentBrand";
49
+ alpha?: number;
50
+ }>;
51
+ readonly width: 2;
52
+ readonly offset: 2;
53
+ };
54
+ };
55
+ readonly current: {
56
+ readonly color: Readonly<{
57
+ source: "theme";
58
+ key: "text";
59
+ alpha?: number;
60
+ }>;
61
+ readonly textVariant: "label";
62
+ readonly fontWeight: "600";
63
+ };
64
+ readonly separator: {
65
+ readonly color: Readonly<{
66
+ source: "theme";
67
+ key: "textWeak";
68
+ alpha?: number;
69
+ }>;
70
+ readonly glyph: "xs";
71
+ readonly icon: "chevronEnd";
72
+ readonly decorative: true;
73
+ };
74
+ };
75
+ /**
76
+ * Native has no equivalent surface: the platform back gesture and TopBar
77
+ * title already own "where am I / how do I go back". `web.roles` layers a
78
+ * `navigation` landmark and `list`/`listitem` grouping on top of the plain
79
+ * `link` behavior each ancestor crumb already gets from `Link`.
80
+ */
81
+ export declare const breadcrumbBehaviorSpec: {
82
+ readonly controlled: readonly [];
83
+ readonly inputs: readonly ["items"];
84
+ readonly stateAxes: {};
85
+ readonly web: {
86
+ readonly roles: readonly ["navigation", "list", "listitem", "link"];
87
+ readonly keyboard: readonly ["Tab", "Enter"];
88
+ readonly focus: "native";
89
+ };
90
+ readonly native: {
91
+ readonly roles: readonly [];
92
+ readonly states: readonly [];
93
+ readonly actions: readonly [];
94
+ };
95
+ readonly scenarios: readonly ["only-the-last-item-is-current-and-has-no-destination", "every-ancestor-item-reuses-the-link-destination-contract", "current-item-is-marked-aria-current-page-and-is-not-a-tab-stop", "separators-are-decorative-and-excluded-from-the-accessibility-tree", "duplicate-or-empty-item-identity-is-rejected-before-render", "no-automatic-truncation-collapses-items"];
96
+ };
97
+ //# sourceMappingURL=breadcrumb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breadcrumb.d.ts","sourceRoot":"","sources":["../src/breadcrumb.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAK1E;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,CAAC,EAAE,SAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC;IAC1E,EAAE,EAAE,EAAE,CAAC;IACP,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B,CAAC,CAAC;AAEH,MAAM,MAAM,oBAAoB,CAAC,EAAE,SAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC;IACtE,KAAK,EAAE,SAAS,wBAAwB,CAAC,EAAE,CAAC,EAAE,CAAC;CAChD,CAAC,CAAC;AAEH,MAAM,MAAM,gCAAgC,CAAC,EAAE,SAAS,MAAM,GAAG,MAAM,IACnE,QAAQ,CAAC;IAAE,EAAE,EAAE,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC;IAAC,WAAW,EAAE,eAAe,CAAA;CAAE,CAAC,GACjF,QAAQ,CAAC;IAAE,EAAE,EAAE,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,CAAC,CAAC;AAEvD,MAAM,MAAM,4BAA4B,CAAC,EAAE,SAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC;IAC9E,KAAK,EAAE,SAAS,gCAAgC,CAAC,EAAE,CAAC,EAAE,CAAC;CACxD,CAAC,CAAC;AAQH,wBAAgB,4BAA4B,CAAC,EAAE,SAAS,MAAM,EAC5D,UAAU,EAAE,oBAAoB,CAAC,EAAE,CAAC,GACnC,IAAI,CA0BN;AAED,wBAAgB,2BAA2B,CAAC,EAAE,SAAS,MAAM,EAC3D,UAAU,EAAE,oBAAoB,CAAC,EAAE,CAAC,GACnC,4BAA4B,CAAC,EAAE,CAAC,CAelC;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmBnB,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;CAkBzB,CAAC"}
@@ -0,0 +1,99 @@
1
+ import { validateLinkDestination } from "./link.js";
2
+ import { fontWeight, spacing } from "./foundations.js";
3
+ import { focusIndicatorContract } from "./component-contracts.js";
4
+ import { semanticColors } from "./semantic-colors.js";
5
+ function assertCopy(value, field) {
6
+ if (value.trim().length === 0) {
7
+ throw new TypeError(`Breadcrumb ${field} must not be empty`);
8
+ }
9
+ }
10
+ export function validateBreadcrumbDescriptor(descriptor) {
11
+ if (descriptor.items.length === 0) {
12
+ throw new RangeError("Breadcrumb must contain at least one item");
13
+ }
14
+ const ids = new Set();
15
+ const lastIndex = descriptor.items.length - 1;
16
+ descriptor.items.forEach((item, index) => {
17
+ assertCopy(item.id, "id");
18
+ if (ids.has(item.id)) {
19
+ throw new TypeError(`Duplicate Breadcrumb id: ${item.id}`);
20
+ }
21
+ ids.add(item.id);
22
+ assertCopy(item.label, "label");
23
+ if (index === lastIndex) {
24
+ if (item.destination !== undefined) {
25
+ throw new TypeError(`Current Breadcrumb item ${item.id} must not have a destination`);
26
+ }
27
+ return;
28
+ }
29
+ if (item.destination === undefined) {
30
+ throw new TypeError(`Breadcrumb item ${item.id} needs a destination`);
31
+ }
32
+ validateLinkDestination(item.destination);
33
+ });
34
+ }
35
+ export function resolveBreadcrumbDescriptor(descriptor) {
36
+ validateBreadcrumbDescriptor(descriptor);
37
+ const lastIndex = descriptor.items.length - 1;
38
+ return {
39
+ items: descriptor.items.map((item, index) => index === lastIndex
40
+ ? { id: item.id, label: item.label, current: true }
41
+ : {
42
+ id: item.id,
43
+ label: item.label,
44
+ current: false,
45
+ destination: item.destination,
46
+ }),
47
+ };
48
+ }
49
+ /**
50
+ * Crumbs read as an inline trail, not standalone buttons, so this mirrors
51
+ * Link's inline treatment (underline + focus indicator, no forced 44-unit
52
+ * row height) rather than the collection-item or field-frame grammar.
53
+ */
54
+ export const breadcrumbRecipe = {
55
+ slots: ["root", "list", "item", "link", "current", "separator"],
56
+ gap: spacing.xxs,
57
+ link: {
58
+ color: semanticColors.content.secondary,
59
+ textVariant: "label",
60
+ focus: focusIndicatorContract,
61
+ },
62
+ current: {
63
+ color: semanticColors.content.primary,
64
+ textVariant: "label",
65
+ fontWeight: fontWeight.semibold,
66
+ },
67
+ separator: {
68
+ color: semanticColors.content.decorative,
69
+ glyph: "xs",
70
+ icon: "chevronEnd",
71
+ decorative: true,
72
+ },
73
+ };
74
+ /**
75
+ * Native has no equivalent surface: the platform back gesture and TopBar
76
+ * title already own "where am I / how do I go back". `web.roles` layers a
77
+ * `navigation` landmark and `list`/`listitem` grouping on top of the plain
78
+ * `link` behavior each ancestor crumb already gets from `Link`.
79
+ */
80
+ export const breadcrumbBehaviorSpec = {
81
+ controlled: [],
82
+ inputs: ["items"],
83
+ stateAxes: {},
84
+ web: {
85
+ roles: ["navigation", "list", "listitem", "link"],
86
+ keyboard: ["Tab", "Enter"],
87
+ focus: "native",
88
+ },
89
+ native: { roles: [], states: [], actions: [] },
90
+ scenarios: [
91
+ "only-the-last-item-is-current-and-has-no-destination",
92
+ "every-ancestor-item-reuses-the-link-destination-contract",
93
+ "current-item-is-marked-aria-current-page-and-is-not-a-tab-stop",
94
+ "separators-are-decorative-and-excluded-from-the-accessibility-tree",
95
+ "duplicate-or-empty-item-identity-is-rejected-before-render",
96
+ "no-automatic-truncation-collapses-items",
97
+ ],
98
+ };
99
+ //# sourceMappingURL=breadcrumb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breadcrumb.js","sourceRoot":"","sources":["../src/breadcrumb.ts"],"names":[],"mappings":"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","sourcesContent":["import { validateLinkDestination, type LinkDestination } from \"./link.js\";\nimport { fontWeight, spacing } from \"./foundations.js\";\nimport { focusIndicatorContract } from \"./component-contracts.js\";\nimport { semanticColors } from \"./semantic-colors.js\";\n\n/**\n * Every ancestor crumb is a destination; the final crumb is the current page\n * and never carries one. Position decides which crumb is current, so the\n * discriminant is enforced by `validateBreadcrumbDescriptor`, not the type.\n */\nexport type BreadcrumbItemDescriptor<Id extends string = string> = Readonly<{\n id: Id;\n label: string;\n destination?: LinkDestination;\n}>;\n\nexport type BreadcrumbDescriptor<Id extends string = string> = Readonly<{\n items: readonly BreadcrumbItemDescriptor<Id>[];\n}>;\n\nexport type ResolvedBreadcrumbItemDescriptor<Id extends string = string> =\n | Readonly<{ id: Id; label: string; current: false; destination: LinkDestination }>\n | Readonly<{ id: Id; label: string; current: true }>;\n\nexport type ResolvedBreadcrumbDescriptor<Id extends string = string> = Readonly<{\n items: readonly ResolvedBreadcrumbItemDescriptor<Id>[];\n}>;\n\nfunction assertCopy(value: string, field: string): void {\n if (value.trim().length === 0) {\n throw new TypeError(`Breadcrumb ${field} must not be empty`);\n }\n}\n\nexport function validateBreadcrumbDescriptor<Id extends string>(\n descriptor: BreadcrumbDescriptor<Id>,\n): void {\n if (descriptor.items.length === 0) {\n throw new RangeError(\"Breadcrumb must contain at least one item\");\n }\n const ids = new Set<Id>();\n const lastIndex = descriptor.items.length - 1;\n descriptor.items.forEach((item, index) => {\n assertCopy(item.id, \"id\");\n if (ids.has(item.id)) {\n throw new TypeError(`Duplicate Breadcrumb id: ${item.id}`);\n }\n ids.add(item.id);\n assertCopy(item.label, \"label\");\n if (index === lastIndex) {\n if (item.destination !== undefined) {\n throw new TypeError(\n `Current Breadcrumb item ${item.id} must not have a destination`,\n );\n }\n return;\n }\n if (item.destination === undefined) {\n throw new TypeError(`Breadcrumb item ${item.id} needs a destination`);\n }\n validateLinkDestination(item.destination);\n });\n}\n\nexport function resolveBreadcrumbDescriptor<Id extends string>(\n descriptor: BreadcrumbDescriptor<Id>,\n): ResolvedBreadcrumbDescriptor<Id> {\n validateBreadcrumbDescriptor(descriptor);\n const lastIndex = descriptor.items.length - 1;\n return {\n items: descriptor.items.map((item, index) =>\n index === lastIndex\n ? { id: item.id, label: item.label, current: true as const }\n : {\n id: item.id,\n label: item.label,\n current: false as const,\n destination: item.destination as LinkDestination,\n },\n ),\n };\n}\n\n/**\n * Crumbs read as an inline trail, not standalone buttons, so this mirrors\n * Link's inline treatment (underline + focus indicator, no forced 44-unit\n * row height) rather than the collection-item or field-frame grammar.\n */\nexport const breadcrumbRecipe = {\n slots: [\"root\", \"list\", \"item\", \"link\", \"current\", \"separator\"] as const,\n gap: spacing.xxs,\n link: {\n color: semanticColors.content.secondary,\n textVariant: \"label\",\n focus: focusIndicatorContract,\n },\n current: {\n color: semanticColors.content.primary,\n textVariant: \"label\",\n fontWeight: fontWeight.semibold,\n },\n separator: {\n color: semanticColors.content.decorative,\n glyph: \"xs\",\n icon: \"chevronEnd\",\n decorative: true,\n },\n} as const;\n\n/**\n * Native has no equivalent surface: the platform back gesture and TopBar\n * title already own \"where am I / how do I go back\". `web.roles` layers a\n * `navigation` landmark and `list`/`listitem` grouping on top of the plain\n * `link` behavior each ancestor crumb already gets from `Link`.\n */\nexport const breadcrumbBehaviorSpec = {\n controlled: [],\n inputs: [\"items\"],\n stateAxes: {},\n web: {\n roles: [\"navigation\", \"list\", \"listitem\", \"link\"],\n keyboard: [\"Tab\", \"Enter\"],\n focus: \"native\",\n },\n native: { roles: [], states: [], actions: [] },\n scenarios: [\n \"only-the-last-item-is-current-and-has-no-destination\",\n \"every-ancestor-item-reuses-the-link-destination-contract\",\n \"current-item-is-marked-aria-current-page-and-is-not-a-tab-stop\",\n \"separators-are-decorative-and-excluded-from-the-accessibility-tree\",\n \"duplicate-or-empty-item-identity-is-rejected-before-render\",\n \"no-automatic-truncation-collapses-items\",\n ],\n} as const;\n"]}
@@ -0,0 +1,285 @@
1
+ import type { WebKeyboardKey } from "./behaviors.js";
2
+ import type { DesignSystemDirection } from "./design-system-provider.js";
3
+ /**
4
+ * The grid never parses or computes dates — month/leap-year/timezone
5
+ * arithmetic stays product-owned (see docs/calendar.md). This only checks the
6
+ * "YYYY-MM-DD" shape products already use as their KBO schedule date key.
7
+ */
8
+ export declare function isIsoCalendarDate(value: string): boolean;
9
+ export declare function assertIsoCalendarDate(value: string, field: string): void;
10
+ export declare function isIsoCalendarMonth(value: string): boolean;
11
+ export declare function assertIsoCalendarMonth(value: string, field: string): void;
12
+ /**
13
+ * One visible cell. A cell with no `date` is a pure filler that keeps the
14
+ * seven-column alignment (a leading/trailing blank before day 1 or after the
15
+ * month's last day) — it is never focusable, selectable, or announced.
16
+ * `content` is an opaque product payload (Yajalal's per-day game count, a
17
+ * dot, anything) the renderer's cell-content slot receives untouched; the
18
+ * grid never inspects it.
19
+ */
20
+ export type CalendarDateCellDescriptor<Content = unknown> = Readonly<{
21
+ date?: string;
22
+ /** The date exists but falls outside the month currently in focus (a leading/trailing day from an adjacent month). Still selectable unless `disabled`. */
23
+ outsideFocusedMonth?: boolean;
24
+ disabled?: boolean;
25
+ content?: Content;
26
+ }>;
27
+ export type CalendarWeekdayLabels = readonly [
28
+ string,
29
+ string,
30
+ string,
31
+ string,
32
+ string,
33
+ string,
34
+ string
35
+ ];
36
+ /**
37
+ * Raw product data for one visible month page. HJM does not compute which
38
+ * dates belong to a month or the leading/trailing blanks — the product
39
+ * already owns that arithmetic (see `buildCalendarCells` in Yajalal's
40
+ * schedule explorer). HJM only validates the row-major seven-column shape
41
+ * and resolves per-cell semantic state on top of it.
42
+ */
43
+ export type CalendarGridDescriptor<Content = unknown> = Readonly<{
44
+ /** Row-major, seven columns per row (one per weekday), so length must be a positive multiple of seven. */
45
+ cells: readonly CalendarDateCellDescriptor<Content>[];
46
+ /** Localized short weekday labels in the same column order as `cells`, e.g. ["일","월","화","수","목","금","토"]. */
47
+ weekdayLabels: CalendarWeekdayLabels;
48
+ /** ISO date of "today" per the product's clock. The grid never calls `Date.now()` itself. */
49
+ todayDate: string;
50
+ }>;
51
+ export declare function validateCalendarGridDescriptor<Content>(grid: CalendarGridDescriptor<Content>): void;
52
+ /**
53
+ * A cursor's committed value and the one displayed month page are
54
+ * independent controlled axes, mirroring `SelectSelection`/`SelectOpenState`
55
+ * in spirit: paging the visible month never clears or moves the selection.
56
+ */
57
+ export type CalendarMonthChangeReason = "previous" | "next" | "jump";
58
+ export type CalendarMonthNavigation = Readonly<{
59
+ focusedMonth: string;
60
+ defaultFocusedMonth?: never;
61
+ onFocusedMonthChange(month: string, reason: CalendarMonthChangeReason): void;
62
+ }> | Readonly<{
63
+ focusedMonth?: never;
64
+ defaultFocusedMonth?: string;
65
+ onFocusedMonthChange?: (month: string, reason: CalendarMonthChangeReason) => void;
66
+ }>;
67
+ export declare function validateCalendarMonthNavigation(navigation: CalendarMonthNavigation): void;
68
+ /**
69
+ * Single committed date only. Range selection is deliberately excluded — no
70
+ * Yajalal or BurnTok flow has measured demand for it (see docs/calendar.md).
71
+ */
72
+ export type CalendarSelection = Readonly<{
73
+ selectedDate: string | null;
74
+ defaultSelectedDate?: never;
75
+ onSelectionChange(date: string | null): void;
76
+ }> | Readonly<{
77
+ selectedDate?: never;
78
+ defaultSelectedDate?: string | null;
79
+ onSelectionChange?: (date: string | null) => void;
80
+ }>;
81
+ export declare function validateCalendarSelection(selection: CalendarSelection): void;
82
+ export type CalendarDescriptor<Content = unknown> = Readonly<{
83
+ grid: CalendarGridDescriptor<Content>;
84
+ /** Product-formatted heading copy ("2026년 8월"); the grid never formats a date itself. */
85
+ monthLabel: string;
86
+ }> & CalendarMonthNavigation & CalendarSelection;
87
+ export declare function validateCalendarDescriptor<Content>(descriptor: CalendarDescriptor<Content>): void;
88
+ export type CalendarAccessibleNameInfo<Content = unknown> = Readonly<{
89
+ date: string;
90
+ isToday: boolean;
91
+ isSelected: boolean;
92
+ disabled: boolean;
93
+ content?: Content;
94
+ }>;
95
+ /**
96
+ * "8월 19일 수요일, 경기 2개, 선택됨" is assembled by the product from its own
97
+ * `content` payload and locale/grammar — the same reason Steps takes
98
+ * `composeAccessibleName` instead of assembling copy itself.
99
+ */
100
+ export type ComposeCalendarAccessibleName<Content = unknown> = (info: CalendarAccessibleNameInfo<Content>) => string;
101
+ export type ResolvedCalendarDateCell<Content = unknown> = CalendarDateCellDescriptor<Content> & Readonly<{
102
+ date: string;
103
+ /** 1-indexed. */
104
+ row: number;
105
+ /** 1-indexed, 1..7. */
106
+ column: number;
107
+ isToday: boolean;
108
+ isSelected: boolean;
109
+ /** `false` when disabled — the cell stays focusable (see `getCalendarNavigationTarget`) but must never commit or close on activate. */
110
+ selectable: boolean;
111
+ accessibleName: string;
112
+ }>;
113
+ export type ResolvedCalendarFillerCell = Readonly<{
114
+ date?: never;
115
+ row: number;
116
+ column: number;
117
+ filler: true;
118
+ }>;
119
+ export type ResolvedCalendarGridCell<Content = unknown> = ResolvedCalendarDateCell<Content> | ResolvedCalendarFillerCell;
120
+ /**
121
+ * Resolves per-cell semantic state against a selection supplied separately
122
+ * from the raw grid (mirroring `resolveSelectSelectedItem`'s separation of
123
+ * source data from selection state) — the same grid page renders identically
124
+ * whether it is hosted by Calendar or by DatePicker's popover/sheet.
125
+ */
126
+ export declare function resolveCalendarGridDescriptor<Content>(grid: CalendarGridDescriptor<Content>, selectedDate: string | null, options: Readonly<{
127
+ composeAccessibleName: ComposeCalendarAccessibleName<Content>;
128
+ }>): readonly ResolvedCalendarGridCell<Content>[];
129
+ /** Top-level entry point: validates the descriptor and resolves its grid page. */
130
+ export declare function resolveCalendarDescriptor<Content>(descriptor: CalendarDescriptor<Content>, options: Readonly<{
131
+ composeAccessibleName: ComposeCalendarAccessibleName<Content>;
132
+ }>): readonly ResolvedCalendarGridCell<Content>[];
133
+ export type CalendarNavigationIntent = "next-day" | "previous-day" | "next-week" | "previous-week" | "first-of-week" | "last-of-week";
134
+ /**
135
+ * ArrowLeft/Right flip under RTL, matching `getSelectionNavigationIntent`'s
136
+ * `direction` parameter.
137
+ */
138
+ export declare function getCalendarNavigationIntent(key: WebKeyboardKey, direction?: DesignSystemDirection): CalendarNavigationIntent | undefined;
139
+ export type CalendarNavigationResult = Readonly<{
140
+ date: string;
141
+ overflow?: never;
142
+ }> | Readonly<{
143
+ date?: never;
144
+ overflow: "before" | "after";
145
+ }>;
146
+ /**
147
+ * Pure index arithmetic over the fixed seven-column page. Unlike
148
+ * `getCollectionNavigationTarget`, this does NOT skip disabled dates —
149
+ * per the WAI-ARIA date picker dialog pattern, arrow-key focus must land
150
+ * predictably (down always moves exactly one row) even on a disabled date;
151
+ * only the *activate* action is expected to no-op there. Moving past the
152
+ * edge of this page returns an `overflow` signal instead of wrapping, since
153
+ * HJM does not know the adjacent month's shape — the product pages the
154
+ * month and refocuses the corresponding day.
155
+ */
156
+ export declare function getCalendarNavigationTarget<Content>(grid: CalendarGridDescriptor<Content>, currentDate: string, intent: CalendarNavigationIntent): CalendarNavigationResult;
157
+ export type CalendarSize = "medium" | "large";
158
+ /**
159
+ * `today` and `selected` are visually independent (a non-selected today and
160
+ * a selected past day must both read clearly) and neither is color-only:
161
+ * today gets a persistent border, selected gets a filled background, and
162
+ * both remain in `accessibleName`/`isToday`/`isSelected` for assistive tech.
163
+ */
164
+ export declare const calendarRecipe: {
165
+ readonly slots: readonly ["root", "header", "monthLabel", "previousMonth", "nextMonth", "weekdayRow", "weekdayLabel", "grid", "week", "day", "dayLabel", "content"];
166
+ readonly defaults: {
167
+ readonly size: "medium";
168
+ };
169
+ readonly header: {
170
+ readonly gap: 8;
171
+ readonly monthLabel: {
172
+ readonly textVariant: "title";
173
+ readonly fontWeight: "700";
174
+ readonly color: Readonly<{
175
+ source: "theme";
176
+ key: "text";
177
+ alpha?: number;
178
+ }>;
179
+ };
180
+ readonly navButton: {
181
+ readonly diameter: 44;
182
+ readonly color: Readonly<{
183
+ source: "theme";
184
+ key: "textMuted";
185
+ alpha?: number;
186
+ }>;
187
+ };
188
+ readonly navIcon: {
189
+ readonly previous: "chevronStart";
190
+ readonly next: "chevronEnd";
191
+ };
192
+ };
193
+ readonly weekdayLabel: {
194
+ readonly textVariant: "label";
195
+ readonly color: Readonly<{
196
+ source: "theme";
197
+ key: "textMuted";
198
+ alpha?: number;
199
+ }>;
200
+ };
201
+ readonly sizes: {
202
+ readonly medium: {
203
+ readonly cellDiameter: 44;
204
+ readonly textVariant: "body";
205
+ readonly glyph: "sm";
206
+ };
207
+ readonly large: {
208
+ readonly cellDiameter: 44;
209
+ readonly textVariant: "bodyLarge";
210
+ readonly glyph: "md";
211
+ };
212
+ };
213
+ readonly day: {
214
+ readonly radius: "full";
215
+ readonly label: {
216
+ readonly color: Readonly<{
217
+ source: "theme";
218
+ key: "textBody";
219
+ alpha?: number;
220
+ }>;
221
+ readonly numericVariant: "tabular";
222
+ };
223
+ readonly outsideFocusedMonthOpacity: 0.72;
224
+ readonly disabledOpacity: 0.5;
225
+ readonly today: {
226
+ readonly border: Readonly<{
227
+ source: "theme";
228
+ key: "contentBrand";
229
+ alpha?: number;
230
+ }>;
231
+ readonly borderWidth: 1;
232
+ };
233
+ readonly selected: {
234
+ readonly background: Readonly<{
235
+ source: "theme";
236
+ key: "primary";
237
+ alpha?: number;
238
+ }>;
239
+ readonly content: Readonly<{
240
+ source: "theme";
241
+ key: "onPrimary";
242
+ alpha?: number;
243
+ }>;
244
+ };
245
+ readonly focus: {
246
+ readonly color: Readonly<{
247
+ source: "theme";
248
+ key: "contentBrand";
249
+ alpha?: number;
250
+ }>;
251
+ readonly width: 2;
252
+ readonly offset: 2;
253
+ };
254
+ };
255
+ };
256
+ /**
257
+ * Calendar is `shared`, not `adaptive`: the grid is always visible inline
258
+ * (no popup/Sheet choice to make). Web gets `grid` role + roving-tabindex
259
+ * arrow keys; Native has no composite-widget equivalent, so each date is
260
+ * simply an independently focusable/tappable element and month paging goes
261
+ * through the always-present previous/next buttons on both platforms — same
262
+ * result (the user reaches and picks a date), different path, matching the
263
+ * `beta → stable(adaptive)` gate's standard even though this component
264
+ * itself is not adaptive.
265
+ */
266
+ export declare const calendarBehavior: {
267
+ readonly controlled: readonly ["selectedDate", "defaultSelectedDate", "onSelectionChange", "focusedMonth", "defaultFocusedMonth", "onFocusedMonthChange"];
268
+ readonly inputs: readonly ["grid", "monthLabel"];
269
+ readonly stateAxes: {
270
+ readonly availability: readonly ["enabled", "disabled"];
271
+ readonly value: readonly ["selected"];
272
+ };
273
+ readonly web: {
274
+ readonly roles: readonly ["grid", "row", "gridcell", "button"];
275
+ readonly keyboard: readonly ["Tab", "Enter", "Space", "ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", "Home", "End"];
276
+ readonly focus: "roving";
277
+ };
278
+ readonly native: {
279
+ readonly roles: readonly ["button"];
280
+ readonly states: readonly ["disabled", "selected"];
281
+ readonly actions: readonly ["activate"];
282
+ };
283
+ readonly scenarios: readonly ["today-and-selected-are-independent-and-both-non-color-marked", "disabled-dates-remain-focusable-but-never-activate", "arrow-keys-move-by-day-and-week-inside-the-visible-month-page", "home-and-end-move-to-the-first-and-last-dated-cell-of-the-focused-row", "moving-past-the-visible-grid-edge-requests-a-month-change-instead-of-wrapping", "filler-cells-carry-no-accessible-name-and-are-hidden-from-assistive-tech", "every-dated-cell-accessible-name-is-composed-by-the-product", "changing-the-focused-month-never-changes-or-clears-the-selection", "range-selection-is-not-part-of-the-contract"];
284
+ };
285
+ //# sourceMappingURL=calendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../src/calendar.ts"],"names":[],"mappings":"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"}