themelia-react-ui 2.0.3 → 2.0.4

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 (421) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +65 -28
  3. package/dist/{accordion-Cjb6sx0G.js → accordion-96o0pN62.js} +5 -5
  4. package/dist/{accordion-Cjb6sx0G.js.map → accordion-96o0pN62.js.map} +1 -1
  5. package/dist/action-menu-CHgs8vmj.js +281 -0
  6. package/dist/action-menu-CHgs8vmj.js.map +1 -0
  7. package/dist/{affordance-geometry.generated-tF36bREk.js → affordance-geometry.generated-B8yGOr8-.js} +7 -1
  8. package/dist/affordance-geometry.generated-B8yGOr8-.js.map +1 -0
  9. package/dist/{ai-artifact-DvTwDVyL.js → ai-artifact-BZUGwBq6.js} +277 -276
  10. package/dist/ai-artifact-BZUGwBq6.js.map +1 -0
  11. package/dist/{app-shell-C4FhvCqF.js → app-shell-D63ATkIK.js} +84 -83
  12. package/dist/app-shell-D63ATkIK.js.map +1 -0
  13. package/dist/{attachment-BxDfL2mw.js → attachment-DkoqHPPl.js} +7 -7
  14. package/dist/{attachment-BxDfL2mw.js.map → attachment-DkoqHPPl.js.map} +1 -1
  15. package/dist/{auth-BGua8ouh.js → auth-D2FVZ1MH.js} +10 -10
  16. package/dist/{auth-BGua8ouh.js.map → auth-D2FVZ1MH.js.map} +1 -1
  17. package/dist/{avatar-DAPlDvhJ.js → avatar-DWO_HHhB.js} +5 -5
  18. package/dist/{avatar-DAPlDvhJ.js.map → avatar-DWO_HHhB.js.map} +1 -1
  19. package/dist/{badge-HpFqoqSY.js → badge-DErMA7ul.js} +4 -4
  20. package/dist/{badge-HpFqoqSY.js.map → badge-DErMA7ul.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/batch-action-bar.js +1 -1
  27. package/dist/base/buttons.js +1 -1
  28. package/dist/base/cards.js +2 -2
  29. package/dist/base/carousel.js +3 -3
  30. package/dist/base/cascader.js +13 -13
  31. package/dist/base/chart.js +1 -1
  32. package/dist/base/choice-inputs.js +2 -2
  33. package/dist/base/code-block.js +1 -1
  34. package/dist/base/combobox.js +1 -1
  35. package/dist/base/command.js +1 -1
  36. package/dist/base/copyable.js +1 -1
  37. package/dist/base/date-pickers.js +2 -2
  38. package/dist/base/display.js +6 -6
  39. package/dist/base/feedback.js +3 -3
  40. package/dist/base/forms-numeric.js +1 -1
  41. package/dist/base/forms.js +3 -3
  42. package/dist/base/inline-edit.js +10 -10
  43. package/dist/base/item.js +1 -1
  44. package/dist/base/media-gallery.js +1 -1
  45. package/dist/base/metadata-list.js +1 -1
  46. package/dist/base/navigation.js +6 -6
  47. package/dist/base/popover-menu.js +1 -1
  48. package/dist/base/popover.js +1 -1
  49. package/dist/base/qr-code.js +1 -1
  50. package/dist/base/repeaters.js +9 -9
  51. package/dist/base/sheet.js +1 -1
  52. package/dist/base/sidebar.js +1 -1
  53. package/dist/base/signature-pad.js +6 -6
  54. package/dist/base/skeleton.js +1 -1
  55. package/dist/base/spinner.js +4 -4
  56. package/dist/base/structure.js +1 -1
  57. package/dist/base/table.js +1 -1
  58. package/dist/base/text-inputs.js +2 -2
  59. package/dist/base/toaster.js +3 -3
  60. package/dist/base/tree.js +1 -1
  61. package/dist/base/upload-queue.js +1 -1
  62. package/dist/base/upload.js +3 -3
  63. package/dist/base/value-inputs.js +1 -1
  64. package/dist/{batch-action-bar-DnUJ21NQ.js → batch-action-bar-CdfIkCsV.js} +4 -4
  65. package/dist/{batch-action-bar-DnUJ21NQ.js.map → batch-action-bar-CdfIkCsV.js.map} +1 -1
  66. package/dist/blocks/admin.js +20 -20
  67. package/dist/blocks/admin.js.map +1 -1
  68. package/dist/blocks/ai.js +15 -15
  69. package/dist/blocks/analytics/usage-card.js +1 -1
  70. package/dist/blocks/analytics.js +17 -17
  71. package/dist/blocks/analytics.js.map +1 -1
  72. package/dist/blocks/collaboration.js +1 -1
  73. package/dist/blocks/commerce/receipt.js +1 -1
  74. package/dist/blocks/commerce.js +570 -567
  75. package/dist/blocks/commerce.js.map +1 -1
  76. package/dist/blocks/data-display.js +2 -2
  77. package/dist/blocks/onboarding.js +5 -5
  78. package/dist/blocks/planning.js +11 -11
  79. package/dist/blocks/timelines.js +1 -1
  80. package/dist/{breadcrumbs-C-oqs1sQ.js → breadcrumbs-B-WFKecD.js} +4 -4
  81. package/dist/{breadcrumbs-C-oqs1sQ.js.map → breadcrumbs-B-WFKecD.js.map} +1 -1
  82. package/dist/{button-DVzspB_G.js → button-DkmK-z8E.js} +2 -2
  83. package/dist/{button-DVzspB_G.js.map → button-DkmK-z8E.js.map} +1 -1
  84. package/dist/{buttons-DPZekJFu.js → buttons-BbfzgczK.js} +8 -8
  85. package/dist/{buttons-DPZekJFu.js.map → buttons-BbfzgczK.js.map} +1 -1
  86. package/dist/{cards-BaBZR-AU.js → cards-4JTWqvVe.js} +10 -10
  87. package/dist/cards-4JTWqvVe.js.map +1 -0
  88. package/dist/{chart-ZOYyK2xG.js → chart-C19flDQb.js} +4 -4
  89. package/dist/{chart-ZOYyK2xG.js.map → chart-C19flDQb.js.map} +1 -1
  90. package/dist/{checkbox-AWIhNhmo.js → checkbox-CzYUTPeJ.js} +9 -5
  91. package/dist/checkbox-CzYUTPeJ.js.map +1 -0
  92. package/dist/{choice-inputs-CNHvARCJ.js → choice-inputs-JLtij2y4.js} +182 -176
  93. package/dist/choice-inputs-JLtij2y4.js.map +1 -0
  94. package/dist/{code-block-DeneBJR_.js → code-block-CGNaUtAE.js} +7 -7
  95. package/dist/{code-block-DeneBJR_.js.map → code-block-CGNaUtAE.js.map} +1 -1
  96. package/dist/{collapsible-C-_l4hpy.js → collapsible-Do4G0zcC.js} +3 -3
  97. package/dist/{collapsible-C-_l4hpy.js.map → collapsible-Do4G0zcC.js.map} +1 -1
  98. package/dist/{collection-content-By56pLog.js → collection-content-C0e8SsTm.js} +3 -3
  99. package/dist/{collection-content-By56pLog.js.map → collection-content-C0e8SsTm.js.map} +1 -1
  100. package/dist/{combobox-Dxo2fAYQ.js → combobox-CBJDs6w_.js} +12 -12
  101. package/dist/{combobox-Dxo2fAYQ.js.map → combobox-CBJDs6w_.js.map} +1 -1
  102. package/dist/{combobox-DaHESuiL.js → combobox-hbhSS18O.js} +7 -7
  103. package/dist/{combobox-DaHESuiL.js.map → combobox-hbhSS18O.js.map} +1 -1
  104. package/dist/{command-C25VMRII.js → command-D8NrBj-b.js} +7 -7
  105. package/dist/{command-C25VMRII.js.map → command-D8NrBj-b.js.map} +1 -1
  106. package/dist/{comments-DD0DUPwJ.js → comments-Di4w0H_S.js} +383 -382
  107. package/dist/comments-Di4w0H_S.js.map +1 -0
  108. package/dist/components/base/action-menu/action-menu.d.ts +2 -0
  109. package/dist/components/base/cards/card.recipes.d.ts +12 -5
  110. package/dist/components/base/cards/smart-card.types.d.ts +12 -7
  111. package/dist/components/base/choice-inputs/checkbox.d.ts +7 -2
  112. package/dist/components/base/choice-inputs/switch-card.d.ts +7 -0
  113. package/dist/components/base/choice-inputs/toggle-field.d.ts +7 -0
  114. package/dist/components/base/date-pickers/datepicker.types.d.ts +7 -0
  115. package/dist/components/base/forms/controlled-form-field.d.ts +6 -6
  116. package/dist/components/base/forms/form-field.d.ts +5 -3
  117. package/dist/components/base/forms/index.d.ts +1 -0
  118. package/dist/components/base/forms/server-errors.d.ts +16 -0
  119. package/dist/components/base/forms/workflow.d.ts +5 -2
  120. package/dist/components/base/metadata-list/metadata-list.d.ts +3 -1
  121. package/dist/components/base/navigation/page-header/page-header.d.ts +4 -2
  122. package/dist/components/base/structure/composition.recipes.d.ts +17 -0
  123. package/dist/components/base/text-inputs/hooks/use-form-field-state.d.ts +7 -2
  124. package/dist/components/base/text-inputs/input.d.ts +4 -2
  125. package/dist/components/base/text-inputs/textarea.d.ts +4 -2
  126. package/dist/components/base/value-inputs/date-time-input.d.ts +2 -1
  127. package/dist/components/base/value-inputs/slider.d.ts +5 -1
  128. package/dist/components/base/value-inputs/tags-input.d.ts +5 -1
  129. package/dist/components/typography/text.styles.d.ts +26 -1
  130. package/dist/composition.recipes-COdiFhxB.js +19 -0
  131. package/dist/composition.recipes-COdiFhxB.js.map +1 -0
  132. package/dist/containers-CRmHf7GP.js +104 -0
  133. package/dist/containers-CRmHf7GP.js.map +1 -0
  134. package/dist/{copyable-ClBuk_UK.js → copyable-CnGCZdX4.js} +4 -4
  135. package/dist/{copyable-ClBuk_UK.js.map → copyable-CnGCZdX4.js.map} +1 -1
  136. package/dist/{data-display-DT_khPl_.js → data-display-D4oujtx0.js} +239 -238
  137. package/dist/data-display-D4oujtx0.js.map +1 -0
  138. package/dist/{date-DCrsDTZc.js → date-Q7jnXxpk.js} +5 -5
  139. package/dist/{date-DCrsDTZc.js.map → date-Q7jnXxpk.js.map} +1 -1
  140. package/dist/{date-picker-B2K3ucWn.js → date-picker-zOt1oNss.js} +102 -90
  141. package/dist/date-picker-zOt1oNss.js.map +1 -0
  142. package/dist/date-pickers-cj8IXbDC.js +179 -0
  143. package/dist/date-pickers-cj8IXbDC.js.map +1 -0
  144. package/dist/{display-hAc1HjpI.js → display-BB4BL_-K.js} +8 -8
  145. package/dist/{display-hAc1HjpI.js.map → display-BB4BL_-K.js.map} +1 -1
  146. package/dist/{dropdown-menu-Cl4X7L5S.js → dropdown-menu-CjY8Vt7W.js} +8 -8
  147. package/dist/{dropdown-menu-Cl4X7L5S.js.map → dropdown-menu-CjY8Vt7W.js.map} +1 -1
  148. package/dist/features/activities.js +11 -11
  149. package/dist/features/ai-chat.js +9 -9
  150. package/dist/features/appointment-calendar.js +222 -220
  151. package/dist/features/appointment-calendar.js.map +1 -1
  152. package/dist/features/async-preview.js +8 -8
  153. package/dist/features/combobox.js +1 -1
  154. package/dist/features/comments.js +1 -1
  155. package/dist/features/data-view.js +10 -10
  156. package/dist/features/email-composer.js +275 -274
  157. package/dist/features/email-composer.js.map +1 -1
  158. package/dist/features/event-calendar.js +199 -198
  159. package/dist/features/event-calendar.js.map +1 -1
  160. package/dist/features/filters.js +1 -1
  161. package/dist/features/global-search.js +12 -12
  162. package/dist/features/kanban.js +4 -4
  163. package/dist/features/map.js +7 -7
  164. package/dist/features/media-library.js +623 -622
  165. package/dist/features/media-library.js.map +1 -1
  166. package/dist/features/mentions.js +1 -1
  167. package/dist/features/overlays.js +1 -1
  168. package/dist/features/products.js +973 -969
  169. package/dist/features/products.js.map +1 -1
  170. package/dist/features/questionnaire.js +12 -12
  171. package/dist/features/resource-assignment.js +8 -8
  172. package/dist/features/resource.js +113 -112
  173. package/dist/features/resource.js.map +1 -1
  174. package/dist/features/rich-text-editor.js +2 -2
  175. package/dist/features/schema-form.js +254 -253
  176. package/dist/features/schema-form.js.map +1 -1
  177. package/dist/features/suggestions.js +3 -3
  178. package/dist/features/sync.js +3 -3
  179. package/dist/features/table.js +1 -1
  180. package/dist/features/theme-tweaker.js +19 -19
  181. package/dist/features/theme-tweaker.js.map +1 -1
  182. package/dist/{feedback-BYIhtitP.js → feedback-DZNL5Lg1.js} +9 -9
  183. package/dist/{feedback-BYIhtitP.js.map → feedback-DZNL5Lg1.js.map} +1 -1
  184. package/dist/{field-affordance-recipes-DZhnIL_Y.js → field-affordance-recipes-DjwGx8eM.js} +2 -2
  185. package/dist/{field-affordance-recipes-DZhnIL_Y.js.map → field-affordance-recipes-DjwGx8eM.js.map} +1 -1
  186. package/dist/{filters-DJVAveHA.js → filters-BcT-uoFy.js} +19 -19
  187. package/dist/{filters-DJVAveHA.js.map → filters-BcT-uoFy.js.map} +1 -1
  188. package/dist/{form-field-CwH9y77i.js → form-field-CsgRmdit.js} +14 -8
  189. package/dist/form-field-CsgRmdit.js.map +1 -0
  190. package/dist/{form-sizing-BdP_Mf5p.js → form-sizing-NXgjkmBG.js} +3 -3
  191. package/dist/{form-sizing-BdP_Mf5p.js.map → form-sizing-NXgjkmBG.js.map} +1 -1
  192. package/dist/{forms-B9G_xwzi.js → forms-BV5m5aQF.js} +83 -65
  193. package/dist/forms-BV5m5aQF.js.map +1 -0
  194. package/dist/{forms-numeric-B_jraJaQ.js → forms-numeric-Cd33AKbD.js} +288 -288
  195. package/dist/forms-numeric-Cd33AKbD.js.map +1 -0
  196. package/dist/{header-BSfIEWbI.js → header-BA697l4a.js} +14 -14
  197. package/dist/{header-BSfIEWbI.js.map → header-BA697l4a.js.map} +1 -1
  198. package/dist/hooks/useFormErrors.d.ts +1 -1
  199. package/dist/{hooks-ClH9thn4.js → hooks-BQ-L7Uu2.js} +2 -2
  200. package/dist/{hooks-ClH9thn4.js.map → hooks-BQ-L7Uu2.js.map} +1 -1
  201. package/dist/{icon-badge-DYKIwvOV.js → icon-badge-COWbCCWu.js} +3 -3
  202. package/dist/{icon-badge-DYKIwvOV.js.map → icon-badge-COWbCCWu.js.map} +1 -1
  203. package/dist/index.js +2 -2
  204. package/dist/input-Cdw4k0fb.js +289 -0
  205. package/dist/input-Cdw4k0fb.js.map +1 -0
  206. package/dist/{input-CZw8iU99.js → input-DOPL5_QE.js} +3 -3
  207. package/dist/{input-CZw8iU99.js.map → input-DOPL5_QE.js.map} +1 -1
  208. package/dist/item-BvZ2DR_x.js +277 -0
  209. package/dist/item-BvZ2DR_x.js.map +1 -0
  210. package/dist/layout/app-shell.js +1 -1
  211. package/dist/layout/auth.js +1 -1
  212. package/dist/layout/containers.js +1 -1
  213. package/dist/layout/header.js +1 -1
  214. package/dist/layout/hooks.js +1 -1
  215. package/dist/layout/navigation.js +1 -1
  216. package/dist/layout/page.js +1 -1
  217. package/dist/layout/settings.js +1 -1
  218. package/dist/layout/sidebar.js +2 -2
  219. package/dist/layout/workspace.js +1 -1
  220. package/dist/layout.js +10 -10
  221. package/dist/lib/affordance-geometry.generated.d.ts +6 -0
  222. package/dist/lib/ui-provider/types.d.ts +1 -1
  223. package/dist/lib/utils.js +1 -1
  224. package/dist/{media-gallery-3zIVLMWH.js → media-gallery-CSl5W1Fy.js} +6 -6
  225. package/dist/{media-gallery-3zIVLMWH.js.map → media-gallery-CSl5W1Fy.js.map} +1 -1
  226. package/dist/{mentions-CGlEJ15c.js → mentions-RKOQaaIB.js} +8 -8
  227. package/dist/{mentions-CGlEJ15c.js.map → mentions-RKOQaaIB.js.map} +1 -1
  228. package/dist/{message-DZ_ruyUV.js → message-INU2xsxu.js} +4 -4
  229. package/dist/{message-DZ_ruyUV.js.map → message-INU2xsxu.js.map} +1 -1
  230. package/dist/metadata-list-qVV7AVxa.js +443 -0
  231. package/dist/metadata-list-qVV7AVxa.js.map +1 -0
  232. package/dist/{navigation-BzhHI3lo.js → navigation-BQNcg1jT.js} +8 -8
  233. package/dist/{navigation-BzhHI3lo.js.map → navigation-BQNcg1jT.js.map} +1 -1
  234. package/dist/{navigation-Bnotn4AQ.js → navigation-DLF3E1IC.js} +7 -7
  235. package/dist/{navigation-Bnotn4AQ.js.map → navigation-DLF3E1IC.js.map} +1 -1
  236. package/dist/{navigation-row-recipes-BFLCk_Aq.js → navigation-row-recipes-WZEs-hYo.js} +2 -2
  237. package/dist/{navigation-row-recipes-BFLCk_Aq.js.map → navigation-row-recipes-WZEs-hYo.js.map} +1 -1
  238. package/dist/{number-DbV1Dija.js → number-E_OiIfJz.js} +5 -5
  239. package/dist/{number-DbV1Dija.js.map → number-E_OiIfJz.js.map} +1 -1
  240. package/dist/{overflow-tab-bar-CWY7Nogn.js → overflow-tab-bar-CrbqMteP.js} +107 -105
  241. package/dist/overflow-tab-bar-CrbqMteP.js.map +1 -0
  242. package/dist/{overlays-tMkF-VAN.js → overlays-BlKynmde.js} +228 -227
  243. package/dist/overlays-BlKynmde.js.map +1 -0
  244. package/dist/page-CIwNUtGr.js +227 -0
  245. package/dist/page-CIwNUtGr.js.map +1 -0
  246. package/dist/page-header-commands-DFMlNYzN.js +128 -0
  247. package/dist/page-header-commands-DFMlNYzN.js.map +1 -0
  248. package/dist/{pagination-BL25hu2s.js → pagination-Ch8X_47u.js} +5 -5
  249. package/dist/{pagination-BL25hu2s.js.map → pagination-Ch8X_47u.js.map} +1 -1
  250. package/dist/{popover-menu-Cn9rUkdc.js → popover-menu-BYaCdFhf.js} +6 -6
  251. package/dist/{popover-menu-Cn9rUkdc.js.map → popover-menu-BYaCdFhf.js.map} +1 -1
  252. package/dist/{popover-gnTOhbFM.js → popover-uwzX2vo7.js} +4 -4
  253. package/dist/{popover-gnTOhbFM.js.map → popover-uwzX2vo7.js.map} +1 -1
  254. package/dist/{primitives-BFK08r9M.js → primitives-Du64iDbb.js} +6 -6
  255. package/dist/{primitives-BFK08r9M.js.map → primitives-Du64iDbb.js.map} +1 -1
  256. package/dist/primitives.js +4 -4
  257. package/dist/{progress-B1VnCT0K.js → progress-BvF2oCdV.js} +5 -5
  258. package/dist/{progress-B1VnCT0K.js.map → progress-BvF2oCdV.js.map} +1 -1
  259. package/dist/{receipt-BVSOH3Xo.js → receipt-D789Jwyy.js} +6 -6
  260. package/dist/{receipt-BVSOH3Xo.js.map → receipt-D789Jwyy.js.map} +1 -1
  261. package/dist/{rich-text-GOUyKQ-s.js → rich-text-CLJEf76s.js} +4 -4
  262. package/dist/{rich-text-GOUyKQ-s.js.map → rich-text-CLJEf76s.js.map} +1 -1
  263. package/dist/{rich-text-editor-cRLC-eBK.js → rich-text-editor-Cm1dpUpQ.js} +10 -10
  264. package/dist/{rich-text-editor-cRLC-eBK.js.map → rich-text-editor-Cm1dpUpQ.js.map} +1 -1
  265. package/dist/{rich-text-editor-toolbar-DfXg0-VC.js → rich-text-editor-toolbar-L__e4x47.js} +4 -4
  266. package/dist/{rich-text-editor-toolbar-DfXg0-VC.js.map → rich-text-editor-toolbar-L__e4x47.js.map} +1 -1
  267. package/dist/{scroll-area-DcI-M1UT.js → scroll-area-La5RXsEk.js} +2 -2
  268. package/dist/{scroll-area-DcI-M1UT.js.map → scroll-area-La5RXsEk.js.map} +1 -1
  269. package/dist/{separator-Bom7NsGO.js → separator-DAEV0w65.js} +2 -2
  270. package/dist/{separator-Bom7NsGO.js.map → separator-DAEV0w65.js.map} +1 -1
  271. package/dist/{separator-BDV-Y648.js → separator-GNfPG-90.js} +3 -3
  272. package/dist/{separator-BDV-Y648.js.map → separator-GNfPG-90.js.map} +1 -1
  273. package/dist/services/actions.js +1 -1
  274. package/dist/settings-BA2iboic.js +174 -0
  275. package/dist/settings-BA2iboic.js.map +1 -0
  276. package/dist/{sheet-ijlsjq-n.js → sheet-DoAxTb2J.js} +7 -7
  277. package/dist/{sheet-ijlsjq-n.js.map → sheet-DoAxTb2J.js.map} +1 -1
  278. package/dist/{sidebar-DkTO4VTO.js → sidebar-ByqKR_W5.js} +13 -13
  279. package/dist/{sidebar-DkTO4VTO.js.map → sidebar-ByqKR_W5.js.map} +1 -1
  280. package/dist/{sidebar-Db6gkh3U.js → sidebar-D2iSnGJ7.js} +11 -11
  281. package/dist/{sidebar-Db6gkh3U.js.map → sidebar-D2iSnGJ7.js.map} +1 -1
  282. package/dist/{skeleton-Byjnt7qr.js → skeleton-CUj8O5Bd.js} +3 -3
  283. package/dist/{skeleton-Byjnt7qr.js.map → skeleton-CUj8O5Bd.js.map} +1 -1
  284. package/dist/smart-card-CqkzQsK-.js +614 -0
  285. package/dist/smart-card-CqkzQsK-.js.map +1 -0
  286. package/dist/{structure-BmisBK-3.js → structure-C0V0_Fyf.js} +3 -3
  287. package/dist/{structure-BmisBK-3.js.map → structure-C0V0_Fyf.js.map} +1 -1
  288. package/dist/{structure.recipes-EPz60cU8.js → structure.recipes-BB4-n58V.js} +2 -2
  289. package/dist/{structure.recipes-EPz60cU8.js.map → structure.recipes-BB4-n58V.js.map} +1 -1
  290. package/dist/style.css +1 -1
  291. package/dist/{table-DsfzoUia.js → table-CpvnzJn9.js} +3 -3
  292. package/dist/{table-DsfzoUia.js.map → table-CpvnzJn9.js.map} +1 -1
  293. package/dist/{table-BweFy_P9.js → table-DH7rozUv.js} +19 -19
  294. package/dist/{table-BweFy_P9.js.map → table-DH7rozUv.js.map} +1 -1
  295. package/dist/{tabs-CDocW5D1.js → tabs-eqVsJZWO.js} +7 -7
  296. package/dist/{tabs-CDocW5D1.js.map → tabs-eqVsJZWO.js.map} +1 -1
  297. package/dist/{text-inputs-f9Ia-aCi.js → text-inputs-DXItiR0O.js} +101 -98
  298. package/dist/text-inputs-DXItiR0O.js.map +1 -0
  299. package/dist/{text.styles-g4He6UIW.js → text.styles-B64My8RZ.js} +25 -10
  300. package/dist/text.styles-B64My8RZ.js.map +1 -0
  301. package/dist/theme.css +152 -112
  302. package/dist/{timelines-CwM_9IhD.js → timelines-DmtztAY_.js} +10 -10
  303. package/dist/{timelines-CwM_9IhD.js.map → timelines-DmtztAY_.js.map} +1 -1
  304. package/dist/{tooltip-yiRJUFjp.js → tooltip-B4hjKtoV.js} +3 -3
  305. package/dist/{tooltip-yiRJUFjp.js.map → tooltip-B4hjKtoV.js.map} +1 -1
  306. package/dist/{tree-WnKQzwbq.js → tree-CV11PURP.js} +8 -8
  307. package/dist/{tree-WnKQzwbq.js.map → tree-CV11PURP.js.map} +1 -1
  308. package/dist/typography/rich-text.js +1 -1
  309. package/dist/typography-CSyJrh28.js +117 -0
  310. package/dist/typography-CSyJrh28.js.map +1 -0
  311. package/dist/typography.js +1 -1
  312. package/dist/{ui-provider-C_U0Xma4.js → ui-provider-CQCuCBcy.js} +3 -3
  313. package/dist/ui-provider-CQCuCBcy.js.map +1 -0
  314. package/dist/ui-provider.js +1 -1
  315. package/dist/{upload-CXyxmQBP.js → upload-C9SA0X-8.js} +11 -11
  316. package/dist/{upload-CXyxmQBP.js.map → upload-C9SA0X-8.js.map} +1 -1
  317. package/dist/{upload-queue-Boscubn9.js → upload-queue-DhQJiSRc.js} +9 -9
  318. package/dist/{upload-queue-Boscubn9.js.map → upload-queue-DhQJiSRc.js.map} +1 -1
  319. package/dist/{usage-card-BhO5eqkX.js → usage-card-DVTRDmGz.js} +134 -133
  320. package/dist/usage-card-DVTRDmGz.js.map +1 -0
  321. package/dist/{utils-BRhFDwuU.js → utils-CF3c95Io.js} +68 -5
  322. package/dist/utils-CF3c95Io.js.map +1 -0
  323. package/dist/value-inputs-C0o70p-U.js +980 -0
  324. package/dist/value-inputs-C0o70p-U.js.map +1 -0
  325. package/dist/{value-typography-BP8OG6h5.js → value-typography-ClupF0Gz.js} +2 -2
  326. package/dist/{value-typography-BP8OG6h5.js.map → value-typography-ClupF0Gz.js.map} +1 -1
  327. package/dist/workspace-9EFVXUyk.js +410 -0
  328. package/dist/workspace-9EFVXUyk.js.map +1 -0
  329. package/docs/consumer-skill/SKILL.md +14 -129
  330. package/docs/consumer-skill/examples/app-layout.tsx +22 -12
  331. package/docs/consumer-skill/examples/authentication.tsx +77 -0
  332. package/docs/consumer-skill/examples/edit.tsx +30 -38
  333. package/docs/consumer-skill/examples/manifest.json +51 -1
  334. package/docs/consumer-skill/examples/rhf-bindings.tsx +86 -0
  335. package/docs/consumer-skill/examples/rhf-edit-page.tsx +141 -0
  336. package/docs/consumer-skill/examples/rhf-overlay-form.tsx +92 -0
  337. package/docs/consumer-skill/examples/rhf-transport.tsx +28 -0
  338. package/docs/consumer-skill/references/agents-md.md +17 -7
  339. package/docs/consumer-skill/references/authentication.md +42 -0
  340. package/docs/consumer-skill/references/component-contracts.json +319824 -0
  341. package/docs/consumer-skill/references/composition-mapping.md +92 -0
  342. package/docs/consumer-skill/references/composition.md +43 -19
  343. package/docs/consumer-skill/references/design-contract.md +32 -0
  344. package/docs/consumer-skill/references/discovery.md +84 -7
  345. package/docs/consumer-skill/references/installation.md +40 -36
  346. package/docs/consumer-skill/references/integration.md +6 -2
  347. package/docs/consumer-skill/references/public-api.json +1519 -65
  348. package/docs/consumer-skill/references/review.md +9 -4
  349. package/docs/consumer-skill/references/rhf-workflows.md +86 -0
  350. package/docs/consumer-skill/references/screen-archetypes.md +22 -0
  351. package/docs/consumer-skill/references/theming.md +8 -9
  352. package/docs/consumer-skill/references/tokens.json +12 -3
  353. package/docs/consumer-skill/references/workflows.md +2 -1
  354. package/docs/consumer-skill/scripts/composition-schema.d.mts +2 -0
  355. package/docs/consumer-skill/scripts/composition-schema.mjs +32 -0
  356. package/docs/consumer-skill/scripts/composition.mjs +198 -0
  357. package/docs/consumer-skill/scripts/discovery.mjs +42 -10
  358. package/docs/consumer-skill/scripts/inspect-component.mjs +11 -0
  359. package/docs/consumer-skill/scripts/inspect-tokens.mjs +11 -0
  360. package/docs/consumer-skill/scripts/inspection.mjs +138 -0
  361. package/docs/consumer-skill/scripts/map-composition.mjs +12 -0
  362. package/docs/consumer-skill/scripts/setup-skills.mjs +76 -0
  363. package/docs/consumer-skills/themelia-components/SKILL.md +30 -0
  364. package/docs/consumer-skills/themelia-composition/SKILL.md +35 -0
  365. package/docs/consumer-skills/themelia-forms/SKILL.md +12 -0
  366. package/docs/consumer-skills/themelia-foundation/SKILL.md +14 -0
  367. package/docs/consumer-skills/themelia-tokenization/SKILL.md +35 -0
  368. package/package.json +4 -2
  369. package/templates/README.md +39 -0
  370. package/templates/admin-shell-template.tsx +382 -0
  371. package/templates/analytics-operations-template.tsx +376 -0
  372. package/templates/customers-template.tsx +509 -0
  373. package/templates/index.ts +29 -0
  374. package/templates/orders-template.tsx +1102 -0
  375. package/templates/products-template.tsx +834 -0
  376. package/templates/user-permissions-template.tsx +450 -0
  377. package/dist/action-menu-CllU52Mm.js +0 -280
  378. package/dist/action-menu-CllU52Mm.js.map +0 -1
  379. package/dist/affordance-geometry.generated-tF36bREk.js.map +0 -1
  380. package/dist/ai-artifact-DvTwDVyL.js.map +0 -1
  381. package/dist/app-shell-C4FhvCqF.js.map +0 -1
  382. package/dist/cards-BaBZR-AU.js.map +0 -1
  383. package/dist/checkbox-AWIhNhmo.js.map +0 -1
  384. package/dist/choice-inputs-CNHvARCJ.js.map +0 -1
  385. package/dist/comments-DD0DUPwJ.js.map +0 -1
  386. package/dist/containers-Mu1LMGV1.js +0 -103
  387. package/dist/containers-Mu1LMGV1.js.map +0 -1
  388. package/dist/data-display-DT_khPl_.js.map +0 -1
  389. package/dist/date-picker-B2K3ucWn.js.map +0 -1
  390. package/dist/date-pickers-Ds8gLaoP.js +0 -175
  391. package/dist/date-pickers-Ds8gLaoP.js.map +0 -1
  392. package/dist/form-field-CwH9y77i.js.map +0 -1
  393. package/dist/forms-B9G_xwzi.js.map +0 -1
  394. package/dist/forms-numeric-B_jraJaQ.js.map +0 -1
  395. package/dist/input-DQdEd0YD.js +0 -263
  396. package/dist/input-DQdEd0YD.js.map +0 -1
  397. package/dist/item-K5_ghvze.js +0 -275
  398. package/dist/item-K5_ghvze.js.map +0 -1
  399. package/dist/metadata-list-8N16ZMW_.js +0 -405
  400. package/dist/metadata-list-8N16ZMW_.js.map +0 -1
  401. package/dist/overflow-tab-bar-CWY7Nogn.js.map +0 -1
  402. package/dist/overlays-tMkF-VAN.js.map +0 -1
  403. package/dist/page-CL9YeH_V.js +0 -224
  404. package/dist/page-CL9YeH_V.js.map +0 -1
  405. package/dist/page-header-commands-DOb6WsfD.js +0 -126
  406. package/dist/page-header-commands-DOb6WsfD.js.map +0 -1
  407. package/dist/settings-ybnjVwbd.js +0 -171
  408. package/dist/settings-ybnjVwbd.js.map +0 -1
  409. package/dist/smart-card-DiC5aac3.js +0 -604
  410. package/dist/smart-card-DiC5aac3.js.map +0 -1
  411. package/dist/text-inputs-f9Ia-aCi.js.map +0 -1
  412. package/dist/text.styles-g4He6UIW.js.map +0 -1
  413. package/dist/typography-UTnveOEy.js +0 -117
  414. package/dist/typography-UTnveOEy.js.map +0 -1
  415. package/dist/ui-provider-C_U0Xma4.js.map +0 -1
  416. package/dist/usage-card-BhO5eqkX.js.map +0 -1
  417. package/dist/utils-BRhFDwuU.js.map +0 -1
  418. package/dist/value-inputs-TaX4OjNk.js +0 -963
  419. package/dist/value-inputs-TaX4OjNk.js.map +0 -1
  420. package/dist/workspace-B-OEm3Kf.js +0 -408
  421. package/dist/workspace-B-OEm3Kf.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"form-field-CwH9y77i.js","names":["React","cn","Label","Text","Stack","React$1","FormField","forwardRef","rootProps","hasError","error","supportingText","helperText","hint","showBottomText","resolvedRequired","required","generatedId","canAssociateChild","children","childId","resolvedHtmlFor","htmlFor","label","resolvedChildren","className","supportingTextId"],"sources":["../src/components/base/forms/form-field.tsx"],"sourcesContent":["/**\n * FormField — optional-peer-free presentation chrome for a label, control,\n * hint/helper, and validation error. The react-hook-form integration lives in\n * `controlled-form-field.tsx` so presentational consumers do not load RHF.\n */\n\nimport * as React from 'react';\nimport { forwardRef, type ComponentPropsWithoutRef, type ReactNode } from 'react';\nimport { Stack } from '../structure';\nimport { Label, Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport { formLabelLineClass } from './form-sizing';\n\nexport interface FieldChromeProps {\n\t/** Caption rendered above the control, associated through `htmlFor`. */\n\tlabel?: ReactNode;\n\t/** Marks the field required and renders the required indicator by the label. */\n\trequired?: boolean;\n\t/**\n\t * Lowest-priority supporting line: shown only when neither `error` nor\n\t * `helperText` is set. Use for formatting rules and expectations.\n\t */\n\thint?: ReactNode;\n\t/**\n\t * Validation message, and the highest-priority supporting line — it replaces\n\t * `helperText` and `hint` rather than stacking with them. Rendered with\n\t * `role=\"alert\"` and `aria-live=\"polite\"` in the error tone.\n\t */\n\terror?: ReactNode;\n\t/**\n\t * Middle-priority supporting line: replaces `hint`, and is itself replaced by\n\t * `error`. The field renders exactly one supporting line, resolved as\n\t * `error || helperText || hint` — copy the user still needs while fixing a\n\t * validation failure therefore belongs in the `error` message itself.\n\t */\n\thelperText?: ReactNode;\n}\n\nexport interface FormFieldProps extends FieldChromeProps, Omit<ComponentPropsWithoutRef<'div'>, 'children'> {\n\tchildren: ReactNode;\n\t/** Native ID of the labelled control. With compound children, assign it to the nested control; passive wrappers are left untouched. Direct controls receive an automatic ID when omitted. */\n\thtmlFor?: string;\n\t/** ID for the resolved hint, helper, or error; controls can reference it explicitly. */\n\tsupportingTextId?: string;\n}\n\nexport const FormField = forwardRef<HTMLDivElement, FormFieldProps>(function FormField({\n\tchildren,\n\tlabel,\n\trequired,\n\thint,\n\terror,\n\thelperText,\n\thtmlFor,\n\tsupportingTextId,\n\tclassName,\n\t...rootProps\n}, ref) {\n\tconst hasError = Boolean(error);\n\tconst supportingText = error || helperText || (!hasError ? hint : undefined);\n\tconst showBottomText = Boolean(supportingText);\n\tconst resolvedRequired = required;\n\tconst generatedId = React.useId();\n\t// A layout wrapper is not a labelable control. In a compound field,\n\t// htmlFor already names its nested control; copying it onto the wrapper\n\t// creates duplicate IDs and breaks the native label association.\n\tconst canAssociateChild = React.isValidElement(children) && children.type !== React.Fragment &&\n\t\t(typeof children.type !== 'string' || ['input', 'select', 'textarea', 'button', 'meter', 'output', 'progress'].includes(children.type));\n\tconst childId =\n\t\tcanAssociateChild\n\t\t\t? (children.props as { id?: string }).id\n\t\t\t: undefined;\n\tconst resolvedHtmlFor = htmlFor ?? childId ?? (label && canAssociateChild ? `form-field-${generatedId}` : undefined);\n\tconst resolvedChildren =\n\t\tresolvedHtmlFor && canAssociateChild && !childId\n\t\t\t? React.cloneElement(children as React.ReactElement<{ id?: string }>, { id: resolvedHtmlFor })\n\t\t\t: children;\n\n\treturn (\n\t\t<Stack ref={ref} gap=\"xs\" className={cn('form-field--component w-full box-border', className)} {...rootProps}>\n\t\t\t{!!label && (\n\t\t\t\t<Label\n\t\t\t\t\thtmlFor={resolvedHtmlFor}\n\t\t\t\t\tclassName={cn('form-field--label flex items-center gap-space-xs text-inherit', formLabelLineClass)}\n\t\t\t\t>\n\t\t\t\t\t{label}\n\t\t\t\t\t{!!resolvedRequired && (\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\ttype=\"error\"\n\t\t\t\t\t\t\tclassName=\"form-field--required\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t*\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t</Label>\n\t\t\t)}\n\n\t\t\t{resolvedChildren}\n\n\t\t\t{!!showBottomText && (\n\t\t\t\t<Text\n\t\t\t\t\tid={supportingTextId}\n\t\t\t\t\ttag=\"p\"\n\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\ttype={hasError ? 'error' : 'secondary'}\n\t\t\t\t\t{...(hasError ? { role: 'alert', 'aria-live': 'polite' } : {})}\n\t\t\t\t\tclassName=\"form-field--supporting\"\n\t\t\t\t>\n\t\t\t\t\t{supportingText}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t</Stack>\n\t);\n});\n\nFormField.displayName = 'FormField';\n"],"mappings":";;;;;;;;;AA8CA,IAAaM,IAAYC,EAA2C,SAAmB,EACtF,aACA,UACA,aACA,SACA,UACA,eACA,YACA,qBACA,cACA,GAAGC,KACD,GAAK;CACP,IAAMC,IAAW,EAAQC,GACnBC,IAAiBD,KAASE,MAAgBH,IAAkB,KAAA,IAAPI,IACrDC,IAAiB,EAAQH,GACzBI,IAAmBC,GACnBC,IAAcjB,EAAM,MAAM,GAI1BkB,IAAoBlB,EAAM,eAAemB,CAAQ,KAAKA,EAAS,SAASnB,EAAM,aAClF,OAAOmB,EAAS,QAAS,YAAY;EAAC;EAAS;EAAU;EAAY;EAAU;EAAS;EAAU;CAAU,CAAC,CAAC,SAASA,EAAS,IAAI,IAChIC,IACLF,IACIC,EAAS,MAA0B,KACpC,KAAA,GACEE,IAAkBC,KAAWF,MAAYG,KAASL,IAAoB,cAAcD,MAAgB,KAAA,IACpGO,IACLH,KAAmBH,KAAqB,CAACE,IACtCpB,EAAM,aAAamB,GAAiD,EAAE,IAAIE,EAAgB,CAAC,IAC3FF;CAEJ,OACC,kBAACf,GAAD;EAAY;EAAK,KAAI;EAAK,WAAWH,EAAG,2CAA2CwB,CAAS;EAAG,GAAIjB;EAAnG,UAAA;GACE,CAAC,CAACe,KACF,kBAACrB,GAAD;IACC,SAASmB;IACT,WAAWpB,EAAG,iEAAA,WAAmF;IAFlG,UAAA,CAIEsB,GACA,CAAC,CAACR,KACF,kBAACZ,GAAD;KACC,KAAI;KACJ,MAAK;KACL,MAAK;KACL,WAAU;KACV,UAAA;IAEK,CAAA,CAED;;GAGPqB;GAEA,CAAC,CAACV,KACF,kBAACX,GAAD;IACC,IAAIuB;IACJ,KAAI;IACJ,MAAK;IACL,MAAMjB,IAAW,UAAU;IAC3B,GAAKA,IAAW;KAAE,MAAM;KAAS,aAAa;IAAS,IAAI,CAAC;IAC5D,WAAU;IAET,UAAAE;GACI,CAAA;EAED;;AAET,CAAC;AAED,EAAU,cAAc"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"forms-B9G_xwzi.js","names":["Text","Stack","AlertDescription","AlertAction","Alert","Card","AlertTitle","Input","FormField","defaultControlledFormFieldStrings","interpolateControlledFormFieldString","template","label","ControlledFormField","errorGetter","stringsProp","chromeProps","strings","useStrings","Controller","validationError","fieldState","resolvedError","name","invalid","cn","children","field","isSimpleText","value","FormSection","actions","footer","className","contentClassName","FormActionsBar","trailing","sticky","leading","ErrorSummary","title","description","errors","error","index","action","DirtyStateBanner","SubmitStateButton","props","Button","submitting","disabled","disableWhenPristine","dirty","OperationPasswordForm","passwordError","passwordErrorFn","topLevelError","defaultValues","useMemo","useForm","submit","onSubmit","values","loading","formId","handleSubmit"],"sources":["../src/components/base/forms/controlled-form-field.strings.ts","../src/components/base/forms/controlled-form-field.tsx","../src/components/base/forms/workflow.tsx","../src/components/base/forms/operation-password-form.tsx"],"sourcesContent":["export interface ControlledFormFieldStrings {\n\trequired: string;\n\trequiredWithLabel: string;\n\tinvalid: string;\n}\n\nexport const defaultControlledFormFieldStrings: ControlledFormFieldStrings = {\n\trequired: 'This field is required',\n\trequiredWithLabel: '{{label}} is required',\n\tinvalid: 'Invalid value',\n};\n\nexport function interpolateControlledFormFieldString(template: string, label: string) {\n\treturn template.replace(/\\{\\{\\s*label\\s*\\}\\}/g, label);\n}\n","/**\n * ControlledFormField — react-hook-form integration for the optional-peer-free\n * `FormField` presentation component. Keeping this binding in its own module\n * prevents unrelated display and form-chrome consumers from loading RHF.\n */\nimport type { ComponentProps, ReactNode } from 'react';\nimport {\n\tController,\n\ttype Control,\n\ttype ControllerFieldState,\n\ttype ControllerRenderProps,\n\ttype FieldPath,\n\ttype FieldValues,\n\ttype RegisterOptions,\n} from 'react-hook-form';\n\nimport { FormField } from './form-field';\nimport {\n\tdefaultControlledFormFieldStrings,\n\tinterpolateControlledFormFieldString,\n\ttype ControlledFormFieldStrings,\n} from './controlled-form-field.strings';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\ntype FieldChromeProps = Omit<\n\tComponentProps<typeof FormField>,\n\t'children' | 'error' | 'htmlFor'\n>;\n\nexport type FormFieldErrorGetter<TName extends string> = (field: TName) => string | undefined;\n\nexport interface ControlledFormFieldProps<\n\tTFieldValues extends FieldValues,\n\tTName extends FieldPath<TFieldValues>,\n> extends FieldChromeProps {\n\t/** Field name in the react-hook-form schema. */\n\tname: TName;\n\t/** The form's `control` object from `useForm`. */\n\tcontrol: Control<TFieldValues>;\n\t/** Validation rules passed to react-hook-form. */\n\trules?: RegisterOptions<TFieldValues, TName>;\n\t/** Validation message, overriding the one derived from form state. */\n\terror?: FormFieldErrorGetter<TName>;\n\t/** Overrides the field's own copy. */\n\tstrings?: StringsProp<ControlledFormFieldStrings>;\n\tchildren: (\n\t\tfield: ControllerRenderProps<TFieldValues, TName>,\n\t\t/** Validation message, overriding the one derived from form state. */\n\t\terror: string | undefined,\n\t\tinvalid: boolean,\n\t\tfieldState: ControllerFieldState,\n\t) => ReactNode;\n}\n\nexport function ControlledFormField<\n\tTFieldValues extends FieldValues,\n\tTName extends FieldPath<TFieldValues>,\n>({\n\tname,\n\tcontrol,\n\trules,\n\terror: errorGetter,\n\tstrings: stringsProp,\n\tchildren,\n\t...chromeProps\n}: ControlledFormFieldProps<TFieldValues, TName>) {\n\tconst strings = useStrings(defaultControlledFormFieldStrings, stringsProp);\n\n\treturn (\n\t\t<Controller\n\t\t\tname={name}\n\t\t\tcontrol={control}\n\t\t\trules={rules}\n\t\t\trender={({ field, fieldState }) => {\n\t\t\t\tconst validationError = fieldState.error?.message\n\t\t\t\t\t|| (fieldState.error\n\t\t\t\t\t\t? fieldState.error.type === 'required'\n\t\t\t\t\t\t\t? typeof chromeProps.label === 'string'\n\t\t\t\t\t\t\t\t? interpolateControlledFormFieldString(strings.requiredWithLabel, chromeProps.label)\n\t\t\t\t\t\t\t\t: strings.required\n\t\t\t\t\t\t\t: strings.invalid\n\t\t\t\t\t\t: undefined);\n\t\t\t\tconst resolvedError = errorGetter?.(name) || validationError || undefined;\n\t\t\t\tconst invalid = Boolean(resolvedError);\n\n\t\t\t\treturn (\n\t\t\t\t\t<FormField\n\t\t\t\t\t\t{...chromeProps}\n\t\t\t\t\t\terror={resolvedError}\n\t\t\t\t\t\thtmlFor={name}\n\t\t\t\t\t\tclassName={cn('controlled-form-field--component', chromeProps.className)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children(field, resolvedError, invalid, fieldState)}\n\t\t\t\t\t</FormField>\n\t\t\t\t);\n\t\t\t}}\n\t\t/>\n\t);\n}\n\nControlledFormField.displayName = 'ControlledFormField';\n\nexport {\n\tdefaultControlledFormFieldStrings,\n\ttype ControlledFormFieldStrings,\n} from './controlled-form-field.strings';\n","/** Form workflow primitives — section chrome, errors, dirty state, and submit state. */\nimport type { ReactNode } from 'react';\n\nimport { Button } from '../buttons';\nimport type { ButtonProps } from '../buttons';\nimport { Card } from '../cards';\nimport { Stack } from '../structure';\nimport type { SmartCardSurface } from '../cards';\nimport { Alert, AlertAction, AlertDescription, AlertTitle } from '../feedback';\nimport type { AlertTone } from '../feedback';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\n\nfunction isSimpleText(value: ReactNode): value is string | number | bigint {\n\treturn typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint';\n}\n\nexport interface FormSectionProps {\n\t/** Section title. */\n\ttitle?: ReactNode;\n\t/** Supporting sentence under the title. */\n\tdescription?: ReactNode;\n\t/** Controls in the section header. */\n\tactions?: ReactNode;\n\tchildren?: ReactNode;\n\t/** Content below the section body. */\n\tfooter?: ReactNode;\n\t/** Outer chrome. Use `flat` when the section already sits inside a card. */\n\tsurface?: SmartCardSurface;\n\tclassName?: string;\n\t/** Merged onto the section body. */\n\tcontentClassName?: string;\n}\n\nexport function FormSection({\n\ttitle,\n\tdescription,\n\tactions,\n\tchildren,\n\tfooter,\n\tsurface = 'card',\n\tclassName,\n\tcontentClassName,\n}: FormSectionProps) {\n\treturn (\n\t\t<Card\n\t\t\tdata-component=\"form-section\"\n\t\t\tdata-slot=\"form-section\"\n\t\t\ttitle={title}\n\t\t\tdescription={description}\n\t\t\theaderAction={actions}\n\t\t\tfooterSlot={footer}\n\t\t\tsurface={surface}\n\t\t\tclassName={cn('form-section--component', className)}\n\t\t\tcontentClassName={cn('form-section--content grid gap-space-xl', contentClassName)}\n\t\t>\n\t\t\t{children}\n\t\t</Card>\n\t);\n}\n\nexport interface FormActionsBarProps {\n\t/** Action content used when `trailing` is not provided. */\n\tchildren?: ReactNode;\n\t/** Optional status or context shown before the actions. Scalar copy uses secondary Typography. */\n\tleading?: ReactNode;\n\t/** Preferred action slot. When provided, it takes precedence over `children`. */\n\ttrailing?: ReactNode;\n\t/** Keep the bar attached to the bottom of its nearest scrolling ancestor. */\n\tsticky?: boolean;\n\tclassName?: string;\n}\n\n/** Responsive form-footer chrome for status and consumer-owned actions. */\nexport function FormActionsBar({\n\tchildren,\n\tleading,\n\ttrailing,\n\tsticky = false,\n\tclassName,\n}: FormActionsBarProps) {\n\tconst actions = trailing ?? children;\n\n\treturn (\n\t\t/*\n\t\t * Two elements, because the bar has to be measured and stick at the same\n\t\t * time and one element cannot do both. Its stack/row switch depends on its\n\t\t * own width — a form footer is as often in a drawer as at page width — and\n\t\t * an element cannot match its own container query, so the row has to sit\n\t\t * inside the measured box. `sticky` then has to live on the OUTER element:\n\t\t * a sticky child is confined to its parent's box, so a sticky row inside an\n\t\t * auto-height wrapper has nowhere to travel and silently stops sticking.\n\t\t */\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'form-actions-bar--component @container/form-actions-bar',\n\t\t\t\tsticky && 'sticky bottom-0 z-30',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t<div\n\t\t\tdata-component=\"form-actions-bar\"\n\t\t\tdata-slot=\"form-actions-bar\"\n\t\t\t// Opaque, so a sticky bar covers content scrolling under it without a blur.\n\t\t\tclassName=\"form-actions-bar--row border-t border-border bg-background p-surface\"\n\t\t>\n\t\t<div className=\"form-actions-bar--layout flex min-w-0 flex-col gap-space-lg @md/form-actions-bar:flex-row @md/form-actions-bar:items-center @md/form-actions-bar:flex-nowrap\">\n\t\t\t{leading != null && (\n\t\t\t\t<div data-slot=\"form-actions-leading\" className=\"form-actions-bar--leading min-w-0 flex-1\">\n\t\t\t\t\t{isSimpleText(leading) ? (\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\tclassName=\"form-actions-bar--leading-text\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{leading}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t) : leading}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{actions != null && (\n\t\t\t\t<Stack\n\t\t\t\t\tdata-slot=\"form-actions-trailing\"\n\t\t\t\t\twrap\n\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\tgap=\"md\"\n\t\t\t\t\tjustify=\"end\"\n\t\t\t\t\tclassName=\"form-actions-bar--trailing min-w-0 w-full max-w-full shrink-0 @md/form-actions-bar:ml-auto @md/form-actions-bar:w-auto @md/form-actions-bar:shrink\"\n\t\t\t\t>\n\t\t\t\t\t{actions}\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t</div>\n\t\t</div>\n\t\t</div>\n\t);\n}\n\nexport interface ErrorSummaryProps {\n\t/** Section title. */\n\ttitle: ReactNode;\n\t/** Supporting sentence under the title. */\n\tdescription?: ReactNode;\n\t/** Validation messages listed in the error summary. */\n\terrors?: readonly ReactNode[];\n\t/** Control offered alongside the summary. */\n\taction?: ReactNode;\n\tclassName?: string;\n}\n\nexport function ErrorSummary({\n\ttitle,\n\tdescription,\n\terrors = [],\n\taction,\n\tclassName,\n}: ErrorSummaryProps) {\n\treturn (\n\t\t<Alert\n\t\t\tdata-component=\"error-summary\"\n\t\t\tdata-slot=\"error-summary\"\n\t\t\ttone=\"destructive\"\n\t\t\tclassName={cn('error-summary--component', className)}\n\t\t>\n\t\t\t<AlertTitle>{title}</AlertTitle>\n\t\t\t{!!description && <AlertDescription>{description}</AlertDescription>}\n\t\t\t{errors.length > 0 && (\n\t\t\t\t\t// The messages are the summary's content: they keep the description's\n\t\t\t\t\t// size and ink, and the bullets take that ink too.\n\t\t\t\t\t<Stack render={<ul />} gap=\"xs\" data-slot=\"error-summary-list\" className=\"error-summary--list col-start-2 m-0 list-disc ps-space-xl text-sm text-muted-foreground\">\n\t\t\t\t\t{errors.map((error, index) => (\n\t\t\t\t\t\t<li key={index}>\n\t\t\t\t\t\t\t{typeof error === 'string' || typeof error === 'number' || typeof error === 'bigint' ? (\n\t\t\t\t\t\t\t\t<Text tag=\"span\" type=\"secondary\">\n\t\t\t\t\t\t\t\t\t{error}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t) : error}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t\t</Stack>\n\t\t\t)}\n\t\t\t{!!action && <AlertAction>{action}</AlertAction>}\n\t\t</Alert>\n\t);\n}\n\nexport interface DirtyStateBannerProps {\n\t/** Section title. */\n\ttitle: ReactNode;\n\t/** Supporting sentence under the title. */\n\tdescription?: ReactNode;\n\t/** Controls in the section header. */\n\tactions?: ReactNode;\n\t/** Semantic tone of the banner. */\n\ttone?: Extract<AlertTone, 'neutral' | 'info' | 'warning'>;\n\tclassName?: string;\n}\n\nexport function DirtyStateBanner({\n\ttitle,\n\tdescription,\n\tactions,\n\ttone = 'warning',\n\tclassName,\n}: DirtyStateBannerProps) {\n\treturn (\n\t\t<Alert\n\t\t\tdata-component=\"dirty-state-banner\"\n\t\t\tdata-slot=\"dirty-state-banner\"\n\t\t\ttone={tone}\n\t\t\tclassName={cn('dirty-state-banner--component', className)}\n\t\t>\n\t\t\t<AlertTitle>{title}</AlertTitle>\n\t\t\t{!!description && (\n\t\t\t\t<AlertDescription>\n\t\t\t\t\t{description}\n\t\t\t\t</AlertDescription>\n\t\t\t)}\n\t\t\t{actions != null && (\n\t\t\t\t<div className=\"dirty-state-banner--actions col-start-2 min-w-0 pt-space-sm\">\n\t\t\t\t\t<Stack direction=\"horizontal\" wrap gap=\"sm\">{actions}</Stack>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</Alert>\n\t);\n}\n\nexport interface SubmitStateButtonProps extends Omit<ButtonProps, 'loading'> {\n\t/** Semantic color. Defaults to `primary`: submitting is the form's main command. */\n\ttone?: ButtonProps['tone'];\n\t/** Shows the pending state and blocks repeat submissions. */\n\tsubmitting?: boolean;\n\t/** Whether the form has unsaved changes. */\n\tdirty?: boolean;\n\t/** Disables submit until `dirty` is true, so a clean form cannot be re-saved. */\n\tdisableWhenPristine?: boolean;\n}\n\nexport function SubmitStateButton({\n\tsubmitting = false,\n\tdirty = true,\n\tdisableWhenPristine = false,\n\tdisabled,\n\tchildren,\n\t...props\n}: SubmitStateButtonProps) {\n\treturn (\n\t\t<Button\n\t\t\t// Submitting is the form's main command; props can still choose another tone.\n\t\t\ttone=\"primary\"\n\t\t\t{...props}\n\t\t\tdata-component=\"submit-state-button\"\n\t\t\tdata-slot=\"submit-state-button\"\n\t\t\ttype={props.type ?? 'submit'}\n\t\t\tloading={submitting}\n\t\t\tdisabled={disabled || (disableWhenPristine && !dirty)}\n\t\t\tclassName={cn('submit-state-button--component', props.className)}\n\t\t>\n\t\t\t{children}\n\t\t</Button>\n\t);\n}\n","import { useMemo } from 'react';\nimport type { SubmitHandler } from 'react-hook-form';\nimport { useForm } from 'react-hook-form';\n\nimport { ControlledFormField } from './controlled-form-field';\nimport { Input } from '../text-inputs';\nimport { Stack } from '../structure';\nimport { Text } from '../../typography';\n\nexport type ErrorBag = Record<string, string | string[] | undefined>;\n\nexport interface OperationPasswordFormProps {\n\tformId: string;\n\tonSubmit: (data: { password: string }) => Promise<void>;\n\terrors?: ErrorBag;\n\t/** Shows the pending indicator. */\n\tloading?: boolean;\n\t/** Display label. */\n\tlabel: string;\n}\n\ninterface PasswordFormValues {\n\tpassword: string;\n}\n\nexport function OperationPasswordForm(props: OperationPasswordFormProps) {\n\tconst { formId, onSubmit, errors, loading = false, label } = props;\n\n\tconst getError = (field: keyof PasswordFormValues): string | undefined => {\n\t\tconst value = errors?.[field];\n\t\treturn Array.isArray(value) ? value[0] : value;\n\t};\n\tconst passwordError = getError('password');\n\tconst passwordErrorFn = passwordError ? () => passwordError : undefined;\n\n\tconst topLevelError =\n\t\t(Array.isArray(errors?.general) ? errors.general[0] : errors?.general) ||\n\t\t(Array.isArray(errors?.server) ? errors.server[0] : errors?.server);\n\n\tconst defaultValues = useMemo<PasswordFormValues>(() => ({ password: '' }), []);\n\n\tconst { handleSubmit, control } = useForm<PasswordFormValues>({ defaultValues });\n\n\tconst submit: SubmitHandler<PasswordFormValues> = async (values) => {\n\t\tawait onSubmit({ password: values.password });\n\t};\n\n\tconst disabled = loading;\n\n\treturn (\n\t\t<Stack\n\t\t\trender={<form />}\n\t\t\tgap=\"xl\"\n\t\t\tid={formId}\n\t\t\tonSubmit={handleSubmit(submit)}\n\t\t\tclassName=\"operation-password-form--component\"\n\t\t>\n\t\t\t{Boolean(topLevelError) && (\n\t\t\t\t<Text\n\t\t\t\t\ttype=\"error\"\n\t\t\t\t>\n\t\t\t\t\t{topLevelError}\n\t\t\t\t</Text>\n\t\t\t)}\n\n\t\t\t<ControlledFormField\n\t\t\t\tname=\"password\"\n\t\t\t\tcontrol={control}\n\t\t\t\terror={passwordErrorFn}\n\t\t\t\tlabel={label}\n\t\t\t\trequired\n\t\t\t>\n\t\t\t\t{(field, _error, invalid) => (\n\t\t\t\t\t<Input\n\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\tvalue={field.value ?? ''}\n\t\t\t\t\t\tonChange={field.onChange}\n\t\t\t\t\t\tonBlur={field.onBlur}\n\t\t\t\t\t\tname={field.name}\n\t\t\t\t\t\tinvalid={invalid}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tautoFocus\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</ControlledFormField>\n\t\t</Stack>\n\t);\n}\n\nOperationPasswordForm.displayName = 'OperationPasswordForm';\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"forms-numeric-B_jraJaQ.js","names":["React","baseui.Select","baseui.SelectTrigger","baseui.SelectValue","Select","UNIT_OPTIONS","React","baseui.Select","baseui.SelectTrigger","baseui.SelectValue","React","baseui.Select","baseui.SelectTrigger","baseui.SelectValue","React","useDensityConfig","useMoneyConfig","cn","Label","Text","TextLink","Grid","Stack","AlertDescription","Alert","interactionRecipes","selectToggleRecipes","formControlSizeClasses","formFieldTriggerClasses","formControlIconClasses","resolveFormControlSize","Input","FormField","SelectTrigger","SelectPopupContent","SelectPopupGroup","Select","Select$1","SelectPopupItem","SelectValue","controlGroupHeightClasses","React$1","defaultDecimalInputStrings","formatDecimalValue","value","formatted","allowNegative","hasLeadingMinus","parts","decimalPlaces","isWithinBounds","numValue","min","max","applyRounding","factor","decimals","shifted","mode","floor","diff","clamp","next","n","snapToStep","anchor","stepsFromAnchor","current","step","stepped","delta","fireChange","nativeSetter","target","STEPPER_SIZE_CLASS","DecimalInputImpl","controlledValue","sizeProp","stringsProp","props","size","defaultScale","strings","useStrings","validDecimalPlaces","inputRef","editingUnavailable","disabled","handleChange","useCallback","newValue","allowEmpty","modifiedEvent","onChange","handleBlur","onBlur","normalizeOnBlur","raw","num","roundingMode","adjust","showSteppers","handleKeyDown","onKeyDown","event","placeholderResolved","placeholder","Minus","node","forwardedRef","className","Plus","DecimalInput","PercentageInput","forwardRef","defaultCurrencyInputStrings","CURRENCY_SYMBOLS","normalizeCurrencies","currencies","currency","CurrencyInputImpl","controlledCurrency","decimalInputProps","currencyTriggerId","useId","normalizedCurrencies","useMemo","internalCurrency","setInternalCurrency","useState","defaultCurrency","isCurrencyControlled","selectedCurrency","details","disableCurrencySelector","onConfigError","handleCurrencyChange","newCurrency","onCurrencyChange","triggerClassName","currencyWidth","currencySelector","currencyLabel","invalid","currencyPlaceholder","curr","currencyPosition","CurrencyInput","memo","defaultMoneyInputStrings","interpolateMoneyInputString","values","key","output","template","FALLBACK_CURRENCIES","parseAmount","parsed","resolveFormatted","currencyOptionValue","option","MoneyInput","recordCurrencyProp","moneyConfig","resolvedDefaultCurrency","activeCurrency","useRef","availableCurrencies","source","unique","optionValue","options","recordCurrency","money","originalFormatted","showOriginalHint","willMigrate","isInvalid","error","assignRef","handleAmountChange","onChangeData","nextCurrency","defaultValue","input","required","controlStrings","controlClassName","hasFieldChrome","label","hint","helperText","showMigrationWarning","AlertTriangle","migrationWarningMessage","ORDERED_MODES","defaultRoundingModeLabels","RoundingModeSelect","controlled","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","fieldId","ids","subLabelClasses","formLabelLineClass","isValueControlled","isUnitControlled","initialParsed","internalWidth","setInternalWidth","internalHeight","setInternalHeight","internalDepth","setInternalDepth","internalUnit","setInternalUnit","defaultUnit","parsedValue","widthValue","heightValue","depthValue","unitValue","handleDimensionChange","updatedWidth","updatedHeight","updatedDepth","dimension","formattedValue","handleUnitChange","newUnit","typedUnit","onUnitChange","unitSelector","disableUnitSelector","unit","defaultWeightInputStrings","UNIT_OPTIONS","WeightInput","internalValue","setInternalValue","handleValueChange","nextUnit","weightUnit","unitOptions","unitTriggerId","unitWidth","defaultCoordinatesInputStrings","parseValue","lat","lng","part","formatValue","isFiniteNumberInRange","CoordinatesInput","isControlled","internalLat","setInternalLat","internalLng","setInternalLng","parsedControlled","update","nextLat","nextLng","mapUrl","hasValidLat","hasValidLng","showPreviewLink"],"sources":["../src/components/base/forms-numeric/decimal-input.tsx","../src/components/base/forms-numeric/percentage-input.tsx","../src/components/base/forms-numeric/currency-input.tsx","../src/components/base/forms-numeric/money-input.strings.ts","../src/components/base/forms-numeric/money-input.tsx","../src/components/base/forms-numeric/rounding-mode-select.tsx","../src/components/base/forms-numeric/dimensions-input.tsx","../src/components/base/forms-numeric/weight-input.tsx","../src/components/base/forms-numeric/coordinates-input.tsx"],"sourcesContent":["/**\n * DecimalInput — text-based numeric input with decimal-place enforcement,\n * locale-friendly comma → dot normalisation, optional min/max clamping,\n * rounding mode (`round` / `floor` / `ceil` / `half-even`), and optional\n * stepper buttons when `step` is set.\n *\n * Wraps the base `Input` so all add-on / icon / clear / loading features\n * still work. Extra features layered on top:\n *\n * - `step` — when set, renders − / + stepper buttons that snap the value\n * to a multiple of `step` (anchored at `min` if provided, else 0).\n * - `roundingMode` — controls how stepper / blur normalisation rounds\n * half values; default `'round'` (round-half-up).\n * - `normalizeOnBlur` (default `true`) — pads the displayed value to the\n * full `decimalPlaces` count and clamps to `[min, max]` when the field\n * loses focus.\n *\n * The `value` prop is always a plain string (consumers parse it as needed)\n * so RHF / Inertia can treat it like any other input.\n */\nimport * as React from 'react';\nimport { useCallback } from 'react';\nimport { Minus, Plus } from 'lucide-react';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { useDensityConfig, type FormControlSize } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { formControlIconClasses, formControlSizeClasses, resolveFormControlSize } from '../forms/form-sizing';\nimport { Input, type InputProps } from '../text-inputs';\nimport { interactionRecipes } from '../../../lib/interaction-recipes';\n\nexport type DecimalRoundingMode = 'round' | 'floor' | 'ceil' | 'half-even';\n\nexport interface DecimalInputStrings {\n\t/** Accessible label for the decrement stepper. */\n\tdecrement: string;\n\t/** Accessible label for the increment stepper. */\n\tincrement: string;\n}\n\nexport const defaultDecimalInputStrings: DecimalInputStrings = {\n\tdecrement: 'Decrement',\n\tincrement: 'Increment',\n};\n\nexport interface DecimalInputProps extends Omit<InputProps, 'type' | 'inputMode' | 'strings'> {\n\t/** Maximum fractional digits accepted and used during normalization. */\n\tdecimalPlaces?: number;\n\t/** Minimum accepted numeric value. */\n\tmin?: number;\n\t/** Maximum accepted numeric value. */\n\tmax?: number;\n\t/** Whether a leading negative sign is accepted. */\n\tallowNegative?: boolean;\n\t/** Whether the field may remain blank. */\n\tallowEmpty?: boolean;\n\t/** When set, renders − / + steppers and snaps the value to multiples of `step`. */\n\tstep?: number;\n\t/** How to round when normalising on blur or stepping. Default `'round'`. */\n\troundingMode?: DecimalRoundingMode;\n\t/** Pad to full decimalPlaces and clamp to [min, max] on blur. Default `true`. */\n\tnormalizeOnBlur?: boolean;\n\t/** String overrides for stepper aria-labels. */\n\tstrings?: StringsProp<DecimalInputStrings>;\n}\n\nconst formatDecimalValue = (\n\tvalue: string,\n\tdecimalPlaces: number,\n\tallowNegative: boolean,\n): string => {\n\tif (!value) return '';\n\n\tlet formatted = value;\n\tformatted = formatted.replace(/,/g, '.');\n\n\tif (allowNegative) {\n\t\tformatted = formatted.replace(/[^\\d.-]/g, '');\n\t} else {\n\t\tformatted = formatted.replace(/[^\\d.]/g, '');\n\t}\n\n\tif (allowNegative && formatted.includes('-')) {\n\t\tconst hasLeadingMinus = formatted.startsWith('-');\n\t\tformatted = formatted.replace(/-/g, '');\n\t\tif (hasLeadingMinus) formatted = '-' + formatted;\n\t}\n\n\tconst parts = formatted.split('.');\n\tif (parts.length > 2) {\n\t\tformatted = parts[0] + '.' + parts.slice(1).join('');\n\t}\n\n\tif (parts.length === 2 && parts[1].length > decimalPlaces) {\n\t\tformatted = parts[0] + '.' + parts[1].substring(0, decimalPlaces);\n\t}\n\n\treturn formatted;\n};\n\nconst isWithinBounds = (value: string, min?: number, max?: number): boolean => {\n\tif (!value || value === '-') return true;\n\tconst numValue = parseFloat(value);\n\tif (Number.isNaN(numValue)) return true;\n\tif (min !== undefined && numValue < min) return false;\n\tif (max !== undefined && numValue > max) return false;\n\treturn true;\n};\n\nfunction applyRounding(value: number, decimals: number, mode: DecimalRoundingMode): number {\n\tconst factor = Math.pow(10, decimals);\n\tconst shifted = value * factor;\n\tswitch (mode) {\n\t\tcase 'floor':\n\t\t\treturn Math.floor(shifted) / factor;\n\t\tcase 'ceil':\n\t\t\treturn Math.ceil(shifted) / factor;\n\t\tcase 'half-even': {\n\t\t\tconst floor = Math.floor(shifted);\n\t\t\tconst diff = shifted - floor;\n\t\t\tif (diff > 0.5) return (floor + 1) / factor;\n\t\t\tif (diff < 0.5) return floor / factor;\n\t\t\treturn (floor % 2 === 0 ? floor : floor + 1) / factor;\n\t\t}\n\t\tcase 'round':\n\t\tdefault:\n\t\t\treturn Math.round(shifted) / factor;\n\t}\n}\n\nfunction clamp(n: number, min?: number, max?: number): number {\n\tlet next = n;\n\tif (min !== undefined) next = Math.max(min, next);\n\tif (max !== undefined) next = Math.min(max, next);\n\treturn next;\n}\n\nfunction snapToStep(\n\tcurrent: number,\n\tdelta: number,\n\tstep: number,\n\tmin?: number,\n\tmode: DecimalRoundingMode = 'round',\n): number {\n\tconst anchor = min ?? 0;\n\tconst stepsFromAnchor = (current - anchor) / step;\n\tconst rounded =\n\t\tmode === 'floor'\n\t\t\t? Math.floor(stepsFromAnchor)\n\t\t\t: mode === 'ceil'\n\t\t\t\t? Math.ceil(stepsFromAnchor)\n\t\t\t\t: Math.round(stepsFromAnchor);\n\tconst stepped = anchor + (rounded + delta) * step;\n\treturn Number(stepped.toFixed(12));\n}\n\nfunction fireChange(target: HTMLInputElement, value: string) {\n\t// Write through the native setter so React's value tracker sees a change,\n\t// then dispatch a real input event. React's own change handling then runs:\n\t// the Input's internal state (uncontrolled use), DecimalInput formatting and\n\t// the consumer callback each observe the step exactly once, and a later\n\t// re-render can no longer restore the stale value. A controlled consumer\n\t// that declines the change keeps its value, as with typing.\n\tconst nativeSetter = Object.getOwnPropertyDescriptor(\n\t\twindow.HTMLInputElement.prototype,\n\t\t'value',\n\t)?.set;\n\tif (nativeSetter) nativeSetter.call(target, value);\n\telse target.value = value;\n\ttarget.dispatchEvent(new Event('input', { bubbles: true }));\n}\n\nconst STEPPER_SIZE_CLASS: Record<FormControlSize, string> = {\n\tsm: 'w-control-sm',\n\tmd: 'w-control',\n\tlg: 'w-control-lg',\n};\n\nfunction DecimalInputImpl(\n\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\tonKeyDown,\n\t\tplaceholder,\n\t\tclassName,\n\t\tvalue: controlledValue,\n\t\tdefaultValue,\n\t\tdisabled,\n\t\tsize: sizeProp,\n\t\tstrings: stringsProp,\n\t\t...props\n\t}: 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\tconst editingUnavailable = disabled || props.loading || props.readOnly;\n\n\tconst handleChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst newValue = e.target.value;\n\n\t\t\tif (!newValue && allowEmpty) {\n\t\t\t\tonChange?.(e);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst formatted = formatDecimalValue(newValue, validDecimalPlaces, allowNegative);\n\t\t\tif (!isWithinBounds(formatted, min, max)) return;\n\n\t\t\tif (formatted !== newValue) {\n\t\t\t\tconst modifiedEvent = {\n\t\t\t\t\t...e,\n\t\t\t\t\ttarget: { ...e.target, value: formatted },\n\t\t\t\t\tcurrentTarget: { ...e.currentTarget, value: formatted },\n\t\t\t\t} as React.ChangeEvent<HTMLInputElement>;\n\t\t\t\tonChange?.(modifiedEvent);\n\t\t\t} else {\n\t\t\t\tonChange?.(e);\n\t\t\t}\n\t\t},\n\t\t[onChange, validDecimalPlaces, allowNegative, allowEmpty, min, max],\n\t);\n\n\tconst handleBlur = useCallback(\n\t\t(e: React.FocusEvent<HTMLInputElement>) => {\n\t\t\tonBlur?.(e);\n\t\t\tif (!normalizeOnBlur) return;\n\t\t\tconst raw = e.target.value;\n\t\t\tif (!raw && allowEmpty) return;\n\t\t\tconst num = Number.parseFloat(raw.replace(',', '.'));\n\t\t\tif (!Number.isFinite(num)) return;\n\t\t\tconst clamped = clamp(num, min, max);\n\t\t\tconst rounded = applyRounding(clamped, validDecimalPlaces, roundingMode);\n\t\t\tconst next = rounded.toFixed(validDecimalPlaces);\n\t\t\tif (next !== raw && inputRef.current) {\n\t\t\t\tfireChange(inputRef.current, next);\n\t\t\t}\n\t\t},\n\t\t[onBlur, onChange, normalizeOnBlur, allowEmpty, min, max, validDecimalPlaces, roundingMode],\n\t);\n\n\tconst adjust = useCallback(\n\t\t(delta: number) => {\n\t\t\tif (editingUnavailable || step === undefined) return;\n\t\t\tconst target = inputRef.current;\n\t\t\tif (!target) return;\n\t\t\tconst raw = target.value;\n\t\t\tconst current = Number.parseFloat(raw.replace(',', '.'));\n\t\t\tconst base = Number.isFinite(current) ? current : (min ?? 0);\n\t\t\tconst snapped = clamp(snapToStep(base, delta, step, min, roundingMode), min, max);\n\t\t\tconst next = applyRounding(snapped, validDecimalPlaces, roundingMode).toFixed(validDecimalPlaces);\n\t\t\tfireChange(target, next);\n\t\t},\n\t\t[editingUnavailable, step, min, max, roundingMode, validDecimalPlaces, onChange],\n\t);\n\n\tconst showSteppers = typeof step === 'number' && step > 0;\n\n\t// With steppers, Arrow Up/Down step the value from the keyboard, so the\n\t// pointer-only stepper buttons are never the only way to step.\n\tconst handleKeyDown = useCallback(\n\t\t(event: React.KeyboardEvent<HTMLInputElement>) => {\n\t\t\tonKeyDown?.(event);\n\t\t\tif (event.defaultPrevented || !showSteppers) return;\n\t\t\tif (event.key === 'ArrowUp' || event.key === 'ArrowDown') {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tadjust(event.key === 'ArrowUp' ? 1 : -1);\n\t\t\t}\n\t\t},\n\t\t[onKeyDown, showSteppers, adjust],\n\t);\n\tconst placeholderResolved =\n\t\tplaceholder ?? (validDecimalPlaces > 0 ? `0.${'0'.repeat(validDecimalPlaces)}` : '0');\n\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-inner border border-input bg-transparent [&>.input--component]:h-full',\n\t\t\t\t\tformControlSizeClasses[size],\n\t\t\t\t\t// The frame is the field: it carries the shared keyboard-focus,\n\t\t\t\t\t// validation and read-only states once for the whole group.\n\t\t\t\t\t'has-[input:focus-visible]:border-ring has-[input:focus-visible]:ring-3 has-[input:focus-visible]:ring-ring/50',\n\t\t\t\t\t'has-[input[aria-invalid=true]]:border-destructive has-[input[aria-invalid=true]]:has-[input:focus-visible]:border-destructive has-[input[aria-invalid=true]]:has-[input:focus-visible]:ring-destructive/30 dark:has-[input[aria-invalid=true]]:has-[input:focus-visible]:ring-destructive/50',\n\t\t\t\t\t'has-[input:read-only:not(:disabled)]:bg-muted',\n\t\t\t\t\tdisabled && 'opacity-50 cursor-not-allowed',\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\taria-label={strings.decrement}\n\t\t\t\t\tdisabled={editingUnavailable}\n\t\t\t\t\tonClick={() => adjust(-1)}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tinteractionRecipes.nativeButtonReset,\n\t\t\t\t\t\t'inline-flex shrink-0 items-center justify-center border-e border-input text-muted-foreground transition-colors',\n\t\t\t\t\t\tSTEPPER_SIZE_CLASS[size],\n\t\t\t\t\t\tinteractionRecipes.rowHover,\n\t\t\t\t\t\t// A disabled frame dims once; read-only or loading dims only the steppers.\n\t\t\t\t\t\t'disabled:pointer-events-none disabled:cursor-not-allowed',\n\t\t\t\t\t\t!disabled && 'disabled:opacity-50',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Minus aria-hidden=\"true\" className={formControlIconClasses[size]} />\n\t\t\t\t</button>\n\t\t\t\t<Input\n\t\t\t\t\tsize={size}\n\t\t\t\t\tref={(node) => { inputRef.current = node; if (typeof forwardedRef === \"function\") forwardedRef(node); else if (forwardedRef) forwardedRef.current = node; }}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tinputMode={validDecimalPlaces > 0 ? 'decimal' : 'numeric'}\n\t\t\t\t\tplaceholder={placeholderResolved}\n\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\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// The frame owns border, ring, fill and dimming; the inner field draws none of them.\n\t\t\t\t\t\t'!h-full min-h-0 flex-1 tabular-nums text-center border-0 shadow-none rounded-none bg-transparent read-only:bg-transparent focus-visible:ring-0 focus-visible:border-0 aria-invalid:ring-0 aria-invalid:focus-visible:ring-0 disabled:opacity-100',\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\taria-label={strings.increment}\n\t\t\t\t\tdisabled={editingUnavailable}\n\t\t\t\t\tonClick={() => adjust(1)}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tinteractionRecipes.nativeButtonReset,\n\t\t\t\t\t\t'inline-flex shrink-0 items-center justify-center border-s border-input text-muted-foreground transition-colors',\n\t\t\t\t\t\tSTEPPER_SIZE_CLASS[size],\n\t\t\t\t\t\tinteractionRecipes.rowHover,\n\t\t\t\t\t\t'disabled:pointer-events-none disabled:cursor-not-allowed',\n\t\t\t\t\t\t!disabled && 'disabled:opacity-50',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Plus aria-hidden=\"true\" className={formControlIconClasses[size]} />\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Input\n\t\t\tsize={size}\n\t\t\tref={(node) => { inputRef.current = node; if (typeof forwardedRef === \"function\") forwardedRef(node); else if (forwardedRef) forwardedRef.current = node; }}\n\t\t\ttype=\"text\"\n\t\t\tinputMode={validDecimalPlaces > 0 ? 'decimal' : 'numeric'}\n\t\t\tplaceholder={placeholderResolved}\n\t\t\tonChange={handleChange}\n\t\t\tonBlur={handleBlur}\n\t\t\tonKeyDown={onKeyDown}\n\t\t\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 { useId, useState, useCallback, useEffect, useMemo, memo, forwardRef, type ForwardedRef } from 'react';\nimport * as baseui from '../../ui/select';\nimport { Label, Text } from '../../typography';\nimport { Stack } from '../structure';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { useDensityConfig } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { formFieldTriggerClasses, resolveFormControlSize, formLabelLineClass } from '../forms/form-sizing';\nimport { selectToggleRecipes } from '../../../lib/field-affordance-recipes';\nimport {\n\tDecimalInput,\n\tdefaultDecimalInputStrings,\n\ttype DecimalInputProps,\n\ttype DecimalInputStrings,\n} from './decimal-input';\nimport { SelectPopupContent, SelectPopupGroup, SelectPopupItem } from '../choice-inputs';\n\nexport interface CurrencyOption {\n\tvalue: string;\n\tlabel: string;\n}\n\nexport interface CurrencyInputStrings extends DecimalInputStrings {\n\t/** Accessible name for the currency selector. */\n\tcurrencyAriaLabel: string;\n}\n\nexport const defaultCurrencyInputStrings: CurrencyInputStrings = {\n\t...defaultDecimalInputStrings,\n\tcurrencyAriaLabel: 'Currency',\n};\n\nexport interface CurrencyInputProps extends Omit<DecimalInputProps, 'label' | 'hint' | 'helperText' | 'error' | 'strings'> {\n\t/** Current currency value */\n\tcurrency?: string;\n\n\t/** Default currency if uncontrolled */\n\tdefaultCurrency?: string;\n\n\t/** List of available currencies (simple strings or objects with value/label) */\n\tcurrencies?: (string | CurrencyOption)[];\n\n\t/** Callback when currency changes */\n\tonCurrencyChange?: (currency: string) => void;\n\n\t/** Position of currency dropdown */\n\tcurrencyPosition?: 'start' | 'end';\n\n\t/** Disable currency selection */\n\tdisableCurrencySelector?: boolean;\n\n\t/** Placeholder for currency dropdown */\n\tcurrencyPlaceholder?: string;\n\n\t/** Width of the currency dropdown */\n\tcurrencyWidth?: string;\n\n\t/** Label for currency field (sub-label) */\n\tcurrencyLabel?: string;\n\n\t/** Localizes the selector name and inherited decimal-stepper labels. */\n\tstrings?: StringsProp<CurrencyInputStrings>;\n\n\t/** Error state for styling (passed from FormField) */\n\tinvalid?: boolean;\n\n\t/** Called when the input is misconfigured (mismatched currency/defaultCurrency\n\t * while the selector is disabled, missing currency, etc.). The library\n\t * also DEV-logs the same message to the console. */\n\tonConfigError?: (\n\t\tmessage: string,\n\t\tdetails: { currency?: string; defaultCurrency?: string; disableCurrencySelector?: boolean },\n\t) => void;\n}\n\n// Common currency symbols\nconst CURRENCY_SYMBOLS: Record<string, string> = {\n\tUSD: '$',\n\tEUR: '€',\n\tGBP: '£',\n\tBGN: 'лв',\n\tJPY: '¥',\n\tCNY: '¥',\n\tCHF: 'CHF',\n\tCAD: 'C$',\n\tAUD: 'A$',\n};\n\nconst normalizeCurrencies = (currencies?: (string | CurrencyOption)[]): CurrencyOption[] => {\n\tif (!currencies || currencies.length === 0) return [];\n\n\treturn currencies.map((currency) => {\n\t\tif (typeof currency === 'string') {\n\t\t\tconst symbol = CURRENCY_SYMBOLS[currency] || currency;\n\t\t\treturn {\n\t\t\t\tvalue: currency,\n\t\t\t\tlabel: `${symbol} ${currency}`,\n\t\t\t};\n\t\t}\n\t\treturn currency;\n\t});\n};\n\nfunction CurrencyInputImpl(\n\t{\n\t\tcurrency: controlledCurrency,\n\t\tdefaultCurrency,\n\t\tcurrencies,\n\t\tonCurrencyChange,\n\t\tcurrencyPosition = 'start',\n\t\tdisableCurrencySelector = false,\n\t\tcurrencyPlaceholder,\n\t\tcurrencyWidth = 'w-28',\n\t\tcurrencyLabel,\n\t\tstrings: stringsProp,\n\t\tinvalid,\n\t\tdisabled,\n\t\tonConfigError,\n\t\tsize: sizeProp,\n\t\t...decimalInputProps\n\t}: CurrencyInputProps,\n\tforwardedRef: ForwardedRef<HTMLInputElement>,\n) {\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveFormControlSize(sizeProp, defaultScale);\n\tconst strings = useStrings(defaultCurrencyInputStrings, stringsProp);\n\tconst currencyTriggerId = useId();\n\n\t// Memoize normalized currencies\n\tconst normalizedCurrencies = useMemo(() => normalizeCurrencies(currencies), [currencies]);\n\n\t// Internal state for uncontrolled currency\n\tconst [internalCurrency, setInternalCurrency] = useState(\n\t\tdefaultCurrency ?? normalizedCurrencies[0]?.value ?? ''\n\t);\n\n\t// Determine if currency is controlled\n\tconst isCurrencyControlled = controlledCurrency !== undefined;\n\tconst selectedCurrency = isCurrencyControlled ? controlledCurrency : internalCurrency;\n\n\tuseEffect(() => {\n\t\tconst details = { currency: controlledCurrency, defaultCurrency, disableCurrencySelector };\n\t\tif (\n\t\t\tdisableCurrencySelector &&\n\t\t\ttypeof controlledCurrency === 'string' &&\n\t\t\ttypeof defaultCurrency === 'string' &&\n\t\t\tcontrolledCurrency.trim() !== '' &&\n\t\t\tdefaultCurrency.trim() !== '' &&\n\t\t\tcontrolledCurrency !== defaultCurrency\n\t\t) {\n\t\t\tconst message = '[CurrencyInput] currency/defaultCurrency mismatch while selector is disabled.';\n\t\t\tif (import.meta.env?.DEV) {\n\t\t\t\tconsole.warn(message, { currency: controlledCurrency, defaultCurrency });\n\t\t\t}\n\t\t\tonConfigError?.(message, details);\n\t\t}\n\n\t\tif (\n\t\t\tdisableCurrencySelector &&\n\t\t\t(typeof selectedCurrency !== 'string' || selectedCurrency.trim().length === 0)\n\t\t) {\n\t\t\tconst message = '[CurrencyInput] disableCurrencySelector is enabled but no currency is provided.';\n\t\t\tif (import.meta.env?.DEV) {\n\t\t\t\tconsole.warn(message);\n\t\t\t}\n\t\t\tonConfigError?.(message, details);\n\t\t}\n\t}, [controlledCurrency, defaultCurrency, disableCurrencySelector, onConfigError, selectedCurrency]);\n\n\t// Handle currency change\n\tconst handleCurrencyChange = useCallback(\n\t\t(newCurrency: string | null) => {\n\t\t\tif (newCurrency === null) return;\n\t\t\tif (!isCurrencyControlled) {\n\t\t\t\tsetInternalCurrency(newCurrency);\n\t\t\t}\n\t\t\tonCurrencyChange?.(newCurrency);\n\t\t},\n\t\t[isCurrencyControlled, onCurrencyChange]\n\t);\n\n\t// Memoize trigger class names. `formFieldTriggerClasses` is the canonical\n\t// select/trigger chrome, so this selector keeps the height, padding, radius,\n\t// and focus treatment of a standalone `Select` — previously only the height\n\t// was shared, leaving shadcn's `rounded-md` and `py-2 pr-2 pl-2.5` in place\n\t// and making the unit selector visibly narrower-cornered than its siblings.\n\t// `currencyWidth` still wins over the helper's `w-full` through twMerge.\n\tconst triggerClassName = useMemo(\n\t\t() =>\n\t\t\tcn(\n\t\t\t\t'currency-input--selector-trigger',\n\t\t\t\tformFieldTriggerClasses(size),\n\t\t\t\tcurrencyWidth,\n\t\t\t),\n\t\t[size, currencyWidth]\n\t);\n\n\t// Currency selector component\n\tconst currencySelector = (\n\t\t// A sub-label uses the FormField label recipe and rhythm.\n\t\t<Stack gap=\"xs\" className=\"currency-input--selector\">\n\t\t\t{!!currencyLabel && <Label htmlFor={currencyTriggerId} className={cn('currency-input--selector-label text-inherit', formLabelLineClass)}>{currencyLabel}</Label>}\n\t\t\t<baseui.Select\n\t\t\t\tvalue={selectedCurrency}\n\t\t\t\tonValueChange={(value) => handleCurrencyChange(value)}\n\t\t\t\tdisabled={disabled || disableCurrencySelector}\n\t\t\t>\n\t\t\t\t<baseui.SelectTrigger\n\t\t\t\t\tid={currencyTriggerId}\n\t\t\t\t\taria-label={currencyLabel || strings.currencyAriaLabel}\n\t\t\t\t\taria-invalid={invalid || undefined}\n\t\t\t\t\ticonClassName={selectToggleRecipes.icon[size]}\n\t\t\t\t\tclassName={triggerClassName}\n\t\t\t\t>\n\t\t\t\t\t<baseui.SelectValue\n\t\t\t\t\t\tplaceholder={currencyPlaceholder ? (\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" type=\"secondary\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t{currencyPlaceholder}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t) : undefined}\n\t\t\t\t\t/>\n\t\t\t\t</baseui.SelectTrigger>\n\t\t\t\t<SelectPopupContent>\n\t\t\t\t\t<SelectPopupGroup>\n\t\t\t\t\t\t{normalizedCurrencies.map((curr) => (\n\t\t\t\t\t\t\t<SelectPopupItem key={curr.value} value={curr.value} size={size}>\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t\t{curr.label}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t</SelectPopupItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</SelectPopupGroup>\n\t\t\t\t</SelectPopupContent>\n\t\t\t</baseui.Select>\n\t\t</Stack>\n\t);\n\n\treturn (\n\t\t// Bottom-aligned, so the amount and currency controls stay level when only\n\t\t// the currency carries a sub-label.\n\t\t<div className={cn('currency-input--component', 'flex items-end gap-space-md')}>\n\t\t\t{currencyPosition === 'start' && currencySelector}\n\n\t\t\t<div className=\"currency-input--amount min-w-0 flex-1\">\n\t\t\t\t<DecimalInput\n\t\t\t\t\tref={forwardedRef}\n\t\t\t\t\tsize={size}\n\t\t\t\t\tdecimalPlaces={2}\n\t\t\t\t\tallowNegative={false}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tinvalid={invalid}\n\t\t\t\t\tstrings={{ decrement: strings.decrement, increment: strings.increment }}\n\t\t\t\t\t{...decimalInputProps}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t{currencyPosition === 'end' && currencySelector}\n\t\t</div>\n\t);\n}\n\n// forwardRef + memo: forward to the underlying decimal input so consumers\n// can focus/measure programmatically.\nexport const CurrencyInput = memo(forwardRef<HTMLInputElement, CurrencyInputProps>(CurrencyInputImpl));\nCurrencyInput.displayName = 'CurrencyInput';\n","export interface MoneyInputStrings {\n\toriginalValue: string;\n\tconversionWarning: string;\n}\n\nexport const defaultMoneyInputStrings: MoneyInputStrings = {\n\toriginalValue: 'Original value: {value}',\n\tconversionWarning: 'Currency will be converted from {from} to {to}.',\n};\n\nexport function interpolateMoneyInputString(\n\ttemplate: string,\n\tvalues: Record<string, string>,\n) {\n\treturn Object.entries(values).reduce(\n\t\t(output, [key, value]) => output.replaceAll(`{${key}}`, value),\n\t\ttemplate,\n\t);\n}\n","/**\n * MoneyInput — canonical monetary editor.\n *\n * It composes CurrencyInput with optional FormField chrome, one combined\n * amount/currency callback, and opt-in original-value/conversion context.\n * Consumers import it from `themelia-react-ui/base/forms`; display-only\n * monetary values use `Money` from `themelia-react-ui/primitives`.\n */\nimport { AlertTriangle } from 'lucide-react';\nimport {\n\tforwardRef,\n\tuseCallback,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n\ttype ChangeEvent,\n\ttype ReactNode,\n} from 'react';\n\nimport { Alert, AlertDescription } from '../feedback';\nimport { FormField } from '../forms/form-field';\nimport { Stack } from '../structure';\nimport { Text } from '../../typography';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { useMoneyConfig, type CurrencyCode } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\n\nimport {\n\tCurrencyInput,\n\ttype CurrencyInputProps,\n\ttype CurrencyOption,\n} from './currency-input';\nimport {\n\tdefaultMoneyInputStrings,\n\tinterpolateMoneyInputString,\n\ttype MoneyInputStrings,\n} from './money-input.strings';\n\nexport interface MoneyInputContext {\n\t/** Original major-unit amount, when available. */\n\tamount?: number | string | null;\n\t/** Original value currency, when available. */\n\tcurrency?: string | null;\n\t/** Optional original/record currency that can trigger a conversion warning. */\n\trecordCurrency?: string | null;\n\t/** Consumer-formatted original value shown as supporting context. */\n\tpair?: { formatted?: string | null } | null;\n}\n\nexport interface MoneyInputData {\n\t/** Parsed major-unit amount. `null` means the field is empty or incomplete; it is never coerced to zero. */\n\tamount: number | null;\n\t/** Active ISO 4217 currency code. */\n\tcurrency: CurrencyCode;\n}\n\nexport interface MoneyInputProps extends Omit<\n\tCurrencyInputProps,\n\t'currency' | 'defaultCurrency' | 'currencies' | 'onCurrencyChange' | 'strings'\n> {\n\t/** Current currency value (ISO 4217 code, e.g. `USD`). */\n\tcurrency?: CurrencyCode;\n\t/** Initial currency when uncontrolled. Falls back to UIProvider money config. */\n\tdefaultCurrency?: CurrencyCode;\n\t/** Available currencies. Custom option labels are preserved. */\n\tcurrencies?: Array<CurrencyCode | CurrencyOption>;\n\t/** Currency-only callback for existing form integrations. */\n\tonCurrencyChange?: (currency: CurrencyCode) => void;\n\t/**\n\t * Combined amount/currency callback for domain-form state. The amount is\n\t * parsed while the raw `value` / `onChange` channel keeps intermediate text\n\t * such as `1.` available to the editor.\n\t */\n\tonChangeData?: (data: MoneyInputData) => void;\n\t/** Optional context used for original-value and conversion messaging. */\n\tmoney?: MoneyInputContext | null;\n\t/** Optional field label. Omit when an external FormField already owns the chrome. */\n\tlabel?: string;\n\t/** Short guidance rendered below the control when no helper text or error is present. */\n\thint?: string;\n\t/** Supporting copy rendered below the control. */\n\thelperText?: string;\n\t/** Validation message. Also marks the amount and currency controls invalid. */\n\terror?: string;\n\t/** Marks the owned label and native amount input as required. */\n\trequired?: boolean;\n\t/** Existing record currency used to detect a currency migration. */\n\trecordCurrency?: CurrencyCode;\n\t/** Whether a record-currency mismatch renders the conversion warning. */\n\tshowMigrationWarning?: boolean;\n\t/** Consumer-owned warning content for a record-currency mismatch. */\n\tmigrationWarningMessage?: ReactNode;\n\t/** Whether to render `money.pair.formatted` as original-value context. */\n\tshowOriginalHint?: boolean;\n\t/** String overrides forwarded to the underlying DecimalInput steppers. */\n\tcontrolStrings?: CurrencyInputProps['strings'];\n\t/** Class name for the inner amount input. `className` styles the complete MoneyInput surface. */\n\tcontrolClassName?: string;\n\t/** Copy overrides for original-value and conversion-warning messages. */\n\tstrings?: StringsProp<MoneyInputStrings>;\n}\n\nconst FALLBACK_CURRENCIES: CurrencyCode[] = ['USD', 'EUR'];\n\nfunction parseAmount(value: unknown) {\n\tconst raw = String(value ?? '').trim();\n\tif (!raw) return null;\n\tconst parsed = Number.parseFloat(raw.replace(',', '.'));\n\treturn Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction resolveFormatted(value: unknown) {\n\treturn typeof value === 'string' ? value.trim() : '';\n}\n\nfunction currencyOptionValue(option: CurrencyCode | CurrencyOption) {\n\treturn typeof option === 'string' ? option : option.value;\n}\n\nexport const MoneyInput = forwardRef<HTMLInputElement, MoneyInputProps>(function MoneyInput(\n\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{/* The original value is one more supporting line: it keeps the field's\n\t\t\t hint rhythm and type, without a decorative glyph. */}\n\t\t\t<Stack gap=\"xs\" className=\"money-input--field\">\n\t\t\t\t{hasFieldChrome ? (\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\thint={hint}\n\t\t\t\t\t\thelperText={helperText}\n\t\t\t\t\t\terror={error}\n\t\t\t\t\t\trequired={required}\n\t\t\t\t\t>\n\t\t\t\t\t\t{input}\n\t\t\t\t\t</FormField>\n\t\t\t\t) : input}\n\n\t\t\t\t{!!originalFormatted && !error && (\n\t\t\t\t\t<Text tag=\"p\" size=\"xs\" type=\"secondary\" className=\"money-input--original\">\n\t\t\t\t\t\t{interpolateMoneyInputString(strings.originalValue, { value: originalFormatted })}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t</Stack>\n\n\t\t\t{!!willMigrate && showMigrationWarning && (\n\t\t\t\t<Alert tone=\"warning\" className=\"money-input--warning\">\n\t\t\t\t\t<AlertTriangle aria-hidden=\"true\" />\n\t\t\t\t\t<AlertDescription>\n\t\t\t\t\t\t{migrationWarningMessage ?? interpolateMoneyInputString(\n\t\t\t\t\t\t\tstrings.conversionWarning,\n\t\t\t\t\t\t\t{ from: recordCurrency ?? '', to: activeCurrency },\n\t\t\t\t\t\t)}\n\t\t\t\t\t</AlertDescription>\n\t\t\t\t</Alert>\n\t\t\t)}\n\t\t</Stack>\n\t);\n});\n\nMoneyInput.displayName = 'MoneyInput';\n\nexport {\n\tdefaultMoneyInputStrings,\n\ttype MoneyInputStrings,\n} from './money-input.strings';\n","import { forwardRef, useMemo, useCallback } from 'react';\nimport { Select, type SelectProps } from '../choice-inputs';\nimport { cn } from '../../../lib/utils';\n\ntype RoundingMode = string;\n\nexport interface RoundingModeSelectProps extends Omit<SelectProps, 'options' | 'value' | 'onValueChange'> {\n\t/** Current rounding mode value */\n\tvalue?: RoundingMode;\n\n\t/** Canonical change handler. */\n\tonValueChange?: (value: RoundingMode | undefined) => void;\n\n\t/**\n\t * Labels for the rounding modes. Defaults to sentence-case names: `floor` →\n\t * \"Round down\", `half_up` → \"Round half up\", `ceil` → \"Round up\".\n\t */\n\tlabels?: Partial<Record<RoundingMode, string>>;\n}\n\nconst ORDERED_MODES: RoundingMode[] = ['floor', 'half_up', 'ceil'];\n\n/** People read a policy name, never the stored identifier. */\nconst defaultRoundingModeLabels: Record<string, string> = {\n\tfloor: 'Round down',\n\thalf_up: 'Round half up',\n\tceil: 'Round up',\n};\n\nexport const RoundingModeSelect = forwardRef<HTMLButtonElement, RoundingModeSelectProps>(function RoundingModeSelect(allProps, ref) {\n\tconst controlled = Object.prototype.hasOwnProperty.call(allProps, 'value');\n\tconst { value, onValueChange, labels, placeholder, className, ...props } = allProps;\n\tconst options = useMemo(\n\t\t() =>\n\t\t\tORDERED_MODES.map((mode) => ({\n\t\t\t\tvalue: mode,\n\t\t\t\tlabel: labels?.[mode] ?? defaultRoundingModeLabels[mode] ?? mode,\n\t\t\t})),\n\t\t[labels]\n\t);\n\n\tconst handleChange = useCallback(\n\t\t(next: string | undefined) => {\n\t\t\tonValueChange?.(next as RoundingMode | undefined);\n\t\t},\n\t\t[onValueChange]\n\t);\n\n\treturn <Select ref={ref} className={cn('rounding-mode-select--component', className)} options={options} {...(controlled ? { value } : {})} onValueChange={handleChange} placeholder={placeholder} {...props} />;\n});\n\nRoundingModeSelect.displayName = 'RoundingModeSelect';\n","import * as React from 'react';\nimport { useId, useState, useEffect, useCallback } from 'react';\nimport * as baseui from '../../ui/select';\nimport { Label, Text } from '../../typography';\nimport { Stack } from '../structure';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { useDensityConfig, type FormControlSize } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { formFieldTriggerClasses, resolveFormControlSize, formLabelLineClass } from '../forms/form-sizing';\nimport { selectToggleRecipes } from '../../../lib/field-affordance-recipes';\nimport { controlGroupHeightClasses } from '../../../lib/control-group-recipes';\nimport { DecimalInput } from './decimal-input';\nimport { SelectPopupContent, SelectPopupGroup, SelectPopupItem } from '../choice-inputs';\n\nexport interface DimensionObject {\n\t\twidth?: string;\n\t\theight?: string;\n\t\tdepth?: string;\n}\n\nexport type DimensionValue = string | DimensionObject;\nexport type DimensionUnit = 'mm' | 'cm' | 'm' | 'in' | 'ft' | 'px';\n\nexport interface DimensionsInputStrings {\n\t\twidth: string;\n\t\theight: string;\n\t\tdepth: string;\n\t\tunit: string;\n\t\twidthPlaceholder: string;\n\t\theightPlaceholder: string;\n\t\tdepthPlaceholder: string;\n}\n\nexport const defaultDimensionsInputStrings: DimensionsInputStrings = {\n\t\twidth: 'Width',\n\t\theight: 'Height',\n\t\tdepth: 'Depth',\n\t\tunit: 'Unit',\n\t\twidthPlaceholder: '0.00',\n\t\theightPlaceholder: '0.00',\n\t\tdepthPlaceholder: '0.00',\n};\n\nexport interface DimensionsInputProps {\n\t\t/** Current value (string \"WxHxD\" or object { width, height, depth }) */\n\t\tvalue?: DimensionValue;\n\n\t\t/** Default value for uncontrolled mode */\n\t\tdefaultValue?: DimensionValue;\n\n\t\t/** Format type: 'string' for \"WxHxD\" or 'object' for { width, height, depth } */\n\t\tformat?: 'string' | 'object';\n\n\t/** Current length unit value. */\n\tunit?: DimensionUnit;\n\n\t/** Default length unit for uncontrolled mode. */\n\tdefaultUnit?: DimensionUnit;\n\n\t\t/** Label for width input (sub-label) */\n\t\twidthLabel?: string;\n\n\t\t/** Label for height input (sub-label) */\n\t\theightLabel?: string;\n\n\t\t/** Label for depth/length input (sub-label) */\n\t\tdepthLabel?: string;\n\n\t\t/** Label for unit selector (sub-label) */\n\t\tunitLabel?: string;\n\n\t\t/** Placeholder for the unit select */\n\t\tunitPlaceholder?: string;\n\n\t\t/** Placeholder for width */\n\t\twidthPlaceholder?: string;\n\n\t\t/** Placeholder for height */\n\t\theightPlaceholder?: string;\n\n\t\t/** Placeholder for depth */\n\t\tdepthPlaceholder?: string;\n\n\t\t/** Form control size — flows through `useDensityConfig().defaultScale`. */\n\t\tsize?: FormControlSize;\n\n\t\t/** Callback when value changes */\n\t\tonChange?: (e: { target: { value: DimensionValue } }) => void;\n\n\t\t/** Callback when unit changes */\n\tonUnitChange?: (unit: DimensionUnit) => void;\n\n\t\t/** Number of decimal places. Defaults to 2 */\n\t\tdecimalPlaces?: number;\n\n\t\t/** Minimum value for all dimensions */\n\t\tmin?: number;\n\n\t\t/** Maximum value for all dimensions */\n\t\tmax?: number;\n\n\t\t/** Show unit selector. Defaults to true */\n\t\tshowUnitSelector?: boolean;\n\n\t\t/** Disable unit selector */\n\t\tdisableUnitSelector?: boolean;\n\n\t\t/** Layout orientation. Defaults to 'horizontal' */\n\t\tlayout?: 'horizontal' | 'vertical';\n\n\t\t/** Error state for styling (passed from FormField) */\n\t\tinvalid?: boolean;\n\n\t\t/** Disabled state */\n\t\tdisabled?: boolean;\n\n\t\t/** Additional CSS classes */\n\t\tclassName?: string;\n\n\t\t/** String overrides merged over defaults. Direct props (e.g. `widthLabel`) win over `strings` keys. */\n\t\tstrings?: StringsProp<DimensionsInputStrings>;\n}\n\n// Unit options\nconst UNIT_OPTIONS = [\n\t{ value: 'mm', label: 'mm' },\n\t{ value: 'cm', label: 'cm' },\n\t{ value: 'm', label: 'm' },\n\t{ value: 'in', label: 'in' },\n\t{ value: 'ft', label: 'ft' },\n\t{ value: 'px', label: 'px' },\n] as const;\n\nconst parseDimensionValue = (\n\t\tvalue: DimensionValue | undefined,\n\t\tformat: 'string' | 'object'\n): { width: string; height: string; depth: string } => {\n\t\tif (!value) {\n\t\t\t\treturn { width: '', height: '', depth: '' };\n\t\t}\n\n\t\tif (format === 'string' && typeof value === 'string') {\n\t\t\t\tconst parts = value.split('x').map((p) => p.trim());\n\t\t\t\treturn {\n\t\t\t\t\t\twidth: parts[0] || '',\n\t\t\t\t\t\theight: parts[1] || '',\n\t\t\t\t\t\tdepth: parts[2] || '',\n\t\t\t\t};\n\t\t}\n\n\t\tif (format === 'object' && typeof value === 'object') {\n\t\t\t\treturn {\n\t\t\t\t\t\twidth: value.width || '',\n\t\t\t\t\t\theight: value.height || '',\n\t\t\t\t\t\tdepth: value.depth || '',\n\t\t\t\t};\n\t\t}\n\n\t\treturn { width: '', height: '', depth: '' };\n};\n\nconst formatDimensionValue = (\n\t\twidth: string,\n\t\theight: string,\n\t\tdepth: string,\n\t\tformat: 'string' | 'object'\n): DimensionValue => {\n\t\tif (format === 'string') {\n\t\t\t\treturn `${width}x${height}x${depth}`;\n\t\t}\n\t\treturn { width, height, depth };\n};\n\nexport const DimensionsInput = React.forwardRef<HTMLDivElement, DimensionsInputProps>(function DimensionsInput({\n\t\tvalue: controlledValue,\n\t\tdefaultValue,\n\t\tformat = 'string',\n\t\tunit: controlledUnit,\n\tdefaultUnit = 'cm',\n\t\twidthLabel,\n\t\theightLabel,\n\t\tdepthLabel,\n\t\tunitLabel,\n\t\tunitPlaceholder,\n\t\twidthPlaceholder,\n\t\theightPlaceholder,\n\t\tdepthPlaceholder,\n\t\tonChange,\n\t\tonUnitChange,\n\t\tdecimalPlaces = 2,\n\t\tmin = 0,\n\t\tmax,\n\t\tshowUnitSelector = true,\n\t\tdisableUnitSelector = false,\n\t\tlayout = 'horizontal',\n\t\tinvalid,\n\t\tdisabled = false,\n\t\tclassName,\n\t\tsize: sizeProp,\n\t\tstrings: stringsProp,\n}: DimensionsInputProps, ref) {\n\t\tconst { defaultScale } = useDensityConfig();\n\t\tconst size = resolveFormControlSize(sizeProp, defaultScale);\n\t\tconst strings = useStrings(defaultDimensionsInputStrings, stringsProp);\n\t\tconst resolvedWidthLabel = widthLabel ?? strings.width;\n\t\tconst resolvedHeightLabel = heightLabel ?? strings.height;\n\t\tconst resolvedDepthLabel = depthLabel ?? strings.depth;\n\t\tconst resolvedUnitPlaceholder = unitPlaceholder ?? strings.unit;\n\t\tconst resolvedWidthPlaceholder = widthPlaceholder ?? strings.widthPlaceholder;\n\t\tconst resolvedHeightPlaceholder = heightPlaceholder ?? strings.heightPlaceholder;\n\t\tconst resolvedDepthPlaceholder = depthPlaceholder ?? strings.depthPlaceholder;\n\t\tconst shouldShowInlineLabels = layout === 'horizontal';\n\t\tconst shouldShowVerticalLabels = layout === 'vertical';\n\t\tconst shouldShowUnitSelector = showUnitSelector === true;\n\t\tconst hasUnitLabel = (unitLabel ?? '').length > 0;\n\t\tconst widthFieldLabel = shouldShowVerticalLabels ? resolvedWidthLabel : '';\n\t\tconst heightFieldLabel = shouldShowVerticalLabels ? resolvedHeightLabel : '';\n\t\tconst depthFieldLabel = shouldShowVerticalLabels ? resolvedDepthLabel : '';\n\t\tconst fieldId = useId();\n\t\tconst ids = { width: `${fieldId}-width`, height: `${fieldId}-height`, depth: `${fieldId}-depth`, unit: `${fieldId}-unit` };\n\t\t// Sub-labels above a field use the FormField label recipe; captions sit below.\n\t\tconst subLabelClasses = cn('text-inherit', formLabelLineClass);\n\n\t\t// Determine if value is controlled\n\t\tconst isValueControlled = controlledValue !== undefined;\n\t\tconst isUnitControlled = controlledUnit !== undefined;\n\n\t\t// Parse initial value\n\t\tconst initialParsed = parseDimensionValue(\n\t\t\t\tisValueControlled ? controlledValue : defaultValue,\n\t\t\t\tformat\n\t\t);\n\n\t\t// Internal state for uncontrolled mode\n\t\tconst [internalWidth, setInternalWidth] = useState(initialParsed.width);\n\t\tconst [internalHeight, setInternalHeight] = useState(initialParsed.height);\n\t\tconst [internalDepth, setInternalDepth] = useState(initialParsed.depth);\n\t\tconst [internalUnit, setInternalUnit] = useState(controlledUnit || defaultUnit);\n\n\t\t// Get current values\n\t\tconst parsedValue = parseDimensionValue(controlledValue, format);\n\t\tconst widthValue = isValueControlled ? parsedValue.width : internalWidth;\n\t\tconst heightValue = isValueControlled ? parsedValue.height : internalHeight;\n\t\tconst depthValue = isValueControlled ? parsedValue.depth : internalDepth;\n\t\tconst unitValue = isUnitControlled ? controlledUnit : internalUnit;\n\n\t\t// Sync internal state when controlled value changes\n\t\tuseEffect(() => {\n\t\t\t\tif (isValueControlled) {\n\t\t\t\t\t\tconst parsed = parseDimensionValue(controlledValue, format);\n\t\t\t\t\t\tsetInternalWidth(parsed.width);\n\t\t\t\t\t\tsetInternalHeight(parsed.height);\n\t\t\t\t\t\tsetInternalDepth(parsed.depth);\n\t\t\t\t}\n\t\t}, [controlledValue, format, isValueControlled]);\n\n\t\t// Handle dimension changes\n\t\tconst handleDimensionChange = useCallback(\n\t\t\t\t(dimension: 'width' | 'height' | 'depth', newValue: string) => {\n\t\t\t\t\t\tlet updatedWidth = widthValue;\n\t\t\t\t\t\tlet updatedHeight = heightValue;\n\t\t\t\t\t\tlet updatedDepth = depthValue;\n\n\t\t\t\t\t\tif (dimension === 'width') updatedWidth = newValue;\n\t\t\t\t\t\tif (dimension === 'height') updatedHeight = newValue;\n\t\t\t\t\t\tif (dimension === 'depth') updatedDepth = newValue;\n\n\t\t\t\t\t\tif (!isValueControlled) {\n\t\t\t\t\t\t\t\tsetInternalWidth(updatedWidth);\n\t\t\t\t\t\t\t\tsetInternalHeight(updatedHeight);\n\t\t\t\t\t\t\t\tsetInternalDepth(updatedDepth);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst formattedValue = formatDimensionValue(updatedWidth, updatedHeight, updatedDepth, format);\n\t\t\t\t\t\tonChange?.({ target: { value: formattedValue } });\n\t\t\t\t},\n\t\t\t\t[widthValue, heightValue, depthValue, isValueControlled, format, onChange]\n\t\t);\n\n\t\tconst handleUnitChange = useCallback(\n\t\t\t\t(newUnit: string | null) => {\n\t\t\t\t\t\tif (newUnit === null) return;\n\t\t\tconst typedUnit = newUnit as DimensionUnit;\n\t\t\t\t\t\tif (!isUnitControlled) {\n\t\t\t\t\t\t\t\tsetInternalUnit(typedUnit);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonUnitChange?.(typedUnit);\n\t\t\t\t},\n\t\t\t\t[isUnitControlled, onUnitChange]\n\t\t);\n\n\tconst unitSelector = (\n\t\t<Stack gap=\"xs\">\n\t\t\t\t\t\t{!!hasUnitLabel && shouldShowVerticalLabels && <Label htmlFor={ids.unit} className={subLabelClasses}>{unitLabel}</Label>}\n\t\t\t\t\t\t<baseui.Select\n\t\t\t\t\t\t\t\tvalue={unitValue}\n\t\t\t\t\t\t\t\tonValueChange={(value) => handleUnitChange(value)}\n\t\t\t\t\t\t\t\tdisabled={disabled || disableUnitSelector}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<baseui.SelectTrigger\n\t\t\t\t\t\t\t\t\t\tid={ids.unit}\n\t\t\t\t\t\t\t\t\t\taria-label={unitLabel ?? strings.unit}\n\t\t\t\t\t\t\t\t\t\taria-invalid={invalid || undefined}\n\t\t\t\t\t\t\t\t\t\ticonClassName={selectToggleRecipes.icon[size]}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\tformFieldTriggerClasses(size),\n\t\t\t\t\t\t\t\t\t\t\t\tlayout === 'vertical'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'w-full'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'w-full @md/dimensions-input:w-32',\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<baseui.SelectValue\n\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" type=\"secondary\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{resolvedUnitPlaceholder}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</baseui.SelectTrigger>\n\t\t\t\t\t\t\t\t<SelectPopupContent>\n\t\t\t\t\t\t\t\t\t\t<SelectPopupGroup>\n\t\t\t\t\t\t\t\t\t\t\t\t{UNIT_OPTIONS.map((unit) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<SelectPopupItem key={unit.value} value={unit.value} size={size}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{unit.label}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</SelectPopupItem>\n\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</SelectPopupGroup>\n\t\t\t\t\t\t\t\t</SelectPopupContent>\n\t\t\t\t\t\t</baseui.Select>\n\t\t</Stack>\n\t\t);\n\n\t\treturn (\n\t\t<Stack ref={ref} gap=\"md\" className={cn('dimensions-input--component @container/dimensions-input', className)}>\n\t\t\t\t\t\t{/* Dimensions Inputs */}\n\t\t\t<Stack\n\t\t\t\tdirection={layout === 'vertical' ? 'vertical' : 'horizontal'}\n\t\t\t\tgap=\"md\"\n\t\t\t\talign={layout === 'vertical' ? 'stretch' : 'start'}\n\t\t\t\tclassName=\"dimensions-input--fields\"\n\t\t\t>\n\t\t\t\t\t\t\t\t{/* Width */}\n\t\t\t\t<Stack gap=\"xs\" className=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t\t\t\t{!!shouldShowVerticalLabels && !!widthFieldLabel && <Label htmlFor={ids.width} className={subLabelClasses}>{widthFieldLabel}</Label>}\n\t\t\t\t\t\t\t\t\t\t<DecimalInput\n\t\t\t\t\t\t\t\t\t\t\t\tid={ids.width}\n\t\t\t\t\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={widthValue}\n\t\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => handleDimensionChange('width', e.target.value)}\n\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={resolvedWidthPlaceholder}\n\t\t\t\t\t\t\t\t\t\t\t\tdecimalPlaces={decimalPlaces}\n\t\t\t\t\t\t\t\t\t\t\t\tmin={min}\n\t\t\t\t\t\t\t\t\t\t\t\tmax={max}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\t\t\tinvalid={invalid}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={resolvedWidthLabel}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t{!!shouldShowInlineLabels && (\n\t\t\t\t\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"text-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{resolvedWidthLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\n\t\t\t\t\t\t\t\t{/* Separator */}\n\t\t\t\t\t\t\t\t{layout === 'horizontal' && (\n\t\t\t\t\t\t\t\t\t\t// One control tall, so the sign centres on the fields at every size.\n\t\t\t\t\t\t\t\t\t\t<div aria-hidden=\"true\" className={cn('dimensions-input--separator flex items-center', controlGroupHeightClasses[size])}>\n\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" type=\"secondary\">×</Text>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{/* Height */}\n\t\t\t\t<Stack gap=\"xs\" className=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t\t\t\t{!!shouldShowVerticalLabels && !!heightFieldLabel && <Label htmlFor={ids.height} className={subLabelClasses}>{heightFieldLabel}</Label>}\n\t\t\t\t\t\t\t\t\t\t<DecimalInput\n\t\t\t\t\t\t\t\t\t\t\t\tid={ids.height}\n\t\t\t\t\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={heightValue}\n\t\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => handleDimensionChange('height', e.target.value)}\n\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={resolvedHeightPlaceholder}\n\t\t\t\t\t\t\t\t\t\t\t\tdecimalPlaces={decimalPlaces}\n\t\t\t\t\t\t\t\t\t\t\t\tmin={min}\n\t\t\t\t\t\t\t\t\t\t\t\tmax={max}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\t\t\tinvalid={invalid}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={resolvedHeightLabel}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t{!!shouldShowInlineLabels && (\n\t\t\t\t\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"text-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{resolvedHeightLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\n\t\t\t\t\t\t\t\t{/* Separator */}\n\t\t\t\t\t\t\t\t{layout === 'horizontal' && (\n\t\t\t\t\t\t\t\t\t\t// One control tall, so the sign centres on the fields at every size.\n\t\t\t\t\t\t\t\t\t\t<div aria-hidden=\"true\" className={cn('dimensions-input--separator flex items-center', controlGroupHeightClasses[size])}>\n\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" type=\"secondary\">×</Text>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{/* Depth */}\n\t\t\t\t<Stack gap=\"xs\" className=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t\t\t\t{!!shouldShowVerticalLabels && !!depthFieldLabel && <Label htmlFor={ids.depth} className={subLabelClasses}>{depthFieldLabel}</Label>}\n\t\t\t\t\t\t\t\t\t\t<DecimalInput\n\t\t\t\t\t\t\t\t\t\t\t\tid={ids.depth}\n\t\t\t\t\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={depthValue}\n\t\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => handleDimensionChange('depth', e.target.value)}\n\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={resolvedDepthPlaceholder}\n\t\t\t\t\t\t\t\t\t\t\t\tdecimalPlaces={decimalPlaces}\n\t\t\t\t\t\t\t\t\t\t\t\tmin={min}\n\t\t\t\t\t\t\t\t\t\t\t\tmax={max}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\t\t\tinvalid={invalid}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={resolvedDepthLabel}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t{!!shouldShowInlineLabels && (\n\t\t\t\t\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"text-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{resolvedDepthLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\n\t\t\t\t\t\t\t\t{/* Unit Selector */}\n\t\t\t\t\t\t\t\t{!!shouldShowUnitSelector && (\n\t\t\t\t\t\t\t\t\t\t<Stack gap=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'dimensions-input--unit',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlayout === 'vertical'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'w-full'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'w-full basis-full pt-0 @md/dimensions-input:w-32 @md/dimensions-input:basis-32 @md/dimensions-input:shrink-0',\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{unitSelector}\n\t\t\t\t\t\t\t\t\t\t\t\t{!!shouldShowInlineLabels && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"text-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{hasUnitLabel ? unitLabel : resolvedUnitPlaceholder}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</Stack>\n\t\t);\n});\n\nDimensionsInput.displayName = 'DimensionsInput';\n","import * as React from 'react';\nimport { useId, useState, useMemo, useCallback } from 'react';\nimport * as baseui from '../../ui/select';\nimport { Stack } from '../structure';\nimport { Label, Text } from '../../typography';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { useDensityConfig, type FormControlSize } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { formFieldTriggerClasses, resolveFormControlSize, formLabelLineClass } from '../forms/form-sizing';\nimport { selectToggleRecipes } from '../../../lib/field-affordance-recipes';\nimport { DecimalInput } from './decimal-input';\nimport { SelectPopupContent, SelectPopupGroup, SelectPopupItem } from '../choice-inputs';\n\nexport type WeightUnit = 'g' | 'kg' | 'lb' | 'oz';\n\nexport interface WeightInputStrings {\n\t\t/** Above-field label for the unit selector. Empty string hides it. */\n\t\tunitLabel: string;\n\t\t/** Accessible name for the unit selector. */\n\t\tunitAriaLabel: string;\n\t\t/** Placeholder shown in the unit selector. */\n\t\tunitPlaceholder: string;\n}\n\nexport const defaultWeightInputStrings: WeightInputStrings = {\n\t\tunitLabel: '',\n\t\tunitAriaLabel: 'Unit',\n\t\tunitPlaceholder: '',\n};\n\nexport interface WeightInputProps {\n\t\t/** Controlled value */\n\t\tvalue?: string;\n\n\t\t/** Default value for uncontrolled mode */\n\t\tdefaultValue?: string;\n\n\t\t/** Current unit */\n\t\tunit?: WeightUnit;\n\n\t\t/** Default unit for uncontrolled mode */\n\t\tdefaultUnit?: WeightUnit;\n\n\t\t/** Value change handler */\n\t\tonChange?: (e: { target: { value: string } }) => void;\n\n\t\t/** Unit change handler */\n\t\tonUnitChange?: (unit: WeightUnit) => void;\n\n\t\t/** Number of decimal places */\n\t\tdecimalPlaces?: number;\n\n\t\t/** Minimum value */\n\t\tmin?: number;\n\n\t\t/** Maximum value */\n\t\tmax?: number;\n\n\t\t/** Show unit selector */\n\t\tshowUnitSelector?: boolean;\n\n\t\t/** Disable unit selector */\n\t\tdisableUnitSelector?: boolean;\n\n\t\t/** Override default strings (unit selector label + placeholder). */\n\t\tstrings?: StringsProp<WeightInputStrings>;\n\n\t\t/** Width of unit selector */\n\t\tunitWidth?: string;\n\n\t\t/** Error state for styling (passed from FormField) */\n\t\tinvalid?: boolean;\n\n\t\t/** Disabled state */\n\t\tdisabled?: boolean;\n\n\t\t/** Form control size — flows through `useDensityConfig().defaultScale`. */\n\t\tsize?: FormControlSize;\n\n\t\t/** Additional class names */\n\t\tclassName?: string;\n}\n\nconst UNIT_OPTIONS: Array<{ value: WeightUnit; label: string }> = [\n\t\t{ value: 'g', label: 'g' },\n\t\t{ value: 'kg', label: 'kg' },\n\t\t{ value: 'lb', label: 'lb' },\n\t\t{ value: 'oz', label: 'oz' },\n];\n\nexport const WeightInput = React.forwardRef<HTMLDivElement, WeightInputProps>(function WeightInput({\n\t\tvalue: controlledValue,\n\t\tdefaultValue,\n\t\tunit: controlledUnit,\n\t\tdefaultUnit = 'g',\n\t\tonChange,\n\t\tonUnitChange,\n\t\tdecimalPlaces = 2,\n\t\tmin = 0,\n\t\tmax,\n\t\tshowUnitSelector = true,\n\t\tdisableUnitSelector = false,\n\t\tunitWidth = 'w-24',\n\t\tstrings: stringsProp,\n\t\tinvalid,\n\t\tdisabled = false,\n\t\tsize: sizeProp,\n\t\tclassName,\n}: WeightInputProps, ref) {\n\t\tconst { defaultScale } = useDensityConfig();\n\t\tconst size = resolveFormControlSize(sizeProp, defaultScale);\n\t\tconst strings = useStrings(defaultWeightInputStrings, stringsProp);\n\t\tconst isValueControlled = controlledValue !== undefined;\n\t\tconst isUnitControlled = controlledUnit !== undefined;\n\n\t\tconst [internalValue, setInternalValue] = useState(defaultValue ?? '');\n\t\tconst [internalUnit, setInternalUnit] = useState<WeightUnit>(controlledUnit ?? defaultUnit);\n\n\t\tconst value = isValueControlled ? controlledValue ?? '' : internalValue;\n\t\tconst unit = isUnitControlled ? controlledUnit ?? defaultUnit : internalUnit;\n\n\t\tconst handleValueChange = useCallback(\n\t\t\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\t\t\t\tif (!isValueControlled) {\n\t\t\t\t\t\t\t\tsetInternalValue(e.target.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonChange?.({ target: { value: e.target.value } });\n\t\t\t\t},\n\t\t\t\t[isValueControlled, onChange]\n\t\t);\n\n\t\tconst handleUnitChange = useCallback(\n\t\t\t\t(nextUnit: string | null) => {\n\t\t\t\t\t\tif (nextUnit === null) return;\n\t\t\t\t\t\tconst weightUnit = nextUnit as WeightUnit;\n\t\t\t\t\t\tif (!isUnitControlled) {\n\t\t\t\t\t\t\t\tsetInternalUnit(weightUnit);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonUnitChange?.(weightUnit);\n\t\t\t\t},\n\t\t\t\t[isUnitControlled, onUnitChange]\n\t\t);\n\n\t\tconst unitOptions = useMemo(() => UNIT_OPTIONS, []);\n\t\tconst hasUnitLabel = strings.unitLabel !== '';\n\t\tconst unitTriggerId = useId();\n\n\t\treturn (\n\t\t\t\t// Bottom-aligned, so value and unit stay level when only the unit has a sub-label.\n\t\t\t\t<div ref={ref} className={cn('weight-input--component', 'flex items-end gap-space-md', className)}>\n\t\t\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t\t\t\t<DecimalInput\n\t\t\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\t\t\t\tonChange={handleValueChange}\n\t\t\t\t\t\t\t\t\t\tdecimalPlaces={decimalPlaces}\n\t\t\t\t\t\t\t\t\t\tallowNegative={false}\n\t\t\t\t\t\t\t\t\t\tmin={min}\n\t\t\t\t\t\t\t\t\t\tmax={max}\n\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\tinvalid={invalid}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{!!showUnitSelector && (\n\t\t\t\t<Stack gap=\"xs\">\n\t\t\t\t\t\t\t\t\t\t{!!hasUnitLabel && <Label htmlFor={unitTriggerId} className={cn('text-inherit', formLabelLineClass)}>{strings.unitLabel}</Label>}\n\t\t\t\t\t\t\t\t\t\t<baseui.Select value={unit} onValueChange={(value) => handleUnitChange(value)} disabled={disabled || disableUnitSelector}>\n\t\t\t\t\t\t\t\t<baseui.SelectTrigger\n\t\t\t\t\t\t\t\t\t\tid={unitTriggerId}\n\t\t\t\t\t\t\t\t\t\taria-label={strings.unitLabel || strings.unitAriaLabel}\n\t\t\t\t\t\t\t\t\t\taria-invalid={invalid || undefined}\n\t\t\t\t\t\t\t\t\t\ticonClassName={selectToggleRecipes.icon[size]}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tformFieldTriggerClasses(size),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunitWidth\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<baseui.SelectValue\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={strings.unitPlaceholder ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" type=\"secondary\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{strings.unitPlaceholder}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : undefined}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</baseui.SelectTrigger>\n\t\t\t\t\t\t\t\t\t\t\t\t<SelectPopupContent>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<SelectPopupGroup>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{unitOptions.map((option) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<SelectPopupItem key={option.value} value={option.value} size={size}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</SelectPopupItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</SelectPopupGroup>\n\t\t\t\t\t\t\t\t\t\t\t\t</SelectPopupContent>\n\t\t\t\t\t\t\t\t\t\t</baseui.Select>\n\t\t\t\t</Stack>\n\t\t\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t);\n});\n\nWeightInput.displayName = 'WeightInput';\n","import * as React from 'react';\nimport { useEffect, useMemo, useState, useCallback } from 'react';\nimport { FormField } from '../forms/form-field';\nimport { Grid, Stack } from '../structure';\nimport { TextLink } from '../../typography';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport type { FormControlSize } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { DecimalInput } from './decimal-input';\n\nexport interface CoordinatesObjectValue {\n\t\tlat?: string;\n\t\tlng?: string;\n}\n\nexport type CoordinatesValue = string | CoordinatesObjectValue;\n\nexport interface CoordinatesInputStrings {\n\t\t/** Above-field label for the latitude input. Empty string hides it. */\n\t\tlatLabel: string;\n\t\t/** Above-field label for the longitude input. Empty string hides it. */\n\t\tlngLabel: string;\n\t\t/** Placeholder shown in the latitude input. */\n\t\tlatPlaceholder: string;\n\t\t/** Placeholder shown in the longitude input. */\n\t\tlngPlaceholder: string;\n\t\t/** Anchor text for the Google Maps preview link. Empty string hides it. */\n\t\tpreviewLinkLabel: string;\n}\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\t\t/** Control-height preset for both fields. Falls back to `UIProvider.density.defaultScale`, like the other numeric inputs. */\n\t\tsize?: FormControlSize;\n}\n\nconst parseValue = (\n\t\tvalue: CoordinatesValue | undefined,\n\t\tformat: 'string' | 'object'\n): { lat: string; lng: string } => {\n\t\tif (!value) {\n\t\t\t\treturn { lat: '', lng: '' };\n\t\t}\n\n\t\tif (format === 'string' && typeof value === 'string') {\n\t\t\t\tconst [lat, lng] = value.split(',').map((part) => part.trim());\n\t\t\t\treturn { lat: lat ?? '', lng: lng ?? '' };\n\t\t}\n\n\t\tif (format === 'object' && typeof value === 'object') {\n\t\t\t\treturn { lat: value.lat ?? '', lng: value.lng ?? '' };\n\t\t}\n\n\t\treturn { lat: '', lng: '' };\n};\n\nconst formatValue = (lat: string, lng: string, format: 'string' | 'object'): CoordinatesValue => {\n\t\tif (format === 'string') {\n\t\t\t\treturn `${lat},${lng}`;\n\t\t}\n\t\treturn { lat, lng };\n};\n\nconst isFiniteNumberInRange = (value: string, min: number, max: number): boolean => {\n\t\tif (!value) return false;\n\t\tconst num = Number(value);\n\t\treturn Number.isFinite(num) && num >= min && num <= max;\n};\n\nexport const CoordinatesInput = React.forwardRef<HTMLDivElement, CoordinatesInputProps>(function CoordinatesInput({\n\t\tvalue: controlledValue,\n\t\tdefaultValue,\n\t\tformat = 'object',\n\t\tonChange,\n\t\tdecimalPlaces = 6,\n\t\tshowPreviewLink = true,\n\t\tstrings: stringsProp,\n\t\tinvalid,\n\t\tclassName,\n\t\tdisabled,\n\t\tsize,\n}: CoordinatesInputProps, ref) {\n\t\tconst strings = useStrings(defaultCoordinatesInputStrings, stringsProp);\n\t\tconst isControlled = controlledValue !== undefined;\n\n\t\tconst initialParsed = parseValue(isControlled ? controlledValue : defaultValue, format);\n\t\tconst [internalLat, setInternalLat] = useState(initialParsed.lat);\n\t\tconst [internalLng, setInternalLng] = useState(initialParsed.lng);\n\n\t\tconst parsedControlled = parseValue(controlledValue, format);\n\t\tconst lat = isControlled ? parsedControlled.lat : internalLat;\n\t\tconst lng = isControlled ? parsedControlled.lng : internalLng;\n\n\t\tuseEffect(() => {\n\t\t\t\tif (isControlled) {\n\t\t\t\t\t\tsetInternalLat(parsedControlled.lat);\n\t\t\t\t\t\tsetInternalLng(parsedControlled.lng);\n\t\t\t\t}\n\t\t}, [isControlled, parsedControlled.lat, parsedControlled.lng]);\n\n\t\tconst update = useCallback(\n\t\t\t\t(nextLat: string, nextLng: string) => {\n\t\t\t\t\t\tif (!isControlled) {\n\t\t\t\t\t\t\t\tsetInternalLat(nextLat);\n\t\t\t\t\t\t\t\tsetInternalLng(nextLng);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tonChange?.({ target: { value: formatValue(nextLat, nextLng, format) } });\n\t\t\t\t},\n\t\t\t\t[isControlled, onChange, format]\n\t\t);\n\n\t\tconst mapUrl = useMemo(() => {\n\t\t\t\tconst hasValidLat = isFiniteNumberInRange(lat, -90, 90);\n\t\t\t\tconst hasValidLng = isFiniteNumberInRange(lng, -180, 180);\n\t\t\t\tif (!hasValidLat || !hasValidLng) return null;\n\t\t\t\treturn `https://www.google.com/maps?q=${encodeURIComponent(`${lat},${lng}`)}`;\n\t\t}, [lat, lng]);\n\n\t\treturn (\n\t\t\t\t<Stack ref={ref} gap=\"lg\" className={cn('coordinates-input--component', className)}>\n\t\t\t\t\t\t<Grid columns={{ base: 1, md: 2 }} gap=\"lg\">\n\t\t\t\t\t\t\t\t<FormField label={strings.latLabel || undefined}>\n\t\t\t\t\t\t\t\t\t\t<DecimalInput\n\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={strings.latPlaceholder || undefined}\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={lat}\n\t\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => update(e.target.value, lng)}\n\t\t\t\t\t\t\t\t\t\t\t\tdecimalPlaces={decimalPlaces}\n\t\t\t\t\t\t\t\t\t\t\t\tallowNegative\n\t\t\t\t\t\t\t\t\t\t\t\tmin={-90}\n\t\t\t\t\t\t\t\t\t\t\t\tmax={90}\n\t\t\t\t\t\t\t\t\t\t\t\tinvalid={invalid}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FormField>\n\t\t\t\t\t\t\t\t<FormField label={strings.lngLabel || undefined}>\n\t\t\t\t\t\t\t\t\t\t<DecimalInput\n\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={strings.lngPlaceholder || undefined}\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={lng}\n\t\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => update(lat, e.target.value)}\n\t\t\t\t\t\t\t\t\t\t\t\tdecimalPlaces={decimalPlaces}\n\t\t\t\t\t\t\t\t\t\t\t\tallowNegative\n\t\t\t\t\t\t\t\t\t\t\t\tmin={-180}\n\t\t\t\t\t\t\t\t\t\t\t\tmax={180}\n\t\t\t\t\t\t\t\t\t\t\t\tinvalid={invalid}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FormField>\n\t\t\t\t\t\t</Grid>\n\n\t\t\t\t\t\t{!!showPreviewLink && !!mapUrl && !!strings.previewLinkLabel && (\n\t\t\t\t\t\t\t\t<TextLink href={mapUrl} type=\"secondary\" underline={false}>\n\t\t\t\t\t\t\t\t\t\t{strings.previewLinkLabel}\n\t\t\t\t\t\t\t\t</TextLink>\n\t\t\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t);\n});\n\nCoordinatesInput.displayName = 'CoordinatesInput';\n"],"mappings":"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"}
@@ -1,263 +0,0 @@
1
- "use client";
2
- import { s as e } from "./ui-provider-C_U0Xma4.js";
3
- import { useStrings as t } from "./lib/strings.js";
4
- import { t as n } from "./utils-BRhFDwuU.js";
5
- import { t as r } from "./affordance-geometry.generated-tF36bREk.js";
6
- import { c as i } from "./typography-UTnveOEy.js";
7
- import { n as a, t as o } from "./field-affordance-recipes-DZhnIL_Y.js";
8
- import { c as s, f as c, i as l, n as u, r as d, s as f, t as p, y as m } from "./form-sizing-BdP_Mf5p.js";
9
- import * as h from "react";
10
- import { createContext as g, forwardRef as _, memo as v, useCallback as y, useId as b, useMemo as x, useRef as S, useState as C } from "react";
11
- import { jsx as w, jsxs as T } from "react/jsx-runtime";
12
- import { Loader2Icon as ee } from "lucide-react";
13
- //#region src/components/base/text-inputs/hooks/use-form-field-state.ts
14
- function te({ controlledValue: e, defaultValue: t, maxLength: n, showCharacterCount: r, providedId: i, idPrefix: a = "field", hasOnChange: o }) {
15
- let s = b(), c = i || `${a}${s}`, [l, u] = C(t || ""), d = e !== void 0, f = (d ? e : l) ?? "", p = !(!o || d || t), m = f.length, h = n !== void 0, g = r !== !1 && !!(r || h), _ = f !== "", v = y((e) => h && e.length > n, [h, n]), S = y((e) => !v(e) && (d || u(e), !0), [d, v]), w = y(() => {
16
- d || u("");
17
- }, [d]);
18
- return x(() => ({
19
- id: c,
20
- value: f,
21
- isControlled: d,
22
- isReactHookForm: p,
23
- characterCount: m,
24
- hasCharacterLimit: h,
25
- showCount: g,
26
- hasValue: _,
27
- updateValue: S,
28
- clearValue: w,
29
- wouldExceedLimit: v
30
- }), [
31
- c,
32
- f,
33
- d,
34
- p,
35
- m,
36
- h,
37
- g,
38
- _,
39
- S,
40
- w,
41
- v
42
- ]);
43
- }
44
- //#endregion
45
- //#region src/components/base/text-inputs/clear-native-field.ts
46
- function ne(e) {
47
- let t = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(e), "value")?.set;
48
- e.type === "file" ? e.value = "" : t?.call(e, ""), e.dispatchEvent(new Event("change", { bubbles: !0 }));
49
- }
50
- //#endregion
51
- //#region src/components/base/text-inputs/input-trailing-action.ts
52
- var re = g(null), E = _(function({ className: e, type: t = "button", ...r }, i) {
53
- return /* @__PURE__ */ w("button", {
54
- ref: i,
55
- type: t,
56
- className: n(a.target, a.focus, a.clear, e),
57
- ...r,
58
- children: /* @__PURE__ */ w(o, {
59
- className: a.icon,
60
- "aria-hidden": "true"
61
- })
62
- });
63
- });
64
- E.displayName = "FieldClearButton";
65
- //#endregion
66
- //#region src/components/base/text-inputs/input.tsx
67
- var ie = { clear: "Clear input" }, ae = (e, t, n) => {
68
- let r = e || "";
69
- return t && r && (r = t + r), n && r && (r += n), r;
70
- };
71
- function D({ className: o, type: g = "text", startIcon: _, endIcon: v, startAddon: b, endAddon: C, maxLength: D, showCharacterCount: O, clearable: oe, onClear: k, loading: A = !1, returnValueWithAddons: j, invalid: se, size: ce, onChange: M, value: le, defaultValue: ue, id: de, strings: fe, ...N }, P) {
72
- let F = S(null), I = h.useContext(re), L = S(null), R = S(null), [z, B] = h.useState(), [V, H] = h.useState(), pe = t(ie, fe), { defaultScale: me } = e(), U = m(ce, me), he = y((e) => {
73
- typeof P == "function" ? P(e) : P && (P.current = e), F.current = e;
74
- }, [P]), { id: ge, value: _e, isReactHookForm: ve, characterCount: W, hasCharacterLimit: ye, showCount: G, hasValue: be, updateValue: K, clearValue: xe, wouldExceedLimit: Se } = te({
75
- controlledValue: le,
76
- defaultValue: ue,
77
- maxLength: D,
78
- showCharacterCount: O,
79
- providedId: de,
80
- idPrefix: "input",
81
- hasOnChange: M !== void 0
82
- }), Ce = !!oe, q = A, we = !!v, Te = !!C, J = g === "file", Y = !!se, X = Ce && be && !G && !q, Z = q && !G, Q = we && !X && !G && !q, $ = Te && !X && !G && !q;
83
- h.useLayoutEffect(() => {
84
- let e = L.current, t = R.current, n = () => {
85
- if (e) {
86
- let t = e.getBoundingClientRect().width;
87
- t > 0 && B(t);
88
- } else B(void 0);
89
- if (t) {
90
- let e = t.getBoundingClientRect().width;
91
- e > 0 && H(e);
92
- } else H(void 0);
93
- };
94
- if (n(), !e && !t) return;
95
- let r = typeof ResizeObserver > "u" ? void 0 : new ResizeObserver(n);
96
- return e && r?.observe(e), t && r?.observe(t), window.addEventListener("resize", n), () => {
97
- r?.disconnect(), window.removeEventListener("resize", n);
98
- };
99
- }, [
100
- U,
101
- W,
102
- D,
103
- b,
104
- C,
105
- Q,
106
- $,
107
- X,
108
- G,
109
- Z,
110
- I
111
- ]);
112
- let Ee = x(() => {
113
- let e = U === "sm" ? "ps-control-sm" : "ps-control", t = U === "sm" ? "pe-control-sm" : "pe-control";
114
- return _ && (e = s[U]), b && (e = p[U]), b && V !== void 0 && (e = a.measuredStartPadding[U]), Q && (t = l[U]), $ && (t = d[U]), q && (t = l[U]), X && (t = a.clearPadding[U]), G && (t = u[U]), I && (t = G ? a.pairedCountPadding[U] : X ? a.pairedClearPadding[U] : $ ? a.pairedAddonPadding[U] : Q || Z ? a.pairedIconPadding[U] : a.clearPadding[U]), z !== void 0 && (t = a.measuredPadding[U]), `${e} ${t}`;
115
- }, [
116
- _,
117
- b,
118
- Q,
119
- $,
120
- X,
121
- Z,
122
- q,
123
- G,
124
- I,
125
- z,
126
- V,
127
- U
128
- ]), De = y((e) => {
129
- let t = e.target.value;
130
- if (!Se(t) && (K(t), M)) {
131
- if (j && t) {
132
- let n = ae(t, b, C);
133
- M({
134
- ...e,
135
- target: {
136
- ...e.target,
137
- value: n
138
- },
139
- currentTarget: {
140
- ...e.currentTarget,
141
- value: n
142
- }
143
- });
144
- } else M(e);
145
- }
146
- }, [
147
- M,
148
- j,
149
- b,
150
- C,
151
- K,
152
- Se
153
- ]), Oe = y(() => {
154
- if (N.disabled || N.readOnly || A) return;
155
- let e = F.current;
156
- if (e?.type === "color" || e?.type === "range") {
157
- xe();
158
- let t = {
159
- value: "",
160
- name: e.name,
161
- id: e.id,
162
- type: e.type
163
- };
164
- M?.({
165
- target: t,
166
- currentTarget: t
167
- });
168
- } else e && ne(e);
169
- k?.(), F.current?.focus();
170
- }, [
171
- N.disabled,
172
- N.readOnly,
173
- A,
174
- xe,
175
- M,
176
- k
177
- ]);
178
- return /* @__PURE__ */ T("div", {
179
- className: n("input--component", "relative h-fit w-full min-w-0"),
180
- style: z === void 0 && V === void 0 ? void 0 : {
181
- "--field-trailing-width": z === void 0 ? void 0 : `${z}px`,
182
- "--field-leading-width": V === void 0 ? void 0 : `${V}px`
183
- },
184
- children: [
185
- /* @__PURE__ */ w("input", {
186
- ref: he,
187
- id: ge,
188
- type: g,
189
- ...!ve && { value: _e },
190
- onChange: De,
191
- maxLength: D,
192
- "aria-invalid": Y || void 0,
193
- className: n("flex w-full min-w-0", c(U), "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground", "file:box-border file:inline-flex file:h-control-file file:border file:bg-transparent file:px-control file:py-0 file:font-medium", "file:text-pxs", J && r.fileField.minHeight, J && r.fileField.blockPadding[U], r.fileField.buttonMinHeight, J ? "cursor-pointer bg-background text-foreground file:cursor-pointer file:rounded-inner file:border-input file:bg-background file:text-foreground" : "bg-transparent", J ? "read-only:bg-background" : "[&:read-only:not(:disabled)]:bg-muted", Ee, o),
194
- ...N,
195
- disabled: N.disabled || A
196
- }),
197
- !!_ && /* @__PURE__ */ w("div", {
198
- className: n("pointer-events-none absolute inset-y-0 start-0 flex items-center justify-center", U === "sm" ? "ps-control-sm" : "ps-control", N.disabled && "opacity-50", Y ? "text-destructive" : "text-muted-foreground"),
199
- children: /* @__PURE__ */ w(_, {
200
- className: f[U],
201
- "aria-hidden": "true"
202
- })
203
- }),
204
- !!b && /* @__PURE__ */ w("span", {
205
- className: n("pointer-events-none absolute inset-y-0 start-0 flex items-center justify-center", U === "sm" ? "ps-control-sm" : "ps-control", N.disabled && "opacity-50"),
206
- children: /* @__PURE__ */ w(i, {
207
- ref: R,
208
- tag: "span",
209
- size: U === "sm" ? "pxs" : "sm",
210
- type: Y ? "error" : "secondary",
211
- lineHeight: "tight",
212
- className: "input--start-addon",
213
- children: b
214
- })
215
- }),
216
- (Q || $ || G || Z || X || I) && /* @__PURE__ */ T("div", {
217
- ref: L,
218
- className: n("input--trailing absolute inset-y-0 flex items-center gap-space-sm whitespace-nowrap", a.clearEnd[U], N.disabled && "opacity-50"),
219
- children: [
220
- Q && v && /* @__PURE__ */ w(v, {
221
- className: n("pointer-events-none", f[U], Y ? "text-destructive" : "text-muted-foreground"),
222
- "aria-hidden": "true"
223
- }),
224
- $ && /* @__PURE__ */ w(i, {
225
- tag: "span",
226
- size: U === "sm" ? "pxs" : "sm",
227
- type: Y ? "error" : "secondary",
228
- lineHeight: "tight",
229
- className: "input--end-addon pointer-events-none",
230
- children: C
231
- }),
232
- G && /* @__PURE__ */ w("div", {
233
- role: "status",
234
- "aria-live": "polite",
235
- className: "pointer-events-none tabular-nums",
236
- children: /* @__PURE__ */ T(i, {
237
- tag: "span",
238
- size: U === "sm" ? "xxs" : "xs",
239
- type: Y ? "error" : "secondary",
240
- children: [W, ye ? `/${D}` : ""]
241
- })
242
- }),
243
- Z && /* @__PURE__ */ w(ee, {
244
- className: n(f[U], "pointer-events-none animate-spin", Y ? "text-destructive" : "text-muted-foreground"),
245
- "aria-hidden": "true"
246
- }),
247
- X && /* @__PURE__ */ w(E, {
248
- "aria-label": pe.clear,
249
- onClick: Oe,
250
- disabled: N.disabled || N.readOnly || A
251
- }),
252
- I
253
- ]
254
- })
255
- ]
256
- });
257
- }
258
- var O = v(h.forwardRef(D));
259
- O.displayName = "Input";
260
- //#endregion
261
- export { ne as a, re as i, ie as n, te as o, E as r, O as t };
262
-
263
- //# sourceMappingURL=input-DQdEd0YD.js.map