themelia-react-ui 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (488) hide show
  1. package/CHANGELOG.md +137 -0
  2. package/README.md +59 -13
  3. package/dist/{accordion-B-5Focs8.js → accordion-BRTcsp8J.js} +8 -8
  4. package/dist/accordion-BRTcsp8J.js.map +1 -0
  5. package/dist/{action-menu-Cx3SdfbN.js → action-menu-Drxw_vJk.js} +36 -36
  6. package/dist/action-menu-Drxw_vJk.js.map +1 -0
  7. package/dist/affordance-geometry.generated-CL84ZN9A.js +63 -0
  8. package/dist/affordance-geometry.generated-CL84ZN9A.js.map +1 -0
  9. package/dist/{ai-artifact-B5tPpXnS.js → ai-artifact-DLVdK0Py.js} +151 -155
  10. package/dist/ai-artifact-DLVdK0Py.js.map +1 -0
  11. package/dist/{app-shell-at8Kt4l_.js → app-shell-C_fKpljx.js} +11 -10
  12. package/dist/app-shell-C_fKpljx.js.map +1 -0
  13. package/dist/{attachment-BO2R47wn.js → attachment-DbjUWsP0.js} +12 -12
  14. package/dist/{attachment-BO2R47wn.js.map → attachment-DbjUWsP0.js.map} +1 -1
  15. package/dist/auth-CAQcasMV.js +723 -0
  16. package/dist/auth-CAQcasMV.js.map +1 -0
  17. package/dist/{avatar-Bpzty83c.js → avatar-Bu2HhitA.js} +6 -6
  18. package/dist/{avatar-Bpzty83c.js.map → avatar-Bu2HhitA.js.map} +1 -1
  19. package/dist/{badge-BZXZT9wd.js → badge-CzId1Wlm.js} +4 -4
  20. package/dist/{badge-BZXZT9wd.js.map → badge-CzId1Wlm.js.map} +1 -1
  21. package/dist/base/accordion.js +1 -1
  22. package/dist/base/action-menu.js +1 -1
  23. package/dist/base/attachment.js +1 -1
  24. package/dist/base/avatar.js +1 -1
  25. package/dist/base/badge.js +1 -1
  26. package/dist/base/buttons.js +3 -2
  27. package/dist/base/cards.js +3 -3
  28. package/dist/base/carousel.js +25 -27
  29. package/dist/base/carousel.js.map +1 -1
  30. package/dist/base/cascader.js +150 -148
  31. package/dist/base/cascader.js.map +1 -1
  32. package/dist/base/chart.js +1 -1
  33. package/dist/base/choice-inputs.js +2 -2
  34. package/dist/base/code-block.js +1 -1
  35. package/dist/base/combobox.js +1 -1
  36. package/dist/base/command.js +1 -1
  37. package/dist/base/copyable.js +1 -1
  38. package/dist/base/date-pickers.js +3 -3
  39. package/dist/base/display.js +7 -7
  40. package/dist/base/feedback.js +4 -4
  41. package/dist/base/forms-numeric.js +1 -1
  42. package/dist/base/forms.js +2 -2
  43. package/dist/base/inline-edit.js +40 -43
  44. package/dist/base/inline-edit.js.map +1 -1
  45. package/dist/base/item.js +1 -1
  46. package/dist/base/media-gallery.js +1 -1
  47. package/dist/base/navigation.js +6 -6
  48. package/dist/base/popover-menu.js +1 -1
  49. package/dist/base/popover.js +1 -1
  50. package/dist/base/qr-code.js +1 -1
  51. package/dist/base/repeaters.js +33 -33
  52. package/dist/base/repeaters.js.map +1 -1
  53. package/dist/base/sheet.js +1 -1
  54. package/dist/base/sidebar.js +1 -1
  55. package/dist/base/signature-pad.js +83 -81
  56. package/dist/base/signature-pad.js.map +1 -1
  57. package/dist/base/skeleton.js +1 -1
  58. package/dist/base/spinner.js +1 -1
  59. package/dist/base/structure.js +1 -1
  60. package/dist/base/table.js +1 -1
  61. package/dist/base/text-inputs.js +2 -2
  62. package/dist/base/toaster.js +6 -6
  63. package/dist/base/toaster.js.map +1 -1
  64. package/dist/base/tree.js +1 -1
  65. package/dist/base/upload-queue.js +1 -1
  66. package/dist/base/upload.js +3 -3
  67. package/dist/base/value-inputs.js +1 -1
  68. package/dist/blocks/admin.js +134 -134
  69. package/dist/blocks/admin.js.map +1 -1
  70. package/dist/blocks/ai.js +120 -117
  71. package/dist/blocks/ai.js.map +1 -1
  72. package/dist/blocks/analytics/usage-card.js +1 -1
  73. package/dist/blocks/analytics.js +510 -472
  74. package/dist/blocks/analytics.js.map +1 -1
  75. package/dist/blocks/collaboration.js +2 -2
  76. package/dist/blocks/commerce/receipt.js +1 -1
  77. package/dist/blocks/commerce.js +395 -383
  78. package/dist/blocks/commerce.js.map +1 -1
  79. package/dist/blocks/data-display.js +1 -1
  80. package/dist/blocks/onboarding.js +6 -6
  81. package/dist/blocks/onboarding.js.map +1 -1
  82. package/dist/blocks/planning.js +36 -36
  83. package/dist/blocks/planning.js.map +1 -1
  84. package/dist/blocks/timelines.js +1 -1
  85. package/dist/{breadcrumbs-DdQ_I5ra.js → breadcrumbs-BuYz5SDU.js} +9 -8
  86. package/dist/breadcrumbs-BuYz5SDU.js.map +1 -0
  87. package/dist/button-BZDasD04.js +651 -0
  88. package/dist/button-BZDasD04.js.map +1 -0
  89. package/dist/{button-BS6l5JUw.js → button-BZyfTvwm.js} +3 -3
  90. package/dist/button-BZyfTvwm.js.map +1 -0
  91. package/dist/buttons-D_6KJvEE.js +99 -0
  92. package/dist/buttons-D_6KJvEE.js.map +1 -0
  93. package/dist/{cards-Cum56XOF.js → cards-qGSErLw_.js} +12 -12
  94. package/dist/{cards-Cum56XOF.js.map → cards-qGSErLw_.js.map} +1 -1
  95. package/dist/chart-Bsc5BICK.js +150 -0
  96. package/dist/chart-Bsc5BICK.js.map +1 -0
  97. package/dist/{checkbox-BavDRjF7.js → checkbox-BQNDjUCh.js} +3 -3
  98. package/dist/checkbox-BQNDjUCh.js.map +1 -0
  99. package/dist/choice-inputs-Mk3iWbhr.js +725 -0
  100. package/dist/choice-inputs-Mk3iWbhr.js.map +1 -0
  101. package/dist/{code-block-xHKbAJDj.js → code-block-DzHKRybS.js} +23 -23
  102. package/dist/code-block-DzHKRybS.js.map +1 -0
  103. package/dist/{collapsible-DsnktFNv.js → collapsible-ClvC7Bj3.js} +3 -3
  104. package/dist/{collapsible-DsnktFNv.js.map → collapsible-ClvC7Bj3.js.map} +1 -1
  105. package/dist/{collection-content-C4fthJV_.js → collection-content-D6S8cv_n.js} +3 -3
  106. package/dist/{collection-content-C4fthJV_.js.map → collection-content-D6S8cv_n.js.map} +1 -1
  107. package/dist/{combobox-DEbdr-3u.js → combobox-BFnbJJp3.js} +18 -18
  108. package/dist/combobox-BFnbJJp3.js.map +1 -0
  109. package/dist/{combobox-xv3yJbzl.js → combobox-hozNwUcc.js} +313 -316
  110. package/dist/combobox-hozNwUcc.js.map +1 -0
  111. package/dist/{command-C0xe7u9B.js → command-BnmSchli.js} +9 -9
  112. package/dist/command-BnmSchli.js.map +1 -0
  113. package/dist/comments-u5L0OGip.js +1156 -0
  114. package/dist/comments-u5L0OGip.js.map +1 -0
  115. package/dist/components/base/buttons/button-group.recipes.d.ts +1 -1
  116. package/dist/components/base/buttons/button.recipes.d.ts +10 -19
  117. package/dist/components/base/buttons/use-pending-button-focus.d.ts +3 -0
  118. package/dist/components/base/cards/card.recipes.d.ts +13 -5
  119. package/dist/components/base/cards/partials/card-primitives.d.ts +9 -4
  120. package/dist/components/base/cards/smart-card.types.d.ts +1 -1
  121. package/dist/components/base/date-pickers/date-picker.recipes.d.ts +5 -18
  122. package/dist/components/base/date-pickers/datepicker.types.d.ts +3 -0
  123. package/dist/components/base/forms/form-field.d.ts +1 -0
  124. package/dist/components/base/forms/form-sizing.d.ts +3 -3
  125. package/dist/components/base/navigation/tabs.d.ts +3 -5
  126. package/dist/components/base/popover/popover.recipes.d.ts +3 -3
  127. package/dist/components/base/table/index.d.ts +1 -1
  128. package/dist/components/base/text-inputs/clear-native-field.d.ts +2 -0
  129. package/dist/components/base/text-inputs/input-trailing-action.d.ts +3 -0
  130. package/dist/components/blocks/analytics/types.d.ts +1 -1
  131. package/dist/components/blocks/collaboration/message/message.recipes.d.ts +12 -0
  132. package/dist/components/blocks/data-display/empty-state/partials/illustrations/document-stack.d.ts +1 -4
  133. package/dist/components/blocks/data-display/empty-state/partials/illustrations/inbox-clean.d.ts +1 -4
  134. package/dist/components/blocks/data-display/empty-state/partials/illustrations/index.d.ts +3 -3
  135. package/dist/components/blocks/data-display/empty-state/partials/illustrations/stacked-cards.d.ts +1 -6
  136. package/dist/components/features/combobox/components/error-message.d.ts +1 -1
  137. package/dist/components/features/comments/hooks/use-attachment-upload.d.ts +5 -0
  138. package/dist/components/features/filters/facets/search-facet.d.ts +0 -12
  139. package/dist/components/features/filters/facets/tags-facet.d.ts +1 -1
  140. package/dist/components/features/media-library/media-library.d.ts +1 -1
  141. package/dist/components/features/media-library/media-library.types.d.ts +9 -1
  142. package/dist/components/features/media-library/partials/media-library-partials.d.ts +1 -1
  143. package/dist/components/features/overlays/hooks/use-pending-overlay-focus.d.ts +2 -0
  144. package/dist/components/features/overlays/overlays.types.d.ts +5 -4
  145. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +2 -1
  146. package/dist/components/features/table/data-table.d.ts +1 -1
  147. package/dist/components/features/table/table.types.d.ts +1 -1
  148. package/dist/components/features/theme-tweaker/theme-provider-settings.d.ts +3 -1
  149. package/dist/components/layout/auth/auth.types.d.ts +1 -0
  150. package/dist/components/layout/page/page.d.ts +0 -1
  151. package/dist/components/layout/page/page.types.d.ts +9 -3
  152. package/dist/components/layout/sidebar/sidebar.context.d.ts +1 -1
  153. package/dist/components/layout/sidebar/sidebar.types.d.ts +4 -0
  154. package/dist/components/layout/workspace/workspace.types.d.ts +3 -0
  155. package/dist/components/typography/heading.d.ts +5 -2
  156. package/dist/components/typography/index.d.ts +1 -1
  157. package/dist/components/typography/text.styles.d.ts +10 -0
  158. package/dist/components/ui/popover.d.ts +1 -1
  159. package/dist/components/ui/sidebar.d.ts +1 -1
  160. package/dist/components/ui/table.d.ts +2 -1
  161. package/dist/container.recipes-D9t8MHR3.js +27 -0
  162. package/dist/container.recipes-D9t8MHR3.js.map +1 -0
  163. package/dist/{containers-6s-ucRQQ.js → containers-DqB-bSYE.js} +33 -56
  164. package/dist/containers-DqB-bSYE.js.map +1 -0
  165. package/dist/control-group-recipes-DBXmfh2E.js +21 -0
  166. package/dist/control-group-recipes-DBXmfh2E.js.map +1 -0
  167. package/dist/{copyable-B7SBXJMr.js → copyable-BTSByfmq.js} +6 -6
  168. package/dist/{copyable-B7SBXJMr.js.map → copyable-BTSByfmq.js.map} +1 -1
  169. package/dist/{data-display-cWIRdeaf.js → data-display-Bihs9Ven.js} +545 -332
  170. package/dist/data-display-Bihs9Ven.js.map +1 -0
  171. package/dist/{date-BFNMnrS5.js → date-DOKhJPu7.js} +4 -4
  172. package/dist/{date-BFNMnrS5.js.map → date-DOKhJPu7.js.map} +1 -1
  173. package/dist/{date-picker-CA6ogMQB.js → date-picker-DzP5HQq7.js} +492 -472
  174. package/dist/date-picker-DzP5HQq7.js.map +1 -0
  175. package/dist/date-pickers-BpgGz7S-.js +196 -0
  176. package/dist/date-pickers-BpgGz7S-.js.map +1 -0
  177. package/dist/{display-CFM5myut.js → display-CS6Hbk18.js} +8 -8
  178. package/dist/{display-CFM5myut.js.map → display-CS6Hbk18.js.map} +1 -1
  179. package/dist/{dropdown-menu-BlnyHr-9.js → dropdown-menu-D-boNgGO.js} +7 -7
  180. package/dist/{dropdown-menu-BlnyHr-9.js.map → dropdown-menu-D-boNgGO.js.map} +1 -1
  181. package/dist/features/activities.js +152 -141
  182. package/dist/features/activities.js.map +1 -1
  183. package/dist/features/ai-chat.js +182 -179
  184. package/dist/features/ai-chat.js.map +1 -1
  185. package/dist/features/async-preview.js +9 -9
  186. package/dist/features/async-preview.js.map +1 -1
  187. package/dist/features/combobox.js +1 -1
  188. package/dist/features/comments.js +1 -1
  189. package/dist/features/data-view.js +25 -23
  190. package/dist/features/data-view.js.map +1 -1
  191. package/dist/features/email-composer/engine.js +1 -1
  192. package/dist/features/email-composer.js +103 -104
  193. package/dist/features/email-composer.js.map +1 -1
  194. package/dist/features/event-calendar.js +375 -373
  195. package/dist/features/event-calendar.js.map +1 -1
  196. package/dist/features/filters.js +1 -1
  197. package/dist/features/global-search.js +222 -224
  198. package/dist/features/global-search.js.map +1 -1
  199. package/dist/features/kanban.js +29 -29
  200. package/dist/features/kanban.js.map +1 -1
  201. package/dist/features/map.js +59 -58
  202. package/dist/features/map.js.map +1 -1
  203. package/dist/features/media-library.js +856 -855
  204. package/dist/features/media-library.js.map +1 -1
  205. package/dist/features/mentions.js +1 -1
  206. package/dist/features/overlays.js +1 -1
  207. package/dist/features/products.js +1209 -1209
  208. package/dist/features/products.js.map +1 -1
  209. package/dist/features/questionnaire.js +52 -52
  210. package/dist/features/questionnaire.js.map +1 -1
  211. package/dist/features/resource-assignment.js +29 -31
  212. package/dist/features/resource-assignment.js.map +1 -1
  213. package/dist/features/resource.js +13 -13
  214. package/dist/features/resource.js.map +1 -1
  215. package/dist/features/rich-text-editor.js +2 -2
  216. package/dist/features/schema-form.js +82 -82
  217. package/dist/features/schema-form.js.map +1 -1
  218. package/dist/features/suggestions.js +3 -3
  219. package/dist/features/sync.js +4 -4
  220. package/dist/features/sync.js.map +1 -1
  221. package/dist/features/table.js +1 -1
  222. package/dist/features/theme-tweaker.js +456 -450
  223. package/dist/features/theme-tweaker.js.map +1 -1
  224. package/dist/{feedback-DWUkgEjR.js → feedback-CJkUAapr.js} +29 -29
  225. package/dist/feedback-CJkUAapr.js.map +1 -0
  226. package/dist/field-affordance-recipes-uKY4MsZ_.js +25 -0
  227. package/dist/field-affordance-recipes-uKY4MsZ_.js.map +1 -0
  228. package/dist/{field-state-recipes-CBTRt9Bt.js → field-state-recipes-DQQpiLWC.js} +3 -3
  229. package/dist/field-state-recipes-DQQpiLWC.js.map +1 -0
  230. package/dist/{filters-BhsUtsxW.js → filters-D6FF8L6s.js} +715 -720
  231. package/dist/filters-D6FF8L6s.js.map +1 -0
  232. package/dist/{form-field-Bn7ZH1rA.js → form-field-CZwrkP7m.js} +17 -9
  233. package/dist/form-field-CZwrkP7m.js.map +1 -0
  234. package/dist/{form-sizing-BWs70_a2.js → form-sizing-QP8aIRaW.js} +8 -5
  235. package/dist/form-sizing-QP8aIRaW.js.map +1 -0
  236. package/dist/{forms-B7pzS25o.js → forms-B5NCbkSC.js} +35 -35
  237. package/dist/{forms-B7pzS25o.js.map → forms-B5NCbkSC.js.map} +1 -1
  238. package/dist/forms-numeric-Crrm80Lm.js +867 -0
  239. package/dist/forms-numeric-Crrm80Lm.js.map +1 -0
  240. package/dist/{header-C59QZyxV.js → header-kxruN3RM.js} +53 -49
  241. package/dist/header-kxruN3RM.js.map +1 -0
  242. package/dist/{hooks-CM1Vp9Pe.js → hooks-BrlnCwQd.js} +2 -2
  243. package/dist/{hooks-CM1Vp9Pe.js.map → hooks-BrlnCwQd.js.map} +1 -1
  244. package/dist/{http-CLTVJc5I.js → http-CdEIHyQf.js} +2 -2
  245. package/dist/http-CdEIHyQf.js.map +1 -0
  246. package/dist/{icon-badge-Dv0RYQwj.js → icon-badge-Btc6pQrp.js} +4 -4
  247. package/dist/{icon-badge-Dv0RYQwj.js.map → icon-badge-Btc6pQrp.js.map} +1 -1
  248. package/dist/index.js +2 -2
  249. package/dist/input-SX9V0AL3.js +255 -0
  250. package/dist/input-SX9V0AL3.js.map +1 -0
  251. package/dist/input-vxcaNCYC.js +20 -0
  252. package/dist/input-vxcaNCYC.js.map +1 -0
  253. package/dist/{item-pJ0GsOiJ.js → item-DE4YnuJx.js} +18 -17
  254. package/dist/item-DE4YnuJx.js.map +1 -0
  255. package/dist/layout/app-shell.js +1 -1
  256. package/dist/layout/auth.js +1 -1
  257. package/dist/layout/containers.js +1 -1
  258. package/dist/layout/header.js +1 -1
  259. package/dist/layout/hooks.js +1 -1
  260. package/dist/layout/navigation.js +1 -1
  261. package/dist/layout/page.js +1 -1
  262. package/dist/layout/settings.js +1 -1
  263. package/dist/layout/sidebar.js +2 -2
  264. package/dist/layout/workspace.js +1 -1
  265. package/dist/layout.js +10 -10
  266. package/dist/lib/affordance-geometry.generated.d.ts +40 -9
  267. package/dist/lib/control-group-recipes.d.ts +22 -0
  268. package/dist/lib/field-affordance-recipes.d.ts +35 -2
  269. package/dist/lib/field-state-recipes.d.ts +2 -2
  270. package/dist/lib/navigation-row-recipes.d.ts +3 -2
  271. package/dist/lib/overlay-anatomy-recipes.d.ts +1 -1
  272. package/dist/lib/surface-recipes.d.ts +5 -2
  273. package/dist/lib/token-merge.generated.d.ts +144 -2
  274. package/dist/lib/ui-provider/types.d.ts +4 -2
  275. package/dist/lib/use-prefers-reduced-motion.d.ts +2 -0
  276. package/dist/lib/utils.js +1 -1
  277. package/dist/{media-gallery-DhDRgnVZ.js → media-gallery-DLp3HAz0.js} +75 -74
  278. package/dist/media-gallery-DLp3HAz0.js.map +1 -0
  279. package/dist/{mentions-B8Ko-fhS.js → mentions-Cl0Kt_Pd.js} +52 -50
  280. package/dist/{mentions-B8Ko-fhS.js.map → mentions-Cl0Kt_Pd.js.map} +1 -1
  281. package/dist/message-SZUNB1eX.js +127 -0
  282. package/dist/message-SZUNB1eX.js.map +1 -0
  283. package/dist/{navigation-DBEu4POU.js → navigation-DnQSNMT0.js} +64 -55
  284. package/dist/navigation-DnQSNMT0.js.map +1 -0
  285. package/dist/{navigation-BUIn2Qxx.js → navigation-DyytsLRB.js} +37 -37
  286. package/dist/navigation-DyytsLRB.js.map +1 -0
  287. package/dist/{navigation-row-recipes-GVh11KiT.js → navigation-row-recipes-DQEXQcqY.js} +3 -3
  288. package/dist/navigation-row-recipes-DQEXQcqY.js.map +1 -0
  289. package/dist/{number-BNT_BIzJ.js → number-DasMFWEG.js} +4 -4
  290. package/dist/{number-BNT_BIzJ.js.map → number-DasMFWEG.js.map} +1 -1
  291. package/dist/overlays-DUbs1KEi.js +1011 -0
  292. package/dist/overlays-DUbs1KEi.js.map +1 -0
  293. package/dist/{page-BV6ioQg3.js → page-hGmT4nWK.js} +75 -64
  294. package/dist/page-hGmT4nWK.js.map +1 -0
  295. package/dist/{page-header-DQRa0jug.js → page-header-D8nERkn5.js} +9 -9
  296. package/dist/page-header-D8nERkn5.js.map +1 -0
  297. package/dist/{pagination-C29vvt3I.js → pagination-NLGqRirf.js} +20 -20
  298. package/dist/pagination-NLGqRirf.js.map +1 -0
  299. package/dist/{popover-CoLDEg19.js → popover-CghIYdQf.js} +23 -22
  300. package/dist/popover-CghIYdQf.js.map +1 -0
  301. package/dist/{popover-menu-GLIQTJTx.js → popover-menu-B4PoWhRl.js} +6 -6
  302. package/dist/{popover-menu-GLIQTJTx.js.map → popover-menu-B4PoWhRl.js.map} +1 -1
  303. package/dist/{popover.recipes-zgBhMlUu.js → popover.recipes-QlD4JenO.js} +5 -5
  304. package/dist/popover.recipes-QlD4JenO.js.map +1 -0
  305. package/dist/{primitives-DKPOGVpj.js → primitives-C7ff0QaI.js} +120 -113
  306. package/dist/primitives-C7ff0QaI.js.map +1 -0
  307. package/dist/primitives.js +3 -3
  308. package/dist/{progress-BOe8l_FZ.js → progress-BroqrAyV.js} +10 -9
  309. package/dist/progress-BroqrAyV.js.map +1 -0
  310. package/dist/{receipt-BM8xsGFy.js → receipt-BuJynLgf.js} +8 -8
  311. package/dist/{receipt-BM8xsGFy.js.map → receipt-BuJynLgf.js.map} +1 -1
  312. package/dist/{rich-text-B7sBAdDG.js → rich-text-DlxDOtf4.js} +4 -4
  313. package/dist/{rich-text-B7sBAdDG.js.map → rich-text-DlxDOtf4.js.map} +1 -1
  314. package/dist/rich-text-editor-BKyG7rWz.js +574 -0
  315. package/dist/rich-text-editor-BKyG7rWz.js.map +1 -0
  316. package/dist/{rich-text-editor.recipes-DxvOE0Lp.js → rich-text-editor.recipes-B72Nfuze.js} +35 -26
  317. package/dist/rich-text-editor.recipes-B72Nfuze.js.map +1 -0
  318. package/dist/{scroll-area-BheMQ270.js → scroll-area-D-pIhEKl.js} +3 -3
  319. package/dist/scroll-area-D-pIhEKl.js.map +1 -0
  320. package/dist/{separator-Gk_WXH-l.js → separator-BNIgG3au.js} +3 -3
  321. package/dist/{separator-Gk_WXH-l.js.map → separator-BNIgG3au.js.map} +1 -1
  322. package/dist/{separator-DO0EbCEm.js → separator-BhtFyo4x.js} +2 -2
  323. package/dist/{separator-DO0EbCEm.js.map → separator-BhtFyo4x.js.map} +1 -1
  324. package/dist/services/actions.js +1 -1
  325. package/dist/{settings-BnCyyPOJ.js → settings-DOTOzeZ2.js} +10 -9
  326. package/dist/{settings-BnCyyPOJ.js.map → settings-DOTOzeZ2.js.map} +1 -1
  327. package/dist/{sheet-B-q914Ad.js → sheet-BFhrNehm.js} +11 -11
  328. package/dist/sheet-BFhrNehm.js.map +1 -0
  329. package/dist/{sidebar-DPR7fmqN.js → sidebar-CyR4XKwR.js} +219 -200
  330. package/dist/sidebar-CyR4XKwR.js.map +1 -0
  331. package/dist/{sidebar-C_2p3Tfj.js → sidebar-SvGJ0Zwi.js} +63 -58
  332. package/dist/sidebar-SvGJ0Zwi.js.map +1 -0
  333. package/dist/{skeleton-CmT1ppqb.js → skeleton-3F0uhYn3.js} +4 -4
  334. package/dist/{skeleton-CmT1ppqb.js.map → skeleton-3F0uhYn3.js.map} +1 -1
  335. package/dist/{smart-card-CYLn46e6.js → smart-card-DjGVV2xr.js} +171 -165
  336. package/dist/smart-card-DjGVV2xr.js.map +1 -0
  337. package/dist/{spinner-BY9HbUEh.js → spinner-Cpf7oRkF.js} +5 -5
  338. package/dist/{spinner-BY9HbUEh.js.map → spinner-Cpf7oRkF.js.map} +1 -1
  339. package/dist/{structure-MvKVq-oL.js → structure-CRdqVawd.js} +2 -2
  340. package/dist/{structure-MvKVq-oL.js.map → structure-CRdqVawd.js.map} +1 -1
  341. package/dist/style.css +1 -1
  342. package/dist/{surface-recipes-CQfRr-VL.js → surface-recipes-Dd__PD-w.js} +4 -3
  343. package/dist/surface-recipes-Dd__PD-w.js.map +1 -0
  344. package/dist/{table-DnlAJ-xR.js → table-CLtJTxoR.js} +17 -16
  345. package/dist/table-CLtJTxoR.js.map +1 -0
  346. package/dist/table-CcRDZiLP.js +1444 -0
  347. package/dist/table-CcRDZiLP.js.map +1 -0
  348. package/dist/tabs-BNgu7g0u.js +188 -0
  349. package/dist/tabs-BNgu7g0u.js.map +1 -0
  350. package/dist/text-inputs-DsR56TR-.js +330 -0
  351. package/dist/text-inputs-DsR56TR-.js.map +1 -0
  352. package/dist/{text.styles-BwB7vAF2.js → text.styles-Q4sGAIgA.js} +18 -10
  353. package/dist/text.styles-Q4sGAIgA.js.map +1 -0
  354. package/dist/theme.css +77 -115
  355. package/dist/{timelines-B9ICkQcV.js → timelines-D1pkt3se.js} +84 -78
  356. package/dist/timelines-D1pkt3se.js.map +1 -0
  357. package/dist/{tree-BdWSaoFT.js → tree-BtmYyMZV.js} +8 -8
  358. package/dist/{tree-BdWSaoFT.js.map → tree-BtmYyMZV.js.map} +1 -1
  359. package/dist/typography/rich-text.js +1 -1
  360. package/dist/typography-BxQgiZyw.js +96 -0
  361. package/dist/typography-BxQgiZyw.js.map +1 -0
  362. package/dist/typography.js +1 -1
  363. package/dist/{ui-provider-CftIB6TY.js → ui-provider-DRPn3qNl.js} +3 -2
  364. package/dist/ui-provider-DRPn3qNl.js.map +1 -0
  365. package/dist/ui-provider.js +1 -1
  366. package/dist/{upload-D8Za5x_c.js → upload-CDbYw1WN.js} +326 -323
  367. package/dist/upload-CDbYw1WN.js.map +1 -0
  368. package/dist/{upload-queue-hIIYBLS7.js → upload-queue-CNd_hH_a.js} +25 -25
  369. package/dist/upload-queue-CNd_hH_a.js.map +1 -0
  370. package/dist/{usage-card-DnmnJ58D.js → usage-card-VyJLUwRr.js} +53 -54
  371. package/dist/usage-card-VyJLUwRr.js.map +1 -0
  372. package/dist/utils-BvH9PSmq.js +4275 -0
  373. package/dist/utils-BvH9PSmq.js.map +1 -0
  374. package/dist/value-inputs-D0KCrfVC.js +840 -0
  375. package/dist/value-inputs-D0KCrfVC.js.map +1 -0
  376. package/dist/{workspace-C1PZmk8L.js → workspace-CcR8r-Nt.js} +115 -122
  377. package/dist/workspace-CcR8r-Nt.js.map +1 -0
  378. package/docs/consumer-skill/SKILL.md +110 -119
  379. package/docs/consumer-skill/examples/analytics.tsx +34 -0
  380. package/docs/consumer-skill/examples/app-layout.tsx +42 -12
  381. package/docs/consumer-skill/examples/detail.tsx +20 -4
  382. package/docs/consumer-skill/examples/manifest.json +13 -1
  383. package/docs/consumer-skill/examples/website.tsx +56 -0
  384. package/docs/consumer-skill/references/analytics.md +70 -0
  385. package/docs/consumer-skill/references/composition.md +116 -2
  386. package/docs/consumer-skill/references/design-contract.md +33 -7
  387. package/docs/consumer-skill/references/discovery.md +76 -5
  388. package/docs/consumer-skill/references/integration.md +14 -0
  389. package/docs/consumer-skill/references/public-api.json +2023 -218
  390. package/docs/consumer-skill/references/review.md +55 -3
  391. package/docs/consumer-skill/references/theming.md +52 -7
  392. package/docs/consumer-skill/references/tokens.json +177 -9
  393. package/docs/consumer-skill/references/workflows.md +32 -0
  394. package/docs/consumer-skill/scripts/check-composition.mjs +1 -1
  395. package/docs/consumer-skill/scripts/composition-policy.mjs +179 -17
  396. package/docs/consumer-skill/scripts/discovery.mjs +61 -9
  397. package/docs/consumer-skill/scripts/surface-policy.mjs +44 -0
  398. package/package.json +7 -4
  399. package/dist/accordion-B-5Focs8.js.map +0 -1
  400. package/dist/action-menu-Cx3SdfbN.js.map +0 -1
  401. package/dist/affordance-geometry.generated-D8Jcfb0G.js +0 -32
  402. package/dist/affordance-geometry.generated-D8Jcfb0G.js.map +0 -1
  403. package/dist/ai-artifact-B5tPpXnS.js.map +0 -1
  404. package/dist/app-shell-at8Kt4l_.js.map +0 -1
  405. package/dist/auth-OFwWSAap.js +0 -704
  406. package/dist/auth-OFwWSAap.js.map +0 -1
  407. package/dist/breadcrumbs-DdQ_I5ra.js.map +0 -1
  408. package/dist/button-BS6l5JUw.js.map +0 -1
  409. package/dist/buttons-Co6GavvM.js +0 -674
  410. package/dist/buttons-Co6GavvM.js.map +0 -1
  411. package/dist/chart-DVfcwQu6.js +0 -149
  412. package/dist/chart-DVfcwQu6.js.map +0 -1
  413. package/dist/checkbox-BavDRjF7.js.map +0 -1
  414. package/dist/choice-inputs-CC7XqPQO.js +0 -619
  415. package/dist/choice-inputs-CC7XqPQO.js.map +0 -1
  416. package/dist/code-block-xHKbAJDj.js.map +0 -1
  417. package/dist/combobox-DEbdr-3u.js.map +0 -1
  418. package/dist/combobox-xv3yJbzl.js.map +0 -1
  419. package/dist/command-C0xe7u9B.js.map +0 -1
  420. package/dist/comments-DviPLnwy.js +0 -1132
  421. package/dist/comments-DviPLnwy.js.map +0 -1
  422. package/dist/containers-6s-ucRQQ.js.map +0 -1
  423. package/dist/data-display-cWIRdeaf.js.map +0 -1
  424. package/dist/date-picker-CA6ogMQB.js.map +0 -1
  425. package/dist/date-pickers-BPIKLdsD.js +0 -224
  426. package/dist/date-pickers-BPIKLdsD.js.map +0 -1
  427. package/dist/feedback-DWUkgEjR.js.map +0 -1
  428. package/dist/field-affordance-recipes-IjzPrCTw.js +0 -17
  429. package/dist/field-affordance-recipes-IjzPrCTw.js.map +0 -1
  430. package/dist/field-state-recipes-CBTRt9Bt.js.map +0 -1
  431. package/dist/filters-BhsUtsxW.js.map +0 -1
  432. package/dist/form-field-Bn7ZH1rA.js.map +0 -1
  433. package/dist/form-sizing-BWs70_a2.js.map +0 -1
  434. package/dist/forms-numeric-BUBxELBv.js +0 -867
  435. package/dist/forms-numeric-BUBxELBv.js.map +0 -1
  436. package/dist/header-C59QZyxV.js.map +0 -1
  437. package/dist/http-CLTVJc5I.js.map +0 -1
  438. package/dist/input-WwYQZJzG.js +0 -202
  439. package/dist/input-WwYQZJzG.js.map +0 -1
  440. package/dist/input-ci9fIgFH.js +0 -20
  441. package/dist/input-ci9fIgFH.js.map +0 -1
  442. package/dist/item-pJ0GsOiJ.js.map +0 -1
  443. package/dist/media-gallery-DhDRgnVZ.js.map +0 -1
  444. package/dist/message-COsdEvXT.js +0 -108
  445. package/dist/message-COsdEvXT.js.map +0 -1
  446. package/dist/navigation-BUIn2Qxx.js.map +0 -1
  447. package/dist/navigation-DBEu4POU.js.map +0 -1
  448. package/dist/navigation-row-recipes-GVh11KiT.js.map +0 -1
  449. package/dist/overlays-B11wZka6.js +0 -982
  450. package/dist/overlays-B11wZka6.js.map +0 -1
  451. package/dist/page-BV6ioQg3.js.map +0 -1
  452. package/dist/page-header-DQRa0jug.js.map +0 -1
  453. package/dist/pagination-C29vvt3I.js.map +0 -1
  454. package/dist/popover-CoLDEg19.js.map +0 -1
  455. package/dist/popover.recipes-zgBhMlUu.js.map +0 -1
  456. package/dist/primitives-DKPOGVpj.js.map +0 -1
  457. package/dist/progress-BOe8l_FZ.js.map +0 -1
  458. package/dist/rich-text-editor-CoVrTiSv.js +0 -575
  459. package/dist/rich-text-editor-CoVrTiSv.js.map +0 -1
  460. package/dist/rich-text-editor.recipes-DxvOE0Lp.js.map +0 -1
  461. package/dist/scroll-area-BheMQ270.js.map +0 -1
  462. package/dist/select-B2mb-qN2.js +0 -108
  463. package/dist/select-B2mb-qN2.js.map +0 -1
  464. package/dist/sheet-B-q914Ad.js.map +0 -1
  465. package/dist/sidebar-C_2p3Tfj.js.map +0 -1
  466. package/dist/sidebar-DPR7fmqN.js.map +0 -1
  467. package/dist/smart-card-CYLn46e6.js.map +0 -1
  468. package/dist/surface-recipes-CQfRr-VL.js.map +0 -1
  469. package/dist/table-BS39xnlq.js +0 -1424
  470. package/dist/table-BS39xnlq.js.map +0 -1
  471. package/dist/table-DnlAJ-xR.js.map +0 -1
  472. package/dist/tabs-B5cNMWiP.js +0 -187
  473. package/dist/tabs-B5cNMWiP.js.map +0 -1
  474. package/dist/text-inputs-Dh9XGyiS.js +0 -331
  475. package/dist/text-inputs-Dh9XGyiS.js.map +0 -1
  476. package/dist/text.styles-BwB7vAF2.js.map +0 -1
  477. package/dist/timelines-B9ICkQcV.js.map +0 -1
  478. package/dist/typography-Cv8MT-82.js +0 -96
  479. package/dist/typography-Cv8MT-82.js.map +0 -1
  480. package/dist/ui-provider-CftIB6TY.js.map +0 -1
  481. package/dist/upload-D8Za5x_c.js.map +0 -1
  482. package/dist/upload-queue-hIIYBLS7.js.map +0 -1
  483. package/dist/usage-card-DnmnJ58D.js.map +0 -1
  484. package/dist/utils-C2EKeIw3.js +0 -72
  485. package/dist/utils-C2EKeIw3.js.map +0 -1
  486. package/dist/value-inputs-DX2dbxjj.js +0 -824
  487. package/dist/value-inputs-DX2dbxjj.js.map +0 -1
  488. package/dist/workspace-C1PZmk8L.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"forms-numeric-BUBxELBv.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","Text","Label","TextLink","Grid","Stack","Alert","AlertDescription","resolveFormControlSize","Input","SelectValue","SelectTrigger","Select","FormField","Select$1","SelectPopupGroup","SelectPopupItem","SelectPopupContent","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","onChange","STEPPER_SIZE_CLASS","DecimalInputImpl","controlledValue","sizeProp","stringsProp","props","size","defaultScale","strings","useStrings","validDecimalPlaces","inputRef","handleChange","useCallback","newValue","allowEmpty","modifiedEvent","handleBlur","onBlur","normalizeOnBlur","raw","num","roundingMode","adjust","disabled","showSteppers","placeholderResolved","placeholder","Minus","node","forwardedRef","className","Plus","DecimalInput","PercentageInput","forwardRef","defaultCurrencyInputStrings","CURRENCY_SYMBOLS","normalizeCurrencies","currencies","currency","CurrencyInputImpl","controlledCurrency","decimalInputProps","normalizedCurrencies","useMemo","internalCurrency","setInternalCurrency","useState","defaultCurrency","isCurrencyControlled","selectedCurrency","details","disableCurrencySelector","onConfigError","handleCurrencyChange","newCurrency","onCurrencyChange","triggerClassName","formFieldTriggerClasses","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","event","onChangeData","nextCurrency","defaultValue","input","required","controlStrings","controlClassName","hasFieldChrome","label","hint","helperText","Info","showMigrationWarning","AlertTriangle","migrationWarningMessage","ORDERED_MODES","RoundingModeSelect","controlled","allProps","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","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","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 { resolveFormControlSize } from '../forms/form-sizing';\nimport { Input, type InputProps } from '../text-inputs';\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(\n\ttarget: HTMLInputElement,\n\tvalue: string,\n\tonChange?: InputProps['onChange'],\n) {\n\t// Write the value to the DOM first so UNCONTROLLED inputs actually reflect\n\t// stepper clicks and blur-normalisation. (Previously this only called\n\t// onChange, so steppers were a no-op on uncontrolled fields.) Use the native\n\t// value setter so React's input value-tracker stays in sync for controlled\n\t// consumers, which then reconcile through their onChange + re-render.\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\n\tif (!onChange) return;\n\tconst event = {\n\t\ttarget,\n\t\tcurrentTarget: target,\n\t\ttype: 'change',\n\t\tbubbles: false,\n\t\tcancelable: false,\n\t} as unknown as React.ChangeEvent<HTMLInputElement>;\n\tonChange(event);\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\t{\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\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}: DecimalInputProps,\n\tforwardedRef: React.ForwardedRef<HTMLInputElement>,\n) {\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\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, onChange);\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 (disabled || 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, onChange);\n\t\t},\n\t\t[disabled, step, min, max, roundingMode, validDecimalPlaces, onChange],\n\t);\n\n\tconst showSteppers = typeof step === 'number' && step > 0;\n\tconst placeholderResolved =\n\t\tplaceholder ?? (validDecimalPlaces > 0 ? `0.${'0'.repeat(validDecimalPlaces)}` : '0');\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',\n\t\t\t\t\t'focus-within:border-ring focus-within:ring-ring/50 focus-within:ring-[3px]',\n\t\t\t\t\tprops['aria-invalid'] && 'border-destructive ring-destructive/20',\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={disabled}\n\t\t\t\t\tonClick={() => adjust(-1)}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'inline-flex shrink-0 items-center justify-center border-r border-input text-muted-foreground transition-colors',\n\t\t\t\t\t\tSTEPPER_SIZE_CLASS[size],\n\t\t\t\t\t\t'hover:bg-muted hover:text-foreground',\n\t\t\t\t\t\t'disabled:cursor-not-allowed disabled:opacity-50',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Minus className={size === 'sm' ? 'size-icon-sm' : 'size-icon'} />\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\tvalue={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'flex-1 tabular-nums text-center border-0 shadow-none rounded-none focus-visible:ring-0 focus-visible:border-0',\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={disabled}\n\t\t\t\t\tonClick={() => adjust(1)}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'inline-flex shrink-0 items-center justify-center border-l border-input text-muted-foreground transition-colors',\n\t\t\t\t\t\tSTEPPER_SIZE_CLASS[size],\n\t\t\t\t\t\t'hover:bg-muted hover:text-foreground',\n\t\t\t\t\t\t'disabled:cursor-not-allowed disabled:opacity-50',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Plus className={size === 'sm' ? 'size-icon-sm' : 'size-icon'} />\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\tvalue={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 { 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 } from '../forms/form-sizing';\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\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\t'!shadow-none',\n\t\t\t\tcurrencyWidth,\n\t\t\t\tdisabled && 'opacity-50 cursor-not-allowed'\n\t\t\t),\n\t\t[size, currencyWidth, disabled]\n\t);\n\n\t// Currency selector component\n\tconst currencySelector = (\n\t\t<Stack gap=\"md\" className=\"currency-input--selector\">\n\t\t\t{!!currencyLabel && <Label className=\"currency-input--selector-label leading-normal\">{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\taria-label={currencyLabel || strings.currencyAriaLabel}\n\t\t\t\t\taria-invalid={invalid || undefined}\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<div className={cn('currency-input--component', 'flex items-start 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, Info } 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\t{\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},\n\tforwardedRef,\n) {\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\tvalue={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{hasFieldChrome ? (\n\t\t\t\t<FormField\n\t\t\t\t\tlabel={label}\n\t\t\t\t\thint={hint}\n\t\t\t\t\thelperText={helperText}\n\t\t\t\t\terror={error}\n\t\t\t\t\trequired={required}\n\t\t\t\t>\n\t\t\t\t\t{input}\n\t\t\t\t</FormField>\n\t\t\t) : input}\n\n\t\t\t{!!originalFormatted && !error && (\n\t\t\t\t<div className=\"money-input--original flex items-center gap-space-sm text-muted-foreground\">\n\t\t\t\t\t<Info className=\"size-icon-sm shrink-0\" aria-hidden=\"true\" />\n\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t{interpolateMoneyInputString(strings.originalValue, { value: originalFormatted })}\n\t\t\t\t\t</Text>\n\t\t\t\t</div>\n\t\t\t)}\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/** Custom labels for rounding modes */\n\tlabels?: Partial<Record<RoundingMode, string>>;\n}\n\nconst ORDERED_MODES: RoundingMode[] = ['floor', 'half_up', 'ceil'];\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] ?? 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 { 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 } from '../forms/form-sizing';\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\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=\"md\">\n\t\t\t\t\t\t{!!hasUnitLabel && <Label className=\"leading-6\">{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\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\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\t'!shadow-none',\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\t\tdisabled && 'opacity-50 cursor-not-allowed'\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>{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\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<div className=\"flex items-center pt-space-md\">\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>{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\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<div className=\"flex items-center pt-space-md\">\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>{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\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<div\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 && !hasUnitLabel && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"mt-1 text-center\">\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\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\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 { 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 } from '../forms/form-sizing';\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\n\t\treturn (\n\t\t\t\t<div ref={ref} className={cn('weight-input--component', 'flex items-start 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=\"md\">\n\t\t\t\t\t\t\t\t\t\t{!!hasUnitLabel && <Label className=\"leading-6\">{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\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\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\t'!shadow-none',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(disabled || disableUnitSelector) && 'opacity-50 cursor-not-allowed',\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 { 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}\n\nexport const defaultCoordinatesInputStrings: CoordinatesInputStrings = {\n\t\tlatLabel: '',\n\t\tlngLabel: '',\n\t\tlatPlaceholder: '',\n\t\tlngPlaceholder: '',\n\t\tpreviewLinkLabel: '',\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\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}: 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\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/>\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\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/>\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-C59QZyxV.js","names":["React","_Fragment","React","_Fragment","Text","DisplayLabel","Stack","DropdownMenuItem","DropdownMenuSeparator","DropdownMenuTrigger","DropdownMenuGroup","DropdownMenuLabel","DropdownMenuContent","DropdownMenuLinkItem","DropdownMenu","ActionMenu","formatInitials","AvatarFallback","Avatar","AvatarImage","Badge","Separator","PopoverTrigger","Popover","PopoverContent","Breadcrumbs","SidebarTrigger","useLayoutLinkRenderer","useCommandShortcut","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","actions","onProfile","User","onSettings","Settings","onLogout","LogOut","trigger","renderTrigger","showEmail","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 className=\"size-action-xs [&_svg]:size-icon\" />}\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\" />}\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'[&_[data-slot=breadcrumb-item]]:min-w-0 [&_[data-slot=breadcrumb-item]]:shrink',\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';\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 sticky top-0 z-40 flex min-w-0 min-h-shell-header items-center border-b border-border bg-background px-surface py-space-sm transition-[width,height] ease-linear',\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 region before breadcrumbs. */\n\tbrand?: ReactNode;\n\t/** Replaces the breadcrumb/sidebar-trigger region. */\n\tbreadcrumbs?: ReactNode;\n\t/** Leading content after breadcrumbs. */\n\tleft?: ReactNode;\n\t/** Center content, usually search or a scope switcher. */\n\tcenter?: ReactNode;\n\t/** Trailing content, usually notifications/user menu/actions. */\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/** Replaces individual regions of the shell. */\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';\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<kbd className=\"header-search--shortcut hidden h-5 shrink-0 items-center gap-space-sm rounded-radius-md border border-border/70 bg-background/60 px-space-sm font-mono text-xs text-muted-foreground lg:inline-flex\">\n\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">\n\t\t\t\t{isMetaShortcut ? strings.shortcutMac : strings.shortcutPc}\n\t\t\t</Text>\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\tonClick={onOpen}\n\t\t\tclassName={cn(\n\t\t\t\t'header-search--component header-search--trigger h-action-sm w-full min-w-52 justify-start gap-space-md rounded-radius border-border/80 bg-muted/40 px-control-sm text-foreground shadow-none transition-[background-color,border-color,color,box-shadow] hover:border-border hover:bg-muted/60 hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background dark:border-border/80 dark:bg-muted dark:hover:bg-muted/60 dark:hover:text-foreground',\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 flex-1 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 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=\"sm\" 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 size-action-sm rounded-radius text-foreground transition-[background-color,color,box-shadow] hover:bg-accent hover:text-accent-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background',\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=\"header-tool-button--badge absolute right-space-xs top-space-xs flex min-h-space-lg min-w-space-lg items-center justify-center rounded-full bg-destructive px-space-2xs text-destructive-foreground\">\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';\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 w-80 max-w-[calc(100vw-2rem)]',\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\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\ttone=\"secondary\"\n\t\t\tbuttonStyle=\"ghost\"\n\t\t\tclassName={cn(\n\t\t\t\t'header-user-menu--component header-user-menu--trigger group h-action-lg min-w-0 max-w-56 justify-start gap-space-md rounded-radius px-space-sm pe-space-md text-foreground shadow-none hover:bg-accent hover:text-accent-foreground data-[state=open]:bg-accent max-sm:size-action-lg 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\tshowEmail ? 'py-space-sm' : 'py-space-xs',\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-radius-md 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 weight=\"medium\" className=\"truncate\">{user.name}</Text>\n\t\t\t\t{!!showEmail && !!user.email && (\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" 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-radius',\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 { Badge } from '../../../base/badge';\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';\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=\"sm\" 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<Badge\n\t\t\t\t\t\t\t\ttone=\"destructive\"\n\t\t\t\t\t\t\t\tclassName=\"absolute -right-1 -top-1 flex h-4.5 min-w-4.5 items-center justify-center px-space-xs py-0\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{badgeText}\n\t\t\t\t\t\t\t</Badge>\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 w-80 max-w-[calc(100vw-2rem)]', 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\">\n\t\t\t\t\t\t<DisplayLabel>{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 size-2 shrink-0 rounded-full',\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 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":"http-CLTVJc5I.js","names":["defaultRichTextEditorStrings","schema","styleProperties","cleanProperties","node","key","value","style","split","declaration","name","parseEmailHtml","fromHtml","html","sanitizeEmailTree","cleaned","sanitize","tree","sanitizeEmailHtml","toHtml","emailHtmlText","defaultEmailComposerStrings","field","index","email","label","keys","id","emptyDocument","escapeEmailHtml","char","documentHtml","content","child","strings","text","mark","tags","level","bodyHtml","bodyMarkup","body","tokens","resolveValues","values","definitions","override","draft","context","template","renderEmail","unresolved","get","subject","visit","clean","inspectDraft","issues","rendered","renderError","r","result","issue","error","validate","recipientLabel","recipient","parseRecipient","match","createHttpSender","response","endpoint","options","message"],"sources":["../src/components/features/email-composer/email-html.ts","../src/components/features/email-composer/strings.ts","../src/components/features/email-composer/document.ts","../src/components/features/email-composer/engine.ts","../src/components/features/email-composer/http.ts"],"sourcesContent":["import { fromHtml } from 'hast-util-from-html';\nimport { sanitize, type Schema } from 'hast-util-sanitize';\nimport { toHtml } from 'hast-util-to-html';\nimport type { Root, RootContent } from 'hast';\nconst tags = ['a', 'b', 'blockquote', 'br', 'code', 'del', 'div', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'li', 'mark', 'ol', 'p', 'pre', 's', 'span', 'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'th', 'thead', 'tfoot', 'tr', 'u', 'ul'];\nconst schema: Schema = {\n\ttagNames: tags, attributes: { '*': ['style', 'align', 'width', 'height'], a: ['href', 'title'], img: ['src', 'alt', 'title'], span: ['dataPlaceholder'], ol: ['start'], td: ['colSpan', 'rowSpan'], th: ['colSpan', 'rowSpan'], table: ['cellPadding', 'cellSpacing', 'border'] },\n\tprotocols: { href: ['https', 'http', 'mailto'], src: ['https'] },\n\tstrip: ['script', 'style', 'iframe', 'object', 'embed', 'svg', 'math', 'template', 'form', 'input', 'button'],\n};\n// Email content has its own small allowlist; admin UI theme styles never enter it.\nconst styleProperties = new Set(['color', 'background', 'background-color', 'border', 'border-top', 'border-right', 'border-bottom', 'border-left', 'border-color', 'border-width', 'border-style', 'border-collapse', 'border-spacing', 'border-radius', 'padding', 'padding-top', 'padding-right', 'padding-bottom', 'padding-left', 'margin', 'margin-top', 'margin-right', 'margin-bottom', 'margin-left', 'width', 'max-width', 'min-width', 'height', 'font-family', 'font-size', 'font-weight', 'font-style', 'line-height', 'text-align', 'text-decoration', 'vertical-align', 'white-space']);\nfunction cleanProperties(node: Root | RootContent): void {\n\tif (node.type === 'element') {\n\t\tfor (const key of ['href', 'src']) {\n\t\t\tconst value = node.properties[key];\n\t\t\tif (typeof value === 'string' && (value.trimStart().startsWith('//') || (key === 'src' && !/^https:\\/\\//i.test(value))))\n\t\t\t\tdelete node.properties[key];\n\t\t}\n\t\tconst style = node.properties.style;\n\t\tif (typeof style === 'string') {\n\t\t\tnode.properties.style = style.split(';').flatMap(declaration => {\n\t\t\t\tconst split = declaration.indexOf(':');\n\t\t\t\tconst name = declaration.slice(0, split).trim().toLowerCase();\n\t\t\t\tconst value = declaration.slice(split + 1).trim();\n\t\t\t\treturn split > 0 && styleProperties.has(name) && value && /^[\\w\\s#%.,()'\"+\\/-]+$/.test(value) && !/url\\s*\\(|expression|@|javascript|var\\s*\\(/i.test(value) ? [`${name}:${value}`] : [];\n\t\t\t}).join(';');\n\t\t\tif (!node.properties.style)\n\t\t\t\tdelete node.properties.style;\n\t\t}\n\t}\n\tif (node.type === 'root' || node.type === 'element')\n\t\tnode.children.forEach(cleanProperties);\n}\nexport function parseEmailHtml(html: string): Root { return fromHtml(html, { fragment: true }); }\nexport function sanitizeEmailTree(tree: Root): Root {\n\tconst cleaned = sanitize(tree, schema);\n\tif (cleaned.type !== 'root')\n\t\tthrow new Error('Expected an HTML document fragment.');\n\tcleanProperties(cleaned);\n\treturn cleaned;\n}\nexport function sanitizeEmailHtml(html: string): string { return toHtml(sanitizeEmailTree(parseEmailHtml(html))); }\nexport function emailHtmlText(tree: Root | RootContent): string {\n\tif (tree.type === 'text')\n\t\treturn tree.value;\n\tif (tree.type !== 'root' && tree.type !== 'element')\n\t\treturn '';\n\tif (tree.type === 'element' && tree.tagName === 'br')\n\t\treturn '\\n';\n\tconst text = tree.children.map(emailHtmlText).join('');\n\treturn text + (tree.type === 'element' && /^(p|div|li|h[1-6]|tr|blockquote|pre)$/.test(tree.tagName) ? '\\n' : '');\n}\n","import { defaultRichTextEditorStrings } from '../rich-text-editor/rich-text-editor.strings';\nexport const defaultEmailComposerStrings = {\n\ttoolbar: defaultRichTextEditorStrings.toolbar,\n\ttitle: 'New message', to: 'To', cc: 'Cc', bcc: 'Bcc', subject: 'Subject', body: 'Message body',\n\trecipientPlaceholder: 'Name <email@example.com>', addRecipient: (field: string) => `Add ${field} recipient`,\n\trecipientLabel: (field: string, index: number) => `${field} recipient ${index + 1}`,\n\tremoveRecipient: (email: string) => `Remove ${email}`, newRecipient: (field: string) => `New ${field} recipient`,\n\ttemplates: 'Templates', searchTemplates: 'Search templates…', noTemplates: 'No templates found.', importTemplate: 'Import template',\n\ttemplatesUnavailable: 'Templates are unavailable. Wait for loading to finish or retry.', loadingTemplates: 'Loading templates…', loadingVariables: 'Loading variables…', loadingRecipients: (field: string) => `Loading ${field} recipients…`, retry: 'Retry', dataUnavailable: 'Wait for required recipient and variable data to finish loading, or retry the failed request.',\n\tvariables: 'Variables', variablesDescription: 'Insert a variable into the message, or override its live value for this draft.', insertVariable: (label: string) => `Insert ${label}`, reset: 'Reset', dynamic: 'Dynamic value', overridden: 'Manual override',\n\tchoose: 'Choose…', editor: 'Editor', preview: 'Preview', previewLabel: 'Email body preview',\n\tsend: 'Send email', discard: 'Discard', working: 'Working…', sent: 'Email sent successfully.', discarded: 'Draft discarded.', close: 'Close composer', more: 'More actions',\n\tlink: 'Add or edit link', linkTitle: 'Message link', linkUrl: 'Link URL', closeLink: 'Close link editor', closeConversion: 'Close conversion confirmation', apply: 'Apply', cancel: 'Cancel',\n\tinvalidLink: 'Use an https://, http://, or mailto: URL.', convert: 'Convert to editable rich text',\n\tconvertTitle: 'Convert HTML layout?', convertDescription: 'Unsupported layout elements and styling may be lost when converting to rich text.',\n\tmissingRecipient: 'Add at least one recipient.', invalidRecipients: (field: string) => `Check ${field} addresses.`,\n\tinvalidSubject: 'Enter a single-line subject.', invalidResolvedSubject: 'Resolved subject must be a nonempty single line.', emptyBody: 'Enter a message.',\n\tmissingVariables: (keys: readonly string[]) => `Set values for: ${keys.join(', ')}.`,\n\tattributeVariables: 'Placeholders in HTML attributes are unsupported. Put placeholders in visible text.',\n\tunknownVariable: (key: string) => `Unknown placeholder: ${key}`, duplicateVariable: (key: string) => `Duplicate placeholder: ${key}`,\n\tunknownTemplate: (id: string) => `Unknown template: ${id}`, duplicateTemplate: 'Template IDs must be unique.',\n\teditableRequired: 'Use editable rich text for this operation.', editorNotReady: 'Editor is not ready.',\n\tunsupportedNode: (node: string) => `Unsupported document node: ${node}`, renderError: 'Unable to render the message.',\n\terrorTitle: 'Message could not be completed',\n};\nexport type EmailComposerStrings = typeof defaultEmailComposerStrings;\n","import type { JSONContent } from '@tiptap/react';\nimport type { EmailBody } from './types';\nimport { sanitizeEmailHtml } from './email-html';\nimport { defaultEmailComposerStrings, type EmailComposerStrings } from './strings';\nexport const emptyDocument: JSONContent = { type: 'doc', content: [{ type: 'paragraph' }] };\nexport const escapeEmailHtml = (value: string): string => value.replace(/[&<>\"']/g, char => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' })[char]!);\nexport function documentHtml(node: JSONContent, strings: EmailComposerStrings = defaultEmailComposerStrings): string {\n\tconst content = () => (node.content ?? []).map(child => documentHtml(child, strings)).join('');\n\tif (node.type === 'text' || node.type === 'placeholderToken') {\n\t\tconst key = escapeEmailHtml(String(node.attrs?.key ?? ''));\n\t\tlet text = node.type === 'text' ? escapeEmailHtml(node.text ?? '') : `<span data-placeholder=\"${key}\">{{${key}}}</span>`;\n\t\tfor (const mark of node.marks ?? []) {\n\t\t\tconst tags: Record<string, string> = { bold: 'strong', italic: 'em', strike: 's', underline: 'u', code: 'code' };\n\t\t\tif (tags[mark.type])\n\t\t\t\ttext = `<${tags[mark.type]}>${text}</${tags[mark.type]}>`;\n\t\t\telse if (mark.type === 'link')\n\t\t\t\ttext = `<a href=\"${escapeEmailHtml(String(mark.attrs?.href ?? ''))}\">${text}</a>`;\n\t\t\telse\n\t\t\t\tthrow new Error(strings.unsupportedNode(mark.type));\n\t\t}\n\t\treturn text;\n\t}\n\tif (node.type === 'doc')\n\t\treturn content();\n\tif (node.type === 'hardBreak')\n\t\treturn '<br>';\n\tif (node.type === 'horizontalRule')\n\t\treturn '<hr>';\n\tif (node.type === 'heading') {\n\t\tconst level = Math.min(6, Math.max(1, Number(node.attrs?.level) || 2));\n\t\treturn `<h${level}>${content()}</h${level}>`;\n\t}\n\tif (node.type === 'codeBlock')\n\t\treturn `<pre><code>${content()}</code></pre>`;\n\tif (node.type === 'orderedList')\n\t\treturn `<ol start=\"${Math.max(1, Math.trunc(Number(node.attrs?.start) || 1))}\">${content()}</ol>`;\n\tconst tags: Record<string, string> = { paragraph: 'p', blockquote: 'blockquote', bulletList: 'ul', orderedList: 'ol', listItem: 'li' };\n\tif (!node.type || !tags[node.type])\n\t\tthrow new Error(strings.unsupportedNode(node.type ?? 'unknown'));\n\treturn `<${tags[node.type]}>${content()}</${tags[node.type]}>`;\n}\nexport function bodyHtml(body: EmailBody, strings: EmailComposerStrings = defaultEmailComposerStrings): string {\n\treturn sanitizeEmailHtml(bodyMarkup(body, strings));\n}\nexport function bodyMarkup(body: EmailBody, strings: EmailComposerStrings): string {\n\treturn body.kind === 'html' ? body.html : body.kind === 'text' ? `<p>${escapeEmailHtml(body.text).replace(/\\n/g, '<br>')}</p>` : documentHtml(body.document, strings);\n}\n","import { toHtml } from 'hast-util-to-html';\nimport type { Root, RootContent } from 'hast';\nimport { bodyMarkup } from './document';\nimport { parseEmailHtml, sanitizeEmailTree, emailHtmlText } from './email-html';\nimport { defaultEmailComposerStrings, type EmailComposerStrings } from './strings';\nimport type { ComposerDraft, ComposerIssue, EmailTemplate, PlaceholderDefinition, PlaceholderValue, PreparedEmail, Recipient } from './types';\nconst tokens = /\\{\\{([a-zA-Z0-9_.-]+)\\}\\}/g;\nexport function resolveValues<C, K extends string>(draft: ComposerDraft<K>, context: C, definitions: Partial<Record<K, PlaceholderDefinition<C>>>, template?: EmailTemplate<K>): Partial<Record<K, PlaceholderValue>> {\n\tconst values: Partial<Record<K, PlaceholderValue>> = Object.create(null);\n\tfor (const key of Object.keys(definitions) as K[]) {\n\t\tconst override = Object.hasOwn(draft.placeholderOverrides, key) ? draft.placeholderOverrides[key] : undefined;\n\t\tvalues[key] = override !== undefined ? override : definitions[key]!.resolve(context) ?? template?.defaults?.[key] ?? definitions[key]!.fallback ?? null;\n\t}\n\treturn values;\n}\nexport function renderEmail<C, K extends string>(draft: ComposerDraft<K>, context: C, definitions: Partial<Record<K, PlaceholderDefinition<C>>>, template?: EmailTemplate<K>, strings: EmailComposerStrings = defaultEmailComposerStrings): {\n\temail: PreparedEmail<K>;\n\tunresolved: string[];\n} {\n\tconst values = resolveValues(draft, context, definitions, template);\n\tconst unresolved = new Set<string>();\n\tconst get = (key: string) => {\n\t\tconst value = Object.hasOwn(values, key) ? values[key as K] : null;\n\t\tif (value == null || value === '') {\n\t\t\tunresolved.add(key);\n\t\t\treturn `{{${key}}}`;\n\t\t}\n\t\treturn String(value);\n\t};\n\tconst subject = draft.subject.replace(tokens, (_, key: string) => get(key));\n\tconst tree = parseEmailHtml(bodyMarkup(draft.body, strings));\n\tfunction visit(node: Root | RootContent): void {\n\t\tif (node.type === 'element') {\n\t\t\tfor (const [key, value] of Object.entries(node.properties))\n\t\t\t\tif (key !== 'dataPlaceholder' && typeof value === 'string' && value.includes('{{'))\n\t\t\t\t\tthrow new Error(strings.attributeVariables);\n\t\t}\n\t\tif (node.type === 'root' || node.type === 'element')\n\t\t\tnode.children = node.children.map(child => {\n\t\t\t\tif (child.type === 'element' && child.properties.dataPlaceholder !== undefined)\n\t\t\t\t\treturn { type: 'text', value: get(String(child.properties.dataPlaceholder)) };\n\t\t\t\tif (child.type === 'text')\n\t\t\t\t\treturn { ...child, value: child.value.replace(tokens, (_, key: string) => get(key)) };\n\t\t\t\tvisit(child);\n\t\t\t\treturn child;\n\t\t\t});\n\t}\n\tvisit(tree);\n\tfor (const key of Object.keys(definitions) as K[])\n\t\tif (definitions[key]?.required && (values[key] == null || values[key] === ''))\n\t\t\tunresolved.add(key);\n\tfor (const key of template?.requiredPlaceholders ?? [])\n\t\tif (values[key] == null || values[key] === '')\n\t\t\tunresolved.add(key);\n\tconst clean = sanitizeEmailTree(tree);\n\treturn { email: { to: structuredClone(draft.to), cc: structuredClone(draft.cc), bcc: structuredClone(draft.bcc), subject, html: toHtml(clean), text: emailHtmlText(clean).trim(), templateId: draft.templateId, resolvedPlaceholders: values }, unresolved: [...unresolved] };\n}\nexport function inspectDraft<C, K extends string>(draft: ComposerDraft<K>, context: C, definitions: Partial<Record<K, PlaceholderDefinition<C>>>, template?: EmailTemplate<K>, strings: EmailComposerStrings = defaultEmailComposerStrings) {\n\tconst issues: ComposerIssue[] = [];\n\tlet rendered: ReturnType<typeof renderEmail<C, K>> | undefined;\n\tlet renderError = '';\n\tif (!draft.to.length)\n\t\tissues.push({ field: 'to', message: strings.missingRecipient });\n\tfor (const field of ['to', 'cc', 'bcc'] as const)\n\t\tif (draft[field].some(r => !/^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$/.test(r.email) || /[\\r\\n]/.test(r.name ?? '')))\n\t\t\tissues.push({ field, message: strings.invalidRecipients(strings[field]) });\n\tif (!draft.subject.trim() || /[\\r\\n]/.test(draft.subject))\n\t\tissues.push({ field: 'subject', message: strings.invalidSubject });\n\ttry {\n\t\tconst result = renderEmail(draft, context, definitions, template, strings);\n\t\trendered = result;\n\t\tif (!result.email.text.trim())\n\t\t\tissues.push({ field: 'body', message: strings.emptyBody });\n\t\tif (result.unresolved.length)\n\t\t\tissues.push({ field: 'placeholders', message: strings.missingVariables(result.unresolved) });\n\t\tif ((!result.email.subject.trim() || /[\\r\\n]/.test(result.email.subject)) && !issues.some(issue => issue.field === 'subject'))\n\t\t\tissues.push({ field: 'subject', message: strings.invalidResolvedSubject });\n\t}\n\tcatch (error) {\n\t\trenderError = error instanceof Error ? error.message : strings.renderError;\n\t\tissues.push({ field: 'body', message: renderError });\n\t}\n\treturn { rendered, renderError, issues };\n}\nexport function validate<C, K extends string>(draft: ComposerDraft<K>, context: C, definitions: Partial<Record<K, PlaceholderDefinition<C>>>, template?: EmailTemplate<K>, strings: EmailComposerStrings = defaultEmailComposerStrings): ComposerIssue[] {\n\treturn inspectDraft(draft, context, definitions, template, strings).issues;\n}\nexport function recipientLabel(recipient: Recipient): string { return recipient.name ? `${recipient.name} <${recipient.email}>` : recipient.email; }\nexport function parseRecipient(value: string): Recipient {\n\tconst match = value.trim().match(/^(.*?)\\s*<([^<>]+)>$/);\n\treturn match ? { name: match[1].trim(), email: match[2].trim() } : { email: value.trim() };\n}\n","import type { PreparedEmail } from './types';\n/** Optional sender adapter. The consuming application owns the endpoint and delivery. */\nexport function createHttpSender(endpoint: string, options: {\n\theaders?: Record<string, string>;\n\ttimeoutMs?: number;\n} = {}) {\n\treturn async <K extends string>(email: PreparedEmail<K>): Promise<void> => {\n\t\tconst response = await fetch(endpoint, { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/json', ...options.headers }, body: JSON.stringify(email), signal: AbortSignal.timeout(options.timeoutMs ?? 30000) });\n\t\tif (!response.ok) {\n\t\t\tlet message = `Email request failed (${response.status}).`;\n\t\t\ttry {\n\t\t\t\tconst result: unknown = await response.json();\n\t\t\t\tif (result && typeof result === 'object' && 'message' in result && typeof result.message === 'string')\n\t\t\t\t\tmessage = result.message;\n\t\t\t}\n\t\t\tcatch { /* Response bodies are optional. */ }\n\t\t\tthrow new Error(message);\n\t\t}\n\t};\n}\n"],"mappings":"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"}