themelia-react-ui 2.0.5 → 2.0.6

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 (489) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/MIGRATION.md +119 -0
  3. package/README.md +13 -6
  4. package/dist/{accordion-B9MHG0cT.js → accordion-0tQUZ20r.js} +7 -7
  5. package/dist/accordion-0tQUZ20r.js.map +1 -0
  6. package/dist/{action-menu-Dr8K-ghE.js → action-menu-C0gjzLyE.js} +7 -7
  7. package/dist/{action-menu-Dr8K-ghE.js.map → action-menu-C0gjzLyE.js.map} +1 -1
  8. package/dist/{ai-artifact-C58tQcBy.js → ai-artifact-CGGpQryR.js} +172 -157
  9. package/dist/ai-artifact-CGGpQryR.js.map +1 -0
  10. package/dist/{app-shell-B_IuNWOo.js → app-shell-EHuuRDGy.js} +5 -5
  11. package/dist/{app-shell-B_IuNWOo.js.map → app-shell-EHuuRDGy.js.map} +1 -1
  12. package/dist/{attachment-Dg_69lPS.js → attachment-BCpA4e7i.js} +8 -8
  13. package/dist/{attachment-Dg_69lPS.js.map → attachment-BCpA4e7i.js.map} +1 -1
  14. package/dist/{auth-DTkkshS8.js → auth-B0girIk_.js} +15 -15
  15. package/dist/auth-B0girIk_.js.map +1 -0
  16. package/dist/{avatar-CeZaFmNH.js → avatar-B9Jnp-T-.js} +3 -3
  17. package/dist/{avatar-CeZaFmNH.js.map → avatar-B9Jnp-T-.js.map} +1 -1
  18. package/dist/{badge-xIiV_E7f.js → badge-wWauMgAt.js} +3 -3
  19. package/dist/{badge-xIiV_E7f.js.map → badge-wWauMgAt.js.map} +1 -1
  20. package/dist/base/accordion.js +1 -1
  21. package/dist/base/action-menu.js +1 -1
  22. package/dist/base/attachment.js +1 -1
  23. package/dist/base/avatar.js +1 -1
  24. package/dist/base/badge.js +1 -1
  25. package/dist/base/batch-action-bar.js +1 -1
  26. package/dist/base/buttons.js +1 -1
  27. package/dist/base/cards.js +2 -2
  28. package/dist/base/carousel.js +3 -3
  29. package/dist/base/cascader.js +1 -1
  30. package/dist/base/chart.js +1 -1
  31. package/dist/base/choice-inputs.js +2 -2
  32. package/dist/base/code-block.js +1 -1
  33. package/dist/base/combobox.js +1 -1
  34. package/dist/base/command.js +1 -1
  35. package/dist/base/copyable.js +1 -1
  36. package/dist/base/date-pickers.js +2 -2
  37. package/dist/base/display.js +6 -6
  38. package/dist/base/feedback.js +4 -4
  39. package/dist/base/forms-numeric.js +1 -1
  40. package/dist/base/forms.js +2 -2
  41. package/dist/base/inline-edit.js +8 -8
  42. package/dist/base/item.js +1 -1
  43. package/dist/base/media-gallery.js +1 -1
  44. package/dist/base/metadata-list.js +1 -1
  45. package/dist/base/navigation.js +6 -6
  46. package/dist/base/popover-menu.js +1 -1
  47. package/dist/base/popover.js +1 -1
  48. package/dist/base/qr-code.js +1 -1
  49. package/dist/base/repeaters.js +195 -188
  50. package/dist/base/repeaters.js.map +1 -1
  51. package/dist/base/sheet.js +1 -1
  52. package/dist/base/sidebar.js +2 -2
  53. package/dist/base/signature-pad.js +7 -7
  54. package/dist/base/skeleton.js +1 -1
  55. package/dist/base/spinner.js +5 -5
  56. package/dist/base/spinner.js.map +1 -1
  57. package/dist/base/structure.js +1 -1
  58. package/dist/base/table.js +1 -1
  59. package/dist/base/text-inputs.js +2 -2
  60. package/dist/base/toaster.js +1 -1
  61. package/dist/base/tree.js +1 -1
  62. package/dist/base/upload-queue.js +1 -1
  63. package/dist/base/upload.js +3 -3
  64. package/dist/base/value-inputs.js +1 -1
  65. package/dist/{batch-action-bar-Cb8cuvyy.js → batch-action-bar-BoqWIIpV.js} +5 -5
  66. package/dist/{batch-action-bar-Cb8cuvyy.js.map → batch-action-bar-BoqWIIpV.js.map} +1 -1
  67. package/dist/blocks/admin.js +17 -17
  68. package/dist/blocks/ai.js +227 -221
  69. package/dist/blocks/ai.js.map +1 -1
  70. package/dist/blocks/analytics/usage-card.js +1 -1
  71. package/dist/blocks/analytics.js +424 -449
  72. package/dist/blocks/analytics.js.map +1 -1
  73. package/dist/blocks/collaboration.js +1 -1
  74. package/dist/blocks/commerce/receipt.js +1 -1
  75. package/dist/blocks/commerce.js +225 -220
  76. package/dist/blocks/commerce.js.map +1 -1
  77. package/dist/blocks/data-display.js +2 -2
  78. package/dist/blocks/onboarding.js +5 -5
  79. package/dist/blocks/planning.js +11 -11
  80. package/dist/blocks/timelines.js +1 -1
  81. package/dist/{breadcrumbs-J-K2kl4c.js → breadcrumbs-Bp9Ke7kd.js} +4 -4
  82. package/dist/breadcrumbs-Bp9Ke7kd.js.map +1 -0
  83. package/dist/{button-S2Cubiiz.js → button-ChBovTx0.js} +2 -2
  84. package/dist/{button-S2Cubiiz.js.map → button-ChBovTx0.js.map} +1 -1
  85. package/dist/{buttons-BedGfygC.js → buttons-DeW0bQeK.js} +6 -6
  86. package/dist/{buttons-BedGfygC.js.map → buttons-DeW0bQeK.js.map} +1 -1
  87. package/dist/{cards-rNX1M4Xn.js → cards-CNXnmvV5.js} +8 -8
  88. package/dist/{cards-rNX1M4Xn.js.map → cards-CNXnmvV5.js.map} +1 -1
  89. package/dist/{cascader-B1MiqkBq.js → cascader-CrAl9zD5.js} +15 -15
  90. package/dist/{cascader-B1MiqkBq.js.map → cascader-CrAl9zD5.js.map} +1 -1
  91. package/dist/{chart-Darg_0Kv.js → chart-I7ROnsl8.js} +5 -5
  92. package/dist/{chart-Darg_0Kv.js.map → chart-I7ROnsl8.js.map} +1 -1
  93. package/dist/{checkbox-fflqmODR.js → checkbox-MoyHIAPs.js} +3 -3
  94. package/dist/{checkbox-fflqmODR.js.map → checkbox-MoyHIAPs.js.map} +1 -1
  95. package/dist/{choice-inputs-zUgBZfE4.js → choice-inputs-DHGtx0QV.js} +122 -110
  96. package/dist/choice-inputs-DHGtx0QV.js.map +1 -0
  97. package/dist/{code-block-BzmM9Eig.js → code-block-BSJyq9e-.js} +7 -7
  98. package/dist/{code-block-BzmM9Eig.js.map → code-block-BSJyq9e-.js.map} +1 -1
  99. package/dist/{collapsible-BkAI_XD4.js → collapsible-BzJ91LUG.js} +3 -3
  100. package/dist/{collapsible-BkAI_XD4.js.map → collapsible-BzJ91LUG.js.map} +1 -1
  101. package/dist/{collection-content-gDh1v6O4.js → collection-content-CSnwtOTH.js} +3 -3
  102. package/dist/{collection-content-gDh1v6O4.js.map → collection-content-CSnwtOTH.js.map} +1 -1
  103. package/dist/{combobox-BEx0vJgF.js → combobox-Bcvu5J8O.js} +11 -10
  104. package/dist/{combobox-BEx0vJgF.js.map → combobox-Bcvu5J8O.js.map} +1 -1
  105. package/dist/combobox-C2JiSQPc.js +915 -0
  106. package/dist/combobox-C2JiSQPc.js.map +1 -0
  107. package/dist/{command-CrlPIL6m.js → command-9e52NPgK.js} +6 -6
  108. package/dist/{command-CrlPIL6m.js.map → command-9e52NPgK.js.map} +1 -1
  109. package/dist/{comments-Dmpp0YIc.js → comments-BsgErEqd.js} +33 -28
  110. package/dist/comments-BsgErEqd.js.map +1 -0
  111. package/dist/components/base/choice-inputs/choice-types.d.ts +4 -0
  112. package/dist/components/base/choice-inputs/pill-radio-group.d.ts +7 -6
  113. package/dist/components/base/combobox/combobox-field.d.ts +2 -2
  114. package/dist/components/base/date-pickers/date-picker-internals.d.ts +3 -1
  115. package/dist/components/base/date-pickers/datepicker.types.d.ts +10 -4
  116. package/dist/components/base/date-pickers/time-picker.d.ts +17 -3
  117. package/dist/components/base/feedback/state-display.d.ts +5 -1
  118. package/dist/components/base/feedback/state-display.strings.d.ts +9 -0
  119. package/dist/components/base/forms/form-field.d.ts +7 -2
  120. package/dist/components/base/forms-numeric/coordinates-input.d.ts +4 -1
  121. package/dist/components/base/forms-numeric/decimal-input.d.ts +2 -2
  122. package/dist/components/base/forms-numeric/dimensions-input.d.ts +4 -1
  123. package/dist/components/base/forms-numeric/numeric-composite-field.d.ts +12 -0
  124. package/dist/components/base/forms-numeric/weight-input.d.ts +6 -1
  125. package/dist/components/base/navigation/language-switcher.d.ts +12 -4
  126. package/dist/components/base/repeaters/key-value-editor.d.ts +2 -1
  127. package/dist/components/base/sidebar/sidebar.d.ts +2 -0
  128. package/dist/components/base/upload/avatar-upload.d.ts +2 -1
  129. package/dist/components/base/upload/image-upload.d.ts +2 -1
  130. package/dist/components/blocks/ai/ai-citation/types.d.ts +2 -0
  131. package/dist/components/blocks/ai/ai-reasoning/types.d.ts +2 -0
  132. package/dist/components/blocks/ai/ai-sources/types.d.ts +2 -0
  133. package/dist/components/blocks/ai/ai-tool-call/types.d.ts +2 -0
  134. package/dist/components/blocks/analytics/metric/metric.d.ts +4 -0
  135. package/dist/components/blocks/analytics/metric-comparison/metric-comparison.d.ts +2 -0
  136. package/dist/components/blocks/analytics/metric-grid/metric-grid.d.ts +4 -5
  137. package/dist/components/blocks/analytics/types.d.ts +2 -2
  138. package/dist/components/blocks/commerce/order-status/types.d.ts +4 -0
  139. package/dist/components/blocks/data-display/empty-state/empty-state.types.d.ts +4 -3
  140. package/dist/components/features/activities/activities.types.d.ts +18 -11
  141. package/dist/components/features/activities/hooks/use-activity-resources.d.ts +2 -1
  142. package/dist/components/features/ai-chat/hooks/use-ai-chat-scroll.d.ts +1 -1
  143. package/dist/components/features/appointment-calendar/appointment-calendar.d.ts +1 -1
  144. package/dist/components/features/appointment-calendar/appointment-calendar.types.d.ts +4 -2
  145. package/dist/components/features/combobox/async-resource-combobox.d.ts +2 -2
  146. package/dist/components/features/combobox/combobox.d.ts +2 -2
  147. package/dist/components/features/combobox/hooks/use-combobox-core.d.ts +2 -1
  148. package/dist/components/features/combobox/hooks/use-combobox-state.d.ts +1 -0
  149. package/dist/components/features/combobox/hooks/use-load-more.d.ts +1 -0
  150. package/dist/components/features/combobox/types.d.ts +37 -8
  151. package/dist/components/features/email-composer/types.d.ts +3 -1
  152. package/dist/components/features/filters/facets/date-facet.d.ts +4 -2
  153. package/dist/components/features/filters/facets/range-facet.d.ts +12 -0
  154. package/dist/components/features/filters/filters.types.d.ts +3 -3
  155. package/dist/components/features/filters/partials/date-filter-content.d.ts +3 -2
  156. package/dist/components/features/filters/partials/filter-popover-content.d.ts +4 -2
  157. package/dist/components/features/filters/partials/range-filter-content.d.ts +12 -0
  158. package/dist/components/features/filters/utils/filter-utils.d.ts +5 -1
  159. package/dist/components/features/media-library/hooks/use-media-library.d.ts +1 -1
  160. package/dist/components/features/media-library/media-library.d.ts +1 -1
  161. package/dist/components/features/media-library/media-library.strings.d.ts +6 -0
  162. package/dist/components/features/media-library/media-library.types.d.ts +36 -8
  163. package/dist/components/features/media-library/partials/media-library-partials.d.ts +3 -3
  164. package/dist/components/features/mentions/hooks/use-mentions.d.ts +16 -1
  165. package/dist/components/features/mentions/partials/mention-inline-suggestions.d.ts +5 -1
  166. package/dist/components/features/mentions/utils/split-html-by-mentions.d.ts +1 -7
  167. package/dist/components/features/overlays/hooks/use-overlay-visibility.d.ts +2 -2
  168. package/dist/components/features/products/products.types.d.ts +2 -2
  169. package/dist/components/features/questionnaire/questionnaire.types.d.ts +3 -0
  170. package/dist/components/features/resource/resource.d.ts +1 -1
  171. package/dist/components/features/resource/resource.types.d.ts +2 -0
  172. package/dist/components/features/rich-text-editor/form-rich-text-editor.d.ts +1 -1
  173. package/dist/components/features/rich-text-editor/partials/caret-helpers.d.ts +1 -1
  174. package/dist/components/features/rich-text-editor/partials/editor-field-aria.d.ts +14 -0
  175. package/dist/components/features/rich-text-editor/partials/rich-text-editor-toolbar.d.ts +3 -1
  176. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +1 -1
  177. package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +17 -3
  178. package/dist/components/features/schema-form/hooks/use-schema-form.d.ts +5 -1
  179. package/dist/components/features/schema-form/partials/schema-form-field.d.ts +3 -1
  180. package/dist/components/features/schema-form/schema-form.utils.d.ts +1 -1
  181. package/dist/components/features/suggestions/suggestions.types.d.ts +1 -1
  182. package/dist/components/features/table/data-table.d.ts +1 -1
  183. package/dist/components/features/table/index.d.ts +1 -0
  184. package/dist/components/features/table/table-body.d.ts +1 -1
  185. package/dist/components/features/table/table-helpers.d.ts +6 -3
  186. package/dist/components/features/table/table.strings.d.ts +3 -0
  187. package/dist/components/features/table/table.types.d.ts +17 -1
  188. package/dist/components/layout/header/header.types.d.ts +3 -2
  189. package/dist/components/layout/layout.types.d.ts +5 -3
  190. package/dist/components/layout/navigation/side-nav.d.ts +3 -2
  191. package/dist/components/layout/normalize-layout-path.d.ts +1 -0
  192. package/dist/components/layout/settings/settings.d.ts +1 -1
  193. package/dist/components/layout/sidebar/app-sidebar.d.ts +1 -1
  194. package/dist/components/layout/sidebar/sidebar-navigation-rail.d.ts +3 -1
  195. package/dist/components/layout/sidebar/sidebar.context.d.ts +1 -0
  196. package/dist/components/layout/sidebar/sidebar.types.d.ts +2 -0
  197. package/dist/components/primitives/link.d.ts +3 -2
  198. package/dist/components/primitives/money.d.ts +1 -1
  199. package/dist/components/primitives/number.d.ts +1 -1
  200. package/dist/components/typography/rich-text/rich-text-tree.d.ts +7 -5
  201. package/dist/{containers-CIxwbZt5.js → containers-CSdc32h9.js} +2 -2
  202. package/dist/{containers-CIxwbZt5.js.map → containers-CSdc32h9.js.map} +1 -1
  203. package/dist/{copyable-DIznBqiT.js → copyable-3fdHfMR3.js} +4 -4
  204. package/dist/{copyable-DIznBqiT.js.map → copyable-3fdHfMR3.js.map} +1 -1
  205. package/dist/{data-display-BdgCAw8T.js → data-display-Cmj-xZYl.js} +16 -15
  206. package/dist/data-display-Cmj-xZYl.js.map +1 -0
  207. package/dist/{date-Cq8ioE4o.js → date-Br0FicVv.js} +4 -4
  208. package/dist/{date-Cq8ioE4o.js.map → date-Br0FicVv.js.map} +1 -1
  209. package/dist/date-picker-CyQlFYsP.js +1617 -0
  210. package/dist/date-picker-CyQlFYsP.js.map +1 -0
  211. package/dist/date-pickers-tj2MXmXd.js +185 -0
  212. package/dist/date-pickers-tj2MXmXd.js.map +1 -0
  213. package/dist/{display-KsZLw9Ov.js → display-CT_N2a3w.js} +7 -7
  214. package/dist/{display-KsZLw9Ov.js.map → display-CT_N2a3w.js.map} +1 -1
  215. package/dist/{dropdown-menu-CLs8Lihj.js → dropdown-menu-C08iIugv.js} +6 -6
  216. package/dist/{dropdown-menu-CLs8Lihj.js.map → dropdown-menu-C08iIugv.js.map} +1 -1
  217. package/dist/features/activities.js +283 -270
  218. package/dist/features/activities.js.map +1 -1
  219. package/dist/features/ai-chat.js +40 -27
  220. package/dist/features/ai-chat.js.map +1 -1
  221. package/dist/features/appointment-calendar.js +126 -126
  222. package/dist/features/appointment-calendar.js.map +1 -1
  223. package/dist/features/async-preview.js +9 -9
  224. package/dist/features/combobox.js +1 -1
  225. package/dist/features/comments.js +1 -1
  226. package/dist/features/data-view.js +10 -10
  227. package/dist/features/email-composer.js +24 -19
  228. package/dist/features/email-composer.js.map +1 -1
  229. package/dist/features/event-calendar.js +129 -125
  230. package/dist/features/event-calendar.js.map +1 -1
  231. package/dist/features/filters.js +2 -2
  232. package/dist/features/global-search.js +16 -20
  233. package/dist/features/global-search.js.map +1 -1
  234. package/dist/features/kanban.js +18 -28
  235. package/dist/features/kanban.js.map +1 -1
  236. package/dist/features/map/style.css +15 -0
  237. package/dist/features/map.js +331 -314
  238. package/dist/features/map.js.map +1 -1
  239. package/dist/features/media-library.js +1044 -866
  240. package/dist/features/media-library.js.map +1 -1
  241. package/dist/features/mentions.js +2 -2
  242. package/dist/features/overlays.js +1 -1
  243. package/dist/features/products.js +978 -964
  244. package/dist/features/products.js.map +1 -1
  245. package/dist/features/questionnaire.js +159 -152
  246. package/dist/features/questionnaire.js.map +1 -1
  247. package/dist/features/resource-assignment.js +8 -8
  248. package/dist/features/resource.js +74 -71
  249. package/dist/features/resource.js.map +1 -1
  250. package/dist/features/rich-text-editor.js +28 -19
  251. package/dist/features/rich-text-editor.js.map +1 -1
  252. package/dist/features/schema-form.js +297 -256
  253. package/dist/features/schema-form.js.map +1 -1
  254. package/dist/features/suggestions.js +57 -50
  255. package/dist/features/suggestions.js.map +1 -1
  256. package/dist/features/sync.js +3 -3
  257. package/dist/features/table.js +1 -1
  258. package/dist/features/theme-tweaker.js +400 -399
  259. package/dist/features/theme-tweaker.js.map +1 -1
  260. package/dist/feedback-Dzo1xtAU.js +246 -0
  261. package/dist/feedback-Dzo1xtAU.js.map +1 -0
  262. package/dist/{field-affordance-recipes-DWcNcOjh.js → field-affordance-recipes-D6H7tVJi.js} +2 -2
  263. package/dist/{field-affordance-recipes-DWcNcOjh.js.map → field-affordance-recipes-D6H7tVJi.js.map} +1 -1
  264. package/dist/field-control-attributes-B6i335wr.js +18 -0
  265. package/dist/field-control-attributes-B6i335wr.js.map +1 -0
  266. package/dist/{field-state-recipes-BVA2CWHo.js → field-state-recipes-7sza8QbC.js} +4 -2
  267. package/dist/{field-state-recipes-BVA2CWHo.js.map → field-state-recipes-7sza8QbC.js.map} +1 -1
  268. package/dist/{filters-DzgSJpMK.js → filters-Dl80yYtN.js} +763 -605
  269. package/dist/filters-Dl80yYtN.js.map +1 -0
  270. package/dist/form-field-CAPdwdnZ.js +74 -0
  271. package/dist/form-field-CAPdwdnZ.js.map +1 -0
  272. package/dist/{form-sizing-Bs2qFUeE.js → form-sizing-CgcrUbLU.js} +2 -2
  273. package/dist/{form-sizing-Bs2qFUeE.js.map → form-sizing-CgcrUbLU.js.map} +1 -1
  274. package/dist/{forms-C0RGnJTe.js → forms-B3W8CH7-.js} +8 -8
  275. package/dist/{forms-C0RGnJTe.js.map → forms-B3W8CH7-.js.map} +1 -1
  276. package/dist/forms-numeric-CwjQJe-O.js +991 -0
  277. package/dist/forms-numeric-CwjQJe-O.js.map +1 -0
  278. package/dist/{header-DMMxG__r.js → header-ZIIsRKxP.js} +113 -113
  279. package/dist/header-ZIIsRKxP.js.map +1 -0
  280. package/dist/hooks/use-files.d.ts +2 -0
  281. package/dist/{hooks-DB6CJ4MR.js → hooks-BitHSh-Y.js} +3 -3
  282. package/dist/{hooks-DB6CJ4MR.js.map → hooks-BitHSh-Y.js.map} +1 -1
  283. package/dist/{icon-badge-DZF-YjQp.js → icon-badge-npxF1SLX.js} +2 -2
  284. package/dist/{icon-badge-DZF-YjQp.js.map → icon-badge-npxF1SLX.js.map} +1 -1
  285. package/dist/index.js +1 -1
  286. package/dist/{input-CvyDQlY7.js → input-7KAc7XQL.js} +6 -6
  287. package/dist/{input-CvyDQlY7.js.map → input-7KAc7XQL.js.map} +1 -1
  288. package/dist/{input-DMBwAZmr.js → input-DIREVYHs.js} +3 -3
  289. package/dist/{input-DMBwAZmr.js.map → input-DIREVYHs.js.map} +1 -1
  290. package/dist/{interaction-recipes-XR9ZpVYL.js → interaction-recipes-4wZ2tvfb.js} +2 -2
  291. package/dist/{interaction-recipes-XR9ZpVYL.js.map → interaction-recipes-4wZ2tvfb.js.map} +1 -1
  292. package/dist/{item-DjCcM18E.js → item-FfWnaYST.js} +99 -98
  293. package/dist/item-FfWnaYST.js.map +1 -0
  294. package/dist/layout/app-shell.js +1 -1
  295. package/dist/layout/auth.js +1 -1
  296. package/dist/layout/containers.js +1 -1
  297. package/dist/layout/header.js +1 -1
  298. package/dist/layout/hooks.js +1 -1
  299. package/dist/layout/navigation.js +1 -1
  300. package/dist/layout/page.js +1 -1
  301. package/dist/layout/settings.js +1 -1
  302. package/dist/layout/sidebar.js +2 -2
  303. package/dist/layout/workspace.js +1 -1
  304. package/dist/layout.js +11 -11
  305. package/dist/layout.types-E_GAApzO.js +30 -0
  306. package/dist/layout.types-E_GAApzO.js.map +1 -0
  307. package/dist/lib/field-control-attributes.d.ts +11 -0
  308. package/dist/lib/field-state-recipes.d.ts +2 -0
  309. package/dist/lib/format.d.ts +1 -0
  310. package/dist/lib/surface-recipes.d.ts +1 -1
  311. package/dist/lib/token-merge.generated.d.ts +6 -6
  312. package/dist/lib/utils.js +1 -1
  313. package/dist/{media-gallery-C-vChPmE.js → media-gallery-C81DAnKI.js} +6 -6
  314. package/dist/{media-gallery-C-vChPmE.js.map → media-gallery-C81DAnKI.js.map} +1 -1
  315. package/dist/{mentions-0_4nWuI-.js → mentions-qOnedSt4.js} +236 -167
  316. package/dist/mentions-qOnedSt4.js.map +1 -0
  317. package/dist/message-BJHnn43M.js +135 -0
  318. package/dist/message-BJHnn43M.js.map +1 -0
  319. package/dist/{metadata-list-C3MkU-Om.js → metadata-list-XkqZ_UXH.js} +11 -11
  320. package/dist/{metadata-list-C3MkU-Om.js.map → metadata-list-XkqZ_UXH.js.map} +1 -1
  321. package/dist/{navigation-DaRjthVk.js → navigation-BgtPJAhi.js} +119 -119
  322. package/dist/navigation-BgtPJAhi.js.map +1 -0
  323. package/dist/{navigation-C90-oQFq.js → navigation-Bt-v7rWP.js} +52 -46
  324. package/dist/navigation-Bt-v7rWP.js.map +1 -0
  325. package/dist/normalize-layout-path-BmEgg6fu.js +14 -0
  326. package/dist/normalize-layout-path-BmEgg6fu.js.map +1 -0
  327. package/dist/{number-CRU3kGuk.js → number-CYqBcrSj.js} +78 -86
  328. package/dist/number-CYqBcrSj.js.map +1 -0
  329. package/dist/{overflow-tab-bar-IVFVQFV6.js → overflow-tab-bar-BQCA2Zn2.js} +7 -7
  330. package/dist/{overflow-tab-bar-IVFVQFV6.js.map → overflow-tab-bar-BQCA2Zn2.js.map} +1 -1
  331. package/dist/{overlays-BSgCtM2v.js → overlays-CC8zI3Du.js} +264 -260
  332. package/dist/overlays-CC8zI3Du.js.map +1 -0
  333. package/dist/{page-DUUKDAjo.js → page-BoQ1VaFJ.js} +13 -13
  334. package/dist/{page-DUUKDAjo.js.map → page-BoQ1VaFJ.js.map} +1 -1
  335. package/dist/{page-header-commands-7P3sfE9u.js → page-header-commands-DIKspJfx.js} +4 -4
  336. package/dist/{page-header-commands-7P3sfE9u.js.map → page-header-commands-DIKspJfx.js.map} +1 -1
  337. package/dist/{pagination-CgCjElfu.js → pagination-Br8TdV9A.js} +4 -4
  338. package/dist/{pagination-CgCjElfu.js.map → pagination-Br8TdV9A.js.map} +1 -1
  339. package/dist/{popover-B85RenIl.js → popover-k8TdUcAt.js} +10 -10
  340. package/dist/popover-k8TdUcAt.js.map +1 -0
  341. package/dist/{popover-menu-DlnQ2zlR.js → popover-menu-yn-o0kyA.js} +7 -7
  342. package/dist/{popover-menu-DlnQ2zlR.js.map → popover-menu-yn-o0kyA.js.map} +1 -1
  343. package/dist/{popover.recipes-DdiEp0rd.js → popover.recipes-DJ0AkUan.js} +2 -2
  344. package/dist/{popover.recipes-DdiEp0rd.js.map → popover.recipes-DJ0AkUan.js.map} +1 -1
  345. package/dist/{portal-recipes-BpsV_iRw.js → portal-recipes-DyUXqUtD.js} +2 -2
  346. package/dist/{portal-recipes-BpsV_iRw.js.map → portal-recipes-DyUXqUtD.js.map} +1 -1
  347. package/dist/{primitives-ByWgGUgt.js → primitives-BkkQjYl7.js} +22 -17
  348. package/dist/primitives-BkkQjYl7.js.map +1 -0
  349. package/dist/primitives.js +4 -4
  350. package/dist/{progress-BJhQP9WX.js → progress-DZFXXzPs.js} +4 -4
  351. package/dist/{progress-BJhQP9WX.js.map → progress-DZFXXzPs.js.map} +1 -1
  352. package/dist/{receipt-tOc7B3hw.js → receipt-C7LhOg7Q.js} +6 -6
  353. package/dist/{receipt-tOc7B3hw.js.map → receipt-C7LhOg7Q.js.map} +1 -1
  354. package/dist/rich-text-BnTzZjIo.js +45 -0
  355. package/dist/rich-text-BnTzZjIo.js.map +1 -0
  356. package/dist/rich-text-editor-CAurDwT5.js +1273 -0
  357. package/dist/rich-text-editor-CAurDwT5.js.map +1 -0
  358. package/dist/{rich-text-editor-toolbar-laT3tpBT.js → rich-text-editor-toolbar-DbXig7Jk.js} +36 -35
  359. package/dist/rich-text-editor-toolbar-DbXig7Jk.js.map +1 -0
  360. package/dist/rich-text-tree-BqyQ_7-R.js +66 -0
  361. package/dist/rich-text-tree-BqyQ_7-R.js.map +1 -0
  362. package/dist/{sanitize-html-DsQmI48u.js → sanitize-html-BWkH4dLM.js} +29 -16
  363. package/dist/sanitize-html-BWkH4dLM.js.map +1 -0
  364. package/dist/{scroll-area-B0dB2cBi.js → scroll-area-Bj6CRUif.js} +2 -2
  365. package/dist/{scroll-area-B0dB2cBi.js.map → scroll-area-Bj6CRUif.js.map} +1 -1
  366. package/dist/{separator-Bb17I4pu.js → separator-B9ewiCGO.js} +2 -2
  367. package/dist/{separator-Bb17I4pu.js.map → separator-B9ewiCGO.js.map} +1 -1
  368. package/dist/{separator-Ct_WSWTJ.js → separator-DM6gs2vu.js} +3 -3
  369. package/dist/{separator-Ct_WSWTJ.js.map → separator-DM6gs2vu.js.map} +1 -1
  370. package/dist/services/actions.js +1 -1
  371. package/dist/settings-DZPHgpx4.js +155 -0
  372. package/dist/settings-DZPHgpx4.js.map +1 -0
  373. package/dist/{sheet-BGPERY55.js → sheet-C4DHsgLk.js} +6 -6
  374. package/dist/{sheet-BGPERY55.js.map → sheet-C4DHsgLk.js.map} +1 -1
  375. package/dist/sidebar-C8BnDwTH.js +709 -0
  376. package/dist/sidebar-C8BnDwTH.js.map +1 -0
  377. package/dist/{sidebar-f9gRWXIR.js → sidebar-CmD6a-HK.js} +16 -13
  378. package/dist/sidebar-CmD6a-HK.js.map +1 -0
  379. package/dist/{skeleton-BapcJd9C.js → skeleton-DDgdhmu9.js} +5 -5
  380. package/dist/{skeleton-BapcJd9C.js.map → skeleton-DDgdhmu9.js.map} +1 -1
  381. package/dist/{smart-card-CW0hjetE.js → smart-card-B6vLxqa_.js} +8 -8
  382. package/dist/{smart-card-CW0hjetE.js.map → smart-card-B6vLxqa_.js.map} +1 -1
  383. package/dist/{structure-DuxKl954.js → structure-DZJ2wbAU.js} +2 -2
  384. package/dist/{structure-DuxKl954.js.map → structure-DZJ2wbAU.js.map} +1 -1
  385. package/dist/style.css +1 -1
  386. package/dist/{surface-recipes-BKRVW8Os.js → surface-recipes-C8mNycaY.js} +2 -2
  387. package/dist/{surface-recipes-BKRVW8Os.js.map → surface-recipes-C8mNycaY.js.map} +1 -1
  388. package/dist/{table-CFOWY9pQ.js → table-CBonSdTp.js} +534 -486
  389. package/dist/table-CBonSdTp.js.map +1 -0
  390. package/dist/{table-B4TE7iOV.js → table-CXSPHH25.js} +75 -71
  391. package/dist/table-CXSPHH25.js.map +1 -0
  392. package/dist/{tabs-e7ko9S2o.js → tabs-C4Kr_hCr.js} +50 -49
  393. package/dist/tabs-C4Kr_hCr.js.map +1 -0
  394. package/dist/{text-inputs-B1culiSK.js → text-inputs-jdkS3ReG.js} +9 -9
  395. package/dist/{text-inputs-B1culiSK.js.map → text-inputs-jdkS3ReG.js.map} +1 -1
  396. package/dist/{timelines-D3Sl9ueq.js → timelines-CoPwdJP0.js} +10 -10
  397. package/dist/{timelines-D3Sl9ueq.js.map → timelines-CoPwdJP0.js.map} +1 -1
  398. package/dist/{tooltip-8wz5S_Zr.js → tooltip-31NwIpTo.js} +4 -4
  399. package/dist/{tooltip-8wz5S_Zr.js.map → tooltip-31NwIpTo.js.map} +1 -1
  400. package/dist/{tree-CzUJHnFs.js → tree-CeYVzdFE.js} +6 -6
  401. package/dist/{tree-CzUJHnFs.js.map → tree-CeYVzdFE.js.map} +1 -1
  402. package/dist/typography/rich-text.js +1 -1
  403. package/dist/{typography-BQnine1k.js → typography-C7-YMW1S.js} +2 -2
  404. package/dist/{typography-BQnine1k.js.map → typography-C7-YMW1S.js.map} +1 -1
  405. package/dist/typography.js +1 -1
  406. package/dist/{upload-BOW6U2tI.js → upload-Hdm5gObf.js} +303 -291
  407. package/dist/upload-Hdm5gObf.js.map +1 -0
  408. package/dist/{upload-queue-qUXn1ykN.js → upload-queue-D0sYPuqo.js} +8 -8
  409. package/dist/{upload-queue-qUXn1ykN.js.map → upload-queue-D0sYPuqo.js.map} +1 -1
  410. package/dist/{usage-card-BeSLY0i0.js → usage-card-9s8hLDfn.js} +9 -9
  411. package/dist/{usage-card-BeSLY0i0.js.map → usage-card-9s8hLDfn.js.map} +1 -1
  412. package/dist/{utils-B6kKb8jB.js → utils-DhuoqFy4.js} +31 -37
  413. package/dist/utils-DhuoqFy4.js.map +1 -0
  414. package/dist/{value-inputs-skdVB2zh.js → value-inputs-D3aPgq9H.js} +15 -15
  415. package/dist/{value-inputs-skdVB2zh.js.map → value-inputs-D3aPgq9H.js.map} +1 -1
  416. package/dist/{value-typography-uAmWUAL1.js → value-typography-uSzzG9Gf.js} +32 -26
  417. package/dist/value-typography-uSzzG9Gf.js.map +1 -0
  418. package/dist/{workspace-DHeHv0qw.js → workspace-CC8Vchiu.js} +12 -12
  419. package/dist/{workspace-DHeHv0qw.js.map → workspace-CC8Vchiu.js.map} +1 -1
  420. package/docs/consumer-skill/examples/edit.tsx +3 -3
  421. package/docs/consumer-skill/references/agents-md.md +19 -19
  422. package/docs/consumer-skill/references/analytics.md +15 -0
  423. package/docs/consumer-skill/references/component-contracts.json +14724 -13057
  424. package/docs/consumer-skill/references/composition.md +21 -4
  425. package/docs/consumer-skill/references/design-contract.md +1 -0
  426. package/docs/consumer-skill/references/installation.md +51 -8
  427. package/docs/consumer-skill/references/integration.md +24 -1
  428. package/docs/consumer-skill/references/public-api.json +172 -34
  429. package/docs/consumer-skill/references/review.md +51 -11
  430. package/docs/consumer-skill/references/rhf-workflows.md +72 -0
  431. package/docs/consumer-skill/references/theming.md +7 -2
  432. package/docs/consumer-skill/references/tokens.json +1 -1
  433. package/docs/consumer-skill/scripts/composition-policy.mjs +144 -30
  434. package/docs/consumer-skill/scripts/setup-skills.mjs +46 -9
  435. package/package.json +4 -2
  436. package/templates/admin-shell-template.tsx +1 -2
  437. package/templates/customers-template.tsx +18 -16
  438. package/dist/accordion-B9MHG0cT.js.map +0 -1
  439. package/dist/ai-artifact-C58tQcBy.js.map +0 -1
  440. package/dist/auth-DTkkshS8.js.map +0 -1
  441. package/dist/breadcrumbs-J-K2kl4c.js.map +0 -1
  442. package/dist/choice-inputs-zUgBZfE4.js.map +0 -1
  443. package/dist/combobox-BwzoXFSG.js +0 -884
  444. package/dist/combobox-BwzoXFSG.js.map +0 -1
  445. package/dist/comments-Dmpp0YIc.js.map +0 -1
  446. package/dist/data-display-BdgCAw8T.js.map +0 -1
  447. package/dist/date-picker-RlIzKom_.js +0 -1551
  448. package/dist/date-picker-RlIzKom_.js.map +0 -1
  449. package/dist/date-pickers-DY-CpXS1.js +0 -179
  450. package/dist/date-pickers-DY-CpXS1.js.map +0 -1
  451. package/dist/feedback-Dm4izqFn.js +0 -240
  452. package/dist/feedback-Dm4izqFn.js.map +0 -1
  453. package/dist/filters-DzgSJpMK.js.map +0 -1
  454. package/dist/form-field-BriWAXyg.js +0 -63
  455. package/dist/form-field-BriWAXyg.js.map +0 -1
  456. package/dist/forms-numeric-DIhghX1Q.js +0 -910
  457. package/dist/forms-numeric-DIhghX1Q.js.map +0 -1
  458. package/dist/header-DMMxG__r.js.map +0 -1
  459. package/dist/item-DjCcM18E.js.map +0 -1
  460. package/dist/layout.types-Cn7aUzJp.js +0 -20
  461. package/dist/layout.types-Cn7aUzJp.js.map +0 -1
  462. package/dist/mentions-0_4nWuI-.js.map +0 -1
  463. package/dist/message-g8p7eVtN.js +0 -128
  464. package/dist/message-g8p7eVtN.js.map +0 -1
  465. package/dist/navigation-C90-oQFq.js.map +0 -1
  466. package/dist/navigation-DaRjthVk.js.map +0 -1
  467. package/dist/number-CRU3kGuk.js.map +0 -1
  468. package/dist/overlays-BSgCtM2v.js.map +0 -1
  469. package/dist/popover-B85RenIl.js.map +0 -1
  470. package/dist/primitives-ByWgGUgt.js.map +0 -1
  471. package/dist/rich-text-Dth5E882.js +0 -78
  472. package/dist/rich-text-Dth5E882.js.map +0 -1
  473. package/dist/rich-text-editor-C1fOjBTd.js +0 -1195
  474. package/dist/rich-text-editor-C1fOjBTd.js.map +0 -1
  475. package/dist/rich-text-editor-toolbar-laT3tpBT.js.map +0 -1
  476. package/dist/safe-image-src-C6kQSMBZ.js +0 -17
  477. package/dist/safe-image-src-C6kQSMBZ.js.map +0 -1
  478. package/dist/sanitize-html-DsQmI48u.js.map +0 -1
  479. package/dist/settings-Bar5wiSo.js +0 -167
  480. package/dist/settings-Bar5wiSo.js.map +0 -1
  481. package/dist/sidebar-D-JYMMbY.js +0 -686
  482. package/dist/sidebar-D-JYMMbY.js.map +0 -1
  483. package/dist/sidebar-f9gRWXIR.js.map +0 -1
  484. package/dist/table-B4TE7iOV.js.map +0 -1
  485. package/dist/table-CFOWY9pQ.js.map +0 -1
  486. package/dist/tabs-e7ko9S2o.js.map +0 -1
  487. package/dist/upload-BOW6U2tI.js.map +0 -1
  488. package/dist/utils-B6kKb8jB.js.map +0 -1
  489. package/dist/value-typography-uAmWUAL1.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"forms-numeric-DIhghX1Q.js","names":["React","baseui.Select","baseui.SelectTrigger","baseui.SelectValue","Select","UNIT_OPTIONS","React","baseui.Select","baseui.SelectTrigger","baseui.SelectValue","React","baseui.Select","baseui.SelectTrigger","baseui.SelectValue","React","useDensityConfig","useMoneyConfig","cn","Label","Text","TextLink","Grid","Stack","AlertDescription","Alert","interactionRecipes","selectToggleRecipes","formControlSizeClasses","formFieldTriggerClasses","formControlIconClasses","resolveFormControlSize","Input","FormField","SelectTrigger","SelectPopupContent","SelectPopupGroup","Select","Select$1","SelectPopupItem","SelectValue","controlGroupHeightClasses","React$1","defaultDecimalInputStrings","formatDecimalValue","value","formatted","allowNegative","hasLeadingMinus","parts","decimalPlaces","isWithinBounds","numValue","min","max","applyRounding","factor","decimals","shifted","mode","floor","diff","clamp","next","n","snapToStep","anchor","stepsFromAnchor","current","step","stepped","delta","fireChange","nativeSetter","target","STEPPER_SIZE_CLASS","DecimalInputImpl","controlledValue","sizeProp","stringsProp","props","allProps","size","defaultScale","strings","useStrings","validDecimalPlaces","inputRef","editingUnavailable","disabled","handleChange","useCallback","newValue","allowEmpty","modifiedEvent","onChange","handleBlur","onBlur","normalizeOnBlur","raw","num","roundingMode","adjust","showSteppers","handleKeyDown","onKeyDown","event","placeholderResolved","placeholder","stepperValueAlign","Minus","node","forwardedRef","className","Plus","DecimalInput","PercentageInput","forwardRef","defaultCurrencyInputStrings","CURRENCY_SYMBOLS","normalizeCurrencies","currencies","currency","CurrencyInputImpl","controlledCurrency","decimalInputProps","currencyTriggerId","useId","normalizedCurrencies","useMemo","internalCurrency","setInternalCurrency","useState","defaultCurrency","isCurrencyControlled","selectedCurrency","details","disableCurrencySelector","onConfigError","handleCurrencyChange","newCurrency","onCurrencyChange","triggerClassName","currencyWidth","currencySelector","currencyLabel","invalid","currencyPlaceholder","curr","currencyPosition","CurrencyInput","memo","defaultMoneyInputStrings","interpolateMoneyInputString","values","key","output","template","FALLBACK_CURRENCIES","parseAmount","parsed","resolveFormatted","currencyOptionValue","option","MoneyInput","recordCurrencyProp","moneyConfig","resolvedDefaultCurrency","activeCurrency","useRef","availableCurrencies","source","unique","optionValue","options","recordCurrency","money","originalFormatted","showOriginalHint","willMigrate","isInvalid","error","assignRef","handleAmountChange","onChangeData","nextCurrency","defaultValue","input","required","controlStrings","controlClassName","hasFieldChrome","label","hint","helperText","showMigrationWarning","AlertTriangle","migrationWarningMessage","ORDERED_MODES","defaultRoundingModeLabels","RoundingModeSelect","controlled","labels","onValueChange","defaultDimensionsInputStrings","UNIT_OPTIONS$1","parseDimensionValue","format","p","formatDimensionValue","width","height","depth","DimensionsInput","controlledUnit","resolvedWidthLabel","widthLabel","resolvedHeightLabel","heightLabel","resolvedDepthLabel","depthLabel","resolvedUnitPlaceholder","unitPlaceholder","resolvedWidthPlaceholder","widthPlaceholder","resolvedHeightPlaceholder","heightPlaceholder","resolvedDepthPlaceholder","depthPlaceholder","shouldShowInlineLabels","layout","shouldShowVerticalLabels","shouldShowUnitSelector","showUnitSelector","hasUnitLabel","unitLabel","widthFieldLabel","heightFieldLabel","depthFieldLabel","fieldId","ids","subLabelClasses","formLabelLineClass","isValueControlled","isUnitControlled","initialParsed","internalWidth","setInternalWidth","internalHeight","setInternalHeight","internalDepth","setInternalDepth","internalUnit","setInternalUnit","defaultUnit","parsedValue","widthValue","heightValue","depthValue","unitValue","handleDimensionChange","updatedWidth","updatedHeight","updatedDepth","dimension","formattedValue","handleUnitChange","newUnit","typedUnit","onUnitChange","unitSelector","disableUnitSelector","unit","defaultWeightInputStrings","UNIT_OPTIONS","WeightInput","internalValue","setInternalValue","handleValueChange","nextUnit","weightUnit","unitOptions","unitTriggerId","unitWidth","defaultCoordinatesInputStrings","parseValue","lat","lng","part","formatValue","isFiniteNumberInRange","CoordinatesInput","isControlled","internalLat","setInternalLat","internalLng","setInternalLng","parsedControlled","update","nextLat","nextLng","mapUrl","hasValidLat","hasValidLng","showPreviewLink"],"sources":["../src/components/base/forms-numeric/decimal-input.tsx","../src/components/base/forms-numeric/percentage-input.tsx","../src/components/base/forms-numeric/currency-input.tsx","../src/components/base/forms-numeric/money-input.strings.ts","../src/components/base/forms-numeric/money-input.tsx","../src/components/base/forms-numeric/rounding-mode-select.tsx","../src/components/base/forms-numeric/dimensions-input.tsx","../src/components/base/forms-numeric/weight-input.tsx","../src/components/base/forms-numeric/coordinates-input.tsx"],"sourcesContent":["/**\n * DecimalInput — text-based numeric input with decimal-place enforcement,\n * locale-friendly comma → dot normalisation, optional min/max clamping,\n * rounding mode (`round` / `floor` / `ceil` / `half-even`), and optional\n * stepper buttons when `step` is set.\n *\n * Wraps the base `Input` so all add-on / icon / clear / loading features\n * still work. Extra features layered on top:\n *\n * - `step` — when set, renders − / + stepper buttons that snap the value\n * to a multiple of `step` (anchored at `min` if provided, else 0).\n * - `roundingMode` — controls how stepper / blur normalisation rounds\n * half values; default `'round'` (round-half-up).\n * - `normalizeOnBlur` (default `true`) — pads the displayed value to the\n * full `decimalPlaces` count and clamps to `[min, max]` when the field\n * loses focus.\n *\n * The `value` prop is always a plain string (consumers parse it as needed)\n * so RHF / Inertia can treat it like any other input.\n */\nimport * as React from 'react';\nimport { useCallback } from 'react';\nimport { Minus, Plus } from 'lucide-react';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { useDensityConfig, type FormControlSize } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { formControlIconClasses, formControlSizeClasses, resolveFormControlSize } from '../forms/form-sizing';\nimport { Input, type InputProps } from '../text-inputs';\nimport { interactionRecipes } from '../../../lib/interaction-recipes';\n\nexport type DecimalRoundingMode = 'round' | 'floor' | 'ceil' | 'half-even';\n\nexport interface DecimalInputStrings {\n\t/** Accessible label for the decrement stepper. */\n\tdecrement: string;\n\t/** Accessible label for the increment stepper. */\n\tincrement: string;\n}\n\nexport const defaultDecimalInputStrings: DecimalInputStrings = {\n\tdecrement: 'Decrement',\n\tincrement: 'Increment',\n};\n\nexport interface DecimalInputProps extends Omit<InputProps, 'type' | 'inputMode' | 'strings'> {\n\t/** Maximum fractional digits accepted and used during normalization. */\n\tdecimalPlaces?: number;\n\t/** Minimum accepted numeric value. */\n\tmin?: number;\n\t/** Maximum accepted numeric value. */\n\tmax?: number;\n\t/** Whether a leading negative sign is accepted. */\n\tallowNegative?: boolean;\n\t/** Whether the field may remain blank. */\n\tallowEmpty?: boolean;\n\t/** When set, renders − / + steppers and snaps the value to multiples of `step`. */\n\tstep?: number;\n\t/** How to round when normalising on blur or stepping. Default `'round'`. */\n\troundingMode?: DecimalRoundingMode;\n\t/** Pad to full decimalPlaces and clamp to [min, max] on blur. Default `true`. */\n\tnormalizeOnBlur?: boolean;\n\t/** String overrides for stepper aria-labels. */\n\tstrings?: StringsProp<DecimalInputStrings>;\n}\n\nconst formatDecimalValue = (\n\tvalue: string,\n\tdecimalPlaces: number,\n\tallowNegative: boolean,\n): string => {\n\tif (!value) return '';\n\n\tlet formatted = value;\n\tformatted = formatted.replace(/,/g, '.');\n\n\tif (allowNegative) {\n\t\tformatted = formatted.replace(/[^\\d.-]/g, '');\n\t} else {\n\t\tformatted = formatted.replace(/[^\\d.]/g, '');\n\t}\n\n\tif (allowNegative && formatted.includes('-')) {\n\t\tconst hasLeadingMinus = formatted.startsWith('-');\n\t\tformatted = formatted.replace(/-/g, '');\n\t\tif (hasLeadingMinus) formatted = '-' + formatted;\n\t}\n\n\tconst parts = formatted.split('.');\n\tif (parts.length > 2) {\n\t\tformatted = parts[0] + '.' + parts.slice(1).join('');\n\t}\n\n\tif (parts.length === 2 && parts[1].length > decimalPlaces) {\n\t\tformatted = parts[0] + '.' + parts[1].substring(0, decimalPlaces);\n\t}\n\n\treturn formatted;\n};\n\nconst isWithinBounds = (value: string, min?: number, max?: number): boolean => {\n\tif (!value || value === '-') return true;\n\tconst numValue = parseFloat(value);\n\tif (Number.isNaN(numValue)) return true;\n\tif (min !== undefined && numValue < min) return false;\n\tif (max !== undefined && numValue > max) return false;\n\treturn true;\n};\n\nfunction applyRounding(value: number, decimals: number, mode: DecimalRoundingMode): number {\n\tconst factor = Math.pow(10, decimals);\n\tconst shifted = value * factor;\n\tswitch (mode) {\n\t\tcase 'floor':\n\t\t\treturn Math.floor(shifted) / factor;\n\t\tcase 'ceil':\n\t\t\treturn Math.ceil(shifted) / factor;\n\t\tcase 'half-even': {\n\t\t\tconst floor = Math.floor(shifted);\n\t\t\tconst diff = shifted - floor;\n\t\t\tif (diff > 0.5) return (floor + 1) / factor;\n\t\t\tif (diff < 0.5) return floor / factor;\n\t\t\treturn (floor % 2 === 0 ? floor : floor + 1) / factor;\n\t\t}\n\t\tcase 'round':\n\t\tdefault:\n\t\t\treturn Math.round(shifted) / factor;\n\t}\n}\n\nfunction clamp(n: number, min?: number, max?: number): number {\n\tlet next = n;\n\tif (min !== undefined) next = Math.max(min, next);\n\tif (max !== undefined) next = Math.min(max, next);\n\treturn next;\n}\n\nfunction snapToStep(\n\tcurrent: number,\n\tdelta: number,\n\tstep: number,\n\tmin?: number,\n\tmode: DecimalRoundingMode = 'round',\n): number {\n\tconst anchor = min ?? 0;\n\tconst stepsFromAnchor = (current - anchor) / step;\n\tconst rounded =\n\t\tmode === 'floor'\n\t\t\t? Math.floor(stepsFromAnchor)\n\t\t\t: mode === 'ceil'\n\t\t\t\t? Math.ceil(stepsFromAnchor)\n\t\t\t\t: Math.round(stepsFromAnchor);\n\tconst stepped = anchor + (rounded + delta) * step;\n\treturn Number(stepped.toFixed(12));\n}\n\nfunction fireChange(target: HTMLInputElement, value: string) {\n\t// Write through the native setter so React's value tracker sees a change,\n\t// then dispatch a real input event. React's own change handling then runs:\n\t// the Input's internal state (uncontrolled use), DecimalInput formatting and\n\t// the consumer callback each observe the step exactly once, and a later\n\t// re-render can no longer restore the stale value. A controlled consumer\n\t// that declines the change keeps its value, as with typing.\n\tconst nativeSetter = Object.getOwnPropertyDescriptor(\n\t\twindow.HTMLInputElement.prototype,\n\t\t'value',\n\t)?.set;\n\tif (nativeSetter) nativeSetter.call(target, value);\n\telse target.value = value;\n\ttarget.dispatchEvent(new Event('input', { bubbles: true }));\n}\n\nconst STEPPER_SIZE_CLASS: Record<FormControlSize, string> = {\n\tsm: 'w-control-sm',\n\tmd: 'w-control',\n\tlg: 'w-control-lg',\n};\n\nfunction DecimalInputImpl(\n\tallProps: DecimalInputProps,\n\tforwardedRef: React.ForwardedRef<HTMLInputElement>,\n) {\n\tconst {\n\t\tdecimalPlaces = 2,\n\t\tmin,\n\t\tmax,\n\t\tallowNegative = true,\n\t\tallowEmpty = true,\n\t\tstep,\n\t\troundingMode = 'round',\n\t\tnormalizeOnBlur = true,\n\t\tonChange,\n\t\tonBlur,\n\t\tonKeyDown,\n\t\tplaceholder,\n\t\tclassName,\n\t\tvalue: controlledValue,\n\t\tdefaultValue,\n\t\tdisabled,\n\t\tsize: sizeProp,\n\t\tstrings: stringsProp,\n\t\t...props\n\t} = allProps;\n\tconst { defaultScale } = useDensityConfig();\n\tconst size: FormControlSize = resolveFormControlSize(sizeProp, defaultScale);\n\tconst strings = useStrings(defaultDecimalInputStrings, stringsProp);\n\tconst validDecimalPlaces = Math.min(12, Math.max(0, decimalPlaces));\n\tconst inputRef = React.useRef<HTMLInputElement | null>(null);\n\tconst editingUnavailable = disabled || props.loading || props.readOnly;\n\n\tconst handleChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst newValue = e.target.value;\n\n\t\t\tif (!newValue && allowEmpty) {\n\t\t\t\tonChange?.(e);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst formatted = formatDecimalValue(newValue, validDecimalPlaces, allowNegative);\n\t\t\tif (!isWithinBounds(formatted, min, max)) return;\n\n\t\t\tif (formatted !== newValue) {\n\t\t\t\tconst modifiedEvent = {\n\t\t\t\t\t...e,\n\t\t\t\t\ttarget: { ...e.target, value: formatted },\n\t\t\t\t\tcurrentTarget: { ...e.currentTarget, value: formatted },\n\t\t\t\t} as React.ChangeEvent<HTMLInputElement>;\n\t\t\t\tonChange?.(modifiedEvent);\n\t\t\t} else {\n\t\t\t\tonChange?.(e);\n\t\t\t}\n\t\t},\n\t\t[onChange, validDecimalPlaces, allowNegative, allowEmpty, min, max],\n\t);\n\n\tconst handleBlur = useCallback(\n\t\t(e: React.FocusEvent<HTMLInputElement>) => {\n\t\t\tonBlur?.(e);\n\t\t\tif (!normalizeOnBlur) return;\n\t\t\tconst raw = e.target.value;\n\t\t\tif (!raw && allowEmpty) return;\n\t\t\tconst num = Number.parseFloat(raw.replace(',', '.'));\n\t\t\tif (!Number.isFinite(num)) return;\n\t\t\tconst clamped = clamp(num, min, max);\n\t\t\tconst rounded = applyRounding(clamped, validDecimalPlaces, roundingMode);\n\t\t\tconst next = rounded.toFixed(validDecimalPlaces);\n\t\t\tif (next !== raw && inputRef.current) {\n\t\t\t\tfireChange(inputRef.current, next);\n\t\t\t}\n\t\t},\n\t\t[onBlur, onChange, normalizeOnBlur, allowEmpty, min, max, validDecimalPlaces, roundingMode],\n\t);\n\n\tconst adjust = useCallback(\n\t\t(delta: number) => {\n\t\t\tif (editingUnavailable || step === undefined) return;\n\t\t\tconst target = inputRef.current;\n\t\t\tif (!target) return;\n\t\t\tconst raw = target.value;\n\t\t\tconst current = Number.parseFloat(raw.replace(',', '.'));\n\t\t\tconst base = Number.isFinite(current) ? current : (min ?? 0);\n\t\t\tconst snapped = clamp(snapToStep(base, delta, step, min, roundingMode), min, max);\n\t\t\tconst next = applyRounding(snapped, validDecimalPlaces, roundingMode).toFixed(validDecimalPlaces);\n\t\t\tfireChange(target, next);\n\t\t},\n\t\t[editingUnavailable, step, min, max, roundingMode, validDecimalPlaces, onChange],\n\t);\n\n\tconst showSteppers = typeof step === 'number' && step > 0;\n\n\t// With steppers, Arrow Up/Down step the value from the keyboard, so the\n\t// pointer-only stepper buttons are never the only way to step.\n\tconst handleKeyDown = useCallback(\n\t\t(event: React.KeyboardEvent<HTMLInputElement>) => {\n\t\t\tonKeyDown?.(event);\n\t\t\tif (event.defaultPrevented || !showSteppers) return;\n\t\t\tif (event.key === 'ArrowUp' || event.key === 'ArrowDown') {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tadjust(event.key === 'ArrowUp' ? 1 : -1);\n\t\t\t}\n\t\t},\n\t\t[onKeyDown, showSteppers, adjust],\n\t);\n\tconst placeholderResolved =\n\t\tplaceholder ?? (validDecimalPlaces > 0 ? `0.${'0'.repeat(validDecimalPlaces)}` : '0');\n\t// Between steppers the value centres, unless a single unit add-on sits on one\n\t// side: the value then aligns toward it, so `20 %` reads as one quantity\n\t// instead of a centred number with its unit pinned to the far edge.\n\tconst stepperValueAlign =\n\t\tprops.endAddon && !props.startAddon\n\t\t\t? 'text-end'\n\t\t\t: props.startAddon && !props.endAddon\n\t\t\t\t? 'text-start'\n\t\t\t\t: 'text-center';\n\n\tif (showSteppers) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn('decimal-input--component', \n\t\t\t\t\t// Stepper segmented group — input + adjacent − / + buttons\n\t\t\t\t\t// share a single border radius so the group reads as one\n\t\t\t\t\t// control instead of three loose chips.\n\t\t\t\t\t'flex items-stretch overflow-hidden rounded-radius border border-input bg-transparent [&>.input--component]:h-full',\n\t\t\t\t\tformControlSizeClasses[size],\n\t\t\t\t\t// The frame is the field: it carries the shared keyboard-focus,\n\t\t\t\t\t// validation and read-only states once for the whole group.\n\t\t\t\t\t'has-[input:focus-visible]:border-ring has-[input:focus-visible]:ring-3 has-[input:focus-visible]:ring-ring/50',\n\t\t\t\t\t'has-[input[aria-invalid=true]]:border-destructive has-[input[aria-invalid=true]]:has-[input:focus-visible]:border-destructive has-[input[aria-invalid=true]]:has-[input:focus-visible]:ring-destructive/30 dark:has-[input[aria-invalid=true]]:has-[input:focus-visible]:ring-destructive/50',\n\t\t\t\t\t'has-[input:read-only:not(:disabled)]:bg-muted',\n\t\t\t\t\tdisabled && 'opacity-50 cursor-not-allowed',\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\taria-label={strings.decrement}\n\t\t\t\t\tdisabled={editingUnavailable}\n\t\t\t\t\tonClick={() => adjust(-1)}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tinteractionRecipes.nativeButtonReset,\n\t\t\t\t\t\t'inline-flex shrink-0 items-center justify-center border-e border-input text-muted-foreground transition-colors',\n\t\t\t\t\t\tSTEPPER_SIZE_CLASS[size],\n\t\t\t\t\t\tinteractionRecipes.rowHover,\n\t\t\t\t\t\t// A disabled frame dims once; read-only or loading dims only the steppers.\n\t\t\t\t\t\t'disabled:pointer-events-none disabled:cursor-not-allowed',\n\t\t\t\t\t\t!disabled && 'disabled:opacity-50',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Minus aria-hidden=\"true\" className={formControlIconClasses[size]} />\n\t\t\t\t</button>\n\t\t\t\t<Input\n\t\t\t\t\tsize={size}\n\t\t\t\t\tref={(node) => { inputRef.current = node; if (typeof forwardedRef === \"function\") forwardedRef(node); else if (forwardedRef) forwardedRef.current = node; }}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tinputMode={validDecimalPlaces > 0 ? 'decimal' : 'numeric'}\n\t\t\t\t\tplaceholder={placeholderResolved}\n\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t{...('value' in allProps ? { value: controlledValue } : {})}\n\t\t\t\t\tdefaultValue={defaultValue}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t// The frame owns border, ring, fill and dimming; the inner field draws none of them.\n\t\t\t\t\t\t'!h-full min-h-0 flex-1 tabular-nums border-0 shadow-none rounded-none bg-transparent read-only:bg-transparent focus-visible:ring-0 focus-visible:border-0 aria-invalid:ring-0 aria-invalid:focus-visible:ring-0 disabled:opacity-100',\n\t\t\t\t\t\tstepperValueAlign,\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\taria-label={strings.increment}\n\t\t\t\t\tdisabled={editingUnavailable}\n\t\t\t\t\tonClick={() => adjust(1)}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tinteractionRecipes.nativeButtonReset,\n\t\t\t\t\t\t'inline-flex shrink-0 items-center justify-center border-s border-input text-muted-foreground transition-colors',\n\t\t\t\t\t\tSTEPPER_SIZE_CLASS[size],\n\t\t\t\t\t\tinteractionRecipes.rowHover,\n\t\t\t\t\t\t'disabled:pointer-events-none disabled:cursor-not-allowed',\n\t\t\t\t\t\t!disabled && 'disabled:opacity-50',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Plus aria-hidden=\"true\" className={formControlIconClasses[size]} />\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Input\n\t\t\tsize={size}\n\t\t\tref={(node) => { inputRef.current = node; if (typeof forwardedRef === \"function\") forwardedRef(node); else if (forwardedRef) forwardedRef.current = node; }}\n\t\t\ttype=\"text\"\n\t\t\tinputMode={validDecimalPlaces > 0 ? 'decimal' : 'numeric'}\n\t\t\tplaceholder={placeholderResolved}\n\t\t\tonChange={handleChange}\n\t\t\tonBlur={handleBlur}\n\t\t\tonKeyDown={onKeyDown}\n\t\t\t{...('value' in allProps ? { value: controlledValue } : {})}\n\t\t\tdefaultValue={defaultValue}\n\t\t\tdisabled={disabled}\n\t\t\tclassName={cn('tabular-nums text-end', className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nconst DecimalInput = React.forwardRef<HTMLInputElement, DecimalInputProps>(DecimalInputImpl);\nDecimalInput.displayName = 'DecimalInput';\n\nexport { DecimalInput };\n","/**\n * PercentageInput — DecimalInput configured for 0..100 percent values with a\n * trailing `%` add-on. Inherits stepper / rounding / normalisation features\n * from DecimalInput.\n */\nimport { forwardRef } from 'react';\nimport { DecimalInput, type DecimalInputProps } from './decimal-input';\n\nexport type PercentageInputProps = Omit<\n\tDecimalInputProps,\n\t'min' | 'max' | 'allowNegative' | 'endAddon'\n> & {\n\t/** Minimum percentage value. Defaults to 0. */\n\tmin?: number;\n\t/** Maximum percentage value. Defaults to 100. */\n\tmax?: number;\n};\n\nexport const PercentageInput = forwardRef<HTMLInputElement, PercentageInputProps>(\n\tfunction PercentageInput({ decimalPlaces = 2, min = 0, max = 100, step, ...props }, ref) {\n\t\treturn (\n\t\t\t<DecimalInput className=\"percentage-input--component\"\n\t\t\t\tref={ref}\n\t\t\t\tdecimalPlaces={decimalPlaces}\n\t\t\t\tallowNegative={false}\n\t\t\t\tmin={min}\n\t\t\t\tmax={max}\n\t\t\t\tstep={step}\n\t\t\t\tendAddon=\"%\"\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t},\n);\n\nPercentageInput.displayName = 'PercentageInput';\n","import { useId, useState, useCallback, useEffect, useMemo, memo, forwardRef, type ForwardedRef } from 'react';\nimport * as baseui from '../../ui/select';\nimport { Label, Text } from '../../typography';\nimport { Stack } from '../structure';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { useDensityConfig } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { formFieldTriggerClasses, resolveFormControlSize, formLabelLineClass } from '../forms/form-sizing';\nimport { selectToggleRecipes } from '../../../lib/field-affordance-recipes';\nimport {\n\tDecimalInput,\n\tdefaultDecimalInputStrings,\n\ttype DecimalInputProps,\n\ttype DecimalInputStrings,\n} from './decimal-input';\nimport { SelectPopupContent, SelectPopupGroup, SelectPopupItem } from '../choice-inputs';\n\nexport interface CurrencyOption {\n\tvalue: string;\n\tlabel: string;\n}\n\nexport interface CurrencyInputStrings extends DecimalInputStrings {\n\t/** Accessible name for the currency selector. */\n\tcurrencyAriaLabel: string;\n}\n\nexport const defaultCurrencyInputStrings: CurrencyInputStrings = {\n\t...defaultDecimalInputStrings,\n\tcurrencyAriaLabel: 'Currency',\n};\n\nexport interface CurrencyInputProps extends Omit<DecimalInputProps, 'label' | 'hint' | 'helperText' | 'error' | 'strings'> {\n\t/** Current currency value */\n\tcurrency?: string;\n\n\t/** Default currency if uncontrolled */\n\tdefaultCurrency?: string;\n\n\t/** List of available currencies (simple strings or objects with value/label) */\n\tcurrencies?: (string | CurrencyOption)[];\n\n\t/** Callback when currency changes */\n\tonCurrencyChange?: (currency: string) => void;\n\n\t/** Position of currency dropdown */\n\tcurrencyPosition?: 'start' | 'end';\n\n\t/** Disable currency selection */\n\tdisableCurrencySelector?: boolean;\n\n\t/** Placeholder for currency dropdown */\n\tcurrencyPlaceholder?: string;\n\n\t/** Width of the currency dropdown */\n\tcurrencyWidth?: string;\n\n\t/** Label for currency field (sub-label) */\n\tcurrencyLabel?: string;\n\n\t/** Localizes the selector name and inherited decimal-stepper labels. */\n\tstrings?: StringsProp<CurrencyInputStrings>;\n\n\t/** Error state for styling (passed from FormField) */\n\tinvalid?: boolean;\n\n\t/** Called when the input is misconfigured (mismatched currency/defaultCurrency\n\t * while the selector is disabled, missing currency, etc.). The library\n\t * also DEV-logs the same message to the console. */\n\tonConfigError?: (\n\t\tmessage: string,\n\t\tdetails: { currency?: string; defaultCurrency?: string; disableCurrencySelector?: boolean },\n\t) => void;\n}\n\n// Common currency symbols\nconst CURRENCY_SYMBOLS: Record<string, string> = {\n\tUSD: '$',\n\tEUR: '€',\n\tGBP: '£',\n\tBGN: 'лв',\n\tJPY: '¥',\n\tCNY: '¥',\n\tCHF: 'CHF',\n\tCAD: 'C$',\n\tAUD: 'A$',\n};\n\nconst normalizeCurrencies = (currencies?: (string | CurrencyOption)[]): CurrencyOption[] => {\n\tif (!currencies || currencies.length === 0) return [];\n\n\treturn currencies.map((currency) => {\n\t\tif (typeof currency === 'string') {\n\t\t\tconst symbol = CURRENCY_SYMBOLS[currency] || currency;\n\t\t\treturn {\n\t\t\t\tvalue: currency,\n\t\t\t\tlabel: `${symbol} ${currency}`,\n\t\t\t};\n\t\t}\n\t\treturn currency;\n\t});\n};\n\nfunction CurrencyInputImpl(\n\t{\n\t\tcurrency: controlledCurrency,\n\t\tdefaultCurrency,\n\t\tcurrencies,\n\t\tonCurrencyChange,\n\t\tcurrencyPosition = 'start',\n\t\tdisableCurrencySelector = false,\n\t\tcurrencyPlaceholder,\n\t\tcurrencyWidth = 'w-28',\n\t\tcurrencyLabel,\n\t\tstrings: stringsProp,\n\t\tinvalid,\n\t\tdisabled,\n\t\tonConfigError,\n\t\tsize: sizeProp,\n\t\t...decimalInputProps\n\t}: CurrencyInputProps,\n\tforwardedRef: ForwardedRef<HTMLInputElement>,\n) {\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveFormControlSize(sizeProp, defaultScale);\n\tconst strings = useStrings(defaultCurrencyInputStrings, stringsProp);\n\tconst currencyTriggerId = useId();\n\n\t// Memoize normalized currencies\n\tconst normalizedCurrencies = useMemo(() => normalizeCurrencies(currencies), [currencies]);\n\n\t// Internal state for uncontrolled currency\n\tconst [internalCurrency, setInternalCurrency] = useState(\n\t\tdefaultCurrency ?? normalizedCurrencies[0]?.value ?? ''\n\t);\n\n\t// Determine if currency is controlled\n\tconst isCurrencyControlled = controlledCurrency !== undefined;\n\tconst selectedCurrency = isCurrencyControlled ? controlledCurrency : internalCurrency;\n\n\tuseEffect(() => {\n\t\tconst details = { currency: controlledCurrency, defaultCurrency, disableCurrencySelector };\n\t\tif (\n\t\t\tdisableCurrencySelector &&\n\t\t\ttypeof controlledCurrency === 'string' &&\n\t\t\ttypeof defaultCurrency === 'string' &&\n\t\t\tcontrolledCurrency.trim() !== '' &&\n\t\t\tdefaultCurrency.trim() !== '' &&\n\t\t\tcontrolledCurrency !== defaultCurrency\n\t\t) {\n\t\t\tconst message = '[CurrencyInput] currency/defaultCurrency mismatch while selector is disabled.';\n\t\t\tif (import.meta.env?.DEV) {\n\t\t\t\tconsole.warn(message, { currency: controlledCurrency, defaultCurrency });\n\t\t\t}\n\t\t\tonConfigError?.(message, details);\n\t\t}\n\n\t\tif (\n\t\t\tdisableCurrencySelector &&\n\t\t\t(typeof selectedCurrency !== 'string' || selectedCurrency.trim().length === 0)\n\t\t) {\n\t\t\tconst message = '[CurrencyInput] disableCurrencySelector is enabled but no currency is provided.';\n\t\t\tif (import.meta.env?.DEV) {\n\t\t\t\tconsole.warn(message);\n\t\t\t}\n\t\t\tonConfigError?.(message, details);\n\t\t}\n\t}, [controlledCurrency, defaultCurrency, disableCurrencySelector, onConfigError, selectedCurrency]);\n\n\t// Handle currency change\n\tconst handleCurrencyChange = useCallback(\n\t\t(newCurrency: string | null) => {\n\t\t\tif (newCurrency === null) return;\n\t\t\tif (!isCurrencyControlled) {\n\t\t\t\tsetInternalCurrency(newCurrency);\n\t\t\t}\n\t\t\tonCurrencyChange?.(newCurrency);\n\t\t},\n\t\t[isCurrencyControlled, onCurrencyChange]\n\t);\n\n\t// Memoize trigger class names. `formFieldTriggerClasses` is the canonical\n\t// select/trigger chrome, so this selector keeps the height, padding, radius,\n\t// and focus treatment of a standalone `Select` — previously only the height\n\t// was shared, leaving shadcn's `rounded-md` and `py-2 pr-2 pl-2.5` in place\n\t// and making the unit selector visibly narrower-cornered than its siblings.\n\t// `currencyWidth` still wins over the helper's `w-full` through twMerge.\n\tconst triggerClassName = useMemo(\n\t\t() =>\n\t\t\tcn(\n\t\t\t\t'currency-input--selector-trigger',\n\t\t\t\tformFieldTriggerClasses(size),\n\t\t\t\tcurrencyWidth,\n\t\t\t),\n\t\t[size, currencyWidth]\n\t);\n\n\t// Currency selector component\n\tconst currencySelector = (\n\t\t// A sub-label uses the FormField label recipe and rhythm.\n\t\t<Stack gap=\"xs\" className=\"currency-input--selector\">\n\t\t\t{!!currencyLabel && <Label htmlFor={currencyTriggerId} className={cn('currency-input--selector-label text-inherit', formLabelLineClass)}>{currencyLabel}</Label>}\n\t\t\t<baseui.Select\n\t\t\t\tvalue={selectedCurrency}\n\t\t\t\tonValueChange={(value) => handleCurrencyChange(value)}\n\t\t\t\tdisabled={disabled || disableCurrencySelector}\n\t\t\t>\n\t\t\t\t<baseui.SelectTrigger\n\t\t\t\t\tid={currencyTriggerId}\n\t\t\t\t\taria-label={currencyLabel || strings.currencyAriaLabel}\n\t\t\t\t\taria-invalid={invalid || undefined}\n\t\t\t\t\ticonClassName={selectToggleRecipes.icon[size]}\n\t\t\t\t\tclassName={triggerClassName}\n\t\t\t\t>\n\t\t\t\t\t<baseui.SelectValue\n\t\t\t\t\t\tplaceholder={currencyPlaceholder ? (\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" type=\"secondary\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t{currencyPlaceholder}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t) : undefined}\n\t\t\t\t\t/>\n\t\t\t\t</baseui.SelectTrigger>\n\t\t\t\t<SelectPopupContent>\n\t\t\t\t\t<SelectPopupGroup>\n\t\t\t\t\t\t{normalizedCurrencies.map((curr) => (\n\t\t\t\t\t\t\t<SelectPopupItem key={curr.value} value={curr.value} size={size}>\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t\t{curr.label}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t</SelectPopupItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</SelectPopupGroup>\n\t\t\t\t</SelectPopupContent>\n\t\t\t</baseui.Select>\n\t\t</Stack>\n\t);\n\n\treturn (\n\t\t// Bottom-aligned, so the amount and currency controls stay level when only\n\t\t// the currency carries a sub-label.\n\t\t<div className={cn('currency-input--component', 'flex items-end gap-space-md')}>\n\t\t\t{currencyPosition === 'start' && currencySelector}\n\n\t\t\t<div className=\"currency-input--amount min-w-0 flex-1\">\n\t\t\t\t<DecimalInput\n\t\t\t\t\tref={forwardedRef}\n\t\t\t\t\tsize={size}\n\t\t\t\t\tdecimalPlaces={2}\n\t\t\t\t\tallowNegative={false}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tinvalid={invalid}\n\t\t\t\t\tstrings={{ decrement: strings.decrement, increment: strings.increment }}\n\t\t\t\t\t{...decimalInputProps}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t{currencyPosition === 'end' && currencySelector}\n\t\t</div>\n\t);\n}\n\n// forwardRef + memo: forward to the underlying decimal input so consumers\n// can focus/measure programmatically.\nexport const CurrencyInput = memo(forwardRef<HTMLInputElement, CurrencyInputProps>(CurrencyInputImpl));\nCurrencyInput.displayName = 'CurrencyInput';\n","export interface MoneyInputStrings {\n\toriginalValue: string;\n\tconversionWarning: string;\n}\n\nexport const defaultMoneyInputStrings: MoneyInputStrings = {\n\toriginalValue: 'Original value: {value}',\n\tconversionWarning: 'Currency will be converted from {from} to {to}.',\n};\n\nexport function interpolateMoneyInputString(\n\ttemplate: string,\n\tvalues: Record<string, string>,\n) {\n\treturn Object.entries(values).reduce(\n\t\t(output, [key, value]) => output.replaceAll(`{${key}}`, value),\n\t\ttemplate,\n\t);\n}\n","/**\n * MoneyInput — canonical monetary editor.\n *\n * It composes CurrencyInput with optional FormField chrome, one combined\n * amount/currency callback, and opt-in original-value/conversion context.\n * Consumers import it from `themelia-react-ui/base/forms`; display-only\n * monetary values use `Money` from `themelia-react-ui/primitives`.\n */\nimport { AlertTriangle } from 'lucide-react';\nimport {\n\tforwardRef,\n\tuseCallback,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n\ttype ChangeEvent,\n\ttype ReactNode,\n} from 'react';\n\nimport { Alert, AlertDescription } from '../feedback';\nimport { FormField } from '../forms/form-field';\nimport { Stack } from '../structure';\nimport { Text } from '../../typography';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { useMoneyConfig, type CurrencyCode } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\n\nimport {\n\tCurrencyInput,\n\ttype CurrencyInputProps,\n\ttype CurrencyOption,\n} from './currency-input';\nimport {\n\tdefaultMoneyInputStrings,\n\tinterpolateMoneyInputString,\n\ttype MoneyInputStrings,\n} from './money-input.strings';\n\nexport interface MoneyInputContext {\n\t/** Original major-unit amount, when available. */\n\tamount?: number | string | null;\n\t/** Original value currency, when available. */\n\tcurrency?: string | null;\n\t/** Optional original/record currency that can trigger a conversion warning. */\n\trecordCurrency?: string | null;\n\t/** Consumer-formatted original value shown as supporting context. */\n\tpair?: { formatted?: string | null } | null;\n}\n\nexport interface MoneyInputData {\n\t/** Parsed major-unit amount. `null` means the field is empty or incomplete; it is never coerced to zero. */\n\tamount: number | null;\n\t/** Active ISO 4217 currency code. */\n\tcurrency: CurrencyCode;\n}\n\nexport interface MoneyInputProps extends Omit<\n\tCurrencyInputProps,\n\t'currency' | 'defaultCurrency' | 'currencies' | 'onCurrencyChange' | 'strings'\n> {\n\t/** Current currency value (ISO 4217 code, e.g. `USD`). */\n\tcurrency?: CurrencyCode;\n\t/** Initial currency when uncontrolled. Falls back to UIProvider money config. */\n\tdefaultCurrency?: CurrencyCode;\n\t/** Available currencies. Custom option labels are preserved. */\n\tcurrencies?: Array<CurrencyCode | CurrencyOption>;\n\t/** Currency-only callback for existing form integrations. */\n\tonCurrencyChange?: (currency: CurrencyCode) => void;\n\t/**\n\t * Combined amount/currency callback for domain-form state. The amount is\n\t * parsed while the raw `value` / `onChange` channel keeps intermediate text\n\t * such as `1.` available to the editor.\n\t */\n\tonChangeData?: (data: MoneyInputData) => void;\n\t/** Optional context used for original-value and conversion messaging. */\n\tmoney?: MoneyInputContext | null;\n\t/** Optional field label. Omit when an external FormField already owns the chrome. */\n\tlabel?: string;\n\t/** Short guidance rendered below the control when no helper text or error is present. */\n\thint?: string;\n\t/** Supporting copy rendered below the control. */\n\thelperText?: string;\n\t/** Validation message. Also marks the amount and currency controls invalid. */\n\terror?: string;\n\t/** Marks the owned label and native amount input as required. */\n\trequired?: boolean;\n\t/** Existing record currency used to detect a currency migration. */\n\trecordCurrency?: CurrencyCode;\n\t/** Whether a record-currency mismatch renders the conversion warning. */\n\tshowMigrationWarning?: boolean;\n\t/** Consumer-owned warning content for a record-currency mismatch. */\n\tmigrationWarningMessage?: ReactNode;\n\t/** Whether to render `money.pair.formatted` as original-value context. */\n\tshowOriginalHint?: boolean;\n\t/** String overrides forwarded to the underlying DecimalInput steppers. */\n\tcontrolStrings?: CurrencyInputProps['strings'];\n\t/** Class name for the inner amount input. `className` styles the complete MoneyInput surface. */\n\tcontrolClassName?: string;\n\t/** Copy overrides for original-value and conversion-warning messages. */\n\tstrings?: StringsProp<MoneyInputStrings>;\n}\n\nconst FALLBACK_CURRENCIES: CurrencyCode[] = ['USD', 'EUR'];\n\nfunction parseAmount(value: unknown) {\n\tconst raw = String(value ?? '').trim();\n\tif (!raw) return null;\n\tconst parsed = Number.parseFloat(raw.replace(',', '.'));\n\treturn Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction resolveFormatted(value: unknown) {\n\treturn typeof value === 'string' ? value.trim() : '';\n}\n\nfunction currencyOptionValue(option: CurrencyCode | CurrencyOption) {\n\treturn typeof option === 'string' ? option : option.value;\n}\n\nexport const MoneyInput = forwardRef<HTMLInputElement, MoneyInputProps>(function MoneyInput(\n\tallProps,\n\tforwardedRef,\n) {\n\tconst {\n\t\tcurrency: controlledCurrency,\n\t\tdefaultCurrency,\n\t\tcurrencies,\n\t\tonCurrencyChange,\n\t\tonChangeData,\n\t\tmoney,\n\t\tlabel,\n\t\thint,\n\t\thelperText,\n\t\terror,\n\t\trequired,\n\t\tinvalid,\n\t\trecordCurrency: recordCurrencyProp,\n\t\tshowMigrationWarning = true,\n\t\tmigrationWarningMessage,\n\t\tshowOriginalHint = true,\n\t\tcontrolStrings,\n\t\tcontrolClassName,\n\t\tstrings: stringsProp,\n\t\tclassName,\n\t\tonChange,\n\t\tvalue,\n\t\tdefaultValue,\n\t\t...props\n\t} = allProps;\n\tconst moneyConfig = useMoneyConfig();\n\tconst strings = useStrings(defaultMoneyInputStrings, stringsProp);\n\tconst resolvedDefaultCurrency = defaultCurrency\n\t\t?? moneyConfig.defaultCurrency\n\t\t?? 'USD';\n\tconst [internalCurrency, setInternalCurrency] = useState(resolvedDefaultCurrency);\n\tconst activeCurrency = controlledCurrency ?? internalCurrency;\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\n\tconst availableCurrencies = useMemo(() => {\n\t\tconst source = currencies?.length\n\t\t\t? currencies\n\t\t\t: [resolvedDefaultCurrency, ...FALLBACK_CURRENCIES];\n\t\tconst unique = new Map<string, CurrencyCode | CurrencyOption>();\n\t\tfor (const option of source) {\n\t\t\tconst optionValue = currencyOptionValue(option);\n\t\t\tif (!unique.has(optionValue)) unique.set(optionValue, option);\n\t\t}\n\t\tconst options = Array.from(unique.values());\n\t\treturn unique.has(activeCurrency) ? options : [activeCurrency, ...options];\n\t}, [activeCurrency, currencies, resolvedDefaultCurrency]);\n\tconst recordCurrency = recordCurrencyProp ?? money?.recordCurrency ?? undefined;\n\tconst originalFormatted = showOriginalHint\n\t\t? resolveFormatted(money?.pair?.formatted)\n\t\t: '';\n\tconst willMigrate = Boolean(\n\t\trecordCurrency\n\t\t&& activeCurrency\n\t\t&& recordCurrency !== activeCurrency,\n\t);\n\tconst isInvalid = invalid ?? Boolean(error);\n\n\tconst assignRef = useCallback((node: HTMLInputElement | null) => {\n\t\tinputRef.current = node;\n\t\tif (typeof forwardedRef === 'function') forwardedRef(node);\n\t\telse if (forwardedRef) forwardedRef.current = node;\n\t}, [forwardedRef]);\n\n\tconst handleAmountChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n\t\tonChange?.(event);\n\t\tonChangeData?.({\n\t\t\tamount: parseAmount(event.target.value),\n\t\t\tcurrency: activeCurrency,\n\t\t});\n\t}, [activeCurrency, onChange, onChangeData]);\n\n\tconst handleCurrencyChange = useCallback((nextCurrency: CurrencyCode) => {\n\t\tif (controlledCurrency === undefined) setInternalCurrency(nextCurrency);\n\t\tonCurrencyChange?.(nextCurrency);\n\t\tonChangeData?.({\n\t\t\tamount: parseAmount(inputRef.current?.value ?? value ?? defaultValue),\n\t\t\tcurrency: nextCurrency,\n\t\t});\n\t}, [controlledCurrency, defaultValue, onChangeData, onCurrencyChange, value]);\n\n\tconst input = (\n\t\t<CurrencyInput\n\t\t\t{...props}\n\t\t\tref={assignRef}\n\t\t\t{...('value' in allProps ? { value } : {})}\n\t\t\tdefaultValue={defaultValue}\n\t\t\tcurrency={activeCurrency}\n\t\t\tcurrencies={availableCurrencies}\n\t\t\tonChange={handleAmountChange}\n\t\t\tonCurrencyChange={handleCurrencyChange}\n\t\t\tinvalid={isInvalid}\n\t\t\trequired={required}\n\t\t\taria-required={required ? true : props['aria-required']}\n\t\t\tstrings={controlStrings}\n\t\t\tclassName={controlClassName}\n\t\t/>\n\t);\n\tconst hasFieldChrome = Boolean(label || hint || helperText || error || required);\n\n\treturn (\n\t\t<Stack gap=\"sm\" className={cn('money-input--component', className)}>\n\t\t\t{/* The original value is one more supporting line: it keeps the field's\n\t\t\t hint rhythm and type, without a decorative glyph. */}\n\t\t\t<Stack gap=\"xs\" className=\"money-input--field\">\n\t\t\t\t{hasFieldChrome ? (\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\thint={hint}\n\t\t\t\t\t\thelperText={helperText}\n\t\t\t\t\t\terror={error}\n\t\t\t\t\t\trequired={required}\n\t\t\t\t\t>\n\t\t\t\t\t\t{input}\n\t\t\t\t\t</FormField>\n\t\t\t\t) : input}\n\n\t\t\t\t{!!originalFormatted && !error && (\n\t\t\t\t\t<Text tag=\"p\" size=\"xs\" type=\"secondary\" className=\"money-input--original\">\n\t\t\t\t\t\t{interpolateMoneyInputString(strings.originalValue, { value: originalFormatted })}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t</Stack>\n\n\t\t\t{!!willMigrate && showMigrationWarning && (\n\t\t\t\t<Alert tone=\"warning\" className=\"money-input--warning\">\n\t\t\t\t\t<AlertTriangle aria-hidden=\"true\" />\n\t\t\t\t\t<AlertDescription>\n\t\t\t\t\t\t{migrationWarningMessage ?? interpolateMoneyInputString(\n\t\t\t\t\t\t\tstrings.conversionWarning,\n\t\t\t\t\t\t\t{ from: recordCurrency ?? '', to: activeCurrency },\n\t\t\t\t\t\t)}\n\t\t\t\t\t</AlertDescription>\n\t\t\t\t</Alert>\n\t\t\t)}\n\t\t</Stack>\n\t);\n});\n\nMoneyInput.displayName = 'MoneyInput';\n\nexport {\n\tdefaultMoneyInputStrings,\n\ttype MoneyInputStrings,\n} from './money-input.strings';\n","import { forwardRef, useMemo, useCallback } from 'react';\nimport { Select, type SelectProps } from '../choice-inputs';\nimport { cn } from '../../../lib/utils';\n\ntype RoundingMode = string;\n\nexport interface RoundingModeSelectProps extends Omit<SelectProps, 'options' | 'value' | 'onValueChange'> {\n\t/** Current rounding mode value */\n\tvalue?: RoundingMode;\n\n\t/** Canonical change handler. */\n\tonValueChange?: (value: RoundingMode | undefined) => void;\n\n\t/**\n\t * Labels for the rounding modes. Defaults to sentence-case names: `floor` →\n\t * \"Round down\", `half_up` → \"Round half up\", `ceil` → \"Round up\".\n\t */\n\tlabels?: Partial<Record<RoundingMode, string>>;\n}\n\nconst ORDERED_MODES: RoundingMode[] = ['floor', 'half_up', 'ceil'];\n\n/** People read a policy name, never the stored identifier. */\nconst defaultRoundingModeLabels: Record<string, string> = {\n\tfloor: 'Round down',\n\thalf_up: 'Round half up',\n\tceil: 'Round up',\n};\n\nexport const RoundingModeSelect = forwardRef<HTMLButtonElement, RoundingModeSelectProps>(function RoundingModeSelect(allProps, ref) {\n\tconst controlled = Object.prototype.hasOwnProperty.call(allProps, 'value');\n\tconst { value, onValueChange, labels, placeholder, className, ...props } = allProps;\n\tconst options = useMemo(\n\t\t() =>\n\t\t\tORDERED_MODES.map((mode) => ({\n\t\t\t\tvalue: mode,\n\t\t\t\tlabel: labels?.[mode] ?? defaultRoundingModeLabels[mode] ?? mode,\n\t\t\t})),\n\t\t[labels]\n\t);\n\n\tconst handleChange = useCallback(\n\t\t(next: string | undefined) => {\n\t\t\tonValueChange?.(next as RoundingMode | undefined);\n\t\t},\n\t\t[onValueChange]\n\t);\n\n\treturn <Select ref={ref} className={cn('rounding-mode-select--component', className)} options={options} {...(controlled ? { value } : {})} onValueChange={handleChange} placeholder={placeholder} {...props} />;\n});\n\nRoundingModeSelect.displayName = 'RoundingModeSelect';\n","import * as React from 'react';\nimport { useId, useState, useEffect, useCallback } from 'react';\nimport * as baseui from '../../ui/select';\nimport { Label, Text } from '../../typography';\nimport { Stack } from '../structure';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { useDensityConfig, type FormControlSize } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { formFieldTriggerClasses, resolveFormControlSize, formLabelLineClass } from '../forms/form-sizing';\nimport { selectToggleRecipes } from '../../../lib/field-affordance-recipes';\nimport { controlGroupHeightClasses } from '../../../lib/control-group-recipes';\nimport { DecimalInput } from './decimal-input';\nimport { SelectPopupContent, SelectPopupGroup, SelectPopupItem } from '../choice-inputs';\n\nexport interface DimensionObject {\n\t\twidth?: string;\n\t\theight?: string;\n\t\tdepth?: string;\n}\n\nexport type DimensionValue = string | DimensionObject;\nexport type DimensionUnit = 'mm' | 'cm' | 'm' | 'in' | 'ft' | 'px';\n\nexport interface DimensionsInputStrings {\n\t\twidth: string;\n\t\theight: string;\n\t\tdepth: string;\n\t\tunit: string;\n\t\twidthPlaceholder: string;\n\t\theightPlaceholder: string;\n\t\tdepthPlaceholder: string;\n}\n\nexport const defaultDimensionsInputStrings: DimensionsInputStrings = {\n\t\twidth: 'Width',\n\t\theight: 'Height',\n\t\tdepth: 'Depth',\n\t\tunit: 'Unit',\n\t\twidthPlaceholder: '0.00',\n\t\theightPlaceholder: '0.00',\n\t\tdepthPlaceholder: '0.00',\n};\n\nexport interface DimensionsInputProps {\n\t\t/** Current value (string \"WxHxD\" or object { width, height, depth }) */\n\t\tvalue?: DimensionValue;\n\n\t\t/** Default value for uncontrolled mode */\n\t\tdefaultValue?: DimensionValue;\n\n\t\t/** Format type: 'string' for \"WxHxD\" or 'object' for { width, height, depth } */\n\t\tformat?: 'string' | 'object';\n\n\t/** Current length unit value. */\n\tunit?: DimensionUnit;\n\n\t/** Default length unit for uncontrolled mode. */\n\tdefaultUnit?: DimensionUnit;\n\n\t\t/** Label for width input (sub-label) */\n\t\twidthLabel?: string;\n\n\t\t/** Label for height input (sub-label) */\n\t\theightLabel?: string;\n\n\t\t/** Label for depth/length input (sub-label) */\n\t\tdepthLabel?: string;\n\n\t\t/** Label for unit selector (sub-label) */\n\t\tunitLabel?: string;\n\n\t\t/** Placeholder for the unit select */\n\t\tunitPlaceholder?: string;\n\n\t\t/** Placeholder for width */\n\t\twidthPlaceholder?: string;\n\n\t\t/** Placeholder for height */\n\t\theightPlaceholder?: string;\n\n\t\t/** Placeholder for depth */\n\t\tdepthPlaceholder?: string;\n\n\t\t/** Form control size — flows through `useDensityConfig().defaultScale`. */\n\t\tsize?: FormControlSize;\n\n\t\t/** Callback when value changes */\n\t\tonChange?: (e: { target: { value: DimensionValue } }) => void;\n\n\t\t/** Callback when unit changes */\n\tonUnitChange?: (unit: DimensionUnit) => void;\n\n\t\t/** Number of decimal places. Defaults to 2 */\n\t\tdecimalPlaces?: number;\n\n\t\t/** Minimum value for all dimensions */\n\t\tmin?: number;\n\n\t\t/** Maximum value for all dimensions */\n\t\tmax?: number;\n\n\t\t/** Show unit selector. Defaults to true */\n\t\tshowUnitSelector?: boolean;\n\n\t\t/** Disable unit selector */\n\t\tdisableUnitSelector?: boolean;\n\n\t\t/** Layout orientation. Defaults to 'horizontal' */\n\t\tlayout?: 'horizontal' | 'vertical';\n\n\t\t/** Error state for styling (passed from FormField) */\n\t\tinvalid?: boolean;\n\n\t\t/** Disabled state */\n\t\tdisabled?: boolean;\n\n\t\t/** Additional CSS classes */\n\t\tclassName?: string;\n\n\t\t/** String overrides merged over defaults. Direct props (e.g. `widthLabel`) win over `strings` keys. */\n\t\tstrings?: StringsProp<DimensionsInputStrings>;\n}\n\n// Unit options\nconst UNIT_OPTIONS = [\n\t{ value: 'mm', label: 'mm' },\n\t{ value: 'cm', label: 'cm' },\n\t{ value: 'm', label: 'm' },\n\t{ value: 'in', label: 'in' },\n\t{ value: 'ft', label: 'ft' },\n\t{ value: 'px', label: 'px' },\n] as const;\n\nconst parseDimensionValue = (\n\t\tvalue: DimensionValue | undefined,\n\t\tformat: 'string' | 'object'\n): { width: string; height: string; depth: string } => {\n\t\tif (!value) {\n\t\t\t\treturn { width: '', height: '', depth: '' };\n\t\t}\n\n\t\tif (format === 'string' && typeof value === 'string') {\n\t\t\t\tconst parts = value.split('x').map((p) => p.trim());\n\t\t\t\treturn {\n\t\t\t\t\t\twidth: parts[0] || '',\n\t\t\t\t\t\theight: parts[1] || '',\n\t\t\t\t\t\tdepth: parts[2] || '',\n\t\t\t\t};\n\t\t}\n\n\t\tif (format === 'object' && typeof value === 'object') {\n\t\t\t\treturn {\n\t\t\t\t\t\twidth: value.width || '',\n\t\t\t\t\t\theight: value.height || '',\n\t\t\t\t\t\tdepth: value.depth || '',\n\t\t\t\t};\n\t\t}\n\n\t\treturn { width: '', height: '', depth: '' };\n};\n\nconst formatDimensionValue = (\n\t\twidth: string,\n\t\theight: string,\n\t\tdepth: string,\n\t\tformat: 'string' | 'object'\n): DimensionValue => {\n\t\tif (format === 'string') {\n\t\t\t\treturn `${width}x${height}x${depth}`;\n\t\t}\n\t\treturn { width, height, depth };\n};\n\nexport const DimensionsInput = React.forwardRef<HTMLDivElement, DimensionsInputProps>(function DimensionsInput({\n\t\tvalue: controlledValue,\n\t\tdefaultValue,\n\t\tformat = 'string',\n\t\tunit: controlledUnit,\n\tdefaultUnit = 'cm',\n\t\twidthLabel,\n\t\theightLabel,\n\t\tdepthLabel,\n\t\tunitLabel,\n\t\tunitPlaceholder,\n\t\twidthPlaceholder,\n\t\theightPlaceholder,\n\t\tdepthPlaceholder,\n\t\tonChange,\n\t\tonUnitChange,\n\t\tdecimalPlaces = 2,\n\t\tmin = 0,\n\t\tmax,\n\t\tshowUnitSelector = true,\n\t\tdisableUnitSelector = false,\n\t\tlayout = 'horizontal',\n\t\tinvalid,\n\t\tdisabled = false,\n\t\tclassName,\n\t\tsize: sizeProp,\n\t\tstrings: stringsProp,\n}: DimensionsInputProps, ref) {\n\t\tconst { defaultScale } = useDensityConfig();\n\t\tconst size = resolveFormControlSize(sizeProp, defaultScale);\n\t\tconst strings = useStrings(defaultDimensionsInputStrings, stringsProp);\n\t\tconst resolvedWidthLabel = widthLabel ?? strings.width;\n\t\tconst resolvedHeightLabel = heightLabel ?? strings.height;\n\t\tconst resolvedDepthLabel = depthLabel ?? strings.depth;\n\t\tconst resolvedUnitPlaceholder = unitPlaceholder ?? strings.unit;\n\t\tconst resolvedWidthPlaceholder = widthPlaceholder ?? strings.widthPlaceholder;\n\t\tconst resolvedHeightPlaceholder = heightPlaceholder ?? strings.heightPlaceholder;\n\t\tconst resolvedDepthPlaceholder = depthPlaceholder ?? strings.depthPlaceholder;\n\t\tconst shouldShowInlineLabels = layout === 'horizontal';\n\t\tconst shouldShowVerticalLabels = layout === 'vertical';\n\t\tconst shouldShowUnitSelector = showUnitSelector === true;\n\t\tconst hasUnitLabel = (unitLabel ?? '').length > 0;\n\t\tconst widthFieldLabel = shouldShowVerticalLabels ? resolvedWidthLabel : '';\n\t\tconst heightFieldLabel = shouldShowVerticalLabels ? resolvedHeightLabel : '';\n\t\tconst depthFieldLabel = shouldShowVerticalLabels ? resolvedDepthLabel : '';\n\t\tconst fieldId = useId();\n\t\tconst ids = { width: `${fieldId}-width`, height: `${fieldId}-height`, depth: `${fieldId}-depth`, unit: `${fieldId}-unit` };\n\t\t// Sub-labels above a field use the FormField label recipe; captions sit below.\n\t\tconst subLabelClasses = cn('text-inherit', formLabelLineClass);\n\n\t\t// Determine if value is controlled\n\t\tconst isValueControlled = controlledValue !== undefined;\n\t\tconst isUnitControlled = controlledUnit !== undefined;\n\n\t\t// Parse initial value\n\t\tconst initialParsed = parseDimensionValue(\n\t\t\t\tisValueControlled ? controlledValue : defaultValue,\n\t\t\t\tformat\n\t\t);\n\n\t\t// Internal state for uncontrolled mode\n\t\tconst [internalWidth, setInternalWidth] = useState(initialParsed.width);\n\t\tconst [internalHeight, setInternalHeight] = useState(initialParsed.height);\n\t\tconst [internalDepth, setInternalDepth] = useState(initialParsed.depth);\n\t\tconst [internalUnit, setInternalUnit] = useState(controlledUnit || defaultUnit);\n\n\t\t// Get current values\n\t\tconst parsedValue = parseDimensionValue(controlledValue, format);\n\t\tconst widthValue = isValueControlled ? parsedValue.width : internalWidth;\n\t\tconst heightValue = isValueControlled ? parsedValue.height : internalHeight;\n\t\tconst depthValue = isValueControlled ? parsedValue.depth : internalDepth;\n\t\tconst unitValue = isUnitControlled ? controlledUnit : internalUnit;\n\n\t\t// Sync internal state when controlled value changes\n\t\tuseEffect(() => {\n\t\t\t\tif (isValueControlled) {\n\t\t\t\t\t\tconst parsed = parseDimensionValue(controlledValue, format);\n\t\t\t\t\t\tsetInternalWidth(parsed.width);\n\t\t\t\t\t\tsetInternalHeight(parsed.height);\n\t\t\t\t\t\tsetInternalDepth(parsed.depth);\n\t\t\t\t}\n\t\t}, [controlledValue, format, isValueControlled]);\n\n\t\t// Handle dimension changes\n\t\tconst handleDimensionChange = useCallback(\n\t\t\t\t(dimension: 'width' | 'height' | 'depth', newValue: string) => {\n\t\t\t\t\t\tlet updatedWidth = widthValue;\n\t\t\t\t\t\tlet updatedHeight = heightValue;\n\t\t\t\t\t\tlet updatedDepth = depthValue;\n\n\t\t\t\t\t\tif (dimension === 'width') updatedWidth = newValue;\n\t\t\t\t\t\tif (dimension === 'height') updatedHeight = newValue;\n\t\t\t\t\t\tif (dimension === 'depth') updatedDepth = newValue;\n\n\t\t\t\t\t\tif (!isValueControlled) {\n\t\t\t\t\t\t\t\tsetInternalWidth(updatedWidth);\n\t\t\t\t\t\t\t\tsetInternalHeight(updatedHeight);\n\t\t\t\t\t\t\t\tsetInternalDepth(updatedDepth);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst formattedValue = formatDimensionValue(updatedWidth, updatedHeight, updatedDepth, format);\n\t\t\t\t\t\tonChange?.({ target: { value: formattedValue } });\n\t\t\t\t},\n\t\t\t\t[widthValue, heightValue, depthValue, isValueControlled, format, onChange]\n\t\t);\n\n\t\tconst handleUnitChange = useCallback(\n\t\t\t\t(newUnit: string | null) => {\n\t\t\t\t\t\tif (newUnit === null) return;\n\t\t\tconst typedUnit = newUnit as DimensionUnit;\n\t\t\t\t\t\tif (!isUnitControlled) {\n\t\t\t\t\t\t\t\tsetInternalUnit(typedUnit);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonUnitChange?.(typedUnit);\n\t\t\t\t},\n\t\t\t\t[isUnitControlled, onUnitChange]\n\t\t);\n\n\tconst unitSelector = (\n\t\t<Stack gap=\"xs\">\n\t\t\t\t\t\t{!!hasUnitLabel && shouldShowVerticalLabels && <Label htmlFor={ids.unit} className={subLabelClasses}>{unitLabel}</Label>}\n\t\t\t\t\t\t<baseui.Select\n\t\t\t\t\t\t\t\tvalue={unitValue}\n\t\t\t\t\t\t\t\tonValueChange={(value) => handleUnitChange(value)}\n\t\t\t\t\t\t\t\tdisabled={disabled || disableUnitSelector}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<baseui.SelectTrigger\n\t\t\t\t\t\t\t\t\t\tid={ids.unit}\n\t\t\t\t\t\t\t\t\t\taria-label={unitLabel ?? strings.unit}\n\t\t\t\t\t\t\t\t\t\taria-invalid={invalid || undefined}\n\t\t\t\t\t\t\t\t\t\ticonClassName={selectToggleRecipes.icon[size]}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\tformFieldTriggerClasses(size),\n\t\t\t\t\t\t\t\t\t\t\t\tlayout === 'vertical'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'w-full'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'w-full @md/dimensions-input:w-32',\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<baseui.SelectValue\n\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" type=\"secondary\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{resolvedUnitPlaceholder}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</baseui.SelectTrigger>\n\t\t\t\t\t\t\t\t<SelectPopupContent>\n\t\t\t\t\t\t\t\t\t\t<SelectPopupGroup>\n\t\t\t\t\t\t\t\t\t\t\t\t{UNIT_OPTIONS.map((unit) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<SelectPopupItem key={unit.value} value={unit.value} size={size}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{unit.label}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</SelectPopupItem>\n\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</SelectPopupGroup>\n\t\t\t\t\t\t\t\t</SelectPopupContent>\n\t\t\t\t\t\t</baseui.Select>\n\t\t</Stack>\n\t\t);\n\n\t\treturn (\n\t\t<Stack ref={ref} gap=\"md\" className={cn('dimensions-input--component @container/dimensions-input', className)}>\n\t\t\t\t\t\t{/* Dimensions Inputs */}\n\t\t\t<Stack\n\t\t\t\tdirection={layout === 'vertical' ? 'vertical' : 'horizontal'}\n\t\t\t\tgap=\"md\"\n\t\t\t\talign={layout === 'vertical' ? 'stretch' : 'start'}\n\t\t\t\tclassName=\"dimensions-input--fields\"\n\t\t\t>\n\t\t\t\t\t\t\t\t{/* Width */}\n\t\t\t\t<Stack gap=\"xs\" className=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t\t\t\t{!!shouldShowVerticalLabels && !!widthFieldLabel && <Label htmlFor={ids.width} className={subLabelClasses}>{widthFieldLabel}</Label>}\n\t\t\t\t\t\t\t\t\t\t<DecimalInput\n\t\t\t\t\t\t\t\t\t\t\t\tid={ids.width}\n\t\t\t\t\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={widthValue}\n\t\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => handleDimensionChange('width', e.target.value)}\n\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={resolvedWidthPlaceholder}\n\t\t\t\t\t\t\t\t\t\t\t\tdecimalPlaces={decimalPlaces}\n\t\t\t\t\t\t\t\t\t\t\t\tmin={min}\n\t\t\t\t\t\t\t\t\t\t\t\tmax={max}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\t\t\tinvalid={invalid}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={resolvedWidthLabel}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t{!!shouldShowInlineLabels && (\n\t\t\t\t\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"text-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{resolvedWidthLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\n\t\t\t\t\t\t\t\t{/* Separator */}\n\t\t\t\t\t\t\t\t{layout === 'horizontal' && (\n\t\t\t\t\t\t\t\t\t\t// One control tall, so the sign centres on the fields at every size.\n\t\t\t\t\t\t\t\t\t\t<div aria-hidden=\"true\" className={cn('dimensions-input--separator flex items-center', controlGroupHeightClasses[size])}>\n\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" type=\"secondary\">×</Text>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{/* Height */}\n\t\t\t\t<Stack gap=\"xs\" className=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t\t\t\t{!!shouldShowVerticalLabels && !!heightFieldLabel && <Label htmlFor={ids.height} className={subLabelClasses}>{heightFieldLabel}</Label>}\n\t\t\t\t\t\t\t\t\t\t<DecimalInput\n\t\t\t\t\t\t\t\t\t\t\t\tid={ids.height}\n\t\t\t\t\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={heightValue}\n\t\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => handleDimensionChange('height', e.target.value)}\n\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={resolvedHeightPlaceholder}\n\t\t\t\t\t\t\t\t\t\t\t\tdecimalPlaces={decimalPlaces}\n\t\t\t\t\t\t\t\t\t\t\t\tmin={min}\n\t\t\t\t\t\t\t\t\t\t\t\tmax={max}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\t\t\tinvalid={invalid}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={resolvedHeightLabel}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t{!!shouldShowInlineLabels && (\n\t\t\t\t\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"text-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{resolvedHeightLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\n\t\t\t\t\t\t\t\t{/* Separator */}\n\t\t\t\t\t\t\t\t{layout === 'horizontal' && (\n\t\t\t\t\t\t\t\t\t\t// One control tall, so the sign centres on the fields at every size.\n\t\t\t\t\t\t\t\t\t\t<div aria-hidden=\"true\" className={cn('dimensions-input--separator flex items-center', controlGroupHeightClasses[size])}>\n\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" type=\"secondary\">×</Text>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{/* Depth */}\n\t\t\t\t<Stack gap=\"xs\" className=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t\t\t\t{!!shouldShowVerticalLabels && !!depthFieldLabel && <Label htmlFor={ids.depth} className={subLabelClasses}>{depthFieldLabel}</Label>}\n\t\t\t\t\t\t\t\t\t\t<DecimalInput\n\t\t\t\t\t\t\t\t\t\t\t\tid={ids.depth}\n\t\t\t\t\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={depthValue}\n\t\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => handleDimensionChange('depth', e.target.value)}\n\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={resolvedDepthPlaceholder}\n\t\t\t\t\t\t\t\t\t\t\t\tdecimalPlaces={decimalPlaces}\n\t\t\t\t\t\t\t\t\t\t\t\tmin={min}\n\t\t\t\t\t\t\t\t\t\t\t\tmax={max}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\t\t\tinvalid={invalid}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={resolvedDepthLabel}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t{!!shouldShowInlineLabels && (\n\t\t\t\t\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"text-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{resolvedDepthLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\n\t\t\t\t\t\t\t\t{/* Unit Selector */}\n\t\t\t\t\t\t\t\t{!!shouldShowUnitSelector && (\n\t\t\t\t\t\t\t\t\t\t<Stack gap=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'dimensions-input--unit',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlayout === 'vertical'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'w-full'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'w-full basis-full pt-0 @md/dimensions-input:w-32 @md/dimensions-input:basis-32 @md/dimensions-input:shrink-0',\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{unitSelector}\n\t\t\t\t\t\t\t\t\t\t\t\t{!!shouldShowInlineLabels && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"text-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{hasUnitLabel ? unitLabel : resolvedUnitPlaceholder}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</Stack>\n\t\t);\n});\n\nDimensionsInput.displayName = 'DimensionsInput';\n","import * as React from 'react';\nimport { useId, useState, useMemo, useCallback } from 'react';\nimport * as baseui from '../../ui/select';\nimport { Stack } from '../structure';\nimport { Label, Text } from '../../typography';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { useDensityConfig, type FormControlSize } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { formFieldTriggerClasses, resolveFormControlSize, formLabelLineClass } from '../forms/form-sizing';\nimport { selectToggleRecipes } from '../../../lib/field-affordance-recipes';\nimport { DecimalInput } from './decimal-input';\nimport { SelectPopupContent, SelectPopupGroup, SelectPopupItem } from '../choice-inputs';\n\nexport type WeightUnit = 'g' | 'kg' | 'lb' | 'oz';\n\nexport interface WeightInputStrings {\n\t\t/** Above-field label for the unit selector. Empty string hides it. */\n\t\tunitLabel: string;\n\t\t/** Accessible name for the unit selector. */\n\t\tunitAriaLabel: string;\n\t\t/** Placeholder shown in the unit selector. */\n\t\tunitPlaceholder: string;\n}\n\nexport const defaultWeightInputStrings: WeightInputStrings = {\n\t\tunitLabel: '',\n\t\tunitAriaLabel: 'Unit',\n\t\tunitPlaceholder: '',\n};\n\nexport interface WeightInputProps {\n\t\t/** Controlled value */\n\t\tvalue?: string;\n\n\t\t/** Default value for uncontrolled mode */\n\t\tdefaultValue?: string;\n\n\t\t/** Current unit */\n\t\tunit?: WeightUnit;\n\n\t\t/** Default unit for uncontrolled mode */\n\t\tdefaultUnit?: WeightUnit;\n\n\t\t/** Value change handler */\n\t\tonChange?: (e: { target: { value: string } }) => void;\n\n\t\t/** Unit change handler */\n\t\tonUnitChange?: (unit: WeightUnit) => void;\n\n\t\t/** Number of decimal places */\n\t\tdecimalPlaces?: number;\n\n\t\t/** Minimum value */\n\t\tmin?: number;\n\n\t\t/** Maximum value */\n\t\tmax?: number;\n\n\t\t/** Show unit selector */\n\t\tshowUnitSelector?: boolean;\n\n\t\t/** Disable unit selector */\n\t\tdisableUnitSelector?: boolean;\n\n\t\t/** Override default strings (unit selector label + placeholder). */\n\t\tstrings?: StringsProp<WeightInputStrings>;\n\n\t\t/** Width of unit selector */\n\t\tunitWidth?: string;\n\n\t\t/** Error state for styling (passed from FormField) */\n\t\tinvalid?: boolean;\n\n\t\t/** Disabled state */\n\t\tdisabled?: boolean;\n\n\t\t/** Form control size — flows through `useDensityConfig().defaultScale`. */\n\t\tsize?: FormControlSize;\n\n\t\t/** Additional class names */\n\t\tclassName?: string;\n}\n\nconst UNIT_OPTIONS: Array<{ value: WeightUnit; label: string }> = [\n\t\t{ value: 'g', label: 'g' },\n\t\t{ value: 'kg', label: 'kg' },\n\t\t{ value: 'lb', label: 'lb' },\n\t\t{ value: 'oz', label: 'oz' },\n];\n\nexport const WeightInput = React.forwardRef<HTMLDivElement, WeightInputProps>(function WeightInput({\n\t\tvalue: controlledValue,\n\t\tdefaultValue,\n\t\tunit: controlledUnit,\n\t\tdefaultUnit = 'g',\n\t\tonChange,\n\t\tonUnitChange,\n\t\tdecimalPlaces = 2,\n\t\tmin = 0,\n\t\tmax,\n\t\tshowUnitSelector = true,\n\t\tdisableUnitSelector = false,\n\t\tunitWidth = 'w-24',\n\t\tstrings: stringsProp,\n\t\tinvalid,\n\t\tdisabled = false,\n\t\tsize: sizeProp,\n\t\tclassName,\n}: WeightInputProps, ref) {\n\t\tconst { defaultScale } = useDensityConfig();\n\t\tconst size = resolveFormControlSize(sizeProp, defaultScale);\n\t\tconst strings = useStrings(defaultWeightInputStrings, stringsProp);\n\t\tconst isValueControlled = controlledValue !== undefined;\n\t\tconst isUnitControlled = controlledUnit !== undefined;\n\n\t\tconst [internalValue, setInternalValue] = useState(defaultValue ?? '');\n\t\tconst [internalUnit, setInternalUnit] = useState<WeightUnit>(controlledUnit ?? defaultUnit);\n\n\t\tconst value = isValueControlled ? controlledValue ?? '' : internalValue;\n\t\tconst unit = isUnitControlled ? controlledUnit ?? defaultUnit : internalUnit;\n\n\t\tconst handleValueChange = useCallback(\n\t\t\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\t\t\t\tif (!isValueControlled) {\n\t\t\t\t\t\t\t\tsetInternalValue(e.target.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonChange?.({ target: { value: e.target.value } });\n\t\t\t\t},\n\t\t\t\t[isValueControlled, onChange]\n\t\t);\n\n\t\tconst handleUnitChange = useCallback(\n\t\t\t\t(nextUnit: string | null) => {\n\t\t\t\t\t\tif (nextUnit === null) return;\n\t\t\t\t\t\tconst weightUnit = nextUnit as WeightUnit;\n\t\t\t\t\t\tif (!isUnitControlled) {\n\t\t\t\t\t\t\t\tsetInternalUnit(weightUnit);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonUnitChange?.(weightUnit);\n\t\t\t\t},\n\t\t\t\t[isUnitControlled, onUnitChange]\n\t\t);\n\n\t\tconst unitOptions = useMemo(() => UNIT_OPTIONS, []);\n\t\tconst hasUnitLabel = strings.unitLabel !== '';\n\t\tconst unitTriggerId = useId();\n\n\t\treturn (\n\t\t\t\t// Bottom-aligned, so value and unit stay level when only the unit has a sub-label.\n\t\t\t\t<div ref={ref} className={cn('weight-input--component', 'flex items-end gap-space-md', className)}>\n\t\t\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t\t\t\t<DecimalInput\n\t\t\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\t\t\t\tonChange={handleValueChange}\n\t\t\t\t\t\t\t\t\t\tdecimalPlaces={decimalPlaces}\n\t\t\t\t\t\t\t\t\t\tallowNegative={false}\n\t\t\t\t\t\t\t\t\t\tmin={min}\n\t\t\t\t\t\t\t\t\t\tmax={max}\n\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\tinvalid={invalid}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{!!showUnitSelector && (\n\t\t\t\t<Stack gap=\"xs\">\n\t\t\t\t\t\t\t\t\t\t{!!hasUnitLabel && <Label htmlFor={unitTriggerId} className={cn('text-inherit', formLabelLineClass)}>{strings.unitLabel}</Label>}\n\t\t\t\t\t\t\t\t\t\t<baseui.Select value={unit} onValueChange={(value) => handleUnitChange(value)} disabled={disabled || disableUnitSelector}>\n\t\t\t\t\t\t\t\t<baseui.SelectTrigger\n\t\t\t\t\t\t\t\t\t\tid={unitTriggerId}\n\t\t\t\t\t\t\t\t\t\taria-label={strings.unitLabel || strings.unitAriaLabel}\n\t\t\t\t\t\t\t\t\t\taria-invalid={invalid || undefined}\n\t\t\t\t\t\t\t\t\t\ticonClassName={selectToggleRecipes.icon[size]}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tformFieldTriggerClasses(size),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunitWidth\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<baseui.SelectValue\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={strings.unitPlaceholder ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" type=\"secondary\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{strings.unitPlaceholder}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : undefined}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</baseui.SelectTrigger>\n\t\t\t\t\t\t\t\t\t\t\t\t<SelectPopupContent>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<SelectPopupGroup>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{unitOptions.map((option) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<SelectPopupItem key={option.value} value={option.value} size={size}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</SelectPopupItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</SelectPopupGroup>\n\t\t\t\t\t\t\t\t\t\t\t\t</SelectPopupContent>\n\t\t\t\t\t\t\t\t\t\t</baseui.Select>\n\t\t\t\t</Stack>\n\t\t\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t);\n});\n\nWeightInput.displayName = 'WeightInput';\n","import * as React from 'react';\nimport { useEffect, useMemo, useState, useCallback } from 'react';\nimport { FormField } from '../forms/form-field';\nimport { Grid, Stack } from '../structure';\nimport { TextLink } from '../../typography';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport type { FormControlSize } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { DecimalInput } from './decimal-input';\n\nexport interface CoordinatesObjectValue {\n\t\tlat?: string;\n\t\tlng?: string;\n}\n\nexport type CoordinatesValue = string | CoordinatesObjectValue;\n\nexport interface CoordinatesInputStrings {\n\t\t/** Above-field label for the latitude input. Empty string hides it. */\n\t\tlatLabel: string;\n\t\t/** Above-field label for the longitude input. Empty string hides it. */\n\t\tlngLabel: string;\n\t\t/** Placeholder shown in the latitude input. */\n\t\tlatPlaceholder: string;\n\t\t/** Placeholder shown in the longitude input. */\n\t\tlngPlaceholder: string;\n\t\t/** Anchor text for the Google Maps preview link. Empty string hides it. */\n\t\tpreviewLinkLabel: string;\n\t\t/** Accessible name for the latitude input while `latLabel` is empty. */\n\t\tlatAccessibleLabel: string;\n\t\t/** Accessible name for the longitude input while `lngLabel` is empty. */\n\t\tlngAccessibleLabel: string;\n}\n\nexport const defaultCoordinatesInputStrings: CoordinatesInputStrings = {\n\t\tlatLabel: '',\n\t\tlngLabel: '',\n\t\tlatPlaceholder: '',\n\t\tlngPlaceholder: '',\n\t\tpreviewLinkLabel: '',\n\t\tlatAccessibleLabel: 'Latitude',\n\t\tlngAccessibleLabel: 'Longitude',\n};\n\nexport interface CoordinatesInputProps {\n\t\t/** Controlled value */\n\t\tvalue?: CoordinatesValue;\n\n\t\t/** Default value for uncontrolled mode */\n\t\tdefaultValue?: CoordinatesValue;\n\n\t\t/** Output format */\n\t\tformat?: 'string' | 'object';\n\n\t\t/** Change handler */\n\t\tonChange?: (e: { target: { value: CoordinatesValue } }) => void;\n\n\t\t/** Number of decimal places */\n\t\tdecimalPlaces?: number;\n\n\t\t/** Show preview link to Google Maps */\n\t\tshowPreviewLink?: boolean;\n\n\t\t/** Override default strings (labels + placeholders + preview link). */\n\t\tstrings?: StringsProp<CoordinatesInputStrings>;\n\n\t\t/** Error state for styling (passed from FormField) */\n\t\tinvalid?: boolean;\n\n\t\t/** Additional class names */\n\t\tclassName?: string;\n\n\t\t/** Disabled state */\n\t\tdisabled?: boolean;\n\n\t\t/** Control-height preset for both fields. Falls back to `UIProvider.density.defaultScale`, like the other numeric inputs. */\n\t\tsize?: FormControlSize;\n}\n\nconst parseValue = (\n\t\tvalue: CoordinatesValue | undefined,\n\t\tformat: 'string' | 'object'\n): { lat: string; lng: string } => {\n\t\tif (!value) {\n\t\t\t\treturn { lat: '', lng: '' };\n\t\t}\n\n\t\tif (format === 'string' && typeof value === 'string') {\n\t\t\t\tconst [lat, lng] = value.split(',').map((part) => part.trim());\n\t\t\t\treturn { lat: lat ?? '', lng: lng ?? '' };\n\t\t}\n\n\t\tif (format === 'object' && typeof value === 'object') {\n\t\t\t\treturn { lat: value.lat ?? '', lng: value.lng ?? '' };\n\t\t}\n\n\t\treturn { lat: '', lng: '' };\n};\n\nconst formatValue = (lat: string, lng: string, format: 'string' | 'object'): CoordinatesValue => {\n\t\tif (format === 'string') {\n\t\t\t\treturn `${lat},${lng}`;\n\t\t}\n\t\treturn { lat, lng };\n};\n\nconst isFiniteNumberInRange = (value: string, min: number, max: number): boolean => {\n\t\tif (!value) return false;\n\t\tconst num = Number(value);\n\t\treturn Number.isFinite(num) && num >= min && num <= max;\n};\n\nexport const CoordinatesInput = React.forwardRef<HTMLDivElement, CoordinatesInputProps>(function CoordinatesInput({\n\t\tvalue: controlledValue,\n\t\tdefaultValue,\n\t\tformat = 'object',\n\t\tonChange,\n\t\tdecimalPlaces = 6,\n\t\tshowPreviewLink = true,\n\t\tstrings: stringsProp,\n\t\tinvalid,\n\t\tclassName,\n\t\tdisabled,\n\t\tsize,\n}: CoordinatesInputProps, ref) {\n\t\tconst strings = useStrings(defaultCoordinatesInputStrings, stringsProp);\n\t\tconst isControlled = controlledValue !== undefined;\n\n\t\tconst initialParsed = parseValue(isControlled ? controlledValue : defaultValue, format);\n\t\tconst [internalLat, setInternalLat] = useState(initialParsed.lat);\n\t\tconst [internalLng, setInternalLng] = useState(initialParsed.lng);\n\n\t\tconst parsedControlled = parseValue(controlledValue, format);\n\t\tconst lat = isControlled ? parsedControlled.lat : internalLat;\n\t\tconst lng = isControlled ? parsedControlled.lng : internalLng;\n\n\t\tuseEffect(() => {\n\t\t\t\tif (isControlled) {\n\t\t\t\t\t\tsetInternalLat(parsedControlled.lat);\n\t\t\t\t\t\tsetInternalLng(parsedControlled.lng);\n\t\t\t\t}\n\t\t}, [isControlled, parsedControlled.lat, parsedControlled.lng]);\n\n\t\tconst update = useCallback(\n\t\t\t\t(nextLat: string, nextLng: string) => {\n\t\t\t\t\t\tif (!isControlled) {\n\t\t\t\t\t\t\t\tsetInternalLat(nextLat);\n\t\t\t\t\t\t\t\tsetInternalLng(nextLng);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tonChange?.({ target: { value: formatValue(nextLat, nextLng, format) } });\n\t\t\t\t},\n\t\t\t\t[isControlled, onChange, format]\n\t\t);\n\n\t\tconst mapUrl = useMemo(() => {\n\t\t\t\tconst hasValidLat = isFiniteNumberInRange(lat, -90, 90);\n\t\t\t\tconst hasValidLng = isFiniteNumberInRange(lng, -180, 180);\n\t\t\t\tif (!hasValidLat || !hasValidLng) return null;\n\t\t\t\treturn `https://www.google.com/maps?q=${encodeURIComponent(`${lat},${lng}`)}`;\n\t\t}, [lat, lng]);\n\n\t\treturn (\n\t\t\t\t<Stack ref={ref} gap=\"lg\" className={cn('coordinates-input--component', className)}>\n\t\t\t\t\t\t<Grid columns={{ base: 1, md: 2 }} gap=\"lg\">\n\t\t\t\t\t\t\t\t<FormField label={strings.latLabel || undefined}>\n\t\t\t\t\t\t\t\t\t\t<DecimalInput\n\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={strings.latPlaceholder || undefined}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.latLabel ? undefined : strings.latAccessibleLabel || undefined}\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={lat}\n\t\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => update(e.target.value, lng)}\n\t\t\t\t\t\t\t\t\t\t\t\tdecimalPlaces={decimalPlaces}\n\t\t\t\t\t\t\t\t\t\t\t\tallowNegative\n\t\t\t\t\t\t\t\t\t\t\t\tmin={-90}\n\t\t\t\t\t\t\t\t\t\t\t\tmax={90}\n\t\t\t\t\t\t\t\t\t\t\t\tinvalid={invalid}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FormField>\n\t\t\t\t\t\t\t\t<FormField label={strings.lngLabel || undefined}>\n\t\t\t\t\t\t\t\t\t\t<DecimalInput\n\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={strings.lngPlaceholder || undefined}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.lngLabel ? undefined : strings.lngAccessibleLabel || undefined}\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={lng}\n\t\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => update(lat, e.target.value)}\n\t\t\t\t\t\t\t\t\t\t\t\tdecimalPlaces={decimalPlaces}\n\t\t\t\t\t\t\t\t\t\t\t\tallowNegative\n\t\t\t\t\t\t\t\t\t\t\t\tmin={-180}\n\t\t\t\t\t\t\t\t\t\t\t\tmax={180}\n\t\t\t\t\t\t\t\t\t\t\t\tinvalid={invalid}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FormField>\n\t\t\t\t\t\t</Grid>\n\n\t\t\t\t\t\t{!!showPreviewLink && !!mapUrl && !!strings.previewLinkLabel && (\n\t\t\t\t\t\t\t\t<TextLink href={mapUrl} type=\"secondary\" underline={false}>\n\t\t\t\t\t\t\t\t\t\t{strings.previewLinkLabel}\n\t\t\t\t\t\t\t\t</TextLink>\n\t\t\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t);\n});\n\nCoordinatesInput.displayName = 'CoordinatesInput';\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"header-DMMxG__r.js","names":["React","_Fragment","React","_Fragment","Text","DisplayLabel","Stack","dotRecipes","popoverWidthRecipes","DropdownMenuItem","DropdownMenuSeparator","DropdownMenuTrigger","DropdownMenuGroup","DropdownMenuLabel","DropdownMenuContent","DropdownMenuLinkItem","DropdownMenu","ActionMenu","formatInitials","AvatarFallback","Avatar","AvatarImage","Separator","PopoverTrigger","Popover","PopoverContent","Breadcrumbs","SidebarTrigger","useLayoutLinkRenderer","useCommandShortcut","headerInlineDividerAlignment","React$1","Fragment$1","HeaderBreadcrumbs","resolvedRenderLink","items","out","homeBreadcrumb","breadcrumbs","showCrumbs","cn","className","showSidebarTrigger","triggerSlot","Header","forwardRef","props","contentClassName","slots","showBreadcrumbs","breadcrumbsClassName","leftClassName","centerClassName","rightClassName","defaultHeaderNotificationsStrings","defaultHeaderSearchStrings","defaultHeaderUserMenuStrings","detectMac","ua","HeaderSearch","stringsProp","strings","useStrings","detectedMac","setDetectedMac","useState","shortcutModifier","isMetaShortcut","enableShortcut","onOpen","shortcutTitle","shortcut","shortcutSlot","Button","Search","iconClassName","HeaderGlobalSearchTrigger","onOpenChange","HeaderToolButton","Icon","label","active","badge","HeaderToolPopover","open","triggerClassName","HeaderUserMenu","initials","user","twoLineIdentity","showEmail","actions","onProfile","User","onSettings","Settings","onLogout","LogOut","trigger","renderTrigger","ChevronsUpDown","contentClasses","customContent","NOTIFICATION_TONE_CLASSNAMES","HeaderNotifications","badgeText","unreadCount","Bell","onMarkAllRead","notifications","NotificationRow","onNotificationClick","notification","onViewAll","viewAllHref","renderNotification","content","onClick","renderLink"],"sources":["../src/components/layout/header/partials/header-breadcrumbs.tsx","../src/components/layout/header/header.tsx","../src/components/layout/header/header.types.ts","../src/components/layout/header/partials/header-search.tsx","../src/components/layout/header/partials/header-global-search-trigger.tsx","../src/components/layout/header/partials/header-tool-button.tsx","../src/components/layout/header/partials/header-tool-popover.tsx","../src/components/layout/header/partials/header-user-menu.tsx","../src/components/layout/header/partials/header-notifications.tsx"],"sourcesContent":["/** HeaderBreadcrumbs — breadcrumbs trail with optional sidebar trigger. */\nimport * as React from 'react';\n\nimport { Separator } from '../../../base/display/separator';\nimport { Breadcrumbs } from '../../../base/navigation/breadcrumbs';\nimport { SidebarTrigger } from '../../../base/sidebar';\nimport { cn } from '../../../../lib/utils';\n\nimport { useLayoutLinkRenderer } from '../../hooks';\nimport type { BreadcrumbItem } from '../../layout.types';\nimport type { HeaderBreadcrumbsProps } from '../header.types';\n\nexport function HeaderBreadcrumbs({\n\tbreadcrumbs = [],\n\thomeBreadcrumb = null,\n\tshowSidebarTrigger = true,\n\ttriggerSlot,\n\trenderLink,\n\tclassName,\n}: HeaderBreadcrumbsProps) {\n\tconst resolvedRenderLink = useLayoutLinkRenderer({ renderLink });\n\tconst items = React.useMemo<BreadcrumbItem[]>(() => {\n\t\tconst out: BreadcrumbItem[] = [];\n\t\tif (homeBreadcrumb) out.push(homeBreadcrumb);\n\t\tout.push(...breadcrumbs);\n\t\treturn out;\n\t}, [homeBreadcrumb, breadcrumbs]);\n\n\tconst showCrumbs = items.length > 0;\n\n\treturn (\n\t\t<div className={cn('relative flex min-h-action min-w-0 items-center gap-space-lg', className)}>\n\t\t\t{!!showSidebarTrigger && (\n\t\t\t\t<div className=\"relative flex min-h-action shrink-0 items-center justify-center\">\n\t\t\t\t\t{triggerSlot ?? <SidebarTrigger />}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{!!showCrumbs && (\n\t\t\t\t<>\n\t\t\t\t\t{!!showSidebarTrigger && <Separator orientation=\"vertical\" className=\"h-icon shrink-0 data-[orientation=vertical]:self-center\" />}\n\t\t\t\t\t<div className=\"flex min-w-0 flex-1 items-center overflow-hidden\">\n\t\t\t\t\t\t<Breadcrumbs\n\t\t\t\t\t\t\tbreadcrumbs={items}\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\trenderLink={resolvedRenderLink}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'min-w-0 overflow-hidden',\n\t\t\t\t\t\t\t\t'[&_[data-slot=breadcrumb-list]]:flex-nowrap [&_[data-slot=breadcrumb-list]]:overflow-hidden [&_[data-slot=breadcrumb-list]]:break-normal',\n\t\t\t\t\t\t\t\t// The current page claims its width first and truncates last. Ancestors\n\t\t\t\t\t\t\t\t// share what remains, up to their own width, and give way first.\n\t\t\t\t\t\t\t\t'[&_[data-slot=breadcrumb-item]]:min-w-0',\n\t\t\t\t\t\t\t\t'[&_[data-slot=breadcrumb-item]:not(:last-child)]:max-w-max [&_[data-slot=breadcrumb-item]:not(:last-child)]:grow [&_[data-slot=breadcrumb-item]:not(:last-child)]:basis-0',\n\t\t\t\t\t\t\t\t'[&_[data-slot=breadcrumb-link]]:truncate [&_[data-slot=breadcrumb-page]]:truncate',\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/** Header — sticky top bar with breadcrumbs and slot-driven content regions. */\nimport { forwardRef } from 'react';\n\nimport { Stack } from '../../base/structure';\nimport { cn } from '../../../lib/utils';\n\nimport { useLayoutLinkRenderer } from '../hooks';\nimport { HeaderBreadcrumbs } from './partials/header-breadcrumbs';\nimport type { HeaderProps } from './header.types';\nimport { headerInlineDividerAlignment } from './header.recipes';\n\nexport const Header = forwardRef<HTMLElement, HeaderProps>(function Header({\n\tshowBreadcrumbs = true,\n\tbreadcrumbs = [],\n\thomeBreadcrumb = null,\n\tshowSidebarTrigger = true,\n\tslots,\n\trenderLink,\n\tclassName,\n\tcontentClassName,\n\tleftClassName,\n\tcenterClassName,\n\trightClassName,\n\tbreadcrumbsClassName,\n\t...props\n}, ref) {\n\tconst resolvedRenderLink = useLayoutLinkRenderer({ renderLink });\n\n\treturn (\n\t\t<header\n\t\t\t{...props}\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'header--component @container/app-header box-border sticky top-0 z-40 flex min-w-0 min-h-shell-header items-center border-b border-border bg-background px-surface-lg py-space-sm transition-[width,height] ease-linear',\n\t\t\t\theaderInlineDividerAlignment,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Stack direction=\"horizontal\" gap=\"xl\" align=\"center\" wrap className={cn('min-w-0 min-h-action flex-1', contentClassName)}>\n\t\t\t\t{!!slots?.brand && (\n\t\t\t\t\t<div className=\"hidden min-w-0 shrink-0 items-center @2xl/app-header:flex\">\n\t\t\t\t\t\t{slots.brand}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{!!showBreadcrumbs && (\n\t\t\t\t\t<div className=\"min-w-0 flex-1 basis-32\">\n\t\t\t\t\t\t{slots?.breadcrumbs ?? (\n\t\t\t\t\t\t<HeaderBreadcrumbs\n\t\t\t\t\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\t\t\t\t\thomeBreadcrumb={homeBreadcrumb}\n\t\t\t\t\t\t\tshowSidebarTrigger={showSidebarTrigger}\n\t\t\t\t\t\t\trenderLink={resolvedRenderLink}\n\t\t\t\t\t\t\tclassName={breadcrumbsClassName}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{!!slots?.left && (\n\t\t\t\t\t<div className={cn('flex min-w-0 items-center', leftClassName)}>\n\t\t\t\t\t\t{slots.left}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{!!slots?.center && (\n\t\t\t\t\t/* Search narrows within its region before navigation or account controls lose space. */\n\t\t\t\t\t<div className={cn('hidden min-w-0 flex-1 basis-64 items-center justify-center @3xl/app-header:flex [&>*]:min-w-0 [&>*]:max-w-full', centerClassName)}>\n\t\t\t\t\t\t{slots.center}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{!!slots?.right && (\n\t\t\t\t\t<div className={cn('ms-auto flex min-w-0 max-w-full flex-wrap items-center justify-end gap-space-md [&>*]:max-w-full', rightClassName)}>\n\t\t\t\t\t\t{slots.right}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</header>\n\t);\n});\n\nHeader.displayName = 'Header';\n","/**\n * Header layout and partial types.\n *\n * This layer is intentionally framework-neutral: links and route state enter\n * through `renderLink`, and app-specific content enters through slots.\n */\nimport type { ComponentType, HTMLAttributes, ReactNode } from 'react';\n\nimport type { StringsProp } from '../../../lib/strings';\nimport type { SemanticTone } from '../../../lib/component-vocabulary';\n\nimport type {\n\tBreadcrumbItem,\n\tLayoutNavigationAdapter,\n\tLayoutUser,\n} from '../layout.types';\n\nexport interface HeaderBreadcrumbsProps extends LayoutNavigationAdapter {\n\t/** Trail entries, root first. */\n\tbreadcrumbs?: BreadcrumbItem[];\n\t/** Root entry prepended to the trail. */\n\thomeBreadcrumb?: BreadcrumbItem | null;\n\t/** Renders the sidebar collapse control. */\n\tshowSidebarTrigger?: boolean;\n\ttriggerSlot?: ReactNode;\n\tclassName?: string;\n}\n\nexport type NotificationTone = Extract<\n\tSemanticTone,\n\t'info' | 'success' | 'warning' | 'destructive'\n>;\n\nexport interface HeaderNotification {\n\tid: string | number;\n\t/** Surface title. */\n\ttitle: ReactNode;\n\t/** Supporting copy under the title. */\n\tdescription?: ReactNode;\n\ttime?: ReactNode;\n\tread?: boolean;\n\ttone?: NotificationTone;\n\t/** Destination for the entry, when it navigates. */\n\thref?: string;\n}\n\nexport interface HeaderNotificationsStrings {\n\ttriggerLabel: string;\n\theading: string;\n\tmarkAllRead: string;\n\tempty: string;\n\tviewAll: string;\n}\n\nexport const defaultHeaderNotificationsStrings: HeaderNotificationsStrings = {\n\ttriggerLabel: 'Notifications',\n\theading: 'Notifications',\n\tmarkAllRead: 'Mark all as read',\n\tempty: 'No new notifications',\n\tviewAll: 'View all notifications',\n};\n\nexport interface HeaderNotificationsProps extends LayoutNavigationAdapter {\n\t/** Notifications to list, newest first. */\n\tnotifications?: HeaderNotification[];\n\t/** Unread total shown on the trigger. */\n\tunreadCount?: number;\n\tonNotificationClick?: (notification: HeaderNotification) => void;\n\tonMarkAllRead?: () => void;\n\tonViewAll?: () => void;\n\t/** Destination for the view-all link. */\n\tviewAllHref?: string;\n\t/** Alignment of the shell's content. */\n\talign?: 'start' | 'center' | 'end';\n\t/** Which side of the trigger the surface opens on. */\n\tside?: 'top' | 'right' | 'bottom' | 'left';\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<HeaderNotificationsStrings>;\n\tclassName?: string;\n\t/** Merged onto the content region. */\n\tcontentClassName?: string;\n\t/** Replaces the default notification row. */\n\trenderNotification?: (notification: HeaderNotification) => ReactNode;\n}\n\nexport interface HeaderSearchStrings {\n\tplaceholder: string;\n\tshortcutMac: string;\n\tshortcutPc: string;\n}\n\nexport const defaultHeaderSearchStrings: HeaderSearchStrings = {\n\tplaceholder: 'Search...',\n\tshortcutMac: '⌘K',\n\tshortcutPc: 'Ctrl+K',\n};\n\nexport interface HeaderSearchProps {\n\tonOpen?: () => void;\n\t/** Modifier shown in the shortcut hint. Auto-detected when omitted. */\n\tshortcutModifier?: 'meta' | 'control';\n\t/** Binds the keyboard shortcut that opens search. */\n\tenableShortcut?: boolean;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<HeaderSearchStrings>;\n\tclassName?: string;\n\t/** Merged onto the icon. */\n\ticonClassName?: string;\n\t/** Replaces the shortcut hint shown in the trigger. */\n\tshortcutSlot?: ReactNode;\n}\n\nexport interface HeaderGlobalSearchTriggerProps extends HeaderSearchProps {\n\t/** Whether the surface is showing. Controlled. */\n\topen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n}\n\nexport interface HeaderToolButtonProps {\n\t/** Display label. */\n\tlabel: string;\n\t/** Leading glyph. */\n\ticon: ComponentType<{ className?: string }>;\n\t/** Marks the control as currently engaged. */\n\tactive?: boolean;\n\t/** Disables the control. */\n\tdisabled?: boolean;\n\t/** Chip rendered beside the label. */\n\tbadge?: ReactNode;\n\tonClick?: () => void;\n\tclassName?: string;\n\t/** Merged onto the icon. */\n\ticonClassName?: string;\n}\n\nexport interface HeaderToolPopoverProps {\n\t/** Display label. */\n\tlabel: string;\n\t/** Leading glyph. */\n\ticon: ComponentType<{ className?: string }>;\n\t/** Whether the surface is showing. Controlled. */\n\topen?: boolean;\n\t/** Whether the surface starts open, for uncontrolled use. */\n\tdefaultOpen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n\t/** Marks the control as currently engaged. */\n\tactive?: boolean;\n\t/** Disables the control. */\n\tdisabled?: boolean;\n\t/** Chip rendered beside the label. */\n\tbadge?: ReactNode;\n\t/** Alignment of the shell's content. */\n\talign?: 'start' | 'center' | 'end';\n\t/** Which side of the trigger the surface opens on. */\n\tside?: 'top' | 'right' | 'bottom' | 'left';\n\tsideOffset?: number;\n\tclassName?: string;\n\t/** Merged onto the trigger. */\n\ttriggerClassName?: string;\n\t/** Merged onto the content region. */\n\tcontentClassName?: string;\n\tchildren?: ReactNode;\n}\n\nexport interface HeaderUserMenuProps {\n\t/** The signed-in user shown in the menu. */\n\tuser: LayoutUser;\n\t/** Shows the signed-in email under the name. */\n\tshowEmail?: boolean;\n\t/** Extra content appended inside the menu. */\n\tcustomContent?: ReactNode;\n\tonProfile?: () => void;\n\tonSettings?: () => void;\n\tonLogout?: () => void;\n\t/** Alignment of the shell's content. */\n\talign?: 'start' | 'center' | 'end';\n\t/** Which side of the trigger the surface opens on. */\n\tside?: 'top' | 'right' | 'bottom' | 'left';\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<HeaderUserMenuStrings>;\n\t/** Merged onto the trigger. */\n\ttriggerClassName?: string;\n\t/** Merged onto the content region. */\n\tcontentClassName?: string;\n\t/** Replaces the default trigger element. */\n\trenderTrigger?: (user: LayoutUser) => ReactNode;\n}\n\nexport interface HeaderUserMenuStrings {\n\tprofile: string;\n\tsettings: string;\n\tlogout: string;\n}\n\nexport const defaultHeaderUserMenuStrings: HeaderUserMenuStrings = {\n\tprofile: 'Profile',\n\tsettings: 'Settings',\n\tlogout: 'Log out',\n};\n\nexport interface HeaderSlots {\n\t/** Leading brand/logo before breadcrumbs, visible from the 2xl/app-header container width (42rem by default). Use left for identity that must remain visible at narrow widths. */\n\tbrand?: ReactNode;\n\t/** Replaces the breadcrumb/sidebar-trigger region, rendered only while showBreadcrumbs is true. */\n\tbreadcrumbs?: ReactNode;\n\t/** Leading content after breadcrumbs; always rendered when supplied, including narrow container widths. The app owns compact content and overflow. */\n\tleft?: ReactNode;\n\t/** Optional center content, usually search, visible from the 3xl/app-header container width (48rem by default). Essential navigation needs a narrow-width alternative in left or right. */\n\tcenter?: ReactNode;\n\t/** Trailing content, usually tools/account actions; always rendered when supplied and wraps at narrow widths. Its children own their responsive behavior. */\n\tright?: ReactNode;\n}\n\nexport interface HeaderProps extends LayoutNavigationAdapter, HTMLAttributes<HTMLElement> {\n\t/** Renders the breadcrumb trail. */\n\tshowBreadcrumbs?: boolean;\n\t/** Trail entries, root first. */\n\tbreadcrumbs?: BreadcrumbItem[];\n\t/** Root entry prepended to the trail. */\n\thomeBreadcrumb?: BreadcrumbItem | null;\n\t/** Renders the sidebar collapse control. */\n\tshowSidebarTrigger?: boolean;\n\t/** Composes shell regions by container width: brand appears from 2xl/app-header (42rem default), center from 3xl/app-header (48rem default); left and right are always rendered when supplied. Keep essential narrow-width identity/navigation in left or right and supply compact/overflow behavior. */\n\tslots?: HeaderSlots;\n\tclassName?: string;\n\t/** Merged onto the content region. */\n\tcontentClassName?: string;\n\t/** Merged onto the leading region. */\n\tleftClassName?: string;\n\t/** Merged onto the centre region. */\n\tcenterClassName?: string;\n\trightClassName?: string;\n\tbreadcrumbsClassName?: string;\n}\n","/** HeaderSearch — framework-neutral search trigger with optional Cmd/Ctrl+K. */\nimport { useEffect, useState } from 'react';\nimport { Search } from 'lucide-react';\n\nimport { Button } from '../../../base/buttons';\nimport { Text } from '../../../typography';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\nimport { kbdRecipe } from '../../../../lib/surface-recipes';\n\nimport { useCommandShortcut } from '../../hooks';\nimport {\n\tdefaultHeaderSearchStrings,\n\ttype HeaderSearchProps,\n} from '../header.types';\n\nfunction detectMac(): boolean {\n\tif (typeof navigator === 'undefined') return false;\n\tconst ua = (navigator as Navigator & { userAgentData?: { platform?: string } }).userAgentData;\n\tif (ua?.platform) return ua.platform === 'macOS';\n\treturn /Mac|iPhone|iPad/.test(navigator.platform);\n}\n\nexport function HeaderSearch({\n\tonOpen,\n\tshortcutModifier,\n\tenableShortcut = true,\n\tstrings: stringsProp,\n\tclassName,\n\ticonClassName,\n\tshortcutSlot,\n}: HeaderSearchProps) {\n\tconst strings = useStrings(defaultHeaderSearchStrings, stringsProp);\n\tconst [detectedMac, setDetectedMac] = useState(false);\n\tuseEffect(() => {\n\t\tif (shortcutModifier === undefined) setDetectedMac(detectMac());\n\t}, [shortcutModifier]);\n\tconst resolvedModifier = shortcutModifier ?? (detectedMac ? 'meta' : 'control');\n\tconst isMetaShortcut = resolvedModifier === 'meta';\n\tuseCommandShortcut({ key: 'k', enabled: enableShortcut, onTrigger: onOpen });\n\n\tconst shortcutTitle = isMetaShortcut ? strings.shortcutMac : strings.shortcutPc;\n\tconst shortcut = shortcutSlot ?? (\n\t\t// The shared key cap; it appears once the trigger is wide enough to show it.\n\t\t<kbd className={cn('header-search--shortcut', kbdRecipe, 'hidden lg:inline-flex')}>\n\t\t\t{isMetaShortcut ? strings.shortcutMac : strings.shortcutPc}\n\t\t</kbd>\n\t);\n\n\treturn (\n\t\t<Button\n\t\t\tdata-component=\"header-search\"\n\t\t\tdata-slot=\"header-search-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-label={strings.placeholder}\n\t\t\ttone=\"secondary\"\n\t\t\tbuttonStyle=\"outline\"\n\t\t\tsize=\"md\"\n\t\t\tonClick={onOpen}\n\t\t\tclassName={cn(\n\t\t\t\t'header-search--component header-search--trigger h-action w-full min-w-0 justify-start gap-space-md rounded-radius px-control-sm text-foreground shadow-none transition-[background-color,border-color,color,box-shadow]',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\ttitle={shortcutTitle}\n\t\t>\n\t\t\t<Search data-slot=\"header-search-icon\" className={cn('header-search--icon size-icon shrink-0 text-muted-foreground', iconClassName)} aria-hidden=\"true\" />\n\t\t\t<Text tag=\"span\" size=\"inherit\" type=\"secondary\" data-slot=\"header-search-placeholder\" className=\"header-search--placeholder min-w-0 flex-1 truncate text-left\">\n\t\t\t\t{strings.placeholder}\n\t\t\t</Text>\n\t\t\t{shortcut}\n\t\t</Button>\n\t);\n}\n","/** HeaderGlobalSearchTrigger — header search trigger with controlled open callback. */\nimport { HeaderSearch } from './header-search';\nimport type { HeaderGlobalSearchTriggerProps } from '../header.types';\n\nexport function HeaderGlobalSearchTrigger({\n\tonOpen,\n\tonOpenChange,\n\t...props\n}: HeaderGlobalSearchTriggerProps) {\n\treturn (\n\t\t<HeaderSearch\n\t\t\t{...props}\n\t\t\tonOpen={() => {\n\t\t\t\tonOpen?.();\n\t\t\t\tonOpenChange?.(true);\n\t\t\t}}\n\t\t/>\n\t);\n}\n","/** HeaderToolButton — icon control for dense app headers. */\nimport * as React from 'react';\n\nimport { Button } from '../../../base/buttons';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport { headerCountBadge } from '../header.recipes';\nimport type { HeaderToolButtonProps } from '../header.types';\n\nexport const HeaderToolButton = React.forwardRef<\n\tHTMLButtonElement,\n\tHeaderToolButtonProps\n>((\n\t{\n\t\tlabel,\n\t\ticon: Icon,\n\t\tactive = false,\n\t\tdisabled = false,\n\t\tbadge,\n\t\tonClick,\n\t\tclassName,\n\t\ticonClassName,\n\t},\n\tref,\n) => (\n\t<Button\n\t\tref={ref}\n\t\tdata-component=\"header-tool-button\"\n\t\tdata-slot=\"header-tool-button\"\n\t\ttype=\"button\"\n\t\ttone=\"secondary\"\n\t\tbuttonStyle=\"ghost\"\n\t\tsize=\"md\" iconOnly\n\t\taria-label={label}\n\t\taria-pressed={active || undefined}\n\t\ttitle={label}\n\t\tdisabled={disabled}\n\t\tonClick={onClick}\n\t\tclassName={cn(\n\t\t\t'header-tool-button--component header-tool-button--trigger relative rounded-radius text-foreground transition-[background-color,color,box-shadow] hover:bg-accent hover:text-accent-foreground',\n\t\t\tactive && 'bg-accent text-accent-foreground',\n\t\t\tclassName,\n\t\t)}\n\t>\n\t\t<Icon\n\t\t\tdata-slot=\"header-tool-icon\"\n\t\t\tclassName={cn('header-tool-button--icon size-icon', iconClassName)}\n\t\t\taria-hidden=\"true\"\n\t\t/>\n\t\t{!!badge && (\n\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" lineHeight=\"none\" data-slot=\"header-tool-badge\" className={cn('header-tool-button--badge', headerCountBadge)}>\n\t\t\t\t{badge}\n\t\t\t</Text>\n\t\t)}\n\t\t<Text tag=\"span\" size=\"inherit\" className=\"sr-only\">{label}</Text>\n\t</Button>\n));\n\nHeaderToolButton.displayName = 'HeaderToolButton';\n","/** HeaderToolPopover — controlled header icon trigger plus popover content. */\nimport {\n\tPopover,\n\tPopoverContent,\n\tPopoverTrigger,\n} from '../../../base/popover';\nimport { cn } from '../../../../lib/utils';\n\nimport type { HeaderToolPopoverProps } from '../header.types';\nimport { HeaderToolButton } from './header-tool-button';\nimport { popoverWidthRecipes } from '../../../base/popover/popover.recipes';\n\nexport function HeaderToolPopover({\n\tlabel,\n\ticon,\n\topen,\n\tdefaultOpen,\n\tonOpenChange,\n\tactive,\n\tdisabled,\n\tbadge,\n\talign = 'end',\n\tside = 'bottom',\n\tsideOffset = 8,\n\tclassName,\n\ttriggerClassName,\n\tcontentClassName,\n\tchildren,\n}: HeaderToolPopoverProps) {\n\treturn (\n\t\t<Popover\n\t\t\topen={open}\n\t\t\tdefaultOpen={defaultOpen}\n\t\t\tonOpenChange={onOpenChange}\n\t\t>\n\t\t\t<PopoverTrigger asChild>\n\t\t\t\t<HeaderToolButton\n\t\t\t\t\tlabel={label}\n\t\t\t\t\ticon={icon}\n\t\t\t\t\tactive={active ?? open}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tbadge={badge}\n\t\t\t\t\tclassName={triggerClassName}\n\t\t\t\t/>\n\t\t\t</PopoverTrigger>\n\t\t\t<PopoverContent\n\t\t\t\tdata-component=\"header-tool-popover\"\n\t\t\t\tdata-slot=\"header-tool-popover-content\"\n\t\t\t\talign={align}\n\t\t\t\tside={side}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'header-tool-popover--component',\n\t\t\t\t\tpopoverWidthRecipes.lg,\n\t\t\t\t\tclassName,\n\t\t\t\t\tcontentClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n","/** HeaderUserMenu — avatar/name trigger with consumer-wired menu callbacks. */\nimport type { ReactElement } from 'react';\n\nimport { ChevronsUpDown, LogOut, Settings, User } from 'lucide-react';\n\nimport { ActionMenu, type ActionMenuAction } from '../../../base/action-menu';\nimport { Avatar, AvatarFallback, AvatarImage } from '../../../base/avatar';\nimport { Button } from '../../../base/buttons';\nimport { formatInitials } from '../../../primitives/initials-format';\nimport { Text } from '../../../typography';\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuTrigger,\n} from '../../../base/navigation/dropdown-menu';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport {\n\tdefaultHeaderUserMenuStrings,\n\ttype HeaderUserMenuProps,\n} from '../header.types';\n\nexport function HeaderUserMenu({\n\tuser,\n\tshowEmail = true,\n\tcustomContent,\n\tonProfile,\n\tonSettings,\n\tonLogout,\n\talign = 'end',\n\tside = 'bottom',\n\tstrings: stringsProp,\n\ttriggerClassName,\n\tcontentClassName,\n\trenderTrigger,\n}: HeaderUserMenuProps) {\n\tconst strings = useStrings(defaultHeaderUserMenuStrings, stringsProp);\n\tconst initials = formatInitials(user.name, { strategy: 'first-words' });\n\tconst twoLineIdentity = showEmail && !!user.email;\n\n\t// Profile and settings sit together; sign-out is held apart by a rule with\n\t// no caption, which is what `group: true` is for.\n\tconst actions: ActionMenuAction[] = [\n\t\t...(onProfile ? [{ id: 'profile', label: strings.profile, icon: User, onClick: onProfile }] : []),\n\t\t...(onSettings ? [{ id: 'settings', label: strings.settings, icon: Settings, onClick: onSettings }] : []),\n\t\t...(onLogout\n\t\t\t? [{\n\t\t\t\tid: 'logout',\n\t\t\t\tlabel: strings.logout,\n\t\t\t\ticon: LogOut,\n\t\t\t\tonClick: onLogout,\n\t\t\t\t...(onProfile || onSettings ? { group: true as const } : null),\n\t\t\t}]\n\t\t\t: []),\n\t];\n\n\tconst trigger = renderTrigger?.(user) ?? (\n\t\t<Button\n\t\t\tdata-component=\"header-user-menu\"\n\t\t\tdata-slot=\"header-user-menu-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-label={user.name}\n\t\t\ttone=\"secondary\"\n\t\t\tbuttonStyle=\"ghost\"\n\t\t\t// A one-line identity shares the header control height; name plus email needs the taller action.\n\t\t\tsize={twoLineIdentity ? 'lg' : 'md'}\n\t\t\tclassName={cn(\n\t\t\t\t'header-user-menu--component header-user-menu--trigger group min-w-0 max-w-56 justify-start gap-space-md text-foreground shadow-none hover:bg-accent hover:text-accent-foreground data-[state=open]:bg-accent',\n\t\t\t\t!twoLineIdentity && 'h-action',\n\t\t\t\t// The identity follows the space its header row offers (the nearest container's\n\t\t\t\t// content box, with the viewport as the fallback): narrow rows keep the avatar control.\n\t\t\t\t'max-sm:size-action max-sm:justify-center max-sm:p-0 max-sm:[&_.header-user-menu--identity]:hidden max-sm:[&_.header-user-menu--chevron]:hidden',\n\t\t\t\t'@max-md:size-action @max-md:justify-center @max-md:p-0 @max-md:[&_.header-user-menu--identity]:hidden @max-md:[&_.header-user-menu--chevron]:hidden',\n\t\t\t\ttriggerClassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Avatar data-slot=\"header-user-avatar\" className=\"header-user-menu--avatar size-avatar-sm overflow-hidden rounded-full ring-1 ring-border\">\n\t\t\t\t{!!user.avatar && <AvatarImage src={user.avatar} alt={user.name} />}\n\t\t\t\t<AvatarFallback className=\"rounded-full bg-muted text-xs font-semibold text-muted-foreground\">\n\t\t\t\t\t{initials}\n\t\t\t\t</AvatarFallback>\n\t\t\t</Avatar>\n\t\t\t<div data-slot=\"header-user-identity\" className=\"header-user-menu--identity grid min-w-0 flex-1 gap-dense text-start leading-none\">\n\t\t\t\t<Text type=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"truncate\">{user.name}</Text>\n\t\t\t\t{twoLineIdentity && (\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" lineHeight=\"tight\" className=\"truncate\">{user.email}</Text>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<ChevronsUpDown className=\"header-user-menu--chevron size-icon-sm shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n\t\t</Button>\n\t);\n\n\tconst contentClasses = cn(\n\t\t'header-user-menu--content w-(--anchor-width) min-w-56 rounded-surface',\n\t\tcontentClassName,\n\t);\n\n\t// `customContent` replaces the menu body wholesale, which is a plain\n\t// dropdown rather than a list of commands — ActionMenu is deliberately not\n\t// that, so this path stays on the primitive it actually needs.\n\tif (customContent) {\n\t\treturn (\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger render={trigger as ReactElement} />\n\t\t\t\t<DropdownMenuContent\n\t\t\t\t\tdata-component=\"header-user-menu-content\"\n\t\t\t\t\tdata-slot=\"header-user-menu-content\"\n\t\t\t\t\tclassName={contentClasses}\n\t\t\t\t\talign={align}\n\t\t\t\t\tside={side}\n\t\t\t\t>\n\t\t\t\t\t{customContent}\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t);\n\t}\n\n\treturn (\n\t\t<ActionMenu\n\t\t\tactions={actions}\n\t\t\talign={align}\n\t\t\tside={side}\n\t\t\tcontentClassName={contentClasses}\n\t\t\twidth=\"w-auto\"\n\t\t\tcloseOnSelect\n\t\t\trenderTrigger={trigger as ReactElement}\n\t\t/>\n\t);\n}\n","/** HeaderNotifications — bell dropdown for consumer-supplied notifications. */\nimport type { ReactElement } from 'react';\n\nimport { Bell } from 'lucide-react';\n\nimport { Button } from '../../../base/buttons';\nimport { Stack } from '../../../base/structure';\nimport { DisplayLabel, Text } from '../../../typography';\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuGroup,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuLinkItem,\n\tDropdownMenuSeparator,\n\tDropdownMenuTrigger,\n} from '../../../base/navigation/dropdown-menu';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { useLayoutLinkRenderer } from '../../hooks';\nimport {\n\tdefaultHeaderNotificationsStrings,\n\ttype HeaderNotification,\n\ttype HeaderNotificationsProps,\n\ttype NotificationTone,\n} from '../header.types';\nimport { popoverWidthRecipes } from '../../../base/popover/popover.recipes';\nimport { headerCountBadge } from '../header.recipes';\nimport { dotRecipes } from '../../../../lib/tone-recipes';\n\nconst NOTIFICATION_TONE_CLASSNAMES: Record<NotificationTone, string> = {\n\tinfo: 'bg-info',\n\tsuccess: 'bg-success',\n\twarning: 'bg-warning',\n\tdestructive: 'bg-destructive',\n};\n\nexport function HeaderNotifications({\n\tnotifications = [],\n\tunreadCount = 0,\n\tonNotificationClick,\n\tonMarkAllRead,\n\tonViewAll,\n\tviewAllHref,\n\trenderLink,\n\talign = 'end',\n\tside = 'bottom',\n\tstrings: stringsProp,\n\tclassName,\n\tcontentClassName,\n\trenderNotification,\n}: HeaderNotificationsProps) {\n\tconst strings = useStrings(defaultHeaderNotificationsStrings, stringsProp);\n\tconst resolvedRenderLink = useLayoutLinkRenderer({ renderLink });\n\tconst badgeText = unreadCount > 99 ? '99+' : String(unreadCount);\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger\n\t\t\t\trender={\n\t\t\t\t\t<Button\n\t\t\t\t\t\tdata-component=\"header-notifications\"\n\t\t\t\t\t\tdata-slot=\"header-notifications-trigger\"\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\tsize=\"md\" iconOnly\n\t\t\t\t\t\taria-label={strings.triggerLabel}\n\t\t\t\t\t\tclassName={cn('header-notifications--component header-notifications--trigger relative', className)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Bell className=\"size-icon\" aria-hidden=\"true\" />\n\t\t\t\t\t\t{unreadCount > 0 && (\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" lineHeight=\"none\" data-slot=\"header-notifications-badge\" className={cn('header-notifications--badge', headerCountBadge)}>\n\t\t\t\t\t\t\t\t{badgeText}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Button>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<DropdownMenuContent\n\t\t\t\tdata-component=\"header-notifications-content\"\n\t\t\t\tdata-slot=\"header-notifications-content\"\n\t\t\t\tclassName={cn('header-notifications--content', popoverWidthRecipes.lg, contentClassName)}\n\t\t\t\talign={align}\n\t\t\t\tside={side}\n\t\t\t>\n\t\t\t\t<DropdownMenuGroup>\n\t\t\t\t\t<DropdownMenuLabel aria-hidden={false} className=\"header-notifications--label flex items-center justify-between gap-space-lg text-inherit\">\n\t\t\t\t\t\t<DisplayLabel className=\"text-inherit\">{strings.heading}</DisplayLabel>\n\t\t\t\t\t\t{unreadCount > 0 && !!onMarkAllRead && (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tonClick={onMarkAllRead}\n\t\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{strings.markAllRead}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</DropdownMenuLabel>\n\t\t\t\t\t<DropdownMenuSeparator />\n\n\t\t\t\t\t{notifications.length === 0 ? (\n\t\t\t\t\t\t<div className=\"header-notifications--empty p-surface text-center\">\n\t\t\t\t\t\t\t<Text type=\"secondary\">{strings.empty}</Text>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Stack gap=\"xs\" className=\"header-notifications--list\">\n\t\t\t\t\t\t\t{notifications.map((notification) => (\n\t\t\t\t\t\t\t\t<NotificationRow\n\t\t\t\t\t\t\t\t\tkey={notification.id}\n\t\t\t\t\t\t\t\t\tnotification={notification}\n\t\t\t\t\t\t\t\t\tonClick={onNotificationClick}\n\t\t\t\t\t\t\t\t\trenderLink={resolvedRenderLink}\n\t\t\t\t\t\t\t\t\trenderNotification={renderNotification}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t)}\n\t\t\t\t</DropdownMenuGroup>\n\n\t\t\t\t{!!(onViewAll || viewAllHref) && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<DropdownMenuSeparator />\n\t\t\t\t\t\t{viewAllHref ? (\n\t\t\t\t\t\t\t<DropdownMenuLinkItem\n\t\t\t\t\t\t\t\thref={viewAllHref}\n\t\t\t\t\t\t\t\trender={(props) =>\n\t\t\t\t\t\t\t\t\tresolvedRenderLink({\n\t\t\t\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\t\t\t\thref: viewAllHref,\n\t\t\t\t\t\t\t\t\t\tchildren: props.children,\n\t\t\t\t\t\t\t\t\t}) as ReactElement\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{strings.viewAll}\n\t\t\t\t\t\t\t</DropdownMenuLinkItem>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<DropdownMenuItem onClick={onViewAll}>{strings.viewAll}</DropdownMenuItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n\nfunction NotificationRow({\n\tnotification,\n\tonClick,\n\trenderLink,\n\trenderNotification,\n}: {\n\tnotification: HeaderNotification;\n\tonClick?: (n: HeaderNotification) => void;\n\trenderLink: NonNullable<HeaderNotificationsProps['renderLink']>;\n\t/** Replaces the default notification row. */\n\trenderNotification?: HeaderNotificationsProps['renderNotification'];\n}) {\n\tif (renderNotification) return renderNotification(notification);\n\n\tconst content = (\n\t\t<Stack direction=\"horizontal\" align=\"start\" wrap={false} gap=\"sm\" className=\"header-notifications--item-content\">\n\t\t\t{!!notification.tone && (\n\t\t\t\t<span\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tdata-tone={notification.tone}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'header-notifications--tone mt-space-sm',\n\t\t\t\t\t\t\t\t\tdotRecipes.marker,\n\t\t\t\t\t\tNOTIFICATION_TONE_CLASSNAMES[notification.tone],\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<Stack gap=\"dense\" className=\"min-w-0\">\n\t\t\t\t<Text type=\"inherit\" weight=\"medium\">{notification.title}</Text>\n\t\t\t\t{!!notification.description && <Text size=\"xs\" type=\"secondary\">{notification.description}</Text>}\n\t\t\t\t{!!notification.time && <Text size=\"xs\" type=\"secondary\">{notification.time}</Text>}\n\t\t\t</Stack>\n\t\t</Stack>\n\t);\n\n\tconst className = cn(\n\t\t'header-notifications--item items-start',\n\t\t!notification.read && 'bg-muted text-muted-foreground',\n\t);\n\n\tif (notification.href) {\n\t\treturn (\n\t\t\t<DropdownMenuLinkItem\n\t\t\t\thref={notification.href}\n\t\t\t\tclassName={className}\n\t\t\t\tonClick={() => onClick?.(notification)}\n\t\t\t\trender={(props) =>\n\t\t\t\t\trenderLink({\n\t\t\t\t\t\t...props,\n\t\t\t\t\t\thref: notification.href,\n\t\t\t\t\t\tchildren: props.children,\n\t\t\t\t\t}) as ReactElement\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t{content}\n\t\t\t</DropdownMenuLinkItem>\n\t\t);\n\t}\n\n\treturn (\n\t\t<DropdownMenuItem onClick={() => onClick?.(notification)} className={className}>\n\t\t\t{content}\n\t\t</DropdownMenuItem>\n\t);\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"item-DjCcM18E.js","names":["ItemGroup","ItemSeparator","React","Item","ItemMedia","ItemContent","ItemTitle","ItemDescription","ItemActions","ItemHeader","ItemFooter","_Fragment","BaseItem","BaseItemGroup","BaseItemSeparator","BaseItemMedia","BaseItemContent","BaseItemActions","BaseItemHeader","BaseItemFooter","BaseItemTitle","BaseItemDescription","resolveComponentScale","useDensityConfig","useItemConfig","cn","Separator","Text","RunningTextContext","copyRoleProps","focusRecipes","ICON_DESCENDANT_SIZE_CLASSNAMES","rowBlockPaddingClasses","compositionClasses","React$1","Fragment$1","ItemGroup$1","props","className","ItemSeparator$1","itemVariants","cva","ItemPhrasingContext","usePartTagName","tagName","Item$1","element","useRender","mergeProps","render","itemMediaVariants","ItemMedia$1","ItemContent$1","ItemTitle$1","ItemDescription$1","ItemActions$1","ItemHeader$1","ItemFooter$1","Item","forwardRef","convenienceMode","itemProps","resolvedSize","size","defaultScale","primitiveSize","resolvedVariant","variant","defaultVariant","textSizeClass","paddingClass","padding","flushEdgeClass","borderClass","resolvedChildren","media","ItemMedia","mediaVariant","ItemContent","ItemTitle","titleBold","title","description","ItemDescription","descriptionClamp","trailing","actions","ItemActions","children","density","ItemGroup","ItemSeparator","baseVariant","iconClass","textGap","ItemHeader","ItemFooter","isSimpleText","bold","CLAMP_CLASS","clamp"],"sources":["../src/components/ui/item.tsx","../src/components/base/item/item.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\nimport { rowBlockPaddingClasses } from \"../../lib/row-recipes\"\nimport { Separator } from \"./separator\"\nimport { focusRecipes } from \"../../lib/focus-recipes\"\n\nfunction ItemGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n role=\"list\"\n data-slot=\"item-group\"\n className={cn(\n \"group/item-group flex w-full flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"item-separator\"\n orientation=\"horizontal\"\n className={cn(\"my-space-md\", className)}\n {...props}\n />\n )\n}\n\nconst itemVariants = cva(\n `group/item flex w-full flex-wrap items-center rounded-radius border text-sm transition-colors outline-none ${focusRecipes.frame} [a]:transition-colors [a]:hover:bg-accent [a]:hover:text-accent-foreground`,\n {\n variants: {\n variant: {\n default: \"border-transparent\",\n outline: \"border-border\",\n muted: \"border-transparent bg-muted/50\",\n },\n size: {\n default: cn(\"gap-space-lg px-row-x\", rowBlockPaddingClasses.comfortable),\n sm: cn(\"gap-space-lg px-row-x\", rowBlockPaddingClasses.default),\n xs: cn(\"gap-space-md px-row-x in-data-[slot=dropdown-menu-content]:p-0\", rowBlockPaddingClasses.compact),\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\n// An Item rendered as a button or link may hold phrasing content only, so its\n// parts render as spans there. Their classes set their display, so the layout\n// is the same either way.\nconst ItemPhrasingContext = React.createContext(false)\n\nfunction usePartTagName(tagName: \"div\" | \"p\") {\n return React.useContext(ItemPhrasingContext) ? \"span\" : tagName\n}\n\nfunction Item({\n className,\n variant = \"default\",\n size = \"default\",\n render,\n ...props\n}: useRender.ComponentProps<\"div\"> & VariantProps<typeof itemVariants>) {\n const element = useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(\n {\n className: cn(itemVariants({ variant, size, className })),\n },\n props\n ),\n render,\n state: {\n slot: \"item\",\n variant,\n size,\n },\n })\n\n return (\n <ItemPhrasingContext.Provider value={render !== undefined}>\n {element}\n </ItemPhrasingContext.Provider>\n )\n}\n\nconst itemMediaVariants = cva(\n \"flex shrink-0 items-center justify-center gap-space-md group-has-data-[slot=item-description]/item:translate-y-0.5 group-has-data-[slot=item-description]/item:self-start [&_svg]:pointer-events-none\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n icon: \"[&_svg:not([class*='size-'])]:size-icon\",\n image:\n \"size-10 overflow-hidden rounded-radius group-data-[size=sm]/item:size-8 group-data-[size=xs]/item:size-6 group-data-[size=xs]/item:rounded-radius [&_img]:size-full [&_img]:object-cover\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction ItemMedia({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof itemMediaVariants>) {\n return useRender({\n defaultTagName: usePartTagName(\"div\"),\n props: mergeProps<\"div\">(\n {\n className: cn(itemMediaVariants({ variant, className })),\n },\n props\n ),\n state: { slot: \"item-media\", variant },\n })\n}\n\nfunction ItemContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return useRender({\n defaultTagName: usePartTagName(\"div\"),\n props: mergeProps<\"div\">(\n {\n className: cn(\n \"flex flex-1 flex-col [&+[data-slot=item-content]]:flex-none\",\n className\n ),\n },\n props\n ),\n state: { slot: \"item-content\" },\n })\n}\n\nfunction ItemTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return useRender({\n defaultTagName: usePartTagName(\"div\"),\n props: mergeProps<\"div\">(\n {\n className: cn(\n \"line-clamp-1 flex w-fit items-center gap-space-md text-sm leading-snug font-medium underline-offset-4\",\n className\n ),\n },\n props\n ),\n state: { slot: \"item-title\" },\n })\n}\n\nfunction ItemDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return useRender({\n defaultTagName: usePartTagName(\"p\"),\n props: mergeProps<\"p\">(\n {\n className: cn(\n \"m-0 line-clamp-2 text-start text-sm font-normal text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n ),\n },\n props\n ),\n state: { slot: \"item-description\" },\n })\n}\n\nfunction ItemActions({ className, ...props }: React.ComponentProps<\"div\">) {\n return useRender({\n defaultTagName: usePartTagName(\"div\"),\n props: mergeProps<\"div\">(\n {\n className: cn(\"flex items-center\", className),\n },\n props\n ),\n state: { slot: \"item-actions\" },\n })\n}\n\nfunction ItemHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return useRender({\n defaultTagName: usePartTagName(\"div\"),\n props: mergeProps<\"div\">(\n {\n className: cn(\n \"flex basis-full items-center justify-between gap-space-md\",\n className\n ),\n },\n props\n ),\n state: { slot: \"item-header\" },\n })\n}\n\nfunction ItemFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return useRender({\n defaultTagName: usePartTagName(\"div\"),\n props: mergeProps<\"div\">(\n {\n className: cn(\n \"flex basis-full items-center justify-between gap-space-md\",\n className\n ),\n },\n props\n ),\n state: { slot: \"item-footer\" },\n })\n}\n\nexport {\n Item,\n ItemMedia,\n ItemContent,\n ItemActions,\n ItemGroup,\n ItemSeparator,\n ItemTitle,\n ItemDescription,\n ItemHeader,\n ItemFooter,\n}\n","/**\n * Item — base wrapper around the shadcn `Item` primitive.\n *\n * Why this wrapper exists (rules 1, 8, 12, 17):\n * - Resolves `size` and `variant` against `<UIProvider>` (`useItemConfig()`),\n * so consumers set library-wide density once.\n * - Routes `ItemTitle` / `ItemDescription` text through our `<Text>` typography\n * so a title is always `weight=\"semibold\"` and secondary copy follows the\n * shared control/display tokens — no rogue `<div className=\"text-sm font-medium\">`\n * blobs at call sites.\n * - Re-exports every compound part untouched, so `<Item>` keeps working as a\n * drop-in replacement for hand-rolled \"icon-left + text-stack + actions\" rows.\n *\n * Layer rule: import from `@/components/base/item`, never from `@/components/ui/item`.\n */\nimport { forwardRef, type ComponentRef } from 'react';\n\nimport {\n\tItem as BaseItem,\n\tItemActions as BaseItemActions,\n\tItemContent as BaseItemContent,\n\tItemDescription as BaseItemDescription,\n\tItemFooter as BaseItemFooter,\n\tItemGroup as BaseItemGroup,\n\tItemHeader as BaseItemHeader,\n\tItemMedia as BaseItemMedia,\n\tItemSeparator as BaseItemSeparator,\n\tItemTitle as BaseItemTitle,\n} from '../../ui/item';\nimport { ICON_DESCENDANT_SIZE_CLASSNAMES } from '../display/icon-size';\nimport { Text } from '../../typography';\nimport { RunningTextContext } from '../../typography/running-text';\nimport { useDensityConfig, useItemConfig } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { cn } from '../../../lib/utils';\nimport {compositionClasses} from '../structure/composition.recipes';\nimport {copyRoleProps} from '../../typography/text.styles';\nimport { rowBlockPaddingClasses } from '../../../lib/row-recipes';\nimport { focusRecipes } from '../../../lib/focus-recipes';\n\nimport type {\n\tItemActionsProps,\n\tItemContentProps,\n\tItemDescriptionProps,\n\tItemFooterProps,\n\tItemGroupProps,\n\tItemHeaderProps,\n\tItemMediaProps,\n\tItemProps,\n\tItemTitleProps,\n} from './item.types';\n\nconst Item = forwardRef<ComponentRef<typeof BaseItem>, ItemProps>(function Item(\n\titemProps,\n\tref,\n) {\n\tconst convenienceMode = 'title' in itemProps;\n\tconst {\n\t\tsize,\n\t\tdensity = 'default',\n\t\tvariant,\n\t\tpadding = 'none',\n\t\ttextGap = 'dense',\n\t\trender,\n\t\tclassName,\n\t\tchildren,\n\t\tmedia,\n\t\tmediaVariant,\n\t\ttitle,\n\t\tdescription,\n\t\ttrailing,\n\t\tactions,\n\t\ttitleBold,\n\t\tdescriptionClamp,\n\t\t...props\n\t} = itemProps;\n\tconst { defaultVariant = 'default' } = useItemConfig();\n\tconst { defaultScale } = useDensityConfig();\n\tconst resolvedSize = resolveComponentScale(size, defaultScale);\n\tconst primitiveSize = resolvedSize === 'sm' ? 'xs' : 'sm';\n\tconst resolvedVariant = variant ?? defaultVariant;\n\tconst textSizeClass = resolvedSize === 'sm' ? 'text-pxs' : resolvedSize === 'lg' ? 'text-base' : 'text-sm';\n\tconst paddingClass = padding === 'default' ? 'px-row-x' : 'px-0';\n\t// A plain flush row draws no box, so in a group its outer edges sit on the group's\n\t// edges and the parent's gap or surface padding owns the space around the list.\n\tconst flushEdgeClass = resolvedVariant === 'default' && padding === 'none'\n\t\t? 'in-data-[slot=item-group]:first:pt-0 in-data-[slot=item-group]:last:pb-0'\n\t\t: undefined;\n\t// The default variant draws no box; a transparent 1px border only nudged its text off the shared edge.\n\t// Without a border, an interactive row draws its focus edge inset instead.\n\tconst borderClass = resolvedVariant === 'default' ? `border-0 ${focusRecipes.edge}` : undefined;\n\tconst resolvedChildren = convenienceMode ? (\n\t\t<>\n\t\t\t{media != null ? <ItemMedia variant={mediaVariant}>{media}</ItemMedia> : null}\n\t\t\t<ItemContent textGap={textGap} className=\"basis-48\">\n\t\t\t\t<ItemTitle bold={titleBold}>{title}</ItemTitle>\n\t\t\t\t{description != null ? (\n\t\t\t\t\t<ItemDescription clamp={descriptionClamp}>{description}</ItemDescription>\n\t\t\t\t) : null}\n\t\t\t</ItemContent>\n\t\t\t{trailing != null || actions != null ? (\n\t\t\t\t<ItemActions>\n\t\t\t\t\t{trailing}\n\t\t\t\t\t{actions}\n\t\t\t\t</ItemActions>\n\t\t\t) : null}\n\t\t</>\n\t) : children;\n\treturn (\n\t\t<BaseItem\n\t\t\tref={ref}\n\t\t\tsize={primitiveSize}\n\t\t\tvariant={resolvedVariant}\n\t\t\trender={render}\n\t\t\tclassName={cn(\n\t\t\t\t'item--component box-border font-sans gap-space-lg rounded-radius',\n\t\t\t\trowBlockPaddingClasses[density],\n\t\t\t\tpaddingClass,\n\t\t\t\tflushEdgeClass,\n\t\t\t\tborderClass,\n\t\t\t\ttextSizeClass,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{resolvedChildren}\n\t\t</BaseItem>\n\t);\n});\nItem.displayName = 'Item';\n\nconst ItemGroup = forwardRef<ComponentRef<typeof BaseItemGroup>, ItemGroupProps>(function ItemGroup(\n\t{ className, role, ...props },\n\tref,\n) {\n\treturn (\n\t\t<BaseItemGroup\n\t\t\tref={ref}\n\t\t\trole={role}\n\t\t\t// Boxed rows (outline/muted) keep a small gap between boxes, including when a\n\t\t\t// plain row sits beside them. A group of plain rows only touches, so their own\n\t\t\t// density padding is the only space between them.\n\t\t\tclassName={cn('item-group--component gap-space-sm has-[>[data-slot=item][data-variant=default]]:not-has-[>[data-slot=item]:not([data-variant=default])]:gap-0', className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nItemGroup.displayName = 'ItemGroup';\n\nconst ItemSeparator = forwardRef<\n\tComponentRef<typeof BaseItemSeparator>,\n\tParameters<typeof BaseItemSeparator>[0]\n>(function ItemSeparator({ className, ...props }, ref) {\n\treturn <BaseItemSeparator ref={ref} className={cn('item--separator', className)} {...props} />;\n});\nItemSeparator.displayName = 'ItemSeparator';\n\nconst ItemMedia = forwardRef<ComponentRef<typeof BaseItemMedia>, ItemMediaProps>(function ItemMedia(\n\t{ variant = 'default', className, ...props },\n\tref,\n) {\n\tconst baseVariant = variant === 'image' || variant === 'avatar' ? 'image' : 'default';\n\tconst iconClass =\n\t\tvariant === 'icon'\n\t\t\t? cn(\n\t\t\t\t\tICON_DESCENDANT_SIZE_CLASSNAMES.md,\n\t\t\t\t\t\"group-data-[size=xs]/item:[&_svg:not([class*='size-'])]:size-icon-sm\",\n\t\t\t\t)\n\t\t\t: undefined;\n\tconst avatarClass =\n\t\tvariant === 'avatar'\n\t\t\t? 'rounded-full group-data-[size=sm]/item:rounded-full group-data-[size=xs]/item:rounded-full'\n\t\t\t: undefined;\n\treturn (\n\t\t<BaseItemMedia\n\t\t\tref={ref}\n\t\t\tvariant={baseVariant}\n\t\t\tclassName={cn(\n\t\t\t\t'item--media',\n\t\t\t\t'group-has-data-[slot=item-description]/item:translate-y-0',\n\t\t\t\ticonClass,\n\t\t\t\tavatarClass,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nItemMedia.displayName = 'ItemMedia';\n\nconst ItemContent = forwardRef<ComponentRef<typeof BaseItemContent>, ItemContentProps>(function ItemContent(\n\t{ className, textGap = 'dense', ...props },\n\tref,\n) {\n\treturn (\n\t\t<BaseItemContent\n\t\t\tref={ref}\n\t\t\tclassName={cn('item--content min-w-0', textGap === 'dense' ? 'gap-dense group-data-[size=xs]/item:gap-dense' : 'gap-normal group-data-[size=xs]/item:gap-normal', className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nItemContent.displayName = 'ItemContent';\n\nconst ItemActions = forwardRef<ComponentRef<typeof BaseItemActions>, ItemActionsProps>(function ItemActions(\n\t{ className, ...props },\n\tref,\n) {\n\treturn <BaseItemActions ref={ref} className={cn('item--actions max-w-full flex-wrap shrink-0', compositionClasses.compactActions, className)} {...props} />;\n});\nItemActions.displayName = 'ItemActions';\n\nconst ItemHeader = forwardRef<ComponentRef<typeof BaseItemHeader>, ItemHeaderProps>(function ItemHeader(\n\t{ className, ...props },\n\tref,\n) {\n\treturn <BaseItemHeader ref={ref} className={cn('item--header', className)} {...props} />;\n});\nItemHeader.displayName = 'ItemHeader';\n\nconst ItemFooter = forwardRef<ComponentRef<typeof BaseItemFooter>, ItemFooterProps>(function ItemFooter(\n\t{ className, ...props },\n\tref,\n) {\n\treturn <BaseItemFooter ref={ref} className={cn('item--footer', className)} {...props} />;\n});\nItemFooter.displayName = 'ItemFooter';\n\nconst ItemTitle = forwardRef<ComponentRef<typeof BaseItemTitle>, ItemTitleProps>(function ItemTitle(\n\t{ bold = true, className, children, ...props },\n\tref,\n) {\n\tconst isSimpleText = typeof children === 'string' || typeof children === 'number' || typeof children === 'bigint';\n\treturn (\n\t\t<BaseItemTitle\n\t\t\tref={ref}\n\t\t\tclassName={cn('item--title min-w-0 max-w-full overflow-hidden m-0 text-inherit [&>p]:m-0 [&>p]:text-start', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{isSimpleText ? (\n\t\t\t\t// The title is a flex row, where text-overflow has no effect: the text itself\n\t\t\t\t// shrinks and ends in an ellipsis instead of clipping a long token mid-glyph.\n\t\t\t\t<Text {...copyRoleProps.primary} tag=\"span\" size=\"inherit\" weight={bold ? 'semibold' : 'regular'} lineHeight=\"tight\" className=\"min-w-0 overflow-hidden text-ellipsis text-inherit\">\n\t\t\t\t\t{children}\n\t\t\t\t</Text>\n\t\t\t) : <RunningTextContext.Provider value>{children}</RunningTextContext.Provider>}\n\t\t</BaseItemTitle>\n\t);\n});\nItemTitle.displayName = 'ItemTitle';\n\nconst CLAMP_CLASS: Record<NonNullable<ItemDescriptionProps['clamp']>, string> = {\n\t1: 'line-clamp-1',\n\t2: 'line-clamp-2',\n\t3: 'line-clamp-3',\n\t4: 'line-clamp-4',\n\tnone: 'line-clamp-none',\n};\n\nconst ItemDescription = forwardRef<ComponentRef<typeof BaseItemDescription>, ItemDescriptionProps>(\n\tfunction ItemDescription({ clamp = 2, className, children, ...props }, ref) {\n\t\tconst isSimpleText = typeof children === 'string' || typeof children === 'number' || typeof children === 'bigint';\n\t\treturn (\n\t\t\t<BaseItemDescription\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'item--description',\n\t\t\t\t\t'm-0',\n\t\t\t\t\t!isSimpleText && 'text-xs text-muted-foreground leading-tight',\n\t\t\t\t\tCLAMP_CLASS[clamp],\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{isSimpleText ? (\n\t\t\t\t\t<Text {...copyRoleProps.supporting} tag=\"span\" lineHeight=\"tight\">\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</Text>\n\t\t\t\t) : <RunningTextContext.Provider value>{children}</RunningTextContext.Provider>}\n\t\t\t</BaseItemDescription>\n\t\t);\n\t},\n);\nItemDescription.displayName = 'ItemDescription';\n\nexport {\n\tItem,\n\tItemGroup,\n\tItemSeparator,\n\tItemMedia,\n\tItemContent,\n\tItemTitle,\n\tItemDescription,\n\tItemActions,\n\tItemHeader,\n\tItemFooter,\n};\n"],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- "use client";
2
- import { jsx as e } from "react/jsx-runtime";
3
- //#region src/components/layout/layout.types.tsx
4
- var t = ({ href: t, children: n, active: r, disabled: i, external: a, rel: o, target: s, ...c }) => !t || i ? /* @__PURE__ */ e("span", {
5
- ...c,
6
- children: n
7
- }) : /* @__PURE__ */ e("a", {
8
- href: t,
9
- target: s ?? (a ? "_blank" : void 0),
10
- rel: o ?? (a ? "noopener noreferrer" : void 0),
11
- ...c,
12
- children: n
13
- });
14
- function n({ renderLink: e } = {}) {
15
- return e || t;
16
- }
17
- //#endregion
18
- export { n, t };
19
-
20
- //# sourceMappingURL=layout.types-Cn7aUzJp.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"layout.types-Cn7aUzJp.js","names":["defaultRenderLink","props","href","disabled","target","external","rel","resolveLayoutLinkRenderer","renderLink"],"sources":["../src/components/layout/layout.types.tsx"],"sourcesContent":[" \n/**\n * Shared layout types used across page, header, and sidebar.\n *\n * The layout layer is framework-agnostic by contract. It never imports a\n * router package. Navigation is delegated to the consumer through\n * `renderLink`.\n */\nimport type { ComponentType, HTMLAttributes, MouseEvent, ReactNode } from 'react';\n\n/** Native region props, including strongly typed consumer `data-*` hooks. */\nexport type LayoutSlotAttributes<ElementType extends HTMLElement> =\n\tHTMLAttributes<ElementType>\n\t& { [Key in `data-${string}`]?: string | number | boolean | undefined };\n\nexport interface LayoutLinkRenderProps {\n\t/** Destination URL. When omitted, render non-interactive content. */\n\thref?: string;\n\tchildren: ReactNode;\n\tclassName?: string;\n\ttarget?: string;\n\trel?: string;\n\tonClick?: (event: MouseEvent<HTMLAnchorElement>) => void;\n\t'aria-label'?: string;\n\t/** Consumer hint for active styling; renderers may ignore it. */\n\tactive?: boolean;\n\t/** Consumer hint to render as muted/non-interactive. */\n\tdisabled?: boolean;\n\t/** Consumer hint for external-link behavior. */\n\texternal?: boolean;\n}\n\n/**\n * Primary navigation seam. Consumers can wire Inertia, Next, React Router,\n * TanStack Router, or a plain anchor without this package importing them.\n *\n * Example:\n * renderLink={({ href, children, className }) => (\n * <Link href={href ?? '#'} className={className}>{children}</Link>\n * )}\n */\nexport type LayoutLinkRenderer = (props: LayoutLinkRenderProps) => ReactNode;\n\nexport interface LayoutNavigationAdapter {\n\t/** Renderer for framework-native links. */\n\trenderLink?: LayoutLinkRenderer;\n}\n\n/** Default link renderer — native anchor with disabled fallback. */\nexport const defaultRenderLink: LayoutLinkRenderer = ({\n\thref,\n\tchildren,\n\tactive,\n\tdisabled,\n\texternal,\n\trel,\n\ttarget,\n\t...props\n}) => {\n\tvoid active;\n\n\tif (!href || disabled) {\n\t\treturn <span {...props}>{children}</span>;\n\t}\n\n\tconst resolvedTarget = target ?? (external ? '_blank' : undefined);\n\tconst resolvedRel = rel ?? (external ? 'noopener noreferrer' : undefined);\n\n\treturn (\n\t\t<a href={href} target={resolvedTarget} rel={resolvedRel} {...props}>\n\t\t\t{children}\n\t\t</a>\n\t);\n};\n\n/** Resolve the consumer renderer or the native-anchor default. */\nexport function resolveLayoutLinkRenderer({\n\trenderLink,\n}: LayoutNavigationAdapter = {}): LayoutLinkRenderer {\n\tif (renderLink) return renderLink;\n\treturn defaultRenderLink;\n}\n\n/** Plain navigation item used by sidebar / breadcrumbs / page header. */\nexport interface NavLink {\n\t/** Display label. */\n\tlabel: ReactNode;\n\t/** Destination for the entry, when it navigates. */\n\thref?: string;\n\thandle?: string;\n\t/** Chip rendered beside the label. */\n\tbadge?: string | number;\n\t/** Disables the control. */\n\tdisabled?: boolean;\n\texternal?: boolean;\n}\n\n/** Hierarchical navigation item — extends `NavLink` with optional children. */\nexport interface NavItem extends NavLink {\n\t/** Leading glyph. */\n\ticon?: LayoutIconSource;\n\tchildren?: NavItem[];\n\tgroup?: string;\n}\n\n/** Breadcrumb entry. The last item with no `href` renders as the current page. */\nexport interface BreadcrumbItem {\n\t/** Display label. */\n\tlabel: ReactNode;\n\t/** Destination for the entry, when it navigates. */\n\thref?: string;\n\thandle?: string;\n}\n\nexport type LayoutIconComponent = ComponentType<React.SVGProps<SVGSVGElement>>;\nexport type LayoutIconSource = LayoutIconComponent | string;\n\nexport interface LayoutUser {\n\tname: string;\n\temail?: string;\n\tavatar?: string;\n\trole?: string;\n}\n\nexport interface ExternalLinkItem {\n\t/** Display label. */\n\tlabel: ReactNode;\n\turl: string;\n\t/** Leading glyph. */\n\ticon?: ComponentType<{ className?: string }>;\n}\n"],"mappings":";;;AAiDA,IAAaA,KAAyC,EACrD,SACA,aACA,WACA,aACA,aACA,QACA,WACA,GAAGC,QAIC,CAACC,KAAQC,IACL,kBAAC,QAAD;CAAM,GAAIF;CAAQ;AAAe,CAAA,IAOxC,kBAAC,KAAD;CAAS;CAAM,QAJOG,MAAWC,IAAW,WAAW,KAAA;CAIhB,KAHpBC,MAAQD,IAAW,wBAAwB,KAAA;CAGL,GAAIJ;CAC3D;AACC,CAAA;AAKL,SAAgBM,EAA0B,EACzC,kBAC4B,CAAC,GAAuB;CAEpD,OADIC,KACGR;AACR"}