admin-ui-starter-kit 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1121) hide show
  1. package/.agents/skills/component-library-rules/SKILL.md +24 -0
  2. package/.agents/skills/component-library-rules/references/components/base__metadata-list.md +2 -2
  3. package/.agents/skills/component-library-rules/references/import-paths.md +27 -0
  4. package/AGENTS.md +8 -3
  5. package/INTEGRATION.md +33 -2
  6. package/PUBLISHING.md +3 -1
  7. package/README.md +33 -6
  8. package/dist/_shared/accordion-CztqyaIN.js +130 -0
  9. package/dist/_shared/accordion-CztqyaIN.js.map +1 -0
  10. package/dist/_shared/accordion-D5uTCLCB.cjs +2 -0
  11. package/dist/_shared/accordion-D5uTCLCB.cjs.map +1 -0
  12. package/dist/_shared/action-menu-Yrj6VzFS.js +96 -0
  13. package/dist/_shared/action-menu-Yrj6VzFS.js.map +1 -0
  14. package/dist/_shared/action-menu-eVP8GGlv.cjs +2 -0
  15. package/dist/_shared/action-menu-eVP8GGlv.cjs.map +1 -0
  16. package/dist/_shared/ai-artifact-DaHXJTKg.cjs +3 -0
  17. package/dist/_shared/ai-artifact-DaHXJTKg.cjs.map +1 -0
  18. package/dist/_shared/ai-artifact-DyLn3JAs.js +1068 -0
  19. package/dist/_shared/ai-artifact-DyLn3JAs.js.map +1 -0
  20. package/dist/_shared/alert-BVw4Mq6H.js +48 -0
  21. package/dist/_shared/alert-BVw4Mq6H.js.map +1 -0
  22. package/dist/_shared/alert-DXSlR9ja.cjs +2 -0
  23. package/dist/_shared/alert-DXSlR9ja.cjs.map +1 -0
  24. package/dist/_shared/avatar-CpBz9pTv.js +52 -0
  25. package/dist/_shared/avatar-CpBz9pTv.js.map +1 -0
  26. package/dist/_shared/avatar-dg20YFFs.cjs +2 -0
  27. package/dist/_shared/avatar-dg20YFFs.cjs.map +1 -0
  28. package/dist/_shared/badge-BVCh_hfL.js +108 -0
  29. package/dist/_shared/badge-BVCh_hfL.js.map +1 -0
  30. package/dist/_shared/badge-C49SSz-6.cjs +2 -0
  31. package/dist/_shared/badge-C49SSz-6.cjs.map +1 -0
  32. package/dist/_shared/breadcrumbs-Bo7j5Rhv.cjs +2 -0
  33. package/dist/_shared/breadcrumbs-Bo7j5Rhv.cjs.map +1 -0
  34. package/dist/_shared/breadcrumbs-Dc93fqqE.js +111 -0
  35. package/dist/_shared/breadcrumbs-Dc93fqqE.js.map +1 -0
  36. package/dist/_shared/button-2xglT7yf.cjs +2 -0
  37. package/dist/_shared/button-2xglT7yf.cjs.map +1 -0
  38. package/dist/_shared/button-ChCkwoOD.js +176 -0
  39. package/dist/_shared/button-ChCkwoOD.js.map +1 -0
  40. package/dist/_shared/button-D0nF99a9.cjs +2 -0
  41. package/dist/_shared/button-D0nF99a9.cjs.map +1 -0
  42. package/dist/_shared/button-DBR4QI9E.js +46 -0
  43. package/dist/_shared/button-DBR4QI9E.js.map +1 -0
  44. package/dist/_shared/buttons-Bcnt1md_.js +143 -0
  45. package/dist/_shared/buttons-Bcnt1md_.js.map +1 -0
  46. package/dist/_shared/buttons-km9xqXJv.cjs +2 -0
  47. package/dist/_shared/buttons-km9xqXJv.cjs.map +1 -0
  48. package/dist/_shared/card-radio-group-BGH93O5-.js +158 -0
  49. package/dist/_shared/card-radio-group-BGH93O5-.js.map +1 -0
  50. package/dist/_shared/card-radio-group-Vq741uhL.cjs +2 -0
  51. package/dist/_shared/card-radio-group-Vq741uhL.cjs.map +1 -0
  52. package/dist/_shared/combobox-BgXAxjU2.js +746 -0
  53. package/dist/_shared/combobox-BgXAxjU2.js.map +1 -0
  54. package/dist/_shared/combobox-DuIyh3xJ.cjs +2 -0
  55. package/dist/_shared/combobox-DuIyh3xJ.cjs.map +1 -0
  56. package/dist/_shared/command-BbiijN61.js +39 -0
  57. package/dist/_shared/command-BbiijN61.js.map +1 -0
  58. package/dist/_shared/command-D7zTvyBJ.cjs +2 -0
  59. package/dist/_shared/command-D7zTvyBJ.cjs.map +1 -0
  60. package/dist/_shared/command-DGNtTI-V.cjs +2 -0
  61. package/dist/_shared/command-DGNtTI-V.cjs.map +1 -0
  62. package/dist/_shared/command-jKbwFRtS.js +123 -0
  63. package/dist/_shared/command-jKbwFRtS.js.map +1 -0
  64. package/dist/_shared/comments-CNUsdwGW.cjs +2 -0
  65. package/dist/_shared/comments-CNUsdwGW.cjs.map +1 -0
  66. package/dist/_shared/comments-CvmS7zG3.js +945 -0
  67. package/dist/_shared/comments-CvmS7zG3.js.map +1 -0
  68. package/dist/_shared/containers-BFDv7cCV.cjs +2 -0
  69. package/dist/_shared/containers-BFDv7cCV.cjs.map +1 -0
  70. package/dist/_shared/containers-C1-A_2PT.js +19 -0
  71. package/dist/_shared/containers-C1-A_2PT.js.map +1 -0
  72. package/dist/_shared/content-container-CwqFnaI0.cjs +2 -0
  73. package/dist/_shared/content-container-CwqFnaI0.cjs.map +1 -0
  74. package/dist/_shared/content-container-D_3JGBSc.js +33 -0
  75. package/dist/_shared/content-container-D_3JGBSc.js.map +1 -0
  76. package/dist/_shared/copyable-CHhCGMfW.js +38 -0
  77. package/dist/_shared/copyable-CHhCGMfW.js.map +1 -0
  78. package/dist/_shared/copyable-ndaiocYq.cjs +2 -0
  79. package/dist/_shared/copyable-ndaiocYq.cjs.map +1 -0
  80. package/dist/_shared/date-picker-B8O_qbik.js +1353 -0
  81. package/dist/_shared/date-picker-B8O_qbik.js.map +1 -0
  82. package/dist/_shared/date-picker-BnOjyuKS.cjs +2 -0
  83. package/dist/_shared/date-picker-BnOjyuKS.cjs.map +1 -0
  84. package/dist/_shared/date-pickers-Cas9cPlj.js +330 -0
  85. package/dist/_shared/date-pickers-Cas9cPlj.js.map +1 -0
  86. package/dist/_shared/date-pickers-Dk-G3RMy.cjs +2 -0
  87. package/dist/_shared/date-pickers-Dk-G3RMy.cjs.map +1 -0
  88. package/dist/_shared/dialog-67GmkMLC.js +101 -0
  89. package/dist/_shared/dialog-67GmkMLC.js.map +1 -0
  90. package/dist/_shared/dialog-BF_4uAhE.cjs +2 -0
  91. package/dist/_shared/dialog-BF_4uAhE.cjs.map +1 -0
  92. package/dist/_shared/display-B9xVWboG.cjs +8 -0
  93. package/dist/_shared/display-B9xVWboG.cjs.map +1 -0
  94. package/dist/_shared/display-BM_GxDAo.js +1237 -0
  95. package/dist/_shared/display-BM_GxDAo.js.map +1 -0
  96. package/dist/_shared/dropdown-menu-4nxEBMnd.js +147 -0
  97. package/dist/_shared/dropdown-menu-4nxEBMnd.js.map +1 -0
  98. package/dist/_shared/dropdown-menu-DZlWHqWS.cjs +2 -0
  99. package/dist/_shared/dropdown-menu-DZlWHqWS.cjs.map +1 -0
  100. package/dist/_shared/form-field-BQlki-8s.js +319 -0
  101. package/dist/_shared/form-field-BQlki-8s.js.map +1 -0
  102. package/dist/_shared/form-field-DzpwVS99.cjs +2 -0
  103. package/dist/_shared/form-field-DzpwVS99.cjs.map +1 -0
  104. package/dist/_shared/form-sizing-CcbB-OHF.js +21 -0
  105. package/dist/_shared/form-sizing-CcbB-OHF.js.map +1 -0
  106. package/dist/_shared/form-sizing-Cw12UeI6.cjs +2 -0
  107. package/dist/_shared/form-sizing-Cw12UeI6.cjs.map +1 -0
  108. package/dist/_shared/format-B2AdSQVn.cjs +2 -0
  109. package/dist/_shared/format-B2AdSQVn.cjs.map +1 -0
  110. package/dist/_shared/format-CP65h1vK.js +48 -0
  111. package/dist/_shared/format-CP65h1vK.js.map +1 -0
  112. package/dist/_shared/forms-B8aaNG44.cjs +2 -0
  113. package/dist/_shared/forms-B8aaNG44.cjs.map +1 -0
  114. package/dist/_shared/forms-BusuTZZ2.js +3374 -0
  115. package/dist/_shared/forms-BusuTZZ2.js.map +1 -0
  116. package/dist/_shared/header-DWfOUjFL.cjs +2 -0
  117. package/dist/_shared/header-DWfOUjFL.cjs.map +1 -0
  118. package/dist/_shared/header-KpdoLtP9.js +369 -0
  119. package/dist/_shared/header-KpdoLtP9.js.map +1 -0
  120. package/dist/_shared/heading-BprqyzDs.js +39 -0
  121. package/dist/_shared/heading-BprqyzDs.js.map +1 -0
  122. package/dist/_shared/heading-mZc_jan1.cjs +2 -0
  123. package/dist/_shared/heading-mZc_jan1.cjs.map +1 -0
  124. package/dist/_shared/hooks-C-uWoRq5.cjs +2 -0
  125. package/dist/_shared/hooks-C-uWoRq5.cjs.map +1 -0
  126. package/dist/_shared/hooks-D5HJtvvP.js +118 -0
  127. package/dist/_shared/hooks-D5HJtvvP.js.map +1 -0
  128. package/dist/_shared/icon-badge-BBqDyAUz.cjs +2 -0
  129. package/dist/_shared/icon-badge-BBqDyAUz.cjs.map +1 -0
  130. package/dist/_shared/icon-badge-Bi63T-bj.js +52 -0
  131. package/dist/_shared/icon-badge-Bi63T-bj.js.map +1 -0
  132. package/dist/_shared/input-B2YXTHqz.cjs +2 -0
  133. package/dist/_shared/input-B2YXTHqz.cjs.map +1 -0
  134. package/dist/_shared/input-BJb10xb9.cjs +2 -0
  135. package/dist/_shared/input-BJb10xb9.cjs.map +1 -0
  136. package/dist/_shared/input-CZxP5Xgj.js +17 -0
  137. package/dist/_shared/input-CZxP5Xgj.js.map +1 -0
  138. package/dist/_shared/input-DQahu2sm.js +182 -0
  139. package/dist/_shared/input-DQahu2sm.js.map +1 -0
  140. package/dist/_shared/item-Cu5JbZyZ.js +224 -0
  141. package/dist/_shared/item-Cu5JbZyZ.js.map +1 -0
  142. package/dist/_shared/item-Cx_7QZ2o.cjs +2 -0
  143. package/dist/_shared/item-Cx_7QZ2o.cjs.map +1 -0
  144. package/dist/_shared/mentions-CS3rIhze.js +493 -0
  145. package/dist/_shared/mentions-CS3rIhze.js.map +1 -0
  146. package/dist/_shared/mentions-D7gnP3Nf.cjs +2 -0
  147. package/dist/_shared/mentions-D7gnP3Nf.cjs.map +1 -0
  148. package/dist/_shared/metadata-CRsVWE8Y.cjs +2 -0
  149. package/dist/_shared/metadata-CRsVWE8Y.cjs.map +1 -0
  150. package/dist/_shared/metadata-CfG0FdFZ.js +236 -0
  151. package/dist/_shared/metadata-CfG0FdFZ.js.map +1 -0
  152. package/dist/_shared/money-display-Bd0rkjc9.js +198 -0
  153. package/dist/_shared/money-display-Bd0rkjc9.js.map +1 -0
  154. package/dist/_shared/money-display-DSFft9Mi.cjs +2 -0
  155. package/dist/_shared/money-display-DSFft9Mi.cjs.map +1 -0
  156. package/dist/_shared/navigation-Do9k5Xh1.js +420 -0
  157. package/dist/_shared/navigation-Do9k5Xh1.js.map +1 -0
  158. package/dist/_shared/navigation-QAAD3HJd.cjs +2 -0
  159. package/dist/_shared/navigation-QAAD3HJd.cjs.map +1 -0
  160. package/dist/_shared/overlays-B8AH8fNv.js +633 -0
  161. package/dist/_shared/overlays-B8AH8fNv.js.map +1 -0
  162. package/dist/_shared/overlays-DOcoRy8k.cjs +2 -0
  163. package/dist/_shared/overlays-DOcoRy8k.cjs.map +1 -0
  164. package/dist/_shared/page-BPCeKX9X.js +263 -0
  165. package/dist/_shared/page-BPCeKX9X.js.map +1 -0
  166. package/dist/_shared/page-DMM32sxi.cjs +2 -0
  167. package/dist/_shared/page-DMM32sxi.cjs.map +1 -0
  168. package/dist/_shared/popover-B1f_EUQS.cjs +2 -0
  169. package/dist/_shared/popover-B1f_EUQS.cjs.map +1 -0
  170. package/dist/_shared/popover-CgRGcFk9.js +83 -0
  171. package/dist/_shared/popover-CgRGcFk9.js.map +1 -0
  172. package/dist/_shared/popover-menu-BEKIT3LR.cjs +2 -0
  173. package/dist/_shared/popover-menu-BEKIT3LR.cjs.map +1 -0
  174. package/dist/_shared/popover-menu-BHdHLEVL.js +95 -0
  175. package/dist/_shared/popover-menu-BHdHLEVL.js.map +1 -0
  176. package/dist/_shared/rich-text-editor-0uoIoYXU.js +608 -0
  177. package/dist/_shared/rich-text-editor-0uoIoYXU.js.map +1 -0
  178. package/dist/_shared/rich-text-editor-wTiARGuB.cjs +2 -0
  179. package/dist/_shared/rich-text-editor-wTiARGuB.cjs.map +1 -0
  180. package/dist/_shared/scroll-area-Bo17wtZD.cjs +2 -0
  181. package/dist/_shared/scroll-area-Bo17wtZD.cjs.map +1 -0
  182. package/dist/_shared/scroll-area-Cj-hmB5D.js +41 -0
  183. package/dist/_shared/scroll-area-Cj-hmB5D.js.map +1 -0
  184. package/dist/_shared/select-07RRiTWc.js +85 -0
  185. package/dist/_shared/select-07RRiTWc.js.map +1 -0
  186. package/dist/_shared/select-BfiU7a4n.cjs +2 -0
  187. package/dist/_shared/select-BfiU7a4n.cjs.map +1 -0
  188. package/dist/_shared/separator-CN9zAJfs.cjs +2 -0
  189. package/dist/_shared/separator-CN9zAJfs.cjs.map +1 -0
  190. package/dist/_shared/separator-DR0uUMKa.js +16 -0
  191. package/dist/_shared/separator-DR0uUMKa.js.map +1 -0
  192. package/dist/_shared/sheet-B5FoGJAZ.cjs +2 -0
  193. package/dist/_shared/sheet-B5FoGJAZ.cjs.map +1 -0
  194. package/dist/_shared/sheet-cUI8cypP.js +100 -0
  195. package/dist/_shared/sheet-cUI8cypP.js.map +1 -0
  196. package/dist/_shared/sidebar-Bq7yKLrG.cjs +2 -0
  197. package/dist/_shared/sidebar-Bq7yKLrG.cjs.map +1 -0
  198. package/dist/_shared/sidebar-Da20tCUc.cjs +2 -0
  199. package/dist/_shared/sidebar-Da20tCUc.cjs.map +1 -0
  200. package/dist/_shared/sidebar-Q6TYE8Ux.js +371 -0
  201. package/dist/_shared/sidebar-Q6TYE8Ux.js.map +1 -0
  202. package/dist/_shared/sidebar-WmnQ55YY.js +537 -0
  203. package/dist/_shared/sidebar-WmnQ55YY.js.map +1 -0
  204. package/dist/_shared/skeleton-B3HWEc6G.js +14 -0
  205. package/dist/_shared/skeleton-B3HWEc6G.js.map +1 -0
  206. package/dist/_shared/skeleton-Cz_l8-fc.cjs +2 -0
  207. package/dist/_shared/skeleton-Cz_l8-fc.cjs.map +1 -0
  208. package/dist/_shared/slot-BgnZtKR5.js +18 -0
  209. package/dist/_shared/slot-BgnZtKR5.js.map +1 -0
  210. package/dist/_shared/slot-Dac1ipUC.cjs +2 -0
  211. package/dist/_shared/slot-Dac1ipUC.cjs.map +1 -0
  212. package/dist/_shared/smart-card-Bm_VxYUG.cjs +2 -0
  213. package/dist/_shared/smart-card-Bm_VxYUG.cjs.map +1 -0
  214. package/dist/_shared/smart-card-MT6JjkoI.js +360 -0
  215. package/dist/_shared/smart-card-MT6JjkoI.js.map +1 -0
  216. package/dist/_shared/spinner-BQjxJ_Kx.js +67 -0
  217. package/dist/_shared/spinner-BQjxJ_Kx.js.map +1 -0
  218. package/dist/_shared/spinner-Dvaa6GUm.cjs +2 -0
  219. package/dist/_shared/spinner-Dvaa6GUm.cjs.map +1 -0
  220. package/dist/_shared/switch-C0yyhsXZ.js +51 -0
  221. package/dist/_shared/switch-C0yyhsXZ.js.map +1 -0
  222. package/dist/_shared/switch-DozkSQNn.cjs +2 -0
  223. package/dist/_shared/switch-DozkSQNn.cjs.map +1 -0
  224. package/dist/_shared/textarea-Cgl-FPwu.js +119 -0
  225. package/dist/_shared/textarea-Cgl-FPwu.js.map +1 -0
  226. package/dist/_shared/textarea-D8wC0XlZ.cjs +2 -0
  227. package/dist/_shared/textarea-D8wC0XlZ.cjs.map +1 -0
  228. package/dist/_shared/tooltip-Cws4BiPT.js +49 -0
  229. package/dist/_shared/tooltip-Cws4BiPT.js.map +1 -0
  230. package/dist/_shared/tooltip-DyUi-Tac.cjs +2 -0
  231. package/dist/_shared/tooltip-DyUi-Tac.cjs.map +1 -0
  232. package/dist/_shared/typography-BW7iZBx7.cjs +2 -0
  233. package/dist/_shared/typography-BW7iZBx7.cjs.map +1 -0
  234. package/dist/_shared/typography-a3hydyvI.js +102 -0
  235. package/dist/_shared/typography-a3hydyvI.js.map +1 -0
  236. package/dist/components/base/accordion/index.cjs +1 -1
  237. package/dist/components/base/accordion/index.js +1 -1
  238. package/dist/components/base/badge/index.cjs +1 -1
  239. package/dist/components/base/badge/index.js +1 -1
  240. package/dist/components/base/buttons/index.cjs +1 -1
  241. package/dist/components/base/buttons/index.js +2 -2
  242. package/dist/components/base/cards/index.cjs +1 -1
  243. package/dist/components/base/cards/index.js +1 -1
  244. package/dist/components/base/combobox/index.cjs +1 -1
  245. package/dist/components/base/combobox/index.js +1 -1
  246. package/dist/components/base/command/index.cjs +1 -1
  247. package/dist/components/base/command/index.js +2 -2
  248. package/dist/components/base/copyable/index.cjs +1 -1
  249. package/dist/components/base/copyable/index.js +1 -1
  250. package/dist/components/base/currency/index.cjs +1 -1
  251. package/dist/components/base/currency/index.js +1 -1
  252. package/dist/components/base/date-pickers/index.cjs +1 -1
  253. package/dist/components/base/date-pickers/index.js +2 -2
  254. package/dist/components/base/display/index.cjs +1 -1
  255. package/dist/components/base/display/index.js +12 -11
  256. package/dist/components/base/display/metadata/index.cjs +1 -0
  257. package/dist/components/base/display/metadata/index.js +2 -0
  258. package/dist/components/base/event-calendar/index.cjs +1 -1
  259. package/dist/components/base/event-calendar/index.cjs.map +1 -1
  260. package/dist/components/base/event-calendar/index.js +4 -4
  261. package/dist/components/base/forms/index.cjs +1 -1
  262. package/dist/components/base/forms/index.js +6 -6
  263. package/dist/components/base/item/index.cjs +1 -1
  264. package/dist/components/base/item/index.js +1 -1
  265. package/dist/components/base/map/index.cjs +1 -1
  266. package/dist/components/base/map/index.js +3 -3
  267. package/dist/components/base/navigation/index.cjs +1 -1
  268. package/dist/components/base/navigation/index.js +4 -4
  269. package/dist/components/base/popover/index.cjs +1 -1
  270. package/dist/components/base/popover/index.js +1 -1
  271. package/dist/components/base/popover-menu/index.cjs +1 -1
  272. package/dist/components/base/popover-menu/index.js +1 -1
  273. package/dist/components/base/sheet/index.cjs +1 -1
  274. package/dist/components/base/sheet/index.js +1 -1
  275. package/dist/components/base/sidebar/index.cjs +1 -1
  276. package/dist/components/base/sidebar/index.js +1 -1
  277. package/dist/components/base/spinner/index.cjs +1 -1
  278. package/dist/components/base/spinner/index.js +1 -1
  279. package/dist/components/base/table/index.cjs +1 -1
  280. package/dist/components/base/table/index.js +7 -7
  281. package/dist/components/composed/admin/index.cjs +1 -1
  282. package/dist/components/composed/admin/index.cjs.map +1 -1
  283. package/dist/components/composed/admin/index.js +12 -12
  284. package/dist/components/composed/ai/index.cjs +1 -1
  285. package/dist/components/composed/ai/index.js +9 -9
  286. package/dist/components/composed/analytics/index.cjs +1 -1
  287. package/dist/components/composed/analytics/index.cjs.map +1 -1
  288. package/dist/components/composed/analytics/index.js +4 -4
  289. package/dist/components/composed/cards/index.cjs +1 -1
  290. package/dist/components/composed/cards/index.cjs.map +1 -1
  291. package/dist/components/composed/cards/index.js +8 -8
  292. package/dist/components/composed/commerce/index.cjs +1 -1
  293. package/dist/components/composed/commerce/index.cjs.map +1 -1
  294. package/dist/components/composed/commerce/index.js +9 -9
  295. package/dist/components/composed/dark-surfaces/index.cjs +1 -1
  296. package/dist/components/composed/dark-surfaces/index.cjs.map +1 -1
  297. package/dist/components/composed/dark-surfaces/index.js +6 -6
  298. package/dist/components/composed/data-display/index.cjs +1 -1
  299. package/dist/components/composed/data-display/index.cjs.map +1 -1
  300. package/dist/components/composed/data-display/index.js +7 -7
  301. package/dist/components/composed/navigation/index.cjs +1 -1
  302. package/dist/components/composed/navigation/index.js +4 -4
  303. package/dist/components/composed/onboarding/index.cjs +1 -1
  304. package/dist/components/composed/onboarding/index.js +2 -2
  305. package/dist/components/composed/timelines/index.cjs +1 -1
  306. package/dist/components/composed/timelines/index.js +2 -2
  307. package/dist/components/features/activities/index.cjs +1 -1
  308. package/dist/components/features/activities/index.js +4 -4
  309. package/dist/components/features/ai-chat/index.cjs +1 -1
  310. package/dist/components/features/ai-chat/index.cjs.map +1 -1
  311. package/dist/components/features/ai-chat/index.js +6 -6
  312. package/dist/components/features/card/index.cjs +1 -1
  313. package/dist/components/features/card/index.js +3 -3
  314. package/dist/components/features/comments/index.cjs +1 -1
  315. package/dist/components/features/comments/index.js +2 -2
  316. package/dist/components/features/event-log/index.cjs +1 -1
  317. package/dist/components/features/event-log/index.js +3 -3
  318. package/dist/components/features/filters/index.cjs +1 -1
  319. package/dist/components/features/filters/index.js +9 -9
  320. package/dist/components/features/global-search/index.cjs +1 -1
  321. package/dist/components/features/global-search/index.js +2 -2
  322. package/dist/components/features/kanban/index.cjs +1 -1
  323. package/dist/components/features/kanban/index.js +1 -1
  324. package/dist/components/features/mentions/index.cjs +1 -1
  325. package/dist/components/features/mentions/index.js +1 -1
  326. package/dist/components/features/overlays/index.cjs +1 -1
  327. package/dist/components/features/overlays/index.js +1 -1
  328. package/dist/components/features/rich-text-editor/index.cjs +1 -1
  329. package/dist/components/features/rich-text-editor/index.js +1 -1
  330. package/dist/components/features/suggestions/index.cjs +1 -1
  331. package/dist/components/features/suggestions/index.js +1 -1
  332. package/dist/components/features/sync/index.cjs +1 -1
  333. package/dist/components/features/sync/index.js +2 -2
  334. package/dist/components/layout/containers/index.cjs +1 -1
  335. package/dist/components/layout/containers/index.js +2 -2
  336. package/dist/components/layout/header/index.cjs +1 -1
  337. package/dist/components/layout/header/index.js +1 -1
  338. package/dist/components/layout/hooks/index.cjs +1 -1
  339. package/dist/components/layout/hooks/index.js +1 -1
  340. package/dist/components/layout/index.cjs +1 -1
  341. package/dist/components/layout/index.js +6 -6
  342. package/dist/components/layout/page/index.cjs +1 -1
  343. package/dist/components/layout/page/index.js +1 -1
  344. package/dist/components/layout/sidebar/index.cjs +1 -1
  345. package/dist/components/layout/sidebar/index.js +2 -2
  346. package/dist/components/typography/index.cjs +1 -1
  347. package/dist/components/typography/index.js +3 -2
  348. package/dist/showcase/assets/AreaChart-CJ57G5Ub.js +6 -0
  349. package/dist/showcase/assets/CSPContext-BA7DfnCI.js +1 -0
  350. package/dist/showcase/assets/CompositeItem-PwzgE4va.js +1 -0
  351. package/dist/showcase/assets/CompositeRoot-Du4CMlK7.js +1 -0
  352. package/dist/showcase/assets/DialogTrigger-FkENgwo6.js +1 -0
  353. package/dist/showcase/assets/FormContext-ChygLayp.js +1 -0
  354. package/dist/showcase/assets/PreviewLayout-z6vpJJGt.js +1 -0
  355. package/dist/showcase/assets/RadioGroup-CcDmbxOw.js +1 -0
  356. package/dist/showcase/assets/Separator-Dk4eN76U.js +1 -0
  357. package/dist/showcase/assets/ToolbarRootContext-D_KAA5hZ.js +1 -0
  358. package/dist/showcase/assets/accordion-dQszzfmw.js +172 -0
  359. package/dist/showcase/assets/accordion-variants-Dp4wxic-.js +1 -0
  360. package/dist/showcase/assets/action-menu-CBi2Eiy0.js +1 -0
  361. package/dist/showcase/assets/activities-DoXsgP4G.js +501 -0
  362. package/dist/showcase/assets/activities-feed-card-xz5FtkOm.js +1 -0
  363. package/dist/showcase/assets/admin-CxklUqAG.js +80 -0
  364. package/dist/showcase/assets/ai-artifact-DkhUdEbM.js +2 -0
  365. package/dist/showcase/assets/ai-chat-B6PuqkEu.js +568 -0
  366. package/dist/showcase/assets/ai-elements-D_rpj_ds.js +379 -0
  367. package/dist/showcase/assets/ai-new-CUPrAbOK.js +167 -0
  368. package/dist/showcase/assets/ai-tool-call-CEr-dGVx.js +1 -0
  369. package/dist/showcase/assets/ai-zxF_msJF.js +41 -0
  370. package/dist/showcase/assets/alert-771BE3Ny.js +59 -0
  371. package/dist/showcase/assets/alert-CG42DAlX.js +1 -0
  372. package/dist/showcase/assets/api-key-list-D6jUN7Fq.js +73 -0
  373. package/dist/showcase/assets/arrow-down-CUoXUyN1.js +1 -0
  374. package/dist/showcase/assets/arrow-left-Cdq69X6h.js +1 -0
  375. package/dist/showcase/assets/arrow-right-i25q9L2H.js +1 -0
  376. package/dist/showcase/assets/arrow-up-pnezegnF.js +1 -0
  377. package/dist/showcase/assets/arrow-up-right-CK3XnMah.js +1 -0
  378. package/dist/showcase/assets/avatar-LPmQqZQv.js +1 -0
  379. package/dist/showcase/assets/avatar-ZVFIQouy.js +57 -0
  380. package/dist/showcase/assets/badge-DK4bsgZC.js +28 -0
  381. package/dist/showcase/assets/badge-check-Cw5gkVcG.js +1 -0
  382. package/dist/showcase/assets/bell-BvJELoaV.js +1 -0
  383. package/dist/showcase/assets/bot-DRj6sdSR.js +1 -0
  384. package/dist/showcase/assets/box-BNND3M2m.js +1 -0
  385. package/dist/showcase/assets/brain-Cy3o-12l.js +1 -0
  386. package/dist/showcase/assets/brand-DvipEpFn.js +40 -0
  387. package/dist/showcase/assets/breadcrumb-B-LNuOyv.js +1 -0
  388. package/dist/showcase/assets/breadcrumb-Lzpc0yo4.js +52 -0
  389. package/dist/showcase/assets/breadcrumbs-DD6msKFZ.js +1 -0
  390. package/dist/showcase/assets/briefcase-LcAwoEmu.js +1 -0
  391. package/dist/showcase/assets/button-CuwcGzk1.js +44 -0
  392. package/dist/showcase/assets/button-group-CAImjDrl.js +1 -0
  393. package/dist/showcase/assets/buttons-DTjNHCMl.js +259 -0
  394. package/dist/showcase/assets/calendar-B1zW0q6I.js +1 -0
  395. package/dist/showcase/assets/calendar-Dlv72ytt.js +1 -0
  396. package/dist/showcase/assets/calendar-ls2A08Pn.js +16 -0
  397. package/dist/showcase/assets/card-BhtkM1BT.js +1 -0
  398. package/dist/showcase/assets/cards-BRpRXzGk.js +328 -0
  399. package/dist/showcase/assets/chart-column-BpQkEi1H.js +1 -0
  400. package/dist/showcase/assets/chevron-down-DyObdfSb.js +1 -0
  401. package/dist/showcase/assets/chevron-left-T7dHNxYM.js +1 -0
  402. package/dist/showcase/assets/chevron-right-D_EcqHpT.js +1 -0
  403. package/dist/showcase/assets/chevron-up-B38ivdGO.js +1 -0
  404. package/dist/showcase/assets/chevrons-up-down-SdRARzoq.js +1 -0
  405. package/dist/showcase/assets/circle-BrCPAmDA.js +1 -0
  406. package/dist/showcase/assets/circle-alert-DdhzLPY_.js +1 -0
  407. package/dist/showcase/assets/circle-check-DlA6zidQ.js +1 -0
  408. package/dist/showcase/assets/circle-check-big-DFGJANQF.js +1 -0
  409. package/dist/showcase/assets/circle-dot-BKmnVUqM.js +1 -0
  410. package/dist/showcase/assets/circle-question-mark-BNREvgVC.js +1 -0
  411. package/dist/showcase/assets/circle-x-C45QjHEs.js +1 -0
  412. package/dist/showcase/assets/clock-D1nKQzQo.js +1 -0
  413. package/dist/showcase/assets/code-xml-B8N3GRSu.js +1 -0
  414. package/dist/showcase/assets/collapsible-4TfcWyNs.js +1 -0
  415. package/dist/showcase/assets/collapsible-CKbZtvTj.js +27 -0
  416. package/dist/showcase/assets/combobox-DTdGPaU0.js +622 -0
  417. package/dist/showcase/assets/command-DymTXwL1.js +1 -0
  418. package/dist/showcase/assets/command-ksVIHQKJ.js +45 -0
  419. package/dist/showcase/assets/comment-composer-DC9oS1Yy.js +1 -0
  420. package/dist/showcase/assets/comment-item-CAmKnJa7.js +1 -0
  421. package/dist/showcase/assets/comments-Benk-2mV.js +349 -0
  422. package/dist/showcase/assets/commerce-Qz-mq8mQ.js +78 -0
  423. package/dist/showcase/assets/commerce-extras-CQRc3Bna.js +179 -0
  424. package/dist/showcase/assets/composite-DBDXLPyz.js +1 -0
  425. package/dist/showcase/assets/contact-card-DkL2nI3r.js +65 -0
  426. package/dist/showcase/assets/content-container-mRm6oJEa.js +1 -0
  427. package/dist/showcase/assets/copyable-DmLlmwzy.js +96 -0
  428. package/dist/showcase/assets/course-card-CJJoeZj9.js +113 -0
  429. package/dist/showcase/assets/cpu-BXJnF2Xy.js +1 -0
  430. package/dist/showcase/assets/credit-card-BQK3KKb2.js +1 -0
  431. package/dist/showcase/assets/currency-DBPUh8ee.js +149 -0
  432. package/dist/showcase/assets/dark-surfaces-LpPuIeYy.js +90 -0
  433. package/dist/showcase/assets/database-BZerpzGE.js +1 -0
  434. package/dist/showcase/assets/date-block-iiHUpbNX.js +1 -0
  435. package/dist/showcase/assets/date-picker-BQeBGL7T.js +1 -0
  436. package/dist/showcase/assets/date-pickers-CKcUEMMF.js +110 -0
  437. package/dist/showcase/assets/dense-info-DATmxRU8.js +106 -0
  438. package/dist/showcase/assets/dialog-Bqu5KDYH.js +1 -0
  439. package/dist/showcase/assets/display-Bj7uPXD4.js +392 -0
  440. package/dist/showcase/assets/dist-QK7JxeYv.js +1 -0
  441. package/dist/showcase/assets/dollar-sign-DFZs6vfz.js +1 -0
  442. package/dist/showcase/assets/download-5oGw_WbW.js +1 -0
  443. package/dist/showcase/assets/dropdown-menu-1CJgYn0S.js +1 -0
  444. package/dist/showcase/assets/dropzone-Co1uhsDn.js +1 -0
  445. package/dist/showcase/assets/ellipsis-cKRcvuyL.js +1 -0
  446. package/dist/showcase/assets/ellipsis-vertical-B1RErEkj.js +1 -0
  447. package/dist/showcase/assets/empty-Y2-4nCBr.js +1 -0
  448. package/dist/showcase/assets/empty-item-USa6xcUv.js +49 -0
  449. package/dist/showcase/assets/empty-state-DfhZ9AT5.js +188 -0
  450. package/dist/showcase/assets/enhanced-activities-DmAPVUSu.js +359 -0
  451. package/dist/showcase/assets/esm-BeGQ_ZTM.js +2 -0
  452. package/dist/showcase/assets/event-calendar-D-jGrrZS.js +138 -0
  453. package/dist/showcase/assets/event-log-tA_i4eR9.js +326 -0
  454. package/dist/showcase/assets/example-6phCHGsN.js +1 -0
  455. package/dist/showcase/assets/external-link-BuVHkCy0.js +1 -0
  456. package/dist/showcase/assets/eye-DC5HfGm6.js +1 -0
  457. package/dist/showcase/assets/feature-announcement-DwvxLytd.js +34 -0
  458. package/dist/showcase/assets/file-D-xM4vLy.js +1 -0
  459. package/dist/showcase/assets/file-text-tmG5vNbr.js +1 -0
  460. package/dist/showcase/assets/filters-CrGRXmq6.js +78 -0
  461. package/dist/showcase/assets/flag-CWrEtkY5.js +1 -0
  462. package/dist/showcase/assets/folder-open-Br-x1pjP.js +1 -0
  463. package/dist/showcase/assets/form-sizing-Bb5hiM45.js +1 -0
  464. package/dist/showcase/assets/format-D_ETCyg4.js +1 -0
  465. package/dist/showcase/assets/forms-B_MkQ3rm.js +790 -0
  466. package/dist/showcase/assets/generic-CdmsyXV3.js +1 -0
  467. package/dist/showcase/assets/getPseudoElementBounds-CZnCbCFP.js +1 -0
  468. package/dist/showcase/assets/gift-NkuklfU2.js +1 -0
  469. package/dist/showcase/assets/giftcard-cards-BAvevZ0i.js +85 -0
  470. package/dist/showcase/assets/git-branch-B_CBqPeO.js +1 -0
  471. package/dist/showcase/assets/global-search-D9teAbPe.js +90 -0
  472. package/dist/showcase/assets/globe-gzw45GU2.js +1 -0
  473. package/dist/showcase/assets/gradient-card-Xk2r7R5H.js +58 -0
  474. package/dist/showcase/assets/header-notifications-_aZCpE5A.js +1 -0
  475. package/dist/showcase/assets/heart-CEMKbRaZ.js +1 -0
  476. package/dist/showcase/assets/house-BlGXAcMH.js +1 -0
  477. package/dist/showcase/assets/icon-badge-z6N9reH_.js +1 -0
  478. package/dist/showcase/assets/image-B8mzmVBr.js +1 -0
  479. package/dist/showcase/assets/inbox-qdSnP4UV.js +1 -0
  480. package/dist/showcase/assets/index-B4ubXfly.js +10 -0
  481. package/dist/showcase/assets/inertValue-D5Q8cLku.js +1 -0
  482. package/dist/showcase/assets/info-DBvvNjc_.js +1 -0
  483. package/dist/showcase/assets/inline-stat-Bm1zVT8D.js +1 -0
  484. package/dist/showcase/assets/input-CBQR0aeX.js +1 -0
  485. package/dist/showcase/assets/input-OrUzpI55.js +1 -0
  486. package/dist/showcase/assets/input-group-DhqOen2N.js +47 -0
  487. package/dist/showcase/assets/input-group-l8xa5nUq.js +1 -0
  488. package/dist/showcase/assets/inputs-DbiJ0qy2.js +49 -0
  489. package/dist/showcase/assets/invoice-header-C6youIbL.js +36 -0
  490. package/dist/showcase/assets/invoice-items-g6dgryF-.js +36 -0
  491. package/dist/showcase/assets/invoice-mini-0iWhufpt.js +14 -0
  492. package/dist/showcase/assets/invoice-table-Bvdh3rRq.js +30 -0
  493. package/dist/showcase/assets/isSameDay-BpZEtJe8.js +1 -0
  494. package/dist/showcase/assets/isToday-F0CS28oK.js +1 -0
  495. package/dist/showcase/assets/italic-CJOEwjdc.js +1 -0
  496. package/dist/showcase/assets/item-BiMm1PPB.js +1 -0
  497. package/dist/showcase/assets/item-CN0cwdj_.js +1 -0
  498. package/dist/showcase/assets/item-DNqEUYLT.js +117 -0
  499. package/dist/showcase/assets/kanban-DxePEUiQ.js +175 -0
  500. package/dist/showcase/assets/label-Dx4WO-fg.js +1 -0
  501. package/dist/showcase/assets/layout-containers-DDl8rG8S.js +96 -0
  502. package/dist/showcase/assets/layout-header-Bu6IcDWu.js +170 -0
  503. package/dist/showcase/assets/layout-page-D-88Qnoy.js +122 -0
  504. package/dist/showcase/assets/layout-sidebar-Ctft10pk.js +224 -0
  505. package/dist/showcase/assets/layout-users-DtbZduBG.js +104 -0
  506. package/dist/showcase/assets/lib-D9BoOYUd.js +1 -0
  507. package/dist/showcase/assets/lock-CHurDI0n.js +1 -0
  508. package/dist/showcase/assets/mail-DZ1o1RLW.js +1 -0
  509. package/dist/showcase/assets/map-C8xiyT9X.js +124 -0
  510. package/dist/showcase/assets/map-pin-CAKaoYod.js +1 -0
  511. package/dist/showcase/assets/menus-C6mnp636.js +89 -0
  512. package/dist/showcase/assets/message-square-Zo5J_zU1.js +1 -0
  513. package/dist/showcase/assets/metadata-list-W83-UMhc.js +278 -0
  514. package/dist/showcase/assets/metric-BSvxidIX.js +1 -0
  515. package/dist/showcase/assets/metric-grid-Dtqx_3Lg.js +1 -0
  516. package/dist/showcase/assets/metric-trend-chip-mtvcJ_M9.js +1 -0
  517. package/dist/showcase/assets/metrics-analytics-bar-DQbyss7i.js +44 -0
  518. package/dist/showcase/assets/metrics-analytics-cards-CEBu5Uw0.js +77 -0
  519. package/dist/showcase/assets/metrics-comparison-Bs-R6v4y.js +76 -0
  520. package/dist/showcase/assets/metrics-heatmap-BKHWH8sM.js +27 -0
  521. package/dist/showcase/assets/metrics-inline-badge-BxVn0Y2p.js +17 -0
  522. package/dist/showcase/assets/metrics-kpi-row-DtACYEds.js +31 -0
  523. package/dist/showcase/assets/metrics-micro-grid-BkwUGOUR.js +42 -0
  524. package/dist/showcase/assets/metrics-overview-BAtrlzsI.js +192 -0
  525. package/dist/showcase/assets/metrics-stat-cards-iCRCNyHY.js +54 -0
  526. package/dist/showcase/assets/minus-C6eBW-2t.js +1 -0
  527. package/dist/showcase/assets/money-display-DjGRJ16l.js +1 -0
  528. package/dist/showcase/assets/month-year-picker-DTDebPqf.js +1 -0
  529. package/dist/showcase/assets/navigation-BrG8Chig.js +86 -0
  530. package/dist/showcase/assets/navigation-CfXQJbyM.js +230 -0
  531. package/dist/showcase/assets/navigation-extras-D_gzLlZ5.js +43 -0
  532. package/dist/showcase/assets/onboarding-checklist-1EerUwAo.js +119 -0
  533. package/dist/showcase/assets/overlays-2AB9-S1Z.js +88 -0
  534. package/dist/showcase/assets/overlays-CYt9o3Xq.js +393 -0
  535. package/dist/showcase/assets/package-BJMP-Fcr.js +1 -0
  536. package/dist/showcase/assets/page-action-button-BZxJ0X1j.js +1 -0
  537. package/dist/showcase/assets/page-header-B_rqHJhe.js +1 -0
  538. package/dist/showcase/assets/pagination-BHiQvvka.js +1 -0
  539. package/dist/showcase/assets/pagination-Dq0GruQd.js +42 -0
  540. package/dist/showcase/assets/paperclip-BMYKrUQo.js +1 -0
  541. package/dist/showcase/assets/pencil-BJ3VS_FO.js +1 -0
  542. package/dist/showcase/assets/phone-CsRIyvep.js +1 -0
  543. package/dist/showcase/assets/plus-D2JuXYLg.js +1 -0
  544. package/dist/showcase/assets/popover-DNT9755r.js +1 -0
  545. package/dist/showcase/assets/popover-KvGgcPNg.js +1 -0
  546. package/dist/showcase/assets/popover-menu-CJx30R65.js +1 -0
  547. package/dist/showcase/assets/progress-B7WuXcJR.js +1 -0
  548. package/dist/showcase/assets/progress-CweCSAUv.js +18 -0
  549. package/dist/showcase/assets/props-table-uDY4eIzt.js +1 -0
  550. package/dist/showcase/assets/quote-DAyyfzQd.js +1 -0
  551. package/dist/showcase/assets/receipt-C0mMZGbF.js +1 -0
  552. package/dist/showcase/assets/refresh-cw-X06JbXb-.js +1 -0
  553. package/dist/showcase/assets/resolveValueLabel-Bks7UDko.js +1 -0
  554. package/dist/showcase/assets/rich-text-editor-QJsb-qIe.js +124 -0
  555. package/dist/showcase/assets/rich-text-editor-h07VBNI9.js +141 -0
  556. package/dist/showcase/assets/rotate-ccw-D84bdX_x.js +1 -0
  557. package/dist/showcase/assets/scroll-area-0rT06pXZ.js +1 -0
  558. package/dist/showcase/assets/scroll-area-YXwdzGpN.js +32 -0
  559. package/dist/showcase/assets/select-BoWQDtUf.js +1 -0
  560. package/dist/showcase/assets/send-DJsk3cr1.js +1 -0
  561. package/dist/showcase/assets/separator-CLSnRcJa.js +28 -0
  562. package/dist/showcase/assets/separator-DWv-twD-.js +1 -0
  563. package/dist/showcase/assets/settings-Cb2MsAmN.js +1 -0
  564. package/dist/showcase/assets/sheet-Dn1-MYus.js +1 -0
  565. package/dist/showcase/assets/shield-DwLjF5ch.js +1 -0
  566. package/dist/showcase/assets/shield-alert-D8i6gzMK.js +1 -0
  567. package/dist/showcase/assets/shield-check-D5YRSBIz.js +1 -0
  568. package/dist/showcase/assets/shopping-bag-BqlAP4vn.js +1 -0
  569. package/dist/showcase/assets/sidebar.context-BAp_pBEB.js +1 -0
  570. package/dist/showcase/assets/skeleton-CeNPp4hr.js +1 -0
  571. package/dist/showcase/assets/skeleton-QPsnM_NR.js +29 -0
  572. package/dist/showcase/assets/smart-card-BisUbLPt.js +1 -0
  573. package/dist/showcase/assets/sonner-B7GzbBK2.js +22 -0
  574. package/dist/showcase/assets/sortable.esm-BDcEOHT7.js +5 -0
  575. package/dist/showcase/assets/sparkles-CF9P5Tqh.js +1 -0
  576. package/dist/showcase/assets/spinner-BeamEyJd.js +49 -0
  577. package/dist/showcase/assets/spinner-DoYBfalR.js +1 -0
  578. package/dist/showcase/assets/spinner-UsLsOYzn.js +30 -0
  579. package/dist/showcase/assets/square-pen-BGTVdnt1.js +1 -0
  580. package/dist/showcase/assets/stacked-avatars-BWfVX1Ov.js +1 -0
  581. package/dist/showcase/assets/star-NsPNO9gR.js +1 -0
  582. package/dist/showcase/assets/startOfDay-zJBpxLuW.js +1 -0
  583. package/dist/showcase/assets/styles-DA7a7hVy.js +1 -0
  584. package/dist/showcase/assets/switch-C62S4U2o.js +1 -0
  585. package/dist/showcase/assets/switch-CYQcinJZ.js +1 -0
  586. package/dist/showcase/assets/table-w4IABkpa.js +1 -0
  587. package/dist/showcase/assets/table-xgB63UrY.js +390 -0
  588. package/dist/showcase/assets/tabs-BFTEaTXj.js +19 -0
  589. package/dist/showcase/assets/tabs-oMJn9Ujq.js +1 -0
  590. package/dist/showcase/assets/text-button-BgcutPuu.js +1 -0
  591. package/dist/showcase/assets/text-link-CS9thOWL.js +1 -0
  592. package/dist/showcase/assets/textarea-BOBx4EM6.js +1 -0
  593. package/dist/showcase/assets/textarea-CTzYZZqa.js +1 -0
  594. package/dist/showcase/assets/timelines-CK07mEBK.js +186 -0
  595. package/dist/showcase/assets/toggle-group-CSPdPT6G.js +1 -0
  596. package/dist/showcase/assets/toggles-DDSdl-gA.js +71 -0
  597. package/dist/showcase/assets/toggles-group-Y2BdKEFB.js +32 -0
  598. package/dist/showcase/assets/trash-2-C-FAptQP.js +1 -0
  599. package/dist/showcase/assets/trending-up-BmLhdF_w.js +1 -0
  600. package/dist/showcase/assets/truck-pZdUS_as.js +1 -0
  601. package/dist/showcase/assets/typography-CnBH2z7f.js +214 -0
  602. package/dist/showcase/assets/ui-badge-Cl6INRO5.js +28 -0
  603. package/dist/showcase/assets/ui-card-B5P-thNu.js +30 -0
  604. package/dist/showcase/assets/ui-table-B32RILKk.js +42 -0
  605. package/dist/showcase/assets/upload-tray-mu6bR2ZE.js +138 -0
  606. package/dist/showcase/assets/useAnchoredPopupScrollLock-CzDaXxmM.js +1 -0
  607. package/dist/showcase/assets/useCollapsiblePanel-B0DZvDFu.js +1 -0
  608. package/dist/showcase/assets/useCompositeItem-BVIVLT9X.js +1 -0
  609. package/dist/showcase/assets/useCompositeListItem-JEMeTFPx.js +1 -0
  610. package/dist/showcase/assets/useControlled-ZjqBfPCn.js +1 -0
  611. package/dist/showcase/assets/useLabelableId-D8CZq8Bm.js +1 -0
  612. package/dist/showcase/assets/useOpenInteractionType-CopGCf3q.js +1 -0
  613. package/dist/showcase/assets/useRender-zuKv6JQF.js +1 -0
  614. package/dist/showcase/assets/useRole-08KeyiD3.js +1 -0
  615. package/dist/showcase/assets/useTriggerFocusGuards-DEuz5CGe.js +1 -0
  616. package/dist/showcase/assets/useValueChanged-BxFi_qyj.js +1 -0
  617. package/dist/showcase/assets/user-Bgc2t2_e.js +1 -0
  618. package/dist/showcase/assets/user-plus-F_TfagnP.js +1 -0
  619. package/dist/showcase/assets/users-B7G4yTCR.js +1 -0
  620. package/dist/showcase/assets/vendor-profile-BTQmsKM6.js +37 -0
  621. package/dist/showcase/assets/wrench-BdzICmjR.js +1 -0
  622. package/dist/showcase/assets/x-B156Wr-5.js +1 -0
  623. package/dist/showcase/assets/zap-B3iByjNV.js +1 -0
  624. package/dist/showcase/index.html +1 -1
  625. package/package.json +254 -19
  626. package/dist/_shared/accordion-7rwpgJ1k.cjs +0 -2
  627. package/dist/_shared/accordion-7rwpgJ1k.cjs.map +0 -1
  628. package/dist/_shared/accordion-DcduCEIo.js +0 -130
  629. package/dist/_shared/accordion-DcduCEIo.js.map +0 -1
  630. package/dist/_shared/action-menu-D0u-q0q-.cjs +0 -2
  631. package/dist/_shared/action-menu-D0u-q0q-.cjs.map +0 -1
  632. package/dist/_shared/action-menu-DUBXdReV.js +0 -96
  633. package/dist/_shared/action-menu-DUBXdReV.js.map +0 -1
  634. package/dist/_shared/ai-artifact-C3R0god0.cjs +0 -3
  635. package/dist/_shared/ai-artifact-C3R0god0.cjs.map +0 -1
  636. package/dist/_shared/ai-artifact-DMjQv_Si.js +0 -1068
  637. package/dist/_shared/ai-artifact-DMjQv_Si.js.map +0 -1
  638. package/dist/_shared/alert-B2cuJGAA.cjs +0 -2
  639. package/dist/_shared/alert-B2cuJGAA.cjs.map +0 -1
  640. package/dist/_shared/alert-BKUmOI2e.js +0 -48
  641. package/dist/_shared/alert-BKUmOI2e.js.map +0 -1
  642. package/dist/_shared/avatar-BcYcRORH.cjs +0 -2
  643. package/dist/_shared/avatar-BcYcRORH.cjs.map +0 -1
  644. package/dist/_shared/avatar-CNzG6jSZ.js +0 -52
  645. package/dist/_shared/avatar-CNzG6jSZ.js.map +0 -1
  646. package/dist/_shared/badge-BbUN6W7E.js +0 -108
  647. package/dist/_shared/badge-BbUN6W7E.js.map +0 -1
  648. package/dist/_shared/badge-BjtDcU1M.cjs +0 -2
  649. package/dist/_shared/badge-BjtDcU1M.cjs.map +0 -1
  650. package/dist/_shared/breadcrumbs-DctwTld5.js +0 -111
  651. package/dist/_shared/breadcrumbs-DctwTld5.js.map +0 -1
  652. package/dist/_shared/breadcrumbs-m0-gCdNj.cjs +0 -2
  653. package/dist/_shared/breadcrumbs-m0-gCdNj.cjs.map +0 -1
  654. package/dist/_shared/button-BCABTFLE.js +0 -46
  655. package/dist/_shared/button-BCABTFLE.js.map +0 -1
  656. package/dist/_shared/button-Ck2qS42n.js +0 -176
  657. package/dist/_shared/button-Ck2qS42n.js.map +0 -1
  658. package/dist/_shared/button-DjJ-mDI1.cjs +0 -2
  659. package/dist/_shared/button-DjJ-mDI1.cjs.map +0 -1
  660. package/dist/_shared/button-DjacsNTg.cjs +0 -2
  661. package/dist/_shared/button-DjacsNTg.cjs.map +0 -1
  662. package/dist/_shared/buttons-BVnjQ-uE.js +0 -143
  663. package/dist/_shared/buttons-BVnjQ-uE.js.map +0 -1
  664. package/dist/_shared/buttons-BdY6igTr.cjs +0 -2
  665. package/dist/_shared/buttons-BdY6igTr.cjs.map +0 -1
  666. package/dist/_shared/card-radio-group--GP1xrz_.js +0 -158
  667. package/dist/_shared/card-radio-group--GP1xrz_.js.map +0 -1
  668. package/dist/_shared/card-radio-group-DnQsWozr.cjs +0 -2
  669. package/dist/_shared/card-radio-group-DnQsWozr.cjs.map +0 -1
  670. package/dist/_shared/combobox-DBrRE1Dr.cjs +0 -2
  671. package/dist/_shared/combobox-DBrRE1Dr.cjs.map +0 -1
  672. package/dist/_shared/combobox-DYztEJaw.js +0 -746
  673. package/dist/_shared/combobox-DYztEJaw.js.map +0 -1
  674. package/dist/_shared/command-COvgXQ8r.cjs +0 -2
  675. package/dist/_shared/command-COvgXQ8r.cjs.map +0 -1
  676. package/dist/_shared/command-CvZ6Emb8.js +0 -39
  677. package/dist/_shared/command-CvZ6Emb8.js.map +0 -1
  678. package/dist/_shared/command-DTFQIUVG.cjs +0 -2
  679. package/dist/_shared/command-DTFQIUVG.cjs.map +0 -1
  680. package/dist/_shared/command-Sq8XbHbA.js +0 -123
  681. package/dist/_shared/command-Sq8XbHbA.js.map +0 -1
  682. package/dist/_shared/comments-BOFU1GYY.js +0 -945
  683. package/dist/_shared/comments-BOFU1GYY.js.map +0 -1
  684. package/dist/_shared/comments-BbTYFzx6.cjs +0 -2
  685. package/dist/_shared/comments-BbTYFzx6.cjs.map +0 -1
  686. package/dist/_shared/containers-BthqdOhA.cjs +0 -2
  687. package/dist/_shared/containers-BthqdOhA.cjs.map +0 -1
  688. package/dist/_shared/containers-CD2xs1nk.js +0 -19
  689. package/dist/_shared/containers-CD2xs1nk.js.map +0 -1
  690. package/dist/_shared/content-container-CFfYbWoa.js +0 -33
  691. package/dist/_shared/content-container-CFfYbWoa.js.map +0 -1
  692. package/dist/_shared/content-container-CReiVugL.cjs +0 -2
  693. package/dist/_shared/content-container-CReiVugL.cjs.map +0 -1
  694. package/dist/_shared/copyable-CweQ72QI.cjs +0 -2
  695. package/dist/_shared/copyable-CweQ72QI.cjs.map +0 -1
  696. package/dist/_shared/copyable-JgsTp6ev.js +0 -38
  697. package/dist/_shared/copyable-JgsTp6ev.js.map +0 -1
  698. package/dist/_shared/date-picker-DI4b-SeE.cjs +0 -2
  699. package/dist/_shared/date-picker-DI4b-SeE.cjs.map +0 -1
  700. package/dist/_shared/date-picker-DTazvODY.js +0 -1352
  701. package/dist/_shared/date-picker-DTazvODY.js.map +0 -1
  702. package/dist/_shared/date-pickers-CLzuzmuc.cjs +0 -2
  703. package/dist/_shared/date-pickers-CLzuzmuc.cjs.map +0 -1
  704. package/dist/_shared/date-pickers-CWPxP3zy.js +0 -330
  705. package/dist/_shared/date-pickers-CWPxP3zy.js.map +0 -1
  706. package/dist/_shared/dialog-2MJmaj_d.js +0 -101
  707. package/dist/_shared/dialog-2MJmaj_d.js.map +0 -1
  708. package/dist/_shared/dialog-KKD0i1T8.cjs +0 -2
  709. package/dist/_shared/dialog-KKD0i1T8.cjs.map +0 -1
  710. package/dist/_shared/display-BCy1Ti7T.cjs +0 -8
  711. package/dist/_shared/display-BCy1Ti7T.cjs.map +0 -1
  712. package/dist/_shared/display-DUpkE2aS.js +0 -1462
  713. package/dist/_shared/display-DUpkE2aS.js.map +0 -1
  714. package/dist/_shared/dropdown-menu-BebBffUH.cjs +0 -2
  715. package/dist/_shared/dropdown-menu-BebBffUH.cjs.map +0 -1
  716. package/dist/_shared/dropdown-menu-xdGEynC8.js +0 -147
  717. package/dist/_shared/dropdown-menu-xdGEynC8.js.map +0 -1
  718. package/dist/_shared/form-field-rOj3cm6C.js +0 -319
  719. package/dist/_shared/form-field-rOj3cm6C.js.map +0 -1
  720. package/dist/_shared/form-field-rcyIIHjR.cjs +0 -2
  721. package/dist/_shared/form-field-rcyIIHjR.cjs.map +0 -1
  722. package/dist/_shared/form-sizing--bs_xPe2.cjs +0 -2
  723. package/dist/_shared/form-sizing--bs_xPe2.cjs.map +0 -1
  724. package/dist/_shared/form-sizing-CkKcs5fi.js +0 -21
  725. package/dist/_shared/form-sizing-CkKcs5fi.js.map +0 -1
  726. package/dist/_shared/format-BlVEsPyT.js +0 -48
  727. package/dist/_shared/format-BlVEsPyT.js.map +0 -1
  728. package/dist/_shared/format-DYVtSA2I.cjs +0 -2
  729. package/dist/_shared/format-DYVtSA2I.cjs.map +0 -1
  730. package/dist/_shared/forms-BAVsxxRk.js +0 -3374
  731. package/dist/_shared/forms-BAVsxxRk.js.map +0 -1
  732. package/dist/_shared/forms-DaZ3LsYc.cjs +0 -2
  733. package/dist/_shared/forms-DaZ3LsYc.cjs.map +0 -1
  734. package/dist/_shared/header-BtTMsQ5P.cjs +0 -2
  735. package/dist/_shared/header-BtTMsQ5P.cjs.map +0 -1
  736. package/dist/_shared/header-DpW4UWV6.js +0 -369
  737. package/dist/_shared/header-DpW4UWV6.js.map +0 -1
  738. package/dist/_shared/hooks-Bsm917yh.cjs +0 -2
  739. package/dist/_shared/hooks-Bsm917yh.cjs.map +0 -1
  740. package/dist/_shared/hooks-CX-SICd4.js +0 -118
  741. package/dist/_shared/hooks-CX-SICd4.js.map +0 -1
  742. package/dist/_shared/icon-badge-DGKpbo9_.cjs +0 -2
  743. package/dist/_shared/icon-badge-DGKpbo9_.cjs.map +0 -1
  744. package/dist/_shared/icon-badge-DoClA_9q.js +0 -52
  745. package/dist/_shared/icon-badge-DoClA_9q.js.map +0 -1
  746. package/dist/_shared/input-BXt-YtVs.cjs +0 -2
  747. package/dist/_shared/input-BXt-YtVs.cjs.map +0 -1
  748. package/dist/_shared/input-Bx4LeLhn.js +0 -17
  749. package/dist/_shared/input-Bx4LeLhn.js.map +0 -1
  750. package/dist/_shared/input-ChZGIhtS.cjs +0 -2
  751. package/dist/_shared/input-ChZGIhtS.cjs.map +0 -1
  752. package/dist/_shared/input-Cwv1-5jt.js +0 -182
  753. package/dist/_shared/input-Cwv1-5jt.js.map +0 -1
  754. package/dist/_shared/item-BmTYKzEb.js +0 -224
  755. package/dist/_shared/item-BmTYKzEb.js.map +0 -1
  756. package/dist/_shared/item-BtR-bz96.cjs +0 -2
  757. package/dist/_shared/item-BtR-bz96.cjs.map +0 -1
  758. package/dist/_shared/mentions-DVCjaO_z.cjs +0 -2
  759. package/dist/_shared/mentions-DVCjaO_z.cjs.map +0 -1
  760. package/dist/_shared/mentions-DzG8mX5H.js +0 -493
  761. package/dist/_shared/mentions-DzG8mX5H.js.map +0 -1
  762. package/dist/_shared/money-display-B5oxCs_0.cjs +0 -2
  763. package/dist/_shared/money-display-B5oxCs_0.cjs.map +0 -1
  764. package/dist/_shared/money-display-C0wI02ou.js +0 -198
  765. package/dist/_shared/money-display-C0wI02ou.js.map +0 -1
  766. package/dist/_shared/navigation-BA2nsTgU.cjs +0 -2
  767. package/dist/_shared/navigation-BA2nsTgU.cjs.map +0 -1
  768. package/dist/_shared/navigation-DHyaf-RZ.js +0 -420
  769. package/dist/_shared/navigation-DHyaf-RZ.js.map +0 -1
  770. package/dist/_shared/overlays-Kl6Gp6WR.js +0 -633
  771. package/dist/_shared/overlays-Kl6Gp6WR.js.map +0 -1
  772. package/dist/_shared/overlays-W6j-Pe1L.cjs +0 -2
  773. package/dist/_shared/overlays-W6j-Pe1L.cjs.map +0 -1
  774. package/dist/_shared/page-DROZhtWT.js +0 -263
  775. package/dist/_shared/page-DROZhtWT.js.map +0 -1
  776. package/dist/_shared/page-lh9Rcx_d.cjs +0 -2
  777. package/dist/_shared/page-lh9Rcx_d.cjs.map +0 -1
  778. package/dist/_shared/popover-BTEwjJZS.cjs +0 -2
  779. package/dist/_shared/popover-BTEwjJZS.cjs.map +0 -1
  780. package/dist/_shared/popover-CF9VWt-l.js +0 -83
  781. package/dist/_shared/popover-CF9VWt-l.js.map +0 -1
  782. package/dist/_shared/popover-menu-BYesl29w.js +0 -95
  783. package/dist/_shared/popover-menu-BYesl29w.js.map +0 -1
  784. package/dist/_shared/popover-menu-DF9sWz61.cjs +0 -2
  785. package/dist/_shared/popover-menu-DF9sWz61.cjs.map +0 -1
  786. package/dist/_shared/rich-text-editor-UZghkgsh.cjs +0 -2
  787. package/dist/_shared/rich-text-editor-UZghkgsh.cjs.map +0 -1
  788. package/dist/_shared/rich-text-editor-fUeuK-rY.js +0 -608
  789. package/dist/_shared/rich-text-editor-fUeuK-rY.js.map +0 -1
  790. package/dist/_shared/scroll-area-XJLcCczs.js +0 -41
  791. package/dist/_shared/scroll-area-XJLcCczs.js.map +0 -1
  792. package/dist/_shared/scroll-area-y8ZJoS97.cjs +0 -2
  793. package/dist/_shared/scroll-area-y8ZJoS97.cjs.map +0 -1
  794. package/dist/_shared/select-D8MYF4f7.js +0 -85
  795. package/dist/_shared/select-D8MYF4f7.js.map +0 -1
  796. package/dist/_shared/select-DxAiUfpM.cjs +0 -2
  797. package/dist/_shared/select-DxAiUfpM.cjs.map +0 -1
  798. package/dist/_shared/separator-BazqiQ9s.js +0 -16
  799. package/dist/_shared/separator-BazqiQ9s.js.map +0 -1
  800. package/dist/_shared/separator-DSkXMOXq.cjs +0 -2
  801. package/dist/_shared/separator-DSkXMOXq.cjs.map +0 -1
  802. package/dist/_shared/sheet-7iHOs-IU.js +0 -100
  803. package/dist/_shared/sheet-7iHOs-IU.js.map +0 -1
  804. package/dist/_shared/sheet-qKtoyxgi.cjs +0 -2
  805. package/dist/_shared/sheet-qKtoyxgi.cjs.map +0 -1
  806. package/dist/_shared/sidebar-CaTUJ3t-.js +0 -537
  807. package/dist/_shared/sidebar-CaTUJ3t-.js.map +0 -1
  808. package/dist/_shared/sidebar-DVjfsm-f.cjs +0 -2
  809. package/dist/_shared/sidebar-DVjfsm-f.cjs.map +0 -1
  810. package/dist/_shared/sidebar-aV5DVAVg.js +0 -371
  811. package/dist/_shared/sidebar-aV5DVAVg.js.map +0 -1
  812. package/dist/_shared/sidebar-mL0jSJ8u.cjs +0 -2
  813. package/dist/_shared/sidebar-mL0jSJ8u.cjs.map +0 -1
  814. package/dist/_shared/skeleton-Bwv_j9jJ.cjs +0 -2
  815. package/dist/_shared/skeleton-Bwv_j9jJ.cjs.map +0 -1
  816. package/dist/_shared/skeleton-DyKa-Ed-.js +0 -14
  817. package/dist/_shared/skeleton-DyKa-Ed-.js.map +0 -1
  818. package/dist/_shared/slot-ClIPTht1.cjs +0 -2
  819. package/dist/_shared/slot-ClIPTht1.cjs.map +0 -1
  820. package/dist/_shared/slot-CrS_VEVl.js +0 -18
  821. package/dist/_shared/slot-CrS_VEVl.js.map +0 -1
  822. package/dist/_shared/smart-card-Ddsjvf7r.cjs +0 -2
  823. package/dist/_shared/smart-card-Ddsjvf7r.cjs.map +0 -1
  824. package/dist/_shared/smart-card-hJ01usWt.js +0 -360
  825. package/dist/_shared/smart-card-hJ01usWt.js.map +0 -1
  826. package/dist/_shared/spinner-D-pcMBt1.js +0 -67
  827. package/dist/_shared/spinner-D-pcMBt1.js.map +0 -1
  828. package/dist/_shared/spinner-zbmhn0vE.cjs +0 -2
  829. package/dist/_shared/spinner-zbmhn0vE.cjs.map +0 -1
  830. package/dist/_shared/switch-C5J37LMI.cjs +0 -2
  831. package/dist/_shared/switch-C5J37LMI.cjs.map +0 -1
  832. package/dist/_shared/switch-ClGgHcEb.js +0 -51
  833. package/dist/_shared/switch-ClGgHcEb.js.map +0 -1
  834. package/dist/_shared/textarea-DeISZfHw.js +0 -119
  835. package/dist/_shared/textarea-DeISZfHw.js.map +0 -1
  836. package/dist/_shared/textarea-iR9txrty.cjs +0 -2
  837. package/dist/_shared/textarea-iR9txrty.cjs.map +0 -1
  838. package/dist/_shared/tooltip-CEqxHWxQ.js +0 -49
  839. package/dist/_shared/tooltip-CEqxHWxQ.js.map +0 -1
  840. package/dist/_shared/tooltip-DPv0LGr9.cjs +0 -2
  841. package/dist/_shared/tooltip-DPv0LGr9.cjs.map +0 -1
  842. package/dist/_shared/typography-BtPQBvSm.js +0 -135
  843. package/dist/_shared/typography-BtPQBvSm.js.map +0 -1
  844. package/dist/_shared/typography-DClleVWi.cjs +0 -2
  845. package/dist/_shared/typography-DClleVWi.cjs.map +0 -1
  846. package/dist/showcase/assets/AreaChart-D-RqNtqG.js +0 -6
  847. package/dist/showcase/assets/CSPContext-t69BXyB7.js +0 -1
  848. package/dist/showcase/assets/CompositeItem-DHNLgEeV.js +0 -1
  849. package/dist/showcase/assets/CompositeRoot-xq_0ZFev.js +0 -1
  850. package/dist/showcase/assets/DialogTrigger-Cl7n_3xX.js +0 -1
  851. package/dist/showcase/assets/FormContext-CXdwDz7F.js +0 -1
  852. package/dist/showcase/assets/PreviewLayout-BHemtKEf.js +0 -1
  853. package/dist/showcase/assets/RadioGroup-DXAt4VZN.js +0 -1
  854. package/dist/showcase/assets/Separator-C9vXwWmZ.js +0 -1
  855. package/dist/showcase/assets/ToolbarRootContext-iF4ctnIz.js +0 -1
  856. package/dist/showcase/assets/accordion-DzkNgNcB.js +0 -172
  857. package/dist/showcase/assets/accordion-variants-DP5-oxLe.js +0 -1
  858. package/dist/showcase/assets/action-menu-CyA2e9TF.js +0 -1
  859. package/dist/showcase/assets/activities-Dt-dO5ew.js +0 -501
  860. package/dist/showcase/assets/activities-feed-card-DZdFekXl.js +0 -1
  861. package/dist/showcase/assets/admin-C2SeJmE7.js +0 -80
  862. package/dist/showcase/assets/ai-Cwo0h_Xn.js +0 -41
  863. package/dist/showcase/assets/ai-artifact-3UJofyU5.js +0 -2
  864. package/dist/showcase/assets/ai-chat-CrFtG_Vg.js +0 -568
  865. package/dist/showcase/assets/ai-elements-iJ15Y7pS.js +0 -379
  866. package/dist/showcase/assets/ai-new-DuznZydd.js +0 -167
  867. package/dist/showcase/assets/ai-tool-call-CTcGGAQU.js +0 -1
  868. package/dist/showcase/assets/alert-CUGGckOX.js +0 -1
  869. package/dist/showcase/assets/alert-tWped3Sw.js +0 -59
  870. package/dist/showcase/assets/api-key-list-Q5LAqzMn.js +0 -73
  871. package/dist/showcase/assets/arrow-down-CfwCPcHL.js +0 -1
  872. package/dist/showcase/assets/arrow-left-BKx9qNX6.js +0 -1
  873. package/dist/showcase/assets/arrow-right-DlEpbqEk.js +0 -1
  874. package/dist/showcase/assets/arrow-up-BYQ4F9L1.js +0 -1
  875. package/dist/showcase/assets/arrow-up-right-C8r6vYfE.js +0 -1
  876. package/dist/showcase/assets/avatar-BuZ3zTbH.js +0 -57
  877. package/dist/showcase/assets/avatar-DR2mqPpY.js +0 -1
  878. package/dist/showcase/assets/badge-D1HLfP93.js +0 -28
  879. package/dist/showcase/assets/badge-check-oP2z_95u.js +0 -1
  880. package/dist/showcase/assets/bell-BTX2D-ES.js +0 -1
  881. package/dist/showcase/assets/bot-CKh5XgUG.js +0 -1
  882. package/dist/showcase/assets/box-F1uaZ6iw.js +0 -1
  883. package/dist/showcase/assets/brain-dD_ppLUa.js +0 -1
  884. package/dist/showcase/assets/brand-zisZOFKf.js +0 -40
  885. package/dist/showcase/assets/breadcrumb-C7vv0L8K.js +0 -52
  886. package/dist/showcase/assets/breadcrumb-fay5sLba.js +0 -1
  887. package/dist/showcase/assets/breadcrumbs-DklRXepp.js +0 -1
  888. package/dist/showcase/assets/briefcase-D9M4aNmi.js +0 -1
  889. package/dist/showcase/assets/button-DbhXfR1N.js +0 -44
  890. package/dist/showcase/assets/button-group-BpdhyMif.js +0 -1
  891. package/dist/showcase/assets/buttons-XexbmUtN.js +0 -259
  892. package/dist/showcase/assets/calendar-BADJgjpI.js +0 -16
  893. package/dist/showcase/assets/calendar-Djh3xLVx.js +0 -1
  894. package/dist/showcase/assets/calendar-dWZ2-0gU.js +0 -1
  895. package/dist/showcase/assets/card-BUSAPPkx.js +0 -1
  896. package/dist/showcase/assets/cards-DHBPe01w.js +0 -328
  897. package/dist/showcase/assets/chart-column-6l5wIZ0h.js +0 -1
  898. package/dist/showcase/assets/chevron-down-at2vrt1V.js +0 -1
  899. package/dist/showcase/assets/chevron-left-DIs3WYNO.js +0 -1
  900. package/dist/showcase/assets/chevron-right-BNy0Or0x.js +0 -1
  901. package/dist/showcase/assets/chevron-up-CX7619BJ.js +0 -1
  902. package/dist/showcase/assets/chevrons-up-down-Be6eciau.js +0 -1
  903. package/dist/showcase/assets/circle-C0Yd1DDS.js +0 -1
  904. package/dist/showcase/assets/circle-alert-DfQp_X3_.js +0 -1
  905. package/dist/showcase/assets/circle-check-BkqQe1tv.js +0 -1
  906. package/dist/showcase/assets/circle-check-big-BXxHUhuc.js +0 -1
  907. package/dist/showcase/assets/circle-dot-HeRgxZxN.js +0 -1
  908. package/dist/showcase/assets/circle-question-mark-BgS4fb6N.js +0 -1
  909. package/dist/showcase/assets/circle-x-CMzwDsaf.js +0 -1
  910. package/dist/showcase/assets/clock-ynCzs_rR.js +0 -1
  911. package/dist/showcase/assets/code-xml-B8aVstrJ.js +0 -1
  912. package/dist/showcase/assets/collapsible-C8CKdiRn.js +0 -27
  913. package/dist/showcase/assets/collapsible-u43HxDHB.js +0 -1
  914. package/dist/showcase/assets/combobox-D-6ff0VG.js +0 -622
  915. package/dist/showcase/assets/command-BsHudlBe.js +0 -1
  916. package/dist/showcase/assets/command-DZqmBolX.js +0 -45
  917. package/dist/showcase/assets/comment-composer-OnxlkC5y.js +0 -1
  918. package/dist/showcase/assets/comment-item-DmZ1AJ2Y.js +0 -1
  919. package/dist/showcase/assets/comments-BjIVksjE.js +0 -349
  920. package/dist/showcase/assets/commerce-3T1GxvrA.js +0 -78
  921. package/dist/showcase/assets/commerce-extras-CYv_uRQR.js +0 -179
  922. package/dist/showcase/assets/composite-mol0-2zZ.js +0 -1
  923. package/dist/showcase/assets/contact-card-CWAANJqn.js +0 -65
  924. package/dist/showcase/assets/content-container-D3Phw6h8.js +0 -1
  925. package/dist/showcase/assets/copyable-BdzUH3U3.js +0 -96
  926. package/dist/showcase/assets/course-card-Cb6Y2vJ6.js +0 -113
  927. package/dist/showcase/assets/cpu-CRrekbGQ.js +0 -1
  928. package/dist/showcase/assets/credit-card--5vg7bQy.js +0 -1
  929. package/dist/showcase/assets/currency-VuqnKj_Y.js +0 -149
  930. package/dist/showcase/assets/dark-surfaces-DEyBimFz.js +0 -90
  931. package/dist/showcase/assets/database-Bnvw0wVV.js +0 -1
  932. package/dist/showcase/assets/date-block-IhoCVl_d.js +0 -1
  933. package/dist/showcase/assets/date-picker-DnJpsnaF.js +0 -1
  934. package/dist/showcase/assets/date-pickers-CEbieq-R.js +0 -110
  935. package/dist/showcase/assets/dense-info-B04QmrOd.js +0 -106
  936. package/dist/showcase/assets/dialog-DotEO3IO.js +0 -1
  937. package/dist/showcase/assets/display-hK7Dtm-B.js +0 -392
  938. package/dist/showcase/assets/dist-DQgGKvzA.js +0 -1
  939. package/dist/showcase/assets/dollar-sign-gJtl-XaL.js +0 -1
  940. package/dist/showcase/assets/download-CMrNgeil.js +0 -1
  941. package/dist/showcase/assets/dropdown-menu-Cqv6D7Sb.js +0 -1
  942. package/dist/showcase/assets/dropzone-v69fWHZJ.js +0 -1
  943. package/dist/showcase/assets/ellipsis-CgqPlt6Z.js +0 -1
  944. package/dist/showcase/assets/ellipsis-vertical-CiJqC0n2.js +0 -1
  945. package/dist/showcase/assets/empty-DYHzk-Gb.js +0 -1
  946. package/dist/showcase/assets/empty-item-CTwvC_3M.js +0 -49
  947. package/dist/showcase/assets/empty-state-eUgJ4h41.js +0 -188
  948. package/dist/showcase/assets/enhanced-activities-XU2u5gO6.js +0 -359
  949. package/dist/showcase/assets/esm-B7xAMXnv.js +0 -2
  950. package/dist/showcase/assets/event-calendar-D2rjpzq1.js +0 -138
  951. package/dist/showcase/assets/event-log-BxER62Ds.js +0 -326
  952. package/dist/showcase/assets/example-DPfw-R7_.js +0 -1
  953. package/dist/showcase/assets/external-link-DJNGkjZ0.js +0 -1
  954. package/dist/showcase/assets/eye-BQU3UqWi.js +0 -1
  955. package/dist/showcase/assets/feature-announcement-CjGQEODB.js +0 -34
  956. package/dist/showcase/assets/file-DBpbC8g-.js +0 -1
  957. package/dist/showcase/assets/file-text-DokBif5V.js +0 -1
  958. package/dist/showcase/assets/filters-DM2olMKy.js +0 -78
  959. package/dist/showcase/assets/flag-hAuZbHU1.js +0 -1
  960. package/dist/showcase/assets/folder-open-DqubQ0ts.js +0 -1
  961. package/dist/showcase/assets/form-sizing-CfbZF8Ja.js +0 -1
  962. package/dist/showcase/assets/format-gCABLair.js +0 -1
  963. package/dist/showcase/assets/forms-FsAT0C-I.js +0 -790
  964. package/dist/showcase/assets/generic-BUuo7j09.js +0 -1
  965. package/dist/showcase/assets/getPseudoElementBounds-l8uxcPNL.js +0 -1
  966. package/dist/showcase/assets/gift-CS7Tg3kD.js +0 -1
  967. package/dist/showcase/assets/giftcard-cards-h1ffLs9F.js +0 -85
  968. package/dist/showcase/assets/git-branch-D4-6vv6t.js +0 -1
  969. package/dist/showcase/assets/global-search-BUyhhsQv.js +0 -90
  970. package/dist/showcase/assets/globe-CqLYhUfl.js +0 -1
  971. package/dist/showcase/assets/gradient-card-Bwr9OLIL.js +0 -58
  972. package/dist/showcase/assets/header-notifications-BWla1yhM.js +0 -1
  973. package/dist/showcase/assets/heart-DfZtXfIP.js +0 -1
  974. package/dist/showcase/assets/house-DhIReDt8.js +0 -1
  975. package/dist/showcase/assets/icon-badge-BgRFYZEc.js +0 -1
  976. package/dist/showcase/assets/image-D_eNEZWQ.js +0 -1
  977. package/dist/showcase/assets/inbox-5sFkO7gC.js +0 -1
  978. package/dist/showcase/assets/index-B-Z7p0So.js +0 -10
  979. package/dist/showcase/assets/inertValue-NU_Amr-x.js +0 -1
  980. package/dist/showcase/assets/info-DyB6KH3Z.js +0 -1
  981. package/dist/showcase/assets/inline-stat-D2aaM1Vt.js +0 -1
  982. package/dist/showcase/assets/input-BS64kyoq.js +0 -1
  983. package/dist/showcase/assets/input-DWLyniGt.js +0 -1
  984. package/dist/showcase/assets/input-group-BS8j5Eek.js +0 -47
  985. package/dist/showcase/assets/input-group-B_E_3EGS.js +0 -1
  986. package/dist/showcase/assets/inputs-DOQ2foig.js +0 -49
  987. package/dist/showcase/assets/invoice-header-C2-uQE_s.js +0 -36
  988. package/dist/showcase/assets/invoice-items-BUunRJqA.js +0 -36
  989. package/dist/showcase/assets/invoice-mini-BrLMrzN6.js +0 -14
  990. package/dist/showcase/assets/invoice-table-CaB9Z8jI.js +0 -30
  991. package/dist/showcase/assets/isSameDay-rwvIyLOL.js +0 -1
  992. package/dist/showcase/assets/isToday-CIAzBrb5.js +0 -1
  993. package/dist/showcase/assets/italic-B02a4PdD.js +0 -1
  994. package/dist/showcase/assets/item-C-0RObvI.js +0 -117
  995. package/dist/showcase/assets/item-CCu0Ufaq.js +0 -1
  996. package/dist/showcase/assets/item-DF4m_56j.js +0 -1
  997. package/dist/showcase/assets/kanban-BgW23a7P.js +0 -175
  998. package/dist/showcase/assets/label-MdV7pglj.js +0 -1
  999. package/dist/showcase/assets/layout-containers-nKVReEJB.js +0 -96
  1000. package/dist/showcase/assets/layout-header-CKyxHHPC.js +0 -170
  1001. package/dist/showcase/assets/layout-page-ClD2yMnK.js +0 -122
  1002. package/dist/showcase/assets/layout-sidebar-jdQnYDiT.js +0 -224
  1003. package/dist/showcase/assets/layout-users-Cv849xnU.js +0 -104
  1004. package/dist/showcase/assets/lib-BHW4JERQ.js +0 -1
  1005. package/dist/showcase/assets/lock-B8bfl9sZ.js +0 -1
  1006. package/dist/showcase/assets/mail-DmOBTX4I.js +0 -1
  1007. package/dist/showcase/assets/map-ButgRl8f.js +0 -124
  1008. package/dist/showcase/assets/map-pin-o3egisLq.js +0 -1
  1009. package/dist/showcase/assets/menus-DdXgYKVA.js +0 -89
  1010. package/dist/showcase/assets/message-square-Bl6P4TA0.js +0 -1
  1011. package/dist/showcase/assets/metadata-list-aXo96h_U.js +0 -278
  1012. package/dist/showcase/assets/metric-BLHKuZtE.js +0 -1
  1013. package/dist/showcase/assets/metric-grid-6Dpj5eV3.js +0 -1
  1014. package/dist/showcase/assets/metric-trend-chip-m389ipmG.js +0 -1
  1015. package/dist/showcase/assets/metrics-analytics-bar-B-1IUlHf.js +0 -44
  1016. package/dist/showcase/assets/metrics-analytics-cards-B8tvK_RB.js +0 -77
  1017. package/dist/showcase/assets/metrics-comparison-DKJ7Js3F.js +0 -76
  1018. package/dist/showcase/assets/metrics-heatmap-BlRnJoI0.js +0 -27
  1019. package/dist/showcase/assets/metrics-inline-badge-COI7f64X.js +0 -17
  1020. package/dist/showcase/assets/metrics-kpi-row-LRfmKhsy.js +0 -31
  1021. package/dist/showcase/assets/metrics-micro-grid-DmqIQVVR.js +0 -42
  1022. package/dist/showcase/assets/metrics-overview-Dbf5RM2k.js +0 -192
  1023. package/dist/showcase/assets/metrics-stat-cards-D5oevQvv.js +0 -54
  1024. package/dist/showcase/assets/minus-D-jmUi0G.js +0 -1
  1025. package/dist/showcase/assets/money-display-C__61373.js +0 -1
  1026. package/dist/showcase/assets/month-year-picker-BfBQePUY.js +0 -1
  1027. package/dist/showcase/assets/navigation-DUAe-sQV.js +0 -86
  1028. package/dist/showcase/assets/navigation-extras-itSAf6QT.js +0 -43
  1029. package/dist/showcase/assets/navigation-fAOvwIlP.js +0 -230
  1030. package/dist/showcase/assets/onboarding-checklist-1gmzk3_J.js +0 -119
  1031. package/dist/showcase/assets/overlays-BMTBOIEI.js +0 -88
  1032. package/dist/showcase/assets/overlays-Lu16yJWM.js +0 -393
  1033. package/dist/showcase/assets/package-BIa1hPVQ.js +0 -1
  1034. package/dist/showcase/assets/page-action-button-C5NiQHnP.js +0 -1
  1035. package/dist/showcase/assets/page-header-Cwf9DuhD.js +0 -1
  1036. package/dist/showcase/assets/pagination-9iSNmdCx.js +0 -1
  1037. package/dist/showcase/assets/pagination-MjniF-7j.js +0 -42
  1038. package/dist/showcase/assets/paperclip-CaNLUOIA.js +0 -1
  1039. package/dist/showcase/assets/pencil-DTLGPoc_.js +0 -1
  1040. package/dist/showcase/assets/phone-XvU6LndA.js +0 -1
  1041. package/dist/showcase/assets/plus-BDSCn8ol.js +0 -1
  1042. package/dist/showcase/assets/popover-CvhuubS6.js +0 -1
  1043. package/dist/showcase/assets/popover-DUQqLZN2.js +0 -1
  1044. package/dist/showcase/assets/popover-menu-DVGBuFpL.js +0 -1
  1045. package/dist/showcase/assets/progress-BQopCRpV.js +0 -1
  1046. package/dist/showcase/assets/progress-CvSUR260.js +0 -18
  1047. package/dist/showcase/assets/props-table-BzUnIcv-.js +0 -1
  1048. package/dist/showcase/assets/quote-D55lkoXn.js +0 -1
  1049. package/dist/showcase/assets/receipt-D3ilhl9U.js +0 -1
  1050. package/dist/showcase/assets/refresh-cw-Csl2LQ4l.js +0 -1
  1051. package/dist/showcase/assets/resolveValueLabel-CM5i142y.js +0 -1
  1052. package/dist/showcase/assets/rich-text-editor-Bz7jWvPv.js +0 -124
  1053. package/dist/showcase/assets/rich-text-editor-DWKFpgNI.js +0 -141
  1054. package/dist/showcase/assets/rotate-ccw-BnkpK7eq.js +0 -1
  1055. package/dist/showcase/assets/scroll-area-BTVLd58j.js +0 -1
  1056. package/dist/showcase/assets/scroll-area-CgFEDepJ.js +0 -32
  1057. package/dist/showcase/assets/select-B7-tZDlG.js +0 -1
  1058. package/dist/showcase/assets/send-BhjEdZ06.js +0 -1
  1059. package/dist/showcase/assets/separator-CJayjKGP.js +0 -28
  1060. package/dist/showcase/assets/separator-CZ_sPWQj.js +0 -1
  1061. package/dist/showcase/assets/settings-Duj7gAZe.js +0 -1
  1062. package/dist/showcase/assets/sheet-BMabZ_Gj.js +0 -1
  1063. package/dist/showcase/assets/shield-C22sWOf4.js +0 -1
  1064. package/dist/showcase/assets/shield-alert-DgZ6UO46.js +0 -1
  1065. package/dist/showcase/assets/shield-check-jGSgmijm.js +0 -1
  1066. package/dist/showcase/assets/shopping-bag-Cd09Ga6D.js +0 -1
  1067. package/dist/showcase/assets/sidebar.context-CXTHS3vn.js +0 -1
  1068. package/dist/showcase/assets/skeleton-Dmp4eC1A.js +0 -1
  1069. package/dist/showcase/assets/skeleton-FLNbc7QP.js +0 -29
  1070. package/dist/showcase/assets/smart-card-50WN9sCI.js +0 -1
  1071. package/dist/showcase/assets/sonner-DR_DYpqb.js +0 -22
  1072. package/dist/showcase/assets/sortable.esm-C_l8_Iqt.js +0 -5
  1073. package/dist/showcase/assets/sparkles-C-fyahzv.js +0 -1
  1074. package/dist/showcase/assets/spinner-B8jgVQNj.js +0 -30
  1075. package/dist/showcase/assets/spinner-C4zPRpI0.js +0 -49
  1076. package/dist/showcase/assets/spinner-DFjHsQlR.js +0 -1
  1077. package/dist/showcase/assets/square-pen-Dp7lCfI3.js +0 -1
  1078. package/dist/showcase/assets/stacked-avatars-CTckbUiW.js +0 -1
  1079. package/dist/showcase/assets/star-l00ivfkD.js +0 -1
  1080. package/dist/showcase/assets/startOfDay-Xmododib.js +0 -1
  1081. package/dist/showcase/assets/styles-zuwR0q1z.js +0 -1
  1082. package/dist/showcase/assets/switch-D3LrIrTQ.js +0 -1
  1083. package/dist/showcase/assets/switch-ylXVyh_N.js +0 -1
  1084. package/dist/showcase/assets/table-Cn3-19zb.js +0 -1
  1085. package/dist/showcase/assets/table-ao3IcAnF.js +0 -390
  1086. package/dist/showcase/assets/tabs-CTLQKtiu.js +0 -19
  1087. package/dist/showcase/assets/tabs-lc1fX94A.js +0 -1
  1088. package/dist/showcase/assets/text-button-Fu8UY1A8.js +0 -1
  1089. package/dist/showcase/assets/text-link--EyGasJN.js +0 -1
  1090. package/dist/showcase/assets/textarea-BdhnlNrF.js +0 -1
  1091. package/dist/showcase/assets/textarea-D1kG3a9B.js +0 -1
  1092. package/dist/showcase/assets/timelines-DF3tNgyG.js +0 -186
  1093. package/dist/showcase/assets/toggle-group-CfxuWsv9.js +0 -1
  1094. package/dist/showcase/assets/toggles-CacdBPlV.js +0 -71
  1095. package/dist/showcase/assets/toggles-group-CRhgTGmL.js +0 -32
  1096. package/dist/showcase/assets/trash-2-B0_GprQM.js +0 -1
  1097. package/dist/showcase/assets/trending-up-B202l1b6.js +0 -1
  1098. package/dist/showcase/assets/truck-Bl1pNrHi.js +0 -1
  1099. package/dist/showcase/assets/typography-DEtOxBlR.js +0 -214
  1100. package/dist/showcase/assets/ui-badge-n4RA0J5b.js +0 -28
  1101. package/dist/showcase/assets/ui-card-Ck-kzrTh.js +0 -30
  1102. package/dist/showcase/assets/ui-table-gzOp82pf.js +0 -42
  1103. package/dist/showcase/assets/upload-tray-VvKdTZSi.js +0 -138
  1104. package/dist/showcase/assets/useAnchoredPopupScrollLock-Cu2ZwN7Z.js +0 -1
  1105. package/dist/showcase/assets/useCollapsiblePanel-C6_cdQ7B.js +0 -1
  1106. package/dist/showcase/assets/useCompositeItem-BfUPqXoj.js +0 -1
  1107. package/dist/showcase/assets/useCompositeListItem-Cf2lpKB8.js +0 -1
  1108. package/dist/showcase/assets/useControlled-C6q3nmcf.js +0 -1
  1109. package/dist/showcase/assets/useLabelableId-CfPT16c1.js +0 -1
  1110. package/dist/showcase/assets/useOpenInteractionType-CGeqRuuY.js +0 -1
  1111. package/dist/showcase/assets/useRender-CoUlh0uZ.js +0 -1
  1112. package/dist/showcase/assets/useRole-DSPUSyVX.js +0 -1
  1113. package/dist/showcase/assets/useTriggerFocusGuards-BwZ1HD24.js +0 -1
  1114. package/dist/showcase/assets/useValueChanged-Dej794I1.js +0 -1
  1115. package/dist/showcase/assets/user-3L762Mec.js +0 -1
  1116. package/dist/showcase/assets/user-plus-9WRYjS04.js +0 -1
  1117. package/dist/showcase/assets/users-CxKZ7gt8.js +0 -1
  1118. package/dist/showcase/assets/vendor-profile-BaCptdMF.js +0 -37
  1119. package/dist/showcase/assets/wrench-Duh91tnW.js +0 -1
  1120. package/dist/showcase/assets/x-t42iKYpL.js +0 -1
  1121. package/dist/showcase/assets/zap-D0z3Tv_L.js +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms-BusuTZZ2.js","names":[],"sources":["../../src/components/ui/checkbox.tsx","../../src/components/base/forms/fields/select.tsx","../../src/components/base/forms/fields/switch-card.tsx","../../src/components/base/forms/fields/toggle-field.tsx","../../src/components/base/forms/fields/tags-input.tsx","../../src/components/base/forms/fields/phone-input.tsx","../../src/components/base/forms/fields/percentage-input.tsx","../../src/components/ui/slider.tsx","../../src/components/base/forms/fields/slider.tsx","../../src/components/base/forms/fields/list-radio-group.tsx","../../src/components/base/forms/fields/rounding-mode-select.tsx","../../src/components/base/forms/fields/rich-select.tsx","../../src/components/base/forms/fields/dimensions-input.tsx","../../src/components/base/forms/fields/weight-input.tsx","../../src/components/base/forms/fields/coordinates-input.tsx","../../src/components/base/forms/fields/date-time-input.tsx","../../src/components/base/forms/fields/time-picker.tsx","../../src/hooks/use-files.ts","../../src/components/base/forms/fields/file-upload.tsx","../../src/components/base/forms/fields/image-upload.tsx","../../src/components/base/forms/fields/dropzone.tsx","../../src/components/base/forms/fields/avatar-upload.tsx","../../src/components/base/forms/fields/media-gallery.tsx","../../src/components/base/forms/fields/upload-progress-list.tsx","../../src/components/base/forms/fields/upload-tray.tsx","../../src/components/base/forms/fields/repeaters.strings.ts","../../src/components/base/forms/fields/repeater.tsx","../../src/components/base/forms/fields/key-value-editor.tsx","../../src/components/base/forms/fields/string-repeater.tsx","../../src/components/base/forms/fields/object-repeater.tsx","../../src/components/base/forms/fields/list.tsx","../../src/components/base/forms/fields/pill-radio-group.tsx","../../src/components/base/forms/fields/localized-string-field.tsx","../../src/components/base/forms/fields/localized-object-field.tsx","../../src/components/base/forms/fields/localized-string-repeater.tsx","../../src/components/base/forms/operation-password-form.tsx"],"sourcesContent":["\"use client\"\n\nimport { Checkbox as CheckboxPrimitive } from \"@base-ui/react/checkbox\"\nimport { CheckIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface CheckboxProps extends Omit<CheckboxPrimitive.Root.Props, 'onChange'> {\n\tonCheckedChange?: (checked: boolean | 'indeterminate') => void\n}\n\nfunction Checkbox({\n\tclassName,\n\tonCheckedChange,\n\t...props\n}: CheckboxProps) {\n\treturn (\n\t\t<CheckboxPrimitive.Root\n\t\t\tdata-slot=\"checkbox\"\n\t\t\tclassName={cn(\n\t\t\t\t\"peer size-4 shrink-0 rounded-[4px] border border-input shadow-xs transition-[color,box-shadow] outline-none\",\n\t\t\t\t\"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n\t\t\t\t\"aria-invalid:ring-destructive/20 aria-invalid:border-destructive\",\n\t\t\t\t\"data-[checked]:bg-primary data-[checked]:border-primary data-[checked]:text-primary-foreground\",\n\t\t\t\t\"data-[indeterminate]:bg-primary data-[indeterminate]:border-primary data-[indeterminate]:text-primary-foreground\",\n\t\t\t\t\"disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tonCheckedChange={onCheckedChange}\n\t\t\t{...props}\n\t\t>\n\t\t\t<CheckboxPrimitive.Indicator\n\t\t\t\tdata-slot=\"checkbox-indicator\"\n\t\t\t\tclassName=\"flex items-center justify-center text-current\"\n\t\t\t>\n\t\t\t\t<CheckIcon className=\"size-3.5\" />\n\t\t\t</CheckboxPrimitive.Indicator>\n\t\t</CheckboxPrimitive.Root>\n\t)\n}\n\nexport { Checkbox }\n","import { forwardRef, useMemo, useCallback, memo, type ReactNode } from 'react';\nimport * as baseui from '@/components/ui/select';\nimport { useFormsConfig, type FormControlSize } from '@/lib/ui-provider';\nimport { useStrings, type StringsProp } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\nimport { formControlSizeClasses, resolveFormControlSize } from '../form-sizing';\n\nexport interface SelectStrings {\n placeholder: string;\n}\n\nexport const defaultSelectStrings: SelectStrings = {\n placeholder: 'Select an option',\n};\n\nexport interface SelectOption {\n value: string;\n label: string;\n icon?: ReactNode;\n disabled?: boolean;\n}\n\nexport interface SelectProps {\n /** Available options */\n options: SelectOption[];\n\n /** Placeholder text — overrides `strings.placeholder` when provided. */\n placeholder?: string;\n\n /** String overrides (e.g. placeholder). */\n strings?: StringsProp<SelectStrings>;\n\n /** Allow clearing the selection */\n allowClear?: boolean;\n\n /** Error state for styling (passed from FormField) */\n invalid?: boolean;\n\n /** Visual size */\n size?: FormControlSize;\n\n /** Additional class names for the trigger */\n className?: string;\n\n /** Change handler - returns undefined when cleared */\n onChange?: (value: string | undefined) => void;\n\n /** Current value */\n value?: string | null;\n\n /** Default value */\n defaultValue?: string | null;\n\n /** Disabled state */\n disabled?: boolean;\n\n /** Field name */\n name?: string;\n\n /** Required state */\n required?: boolean;\n\n /** Open state (controlled) */\n open?: boolean;\n\n /** Default open state */\n defaultOpen?: boolean;\n\n /** Open change handler */\n onOpenChange?: (open: boolean) => void;\n}\n\n// Internal value for \"empty\" selection (base-ui doesn't allow empty string)\nconst EMPTY_VALUE = '__select_empty__';\n\n// Pure helper functions - moved outside component to avoid recreation\nconst toInternal = (val?: string | null): string | undefined => {\n if (val === '' || val === null) return EMPTY_VALUE;\n return val ?? undefined;\n};\n\nconst toExternal = (val: string): string | undefined => {\n if (val === EMPTY_VALUE) return undefined;\n return val;\n};\n\n/**\n * Simplified Select component for use with FormField wrapper.\n * Handles options, placeholder, and allowClear functionality.\n * Chrome (label, hint, error) handled by FormField.\n */\nexport const Select = memo(\n forwardRef<HTMLButtonElement, SelectProps>(\n (\n {\n options,\n placeholder,\n strings: stringsProp,\n allowClear = false,\n invalid,\n size: sizeProp,\n className,\n onChange,\n disabled,\n defaultOpen,\n open,\n onOpenChange,\n name,\n required,\n value,\n defaultValue,\n },\n ref\n ) => {\n const strings = useStrings(defaultSelectStrings, stringsProp);\n const { defaultControlSize } = useFormsConfig();\n const size = resolveFormControlSize(sizeProp, defaultControlSize);\n const resolvedPlaceholder = placeholder ?? strings.placeholder;\n // Memoize normalized options\n const normalizedOptions = useMemo(() => {\n const mapped: SelectOption[] = options.map((opt) => ({\n ...opt,\n value: toInternal(opt.value) ?? '',\n }));\n\n // Add clear option at the start if allowClear is enabled\n if (allowClear) {\n const hasClearOption = mapped.some((opt) => opt.value === EMPTY_VALUE);\n if (!hasClearOption) {\n mapped.unshift({\n label: resolvedPlaceholder,\n value: EMPTY_VALUE,\n });\n }\n }\n\n return mapped;\n }, [options, allowClear, resolvedPlaceholder]);\n\n const normalizedValue = useMemo(() => toInternal(value), [value]);\n const normalizedDefaultValue = useMemo(() => toInternal(defaultValue), [defaultValue]);\n const selectedLabel = useMemo(() => {\n const selectedValue = normalizedValue ?? normalizedDefaultValue;\n if (selectedValue === undefined) {\n return undefined;\n }\n\n return normalizedOptions.find(\n (option) => option.value === selectedValue,\n )?.label;\n }, [normalizedDefaultValue, normalizedOptions, normalizedValue]);\n\n const handleValueChange = useCallback(\n (nextValue: string | null) => {\n if (nextValue !== null) {\n onChange?.(toExternal(nextValue));\n }\n },\n [onChange]\n );\n\n const resolvedInvalid = Boolean(invalid);\n\n return (\n <baseui.Select\n onValueChange={(value) => handleValueChange(value)}\n disabled={disabled}\n defaultOpen={defaultOpen}\n open={open}\n onOpenChange={onOpenChange}\n name={name}\n required={required}\n value={normalizedValue}\n defaultValue={normalizedDefaultValue}\n >\n <baseui.SelectTrigger\n ref={ref}\n aria-invalid={resolvedInvalid || undefined}\n className={cn(\n 'select--component',\n // Base styles matching Input — `!shadow-none` strips the\n // shadcn primitive's baked-in `shadow-xs` so the trigger\n // matches our flat Input chrome.\n 'flex w-full items-center justify-between rounded-md border px-3 py-1 !shadow-none',\n 'transition-[color,box-shadow] outline-none',\n formControlSizeClasses[size],\n // Background\n 'bg-transparent dark:bg-input/30',\n // Placeholder styling\n 'data-[placeholder]:text-muted-foreground',\n // Focus styles\n 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n // Invalid/error styles\n 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',\n // Disabled styles\n 'disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n >\n <baseui.SelectValue placeholder={resolvedPlaceholder}>\n {selectedLabel}\n </baseui.SelectValue>\n </baseui.SelectTrigger>\n <baseui.SelectContent>\n <baseui.SelectGroup>\n {normalizedOptions.map((option) => (\n <baseui.SelectItem\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n >\n {!!option.icon && (\n <div className=\"flex items-center gap-2\">\n <span className=\"h-4 w-4 shrink-0\">{option.icon}</span>\n {option.label}\n </div>\n )}\n {!option.icon && option.label}\n </baseui.SelectItem>\n ))}\n </baseui.SelectGroup>\n </baseui.SelectContent>\n </baseui.Select>\n );\n }\n )\n);\n\nSelect.displayName = 'Select';\n","/**\n * SwitchCard — bordered settings card with an icon, title, optional\n * description, optional hint, and a trailing switch. The whole card is\n * clickable and toggles the switch; clicking inside the actual switch only\n * toggles once. Active state lifts the border and tints the surface.\n *\n * Use for top-of-list \"feature\" toggles where the switch needs more visual\n * weight than a `ToggleField`. For dense rows, prefer `ToggleField`.\n */\nimport { type LucideIcon } from 'lucide-react';\nimport * as React from 'react';\nimport { useCallback, useId, useMemo, useState } from 'react';\nimport { Switch as SwitchPrimitive } from '@/components/ui/switch';\nimport { Label, Text } from '@/components/typography';\nimport { cn } from '@/lib/utils';\n\nexport interface SwitchCardProps {\n\tlabel: string;\n\tdescription?: string;\n\thint?: string;\n\ticon?: LucideIcon;\n\tname?: string;\n\tvalue?: boolean;\n\tdefaultValue?: boolean;\n\tonChange?: (checked: boolean) => void;\n\tdisabled?: boolean;\n\tinvalid?: boolean;\n\tclassName?: string;\n}\n\nexport function SwitchCard({\n\tlabel,\n\tdescription,\n\thint,\n\ticon: Icon,\n\tname,\n\tvalue,\n\tdefaultValue,\n\tonChange,\n\tdisabled = false,\n\tinvalid,\n\tclassName,\n}: SwitchCardProps) {\n\tconst isControlled = value !== undefined;\n\tconst [internal, setInternal] = useState<boolean>(defaultValue ?? false);\n\tconst checked = isControlled ? value ?? false : internal;\n\tconst generatedId = useId();\n\tconst id = useMemo(() => name ?? generatedId, [name, generatedId]);\n\n\tconst hasDescription = typeof description === 'string' && description.trim() !== '';\n\tconst describedById = hasDescription ? `${id}-description` : undefined;\n\n\tconst handleToggle = useCallback(\n\t\t(newChecked: boolean) => {\n\t\t\tif (disabled) return;\n\t\t\tif (!isControlled) setInternal(newChecked);\n\t\t\tonChange?.(newChecked);\n\t\t},\n\t\t[disabled, isControlled, onChange],\n\t);\n\n\tconst handleCardClick = useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tif ((e.target as HTMLElement).closest('[role=\"switch\"]')) return;\n\t\t\thandleToggle(!checked);\n\t\t},\n\t\t[checked, handleToggle],\n\t);\n\n\treturn (\n\t\t<div\n\t\t\trole=\"button\"\n\t\t\ttabIndex={disabled ? -1 : 0}\n\t\t\taria-invalid={invalid || undefined}\n\t\t\tonClick={handleCardClick}\n\t\t\tonKeyDown={(e) => {\n\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\thandleToggle(!checked);\n\t\t\t\t}\n\t\t\t}}\n\t\t\tclassName={cn('switch-card--component', \n\t\t\t\t'group relative flex items-start gap-3 rounded-lg border bg-card p-4 transition-[background,border-color,box-shadow] duration-150',\n\t\t\t\t'border-border',\n\t\t\t\tchecked && 'border-primary bg-primary/[0.04]',\n\t\t\t\t'aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/20',\n\t\t\t\t!disabled && 'cursor-pointer hover:border-foreground/20 hover:bg-muted/30',\n\t\t\t\tdisabled && 'cursor-not-allowed opacity-50',\n\t\t\t\t'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{!!name && (\n\t\t\t\t<input\n\t\t\t\t\ttype=\"hidden\"\n\t\t\t\t\tname={name}\n\t\t\t\t\tvalue={checked ? '1' : '0'}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{!!Icon && (\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'mt-0.5 inline-flex size-9 shrink-0 items-center justify-center rounded-md transition-colors',\n\t\t\t\t\t\tchecked\n\t\t\t\t\t\t\t? 'bg-primary/10 text-primary'\n\t\t\t\t\t\t\t: 'bg-muted text-muted-foreground group-hover:text-foreground',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Icon className=\"size-4\" />\n\t\t\t\t</span>\n\t\t\t)}\n\n\t\t\t<div className=\"min-w-0 flex-1 space-y-0.5\">\n\t\t\t\t<Label\n\t\t\t\t\thtmlFor={id}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'block font-semibold tracking-tight',\n\t\t\t\t\t\tdisabled ? 'cursor-not-allowed' : 'cursor-pointer',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{label}\n\t\t\t\t</Label>\n\t\t\t\t{!!hasDescription && (\n\t\t\t\t\t<Text type=\"secondary\" className=\"leading-snug\">\n\t\t\t\t\t\t{description}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t{!!hint && (\n\t\t\t\t\t<Text size=\"xs\" type=\"discrete\" className=\"leading-snug\">\n\t\t\t\t\t\t{hint}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t<div className=\"mt-1 flex shrink-0 items-center\">\n\t\t\t\t<SwitchPrimitive\n\t\t\t\t\tid={id}\n\t\t\t\t\tchecked={checked}\n\t\t\t\t\tonCheckedChange={(v) => handleToggle(v as boolean)}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\taria-label={label}\n\t\t\t\t\taria-describedby={describedById}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t{!!hasDescription && (\n\t\t\t\t<span id={`${id}-description`} className=\"sr-only\">\n\t\t\t\t\t{description}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nSwitchCard.displayName = 'SwitchCard';\n","/**\n * ToggleField — inline label-and-control row for switches and checkboxes.\n *\n * Pattern: a left-aligned descriptive label/description block with the\n * control sitting on the trailing edge. Use for settings rows (e.g. \"Email\n * notifications\" + switch) where a full SwitchCard is too heavy and a bare\n * `Switch` + `<label>` is too brittle. The whole row is clickable and\n * keyboard-accessible.\n *\n * Two control kinds: `'switch'` (default) and `'checkbox'`. Both honour\n * controlled `value` / `defaultValue` / `onChange`. Strings are passed via\n * standard React props rather than a `strings` object — there are no\n * defaults to override.\n */\nimport type { ReactNode } from 'react';\nimport { useCallback, useId, useState } from 'react';\n\nimport { Checkbox } from '@/components/ui/checkbox';\nimport { Switch as SwitchPrimitive } from '@/components/ui/switch';\nimport { Label, Text } from '@/components/typography';\nimport { cn } from '@/lib/utils';\n\nexport type ToggleFieldKind = 'switch' | 'checkbox';\n\nexport interface ToggleFieldProps {\n\tlabel: ReactNode;\n\tdescription?: ReactNode;\n\tkind?: ToggleFieldKind;\n\tvalue?: boolean;\n\tdefaultValue?: boolean;\n\tonChange?: (checked: boolean) => void;\n\tdisabled?: boolean;\n\tinvalid?: boolean;\n\tname?: string;\n\tclassName?: string;\n\t/** Place the control on the leading edge instead of trailing (default). */\n\tcontrolPosition?: 'leading' | 'trailing';\n}\n\nexport function ToggleField({\n\tlabel,\n\tdescription,\n\tkind = 'switch',\n\tvalue,\n\tdefaultValue,\n\tonChange,\n\tdisabled = false,\n\tinvalid = false,\n\tname,\n\tclassName,\n\tcontrolPosition = 'trailing',\n}: ToggleFieldProps) {\n\tconst isControlled = value !== undefined;\n\tconst [internal, setInternal] = useState<boolean>(defaultValue ?? false);\n\tconst checked = isControlled ? value ?? false : internal;\n\tconst inputId = useId();\n\n\tconst set = useCallback(\n\t\t(next: boolean) => {\n\t\t\tif (disabled) return;\n\t\t\tif (!isControlled) setInternal(next);\n\t\t\tonChange?.(next);\n\t\t},\n\t\t[disabled, isControlled, onChange],\n\t);\n\n\tconst onRowClick = (e: React.MouseEvent) => {\n\t\t// Avoid double-toggle when clicking the control itself.\n\t\tconst target = e.target as HTMLElement;\n\t\tif (target.closest('[role=\"switch\"], [role=\"checkbox\"], input[type=\"checkbox\"]')) return;\n\t\tset(!checked);\n\t};\n\n\tconst Control =\n\t\tkind === 'switch' ? (\n\t\t\t<SwitchPrimitive\n\t\t\t\tid={inputId}\n\t\t\t\tname={name}\n\t\t\t\tchecked={checked}\n\t\t\t\tonCheckedChange={(v) => set(v as boolean)}\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-invalid={invalid || undefined}\n\t\t\t/>\n\t\t) : (\n\t\t\t<Checkbox\n\t\t\t\tid={inputId}\n\t\t\t\tname={name}\n\t\t\t\tchecked={checked}\n\t\t\t\tonCheckedChange={(v) => set(v === true)}\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-invalid={invalid || undefined}\n\t\t\t/>\n\t\t);\n\n\tconst TextBlock = (\n\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t<Label\n\t\t\t\thtmlFor={inputId}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'block leading-snug',\n\t\t\t\t\tdisabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer',\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{label}\n\t\t\t</Label>\n\t\t\t{!!description && (\n\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"mt-0.5 leading-snug\">\n\t\t\t\t\t{description}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t</div>\n\t);\n\n\treturn (\n\t\t<div\n\t\t\trole=\"group\"\n\t\t\tonClick={onRowClick}\n\t\t\tclassName={cn('toggle-field--component', \n\t\t\t\t'flex items-start gap-3 rounded-md py-1',\n\t\t\t\tdisabled && 'pointer-events-none',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{controlPosition === 'leading' && <div className=\"mt-0.5 flex shrink-0\">{Control}</div>}\n\t\t\t{TextBlock}\n\t\t\t{controlPosition === 'trailing' && <div className=\"mt-0.5 flex shrink-0\">{Control}</div>}\n\t\t</div>\n\t);\n}\n\nToggleField.displayName = 'ToggleField';\n","/**\n * TagsInput — generic typed tag picker with optional recommendation list,\n * paste-to-bulk, validation, max-tag enforcement, and customizable rendering.\n * Supports both string tags and complex objects (via the `field` prop pointing\n * at the display key). Strings overridable for i18n via `strings`.\n *\n * Ref note: `TagsInput` is generic over `T` and does not use `forwardRef`\n * (generic-+-forwardRef is awkward in TS). Consumers wire RHF via `value` /\n * `onChange` props directly. To focus the inner input from a parent, render\n * a wrapping element with `data-tags-input` and call `.querySelector('input').focus()`.\n */\nimport { X, Check } from 'lucide-react';\nimport * as React from 'react';\nimport { useState, useRef, useCallback, useMemo } from 'react';\nimport { TextButton } from '@/components/base/buttons';\nimport { Badge } from '@/components/base/badge';\nimport { Text } from '@/components/typography';\nimport { useStrings } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\nimport { Input } from './input';\n\nexport interface TagsInputStrings {\n\tplaceholder: string;\n\temptyRecommendations: string;\n\tclearAll: string;\n\t/** Summary line shown when `maxTags` + `showMaxTags` are set. Receives\n\t * `current` (number of tags entered) and `max` (the limit). The\n\t * default is English `\"{current} / {max} tags\"` — override for i18n. */\n\tsummary: (current: number, max: number) => string;\n}\n\nexport const defaultTagsInputStrings: TagsInputStrings = {\n\tplaceholder: 'Add a tag…',\n\temptyRecommendations: 'No recommendations found.',\n\tclearAll: 'Clear all',\n\tsummary: (current, max) => `${current} / ${max} tags`,\n};\n\nexport interface TagsInputProps<T = string> {\n /** Current value (array of T) */\n value?: T[];\n\n /** Callback when value changes */\n onChange?: (value: T[]) => void;\n\n /** Placeholder text for the input */\n placeholder?: string;\n\n /** Array of recommendations to suggest */\n recommendations?: Array<T | { value: T; label: string }>;\n\n /** Maximum number of tags allowed */\n maxTags?: number;\n\n /** Show the label for the maximum tags */\n showMaxTags?: boolean;\n\n /** Whether duplicate tags are allowed */\n allowDuplicates?: boolean;\n\n /** Custom validation function */\n validate?: (value: T) => boolean;\n\n /** Whether the input is disabled */\n disabled?: boolean;\n\n /** Whether to show the clear all button */\n showClearAll?: boolean;\n\n /** Custom tag component */\n renderTag?: (tag: T, index: number, onRemove: (index: number) => void) => React.ReactNode;\n\n /** Delimiter for separating tags when pasting */\n delimiter?: string | RegExp;\n\n /** Whether to trigger add on blur */\n addOnBlur?: boolean;\n\n /** Minimum length for a tag */\n minLength?: number;\n\n /** Maximum length for a tag */\n maxLength?: number;\n\n /** @deprecated Use `strings.emptyRecommendations` instead. */\n emptyMessage?: string;\n\n /** Override default English strings (placeholder, empty list, clear-all). */\n strings?: Partial<TagsInputStrings>;\n\n /** Whether tags should be sorted */\n sortTags?: boolean;\n\n /** Case sensitivity for duplicate checking */\n caseSensitive?: boolean;\n\n /** Field to extract display value from an object (required when T is not string) */\n field?: T extends string ? never : keyof T;\n\n /** Error state for styling (passed from FormField) */\n invalid?: boolean;\n\n /** Additional class names */\n className?: string;\n}\n\nexport function TagsInput<T = string>({\n value = [],\n onChange,\n placeholder,\n recommendations,\n maxTags,\n showMaxTags = false,\n allowDuplicates = false,\n validate,\n disabled = false,\n showClearAll = false,\n renderTag,\n delimiter = /[\\n,]/,\n addOnBlur = true,\n minLength = 1,\n maxLength,\n emptyMessage,\n sortTags = false,\n caseSensitive = false,\n field,\n invalid,\n className,\n strings: stringsProp,\n}: TagsInputProps<T>) {\n const strings = useStrings(defaultTagsInputStrings, {\n ...(placeholder ? { placeholder } : {}),\n ...(emptyMessage ? { emptyRecommendations: emptyMessage } : {}),\n ...stringsProp,\n });\n const [inputValue, setInputValue] = useState('');\n const [open, setOpen] = useState(false);\n const [selectedIndex, setSelectedIndex] = useState(-1);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Helper function to get display value from tag\n const getDisplayValue = useCallback(\n (tag: T): string => {\n if (typeof tag === 'string') {\n return tag;\n }\n\n if (field && typeof tag === 'object' && tag !== null) {\n const record = tag as Record<string | number | symbol, unknown>;\n const candidate = record[field];\n if (typeof candidate === 'string') {\n return candidate;\n }\n if (candidate === undefined || candidate === null) {\n return '';\n }\n return String(candidate);\n }\n\n return String(tag);\n },\n [field]\n );\n\n // Helper function to create tag from string input\n const createTagFromString = useCallback(\n (input: string): T => {\n if (typeof value[0] === 'string' || value.length === 0) {\n return input as T;\n }\n if (field) {\n return { [field]: input } as T;\n }\n return input as unknown as T;\n },\n [field, value]\n );\n\n // Normalize recommendations to always be objects\n const normalizedRecommendations = useMemo(() => {\n if (!recommendations) return [];\n return recommendations.map((rec) => {\n if (rec && typeof rec === 'object' && 'value' in rec && 'label' in rec) {\n return rec as { value: T; label: string };\n }\n const displayValue = getDisplayValue(rec);\n return { value: rec, label: displayValue };\n });\n }, [recommendations, getDisplayValue]);\n\n // Filter recommendations based on input and existing tags\n const filteredRecommendations = useMemo(() => {\n if (!normalizedRecommendations.length || !inputValue) return normalizedRecommendations;\n\n const search = caseSensitive ? inputValue : inputValue.toLowerCase();\n const existingValues = new Set(\n value.map((v) => {\n const displayVal = getDisplayValue(v);\n return caseSensitive ? displayVal : displayVal.toLowerCase();\n })\n );\n\n return normalizedRecommendations.filter((rec) => {\n const label = caseSensitive ? rec.label : rec.label.toLowerCase();\n const displayVal = getDisplayValue(rec.value);\n const val = caseSensitive ? displayVal : displayVal.toLowerCase();\n\n return (label.includes(search) || val.includes(search)) && (allowDuplicates || !existingValues.has(val));\n });\n }, [normalizedRecommendations, inputValue, value, allowDuplicates, caseSensitive, getDisplayValue]);\n\n // Sort tags if needed\n const displayValue = useMemo(() => {\n if (!sortTags) return value;\n return [...value].sort((a, b) => {\n const aStr = getDisplayValue(a);\n const bStr = getDisplayValue(b);\n return aStr.localeCompare(bStr);\n });\n }, [value, sortTags, getDisplayValue]);\n\n const addTag = useCallback(\n (tag: T | string) => {\n const actualTag = typeof tag === 'string' ? createTagFromString(tag) : tag;\n const displayVal = getDisplayValue(actualTag);\n const trimmedDisplayVal = displayVal.trim();\n\n // Validation checks\n if (!trimmedDisplayVal) return;\n if (trimmedDisplayVal.length < minLength) return;\n if (maxLength && trimmedDisplayVal.length > maxLength) return;\n if (maxTags && value.length >= maxTags) return;\n\n if (!allowDuplicates) {\n const exists = value.some((v) => {\n const existingDisplayVal = getDisplayValue(v);\n return caseSensitive\n ? existingDisplayVal === trimmedDisplayVal\n : existingDisplayVal.toLowerCase() === trimmedDisplayVal.toLowerCase();\n });\n if (exists) return;\n }\n\n if (validate && !validate(actualTag)) return;\n\n const newValue = [...value, actualTag];\n onChange?.(newValue);\n setInputValue('');\n setOpen(false);\n setSelectedIndex(-1);\n },\n [value, onChange, maxTags, allowDuplicates, validate, minLength, maxLength, caseSensitive, getDisplayValue, createTagFromString]\n );\n\n const removeTag = useCallback(\n (index: number) => {\n const newValue = value.filter((_, i) => i !== index);\n onChange?.(newValue);\n },\n [value, onChange]\n );\n\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setInputValue(newValue);\n setSelectedIndex(-1);\n\n if (recommendations && recommendations.length > 0) {\n setOpen(true);\n }\n },\n [recommendations]\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n if (e.key === 'Enter') {\n e.preventDefault();\n if (open && selectedIndex >= 0 && selectedIndex < filteredRecommendations.length) {\n addTag(filteredRecommendations[selectedIndex].value);\n setSelectedIndex(-1);\n } else if (inputValue.trim()) {\n addTag(inputValue);\n }\n } else if (e.key === 'Tab') {\n if (inputValue) {\n e.preventDefault();\n addTag(inputValue);\n }\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n if (open) {\n setSelectedIndex((prev) => (prev < filteredRecommendations.length - 1 ? prev + 1 : prev));\n }\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n if (open) {\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : 0));\n }\n } else if (e.key === 'Escape') {\n setOpen(false);\n setSelectedIndex(-1);\n } else if (e.key === 'Backspace' && !inputValue && value.length > 0) {\n removeTag(value.length - 1);\n }\n },\n [disabled, open, selectedIndex, filteredRecommendations, inputValue, addTag, removeTag, value.length]\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n e.preventDefault();\n const pastedText = e.clipboardData.getData('text');\n const tags = pastedText\n .split(delimiter)\n .map((t) => t.trim())\n .filter(Boolean);\n\n tags.forEach((tag) => addTag(tag));\n },\n [disabled, delimiter, addTag]\n );\n\n const handleBlur = useCallback(() => {\n setTimeout(() => {\n setOpen(false);\n if (addOnBlur && inputValue) {\n addTag(inputValue);\n }\n }, 200);\n }, [addOnBlur, inputValue, addTag]);\n\n const clearAll = useCallback(() => {\n onChange?.([]);\n setInputValue('');\n }, [onChange]);\n\n const defaultRenderTag = useCallback(\n (tag: T, index: number, onRemove: (index: number) => void) => {\n const tagKey = `${getDisplayValue(tag)}-${index}`;\n return (\n <Badge key={tagKey} variant=\"secondary\" className={cn('tags-input--component', 'gap-1 pr-1 font-normal')}>\n {getDisplayValue(tag)}\n <button\n type=\"button\"\n aria-label={`Remove ${getDisplayValue(tag)}`}\n className={cn(\n 'inline-flex size-3.5 items-center justify-center rounded-full',\n 'text-muted-foreground/70 hover:bg-foreground/10 hover:text-foreground',\n 'outline-none focus-visible:ring-2 focus-visible:ring-ring/50',\n 'disabled:opacity-50 disabled:pointer-events-none',\n )}\n onClick={() => onRemove(index)}\n disabled={disabled}\n >\n <X className=\"size-3\" aria-hidden=\"true\" />\n </button>\n </Badge>\n );\n },\n [getDisplayValue, disabled]\n );\n\n const resolvedInvalid = Boolean(invalid);\n\n return (\n <div className={cn('w-full relative', className)}>\n <div className=\"relative\">\n <Input\n ref={inputRef}\n type=\"text\"\n placeholder={strings.placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onBlur={handleBlur}\n onFocus={() => {\n if (recommendations && filteredRecommendations.length > 0) {\n setOpen(true);\n }\n }}\n disabled={disabled || (maxTags !== undefined && value.length >= maxTags)}\n invalid={resolvedInvalid}\n maxLength={maxLength}\n className=\"w-full\"\n />\n\n {/* Recommendations dropdown — mirrors PopoverContent + CommandItem\n surface tokens (bg-popover, text-popover-foreground, ring-1\n ring-foreground/10, shadow-md, rounded-md) so it reads\n identically to a real popover. The hand-rolled wrapper\n stays because the dropdown is tightly bound to the\n Input's keyboard handler (selectedIndex, arrow nav). */}\n {!!recommendations && !!open && (\n <div className=\"absolute top-full left-0 right-0 z-50 mt-1 max-h-[200px] overflow-y-auto rounded-md bg-popover text-popover-foreground p-1 text-sm shadow-md ring-1 ring-foreground/10\">\n {filteredRecommendations.length > 0 ? (\n filteredRecommendations.map((rec, idx) => {\n const recommendationKey = getDisplayValue(rec.value);\n const isPicked = value.some(\n (v) => getDisplayValue(v) === getDisplayValue(rec.value),\n );\n return (\n <button\n key={recommendationKey}\n type=\"button\"\n onMouseDown={(e) => {\n e.preventDefault();\n addTag(rec.value);\n setSelectedIndex(-1);\n inputRef.current?.focus();\n }}\n onMouseEnter={() => setSelectedIndex(idx)}\n className={cn(\n 'relative flex w-full cursor-pointer items-center justify-between gap-2 rounded-md px-2 py-(--row-py) text-[length:var(--text-xs)]',\n 'hover:bg-accent hover:text-accent-foreground',\n 'focus-visible:outline-none',\n selectedIndex === idx && 'bg-accent text-accent-foreground',\n )}\n >\n <span>{rec.label}</span>\n <Check\n className={cn(\n 'ml-auto size-4',\n isPicked ? 'opacity-100' : 'opacity-0',\n )}\n />\n </button>\n );\n })\n ) : (\n <Text tag=\"div\" size=\"xs\" type=\"secondary\" className=\"px-2 py-(--row-py)\">\n {strings.emptyRecommendations}\n </Text>\n )}\n </div>\n )}\n </div>\n\n {/* Tags container */}\n {displayValue.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-1.5 mt-2\">\n {displayValue.map((tag, index) =>\n renderTag ? renderTag(tag, index, removeTag) : defaultRenderTag(tag, index, removeTag)\n )}\n\n {!!showClearAll && value.length > 0 && !disabled && (\n <TextButton\n type=\"button\"\n size=\"sm\"\n onClick={clearAll}\n className=\"ml-auto\"\n >\n {strings.clearAll}\n </TextButton>\n )}\n </div>\n )}\n\n {!!maxTags && !!showMaxTags && (\n <Text size=\"xs\" type=\"secondary\" className=\"mt-1\">\n {strings.summary(value.length, maxTags)}\n </Text>\n )}\n </div>\n );\n}\n\nTagsInput.displayName = 'TagsInput';\n","import * as React from 'react';\nimport { useState, useCallback, useMemo, memo } from 'react';\nimport * as baseui from '@/components/ui/select';\nimport { Text } from '@/components/typography';\nimport { useStrings, type StringsProp } from '@/lib/strings';\nimport { useFormsConfig } from '@/lib/ui-provider';\nimport { cn } from '@/lib/utils';\nimport { formControlSizeClasses, resolveFormControlSize } from '../form-sizing';\nimport { Input, type InputProps } from './input';\n\nexport interface PhoneInputStrings {\n prefixPlaceholder: string;\n}\n\nexport const defaultPhoneInputStrings: PhoneInputStrings = {\n prefixPlaceholder: 'Prefix',\n};\n\nexport interface CountryPrefixOption {\n /** Country code value (e.g., '+1') */\n value: string;\n\n /** Display label (e.g., 'Bulgaria') */\n label: string;\n\n /** ISO country code (e.g., 'US') */\n iso: string;\n}\n\n/** Country data mapped by ISO code */\nexport const COUNTRY_PREFIX_MAP: Record<string, CountryPrefixOption> = {\n US: { value: '+1', label: 'United States', iso: 'US' },\n CA: { value: '+1', label: 'Canada', iso: 'CA' },\n AU: { value: '+61', label: 'Australia', iso: 'AU' },\n BG: { value: '+359', label: 'Bulgaria', iso: 'BG' },\n GR: { value: '+30', label: 'Greece', iso: 'GR' },\n GB: { value: '+44', label: 'United Kingdom', iso: 'GB' },\n DE: { value: '+49', label: 'Germany', iso: 'DE' },\n FR: { value: '+33', label: 'France', iso: 'FR' },\n IT: { value: '+39', label: 'Italy', iso: 'IT' },\n ES: { value: '+34', label: 'Spain', iso: 'ES' },\n NL: { value: '+31', label: 'Netherlands', iso: 'NL' },\n BE: { value: '+32', label: 'Belgium', iso: 'BE' },\n AT: { value: '+43', label: 'Austria', iso: 'AT' },\n CH: { value: '+41', label: 'Switzerland', iso: 'CH' },\n PL: { value: '+48', label: 'Poland', iso: 'PL' },\n RO: { value: '+40', label: 'Romania', iso: 'RO' },\n RS: { value: '+381', label: 'Serbia', iso: 'RS' },\n HR: { value: '+385', label: 'Croatia', iso: 'HR' },\n SI: { value: '+386', label: 'Slovenia', iso: 'SI' },\n MK: { value: '+389', label: 'North Macedonia', iso: 'MK' },\n TR: { value: '+90', label: 'Turkey', iso: 'TR' },\n RU: { value: '+7', label: 'Russia', iso: 'RU' },\n UA: { value: '+380', label: 'Ukraine', iso: 'UA' },\n SK: { value: '+421', label: 'Slovakia', iso: 'SK' },\n CZ: { value: '+420', label: 'Czech Republic', iso: 'CZ' },\n HU: { value: '+36', label: 'Hungary', iso: 'HU' },\n PT: { value: '+351', label: 'Portugal', iso: 'PT' },\n IE: { value: '+353', label: 'Ireland', iso: 'IE' },\n SE: { value: '+46', label: 'Sweden', iso: 'SE' },\n NO: { value: '+47', label: 'Norway', iso: 'NO' },\n DK: { value: '+45', label: 'Denmark', iso: 'DK' },\n FI: { value: '+358', label: 'Finland', iso: 'FI' },\n CY: { value: '+357', label: 'Cyprus', iso: 'CY' },\n AL: { value: '+355', label: 'Albania', iso: 'AL' },\n ME: { value: '+382', label: 'Montenegro', iso: 'ME' },\n BA: { value: '+387', label: 'Bosnia and Herzegovina', iso: 'BA' },\n XK: { value: '+383', label: 'Kosovo', iso: 'XK' },\n MD: { value: '+373', label: 'Moldova', iso: 'MD' },\n BY: { value: '+375', label: 'Belarus', iso: 'BY' },\n LT: { value: '+370', label: 'Lithuania', iso: 'LT' },\n LV: { value: '+371', label: 'Latvia', iso: 'LV' },\n EE: { value: '+372', label: 'Estonia', iso: 'EE' },\n};\n\n/** Type for prefix input - either ISO code string or full option object */\nexport type CountryPrefixInput = string | CountryPrefixOption;\n\n/** Default country prefixes - commonly used codes */\nexport const DEFAULT_COUNTRY_PREFIXES: CountryPrefixInput[] = ['US', 'CA', 'GB', 'DE', 'FR', 'IT', 'ES', 'AU'];\n\n/**\n * Normalize prefix input to CountryPrefixOption\n * Accepts either ISO code ('US') or full object ({ value: '+1', label: 'United States', iso: 'US' })\n */\nconst normalizePrefixInput = (input: CountryPrefixInput): CountryPrefixOption | null => {\n if (typeof input === 'string') {\n // It's an ISO code - look it up\n const upperInput = input.toUpperCase();\n return COUNTRY_PREFIX_MAP[upperInput] ?? null;\n }\n // It's already a full object\n return input;\n};\n\n/**\n * Normalize array of prefix inputs to CountryPrefixOption[]\n */\nconst normalizePrefixes = (inputs: CountryPrefixInput[]): CountryPrefixOption[] => {\n return inputs.map(normalizePrefixInput).filter((p): p is CountryPrefixOption => p !== null);\n};\n\nexport interface PhoneInputProps extends Omit<InputProps, 'type' | 'startAddon' | 'strings'> {\n /** Normalize phone number on blur. Defaults to true */\n normalizeOnBlur?: boolean;\n\n /** Current country prefix value (dial code like '+1' or ISO code like 'US') */\n prefix?: string;\n\n /** Default prefix if uncontrolled (dial code like '+1' or ISO code like 'US') */\n defaultPrefix?: string;\n\n /** List of available country prefixes - ISO codes ('US', 'GR') or full objects */\n prefixes?: CountryPrefixInput[];\n\n /** Callback when prefix changes - returns dial code (e.g., '+1') */\n onPrefixChange?: (prefix: string) => void;\n\n /** Disable prefix selection */\n disablePrefixSelector?: boolean;\n\n /** Placeholder for prefix dropdown */\n prefixPlaceholder?: string;\n\n /** Width of the prefix dropdown */\n prefixWidth?: string;\n\n /** Show country name in dropdown. Defaults to true */\n showCountryName?: boolean;\n\n /** Show prefix in dropdown items. Defaults to true */\n showPrefixInDropdown?: boolean;\n\n /** String overrides (e.g. prefix dropdown placeholder). */\n strings?: StringsProp<PhoneInputStrings>;\n}\n\nconst normalizePhone = (value: string, selectedPrefix?: string): string => {\n let normalized = value\n .trim()\n .replace(/\\s+/g, ' ')\n .replace(/[^\\d ()+-]/g, '');\n\n // Strip the selected prefix from the input if the user typed it redundantly\n if (selectedPrefix && normalized.startsWith(selectedPrefix)) {\n normalized = normalized.slice(selectedPrefix.length).replace(/^[\\s-]+/, '');\n }\n\n // Strip leading zero from national numbers when a prefix is selected (e.g., 0877... → 877...)\n if (selectedPrefix && normalized.startsWith('0')) {\n normalized = normalized.slice(1);\n }\n\n return normalized;\n};\n\n/**\n * Resolve a prefix string (ISO code or dial code) to dial code\n */\nconst resolvePrefixToDialCode = (prefix: string | undefined, normalizedPrefixes: CountryPrefixOption[]): string => {\n if (!prefix) return normalizedPrefixes[0]?.value ?? '';\n\n // Check if it's already a dial code (starts with +)\n if (prefix.startsWith('+')) {\n return prefix;\n }\n\n // It's an ISO code - look it up\n const upperPrefix = prefix.toUpperCase();\n const found = COUNTRY_PREFIX_MAP[upperPrefix];\n return found?.value ?? prefix;\n};\n\nfunction PhoneInputImpl(\n {\n normalizeOnBlur = true,\n onBlur,\n onChange,\n prefix: controlledPrefix,\n defaultPrefix,\n prefixes = DEFAULT_COUNTRY_PREFIXES,\n onPrefixChange,\n disablePrefixSelector = false,\n prefixPlaceholder,\n prefixWidth = 'w-[120px]',\n showCountryName = true,\n showPrefixInDropdown = true,\n invalid,\n disabled,\n className,\n size: sizeProp,\n strings: stringsProp,\n ...props\n }: PhoneInputProps,\n forwardedRef: React.ForwardedRef<HTMLInputElement>,\n) {\n const { defaultControlSize } = useFormsConfig();\n const size = resolveFormControlSize(sizeProp, defaultControlSize);\n const strings = useStrings(defaultPhoneInputStrings, stringsProp);\n // Normalize prefix options from mixed input (ISO codes or full objects)\n const normalizedPrefixes = useMemo(() => normalizePrefixes(prefixes), [prefixes]);\n\n // Resolve controlled/default prefix to dial code\n const resolvedDefaultPrefix = useMemo(\n () => resolvePrefixToDialCode(defaultPrefix, normalizedPrefixes),\n [defaultPrefix, normalizedPrefixes]\n );\n\n // Internal state for uncontrolled prefix (always stores dial code)\n const [internalPrefix, setInternalPrefix] = useState(resolvedDefaultPrefix);\n\n // Determine if prefix is controlled\n const isPrefixControlled = controlledPrefix !== undefined;\n const selectedPrefix = isPrefixControlled\n ? resolvePrefixToDialCode(controlledPrefix, normalizedPrefixes)\n : internalPrefix;\n\n // Find current prefix option for display\n const currentPrefixOption = useMemo(\n () => normalizedPrefixes.find((p) => p.value === selectedPrefix),\n [normalizedPrefixes, selectedPrefix]\n );\n\n // Handle prefix change\n const handlePrefixChange = useCallback(\n (newPrefix: string | null) => {\n if (newPrefix === null) return;\n if (!isPrefixControlled) {\n setInternalPrefix(newPrefix);\n }\n onPrefixChange?.(newPrefix);\n },\n [isPrefixControlled, onPrefixChange]\n );\n\n // Handle phone change — strip redundant prefix on every keystroke/autofill\n const handleChange: React.ChangeEventHandler<HTMLInputElement> = useCallback(\n (event) => {\n if (!onChange) return;\n\n const raw = event.target.value;\n\n // Strip the selected prefix if the value starts with it (autofill, paste, manual typing)\n if (selectedPrefix && raw.startsWith(selectedPrefix)) {\n const stripped = raw.slice(selectedPrefix.length).replace(/^[\\s-]+/, '');\n // Also strip leading zero from national part\n const national = stripped.startsWith('0') ? stripped.slice(1) : stripped;\n if (national !== raw) {\n const syntheticEvent = {\n ...event,\n target: { ...event.target, value: national },\n currentTarget: { ...event.currentTarget, value: national },\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n onChange(syntheticEvent);\n return;\n }\n }\n\n onChange(event);\n },\n [onChange, selectedPrefix]\n );\n\n // Handle phone blur with normalization\n const handleBlur: React.FocusEventHandler<HTMLInputElement> = useCallback(\n (event) => {\n if (normalizeOnBlur && typeof onChange === 'function') {\n const nextValue = normalizePhone(event.target.value, selectedPrefix);\n if (nextValue !== event.target.value) {\n const syntheticEvent = {\n ...event,\n target: { ...event.target, value: nextValue },\n currentTarget: { ...event.currentTarget, value: nextValue },\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n\n onChange(syntheticEvent);\n }\n }\n\n onBlur?.(event);\n },\n [normalizeOnBlur, onChange, onBlur, selectedPrefix]\n );\n\n // If no prefixes or disabled, render simple input with prefix display\n if (normalizedPrefixes.length === 0 || disablePrefixSelector) {\n const staticPrefix = selectedPrefix || defaultPrefix;\n\n if (!staticPrefix) {\n return (\n <Input\n ref={forwardedRef}\n size={size}\n type=\"tel\"\n autoComplete=\"tel\"\n inputMode=\"tel\"\n onChange={handleChange}\n onBlur={handleBlur}\n invalid={invalid}\n disabled={disabled}\n className={cn('phone-input--component', className)}\n {...props}\n />\n );\n }\n\n return (\n <div className=\"flex items-start gap-2\">\n <div\n aria-invalid={invalid || undefined}\n className={cn(\n 'flex items-center justify-center rounded-md border border-input bg-muted px-3',\n formControlSizeClasses[size],\n disabled && 'opacity-50',\n 'aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/20'\n )}\n >\n <Text tag=\"span\" type=\"secondary\" weight=\"medium\">\n {staticPrefix}\n </Text>\n </div>\n <div className=\"flex-1\">\n <Input\n ref={forwardedRef}\n size={size}\n type=\"tel\"\n autoComplete=\"tel\"\n inputMode=\"tel\"\n onChange={handleChange}\n onBlur={handleBlur}\n invalid={invalid}\n disabled={disabled}\n className={className}\n {...props}\n />\n </div>\n </div>\n );\n }\n\n // Render with prefix selector\n return (\n <div className=\"flex items-start gap-2\">\n {/* Prefix selector */}\n <baseui.Select\n value={selectedPrefix}\n onValueChange={(value) => handlePrefixChange(value)}\n disabled={disabled}\n >\n <baseui.SelectTrigger\n aria-invalid={invalid || undefined}\n className={cn(\n 'border-input bg-transparent shrink-0 !shadow-none',\n formControlSizeClasses[size],\n 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',\n prefixWidth,\n disabled && 'opacity-50 cursor-not-allowed'\n )}\n >\n <baseui.SelectValue placeholder={prefixPlaceholder ?? strings.prefixPlaceholder}>\n {!!currentPrefixOption && (\n <Text tag=\"span\">\n {currentPrefixOption.value}\n </Text>\n )}\n </baseui.SelectValue>\n </baseui.SelectTrigger>\n <baseui.SelectContent>\n <baseui.SelectGroup>\n {normalizedPrefixes.map((prefixOption) => (\n <baseui.SelectItem key={prefixOption.value} value={prefixOption.value}>\n <div className=\"flex items-center gap-2\">\n {!!showPrefixInDropdown && (\n <Text tag=\"span\" weight=\"medium\" className=\"min-w-[50px]\">\n {prefixOption.value}\n </Text>\n )}\n {!!showCountryName && (\n <Text tag=\"span\" type=\"secondary\" lineHeight=\"tight\">\n {prefixOption.label}\n </Text>\n )}\n </div>\n </baseui.SelectItem>\n ))}\n </baseui.SelectGroup>\n </baseui.SelectContent>\n </baseui.Select>\n\n {/* Phone number input */}\n <div className=\"flex-1\">\n <Input\n ref={forwardedRef}\n size={size}\n type=\"tel\"\n autoComplete=\"tel\"\n inputMode=\"tel\"\n onChange={handleChange}\n onBlur={handleBlur}\n invalid={invalid}\n disabled={disabled}\n className={className}\n {...props}\n />\n </div>\n </div>\n );\n}\n\n// forwardRef + memo: forward to the underlying phone input so consumers can\n// focus/measure programmatically (RHF Controller, parent imperative refs).\nexport const PhoneInput = memo(React.forwardRef<HTMLInputElement, PhoneInputProps>(PhoneInputImpl));\nPhoneInput.displayName = 'PhoneInput';\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 DecimalInputProps,\n 'min' | 'max' | 'allowNegative' | 'endAddon'\n> & {\n /** Minimum percentage value. Defaults to 0. */\n min?: number;\n /** Maximum percentage value. Defaults to 100. */\n max?: number;\n};\n\nexport const PercentageInput = forwardRef<HTMLInputElement, PercentageInputProps>(\n function PercentageInput({ decimalPlaces = 2, min = 0, max = 100, step, ...props }, ref) {\n return (\n <DecimalInput className=\"percentage-input--component\"\n ref={ref}\n decimalPlaces={decimalPlaces}\n allowNegative={false}\n min={min}\n max={max}\n step={step}\n endAddon=\"%\"\n {...props}\n />\n );\n },\n);\n\nPercentageInput.displayName = 'PercentageInput';\n","import * as React from \"react\"\nimport { Slider as SliderPrimitive } from \"@base-ui/react/slider\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Slider({\n className,\n defaultValue,\n value,\n min = 0,\n max = 100,\n ...props\n}: SliderPrimitive.Root.Props) {\n const _values = React.useMemo(\n () =>\n Array.isArray(value)\n ? value\n : Array.isArray(defaultValue)\n ? defaultValue\n : [min, max],\n [value, defaultValue, min, max]\n )\n\n return (\n <SliderPrimitive.Root\n className={cn(\"data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full\", className)}\n data-slot=\"slider\"\n defaultValue={defaultValue}\n value={value}\n min={min}\n max={max}\n thumbAlignment=\"edge\"\n {...props}\n >\n <SliderPrimitive.Control className=\"relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-40 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col\">\n <SliderPrimitive.Track\n data-slot=\"slider-track\"\n className=\"relative grow overflow-hidden rounded-full bg-muted select-none data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5\"\n >\n <SliderPrimitive.Indicator\n data-slot=\"slider-range\"\n className=\"absolute bg-primary select-none data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full\"\n />\n </SliderPrimitive.Track>\n {Array.from({ length: _values.length }, (_, index) => (\n <SliderPrimitive.Thumb\n data-slot=\"slider-thumb\"\n key={index}\n className=\"block size-4 shrink-0 rounded-full border border-primary bg-white shadow-sm ring-ring/50 transition-[color,box-shadow] select-none hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50\"\n />\n ))}\n </SliderPrimitive.Control>\n </SliderPrimitive.Root>\n )\n}\n\nexport { Slider }\n","import * as React from 'react';\nimport { useCallback, useId, useMemo, type ElementRef } from 'react';\nimport { Slider as SliderPrimitive } from '@/components/ui/slider';\nimport { Text } from '@/components/typography';\nimport { cn } from '@/lib/utils';\n\nexport interface SliderImitationEvent {\n target: {\n name: string;\n value: number;\n };\n}\n\nexport interface SliderProps {\n /** Field name for form integration */\n name?: string;\n\n /** Element id */\n id?: string;\n\n /** Current value (single thumb) */\n value?: number;\n\n /** Default value when uncontrolled */\n defaultValue?: number;\n\n /** Minimum value. Defaults to 0 */\n min?: number;\n\n /** Maximum value. Defaults to 100 */\n max?: number;\n\n /** Step increment. Defaults to 1 */\n step?: number;\n\n /** Whether the slider is disabled */\n disabled?: boolean;\n\n /** Error state for styling (passed from FormField) */\n invalid?: boolean;\n\n /** Event-style change handler for react-hook-form compatibility */\n onChange?: (event: SliderImitationEvent) => void;\n\n /** Raw value change handler (alternative to onChange) */\n onValueChange?: (value: number) => void;\n\n /** Fires on pointer up / keyboard commit */\n onValueCommitted?: (value: number) => void;\n\n /** Show the current value next to the slider */\n showValue?: boolean;\n\n /** Format the displayed value */\n formatValue?: (value: number) => string;\n\n /** Unit suffix displayed after the value (e.g. \"px\", \"%\", \"mm\") */\n unit?: string;\n\n /** Additional class name for the root wrapper */\n className?: string;\n\n /** Orientation */\n orientation?: 'horizontal' | 'vertical';\n}\n\ntype SliderElement = ElementRef<typeof SliderPrimitive>;\n\nfunction SliderFieldImpl(\n {\n name,\n id,\n value,\n defaultValue,\n min = 0,\n max = 100,\n step = 1,\n disabled = false,\n invalid = false,\n onChange,\n onValueChange,\n onValueCommitted,\n showValue = false,\n formatValue,\n unit,\n className,\n orientation = 'horizontal',\n }: SliderProps,\n ref: React.ForwardedRef<SliderElement>,\n) {\n const generatedId = useId();\n const resolvedId = id ?? `slider-${generatedId}`;\n const resolvedName = name ?? resolvedId;\n\n const handleValueChange = useCallback(\n (newValue: number | readonly number[]) => {\n const singleValue = Array.isArray(newValue) ? newValue[0] : newValue;\n\n onValueChange?.(singleValue);\n\n onChange?.({\n target: { name: resolvedName, value: singleValue },\n });\n },\n [resolvedName, onChange, onValueChange]\n );\n\n const handleValueCommitted = useCallback(\n (newValue: number | readonly number[]) => {\n const singleValue = Array.isArray(newValue) ? newValue[0] : newValue;\n onValueCommitted?.(singleValue);\n },\n [onValueCommitted]\n );\n\n const displayValue = useMemo(() => {\n if (!showValue) return null;\n\n const currentValue = value ?? defaultValue ?? min;\n\n if (formatValue) return formatValue(currentValue);\n\n return unit ? `${currentValue}${unit}` : String(currentValue);\n }, [showValue, value, defaultValue, min, formatValue, unit]);\n\n // Wrap single value in array for the primitive\n const sliderValue = value !== undefined ? [value] : undefined;\n const sliderDefaultValue = defaultValue !== undefined ? [defaultValue] : [min];\n\n return (\n <div className={cn('slider--component', 'flex items-center gap-3', className)}>\n <SliderPrimitive\n ref={ref}\n id={resolvedId}\n value={sliderValue}\n defaultValue={sliderDefaultValue}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n orientation={orientation}\n onValueChange={handleValueChange}\n onValueCommitted={handleValueCommitted}\n aria-invalid={invalid || undefined}\n className={cn(\n 'min-w-0 flex-1',\n invalid && '[&_[data-slot=slider-range]]:bg-destructive [&_[data-slot=slider-thumb]]:border-destructive',\n )}\n />\n\n {!!showValue && displayValue !== null && (\n <Text\n tag=\"span\"\n type={invalid ? 'error' : 'secondary'}\n className=\"min-w-[3ch] shrink-0 text-right tabular-nums\"\n >\n {displayValue}\n </Text>\n )}\n </div>\n );\n}\n\nconst SliderField = React.forwardRef<SliderElement, SliderProps>(SliderFieldImpl);\nSliderField.displayName = 'SliderField';\n\nexport { SliderField };\n","/**\n * ListRadioGroup — single-select radio group rendered as a vertical list with\n * dividers between rows. Use when options have descriptive secondary text and\n * read better as a stack than a grid (e.g. plan tiers, role definitions).\n *\n * Pairs with `CardRadioGroup` for grid-style choices and `PillRadioGroup` for\n * inline compact toggles.\n */\nimport { Radio as RadioPrimitive } from '@base-ui/react/radio';\nimport { RadioGroup as RadioGroupPrimitive } from '@base-ui/react/radio-group';\nimport { Circle } from 'lucide-react';\nimport { Text } from '@/components/typography';\nimport { cn } from '@/lib/utils';\nimport { useFormsConfig } from '@/lib/ui-provider';\nimport { resolveFormControlSize } from '../form-sizing';\nimport {\n\tchoiceListSizeTokens,\n\ttype ChoiceGroupBaseProps,\n\ttype ChoiceOptionBase,\n} from './choice-types';\n\nexport interface ListRadioOption extends ChoiceOptionBase {}\n\nexport interface ListRadioGroupProps extends ChoiceGroupBaseProps {\n\toptions: ListRadioOption[];\n\tvalue?: string;\n\tdefaultValue?: string;\n\tonChange?: (value: string) => void;\n}\n\nexport function ListRadioGroup({\n\toptions,\n\tvalue,\n\tdefaultValue,\n\tonChange,\n\tname,\n\tinvalid,\n\tdisabled,\n\tsize: sizeProp,\n\tclassName,\n}: ListRadioGroupProps) {\n\tconst { defaultControlSize } = useFormsConfig();\n\tconst size = resolveFormControlSize(sizeProp, defaultControlSize);\n\n\tconst rowPadding = choiceListSizeTokens[size];\n\treturn (\n\t\t<RadioGroupPrimitive\n\t\t\tvalue={value}\n\t\t\tdefaultValue={defaultValue}\n\t\t\tonValueChange={(val) => val && onChange?.(val)}\n\t\t\tname={name}\n\t\t\tdisabled={disabled}\n\t\t\taria-invalid={invalid || undefined}\n\t\t\tclassName={cn('list-radio-group--component', \n\t\t\t\t'overflow-hidden rounded-md border [&>[role=radio]~[role=radio]]:border-t',\n\t\t\t\t'aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/20',\n\t\t\t\tdisabled && 'pointer-events-none opacity-50',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{options.map((option) => (\n\t\t\t\t<RadioPrimitive.Root\n\t\t\t\t\tkey={option.value}\n\t\t\t\t\tvalue={option.value}\n\t\t\t\t\tdisabled={disabled || option.disabled}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'group flex w-full items-start gap-3 text-start outline-none cursor-pointer',\n\t\t\t\t\t\t'transition-colors hover:bg-muted/40 focus-visible:bg-muted/40',\n\t\t\t\t\t\t'data-[checked]:bg-primary/5',\n\t\t\t\t\t\t'disabled:cursor-not-allowed disabled:opacity-50',\n\t\t\t\t\t\trowPadding,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full border border-primary group-data-[checked]:border-primary group-not-data-[checked]:border-muted-foreground/50\">\n\t\t\t\t\t\t<RadioPrimitive.Indicator\n\t\t\t\t\t\t\trender={<Circle className=\"h-2.5 w-2.5 fill-primary text-primary\" />}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex-1 min-w-0\">\n\t\t\t\t\t\t<Text tag=\"span\" weight=\"medium\" lineHeight=\"tight\" className=\"block\">\n\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t{!!option.description && (\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"block mt-0.5\">\n\t\t\t\t\t\t\t\t{option.description}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</RadioPrimitive.Root>\n\t\t\t))}\n\t\t</RadioGroupPrimitive>\n\t);\n}\n\nListRadioGroup.displayName = 'ListRadioGroup';\n","import { useMemo, useCallback } from 'react';\nimport { Select, type SelectProps } from './select';\n\ntype RoundingMode = string;\n\nexport interface RoundingModeSelectProps extends Omit<SelectProps, 'options' | 'value' | 'onChange'> {\n /** Current rounding mode value */\n value?: RoundingMode;\n\n /** Change handler */\n onChange?: (value: RoundingMode | undefined) => void;\n\n /** Custom labels for rounding modes */\n labels?: Partial<Record<RoundingMode, string>>;\n}\n\nconst ORDERED_MODES: RoundingMode[] = ['floor', 'half_up', 'ceil'];\n\nexport function RoundingModeSelect({ value, onChange, labels, placeholder, ...props }: RoundingModeSelectProps) {\n const options = useMemo(\n () =>\n ORDERED_MODES.map((mode) => ({\n value: mode,\n label: labels?.[mode] ?? mode,\n })),\n [labels]\n );\n\n const handleChange = useCallback(\n (next: string | undefined) => {\n onChange?.(next as RoundingMode | undefined);\n },\n [onChange]\n );\n\n return <Select className=\"rounding-mode-select--component\" options={options} value={value} onChange={handleChange} placeholder={placeholder} {...props} />;\n}\n\nRoundingModeSelect.displayName = 'RoundingModeSelect';\n","import {\n forwardRef,\n type ReactNode,\n useMemo,\n useCallback,\n useState,\n} from 'react';\nimport * as baseui from '@/components/ui/select';\nimport { Text } from '@/components/typography';\nimport { useStrings, type StringsProp } from '@/lib/strings';\nimport { useFormsConfig, type FormControlSize } from '@/lib/ui-provider';\nimport { cn } from '@/lib/utils';\nimport { formControlMinHeightClasses, formControlSizeClasses, resolveFormControlSize } from '../form-sizing';\n\nexport interface RichSelectStrings {\n placeholder: string;\n}\n\nexport const defaultRichSelectStrings: RichSelectStrings = {\n placeholder: 'Select an item',\n};\n\nexport interface RichSelectOption {\n value: string;\n label: string;\n description?: string;\n icon?: ReactNode;\n disabled?: boolean;\n}\n\nexport interface RichSelectProps {\n /** Available options */\n options: RichSelectOption[];\n\n /** Change handler */\n onChange?: (value: string | undefined) => void;\n\n /** Additional class names */\n className?: string;\n\n /** Placeholder text — overrides `strings.placeholder` when provided. */\n placeholder?: string;\n\n /** String overrides (e.g. placeholder) merged over defaults. */\n strings?: StringsProp<RichSelectStrings>;\n\n /** Allow clearing the selection */\n allowClear?: boolean;\n\n /** Error state for styling (passed from FormField) */\n invalid?: boolean;\n\n /** Current value */\n value?: string | null;\n\n /** Default value */\n defaultValue?: string | null;\n\n /** Disabled state */\n disabled?: boolean;\n\n /** Field name */\n name?: string;\n\n /** Required state */\n required?: boolean;\n\n /** Open state (controlled) */\n open?: boolean;\n\n /** Default open state */\n defaultOpen?: boolean;\n\n /** Open change handler */\n onOpenChange?: (open: boolean) => void;\n\n /** Form control size — flows through `useFormsConfig().defaultControlSize`. */\n size?: FormControlSize;\n}\n\n// Internal value for \"empty\" selection\nconst EMPTY_OPTION_VALUE = '__rich_select_empty__';\n\n/**\n * RichSelect - Select with description and icon support\n */\nexport const RichSelect = forwardRef<HTMLButtonElement, RichSelectProps>(\n (\n {\n options,\n placeholder,\n strings: stringsProp,\n onChange,\n className,\n disabled,\n defaultOpen,\n open,\n onOpenChange,\n name,\n required,\n value,\n defaultValue,\n allowClear = false,\n invalid,\n size: sizeProp,\n },\n ref\n ) => {\n const { defaultControlSize } = useFormsConfig();\n const size = resolveFormControlSize(sizeProp, defaultControlSize);\n const strings = useStrings(defaultRichSelectStrings, stringsProp);\n const resolvedPlaceholder = placeholder ?? strings.placeholder;\n const mapToInternalValue = useCallback(\n (optionValue?: string | null) => {\n if (optionValue === EMPTY_OPTION_VALUE) {\n return undefined;\n }\n\n if (optionValue === '' || optionValue === null || optionValue === undefined) {\n return allowClear ? EMPTY_OPTION_VALUE : undefined;\n }\n\n return optionValue;\n },\n [allowClear],\n );\n\n const mapFromInternalValue = useCallback((optionValue: string): string | undefined => {\n if (optionValue === EMPTY_OPTION_VALUE) {\n return undefined;\n }\n return optionValue;\n }, []);\n\n const normalizedOptions = useMemo(() => {\n const mapped = options.map((option) => ({\n ...option,\n value: mapToInternalValue(option.value) ?? '',\n }));\n\n if (allowClear) {\n const hasExplicitPlaceholder = mapped.some((option) => option.label === resolvedPlaceholder);\n if (!hasExplicitPlaceholder) {\n mapped.unshift({\n label: resolvedPlaceholder,\n value: EMPTY_OPTION_VALUE,\n });\n }\n }\n\n return mapped;\n }, [options, allowClear, resolvedPlaceholder, mapToInternalValue]);\n\n const normalizedValue = useMemo(() => mapToInternalValue(value ?? undefined), [value, mapToInternalValue]);\n const normalizedDefaultValue = useMemo(() => mapToInternalValue(defaultValue ?? undefined), [defaultValue, mapToInternalValue]);\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string | undefined>(\n normalizedDefaultValue,\n );\n const effectiveValue = isControlled ? normalizedValue : internalValue;\n const selectedOption = useMemo(\n () =>\n normalizedOptions.find(\n (option) => option.value === effectiveValue,\n ),\n [effectiveValue, normalizedOptions],\n );\n\n const handleValueChange = useCallback(\n (nextValue: string | null | undefined) => {\n if (nextValue !== null && nextValue !== undefined) {\n if (!isControlled) {\n setInternalValue(nextValue);\n }\n onChange?.(mapFromInternalValue(nextValue));\n }\n },\n [isControlled, onChange, mapFromInternalValue]\n );\n\n // Trigger chrome aligned with `Select`'s canonical shape:\n // - `border-input bg-transparent rounded-md` (was raw `neutral-300`\n // palette + `rounded-lg`).\n // - `formControlSizeClasses[size]` so density flows through\n // `<UIProvider forms={{ defaultControlSize }}>` (rule 17).\n // - `focus-visible:border-ring + ring-ring/50 + ring-[3px]` (was a\n // bespoke `outline-3 outline-primary-400` pattern).\n // - `aria-invalid:` selectors for invalid chrome (was a manual\n // `invalid && '…'` conditional with raw `error-100/300/600`\n // palette tokens — rule 6 violation).\n // - `disabled:opacity-50 disabled:cursor-not-allowed` to match\n // every other field (was `opacity-40 grayscale`).\n const inputClassNames = cn(\n 'border-input bg-transparent w-full rounded-md border outline-none transition-[color,box-shadow] !shadow-none',\n formControlSizeClasses[size],\n formControlMinHeightClasses[size],\n 'h-auto py-2',\n 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive aria-invalid:text-destructive',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className,\n );\n const valueProps = isControlled\n ? { value: normalizedValue }\n : {};\n\n return (\n <baseui.Select\n onValueChange={(value) => handleValueChange(value)}\n disabled={disabled}\n defaultOpen={defaultOpen}\n open={open}\n onOpenChange={onOpenChange}\n name={name}\n required={required}\n defaultValue={normalizedDefaultValue}\n {...valueProps}\n >\n <baseui.SelectTrigger ref={ref} className={cn('rich-select--component', inputClassNames)} aria-invalid={invalid}>\n {selectedOption ? (\n <Text tag=\"span\" className=\"text-left break-words whitespace-normal\">\n {selectedOption.label}\n </Text>\n ) : (\n <baseui.SelectValue placeholder={resolvedPlaceholder} />\n )}\n </baseui.SelectTrigger>\n <baseui.SelectContent>\n <baseui.SelectGroup>\n {normalizedOptions.map((option) => (\n <baseui.SelectItem\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n >\n <div className=\"flex w-full items-center gap-2\">\n {!!option.icon && (\n <span className=\"w-4 h-4 shrink-0 flex items-center justify-center self-start mt-0.5\">\n {option.icon}\n </span>\n )}\n <div className=\"flex flex-col min-w-0 text-left flex-1\">\n <Text tag=\"span\" weight=\"medium\">{option.label}</Text>\n {!!option.description && (\n <Text tag=\"span\" size=\"xs\" type=\"secondary\" lineHeight=\"tight\" className=\"mt-0.5 line-clamp-2\">\n {option.description}\n </Text>\n )}\n </div>\n </div>\n </baseui.SelectItem>\n ))}\n </baseui.SelectGroup>\n </baseui.SelectContent>\n </baseui.Select>\n );\n }\n);\n\nRichSelect.displayName = 'RichSelect';\n","import { useState, useEffect, useCallback } from 'react';\nimport * as baseui from '@/components/ui/select';\nimport { Label, Text } from '@/components/typography';\nimport { useStrings, type StringsProp } from '@/lib/strings';\nimport { useFormsConfig, type FormControlSize } from '@/lib/ui-provider';\nimport { cn } from '@/lib/utils';\nimport { formControlSizeClasses, resolveFormControlSize } from '../form-sizing';\nimport { DecimalInput } from './decimal-input';\n\nexport interface DimensionObject {\n width?: string;\n height?: string;\n depth?: string;\n}\n\nexport type DimensionValue = string | DimensionObject;\n\nexport interface DimensionsInputStrings {\n width: string;\n height: string;\n depth: string;\n unit: string;\n widthPlaceholder: string;\n heightPlaceholder: string;\n depthPlaceholder: string;\n}\n\nexport const defaultDimensionsInputStrings: DimensionsInputStrings = {\n width: 'Width',\n height: 'Height',\n depth: 'Depth',\n unit: 'Unit',\n widthPlaceholder: '0.00',\n heightPlaceholder: '0.00',\n depthPlaceholder: '0.00',\n};\n\nexport interface DimensionsInputProps {\n /** Current value (string \"WxHxD\" or object { width, height, depth }) */\n value?: DimensionValue;\n\n /** Default value for uncontrolled mode */\n defaultValue?: DimensionValue;\n\n /** Format type: 'string' for \"WxHxD\" or 'object' for { width, height, depth } */\n format?: 'string' | 'object';\n\n /** Current unit value */\n unit?: 'g' | 'kg';\n\n /** Default unit for uncontrolled mode */\n defaultUnit?: 'g' | 'kg';\n\n /** Label for width input (sub-label) */\n widthLabel?: string;\n\n /** Label for height input (sub-label) */\n heightLabel?: string;\n\n /** Label for depth/length input (sub-label) */\n depthLabel?: string;\n\n /** Label for unit selector (sub-label) */\n unitLabel?: string;\n\n /** Placeholder for the unit select */\n unitPlaceholder?: string;\n\n /** Placeholder for width */\n widthPlaceholder?: string;\n\n /** Placeholder for height */\n heightPlaceholder?: string;\n\n /** Placeholder for depth */\n depthPlaceholder?: string;\n\n /** Form control size — flows through `useFormsConfig().defaultControlSize`. */\n size?: FormControlSize;\n\n /** Callback when value changes */\n onChange?: (e: { target: { value: DimensionValue } }) => void;\n\n /** Callback when unit changes */\n onUnitChange?: (unit: 'g' | 'kg') => void;\n\n /** Number of decimal places. Defaults to 2 */\n decimalPlaces?: number;\n\n /** Minimum value for all dimensions */\n min?: number;\n\n /** Maximum value for all dimensions */\n max?: number;\n\n /** Show unit selector. Defaults to true */\n showUnitSelector?: boolean;\n\n /** Disable unit selector */\n disableUnitSelector?: boolean;\n\n /** Layout orientation. Defaults to 'horizontal' */\n layout?: 'horizontal' | 'vertical';\n\n /** Error state for styling (passed from FormField) */\n invalid?: boolean;\n\n /** Disabled state */\n disabled?: boolean;\n\n /** Additional CSS classes */\n className?: string;\n\n /** String overrides merged over defaults. Direct props (e.g. `widthLabel`) win over `strings` keys. */\n strings?: StringsProp<DimensionsInputStrings>;\n}\n\n// Unit options\nconst UNIT_OPTIONS = [\n { value: 'g', label: 'g (grams)' },\n { value: 'kg', label: 'kg (kilograms)' },\n] as const;\n\nconst parseDimensionValue = (\n value: DimensionValue | undefined,\n format: 'string' | 'object'\n): { width: string; height: string; depth: string } => {\n if (!value) {\n return { width: '', height: '', depth: '' };\n }\n\n if (format === 'string' && typeof value === 'string') {\n const parts = value.split('x').map((p) => p.trim());\n return {\n width: parts[0] || '',\n height: parts[1] || '',\n depth: parts[2] || '',\n };\n }\n\n if (format === 'object' && typeof value === 'object') {\n return {\n width: value.width || '',\n height: value.height || '',\n depth: value.depth || '',\n };\n }\n\n return { width: '', height: '', depth: '' };\n};\n\nconst formatDimensionValue = (\n width: string,\n height: string,\n depth: string,\n format: 'string' | 'object'\n): DimensionValue => {\n if (format === 'string') {\n return `${width}x${height}x${depth}`;\n }\n return { width, height, depth };\n};\n\nexport function DimensionsInput({\n value: controlledValue,\n defaultValue,\n format = 'string',\n unit: controlledUnit,\n defaultUnit = 'g',\n widthLabel,\n heightLabel,\n depthLabel,\n unitLabel,\n unitPlaceholder,\n widthPlaceholder,\n heightPlaceholder,\n depthPlaceholder,\n onChange,\n onUnitChange,\n decimalPlaces = 2,\n min = 0,\n max,\n showUnitSelector = true,\n disableUnitSelector = false,\n layout = 'horizontal',\n invalid,\n disabled = false,\n className,\n size: sizeProp,\n strings: stringsProp,\n}: DimensionsInputProps) {\n const { defaultControlSize } = useFormsConfig();\n const size = resolveFormControlSize(sizeProp, defaultControlSize);\n const strings = useStrings(defaultDimensionsInputStrings, stringsProp);\n const resolvedWidthLabel = widthLabel ?? strings.width;\n const resolvedHeightLabel = heightLabel ?? strings.height;\n const resolvedDepthLabel = depthLabel ?? strings.depth;\n const resolvedUnitPlaceholder = unitPlaceholder ?? strings.unit;\n const resolvedWidthPlaceholder = widthPlaceholder ?? strings.widthPlaceholder;\n const resolvedHeightPlaceholder = heightPlaceholder ?? strings.heightPlaceholder;\n const resolvedDepthPlaceholder = depthPlaceholder ?? strings.depthPlaceholder;\n const shouldShowInlineLabels = layout === 'horizontal';\n const shouldShowVerticalLabels = layout === 'vertical';\n const shouldShowUnitSelector = showUnitSelector === true;\n const hasUnitLabel = (unitLabel ?? '').length > 0;\n const widthFieldLabel = shouldShowVerticalLabels ? resolvedWidthLabel : '';\n const heightFieldLabel = shouldShowVerticalLabels ? resolvedHeightLabel : '';\n const depthFieldLabel = shouldShowVerticalLabels ? resolvedDepthLabel : '';\n\n // Determine if value is controlled\n const isValueControlled = controlledValue !== undefined;\n const isUnitControlled = controlledUnit !== undefined;\n\n // Parse initial value\n const initialParsed = parseDimensionValue(\n isValueControlled ? controlledValue : defaultValue,\n format\n );\n\n // Internal state for uncontrolled mode\n const [internalWidth, setInternalWidth] = useState(initialParsed.width);\n const [internalHeight, setInternalHeight] = useState(initialParsed.height);\n const [internalDepth, setInternalDepth] = useState(initialParsed.depth);\n const [internalUnit, setInternalUnit] = useState(controlledUnit || defaultUnit);\n\n // Get current values\n const parsedValue = parseDimensionValue(controlledValue, format);\n const widthValue = isValueControlled ? parsedValue.width : internalWidth;\n const heightValue = isValueControlled ? parsedValue.height : internalHeight;\n const depthValue = isValueControlled ? parsedValue.depth : internalDepth;\n const unitValue = isUnitControlled ? controlledUnit : internalUnit;\n\n // Sync internal state when controlled value changes\n useEffect(() => {\n if (isValueControlled) {\n const parsed = parseDimensionValue(controlledValue, format);\n setInternalWidth(parsed.width);\n setInternalHeight(parsed.height);\n setInternalDepth(parsed.depth);\n }\n }, [controlledValue, format, isValueControlled]);\n\n // Handle dimension changes\n const handleDimensionChange = useCallback(\n (dimension: 'width' | 'height' | 'depth', newValue: string) => {\n let updatedWidth = widthValue;\n let updatedHeight = heightValue;\n let updatedDepth = depthValue;\n\n if (dimension === 'width') updatedWidth = newValue;\n if (dimension === 'height') updatedHeight = newValue;\n if (dimension === 'depth') updatedDepth = newValue;\n\n if (!isValueControlled) {\n setInternalWidth(updatedWidth);\n setInternalHeight(updatedHeight);\n setInternalDepth(updatedDepth);\n }\n\n const formattedValue = formatDimensionValue(updatedWidth, updatedHeight, updatedDepth, format);\n onChange?.({ target: { value: formattedValue } });\n },\n [widthValue, heightValue, depthValue, isValueControlled, format, onChange]\n );\n\n const handleUnitChange = useCallback(\n (newUnit: string | null) => {\n if (newUnit === null) return;\n const typedUnit = newUnit as 'g' | 'kg';\n if (!isUnitControlled) {\n setInternalUnit(typedUnit);\n }\n onUnitChange?.(typedUnit);\n },\n [isUnitControlled, onUnitChange]\n );\n\n const unitSelector = (\n <div className=\"space-y-2\">\n {!!hasUnitLabel && <Label className=\"leading-6\">{unitLabel}</Label>}\n <baseui.Select\n value={unitValue}\n onValueChange={(value) => handleUnitChange(value)}\n disabled={disabled || disableUnitSelector}\n >\n <baseui.SelectTrigger\n aria-invalid={invalid || undefined}\n className={cn(\n 'border-input bg-transparent !shadow-none',\n formControlSizeClasses[size],\n 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',\n 'w-32',\n disabled && 'opacity-50 cursor-not-allowed'\n )}\n >\n <baseui.SelectValue placeholder={resolvedUnitPlaceholder} />\n </baseui.SelectTrigger>\n <baseui.SelectContent>\n <baseui.SelectGroup>\n {UNIT_OPTIONS.map((unit) => (\n <baseui.SelectItem key={unit.value} value={unit.value}>\n {unit.label}\n </baseui.SelectItem>\n ))}\n </baseui.SelectGroup>\n </baseui.SelectContent>\n </baseui.Select>\n </div>\n );\n\n return (\n <div className={cn('dimensions-input--component', 'space-y-2', className)}>\n {/* Dimensions Inputs */}\n <div\n className={cn(\n 'flex gap-2',\n layout === 'vertical' ? 'flex-col' : 'flex-row items-start'\n )}\n >\n {/* Width */}\n <div className=\"flex-1 space-y-1\">\n {!!shouldShowVerticalLabels && !!widthFieldLabel && <Label>{widthFieldLabel}</Label>}\n <DecimalInput\n size={size}\n value={widthValue}\n onChange={(e) => handleDimensionChange('width', e.target.value)}\n placeholder={resolvedWidthPlaceholder}\n decimalPlaces={decimalPlaces}\n min={min}\n max={max}\n disabled={disabled}\n invalid={invalid}\n aria-label={resolvedWidthLabel}\n />\n {!!shouldShowInlineLabels && (\n <Text size=\"xs\" type=\"secondary\" className=\"text-center\">\n {resolvedWidthLabel}\n </Text>\n )}\n </div>\n\n {/* Separator */}\n {layout === 'horizontal' && (\n <div className=\"flex items-center pt-2\">\n <Text tag=\"span\" type=\"secondary\">×</Text>\n </div>\n )}\n\n {/* Height */}\n <div className=\"flex-1 space-y-1\">\n {!!shouldShowVerticalLabels && !!heightFieldLabel && <Label>{heightFieldLabel}</Label>}\n <DecimalInput\n size={size}\n value={heightValue}\n onChange={(e) => handleDimensionChange('height', e.target.value)}\n placeholder={resolvedHeightPlaceholder}\n decimalPlaces={decimalPlaces}\n min={min}\n max={max}\n disabled={disabled}\n invalid={invalid}\n aria-label={resolvedHeightLabel}\n />\n {!!shouldShowInlineLabels && (\n <Text size=\"xs\" type=\"secondary\" className=\"text-center\">\n {resolvedHeightLabel}\n </Text>\n )}\n </div>\n\n {/* Separator */}\n {layout === 'horizontal' && (\n <div className=\"flex items-center pt-2\">\n <Text tag=\"span\" type=\"secondary\">×</Text>\n </div>\n )}\n\n {/* Depth */}\n <div className=\"flex-1 space-y-1\">\n {!!shouldShowVerticalLabels && !!depthFieldLabel && <Label>{depthFieldLabel}</Label>}\n <DecimalInput\n size={size}\n value={depthValue}\n onChange={(e) => handleDimensionChange('depth', e.target.value)}\n placeholder={resolvedDepthPlaceholder}\n decimalPlaces={decimalPlaces}\n min={min}\n max={max}\n disabled={disabled}\n invalid={invalid}\n aria-label={resolvedDepthLabel}\n />\n {!!shouldShowInlineLabels && (\n <Text size=\"xs\" type=\"secondary\" className=\"text-center\">\n {resolvedDepthLabel}\n </Text>\n )}\n </div>\n\n {/* Unit Selector */}\n {!!shouldShowUnitSelector && (\n <div className={cn(layout === 'vertical' ? 'w-full' : 'w-32 pt-0')}>\n {unitSelector}\n {!!shouldShowInlineLabels && !hasUnitLabel && (\n <Text size=\"xs\" type=\"secondary\" className=\"mt-1 text-center\">\n {resolvedUnitPlaceholder}\n </Text>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nDimensionsInput.displayName = 'DimensionsInput';\n","import * as React from 'react';\nimport { useState, useMemo, useCallback } from 'react';\nimport * as baseui from '@/components/ui/select';\nimport { Label } from '@/components/typography';\nimport { useStrings, type StringsProp } from '@/lib/strings';\nimport { useFormsConfig, type FormControlSize } from '@/lib/ui-provider';\nimport { cn } from '@/lib/utils';\nimport { formControlSizeClasses, resolveFormControlSize } from '../form-sizing';\nimport { DecimalInput } from './decimal-input';\n\nexport type WeightUnit = 'g' | 'kg' | 'lb' | 'oz';\n\nexport interface WeightInputStrings {\n /** Above-field label for the unit selector. Empty string hides it. */\n unitLabel: string;\n /** Placeholder shown in the unit selector. */\n unitPlaceholder: string;\n}\n\nexport const defaultWeightInputStrings: WeightInputStrings = {\n unitLabel: '',\n unitPlaceholder: '',\n};\n\nexport interface WeightInputProps {\n /** Controlled value */\n value?: string;\n\n /** Default value for uncontrolled mode */\n defaultValue?: string;\n\n /** Current unit */\n unit?: WeightUnit;\n\n /** Default unit for uncontrolled mode */\n defaultUnit?: WeightUnit;\n\n /** Value change handler */\n onChange?: (e: { target: { value: string } }) => void;\n\n /** Unit change handler */\n onUnitChange?: (unit: WeightUnit) => void;\n\n /** Number of decimal places */\n decimalPlaces?: number;\n\n /** Minimum value */\n min?: number;\n\n /** Maximum value */\n max?: number;\n\n /** Show unit selector */\n showUnitSelector?: boolean;\n\n /** Disable unit selector */\n disableUnitSelector?: boolean;\n\n /** @deprecated Use `strings.unitLabel`. */\n unitLabel?: string;\n\n /** @deprecated Use `strings.unitPlaceholder`. */\n unitPlaceholder?: string;\n\n /** Override default strings (unit selector label + placeholder). */\n strings?: StringsProp<WeightInputStrings>;\n\n /** Width of unit selector */\n unitWidth?: string;\n\n /** Error state for styling (passed from FormField) */\n invalid?: boolean;\n\n /** Disabled state */\n disabled?: boolean;\n\n /** Form control size — flows through `useFormsConfig().defaultControlSize`. */\n size?: FormControlSize;\n\n /** Additional class names */\n className?: string;\n}\n\nconst UNIT_OPTIONS: Array<{ value: WeightUnit; label: string }> = [\n { value: 'g', label: 'g' },\n { value: 'kg', label: 'kg' },\n { value: 'lb', label: 'lb' },\n { value: 'oz', label: 'oz' },\n];\n\nexport function WeightInput({\n value: controlledValue,\n defaultValue,\n unit: controlledUnit,\n defaultUnit = 'g',\n onChange,\n onUnitChange,\n decimalPlaces = 2,\n min = 0,\n max,\n showUnitSelector = true,\n disableUnitSelector = false,\n unitLabel,\n unitPlaceholder,\n unitWidth = 'w-24',\n strings: stringsProp,\n invalid,\n disabled = false,\n size: sizeProp,\n className,\n}: WeightInputProps) {\n const { defaultControlSize } = useFormsConfig();\n const size = resolveFormControlSize(sizeProp, defaultControlSize);\n const strings = useStrings(defaultWeightInputStrings, {\n ...(unitLabel !== undefined ? { unitLabel } : {}),\n ...(unitPlaceholder !== undefined ? { unitPlaceholder } : {}),\n ...stringsProp,\n });\n const isValueControlled = controlledValue !== undefined;\n const isUnitControlled = controlledUnit !== undefined;\n\n const [internalValue, setInternalValue] = useState(defaultValue ?? '');\n const [internalUnit, setInternalUnit] = useState<WeightUnit>(controlledUnit ?? defaultUnit);\n\n const value = isValueControlled ? controlledValue ?? '' : internalValue;\n const unit = isUnitControlled ? controlledUnit ?? defaultUnit : internalUnit;\n\n const handleValueChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isValueControlled) {\n setInternalValue(e.target.value);\n }\n onChange?.({ target: { value: e.target.value } });\n },\n [isValueControlled, onChange]\n );\n\n const handleUnitChange = useCallback(\n (nextUnit: string | null) => {\n if (nextUnit === null) return;\n const weightUnit = nextUnit as WeightUnit;\n if (!isUnitControlled) {\n setInternalUnit(weightUnit);\n }\n onUnitChange?.(weightUnit);\n },\n [isUnitControlled, onUnitChange]\n );\n\n const unitOptions = useMemo(() => UNIT_OPTIONS, []);\n const hasUnitLabel = strings.unitLabel !== '';\n\n return (\n <div className={cn('weight-input--component', 'flex items-start gap-2', className)}>\n <div className=\"flex-1\">\n <DecimalInput\n size={size}\n value={value}\n onChange={handleValueChange}\n decimalPlaces={decimalPlaces}\n allowNegative={false}\n min={min}\n max={max}\n disabled={disabled}\n invalid={invalid}\n />\n </div>\n {!!showUnitSelector && (\n <div className=\"space-y-2\">\n {!!hasUnitLabel && <Label className=\"leading-6\">{strings.unitLabel}</Label>}\n <baseui.Select value={unit} onValueChange={(value) => handleUnitChange(value)} disabled={disabled || disableUnitSelector}>\n <baseui.SelectTrigger\n aria-invalid={invalid || undefined}\n className={cn(\n 'border-input bg-transparent !shadow-none',\n formControlSizeClasses[size],\n 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',\n (disabled || disableUnitSelector) && 'opacity-50 cursor-not-allowed',\n unitWidth\n )}\n >\n <baseui.SelectValue placeholder={strings.unitPlaceholder || undefined} />\n </baseui.SelectTrigger>\n <baseui.SelectContent>\n <baseui.SelectGroup>\n {unitOptions.map((option) => (\n <baseui.SelectItem key={option.value} value={option.value}>\n {option.label}\n </baseui.SelectItem>\n ))}\n </baseui.SelectGroup>\n </baseui.SelectContent>\n </baseui.Select>\n </div>\n )}\n </div>\n );\n}\n\nWeightInput.displayName = 'WeightInput';\n","import { useEffect, useMemo, useState, useCallback } from 'react';\nimport { Label, TextLink } from '@/components/typography';\nimport { useStrings, type StringsProp } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\nimport { DecimalInput } from './decimal-input';\n\nexport interface CoordinatesObjectValue {\n lat?: string;\n lng?: string;\n}\n\nexport type CoordinatesValue = string | CoordinatesObjectValue;\n\nexport interface CoordinatesInputStrings {\n /** Above-field label for the latitude input. Empty string hides it. */\n latLabel: string;\n /** Above-field label for the longitude input. Empty string hides it. */\n lngLabel: string;\n /** Placeholder shown in the latitude input. */\n latPlaceholder: string;\n /** Placeholder shown in the longitude input. */\n lngPlaceholder: string;\n /** Anchor text for the Google Maps preview link. Empty string hides it. */\n previewLinkLabel: string;\n}\n\nexport const defaultCoordinatesInputStrings: CoordinatesInputStrings = {\n latLabel: '',\n lngLabel: '',\n latPlaceholder: '',\n lngPlaceholder: '',\n previewLinkLabel: '',\n};\n\nexport interface CoordinatesInputProps {\n /** Controlled value */\n value?: CoordinatesValue;\n\n /** Default value for uncontrolled mode */\n defaultValue?: CoordinatesValue;\n\n /** Output format */\n format?: 'string' | 'object';\n\n /** Change handler */\n onChange?: (e: { target: { value: CoordinatesValue } }) => void;\n\n /** @deprecated Use `strings.latLabel`. */\n latLabel?: string;\n\n /** @deprecated Use `strings.lngLabel`. */\n lngLabel?: string;\n\n /** @deprecated Use `strings.latPlaceholder`. */\n latPlaceholder?: string;\n\n /** @deprecated Use `strings.lngPlaceholder`. */\n lngPlaceholder?: string;\n\n /** Number of decimal places */\n decimalPlaces?: number;\n\n /** Show preview link to Google Maps */\n showPreviewLink?: boolean;\n\n /** @deprecated Use `strings.previewLinkLabel`. */\n previewLinkLabel?: string;\n\n /** Override default strings (labels + placeholders + preview link). */\n strings?: StringsProp<CoordinatesInputStrings>;\n\n /** Error state for styling (passed from FormField) */\n invalid?: boolean;\n\n /** Additional class names */\n className?: string;\n\n /** Disabled state */\n disabled?: boolean;\n}\n\nconst parseValue = (\n value: CoordinatesValue | undefined,\n format: 'string' | 'object'\n): { lat: string; lng: string } => {\n if (!value) {\n return { lat: '', lng: '' };\n }\n\n if (format === 'string' && typeof value === 'string') {\n const [lat, lng] = value.split(',').map((part) => part.trim());\n return { lat: lat ?? '', lng: lng ?? '' };\n }\n\n if (format === 'object' && typeof value === 'object') {\n return { lat: value.lat ?? '', lng: value.lng ?? '' };\n }\n\n return { lat: '', lng: '' };\n};\n\nconst formatValue = (lat: string, lng: string, format: 'string' | 'object'): CoordinatesValue => {\n if (format === 'string') {\n return `${lat},${lng}`;\n }\n return { lat, lng };\n};\n\nconst isFiniteNumberInRange = (value: string, min: number, max: number): boolean => {\n if (!value) return false;\n const num = Number(value);\n return Number.isFinite(num) && num >= min && num <= max;\n};\n\nexport function CoordinatesInput({\n value: controlledValue,\n defaultValue,\n format = 'object',\n onChange,\n latLabel,\n lngLabel,\n latPlaceholder,\n lngPlaceholder,\n decimalPlaces = 6,\n showPreviewLink = true,\n previewLinkLabel,\n strings: stringsProp,\n invalid,\n className,\n disabled,\n}: CoordinatesInputProps) {\n const strings = useStrings(defaultCoordinatesInputStrings, {\n ...(latLabel !== undefined ? { latLabel } : {}),\n ...(lngLabel !== undefined ? { lngLabel } : {}),\n ...(latPlaceholder !== undefined ? { latPlaceholder } : {}),\n ...(lngPlaceholder !== undefined ? { lngPlaceholder } : {}),\n ...(previewLinkLabel !== undefined ? { previewLinkLabel } : {}),\n ...stringsProp,\n });\n const isControlled = controlledValue !== undefined;\n\n const initialParsed = parseValue(isControlled ? controlledValue : defaultValue, format);\n const [internalLat, setInternalLat] = useState(initialParsed.lat);\n const [internalLng, setInternalLng] = useState(initialParsed.lng);\n\n const parsedControlled = parseValue(controlledValue, format);\n const lat = isControlled ? parsedControlled.lat : internalLat;\n const lng = isControlled ? parsedControlled.lng : internalLng;\n\n useEffect(() => {\n if (isControlled) {\n setInternalLat(parsedControlled.lat);\n setInternalLng(parsedControlled.lng);\n }\n }, [isControlled, parsedControlled.lat, parsedControlled.lng]);\n\n const update = useCallback(\n (nextLat: string, nextLng: string) => {\n if (!isControlled) {\n setInternalLat(nextLat);\n setInternalLng(nextLng);\n }\n\n onChange?.({ target: { value: formatValue(nextLat, nextLng, format) } });\n },\n [isControlled, onChange, format]\n );\n\n const mapUrl = useMemo(() => {\n const hasValidLat = isFiniteNumberInRange(lat, -90, 90);\n const hasValidLng = isFiniteNumberInRange(lng, -180, 180);\n if (!hasValidLat || !hasValidLng) return null;\n return `https://www.google.com/maps?q=${encodeURIComponent(`${lat},${lng}`)}`;\n }, [lat, lng]);\n\n return (\n <div className={cn('coordinates-input--component', 'space-y-3', className)}>\n <div className=\"grid grid-cols-1 gap-3 md:grid-cols-2\">\n <div className=\"space-y-2\">\n {!!strings.latLabel && <Label>{strings.latLabel}</Label>}\n <DecimalInput\n placeholder={strings.latPlaceholder || undefined}\n value={lat}\n onChange={(e) => update(e.target.value, lng)}\n decimalPlaces={decimalPlaces}\n allowNegative\n min={-90}\n max={90}\n invalid={invalid}\n disabled={disabled}\n />\n </div>\n <div className=\"space-y-2\">\n {!!strings.lngLabel && <Label>{strings.lngLabel}</Label>}\n <DecimalInput\n placeholder={strings.lngPlaceholder || undefined}\n value={lng}\n onChange={(e) => update(lat, e.target.value)}\n decimalPlaces={decimalPlaces}\n allowNegative\n min={-180}\n max={180}\n invalid={invalid}\n disabled={disabled}\n />\n </div>\n </div>\n\n {!!showPreviewLink && !!mapUrl && !!strings.previewLinkLabel && (\n <TextLink href={mapUrl} type=\"secondary\" underline={false}>\n {strings.previewLinkLabel}\n </TextLink>\n )}\n </div>\n );\n}\n\nCoordinatesInput.displayName = 'CoordinatesInput';\n","import { useCallback } from 'react';\nimport { DatePicker } from '@/components/base/date-pickers/date-picker';\nimport type { DateOutput } from '@/components/base/date-pickers/datepicker.types';\n\nexport interface DateTimeInputProps {\n /** Controlled value (ISO string) */\n value?: string;\n\n /** Change handler */\n onChange?: (value: string | undefined) => void;\n\n /** Placeholder text */\n placeholder?: string;\n\n /** Display format for the date */\n readableFormat?: string;\n\n /** Step for time selection in minutes */\n stepMinutes?: number;\n\n /** Use modal for picker */\n modal?: boolean;\n\n /** Error state for styling (passed from FormField) */\n invalid?: boolean;\n\n /** Disabled state */\n disabled?: boolean;\n}\n\nexport function DateTimeInput({\n value,\n onChange,\n placeholder,\n readableFormat = 'dd-MM-yyyy HH:mm',\n stepMinutes = 30,\n modal = true,\n invalid,\n disabled,\n}: DateTimeInputProps) {\n const dateValue = value ? new Date(value) : undefined;\n\tconst errorValue = invalid ? ' ' : undefined;\n\n const handleChange = useCallback(\n (output: DateOutput) => {\n onChange?.(output.date ? output.date.toISOString() : undefined);\n },\n [onChange]\n );\n\n return (\n <DatePicker className=\"date-time-input--component\"\n mode=\"single\"\n disabled={disabled}\n error={errorValue}\n placeholder={placeholder}\n value={dateValue}\n onChange={handleChange}\n readableFormat={readableFormat}\n withTime={{ enabled: true, format: '24', step: stepMinutes }}\n modal={modal}\n />\n );\n}\n\nDateTimeInput.displayName = 'DateTimeInput';\n","import { Clock } from 'lucide-react';\nimport * as React from 'react';\nimport { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { Button } from '@/components/base/buttons';\nimport { PICKER_TRIGGER_CHROME } from '@/components/base/date-pickers/date-picker';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/base/popover';\nimport { Label, Text } from '@/components/typography';\nimport { useStrings, type StringsProp } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\nimport { Input } from './input';\n\nexport interface TimePickerStrings {\n placeholder: string;\n dialogTitle: string;\n hours: string;\n minutes: string;\n seconds: string;\n now: string;\n done: string;\n hoursPlaceholder: string;\n minutesPlaceholder: string;\n secondsPlaceholder: string;\n am: string;\n pm: string;\n}\n\nexport const defaultTimePickerStrings: TimePickerStrings = {\n placeholder: 'Select time',\n dialogTitle: 'Select Time',\n hours: 'Hours',\n minutes: 'Minutes',\n seconds: 'Seconds',\n now: 'Now',\n done: 'Done',\n hoursPlaceholder: 'HH',\n minutesPlaceholder: 'MM',\n secondsPlaceholder: 'SS',\n am: 'AM',\n pm: 'PM',\n};\n\nconst pad2 = (n: number) => String(n).padStart(2, '0');\n\nconst toNumber = (value: string): number | null => {\n const trimmed = value.trim();\n if (trimmed === '') return null;\n const parsed = Number.parseInt(trimmed, 10);\n return Number.isFinite(parsed) ? parsed : null;\n};\n\nconst clamp = (value: number, min: number, max: number): number => Math.min(Math.max(value, min), max);\n\nconst sanitize2 = (value: string): string => (value ?? '').replace(/\\D/g, '').slice(0, 2);\n\nconst snapMinutes = (minutes: number, step: number): number => {\n if (!Number.isFinite(step) || step <= 0) return minutes;\n if (step === 1) return minutes;\n\n const remainder = minutes % step;\n const threshold = Math.max(1, Math.floor(step * 0.8));\n const shouldRoundUp = remainder >= threshold;\n const base = minutes - remainder;\n const snapped = shouldRoundUp ? base + step : base;\n return snapped >= 60 ? 0 : snapped;\n};\n\nexport interface TimePickerProps {\n /** Additional class names */\n className?: string;\n\n /** Current value in HH:MM:SS format */\n value?: string;\n\n /** Change handler */\n onChange?: (value: string) => void;\n\n /** Error state for styling (passed from FormField) */\n invalid?: boolean;\n\n /** Disabled state */\n disabled?: boolean;\n\n /** @deprecated Use `strings.placeholder` instead. */\n placeholder?: string;\n\n /** @deprecated Use `strings.dialogTitle` instead. */\n dialogTitle?: string;\n\n /** @deprecated Use `strings.hours` instead. */\n hoursLabel?: string;\n\n /** @deprecated Use `strings.minutes` instead. */\n minutesLabel?: string;\n\n /** @deprecated Use `strings.seconds` instead. */\n secondsLabel?: string;\n\n /** @deprecated Use `strings.now` instead. */\n nowLabel?: string;\n\n /** @deprecated Use `strings.done` instead. */\n doneLabel?: string;\n\n /** Time format (12 or 24 hour) */\n format?: '12' | '24';\n\n /** Minute step increment */\n minuteStep?: number;\n\n /** Show seconds input */\n showSeconds?: boolean;\n\n /** String overrides merged over defaults. */\n strings?: StringsProp<TimePickerStrings>;\n}\n\n/**\n * TimePicker - Time selection with popover dialog\n */\nexport function TimePicker({\n className,\n value = '00:00:00',\n onChange,\n invalid,\n disabled,\n placeholder,\n dialogTitle,\n hoursLabel,\n minutesLabel,\n secondsLabel,\n nowLabel,\n doneLabel,\n format = '24',\n minuteStep = 5,\n showSeconds = true,\n strings: stringsProp,\n}: TimePickerProps) {\n const triggerId = useId();\n const strings = useStrings(defaultTimePickerStrings, {\n ...(placeholder !== undefined ? { placeholder } : {}),\n ...(dialogTitle !== undefined ? { dialogTitle } : {}),\n ...(hoursLabel !== undefined ? { hours: hoursLabel } : {}),\n ...(minutesLabel !== undefined ? { minutes: minutesLabel } : {}),\n ...(secondsLabel !== undefined ? { seconds: secondsLabel } : {}),\n ...(nowLabel !== undefined ? { now: nowLabel } : {}),\n ...(doneLabel !== undefined ? { done: doneLabel } : {}),\n ...(stringsProp ?? {}),\n });\n\n const normalizeHoursSegment = useCallback(\n (raw: string | undefined, currentMeridiem: 'AM' | 'PM'): { hours: string; meridiem: 'AM' | 'PM' } => {\n const parsed = toNumber(raw ?? '') ?? 0;\n\n if (format === '12') {\n const hours12 = parsed > 12 ? 12 : clamp(parsed === 0 ? 12 : parsed, 1, 12);\n return { hours: pad2(hours12), meridiem: currentMeridiem };\n }\n\n const hours24 = parsed > 24 ? 24 : clamp(parsed, 0, 24);\n return { hours: pad2(hours24), meridiem: currentMeridiem };\n },\n [format]\n );\n\n const normalizeMinutesSegment = useCallback(\n (raw: string | undefined): string => {\n let minutesParsed = toNumber(raw ?? '') ?? 0;\n if (minutesParsed > 59) minutesParsed = 0;\n minutesParsed = snapMinutes(clamp(minutesParsed, 0, 59), minuteStep);\n return pad2(minutesParsed);\n },\n [minuteStep]\n );\n\n const normalizeSecondsSegment = useCallback((raw: string | undefined): string => {\n let secondsParsed = toNumber(raw ?? '') ?? 0;\n if (secondsParsed > 59) secondsParsed = 0;\n secondsParsed = clamp(secondsParsed, 0, 59);\n return pad2(secondsParsed);\n }, []);\n\n const normalizeTime = useCallback(\n (hoursRaw: string, minutesRaw: string, secondsRaw: string, meridiem: 'AM' | 'PM'): string => {\n const rawHours = toNumber(hoursRaw) ?? 0;\n\n let minutesParsed = toNumber(minutesRaw) ?? 0;\n if (minutesParsed > 59) minutesParsed = 0;\n minutesParsed = snapMinutes(clamp(minutesParsed, 0, 59), minuteStep);\n\n let secondsParsed = showSeconds ? (toNumber(secondsRaw) ?? 0) : 0;\n if (secondsParsed > 59) secondsParsed = 0;\n secondsParsed = showSeconds ? clamp(secondsParsed, 0, 59) : 0;\n\n if (format === '12') {\n const hours12 = rawHours > 12 ? 12 : clamp(rawHours === 0 ? 12 : rawHours, 1, 12);\n const hours24 = meridiem === 'AM' ? (hours12 === 12 ? 0 : hours12) : hours12 === 12 ? 12 : hours12 + 12;\n\n return `${pad2(hours24)}:${pad2(minutesParsed)}:${pad2(secondsParsed)}`;\n }\n\n const cappedHours = rawHours > 24 ? 24 : clamp(rawHours, 0, 24);\n return `${pad2(cappedHours)}:${pad2(minutesParsed)}:${pad2(secondsParsed)}`;\n },\n [format, minuteStep, showSeconds]\n );\n\n const parseTime = useCallback(\n (timeString: string) => {\n const [hours = '00', minutes = '00', seconds = '00'] = (timeString ?? '').split(':');\n const normalizedSeconds = showSeconds ? seconds : '00';\n return {\n hours: sanitize2(hours),\n minutes: sanitize2(minutes),\n seconds: sanitize2(normalizedSeconds),\n };\n },\n [showSeconds]\n );\n\n const [open, setOpen] = useState(false);\n const [time, setTime] = useState(() => parseTime(value));\n const [meridiem, setMeridiem] = useState<'AM' | 'PM'>(() => {\n const [h = '00'] = (value ?? '').split(':');\n const hour = toNumber(h) ?? 0;\n return hour >= 12 ? 'PM' : 'AM';\n });\n const debounceTimers = useRef<{ hours?: number; minutes?: number; seconds?: number }>({});\n\n useEffect(() => {\n if (open) {\n return;\n }\n setTime(parseTime(value));\n const [h = '00'] = (value ?? '').split(':');\n const hour = toNumber(h) ?? 0;\n setMeridiem(hour >= 12 ? 'PM' : 'AM');\n }, [open, parseTime, value]);\n\n const handleTimeChange = (type: 'hours' | 'minutes' | 'seconds', newValue: string) => {\n const nextValue = sanitize2(newValue);\n setTime((current) => ({ ...current, [type]: nextValue }));\n\n if (debounceTimers.current[type]) {\n window.clearTimeout(debounceTimers.current[type]);\n }\n debounceTimers.current[type] = window.setTimeout(() => {\n setTime((current) => {\n const next = { ...current } as typeof current;\n\n if (type === 'hours') {\n const raw = (next.hours ?? '').trim();\n if (raw.length === 1) {\n next.hours = `0${raw}`;\n }\n if ((next.hours ?? '').trim().length === 2) {\n next.hours = normalizeHoursSegment(next.hours, meridiem).hours;\n }\n }\n\n if (type === 'minutes') {\n const raw = (next.minutes ?? '').trim();\n if (raw.length === 1) {\n next.minutes = `0${raw}`;\n }\n if ((next.minutes ?? '').trim().length === 2) {\n next.minutes = normalizeMinutesSegment(next.minutes);\n }\n }\n\n if (type === 'seconds') {\n const raw = (next.seconds ?? '').trim();\n if (raw.length === 1) {\n next.seconds = `0${raw}`;\n }\n if ((next.seconds ?? '').trim().length === 2) {\n next.seconds = normalizeSecondsSegment(next.seconds);\n }\n }\n\n const normalized = normalizeTime(next.hours, next.minutes, next.seconds, meridiem);\n onChange?.(normalized);\n\n const [h = '00', m = '00', s = '00'] = normalized.split(':');\n if (format === '12') {\n next.hours = pad2(((toNumber(h) ?? 0) % 12) || 12);\n } else {\n next.hours = h;\n }\n next.minutes = m;\n next.seconds = s;\n\n return next;\n });\n }, 400);\n };\n\n const handleBlur = (type: 'hours' | 'minutes' | 'seconds') => {\n if (debounceTimers.current[type]) {\n window.clearTimeout(debounceTimers.current[type]);\n }\n\n setTime((current) => {\n const next = { ...current } as typeof current;\n next.hours = normalizeHoursSegment(next.hours, meridiem).hours;\n next.minutes = normalizeMinutesSegment(next.minutes);\n next.seconds = normalizeSecondsSegment(next.seconds);\n\n const normalized = normalizeTime(next.hours, next.minutes, next.seconds, meridiem);\n onChange?.(normalized);\n\n const [h = '00', m = '00', s = '00'] = normalized.split(':');\n return {\n hours: format === '12' ? sanitize2(String(((toNumber(h) ?? 0) % 12) || 12)) : h,\n minutes: m,\n seconds: s,\n };\n });\n };\n\n const displayValue = useMemo(() => {\n const normalized = normalizeTime(time.hours, time.minutes, time.seconds, meridiem);\n if (!showSeconds) {\n const [h = '00', m = '00'] = normalized.split(':');\n return `${h}:${m}`;\n }\n return normalized;\n }, [meridiem, normalizeTime, showSeconds, time.hours, time.minutes, time.seconds]);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n render={(triggerProps) => (\n <Button\n {...triggerProps}\n id={triggerId}\n variant=\"secondary\"\n buttonStyle=\"outline\"\n aria-expanded={open}\n aria-invalid={invalid}\n disabled={disabled}\n className={cn(\n 'time-picker--component',\n // Shared field-style chrome (matches Input).\n PICKER_TRIGGER_CHROME,\n 'w-full justify-between text-left',\n !value && '!text-muted-foreground',\n\t\t\t\t\t\t\t\t\t\t(triggerProps as { className?: string }).className,\n className\n )}\n >\n { }\n {(triggerProps as { children?: React.ReactNode }).children}\n </Button>\n )}\n >\n <div className=\"flex items-center gap-2\">\n <Clock className=\"h-4 w-4\" />\n <span>{displayValue || strings.placeholder}</span>\n </div>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-4\" align=\"start\">\n <div className=\"space-y-4\">\n <Text tag=\"div\" weight=\"medium\" align=\"center\">{strings.dialogTitle}</Text>\n <div className=\"flex items-center gap-2\">\n <div className=\"text-center\">\n <Label size=\"xs\" className=\"text-muted-foreground\">{strings.hours}</Label>\n <Input\n inputMode=\"numeric\"\n value={time.hours}\n onChange={(e) => handleTimeChange('hours', e.target.value)}\n onFocus={(e) => e.currentTarget.select()}\n onClick={(e) => e.currentTarget.select()}\n onBlur={() => handleBlur('hours')}\n placeholder={strings.hoursPlaceholder}\n className=\"w-16 text-center\"\n />\n </div>\n <Text tag=\"div\" className=\"text-2xl\">:</Text>\n <div className=\"text-center\">\n <Label size=\"xs\" className=\"text-muted-foreground\">{strings.minutes}</Label>\n <Input\n inputMode=\"numeric\"\n value={time.minutes}\n onChange={(e) => handleTimeChange('minutes', e.target.value)}\n onFocus={(e) => e.currentTarget.select()}\n onClick={(e) => e.currentTarget.select()}\n onBlur={() => handleBlur('minutes')}\n placeholder={strings.minutesPlaceholder}\n className=\"w-16 text-center\"\n />\n </div>\n {!!showSeconds && <>\n <Text tag=\"div\" className=\"text-2xl\">:</Text>\n <div className=\"text-center\">\n <Label size=\"xs\" className=\"text-muted-foreground\">{strings.seconds}</Label>\n <Input\n inputMode=\"numeric\"\n value={time.seconds}\n onChange={(e) => handleTimeChange('seconds', e.target.value)}\n onFocus={(e) => e.currentTarget.select()}\n onClick={(e) => e.currentTarget.select()}\n onBlur={() => handleBlur('seconds')}\n placeholder={strings.secondsPlaceholder}\n className=\"w-16 text-center\"\n />\n </div>\n </>}\n\n {format === '12' && (\n <div className=\"flex items-end gap-1 pb-0.5\">\n <Button\n type=\"button\"\n variant={meridiem === 'AM' ? 'primary' : 'secondary'}\n buttonStyle={meridiem === 'AM' ? 'solid' : 'outline'}\n onClick={() => setMeridiem('AM')}\n >\n {strings.am}\n </Button>\n <Button\n type=\"button\"\n variant={meridiem === 'PM' ? 'primary' : 'secondary'}\n buttonStyle={meridiem === 'PM' ? 'solid' : 'outline'}\n onClick={() => setMeridiem('PM')}\n >\n {strings.pm}\n </Button>\n </div>\n )}\n </div>\n <div className=\"flex gap-2\">\n <Button\n variant=\"secondary\"\n buttonStyle=\"outline\"\n className=\"flex-1\"\n onClick={() => {\n const now = new Date();\n const newTime = {\n hours:\n format === '12'\n ? String((now.getHours() % 12) || 12)\n : String(now.getHours()),\n minutes: String(now.getMinutes()),\n seconds: '',\n };\n setTime(newTime);\n setMeridiem(now.getHours() >= 12 ? 'PM' : 'AM');\n onChange?.(\n normalizeTime(\n newTime.hours,\n newTime.minutes,\n newTime.seconds,\n now.getHours() >= 12 ? 'PM' : 'AM'\n )\n );\n }}\n >\n {strings.now}\n </Button>\n <Button\n variant=\"primary\"\n buttonStyle=\"solid\"\n className=\"flex-1\"\n onClick={() => {\n onChange?.(normalizeTime(time.hours, time.minutes, time.seconds, meridiem));\n setOpen(false);\n }}\n >\n {strings.done}\n </Button>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\nTimePicker.displayName = 'TimePicker';\n","import { useState, useCallback } from 'react';\n\n// Validation rule definitions for files\ntype FileValidationRules = {\n maxSize?: number; // Max file size in bytes\n minSize?: number; // Min file size in bytes\n allowedExtensions?: string[]; // e.g. ['jpg', 'png', 'pdf']\n maxFiles?: number; // Max number of files allowed\n customValidator?: (file: File) => boolean | string; // Return true if valid, string message if invalid\n};\n\n// Extended file metadata returned by the hook\nexport interface FileMeta {\n id: string;\n file: File;\n name: string;\n size: number;\n formattedSize: string;\n type: string;\n extension: string;\n lastModified: number;\n}\n\n// Hook return types\ntype UseFilesReturn = {\n files: FileMeta[];\n addFiles: (incoming: FileList | File[]) => void;\n setFiles: (incoming: FileList | File[]) => void;\n remove: (id: string) => void;\n removeAll: () => void;\n formatSize: (bytes: number) => string;\n validationErrors: Record<string, string>;\n};\n\n// Utility to format bytes into human-readable strings\nconst defaultFormatSize = (bytes: number): string => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const value = bytes / Math.pow(k, i);\n return `${value.toFixed(2)} ${sizes[i]}`;\n};\n\n// Simple unique ID generator using timestamp and incremental counter\nlet idCounter = 0;\nconst generateId = (): string => {\n const ts = Date.now().toString(36);\n const count = (idCounter++).toString(36);\n return `${ts}-${count}`;\n};\n\nexport const useFiles = (\n rules?: FileValidationRules\n): UseFilesReturn => {\n const [files, setFilesState] = useState<FileMeta[]>([]);\n const [validationErrors, setValidationErrors] = useState<Record<string, string>>({});\n\n // Format size callback\n const formatSize = useCallback(defaultFormatSize, []);\n\n // Validate a single file, return error message or null\n const validateFile = useCallback((file: File): string | null => {\n if (rules?.minSize !== undefined && file.size < rules.minSize) {\n return `Size (${defaultFormatSize(file.size)}) is smaller than minimum (${defaultFormatSize(\n rules.minSize\n )}).`;\n }\n if (rules?.maxSize !== undefined && file.size > rules.maxSize) {\n return `Size (${defaultFormatSize(file.size)}) exceeds maximum (${defaultFormatSize(\n rules.maxSize\n )}).`;\n }\n const ext = file.name.split('.').pop()?.toLowerCase() || '';\n if (\n rules?.allowedExtensions &&\n !rules.allowedExtensions.map((e) => e.toLowerCase()).includes(ext)\n ) {\n return `Extension (.${ext}) is not allowed.`;\n }\n if (rules?.customValidator) {\n const result = rules.customValidator(file);\n if (result !== true) {\n return typeof result === 'string'\n ? result\n : 'Custom validation failed.';\n }\n }\n return null;\n }, [rules]);\n\n // Add or replace files core logic\n const processFiles = useCallback(\n (incoming: FileList | File[], replace = false) => {\n const incomingList: File[] = Array.isArray(incoming) ? incoming : Array.from(incoming);\n const newValidationErrors: Record<string, string> = {};\n\n setFilesState((prevFiles) => {\n const baseFiles = replace ? [] : [...prevFiles];\n\n incomingList.forEach((file) => {\n const ext = file.name.split('.').pop()?.toLowerCase() || '';\n\n const isDuplicate = baseFiles.some(\n (f) => f.name === file.name && f.size === file.size && f.extension === ext\n );\n if (isDuplicate) {\n return;\n }\n\n const error = validateFile(file);\n if (error) {\n newValidationErrors[file.name] = error;\n return;\n }\n\n if (rules?.maxFiles !== undefined && baseFiles.length + 1 > rules.maxFiles) {\n newValidationErrors[file.name] = `Cannot exceed max files limit of ${rules.maxFiles}.`;\n return;\n }\n\n const meta: FileMeta = {\n id: generateId(),\n file,\n name: file.name,\n size: file.size,\n formattedSize: defaultFormatSize(file.size),\n type: file.type,\n extension: ext,\n lastModified: file.lastModified,\n };\n baseFiles.push(meta);\n });\n\n return baseFiles;\n });\n\n setValidationErrors(newValidationErrors);\n },\n [rules?.maxFiles, validateFile]\n );\n\n const addFiles = useCallback(\n (incoming: FileList | File[]) => processFiles(incoming, false),\n [processFiles]\n );\n\n const setFiles = useCallback(\n (incoming: FileList | File[]) => processFiles(incoming, true),\n [processFiles]\n );\n\n const remove = useCallback(\n (id: string) => {\n setFilesState((prev) => prev.filter((f) => f.id !== id));\n },\n []\n );\n\n const removeAll = useCallback(() => {\n setFilesState((prev) => (prev.length === 0 ? prev : []));\n setValidationErrors({});\n }, []);\n\n return {\n files,\n addFiles,\n setFiles,\n remove,\n removeAll,\n formatSize,\n validationErrors,\n };\n};\n","/**\n * FileUpload — drag-and-drop file picker with single or multiple-file modes,\n * validation surfacing, and a file list preview. Uses `useFiles` for client-\n * side validation (size limits, accepted types) and emits raw `File`\n * instances upward via `onChange` / `onChangeFiles`. Strings overridable.\n */\nimport { File as FileIcon, Trash2Icon, UploadIcon } from 'lucide-react';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Button } from '@/components/base/buttons';\nimport { Text } from '@/components/typography';\nimport { useFiles } from '@/hooks/use-files';\nimport { useStrings } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\n\nexport interface FileUploadStrings {\n\tinstruction: string;\n\thelper: string;\n\tbrowse: string;\n\tremove: string;\n}\n\nexport const defaultFileUploadStrings: FileUploadStrings = {\n\tinstruction: 'Drag a file here or click to browse',\n\thelper: '',\n\tbrowse: 'Browse files',\n\tremove: 'Remove',\n};\n\nexport interface FileUploadProps {\n accept?: string;\n multiple?: boolean;\n value?: File | File[];\n onChange?: (file?: File) => void;\n onChangeFiles?: (files: File[]) => void;\n disabled?: boolean;\n invalid?: boolean;\n /** Override default English strings (instruction, helper, browse, remove). */\n strings?: Partial<FileUploadStrings>;\n /** @deprecated Use `strings.instruction` instead. */\n instructionText?: string;\n /** @deprecated Use `strings.browse` instead. */\n browseButtonText?: string;\n /** @deprecated Use `strings.remove` instead. */\n removeButtonText?: string;\n /** @deprecated Use `strings.helper` instead. */\n helperText?: string;\n}\n\nfunction FileUploadImpl(\n {\n accept,\n multiple = false,\n value,\n onChange,\n onChangeFiles,\n disabled,\n invalid,\n instructionText: customInstructionText,\n browseButtonText,\n removeButtonText,\n helperText,\n strings: stringsProp,\n }: FileUploadProps,\n forwardedRef: React.ForwardedRef<HTMLInputElement>,\n) {\n const strings = useStrings(defaultFileUploadStrings, {\n ...(customInstructionText !== undefined ? { instruction: customInstructionText } : {}),\n ...(helperText !== undefined ? { helper: helperText } : {}),\n ...(browseButtonText !== undefined ? { browse: browseButtonText } : {}),\n ...(removeButtonText !== undefined ? { remove: removeButtonText } : {}),\n ...stringsProp,\n });\n const { files: managedFiles, setFiles, remove, removeAll, validationErrors } = useFiles({\n maxFiles: multiple ? undefined : 1,\n });\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n\n // Reflect controlled value into local state\n useEffect(() => {\n if (multiple) {\n if (Array.isArray(value) && value.length > 0) {\n setFiles(value);\n } else if (!value) {\n removeAll();\n }\n return;\n }\n\n if (value instanceof File) {\n setFiles([value]);\n } else if (!value) {\n removeAll();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, multiple]);\n\n const selectedSingle = managedFiles[0];\n const fileName = selectedSingle?.name ?? (value instanceof File ? value.name : '');\n const fileSize =\n selectedSingle?.formattedSize ??\n (value instanceof File ? `${Math.round((value.size / 1024) * 100) / 100} KB` : '');\n const hasMultipleFiles = multiple && managedFiles.length > 0;\n const hasSingleFile = !multiple && fileName.length > 0;\n\n const openFileDialog = useCallback(() => {\n if (!disabled) {\n inputRef.current?.click();\n }\n }, [disabled]);\n\n const handleFiles = useCallback(\n (incoming: FileList | File[]) => {\n if (!incoming || incoming.length === 0) {\n removeAll();\n if (multiple) {\n onChangeFiles?.([]);\n } else {\n onChange?.(undefined);\n }\n return;\n }\n\n const arrayFiles = Array.from(incoming as unknown as File[]);\n setFiles(incoming);\n\n if (multiple) {\n onChangeFiles?.(arrayFiles);\n } else {\n onChange?.(arrayFiles[0]);\n }\n },\n [multiple, onChange, onChangeFiles, removeAll, setFiles]\n );\n\n const handleInput = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const list = e.target.files;\n if (!list || list.length === 0) {\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n return;\n }\n\n handleFiles(list);\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n },\n [handleFiles]\n );\n\n const handleRemoveSingle = useCallback(() => {\n if (selectedSingle) {\n remove(selectedSingle.id);\n }\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n onChange?.(undefined);\n }, [onChange, remove, selectedSingle]);\n\n const handleRemoveMultiple = useCallback(\n (id: string) => {\n const remaining = managedFiles.filter((item) => item.id !== id).map((item) => item.file);\n remove(id);\n onChangeFiles?.(remaining);\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n },\n [managedFiles, onChangeFiles, remove]\n );\n\n const preventDefaults = useCallback((event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n }, []);\n\n const handleDragEnter = useCallback(\n (event: React.DragEvent) => {\n preventDefaults(event);\n if (!disabled) {\n setIsDragging(true);\n }\n },\n [disabled, preventDefaults]\n );\n\n const handleDragLeave = useCallback(\n (event: React.DragEvent) => {\n preventDefaults(event);\n setIsDragging(false);\n },\n [preventDefaults]\n );\n\n const handleDrop = useCallback(\n (event: React.DragEvent) => {\n preventDefaults(event);\n setIsDragging(false);\n\n if (disabled) {\n return;\n }\n\n const files = event.dataTransfer?.files;\n if (!files || files.length === 0) {\n return;\n }\n\n handleFiles(files);\n\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n },\n [disabled, handleFiles, preventDefaults]\n );\n\n const dragStateClasses = useMemo(() => {\n const baseClasses =\n 'relative flex min-h-[180px] flex-col items-center justify-center gap-4 rounded-xl border border-dashed px-6 py-10 text-center transition-colors duration-150';\n const defaultBorder = invalid ? 'border-destructive' : 'border-muted-foreground/60';\n const bgClasses = 'bg-muted/40';\n const hoverClasses = 'hover:border-primary hover:bg-primary/10 hover:text-primary';\n const disabledClasses = disabled\n ? 'cursor-not-allowed opacity-50 hover:border-muted-foreground/60 hover:bg-muted/40 hover:text-muted-foreground'\n : '';\n const draggingClasses = !disabled && isDragging ? 'border-primary bg-primary/15 text-primary' : '';\n\n return cn(baseClasses, defaultBorder, bgClasses, hoverClasses, disabledClasses, draggingClasses);\n }, [disabled, isDragging, invalid]);\n\n return (\n <div className={cn('file-upload--component', 'space-y-3')}>\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n className={dragStateClasses}\n onClick={(event) => {\n if (event.defaultPrevented) {\n return;\n }\n\n openFileDialog();\n }}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n openFileDialog();\n }\n }}\n onDragEnter={handleDragEnter}\n onDragOver={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n aria-disabled={disabled}\n aria-invalid={invalid || undefined}\n >\n <input\n ref={(node) => {\n inputRef.current = node;\n if (typeof forwardedRef === 'function') {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n }}\n type=\"file\"\n className=\"hidden\"\n accept={accept}\n multiple={multiple}\n onChange={handleInput}\n onClick={(event) => {\n event.stopPropagation();\n }}\n disabled={disabled}\n />\n\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-primary/15 text-primary\">\n <UploadIcon className=\"h-6 w-6\" aria-hidden=\"true\" />\n </div>\n <div className=\"space-y-1\">\n <Text weight=\"medium\">{strings.instruction}</Text>\n {!!strings.helper && (\n <Text size=\"xs\" type=\"secondary\">{strings.helper}</Text>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"secondary\"\n buttonStyle=\"outline\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n openFileDialog();\n }}\n disabled={disabled}\n >\n {strings.browse}\n </Button>\n </div>\n\n {/* Multiple files list */}\n {!!hasMultipleFiles && (\n <div className=\"space-y-2\">\n {managedFiles.map((meta) => (\n <div key={meta.id} className=\"flex items-center gap-3 border rounded-md p-3 bg-card\">\n <div className=\"shrink-0 h-10 w-10 rounded bg-muted flex items-center justify-center\">\n <FileIcon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <Text tag=\"div\" weight=\"medium\" className=\"truncate\" title={meta.name}>\n {meta.name}\n </Text>\n <Text tag=\"div\" size=\"xs\" type=\"secondary\">{meta.formattedSize}</Text>\n </div>\n <Button\n type=\"button\"\n variant=\"error\"\n buttonStyle=\"ghost\"\n size=\"xs\"\n icon={Trash2Icon}\n onClick={() => handleRemoveMultiple(meta.id)}\n >\n {strings.remove}\n </Button>\n </div>\n ))}\n </div>\n )}\n\n {/* Single file display */}\n {!!hasSingleFile && (\n <div className=\"flex items-center gap-3 border rounded-md p-3 bg-card\">\n <div className=\"shrink-0 h-10 w-10 rounded bg-muted flex items-center justify-center\">\n <FileIcon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <Text tag=\"div\" weight=\"medium\" className=\"truncate\" title={fileName}>\n {fileName}\n </Text>\n <Text tag=\"div\" size=\"xs\" type=\"secondary\">{fileSize}</Text>\n </div>\n <Button\n type=\"button\"\n variant=\"error\"\n buttonStyle=\"ghost\"\n size=\"xs\"\n icon={Trash2Icon}\n onClick={handleRemoveSingle}\n >\n {strings.remove}\n </Button>\n </div>\n )}\n\n {/* Validation errors — rendered as semantic alert rows so they\n read clearly under the dropzone instead of as a bullet list. */}\n {Object.keys(validationErrors).length > 0 && (\n <ul className=\"space-y-1.5\">\n {Object.entries(validationErrors).map(([name, err]) => (\n <li\n key={name}\n role=\"alert\"\n className=\"flex items-start gap-2 rounded-md border border-destructive/30 bg-destructive/5 px-3 py-2\"\n >\n <span aria-hidden=\"true\" className=\"mt-0.5 inline-flex size-4 shrink-0 items-center justify-center rounded-full bg-destructive/15 text-destructive\">\n <span className=\"size-1.5 rounded-full bg-destructive\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <Text size=\"xs\" weight=\"medium\" className=\"truncate text-destructive\">\n {name}\n </Text>\n <Text size=\"xs\" type=\"secondary\" className=\"text-destructive/80\">\n {err}\n </Text>\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n\nconst FileUpload = React.forwardRef<HTMLInputElement, FileUploadProps>(FileUploadImpl);\nFileUpload.displayName = 'FileUpload';\n\nexport { FileUpload };\n","/**\n * ImageUpload — preview-first image picker. Drops in a file → renders an img\n * preview with a configurable aspect ratio and fit mode. Layout can be\n * stacked (preview on top, controls below) or inline (preview alongside\n * controls). Reflects controlled `value` and reports change via `onChange`.\n * Strings overridable for i18n.\n */\nimport { ImageIcon, Trash2 } from 'lucide-react';\nimport React, { useEffect, useId, useMemo, useRef, useState, useCallback } from 'react';\nimport { Button } from '@/components/base/buttons';\nimport { Text } from '@/components/typography';\nimport { useFiles } from '@/hooks/use-files';\nimport { useStrings } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\n\nconst MAX_FILE_SIZE_MB = 2;\n\ntype ImageUploadAspectRatio = 'square' | 'standard' | 'widescreen' | 'portrait';\ntype ImageUploadLayout = 'stacked' | 'inline';\ntype ImageUploadFit = 'cover' | 'contain';\n\nconst ASPECT_RATIO_CLASSES: Record<ImageUploadAspectRatio, string> = {\n square: 'aspect-square',\n standard: 'aspect-[4/3]',\n widescreen: 'aspect-[16/9]',\n portrait: 'aspect-[9/16]',\n};\n\nexport interface ImageUploadStrings {\n select: string;\n change: string;\n remove: string;\n noSelection: string;\n keepCurrent: string;\n /** Template for the supports-text. `{ext}` is the comma-separated allowed\n * extensions; `{size}` is the max-size MB number. */\n supportsTemplate: string;\n /** Summary line when `multiple` is set and more than one file is selected.\n * Receives the count of files beyond the displayed one — e.g. `count=3`\n * for \"+ 3 more files\". Override to swap the English plural-`s` rule\n * (`'+ ' + count + ' more file' + (count === 1 ? '' : 's')`) for the\n * consumer locale. */\n moreFiles: (count: number) => string;\n}\n\nexport const defaultImageUploadStrings: ImageUploadStrings = {\n select: 'Select image',\n change: 'Change image',\n remove: 'Remove',\n noSelection: 'No file selected yet.',\n keepCurrent: 'Current image stays until you upload a new one.',\n supportsTemplate: 'Supports {ext} files up to {size} MB.',\n moreFiles: (count) => `+ ${count} more file${count === 1 ? '' : 's'}`,\n};\n\nexport interface ImageUploadProps {\n accept?: string;\n multiple?: boolean;\n value?: File;\n onChange?: (file?: File) => void;\n disabled?: boolean;\n defaultPreviewUrl?: string;\n aspectRatio?: ImageUploadAspectRatio;\n fit?: ImageUploadFit;\n maxWidth?: number | string;\n layout?: ImageUploadLayout;\n invalid?: boolean;\n /** Override default strings (button labels, helper text, supports template). */\n strings?: Partial<ImageUploadStrings>;\n /** @deprecated Use `strings.select` instead. */\n selectButtonText?: string;\n /** @deprecated Use `strings.change` instead. */\n changeButtonText?: string;\n /** @deprecated Use `strings.remove` instead. */\n removeButtonText?: string;\n}\n\nfunction ImageUploadImpl(\n {\n accept = '.png,.jpg,.jpeg,.gif,.svg',\n multiple = false,\n value,\n onChange,\n disabled,\n defaultPreviewUrl,\n aspectRatio = 'square',\n fit = 'cover',\n maxWidth,\n layout = 'stacked',\n invalid,\n selectButtonText,\n changeButtonText,\n removeButtonText,\n strings: stringsProp,\n}: ImageUploadProps,\n forwardedRef: React.ForwardedRef<HTMLInputElement>,\n) {\n const strings = useStrings(defaultImageUploadStrings, {\n ...(selectButtonText !== undefined ? { select: selectButtonText } : {}),\n ...(changeButtonText !== undefined ? { change: changeButtonText } : {}),\n ...(removeButtonText !== undefined ? { remove: removeButtonText } : {}),\n ...stringsProp,\n });\n const inputId = useId();\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const allowedExtensions = useMemo(() => {\n if (!accept) {\n return ['png', 'jpg', 'jpeg', 'gif', 'svg'];\n }\n\n const parsed = accept\n .split(',')\n .map((item) => item.trim())\n .map((item) => {\n if (!item) return null;\n if (item.startsWith('.')) {\n return item.slice(1).toLowerCase();\n }\n\n if (item.includes('/')) {\n const subtype = item.split('/')[1] ?? '';\n if (subtype === '*' || subtype.length === 0) {\n return null;\n }\n return subtype.replace(/\\+.*/, '').toLowerCase();\n }\n\n return item.toLowerCase();\n })\n .filter((ext): ext is string => Boolean(ext));\n\n if (parsed.length === 0) {\n return undefined;\n }\n\n return Array.from(new Set(parsed));\n }, [accept]);\n\n const fileRules = useMemo(\n () => ({\n maxFiles: multiple ? undefined : 1,\n allowedExtensions,\n }),\n [multiple, allowedExtensions]\n );\n\n const { files, setFiles, remove, removeAll, validationErrors } = useFiles(fileRules);\n\n // Reflect controlled value into local preview if provided\n useEffect(() => {\n if (value) {\n setFiles([value]);\n } else {\n removeAll();\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n }\n }, [value, setFiles, removeAll]);\n\n const selected = files[0];\n\tconst selectOrChangeButtonLabel = selected ? strings.change : strings.select;\n const [filePreviewUrl, setFilePreviewUrl] = useState<string | undefined>(undefined);\n\n const acceptedExtensionsLabel = useMemo(() => {\n if (!allowedExtensions || allowedExtensions.length === 0) {\n return null;\n }\n return allowedExtensions.map((ext) => ext.toUpperCase()).join(', ');\n }, [allowedExtensions]);\n\n useEffect(() => {\n const file = selected?.file ?? value;\n if (!file) {\n setFilePreviewUrl(undefined);\n return;\n }\n const url = URL.createObjectURL(file);\n setFilePreviewUrl(url);\n return () => URL.revokeObjectURL(url);\n }, [selected, value]);\n\n const previewUrl = filePreviewUrl ?? defaultPreviewUrl;\n const hasPreview = Boolean(previewUrl);\n const aspectClass = ASPECT_RATIO_CLASSES[aspectRatio] ?? ASPECT_RATIO_CLASSES.square;\n const imgFitClass = fit === 'contain' ? 'object-contain p-3' : 'object-cover';\n // Default max-width caps the preview at a sensible thumbnail size — without\n // this, an `aspect-square` preview inside a wide form column becomes a\n // huge square (`w-full` × 1:1 ratio = container width tall). Consumers\n // can override via the `maxWidth` prop.\n const computedMaxWidth = maxWidth ? (typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth) : '240px';\n const wrapperStyle = layout === 'inline' ? undefined : { maxWidth: computedMaxWidth };\n const inlinePreviewStyle =\n layout === 'inline'\n ? {\n maxWidth: maxWidth ? computedMaxWidth : '185px',\n width: '100%',\n }\n : undefined;\n\n const handleInput = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const list = e.target.files;\n if (!list || list.length === 0) {\n removeAll();\n onChange?.(undefined);\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n return;\n }\n setFiles(list);\n onChange?.(list[0]);\n },\n [removeAll, setFiles, onChange]\n );\n\n const triggerFileDialog = useCallback(() => {\n if (disabled) return;\n inputRef.current?.click();\n }, [disabled]);\n\n const handleRemove = useCallback(() => {\n if (selected) {\n remove(selected.id);\n }\n onChange?.(undefined);\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n }, [selected, remove, onChange]);\n\n return (\n <div className={cn('image-upload--component', 'space-y-3')} style={wrapperStyle}>\n <input\n ref={(node) => { inputRef.current = node; if (typeof forwardedRef === \"function\") forwardedRef(node); else if (forwardedRef) forwardedRef.current = node; }}\n id={inputId}\n type=\"file\"\n className=\"sr-only\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n onChange={handleInput}\n />\n\n <div className={cn(layout === 'inline' ? 'flex items-start gap-4' : 'space-y-3')}>\n <div\n className={cn(\n 'relative overflow-hidden rounded-md border transition-colors',\n layout === 'inline' ? 'flex-shrink-0 w-full' : 'w-full',\n aspectClass,\n hasPreview\n ? 'border-border bg-muted/20'\n : cn(\n 'border-dashed bg-background text-muted-foreground dark:bg-foreground',\n invalid ? 'border-destructive' : 'border-muted-foreground/60'\n )\n )}\n style={inlinePreviewStyle}\n >\n {hasPreview && previewUrl ? (\n <img\n src={previewUrl}\n alt={selected?.name || 'Selected image'}\n className={cn('absolute inset-0 h-full w-full', imgFitClass)}\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <ImageIcon aria-hidden className=\"h-8 w-8\" />\n </div>\n )}\n </div>\n\n <div className={cn('space-y-2', layout === 'inline' && 'flex-1 min-w-0')}>\n <div className=\"flex flex-wrap items-center gap-2\">\n\t <Button\n\t type=\"button\"\n\t variant=\"secondary\"\n\t buttonStyle=\"outline\"\n\t onClick={triggerFileDialog}\n\t disabled={disabled}\n\t >\n\t {selectOrChangeButtonLabel}\n\t </Button>\n {!selected && !!hasPreview && (\n <Text size=\"xs\" type=\"secondary\">{strings.keepCurrent}</Text>\n )}\n </div>\n\n {!!acceptedExtensionsLabel && (\n <Text size=\"xs\" type=\"secondary\">\n {strings.supportsTemplate\n .replace('{ext}', acceptedExtensionsLabel)\n .replace('{size}', String(MAX_FILE_SIZE_MB))}\n </Text>\n )}\n\n {!!selected && (\n <div className=\"space-y-1\">\n <Text weight=\"medium\" title={selected.name} className=\"truncate\">\n {selected.name}\n </Text>\n <Text size=\"xs\" type=\"secondary\">\n {selected.formattedSize}\n </Text>\n {!!multiple && files.length > 1 && (\n <Text size=\"xs\" type=\"secondary\">\n {strings.moreFiles(files.length - 1)}\n </Text>\n )}\n <Button\n type=\"button\"\n variant=\"error\"\n buttonStyle=\"ghost\"\n size=\"xs\"\n icon={Trash2}\n onClick={handleRemove}\n >\n {strings.remove}\n </Button>\n </div>\n )}\n\n {!selected && !hasPreview && (\n <Text size=\"xs\" type=\"secondary\">{strings.noSelection}</Text>\n )}\n </div>\n </div>\n\n {/* Validation errors */}\n {Object.keys(validationErrors).length > 0 && (\n <div className=\"space-y-1\">\n {Object.entries(validationErrors).map(([name, err]) => (\n <Text key={name} size=\"xs\" type=\"error\">\n {name}: {err}\n </Text>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nconst ImageUpload = React.forwardRef<HTMLInputElement, ImageUploadProps>(ImageUploadImpl);\nImageUpload.displayName = 'ImageUpload';\n\nexport { ImageUpload };\n","import * as React from 'react';\n/**\n * Dropzone — bare drag-and-drop chrome with click-to-browse fallback.\n *\n * Use this primitive directly when FileUpload / ImageUpload / MediaGallery\n * shapes don't fit (e.g. drag-to-attach into a chat composer, drag-into-grid\n * cell). Validation, file-state management, and previews are NOT included —\n * this component just surfaces a clean drop target and emits raw\n * `File` instances to the consumer via `onDrop`.\n *\n * Three sizes drive the minimum drop area, icon size, and instruction text\n * scale; `compact` is the smallest, `lg` matches a hero file picker.\n *\n * Strings overridable for i18n.\n */\nimport { useCallback, useRef, useState} from 'react';\nimport type { ReactNode, KeyboardEvent, MouseEvent, DragEvent, ChangeEvent, ForwardedRef} from 'react';\nimport { UploadCloud } from 'lucide-react';\nimport { Text } from '@/components/typography';\nimport { useStrings } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\n\nexport type DropzoneSize = 'compact' | 'base' | 'lg';\n\nexport interface DropzoneStrings {\n\tinstruction: string;\n\thelper: string;\n\tdragOver: string;\n}\n\nexport const defaultDropzoneStrings: DropzoneStrings = {\n\tinstruction: 'Drag files here or click to browse',\n\thelper: '',\n\tdragOver: 'Release to upload',\n};\n\nexport interface DropzoneProps {\n\tonDrop: (files: File[]) => void;\n\taccept?: string;\n\tmultiple?: boolean;\n\tdisabled?: boolean;\n\tinvalid?: boolean;\n\tsize?: DropzoneSize;\n\ticon?: ReactNode;\n\tclassName?: string;\n\t/** Optional content rendered below the instruction (e.g. a \"Browse\" button). */\n\tchildren?: ReactNode;\n\tstrings?: Partial<DropzoneStrings>;\n}\n\nconst SIZE_CHROME: Record<DropzoneSize, { padding: string; minH: string; iconBox: string; iconSize: string }> = {\n\tcompact: { padding: 'px-4 py-4', minH: 'min-h-[112px]', iconBox: 'h-9 w-9', iconSize: 'size-4' },\n\tbase: { padding: 'px-6 py-8', minH: 'min-h-[180px]', iconBox: 'h-12 w-12', iconSize: 'size-6' },\n\tlg: { padding: 'px-8 py-12', minH: 'min-h-[260px]', iconBox: 'h-14 w-14', iconSize: 'size-7' },\n};\n\nfunction DropzoneImpl(\n {\n\tonDrop,\n\taccept,\n\tmultiple = false,\n\tdisabled = false,\n\tinvalid = false,\n\tsize = 'base',\n\ticon,\n\tclassName,\n\tchildren,\n\tstrings: stringsProp,\n}: DropzoneProps,\n forwardedRef: ForwardedRef<HTMLInputElement>,\n) {\n\tconst strings = useStrings(defaultDropzoneStrings, stringsProp);\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\tconst [isDragging, setIsDragging] = useState(false);\n\tconst chrome = SIZE_CHROME[size];\n\n\tconst openPicker = useCallback(() => {\n\t\tif (!disabled) inputRef.current?.click();\n\t}, [disabled]);\n\n\tconst handleInput = useCallback(\n\t\t(e: ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst list = e.target.files;\n\t\t\tif (!list || list.length === 0) return;\n\t\t\tonDrop(Array.from(list));\n\t\t\tif (inputRef.current) inputRef.current.value = '';\n\t\t},\n\t\t[onDrop],\n\t);\n\n\tconst handleDragEnter = useCallback(\n\t\t(e: DragEvent<HTMLDivElement>) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tif (!disabled) setIsDragging(true);\n\t\t},\n\t\t[disabled],\n\t);\n\n\tconst handleDragLeave = useCallback((e: DragEvent<HTMLDivElement>) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\tsetIsDragging(false);\n\t}, []);\n\n\tconst handleDrop = useCallback(\n\t\t(e: DragEvent<HTMLDivElement>) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tsetIsDragging(false);\n\t\t\tif (disabled) return;\n\t\t\tconst list = e.dataTransfer?.files;\n\t\t\tif (!list || list.length === 0) return;\n\t\t\tonDrop(Array.from(list));\n\t\t},\n\t\t[disabled, onDrop],\n\t);\n\n\tconst handleKey = (e: KeyboardEvent<HTMLDivElement>) => {\n\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\te.preventDefault();\n\t\t\topenPicker();\n\t\t}\n\t};\n\n\tconst handleClick = (e: MouseEvent<HTMLDivElement>) => {\n\t\tif (e.defaultPrevented) return;\n\t\topenPicker();\n\t};\n\n\treturn (\n\t\t<div\n\t\t\trole=\"button\"\n\t\t\ttabIndex={disabled ? -1 : 0}\n\t\t\taria-disabled={disabled || undefined}\n\t\t\taria-invalid={invalid || undefined}\n\t\t\tonClick={handleClick}\n\t\t\tonKeyDown={handleKey}\n\t\t\tonDragEnter={handleDragEnter}\n\t\t\tonDragOver={handleDragEnter}\n\t\t\tonDragLeave={handleDragLeave}\n\t\t\tonDrop={handleDrop}\n\t\t\tclassName={cn('dropzone--component', \n\t\t\t\t'relative flex flex-col items-center justify-center gap-3 rounded-xl border border-dashed text-center transition-colors duration-150',\n\t\t\t\tchrome.minH,\n\t\t\t\tchrome.padding,\n\t\t\t\tinvalid ? 'border-destructive' : 'border-muted-foreground/40',\n\t\t\t\t'bg-muted/30 hover:border-primary hover:bg-primary/5 hover:text-primary',\n\t\t\t\tdisabled && 'cursor-not-allowed opacity-50 hover:border-muted-foreground/40 hover:bg-muted/30 hover:text-muted-foreground',\n\t\t\t\t!disabled && isDragging && 'border-primary bg-primary/10 text-primary',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<input\n\t\t\t\tref={(node) => { inputRef.current = node; if (typeof forwardedRef === \"function\") forwardedRef(node); else if (forwardedRef) forwardedRef.current = node; }}\n\t\t\t\ttype=\"file\"\n\t\t\t\tclassName=\"hidden\"\n\t\t\t\taccept={accept}\n\t\t\t\tmultiple={multiple}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tonChange={handleInput}\n\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t/>\n\n\t\t\t<span\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'inline-flex items-center justify-center rounded-full bg-primary/10 text-primary',\n\t\t\t\t\tchrome.iconBox,\n\t\t\t\t)}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t{icon ?? <UploadCloud className={chrome.iconSize} />}\n\t\t\t</span>\n\n\t\t\t<div className=\"space-y-1\">\n\t\t\t\t<Text size={size === 'compact' ? 'xs' : 'sm'} weight=\"medium\">\n\t\t\t\t\t{isDragging ? strings.dragOver : strings.instruction}\n\t\t\t\t</Text>\n\t\t\t\t{!!strings.helper && (\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t{strings.helper}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{!!children && (\n\t\t\t\t<div onClick={(e) => e.stopPropagation()} onKeyDown={(e) => e.stopPropagation()}>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nconst Dropzone = React.forwardRef<HTMLInputElement, DropzoneProps>(DropzoneImpl);\nDropzone.displayName = 'Dropzone';\n\nexport { Dropzone };\n","import * as React from 'react';\n/**\n * AvatarUpload — round avatar picker. Click or drag a file onto the circle to\n * upload; an X button (visible on hover) clears the selection. Honours\n * controlled `value` (a `File`), and reflects an existing `defaultPreviewUrl`\n * when no file is staged. Use for profile photos / org logos where the\n * preview is small and the only meaningful interaction is replace + clear.\n *\n * Pair with a separate \"remove from server\" handler if your data model\n * needs to delete a previously persisted image (this component only manages\n * the local staged file).\n *\n * Strings overridable for i18n.\n */\nimport { useCallback, useEffect, useId, useMemo, useRef, useState} from 'react';\nimport type { ChangeEvent, DragEvent, KeyboardEvent, ForwardedRef} from 'react';\nimport { Camera, X } from 'lucide-react';\nimport { Text } from '@/components/typography';\nimport { useFiles } from '@/hooks/use-files';\nimport { useStrings } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\n\nexport type AvatarUploadSize = 'sm' | 'base' | 'lg';\n\nexport interface AvatarUploadStrings {\n\tchange: string;\n\tremove: string;\n\thint: string;\n\tdragOver: string;\n}\n\nexport const defaultAvatarUploadStrings: AvatarUploadStrings = {\n\tchange: 'Change photo',\n\tremove: 'Remove photo',\n\thint: 'Click or drop an image',\n\tdragOver: 'Drop image to upload',\n};\n\nexport interface AvatarUploadProps {\n\tvalue?: File;\n\tonChange?: (file?: File) => void;\n\tdefaultPreviewUrl?: string;\n\taccept?: string;\n\tdisabled?: boolean;\n\tinvalid?: boolean;\n\tsize?: AvatarUploadSize;\n\tclassName?: string;\n\tstrings?: Partial<AvatarUploadStrings>;\n\t/** Initials shown when no preview is available. */\n\tinitials?: string;\n}\n\nconst SIZE_PX: Record<AvatarUploadSize, { box: string; icon: string; remove: string }> = {\n\tsm: { box: 'size-16', icon: 'size-4', remove: 'size-5' },\n\tbase: { box: 'size-24', icon: 'size-5', remove: 'size-6' },\n\tlg: { box: 'size-32', icon: 'size-6', remove: 'size-7' },\n};\n\nfunction AvatarUploadImpl(\n {\n\tvalue,\n\tonChange,\n\tdefaultPreviewUrl,\n\taccept = '.png,.jpg,.jpeg,.gif,.webp',\n\tdisabled = false,\n\tinvalid = false,\n\tsize = 'base',\n\tclassName,\n\tstrings: stringsProp,\n\tinitials,\n}: AvatarUploadProps,\n forwardedRef: ForwardedRef<HTMLInputElement>,\n) {\n\tconst strings = useStrings(defaultAvatarUploadStrings, stringsProp);\n\tconst inputId = useId();\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\tconst [isDragging, setIsDragging] = useState(false);\n\tconst sizes = SIZE_PX[size];\n\n\tconst { files, setFiles, removeAll } = useFiles({\n\t\tmaxFiles: 1,\n\t\tallowedExtensions: useMemo(\n\t\t\t() =>\n\t\t\t\taccept\n\t\t\t\t\t.split(',')\n\t\t\t\t\t.map((s) => s.trim().replace(/^\\./, '').toLowerCase())\n\t\t\t\t\t.filter(Boolean),\n\t\t\t[accept],\n\t\t),\n\t});\n\n\tuseEffect(() => {\n\t\tif (value) setFiles([value]);\n\t\telse removeAll();\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [value]);\n\n\tconst selected = files[0];\n\tconst [filePreviewUrl, setFilePreviewUrl] = useState<string | undefined>(undefined);\n\n\tuseEffect(() => {\n\t\tconst file = selected?.file ?? value;\n\t\tif (!file) {\n\t\t\tsetFilePreviewUrl(undefined);\n\t\t\treturn;\n\t\t}\n\t\tconst url = URL.createObjectURL(file);\n\t\tsetFilePreviewUrl(url);\n\t\treturn () => URL.revokeObjectURL(url);\n\t}, [selected, value]);\n\n\tconst previewUrl = filePreviewUrl ?? defaultPreviewUrl;\n\tconst hasPreview = Boolean(previewUrl);\n\n\tconst handleInput = useCallback(\n\t\t(e: ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst list = e.target.files;\n\t\t\tif (!list || list.length === 0) return;\n\t\t\tsetFiles(list);\n\t\t\tonChange?.(list[0]);\n\t\t\tif (inputRef.current) inputRef.current.value = '';\n\t\t},\n\t\t[onChange, setFiles],\n\t);\n\n\tconst trigger = useCallback(() => {\n\t\tif (!disabled) inputRef.current?.click();\n\t}, [disabled]);\n\n\tconst handleRemove = useCallback(() => {\n\t\tremoveAll();\n\t\tonChange?.(undefined);\n\t\tif (inputRef.current) inputRef.current.value = '';\n\t}, [onChange, removeAll]);\n\n\tconst handleKey = (e: KeyboardEvent<HTMLDivElement>) => {\n\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\te.preventDefault();\n\t\t\ttrigger();\n\t\t}\n\t};\n\n\tconst handleDragEnter = useCallback(\n\t\t(e: DragEvent<HTMLDivElement>) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tif (!disabled) setIsDragging(true);\n\t\t},\n\t\t[disabled],\n\t);\n\n\tconst handleDragLeave = useCallback((e: DragEvent<HTMLDivElement>) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\tsetIsDragging(false);\n\t}, []);\n\n\tconst handleDrop = useCallback(\n\t\t(e: DragEvent<HTMLDivElement>) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tsetIsDragging(false);\n\t\t\tif (disabled) return;\n\t\t\tconst list = e.dataTransfer?.files;\n\t\t\tif (!list || list.length === 0) return;\n\t\t\tsetFiles(list);\n\t\t\tonChange?.(list[0]);\n\t\t},\n\t\t[disabled, onChange, setFiles],\n\t);\n\n\treturn (\n\t\t<div className={cn('avatar-upload--component', 'inline-flex flex-col items-center gap-2', className)}>\n\t\t\t<div\n\t\t\t\trole=\"button\"\n\t\t\t\ttabIndex={disabled ? -1 : 0}\n\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\taria-invalid={invalid || undefined}\n\t\t\t\tonClick={trigger}\n\t\t\t\tonKeyDown={handleKey}\n\t\t\t\tonDragEnter={handleDragEnter}\n\t\t\t\tonDragOver={handleDragEnter}\n\t\t\t\tonDragLeave={handleDragLeave}\n\t\t\t\tonDrop={handleDrop}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'group relative flex shrink-0 items-center justify-center overflow-hidden rounded-full',\n\t\t\t\t\t'border border-dashed transition-colors duration-150 outline-none',\n\t\t\t\t\t'focus-visible:ring-2 focus-visible:ring-ring/50',\n\t\t\t\t\thasPreview\n\t\t\t\t\t\t? 'border-border/60 bg-muted/20'\n\t\t\t\t\t\t: cn(\n\t\t\t\t\t\t\t\t'bg-muted/30 hover:border-primary hover:bg-primary/5',\n\t\t\t\t\t\t\t\tinvalid ? 'border-destructive' : 'border-muted-foreground/40',\n\t\t\t\t\t\t\t),\n\t\t\t\t\tdisabled && 'cursor-not-allowed opacity-50',\n\t\t\t\t\t!disabled && isDragging && 'border-primary bg-primary/10',\n\t\t\t\t\tsizes.box,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<input\n\t\t\t\t\tid={inputId}\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=\"file\"\n\t\t\t\t\tclassName=\"sr-only\"\n\t\t\t\t\taccept={accept}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonChange={handleInput}\n\t\t\t\t/>\n\n\t\t\t\t{hasPreview && previewUrl ? (\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc={previewUrl}\n\t\t\t\t\t\talt={strings.change}\n\t\t\t\t\t\tclassName=\"absolute inset-0 size-full object-cover\"\n\t\t\t\t\t/>\n\t\t\t\t) : initials ? (\n\t\t\t\t\t<Text size={size === 'lg' ? 'lg' : 'base'} weight=\"bold\" className=\"leading-none\">\n\t\t\t\t\t\t{initials}\n\t\t\t\t\t</Text>\n\t\t\t\t) : (\n\t\t\t\t\t<Camera className={cn(sizes.icon, 'text-muted-foreground')} aria-hidden=\"true\" />\n\t\t\t\t)}\n\n\t\t\t\t{/* Hover overlay */}\n\t\t\t\t{!disabled && hasPreview && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"pointer-events-none absolute inset-0 hidden items-center justify-center bg-black/40 text-white group-hover:flex\"\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Camera className={sizes.icon} />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{/* Remove pill */}\n\t\t\t\t{!disabled && hasPreview && (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\taria-label={strings.remove}\n\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\thandleRemove();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'absolute right-0.5 top-0.5 inline-flex items-center justify-center rounded-full bg-card text-foreground shadow ring-1 ring-border',\n\t\t\t\t\t\t\t'opacity-0 transition-opacity group-hover:opacity-100 focus-visible:opacity-100',\n\t\t\t\t\t\t\tsizes.remove,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<X className=\"size-3\" />\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\n\t\t\t\t{!disabled && !hasPreview && isDragging && (\n\t\t\t\t\t<Text size=\"xxs\" weight=\"medium\" className=\"absolute inset-x-0 bottom-1.5 text-center text-primary\">\n\t\t\t\t\t\t{strings.dragOver}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{!hasPreview && (\n\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t{strings.hint}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nconst AvatarUpload = React.forwardRef<HTMLInputElement, AvatarUploadProps>(AvatarUploadImpl);\nAvatarUpload.displayName = 'AvatarUpload';\n\nexport { AvatarUpload };\n","/**\n * MediaGallery — multi-image upload + sortable thumbnail grid. Drop a batch\n * of images onto the dashed top tile or click to open the picker; tiles\n * appear inline and can be reordered via drag (`@dnd-kit/sortable`). The\n * first tile is implicitly the \"cover\" and is marked with a small chip;\n * each tile has a hover-revealed remove button.\n *\n * Use for product galleries, mood boards, or any collection where the order\n * matters and the consumer needs the final `File[]` (and the order of those\n * files) on submit.\n *\n * Strings overridable for i18n.\n */\nimport { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport type { ChangeEvent, DragEvent } from 'react';\nimport {\n\tDndContext,\n\ttype DragEndEvent,\n\tPointerSensor,\n\tuseSensor,\n\tuseSensors,\n} from '@dnd-kit/core';\nimport {\n\tSortableContext,\n\trectSortingStrategy,\n\tuseSortable,\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { ImagePlus, X } from 'lucide-react';\nimport { Text } from '@/components/typography';\nimport { useStrings } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\n\nexport interface MediaGalleryStrings {\n\taddInstruction: string;\n\thelper: string;\n\tdragOver: string;\n\tcover: string;\n\tremoveAria: string;\n\tmaxReached: string;\n}\n\nexport const defaultMediaGalleryStrings: MediaGalleryStrings = {\n\taddInstruction: 'Drop or click to add images',\n\thelper: '',\n\tdragOver: 'Release to upload',\n\tcover: 'Cover',\n\tremoveAria: 'Remove image',\n\tmaxReached: 'You have reached the maximum number of images.',\n};\n\nexport interface MediaGalleryProps {\n\tvalue?: File[];\n\tonChange?: (files: File[]) => void;\n\taccept?: string;\n\tmaxFiles?: number;\n\tdisabled?: boolean;\n\tinvalid?: boolean;\n\tclassName?: string;\n\ttileClassName?: string;\n\tstrings?: Partial<MediaGalleryStrings>;\n}\n\ninterface InternalItem {\n\tid: string;\n\tfile: File;\n\tpreviewUrl: string;\n}\n\nlet counter = 0;\nconst makeId = () => `media-${Date.now().toString(36)}-${(counter++).toString(36)}`;\n\nfunction SortableTile({\n\titem,\n\tisFirst,\n\tdisabled,\n\tonRemove,\n\tstrings,\n\ttileClassName,\n}: {\n\titem: InternalItem;\n\tisFirst: boolean;\n\tdisabled: boolean;\n\tonRemove: () => void;\n\tstrings: MediaGalleryStrings;\n\ttileClassName?: string;\n}) {\n\tconst { attributes, listeners, setNodeRef, transform, transition, isDragging } =\n\t\tuseSortable({ id: item.id, disabled });\n\tconst style = {\n\t\ttransform: CSS.Transform.toString(transform),\n\t\ttransition,\n\t} as React.CSSProperties;\n\n\treturn (\n\t\t<div\n\t\t\tref={setNodeRef}\n\t\t\tstyle={style}\n\t\t\tclassName={cn('media-gallery--component', \n\t\t\t\t'group relative aspect-square overflow-hidden rounded-lg border border-border/60 bg-muted/30',\n\t\t\t\t'cursor-grab active:cursor-grabbing',\n\t\t\t\tisDragging && 'z-10 shadow-lg ring-2 ring-primary/40',\n\t\t\t\tdisabled && 'pointer-events-none opacity-50',\n\t\t\t\ttileClassName,\n\t\t\t)}\n\t\t\t{...attributes}\n\t\t\t{...listeners}\n\t\t>\n\t\t\t<img\n\t\t\t\tsrc={item.previewUrl}\n\t\t\t\talt={item.file.name}\n\t\t\t\tclassName=\"absolute inset-0 size-full object-cover\"\n\t\t\t\tdraggable={false}\n\t\t\t/>\n\t\t\t{isFirst && (\n\t\t\t\t<span\n\t\t\t\t\tclassName=\"absolute left-1.5 top-1.5 rounded-full bg-card/90 px-1.5 py-0.5 text-xxs font-semibold text-foreground shadow ring-1 ring-border\"\n\t\t\t\t>\n\t\t\t\t\t{strings.cover}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-label={strings.removeAria}\n\t\t\t\tonPointerDown={(e) => e.stopPropagation()}\n\t\t\t\tonClick={(e) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tonRemove();\n\t\t\t\t}}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'absolute right-1.5 top-1.5 inline-flex size-6 items-center justify-center rounded-full bg-card text-foreground shadow ring-1 ring-border',\n\t\t\t\t\t'opacity-0 transition-opacity group-hover:opacity-100 focus-visible:opacity-100',\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<X className=\"size-3.5\" />\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n\nexport function MediaGallery({\n\tvalue,\n\tonChange,\n\taccept = '.png,.jpg,.jpeg,.gif,.webp',\n\tmaxFiles,\n\tdisabled = false,\n\tinvalid = false,\n\tclassName,\n\ttileClassName,\n\tstrings: stringsProp,\n}: MediaGalleryProps) {\n\tconst strings = useStrings(defaultMediaGalleryStrings, stringsProp);\n\tconst inputId = useId();\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\tconst [items, setItems] = useState<InternalItem[]>([]);\n\tconst [isDragging, setIsDragging] = useState(false);\n\n\tconst sensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 6 } }));\n\n\t// Track the live preview-URL set in a ref so the unmount cleanup sees the\n\t// latest values without depending on render-time `items`. Without this,\n\t// the cleanup closes over the initial empty array and any object URLs\n\t// created during the lifetime of the component leak (the browser will\n\t// still hold them until the document unloads).\n\tconst itemsRef = useRef<InternalItem[]>([]);\n\titemsRef.current = items;\n\n\t// Reflect controlled value\n\tuseEffect(() => {\n\t\tif (!value) return;\n\t\tsetItems((prev) => {\n\t\t\t// Skip if files are equal references already (avoid resetting URLs).\n\t\t\tif (prev.length === value.length && prev.every((p, i) => p.file === value[i])) {\n\t\t\t\treturn prev;\n\t\t\t}\n\t\t\t// Revoke old URLs we no longer use.\n\t\t\tprev.forEach((p) => URL.revokeObjectURL(p.previewUrl));\n\t\t\treturn value.map((file) => ({\n\t\t\t\tid: makeId(),\n\t\t\t\tfile,\n\t\t\t\tpreviewUrl: URL.createObjectURL(file),\n\t\t\t}));\n\t\t});\n\t}, [value]);\n\n\t// Cleanup on unmount — revoke whatever previews were live at the time.\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\titemsRef.current.forEach((it) => URL.revokeObjectURL(it.previewUrl));\n\t\t};\n\t}, []);\n\n\tconst emit = useCallback(\n\t\t(next: InternalItem[]) => {\n\t\t\tonChange?.(next.map((it) => it.file));\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst addFiles = useCallback(\n\t\t(incoming: File[]) => {\n\t\t\tif (disabled) return;\n\t\t\tsetItems((prev) => {\n\t\t\t\tconst remaining = maxFiles !== undefined ? Math.max(0, maxFiles - prev.length) : incoming.length;\n\t\t\t\tconst accepted = incoming.slice(0, remaining);\n\t\t\t\tconst additions: InternalItem[] = accepted.map((file) => ({\n\t\t\t\t\tid: makeId(),\n\t\t\t\t\tfile,\n\t\t\t\t\tpreviewUrl: URL.createObjectURL(file),\n\t\t\t\t}));\n\t\t\t\tconst next = [...prev, ...additions];\n\t\t\t\temit(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[disabled, emit, maxFiles],\n\t);\n\n\tconst remove = useCallback(\n\t\t(id: string) => {\n\t\t\tsetItems((prev) => {\n\t\t\t\tconst target = prev.find((p) => p.id === id);\n\t\t\t\tif (target) URL.revokeObjectURL(target.previewUrl);\n\t\t\t\tconst next = prev.filter((p) => p.id !== id);\n\t\t\t\temit(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[emit],\n\t);\n\n\tconst onPickerChange = useCallback(\n\t\t(e: ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst list = e.target.files;\n\t\t\tif (!list || list.length === 0) return;\n\t\t\taddFiles(Array.from(list));\n\t\t\tif (inputRef.current) inputRef.current.value = '';\n\t\t},\n\t\t[addFiles],\n\t);\n\n\tconst handleDragEnter = useCallback(\n\t\t(e: DragEvent<HTMLDivElement>) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tif (!disabled) setIsDragging(true);\n\t\t},\n\t\t[disabled],\n\t);\n\n\tconst handleDragLeave = useCallback((e: DragEvent<HTMLDivElement>) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\tsetIsDragging(false);\n\t}, []);\n\n\tconst handleDrop = useCallback(\n\t\t(e: DragEvent<HTMLDivElement>) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tsetIsDragging(false);\n\t\t\tif (disabled) return;\n\t\t\tconst list = e.dataTransfer?.files;\n\t\t\tif (!list || list.length === 0) return;\n\t\t\taddFiles(Array.from(list));\n\t\t},\n\t\t[addFiles, disabled],\n\t);\n\n\tconst onDragEnd = useCallback(\n\t\t(event: DragEndEvent) => {\n\t\t\tconst { active, over } = event;\n\t\t\tif (!over || active.id === over.id) return;\n\t\t\tsetItems((prev) => {\n\t\t\t\tconst fromIdx = prev.findIndex((p) => p.id === active.id);\n\t\t\t\tconst toIdx = prev.findIndex((p) => p.id === over.id);\n\t\t\t\tif (fromIdx === -1 || toIdx === -1) return prev;\n\t\t\t\tconst next = [...prev];\n\t\t\t\tconst [moved] = next.splice(fromIdx, 1);\n\t\t\t\tnext.splice(toIdx, 0, moved);\n\t\t\t\temit(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[emit],\n\t);\n\n\tconst tileIds = useMemo(() => items.map((it) => it.id), [items]);\n\tconst isFull = maxFiles !== undefined && items.length >= maxFiles;\n\n\treturn (\n\t\t<div className={cn('space-y-3', className)}>\n\t\t\t<DndContext sensors={sensors} onDragEnd={onDragEnd}>\n\t\t\t\t<SortableContext items={tileIds} strategy={rectSortingStrategy}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'grid grid-cols-2 gap-2',\n\t\t\t\t\t\t\t'sm:grid-cols-3 md:grid-cols-4',\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{items.map((item, i) => (\n\t\t\t\t\t\t\t<SortableTile\n\t\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\t\titem={item}\n\t\t\t\t\t\t\t\tisFirst={i === 0}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tonRemove={() => remove(item.id)}\n\t\t\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\t\t\ttileClassName={tileClassName}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\n\t\t\t\t\t\t{!isFull && (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\ttabIndex={disabled ? -1 : 0}\n\t\t\t\t\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\t\t\t\t\taria-invalid={invalid || undefined}\n\t\t\t\t\t\t\t\tonClick={() => !disabled && inputRef.current?.click()}\n\t\t\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\tinputRef.current?.click();\n\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\tonDragEnter={handleDragEnter}\n\t\t\t\t\t\t\t\tonDragOver={handleDragEnter}\n\t\t\t\t\t\t\t\tonDragLeave={handleDragLeave}\n\t\t\t\t\t\t\t\tonDrop={handleDrop}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex aspect-square items-center justify-center rounded-lg border border-dashed text-center outline-none transition-colors',\n\t\t\t\t\t\t\t\t\t'hover:border-primary hover:bg-primary/5 hover:text-primary focus-visible:ring-2 focus-visible:ring-ring/50',\n\t\t\t\t\t\t\t\t\tinvalid ? 'border-destructive' : 'border-muted-foreground/40',\n\t\t\t\t\t\t\t\t\tdisabled && 'cursor-not-allowed opacity-50',\n\t\t\t\t\t\t\t\t\t!disabled && isDragging && 'border-primary bg-primary/10 text-primary',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tid={inputId}\n\t\t\t\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\t\t\t\ttype=\"file\"\n\t\t\t\t\t\t\t\t\tclassName=\"sr-only\"\n\t\t\t\t\t\t\t\t\taccept={accept}\n\t\t\t\t\t\t\t\t\tmultiple\n\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\tonChange={onPickerChange}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<div className=\"flex flex-col items-center gap-2 px-2\">\n\t\t\t\t\t\t\t\t\t<ImagePlus className=\"size-5 text-muted-foreground\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t<Text size=\"xs\" weight=\"medium\">\n\t\t\t\t\t\t\t\t\t\t{isDragging ? strings.dragOver : strings.addInstruction}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</SortableContext>\n\t\t\t</DndContext>\n\n\t\t\t{!!isFull && (\n\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t{strings.maxReached}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t\t{!isFull && !!strings.helper && (\n\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t{strings.helper}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nMediaGallery.displayName = 'MediaGallery';\n","/**\n * UploadProgressList — render-only list of in-flight uploads. Each row shows\n * a status icon (queued / uploading / done / error / cancelled), filename,\n * size, a progress bar driven by `progress` (0–100), and an action button\n * that maps to the row's status (cancel while uploading, retry on error,\n * remove when done). Pair with FileUpload / MediaGallery / Dropzone — those\n * components emit raw `File` instances; this one displays the upload UI\n * once the consumer has wired them to its API.\n *\n * Strings overridable for i18n.\n */\nimport {\n\tAlertCircle,\n\tCheck,\n\tClock,\n\tRefreshCw,\n\tUploadCloud,\n\tX,\n} from 'lucide-react';\nimport { Text } from '@/components/typography';\nimport { Button } from '@/components/base/buttons';\nimport { useStrings } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\n\nexport type UploadStatus = 'queued' | 'uploading' | 'done' | 'error' | 'cancelled';\n\nexport interface UploadItem {\n\tid: string;\n\tname: string;\n\t/** Pre-formatted size string (e.g. \"2.4 MB\"). */\n\tsize?: string;\n\t/** Upload progress 0–100. Ignored when status is `done`/`error`/`cancelled`. */\n\tprogress?: number;\n\tstatus: UploadStatus;\n\t/** Error message rendered under the row when status is `error`. */\n\terror?: string;\n\t/**\n\t * Optional thumbnail URL — when set and the consumer renders this list\n\t * inside `<UploadTray>`, the row uses the thumbnail in place of the\n\t * status icon. Pure-`<UploadProgressList>` callers can ignore this.\n\t */\n\tpreview?: string;\n}\n\nexport interface UploadProgressListStrings {\n\tqueued: string;\n\tuploading: string;\n\tdone: string;\n\terror: string;\n\tcancelled: string;\n\tcancel: string;\n\tretry: string;\n\tremove: string;\n}\n\nexport const defaultUploadProgressListStrings: UploadProgressListStrings = {\n\tqueued: 'Queued',\n\tuploading: 'Uploading',\n\tdone: 'Uploaded',\n\terror: 'Failed',\n\tcancelled: 'Cancelled',\n\tcancel: 'Cancel',\n\tretry: 'Retry',\n\tremove: 'Remove',\n};\n\nexport interface UploadProgressListProps {\n\titems: UploadItem[];\n\tonCancel?: (id: string) => void;\n\tonRetry?: (id: string) => void;\n\tonRemove?: (id: string) => void;\n\tclassName?: string;\n\tstrings?: Partial<UploadProgressListStrings>;\n}\n\nconst STATUS_TONE: Record<\n\tUploadStatus,\n\t{ icon: typeof Check; bg: string; fg: string; bar: string }\n> = {\n\tqueued: { icon: Clock, bg: 'bg-muted', fg: 'text-muted-foreground', bar: 'bg-muted-foreground/30' },\n\tuploading: { icon: UploadCloud, bg: 'bg-primary/15', fg: 'text-primary', bar: 'bg-primary' },\n\tdone: { icon: Check, bg: 'bg-success/15', fg: 'text-success', bar: 'bg-success' },\n\terror: { icon: AlertCircle, bg: 'bg-destructive/15', fg: 'text-destructive', bar: 'bg-destructive' },\n\tcancelled: { icon: X, bg: 'bg-muted', fg: 'text-muted-foreground', bar: 'bg-muted-foreground/30' },\n};\n\nexport function UploadProgressList({\n\titems,\n\tonCancel,\n\tonRetry,\n\tonRemove,\n\tclassName,\n\tstrings: stringsProp,\n}: UploadProgressListProps) {\n\tconst strings = useStrings(defaultUploadProgressListStrings, stringsProp);\n\tconst statusLabel: Record<UploadStatus, string> = {\n\t\tqueued: strings.queued,\n\t\tuploading: strings.uploading,\n\t\tdone: strings.done,\n\t\terror: strings.error,\n\t\tcancelled: strings.cancelled,\n\t};\n\n\tif (items.length === 0) return null;\n\n\treturn (\n\t\t<ul className={cn('upload-progress-list--component', 'space-y-2', className)}>\n\t\t\t{items.map((item) => {\n\t\t\t\tconst tone = STATUS_TONE[item.status];\n\t\t\t\tconst Icon = tone.icon;\n\t\t\t\tconst pct =\n\t\t\t\t\titem.status === 'done'\n\t\t\t\t\t\t? 100\n\t\t\t\t\t\t: item.status === 'cancelled' || item.status === 'error'\n\t\t\t\t\t\t\t? item.progress ?? 0\n\t\t\t\t\t\t\t: Math.max(0, Math.min(100, item.progress ?? 0));\n\t\t\t\tconst showProgress = item.status === 'uploading' || item.status === 'queued';\n\t\t\t\treturn (\n\t\t\t\t\t<li\n\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\tclassName=\"rounded-md border border-border/60 bg-card px-3 py-2\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'inline-flex size-7 shrink-0 items-center justify-center rounded-md',\n\t\t\t\t\t\t\t\t\ttone.bg,\n\t\t\t\t\t\t\t\t\ttone.fg,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'size-3.5',\n\t\t\t\t\t\t\t\t\t\titem.status === 'uploading' && 'animate-pulse',\n\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</span>\n\t\t\t\t\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t\t<div className=\"flex items-baseline justify-between gap-2\">\n\t\t\t\t\t\t\t\t\t<Text weight=\"medium\" className=\"truncate\">\n\t\t\t\t\t\t\t\t\t\t{item.name}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t<Text size=\"xxs\" type=\"secondary\" className=\"shrink-0 tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t{item.size}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{showProgress ? (\n\t\t\t\t\t\t\t\t\t<div className=\"mt-1.5 h-1 w-full overflow-hidden rounded-full bg-muted\">\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn('h-full rounded-full transition-[width] duration-200', tone.bar)}\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: `${pct}%` }}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<Text size=\"xxs\" type={item.status === 'error' ? 'error' : 'secondary'}>\n\t\t\t\t\t\t\t\t\t\t{statusLabel[item.status]}\n\t\t\t\t\t\t\t\t\t\t{item.status === 'error' && !!item.error && ` — ${item.error}`}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div className=\"flex shrink-0 items-center gap-1\">\n\t\t\t\t\t\t\t\t{item.status === 'uploading' && !!onCancel && (\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tsize=\"icon-xs\"\n\t\t\t\t\t\t\t\t\t\taria-label={strings.cancel}\n\t\t\t\t\t\t\t\t\t\tonClick={() => onCancel(item.id)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<X className=\"size-3.5\" />\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{item.status === 'error' && !!onRetry && (\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tsize=\"icon-xs\"\n\t\t\t\t\t\t\t\t\t\taria-label={strings.retry}\n\t\t\t\t\t\t\t\t\t\tonClick={() => onRetry(item.id)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<RefreshCw className=\"size-3.5\" />\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{(item.status === 'done' ||\n\t\t\t\t\t\t\t\t\titem.status === 'error' ||\n\t\t\t\t\t\t\t\t\titem.status === 'cancelled') &&\n\t\t\t\t\t\t\t\t\t!!onRemove && (\n\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"icon-xs\"\n\t\t\t\t\t\t\t\t\t\t\taria-label={strings.remove}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => onRemove(item.id)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<X className=\"size-3.5\" />\n\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</li>\n\t\t\t\t);\n\t\t\t})}\n\t\t</ul>\n\t);\n}\n\nUploadProgressList.displayName = 'UploadProgressList';\n","/**\n * UploadTray — the canonical \"drag-and-drop area + per-file progress\n * rows + summary toolbar\" surface. Composes:\n *\n * - `Dropzone` — drag/drop chrome + click-to-browse\n * - `UploadProgressList` — per-file row with status icon + progress\n * bar + cancel/retry/remove actions\n * - `Badge` — status counters in the toolbar\n * - `Button` — \"Clear all\" action\n *\n * Framework-agnostic. Every action is callback-driven — the library\n * doesn't perform the upload; it surfaces the UX. The consumer wires\n * the actual transfer (XHR, fetch, S3 multipart, …) and feeds back\n * `progress` / `status` updates by mutating the `items` array.\n *\n * Pair with `useFiles` (the existing client-side validation hook) at\n * the call site if you want pre-flight size/type rejection.\n */\nimport { forwardRef, useCallback } from 'react';\n\nimport { Badge } from '@/components/base/badge';\nimport { Button } from '@/components/base/buttons';\nimport { Text } from '@/components/typography';\nimport { useStrings, type StringsProp } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\n\nimport { Dropzone, type DropzoneProps } from './dropzone';\nimport {\n\tUploadProgressList,\n\ttype UploadItem,\n\ttype UploadProgressListStrings,\n} from './upload-progress-list';\n\nexport interface UploadTrayStrings {\n\theading: string;\n\tcompletedLabel: string;\n\tfailedLabel: string;\n\tuploadingLabel: string;\n\tqueuedLabel: string;\n\tclearAll: string;\n}\n\nexport const defaultUploadTrayStrings: UploadTrayStrings = {\n\theading: 'Upload progress',\n\tcompletedLabel: 'Completed',\n\tfailedLabel: 'Failed',\n\tuploadingLabel: 'Uploading',\n\tqueuedLabel: 'Queued',\n\tclearAll: 'Clear all',\n};\n\nexport interface UploadTrayProps {\n\t/** Files currently in the tray (queued / uploading / done / error / cancelled). */\n\titems: UploadItem[];\n\t/**\n\t * Fires when the user drops or browses files. The library does NOT\n\t * write to the items array — the consumer turns these into queued\n\t * `UploadItem`s, kicks off the actual transfer, and updates progress.\n\t */\n\tonAddFiles: (files: File[]) => void;\n\t/** Per-row cancel handler (passed through to UploadProgressList). */\n\tonCancel?: (id: string) => void;\n\t/** Per-row retry handler. */\n\tonRetry?: (id: string) => void;\n\t/** Per-row remove handler. */\n\tonRemove?: (id: string) => void;\n\t/**\n\t * Clears the entire tray. When omitted, the \"Clear all\" button is\n\t * hidden — useful for surfaces where in-flight uploads can't be\n\t * cancelled in bulk.\n\t */\n\tonClearAll?: () => void;\n\t/** Forwarded to the inner `<Dropzone>`. Only the meaningful subset. */\n\tdropzone?: Pick<\n\t\tDropzoneProps,\n\t\t'accept' | 'multiple' | 'size' | 'disabled' | 'invalid' | 'strings'\n\t>;\n\tclassName?: string;\n\tstrings?: StringsProp<UploadTrayStrings>;\n\t/** Strings forwarded to the inner `<UploadProgressList>`. */\n\tlistStrings?: StringsProp<UploadProgressListStrings>;\n}\n\nfunction countStatus(items: UploadItem[]) {\n\tlet completed = 0;\n\tlet failed = 0;\n\tlet uploading = 0;\n\tlet queued = 0;\n\tfor (const item of items) {\n\t\tif (item.status === 'done') completed += 1;\n\t\telse if (item.status === 'error') failed += 1;\n\t\telse if (item.status === 'uploading') uploading += 1;\n\t\telse if (item.status === 'queued') queued += 1;\n\t}\n\treturn { completed, failed, uploading, queued };\n}\n\nexport const UploadTray = forwardRef<HTMLDivElement, UploadTrayProps>(function UploadTray({\n\titems,\n\tonAddFiles,\n\tonCancel,\n\tonRetry,\n\tonRemove,\n\tonClearAll,\n\tdropzone,\n\tclassName,\n\tstrings: stringsProp,\n\tlistStrings,\n}, ref) {\n\tconst strings = useStrings(defaultUploadTrayStrings, stringsProp);\n\tconst { completed, failed, uploading, queued } = countStatus(items);\n\n\tconst handleDrop = useCallback(\n\t\t(files: File[]) => {\n\t\t\tif (files.length > 0) onAddFiles(files);\n\t\t},\n\t\t[onAddFiles],\n\t);\n\n\tconst hasItems = items.length > 0;\n\n\treturn (\n\t\t<div ref={ref} className={cn('upload-tray--component', 'flex flex-col gap-4', className)}>\n\t\t\t<Dropzone\n\t\t\t\tonDrop={handleDrop}\n\t\t\t\taccept={dropzone?.accept}\n\t\t\t\tmultiple={dropzone?.multiple}\n\t\t\t\tsize={dropzone?.size}\n\t\t\t\tdisabled={dropzone?.disabled}\n\t\t\t\tinvalid={dropzone?.invalid}\n\t\t\t\tstrings={dropzone?.strings}\n\t\t\t/>\n\n\t\t\t{!!hasItems && (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"flex flex-wrap items-center justify-between gap-2\">\n\t\t\t\t\t\t<div className=\"flex flex-wrap items-center gap-2\">\n\t\t\t\t\t\t\t<Text tag=\"span\" weight=\"semibold\">\n\t\t\t\t\t\t\t\t{strings.heading}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t{completed > 0 && (\n\t\t\t\t\t\t\t\t<Badge variant=\"success\">\n\t\t\t\t\t\t\t\t\t{strings.completedLabel}: {completed}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{failed > 0 && (\n\t\t\t\t\t\t\t\t<Badge variant=\"destructive\">\n\t\t\t\t\t\t\t\t\t{strings.failedLabel}: {failed}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{uploading > 0 && (\n\t\t\t\t\t\t\t\t<Badge variant=\"info\">\n\t\t\t\t\t\t\t\t\t{strings.uploadingLabel}: {uploading}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{queued > 0 && (\n\t\t\t\t\t\t\t\t<Badge variant=\"secondary\">\n\t\t\t\t\t\t\t\t\t{strings.queuedLabel}: {queued}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{!!onClearAll && (\n\t\t\t\t\t\t\t<Button variant=\"secondary\" buttonStyle=\"ghost\" onClick={onClearAll}>\n\t\t\t\t\t\t\t\t{strings.clearAll}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<UploadProgressList\n\t\t\t\t\t\titems={items}\n\t\t\t\t\t\tonCancel={onCancel}\n\t\t\t\t\t\tonRetry={onRetry}\n\t\t\t\t\t\tonRemove={onRemove}\n\t\t\t\t\t\tstrings={listStrings}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t</div>\n\t);\n});\n\nUploadTray.displayName = 'UploadTray';\n","/**\n * Shared default strings for repeater-style form fields\n * (`<List>`, `<StringRepeater>`, `<ObjectRepeater>`,\n * `<LocalizedStringRepeater>`, …).\n *\n * Each repeater has its own concrete `Strings` interface — the shared\n * defaults below cover the keys they all share. Per-field strings files\n * spread these defaults into their own constant so consumers can override\n * any subset uniformly.\n */\n\nexport interface RepeaterSharedStrings {\n\temptyState: string;\n\taddItem: string;\n\tremoveAriaLabel: string;\n}\n\nexport const defaultRepeaterStrings: RepeaterSharedStrings = {\n\temptyState: 'No items added yet.',\n\taddItem: 'Add item',\n\tremoveAriaLabel: 'Remove item',\n};\n","/**\n * Repeater — shared chrome for any list-style form field. Renders a list of\n * rows with optional drag handle and a per-row remove icon, plus an empty\n * state and a trailing \"+ add\" button. The row body is consumer-rendered via\n * `children` (or `renderRow`), so this primitive is the visual contract that\n * `StringRepeater`, `ObjectRepeater`, `LocalizedStringRepeater`, and\n * `KeyValueEditor` all share — without locking down what each row is editing.\n *\n * Sortable is opt-in (`sortable`); when enabled the rows are wired up\n * through `@dnd-kit/sortable` and the consumer can render the supplied\n * `dragHandleProps` on whichever element is the visual handle.\n *\n * The `<Repeater>` is intentionally headless on the value side — it does not\n * own the items array. Consumers (RHF callers via `useFieldArray`, manual\n * controlled state, etc.) pass `items`, `onAdd`, `onRemove`, and\n * (optionally) `onMove` callbacks. This keeps the primitive framework- and\n * state-shape-agnostic.\n */\nimport {\n DndContext,\n KeyboardSensor,\n PointerSensor,\n closestCenter,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from '@dnd-kit/core';\nimport {\n SortableContext,\n arrayMove,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { GripVertical, Plus, Trash2, X } from 'lucide-react';\nimport {\n type CSSProperties,\n type ReactNode,\n useCallback,\n useMemo,\n} from 'react';\n\nimport { Button } from '@/components/base/buttons';\nimport Text from '@/components/typography/text';\nimport { useStrings, type StringsProp } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\n\nimport { defaultRepeaterStrings } from './repeaters.strings';\n\nexport interface RepeaterStrings {\n /** Empty state copy — shown when `items` is empty. */\n emptyState: string;\n /** Label of the trailing \"+\" button. */\n addButton: string;\n /** Per-row remove button aria-label. */\n removeAriaLabel: string;\n /** Drag-handle aria-label (only relevant when `sortable`). */\n dragHandleAriaLabel: string;\n}\n\nexport const defaultRepeaterPrimitiveStrings: RepeaterStrings = {\n emptyState: defaultRepeaterStrings.emptyState,\n addButton: defaultRepeaterStrings.addItem,\n removeAriaLabel: defaultRepeaterStrings.removeAriaLabel,\n dragHandleAriaLabel: 'Drag to reorder',\n};\n\n/**\n * Visual density of a row. `inline` is the canonical compact admin row\n * (single input + remove icon). `card` wraps richer content in a\n * bordered surface — used by `ObjectRepeater` and any consumer with\n * multi-field rows that need their own delete affordance.\n */\nexport type RepeaterRowVariant = 'inline' | 'card';\n\nexport type RepeaterRemoveVariant = 'ghost' | 'icon-button';\n\nexport interface RepeaterItem {\n /** Stable id (RHF `field.id`, generated UUID, etc.) — used as React key\n * and as the drag handle id when sortable. */\n id: string;\n}\n\ninterface RepeaterRowRenderContext {\n /** Index of the row in the items array. */\n index: number;\n /** True while the row is being actively dragged. */\n isDragging: boolean;\n}\n\nexport interface RepeaterProps<T extends RepeaterItem> {\n items: ReadonlyArray<T>;\n /** Render the body of a single row. */\n renderRow: (item: T, ctx: RepeaterRowRenderContext) => ReactNode;\n /** Called when the consumer presses the \"+ add\" button. */\n onAdd: () => void;\n /** Called when the consumer presses a per-row remove button. */\n onRemove: (index: number) => void;\n /** Called when a row is dragged to a new position. Required when\n * `sortable` is true; ignored otherwise. */\n onMove?: (fromIndex: number, toIndex: number) => void;\n /** Enable drag-to-reorder. Default `false`. */\n sortable?: boolean;\n /** Visual style of each row's outer chrome. Default `'inline'`. */\n rowVariant?: RepeaterRowVariant;\n /** Remove button style. Default `'ghost'` (subtle X icon, hover →\n * destructive tint). `'icon-button'` mirrors `<Button icon={Trash2}>`\n * — used by card rows that need a more prominent affordance. */\n removeVariant?: RepeaterRemoveVariant;\n /** Hide the per-row remove button. Default `false`. Useful when the\n * consumer renders its own remove inside the row body. */\n hideRemove?: boolean;\n /** Disable add + remove + drag affordances. */\n disabled?: boolean;\n /** Hide the trailing \"+ add\" button. Useful when the consumer composes\n * it elsewhere or has a maxItems cap. */\n hideAdd?: boolean;\n /** Override default strings. */\n strings?: StringsProp<RepeaterStrings>;\n /** Class applied to the outer wrapper. */\n className?: string;\n}\n\ninterface RowProps<T extends RepeaterItem> {\n item: T;\n index: number;\n sortable: boolean;\n rowVariant: RepeaterRowVariant;\n removeVariant: RepeaterRemoveVariant;\n hideRemove: boolean;\n disabled: boolean;\n strings: RepeaterStrings;\n onRemove: (index: number) => void;\n renderRow: RepeaterProps<T>['renderRow'];\n}\n\nfunction Row<T extends RepeaterItem>({\n item,\n index,\n sortable,\n rowVariant,\n removeVariant,\n hideRemove,\n disabled,\n strings,\n onRemove,\n renderRow,\n}: RowProps<T>) {\n const sortableState = useSortable({ id: item.id, disabled: disabled || !sortable });\n const isDragging = sortable ? sortableState.isDragging : false;\n\n const style: CSSProperties | undefined = sortable\n ? {\n transform: CSS.Transform.toString(sortableState.transform),\n transition: sortableState.transition,\n opacity: isDragging ? 0.6 : 1,\n }\n : undefined;\n\n const ref = sortable ? sortableState.setNodeRef : undefined;\n const dragAttributes = sortable ? sortableState.attributes : {};\n const dragListeners = sortable ? sortableState.listeners : undefined;\n\n const dragHandle = sortable ? (\n <button\n type=\"button\"\n aria-label={strings.dragHandleAriaLabel}\n className={cn(\n 'inline-flex size-9 shrink-0 items-center justify-center rounded-md',\n 'text-muted-foreground/50 hover:text-foreground hover:bg-muted',\n 'cursor-grab active:cursor-grabbing',\n 'outline-none focus-visible:ring-2 focus-visible:ring-ring/50',\n 'transition-colors',\n disabled && 'pointer-events-none opacity-50',\n )}\n {...dragAttributes}\n {...dragListeners}\n >\n <GripVertical className=\"size-4\" aria-hidden=\"true\" />\n </button>\n ) : null;\n\n const removeButton = hideRemove ? null : removeVariant === 'icon-button' ? (\n <Button\n type=\"button\"\n variant=\"secondary\"\n buttonStyle=\"outline\"\n size=\"sm\"\n aria-label={strings.removeAriaLabel}\n disabled={disabled}\n onClick={() => onRemove(index)}\n className=\"shrink-0\"\n >\n <Trash2 className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n ) : (\n <button\n type=\"button\"\n aria-label={strings.removeAriaLabel}\n disabled={disabled}\n onClick={() => onRemove(index)}\n className={cn(\n 'inline-flex size-9 shrink-0 items-center justify-center rounded-md',\n 'text-muted-foreground/70 hover:bg-destructive/10 hover:text-destructive',\n 'outline-none focus-visible:ring-2 focus-visible:ring-ring/50',\n 'transition-colors',\n 'disabled:pointer-events-none disabled:opacity-50',\n )}\n >\n <X className=\"size-4\" aria-hidden=\"true\" />\n </button>\n );\n\n if (rowVariant === 'card') {\n return (\n <div\n ref={ref}\n style={style}\n className={cn('repeater--component', \n 'relative rounded-md border border-input bg-card p-4',\n sortable && 'pl-2',\n )}\n >\n <div className=\"flex items-start gap-2\">\n {dragHandle}\n <div className=\"min-w-0 flex-1\">\n {renderRow(item, { index, isDragging })}\n </div>\n {removeButton}\n </div>\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n style={style}\n className=\"flex items-start gap-2\"\n >\n {dragHandle}\n <div className=\"min-w-0 flex-1\">\n {renderRow(item, { index, isDragging })}\n </div>\n {removeButton}\n </div>\n );\n}\n\nexport function Repeater<T extends RepeaterItem>({\n items,\n renderRow,\n onAdd,\n onRemove,\n onMove,\n sortable = false,\n rowVariant = 'inline',\n removeVariant = 'ghost',\n hideRemove = false,\n hideAdd = false,\n disabled = false,\n strings: stringsProp,\n className,\n}: RepeaterProps<T>) {\n const strings = useStrings(defaultRepeaterPrimitiveStrings, stringsProp);\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 4 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n );\n\n const handleDragEnd = useCallback(\n (event: DragEndEvent) => {\n const { active, over } = event;\n if (!over || active.id === over.id) return;\n const fromIndex = items.findIndex((item) => item.id === active.id);\n const toIndex = items.findIndex((item) => item.id === over.id);\n if (fromIndex < 0 || toIndex < 0) return;\n onMove?.(fromIndex, toIndex);\n },\n [items, onMove],\n );\n\n const itemIds = useMemo(() => items.map((item) => item.id), [items]);\n\n const list = (\n <div className=\"space-y-2\">\n {items.map((item, index) => (\n <Row<T>\n key={item.id}\n item={item}\n index={index}\n sortable={sortable}\n rowVariant={rowVariant}\n removeVariant={removeVariant}\n hideRemove={hideRemove}\n disabled={disabled}\n strings={strings}\n onRemove={onRemove}\n renderRow={renderRow}\n />\n ))}\n </div>\n );\n\n return (\n <div className={cn('space-y-3', className)}>\n {items.length === 0 ? (\n <div className=\"rounded-md border border-dashed border-input p-4\">\n <Text type=\"secondary\">{strings.emptyState}</Text>\n </div>\n ) : sortable ? (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleDragEnd}\n >\n <SortableContext items={itemIds} strategy={verticalListSortingStrategy}>\n {list}\n </SortableContext>\n </DndContext>\n ) : (\n list\n )}\n\n {!hideAdd && (\n <Button\n type=\"button\"\n variant=\"secondary\"\n buttonStyle=\"outline\"\n size=\"sm\"\n disabled={disabled}\n onClick={onAdd}\n >\n <Plus className=\"size-4 mr-1.5\" />\n {strings.addButton}\n </Button>\n )}\n </div>\n );\n}\n\nRepeater.displayName = 'Repeater';\n\n/** Re-export `arrayMove` from `@dnd-kit/sortable` so consumers using\n * the headless shape don't need to add the dep import themselves. */\nexport { arrayMove };\n","/**\n * KeyValueEditor — dynamic editor for arbitrary key→value string pairs. Emits\n * a `Record<string, string>` to consumers; rows with empty keys are dropped\n * from the output. Use for metadata, environment vars, or feature flags.\n *\n * Built on the shared `<Repeater>` primitive so it visually matches the\n * `StringRepeater` / `ObjectRepeater` / `LocalizedStringRepeater` family —\n * same row chrome, same remove icon, same add-button styling, optional\n * drag-to-reorder.\n */\nimport { useState, useRef, useCallback, memo } from 'react';\n\nimport { Label } from '@/components/typography';\nimport { useStrings } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\n\nimport { Input } from './input';\nimport { Repeater } from './repeater';\n\nexport type KeyValuePair = { key: string; value: string };\n\nexport interface KeyValueEditorStrings {\n keyLabel: string;\n valueLabel: string;\n keyPlaceholder: string;\n valuePlaceholder: string;\n addButton: string;\n removeRowAriaLabel: string;\n emptyState: string;\n}\n\nexport const defaultKeyValueEditorStrings: KeyValueEditorStrings = {\n keyLabel: 'Key',\n valueLabel: 'Value',\n keyPlaceholder: 'key',\n valuePlaceholder: 'value',\n addButton: 'Add row',\n removeRowAriaLabel: 'Remove row',\n emptyState: 'No rows yet.',\n};\n\nexport interface KeyValueEditorProps {\n value?: Record<string, string>;\n onChange?: (val: Record<string, string>) => void;\n invalid?: boolean;\n /** Enable drag-to-reorder. Default `false`. */\n sortable?: boolean;\n /** Override default strings (labels, placeholders, button text). */\n strings?: Partial<KeyValueEditorStrings>;\n /** @deprecated Use `strings.keyPlaceholder` instead. */\n keyPlaceholder?: string;\n /** @deprecated Use `strings.valuePlaceholder` instead. */\n valuePlaceholder?: string;\n /** @deprecated Use `strings.keyLabel` instead. */\n keyLabel?: string;\n /** @deprecated Use `strings.valueLabel` instead. */\n valueLabel?: string;\n /** @deprecated Use `strings.addButton` instead. */\n addButtonText?: string;\n}\n\ntype KeyValueRow = KeyValuePair & { id: string };\n\nconst generateId = (): string => {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return crypto.randomUUID();\n }\n return Math.random().toString(36).slice(2, 10);\n};\n\ninterface KeyValueEditorRowProps {\n row: KeyValueRow;\n keyPlaceholder: string;\n valuePlaceholder: string;\n invalid?: boolean;\n onKeyChange: (id: string, value: string) => void;\n onValueChange: (id: string, value: string) => void;\n}\n\nconst KeyValueEditorRow = memo(function KeyValueEditorRow({\n row,\n keyPlaceholder,\n valuePlaceholder,\n invalid,\n onKeyChange,\n onValueChange,\n}: KeyValueEditorRowProps) {\n const { id, key: keyValue, value } = row;\n\n return (\n <div className={cn('key-value-editor--component', 'grid grid-cols-1 md:grid-cols-2 gap-2')}>\n <Input\n value={keyValue ?? ''}\n placeholder={keyPlaceholder}\n onChange={(e) => onKeyChange(id, e.target.value)}\n invalid={invalid}\n />\n <Input\n value={value ?? ''}\n placeholder={valuePlaceholder}\n onChange={(e) => onValueChange(id, e.target.value)}\n invalid={invalid}\n />\n </div>\n );\n});\n\nexport function KeyValueEditor({\n value,\n onChange,\n invalid,\n sortable = false,\n keyPlaceholder,\n valuePlaceholder,\n keyLabel,\n valueLabel,\n addButtonText,\n strings: stringsProp,\n}: KeyValueEditorProps) {\n const strings = useStrings(defaultKeyValueEditorStrings, {\n ...(keyPlaceholder !== undefined ? { keyPlaceholder } : {}),\n ...(valuePlaceholder !== undefined ? { valuePlaceholder } : {}),\n ...(keyLabel !== undefined ? { keyLabel } : {}),\n ...(valueLabel !== undefined ? { valueLabel } : {}),\n ...(addButtonText !== undefined ? { addButton: addButtonText } : {}),\n ...stringsProp,\n });\n // Track if we're making internal changes to avoid re-syncing\n const isInternalChange = useRef(false);\n\n // Initialize rows from value prop\n const [rows, setRows] = useState<KeyValueRow[]>(() => {\n if (value && Object.keys(value).length > 0) {\n return Object.entries(value).map(([k, v]) => ({\n id: generateId(),\n key: k,\n value: String(v ?? ''),\n }));\n }\n return [{ id: generateId(), key: '', value: '' }];\n });\n\n // Emit changes to parent\n const emit = useCallback(\n (next: KeyValueRow[]) => {\n const obj: Record<string, string> = {};\n next.forEach(({ key, value }) => {\n if (key.trim() !== '') obj[key] = value ?? '';\n });\n isInternalChange.current = true;\n onChange?.(obj);\n queueMicrotask(() => {\n isInternalChange.current = false;\n });\n },\n [onChange]\n );\n\n const handleKeyChange = useCallback(\n (id: string, newKey: string) => {\n setRows((prev) => {\n const next = prev.map((row) => (row.id === id ? { ...row, key: newKey } : row));\n emit(next);\n return next;\n });\n },\n [emit]\n );\n\n const handleValueChange = useCallback(\n (id: string, newValue: string) => {\n setRows((prev) => {\n const next = prev.map((row) => (row.id === id ? { ...row, value: newValue } : row));\n emit(next);\n return next;\n });\n },\n [emit]\n );\n\n const addRow = useCallback(() => {\n setRows((prev) => {\n const next = [...prev, { id: generateId(), key: '', value: '' }];\n emit(next);\n return next;\n });\n }, [emit]);\n\n const removeRow = useCallback(\n (index: number) => {\n setRows((prev) => {\n const next = prev.filter((_, i) => i !== index);\n const result = next.length ? next : [{ id: generateId(), key: '', value: '' }];\n emit(result);\n return result;\n });\n },\n [emit]\n );\n\n const moveRow = useCallback(\n (from: number, to: number) => {\n setRows((prev) => {\n const next = [...prev];\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved);\n emit(next);\n return next;\n });\n },\n [emit]\n );\n\n // Render the column labels OUTSIDE the repeater so the per-row drag\n // handle + remove button stay aligned with the input baseline. Gutter\n // padding (left for sortable handle, right for remove X) matches the\n // `<Repeater>` row's `gap-2` + `size-9` button widths.\n const showHeader = !!strings.keyLabel || !!strings.valueLabel;\n const leftGutter = sortable ? 'pl-11' : '';\n const rightGutter = 'pr-11';\n\n return (\n <div className=\"space-y-2\">\n {showHeader && (\n <div className={cn('grid grid-cols-1 md:grid-cols-2 gap-2', leftGutter, rightGutter)}>\n {!!strings.keyLabel && <Label className=\"flex items-center\">{strings.keyLabel}</Label>}\n {!!strings.valueLabel && <Label className=\"flex items-center\">{strings.valueLabel}</Label>}\n </div>\n )}\n <Repeater\n items={rows}\n sortable={sortable}\n onAdd={addRow}\n onRemove={removeRow}\n onMove={moveRow}\n strings={{\n emptyState: strings.emptyState,\n addButton: strings.addButton,\n removeAriaLabel: strings.removeRowAriaLabel,\n }}\n renderRow={(row) => (\n <KeyValueEditorRow\n row={row}\n keyPlaceholder={strings.keyPlaceholder}\n valuePlaceholder={strings.valuePlaceholder}\n invalid={invalid}\n onKeyChange={handleKeyChange}\n onValueChange={handleValueChange}\n />\n )}\n />\n </div>\n );\n}\n\nKeyValueEditor.displayName = 'KeyValueEditor';\n","/**\n * StringRepeater — RHF-driven repeater for arrays of plain strings. Use under\n * a `FormProvider`; the `name` prop must point at a `string[]` path in the\n * form values. Pair with `useFieldArray` semantics: rows can be added,\n * removed, and (optionally) reordered. Strings overridable for i18n.\n *\n * Built on the shared `<Repeater>` primitive so it stays visually\n * consistent with `ObjectRepeater`, `LocalizedStringRepeater`, and\n * `KeyValueEditor`.\n */\nimport { useFieldArray, useFormContext } from 'react-hook-form';\n\nimport { useStrings } from '@/lib/strings';\n\nimport { Input } from './input';\nimport { Repeater } from './repeater';\nimport { defaultRepeaterStrings } from './repeaters.strings';\n\nexport interface StringRepeaterStrings {\n placeholder: string;\n addButton: string;\n emptyState: string;\n removeAriaLabel: string;\n}\n\nexport const defaultStringRepeaterStrings: StringRepeaterStrings = {\n placeholder: 'Enter value',\n addButton: 'Add item',\n ...defaultRepeaterStrings,\n};\n\nexport interface StringRepeaterProps {\n name: string;\n invalid?: boolean;\n /** Enable drag-to-reorder. Default `false`. */\n sortable?: boolean;\n /** Override default strings (placeholder, button, empty state). */\n strings?: Partial<StringRepeaterStrings>;\n /** @deprecated Use `strings.placeholder` instead. */\n placeholder?: string;\n /** @deprecated Use `strings.addButton` instead. */\n addButtonText?: string;\n /** @deprecated Use `strings.emptyState` instead. */\n emptyMessage?: string;\n}\n\nexport function StringRepeater({\n name,\n placeholder,\n addButtonText,\n emptyMessage,\n invalid,\n sortable = false,\n strings: stringsProp,\n}: StringRepeaterProps) {\n const strings = useStrings(defaultStringRepeaterStrings, {\n ...(placeholder !== undefined ? { placeholder } : {}),\n ...(addButtonText !== undefined ? { addButton: addButtonText } : {}),\n ...(emptyMessage !== undefined ? { emptyState: emptyMessage } : {}),\n ...stringsProp,\n });\n const { control, register } = useFormContext();\n const { fields, append, remove, move } = useFieldArray({\n control,\n name,\n });\n\n return (\n <Repeater className=\"string-repeater--component\"\n items={fields}\n sortable={sortable}\n onAdd={() => append('')}\n onRemove={(index) => remove(index)}\n onMove={(from, to) => move(from, to)}\n strings={{\n emptyState: strings.emptyState,\n addButton: strings.addButton,\n removeAriaLabel: strings.removeAriaLabel,\n }}\n renderRow={(_field, { index }) => (\n <Input\n {...register(`${name}.${index}`)}\n placeholder={strings.placeholder}\n invalid={invalid}\n />\n )}\n />\n );\n}\n\nStringRepeater.displayName = 'StringRepeater';\n","/**\n * ObjectRepeater — RHF-driven repeater for arrays of homogeneous objects.\n * Field definitions describe the shape of each row (label, type, placeholder,\n * required, hint); the repeater wires each cell through `useFieldArray` and\n * renders rows as bordered cards via the shared `<Repeater>` primitive.\n * Strings overridable for i18n.\n */\nimport { useCallback } from 'react';\nimport { useFieldArray, useFormContext } from 'react-hook-form';\n\nimport { FormField } from '@/components/base/forms/form-field';\nimport { useStrings } from '@/lib/strings';\n\nimport { Input } from './input';\nimport { Repeater } from './repeater';\nimport { defaultRepeaterStrings } from './repeaters.strings';\nimport { Textarea } from './textarea';\n\nimport { cn } from '@/lib/utils';\nexport interface ObjectRepeaterStrings {\n addButton: string;\n emptyState: string;\n removeAriaLabel: string;\n}\n\nexport const defaultObjectRepeaterStrings: ObjectRepeaterStrings = {\n addButton: 'Add item',\n ...defaultRepeaterStrings,\n};\n\nexport interface ObjectFieldDef {\n /** Field name within the object */\n name: string;\n\n /** Label for the field */\n label: string;\n\n /** Input type */\n type?: 'text' | 'textarea' | 'number';\n\n /** Placeholder text */\n placeholder?: string;\n\n /** Whether the field is required */\n required?: boolean;\n\n /** Hint text (shown right of label) */\n hint?: string;\n}\n\nexport interface ObjectRepeaterProps {\n name: string;\n fields: ObjectFieldDef[];\n invalid?: boolean;\n /** Enable drag-to-reorder. Default `false`. */\n sortable?: boolean;\n /** Override default strings (button labels, empty state). */\n strings?: Partial<ObjectRepeaterStrings>;\n /** @deprecated Use `strings.addButton` instead. */\n addButtonText?: string;\n /** @deprecated Use `strings.emptyState` instead. */\n emptyMessage?: string;\n}\n\nexport function ObjectRepeater({\n name,\n fields: fieldDefs,\n addButtonText,\n emptyMessage,\n invalid,\n sortable = false,\n strings: stringsProp,\n}: ObjectRepeaterProps) {\n const strings = useStrings(defaultObjectRepeaterStrings, {\n ...(addButtonText !== undefined ? { addButton: addButtonText } : {}),\n ...(emptyMessage !== undefined ? { emptyState: emptyMessage } : {}),\n ...stringsProp,\n });\n const { control, register } = useFormContext();\n const { fields, append, remove, move } = useFieldArray({\n control,\n name,\n });\n\n const createEmptyObject = useCallback(() => {\n return fieldDefs.reduce(\n (acc, field) => {\n acc[field.name] = '';\n return acc;\n },\n {} as Record<string, string>\n );\n }, [fieldDefs]);\n\n return (\n <Repeater\n items={fields}\n sortable={sortable}\n rowVariant=\"card\"\n removeVariant=\"ghost\"\n onAdd={() => append(createEmptyObject())}\n onRemove={(index) => remove(index)}\n onMove={(from, to) => move(from, to)}\n strings={{\n emptyState: strings.emptyState,\n addButton: strings.addButton,\n removeAriaLabel: strings.removeAriaLabel,\n }}\n renderRow={(_field, { index }) => (\n <div className={cn('object-repeater--component', 'space-y-3')}>\n {fieldDefs.map((fieldDef) => {\n const fieldPath = `${name}.${index}.${fieldDef.name}`;\n return (\n <FormField\n key={fieldDef.name}\n label={fieldDef.label}\n required={fieldDef.required}\n hint={fieldDef.hint}\n htmlFor={fieldPath}\n >\n {fieldDef.type === 'textarea' ? (\n <Textarea\n {...register(fieldPath)}\n id={fieldPath}\n placeholder={fieldDef.placeholder}\n minRows={3}\n invalid={invalid}\n />\n ) : (\n <Input\n {...register(fieldPath)}\n id={fieldPath}\n type={fieldDef.type || 'text'}\n placeholder={fieldDef.placeholder}\n invalid={invalid}\n />\n )}\n </FormField>\n );\n })}\n </div>\n )}\n />\n );\n}\n\nObjectRepeater.displayName = 'ObjectRepeater';\n","/**\n * List — RHF-driven sortable list of plain strings. Identical use-case to\n * `<StringRepeater sortable>` and now built on the same `<Repeater>`\n * primitive so the visual chrome (drag handle, ghost X remove, dashed\n * empty state, \"+ add\" button) matches the rest of the repeater family\n * exactly. Kept as a separate export because it ships with `sortable`\n * on by default — `<StringRepeater>` ships with sortable off.\n */\nimport { useFieldArray, useFormContext } from 'react-hook-form';\n\nimport { useStrings, type StringsProp } from '@/lib/strings';\n\nimport { Input } from './input';\nimport { Repeater } from './repeater';\nimport { defaultRepeaterStrings } from './repeaters.strings';\n\nexport interface ListStrings {\n addButton: string;\n emptyState: string;\n dragHandle: string;\n removeAriaLabel: string;\n}\n\nexport const defaultListStrings: ListStrings = {\n addButton: 'Add item',\n emptyState: defaultRepeaterStrings.emptyState,\n dragHandle: 'Drag to reorder',\n removeAriaLabel: defaultRepeaterStrings.removeAriaLabel,\n};\n\nexport interface ListProps {\n /** Field name in form */\n name: string;\n\n /** Input placeholder */\n placeholder?: string;\n\n /** @deprecated Use `strings.addButton` instead. */\n addButtonText?: string;\n\n /** @deprecated Use `strings.emptyState` instead. */\n emptyMessage?: string;\n\n /** Disable drag-to-reorder. Default `false` (sortable on). */\n disableSort?: boolean;\n\n /** Error state for styling (passed from FormField) */\n invalid?: boolean;\n\n /** String overrides merged over defaults. */\n strings?: StringsProp<ListStrings>;\n}\n\nexport function List({\n name,\n placeholder,\n addButtonText,\n emptyMessage,\n disableSort = false,\n invalid,\n strings: stringsProp,\n}: ListProps) {\n const strings = useStrings(defaultListStrings, {\n ...(addButtonText !== undefined ? { addButton: addButtonText } : {}),\n ...(emptyMessage !== undefined ? { emptyState: emptyMessage } : {}),\n ...(stringsProp ?? {}),\n });\n const { control, register } = useFormContext();\n const { fields, append, remove, move } = useFieldArray({ control, name });\n\n return (\n <Repeater className=\"list--component\"\n items={fields}\n sortable={!disableSort}\n onAdd={() => append('')}\n onRemove={(index) => remove(index)}\n onMove={(from, to) => move(from, to)}\n strings={{\n emptyState: strings.emptyState,\n addButton: strings.addButton,\n removeAriaLabel: strings.removeAriaLabel,\n dragHandleAriaLabel: strings.dragHandle,\n }}\n renderRow={(_field, { index }) => (\n <Input\n {...register(`${name}.${index}`)}\n placeholder={placeholder}\n invalid={invalid}\n />\n )}\n />\n );\n}\n\nList.displayName = 'List';\n","/**\n * PillRadioGroup — compact, inline single-select rendered as connected pill\n * buttons. Best for 2–4 options where a full `<Select>` is too heavy and\n * cards are too tall (e.g. timeframe toggles, view-mode switchers).\n *\n * Custom-styled buttons rather than the shadcn ToggleGroup primitive: the\n * primitive strips inner rounding when spacing=0, which doesn't match this\n * design system's pill connector style.\n */\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\nimport { useFormsConfig } from '@/lib/ui-provider';\nimport { resolveFormControlSize } from '../form-sizing';\nimport {\n\tchoicePillSizeTokens,\n\ttype ChoiceGroupBaseProps,\n\ttype ChoiceOptionBase,\n} from './choice-types';\n\nexport interface PillRadioGroupOption extends ChoiceOptionBase {}\n\nexport interface PillRadioGroupProps\n\textends Omit<ChoiceGroupBaseProps, 'name'> {\n\tname: string;\n\tvalue: string | null | undefined;\n\toptions: PillRadioGroupOption[];\n\tonChange: (value: string | null) => void;\n\t/** Allow deselecting (click active pill to clear). Default false. */\n\tallowClear?: boolean;\n\t/** Stretch pills to fill the container. */\n\tfullWidth?: boolean;\n}\n\nexport function PillRadioGroup({\n\tname,\n\tvalue,\n\toptions,\n\tonChange,\n\tallowClear = false,\n\tsize: sizeProp,\n\tfullWidth = false,\n\tdisabled = false,\n\tinvalid = false,\n\tclassName,\n}: PillRadioGroupProps) {\n\tconst { defaultControlSize } = useFormsConfig();\n\tconst size = resolveFormControlSize(sizeProp, defaultControlSize);\n\n\tconst handleClick = React.useCallback(\n\t\t(optionValue: string) => {\n\t\t\tif (optionValue === value) {\n\t\t\t\tif (allowClear) onChange(null);\n\t\t\t} else {\n\t\t\t\tonChange(optionValue);\n\t\t\t}\n\t\t},\n\t\t[allowClear, onChange, value],\n\t);\n\n\treturn (\n\t\t<div\n\t\t\tdata-name={name}\n\t\t\trole=\"radiogroup\"\n\t\t\taria-invalid={invalid || undefined}\n\t\t\tclassName={cn('pill-radio-group--component', \n\t\t\t\t'border-input inline-flex items-center overflow-hidden rounded-lg border',\n\t\t\t\tfullWidth && 'w-full',\n\t\t\t\t'aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/20',\n\t\t\t\tdisabled && 'pointer-events-none opacity-50',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{options.map((option, index) => {\n\t\t\t\tconst isSelected = option.value === value;\n\t\t\t\tconst Icon = option.icon;\n\t\t\t\tconst optionLabel =\n\t\t\t\t\ttypeof option.label === 'string' ? option.label : undefined;\n\t\t\t\treturn (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\trole=\"radio\"\n\t\t\t\t\t\taria-checked={isSelected}\n\t\t\t\t\t\taria-label={optionLabel || option.value}\n\t\t\t\t\t\tdisabled={disabled || option.disabled}\n\t\t\t\t\t\tonClick={() => handleClick(option.value)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'inline-flex select-none items-center justify-center font-medium transition-colors',\n\t\t\t\t\t\t\t'focus-visible:ring-ring/50 outline-none focus-visible:z-10 focus-visible:ring-2',\n\t\t\t\t\t\t\t'disabled:pointer-events-none disabled:opacity-50',\n\t\t\t\t\t\t\tchoicePillSizeTokens[size],\n\t\t\t\t\t\t\tfullWidth && 'flex-1',\n\t\t\t\t\t\t\tindex > 0 && 'border-input border-l',\n\t\t\t\t\t\t\tisSelected\n\t\t\t\t\t\t\t\t? 'bg-primary text-primary-foreground'\n\t\t\t\t\t\t\t\t: 'bg-background text-foreground hover:bg-muted',\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{!!Icon && <Icon className={cn('size-3.5', option.label && 'mr-1.5')} />}\n\t\t\t\t\t\t{option.label}\n\t\t\t\t\t</button>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n\nPillRadioGroup.displayName = 'PillRadioGroup';\n","import { useFormContext } from 'react-hook-form';\n\nimport { Input } from './input';\nimport { Textarea } from './textarea';\n\nimport { cn } from '@/lib/utils';\nexport interface LocalizedStringFieldProps {\n /** Field name (path in form values) - should point to object with locale keys (e.g., 'en' and 'bg') */\n name: string;\n\n /** Input type */\n type?: 'text' | 'textarea' | 'number';\n\n /** Placeholder text */\n placeholder?: string;\n\n /** Primary locale code (e.g., 'en') */\n primaryLocale: string;\n\n /** Secondary locale code (e.g., 'bg') */\n secondaryLocale: string;\n\n /** Current active locale ('primary' or 'secondary') */\n activeLocale: 'primary' | 'secondary';\n\n /** Error state for styling (passed from FormField) */\n invalid?: boolean;\n\n /** Additional class names */\n className?: string;\n}\n\n/**\n * LocalizedStringField - Input for bilingual string fields\n */\nexport function LocalizedStringField({\n name,\n type = 'text',\n placeholder,\n primaryLocale,\n secondaryLocale,\n activeLocale,\n invalid,\n className,\n}: LocalizedStringFieldProps) {\n const { register } = useFormContext();\n\n const localeKey = activeLocale === 'primary' ? primaryLocale : secondaryLocale;\n const fieldName = `${name}.${localeKey}`;\n\n if (type === 'textarea') {\n return (\n <Textarea\n {...register(fieldName)}\n placeholder={placeholder}\n minRows={3}\n invalid={invalid}\n className={cn('localized-string-field--component', className)}\n />\n );\n }\n\n return (\n <Input\n {...register(fieldName)}\n type={type === 'number' ? 'number' : 'text'}\n placeholder={placeholder}\n invalid={invalid}\n className={className}\n />\n );\n}\n\nLocalizedStringField.displayName = 'LocalizedStringField';\n","import { useFormContext } from 'react-hook-form';\n\nimport { Label } from '@/components/typography';\nimport { Input } from './input';\nimport { Textarea } from './textarea';\n\nexport interface LocalizedObjectFieldDef {\n /** Field name within the object */\n name: string;\n\n /** Label for the field */\n label: string;\n\n /** Input type */\n type?: 'text' | 'textarea' | 'number';\n\n /** Placeholder text */\n placeholder?: string;\n\n /** Whether the field is required */\n required?: boolean;\n}\n\nexport interface LocalizedObjectFieldProps {\n /** Field name (path in form values) - should point to object with locale keys */\n name: string;\n\n /** Field definitions for the object properties */\n fields: LocalizedObjectFieldDef[];\n\n /** Primary locale code (e.g., 'en') */\n primaryLocale: string;\n\n /** Secondary locale code (e.g., 'bg') */\n secondaryLocale: string;\n\n /** Current active locale ('primary' or 'secondary') */\n activeLocale: 'primary' | 'secondary';\n\n /** Error state for styling (passed from FormField) */\n invalid?: boolean;\n\n /** Additional class names */\n className?: string;\n}\n\n/**\n * LocalizedObjectField - Input for bilingual object fields\n */\nexport function LocalizedObjectField({\n name,\n fields,\n primaryLocale,\n secondaryLocale,\n activeLocale,\n invalid,\n className,\n}: LocalizedObjectFieldProps) {\n const { register } = useFormContext();\n\n const localeKey = activeLocale === 'primary' ? primaryLocale : secondaryLocale;\n\n return (\n <div className={`w-full space-y-3 rounded-md border p-4 ${className ?? ''}`}>\n {fields.map((field) => {\n const fieldName = `${name}.${localeKey}.${field.name}`;\n\n return (\n <div key={field.name} className=\"w-full space-y-1.5\">\n <Label htmlFor={fieldName}>\n {field.label}\n {!!field.required && <span className=\"text-destructive ml-1\">*</span>}\n </Label>\n {field.type === 'textarea' ? (\n <Textarea\n {...register(fieldName)}\n placeholder={field.placeholder}\n minRows={3}\n invalid={invalid}\n />\n ) : (\n <Input\n {...register(fieldName)}\n type={field.type === 'number' ? 'number' : 'text'}\n placeholder={field.placeholder}\n invalid={invalid}\n />\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\nLocalizedObjectField.displayName = 'LocalizedObjectField';\n","/**\n * LocalizedStringRepeater — bilingual variant of `<StringRepeater>`. The\n * `name` prop points at an object whose keys are locale codes and whose\n * values are string arrays; `activeLocale` selects which locale's array to\n * edit. Built on the shared `<Repeater>` primitive for visual parity with\n * the rest of the repeater family.\n */\nimport { useFieldArray, useFormContext } from 'react-hook-form';\n\nimport { useStrings, type StringsProp } from '@/lib/strings';\n\nimport { Repeater } from './repeater';\nimport { defaultRepeaterStrings } from './repeaters.strings';\nimport { Textarea } from './textarea';\n\nexport interface LocalizedStringRepeaterStrings {\n placeholder: string;\n addButton: string;\n emptyState: string;\n removeAriaLabel: string;\n}\n\nexport const defaultLocalizedStringRepeaterStrings: LocalizedStringRepeaterStrings = {\n placeholder: 'Enter value',\n addButton: defaultRepeaterStrings.addItem,\n emptyState: defaultRepeaterStrings.emptyState,\n removeAriaLabel: defaultRepeaterStrings.removeAriaLabel,\n};\n\nexport interface LocalizedStringRepeaterProps {\n /** Field name (path in form values) - should point to object with locale array keys */\n name: string;\n\n /** @deprecated Use `strings.placeholder` instead. */\n placeholder?: string;\n\n /** @deprecated Use `strings.addButton` instead. */\n addButtonText?: string;\n\n /** @deprecated Use `strings.emptyState` instead. */\n emptyMessage?: string;\n\n /** Primary locale code (e.g., 'en') */\n primaryLocale: string;\n\n /** Secondary locale code (e.g., 'bg') */\n secondaryLocale: string;\n\n /** Current active locale ('primary' or 'secondary') */\n activeLocale: 'primary' | 'secondary';\n\n /** Enable drag-to-reorder. Default `false`. */\n sortable?: boolean;\n\n /** Error state for styling (passed from FormField) */\n invalid?: boolean;\n\n /** String overrides merged over defaults. */\n strings?: StringsProp<LocalizedStringRepeaterStrings>;\n}\n\nexport function LocalizedStringRepeater({\n name,\n placeholder,\n addButtonText,\n emptyMessage,\n primaryLocale,\n secondaryLocale,\n activeLocale,\n invalid,\n sortable = false,\n strings: stringsProp,\n}: LocalizedStringRepeaterProps) {\n const strings = useStrings(defaultLocalizedStringRepeaterStrings, {\n ...(placeholder !== undefined ? { placeholder } : {}),\n ...(addButtonText !== undefined ? { addButton: addButtonText } : {}),\n ...(emptyMessage !== undefined ? { emptyState: emptyMessage } : {}),\n ...(stringsProp ?? {}),\n });\n const { control, register } = useFormContext();\n\n const localeKey = activeLocale === 'primary' ? primaryLocale : secondaryLocale;\n const fieldName = `${name}.${localeKey}`;\n\n const { fields, append, remove, move } = useFieldArray({\n control,\n name: fieldName,\n });\n\n return (\n <Repeater className=\"localized-string-repeater--component\"\n items={fields}\n sortable={sortable}\n onAdd={() => append('')}\n onRemove={(index) => remove(index)}\n onMove={(from, to) => move(from, to)}\n strings={{\n emptyState: strings.emptyState,\n addButton: strings.addButton,\n removeAriaLabel: strings.removeAriaLabel,\n }}\n renderRow={(_field, { index }) => (\n <Textarea\n {...register(`${fieldName}.${index}`)}\n placeholder={strings.placeholder}\n minRows={2}\n invalid={invalid}\n />\n )}\n />\n );\n}\n\nLocalizedStringRepeater.displayName = 'LocalizedStringRepeater';\n","import { useMemo } from 'react';\nimport type { SubmitHandler } from 'react-hook-form';\nimport { useForm } from 'react-hook-form';\n\nimport { ControlledFormField } from './form-field';\nimport { Input } from './fields';\nimport { Text } from '@/components/typography';\n\nimport { cn } from '@/lib/utils';\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\tisLoading?: boolean;\n\tlabel: string;\n}\n\ninterface PasswordFormValues {\n\tpassword: string;\n}\n\nexport function OperationPasswordForm(props: OperationPasswordFormProps) {\n\tconst { formId, onSubmit, errors, isLoading, 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 = Boolean(isLoading);\n\n\treturn (\n\t\t<form\n\t\t\tid={formId}\n\t\t\tonSubmit={handleSubmit(submit)}\n\t\t\tclassName={cn('operation-password-form--component', 'space-y-4')}\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</form>\n\t);\n}\n\nOperationPasswordForm.displayName = 'OperationPasswordForm';\n"],"mappings":"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"}