@vritti/quantum-ui 0.3.12 → 0.3.13

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 (477) hide show
  1. package/dist/Alert.js +1 -1
  2. package/dist/Alert.js.map +1 -1
  3. package/dist/Avatar.js +1 -1
  4. package/dist/Avatar.js.map +1 -1
  5. package/dist/Badge2.js +2 -2
  6. package/dist/BillingCycleSelector.js +37 -0
  7. package/dist/BillingCycleSelector.js.map +1 -0
  8. package/dist/Breadcrumb.js +1 -1
  9. package/dist/Breadcrumb.js.map +1 -1
  10. package/dist/Button.js +1 -1
  11. package/dist/Button.js.map +1 -1
  12. package/dist/Button2.js +2 -2
  13. package/dist/CardSkeleton.js.map +1 -1
  14. package/dist/CategoryFilter.js +6 -4
  15. package/dist/CategoryFilter.js.map +1 -1
  16. package/dist/Checkbox.js.map +1 -1
  17. package/dist/Checkbox2.js +4 -4
  18. package/dist/CheckboxGroup.js.map +1 -1
  19. package/dist/Collapsible.js.map +1 -1
  20. package/dist/Combination.js +1129 -0
  21. package/dist/Combination.js.map +1 -0
  22. package/dist/CompanySelector.js +20 -0
  23. package/dist/CompanySelector.js.map +1 -0
  24. package/dist/ConfirmHost.js.map +1 -1
  25. package/dist/CountrySelector.js +37 -0
  26. package/dist/CountrySelector.js.map +1 -0
  27. package/dist/CurrencyField.js +1 -0
  28. package/dist/CurrencyField.js.map +1 -1
  29. package/dist/CustomerSelector.js +2 -2
  30. package/dist/CustomerSelector.js.map +1 -1
  31. package/dist/DangerZoneSkeleton.js +21 -3
  32. package/dist/DangerZoneSkeleton.js.map +1 -1
  33. package/dist/DatePicker.js +3 -3
  34. package/dist/DatePicker.js.map +1 -1
  35. package/dist/DateTimePicker.js +2 -2
  36. package/dist/DetailSectionSkeleton.js.map +1 -1
  37. package/dist/Dialog.js.map +1 -1
  38. package/dist/DropdownMenu.js.map +1 -1
  39. package/dist/FeaturePermissionSelector.js +37 -0
  40. package/dist/FeaturePermissionSelector.js.map +1 -0
  41. package/dist/Form.js.map +1 -1
  42. package/dist/FormSection.js +4 -4
  43. package/dist/FormSection.js.map +1 -1
  44. package/dist/HierarchyGraph.js +5 -10621
  45. package/dist/HierarchyGraph.js.map +1 -1
  46. package/dist/ISOCountrySelect.js +283 -0
  47. package/dist/ISOCountrySelect.js.map +1 -0
  48. package/dist/IconSelect.js +1 -1
  49. package/dist/IconSelect.js.map +1 -1
  50. package/dist/InventoryItemSelector.js +2 -2
  51. package/dist/InventoryItemSelector.js.map +1 -1
  52. package/dist/Kbd.js +1 -1
  53. package/dist/Kbd.js.map +1 -1
  54. package/dist/Label.js +1 -1
  55. package/dist/LayoutModeContext.js.map +1 -1
  56. package/dist/LegalEntitySelector.js +37 -0
  57. package/dist/LegalEntitySelector.js.map +1 -0
  58. package/dist/LocationSelector.js +2 -2
  59. package/dist/LocationSelector.js.map +1 -1
  60. package/dist/LotSelector.js +2 -2
  61. package/dist/LotSelector.js.map +1 -1
  62. package/dist/OTPField.js.map +1 -1
  63. package/dist/PageContent.js.map +1 -1
  64. package/dist/PageHeaderSkeleton.js +21 -10
  65. package/dist/PageHeaderSkeleton.js.map +1 -1
  66. package/dist/PasswordField.js.map +1 -1
  67. package/dist/PermissionGate.js +49 -5
  68. package/dist/PermissionGate.js.map +1 -1
  69. package/dist/PersonSelector.js +20 -0
  70. package/dist/PersonSelector.js.map +1 -0
  71. package/dist/PhoneField.js.map +1 -1
  72. package/dist/PurchaseOrderSelector.js +2 -2
  73. package/dist/PurchaseOrderSelector.js.map +1 -1
  74. package/dist/QuantSelector.js +2 -2
  75. package/dist/QuantSelector.js.map +1 -1
  76. package/dist/RadioGroup.js +6 -6
  77. package/dist/RadioGroup.js.map +1 -1
  78. package/dist/RoleSelector.js +20 -0
  79. package/dist/RoleSelector.js.map +1 -0
  80. package/dist/Select.js +4 -1
  81. package/dist/Select.js.map +1 -1
  82. package/dist/SelectFilter.js.map +1 -1
  83. package/dist/Separator.js.map +1 -1
  84. package/dist/SerialSelector.js +2 -2
  85. package/dist/SerialSelector.js.map +1 -1
  86. package/dist/Sidebar.js +2 -2
  87. package/dist/Sidebar.js.map +1 -1
  88. package/dist/SingleSelect.js +2 -2
  89. package/dist/SingleSelect.js.map +1 -1
  90. package/dist/SiteGroupSelector.js +37 -0
  91. package/dist/SiteGroupSelector.js.map +1 -0
  92. package/dist/SiteSelector.js +37 -0
  93. package/dist/SiteSelector.js.map +1 -0
  94. package/dist/Sonner.js +1 -1
  95. package/dist/Sonner.js.map +1 -1
  96. package/dist/Sortable.js +4 -4417
  97. package/dist/Sortable.js.map +1 -1
  98. package/dist/StepProgressIndicator.js.map +1 -1
  99. package/dist/SupplierItemSelector.js +2 -2
  100. package/dist/SupplierItemSelector.js.map +1 -1
  101. package/dist/SupplierSelector.js +2 -2
  102. package/dist/SupplierSelector.js.map +1 -1
  103. package/dist/Switch.js +3 -3
  104. package/dist/Switch.js.map +1 -1
  105. package/dist/TabsSkeleton.js +101 -49
  106. package/dist/TabsSkeleton.js.map +1 -1
  107. package/dist/TaxClassSelector.js +20 -0
  108. package/dist/TaxClassSelector.js.map +1 -0
  109. package/dist/TextField.js.map +1 -1
  110. package/dist/ThemeContext.js.map +1 -1
  111. package/dist/ThemeToggle.js.map +1 -1
  112. package/dist/Toggle.js +1 -1
  113. package/dist/Toggle.js.map +1 -1
  114. package/dist/Tooltip.js.map +1 -1
  115. package/dist/Typography.js.map +1 -1
  116. package/dist/UomSelector.js +2 -2
  117. package/dist/UomSelector.js.map +1 -1
  118. package/dist/UploadFile.js.map +1 -1
  119. package/dist/assets/quantum-ui.css +25 -13
  120. package/dist/calendar2.js +1 -1
  121. package/dist/collapsible2.js +1 -1
  122. package/dist/components/CompanySelector.js +2 -0
  123. package/dist/components/CompanySelector.js.map +1 -0
  124. package/dist/components/FormattedDate.js +2 -2
  125. package/dist/components/HierarchyGraph.js +2 -1
  126. package/dist/components/HierarchyGraph.js.map +1 -1
  127. package/dist/components/PermissionGate.js +1 -1
  128. package/dist/components/PersonSelector.js +2 -0
  129. package/dist/components/PersonSelector.js.map +1 -0
  130. package/dist/components/ScanBarcodeButton.js.map +1 -1
  131. package/dist/components/TreeView.js +7 -7
  132. package/dist/components/TreeView.js.map +1 -1
  133. package/dist/core.esm.js +4025 -0
  134. package/dist/core.esm.js.map +1 -0
  135. package/dist/dropdown-menu.js +10 -10
  136. package/dist/field.js +1 -1
  137. package/dist/image-component.js.map +1 -1
  138. package/dist/index.js +15 -3
  139. package/dist/index.js.map +1 -1
  140. package/dist/index10.js +102 -1499
  141. package/dist/index10.js.map +1 -1
  142. package/dist/index11.js +1499 -37
  143. package/dist/index11.js.map +1 -1
  144. package/dist/index12.js +29 -477
  145. package/dist/index12.js.map +1 -1
  146. package/dist/index13.js +427 -231
  147. package/dist/index13.js.map +1 -1
  148. package/dist/index14.js +215 -1074
  149. package/dist/index14.js.map +1 -1
  150. package/dist/index15.js +1140 -14
  151. package/dist/index15.js.map +1 -1
  152. package/dist/index16.js +13 -19
  153. package/dist/index16.js.map +1 -1
  154. package/dist/index17.js +24 -172
  155. package/dist/index17.js.map +1 -1
  156. package/dist/index18.js +168 -175
  157. package/dist/index18.js.map +1 -1
  158. package/dist/index19.js +173 -201
  159. package/dist/index19.js.map +1 -1
  160. package/dist/index20.js +203 -69
  161. package/dist/index20.js.map +1 -1
  162. package/dist/index21.js +70 -211
  163. package/dist/index21.js.map +1 -1
  164. package/dist/index22.js +207 -117
  165. package/dist/index22.js.map +1 -1
  166. package/dist/index23.js +123 -71
  167. package/dist/index23.js.map +1 -1
  168. package/dist/index24.js +74 -11
  169. package/dist/index24.js.map +1 -1
  170. package/dist/index25.js +13 -1134
  171. package/dist/index25.js.map +1 -1
  172. package/dist/index26.js +1120 -219
  173. package/dist/index26.js.map +1 -1
  174. package/dist/index27.js +202 -2506
  175. package/dist/index27.js.map +1 -1
  176. package/dist/index28.js +2527 -23
  177. package/dist/index28.js.map +1 -1
  178. package/dist/index29.js +32 -4
  179. package/dist/index29.js.map +1 -1
  180. package/dist/index3.js +11543 -267
  181. package/dist/index3.js.map +1 -1
  182. package/dist/index30.js +3 -1124
  183. package/dist/index30.js.map +1 -1
  184. package/dist/index31.js +1 -1
  185. package/dist/index32.js +7 -7
  186. package/dist/index34.js +1 -1
  187. package/dist/index37.js +1 -1
  188. package/dist/index38.js +21 -42
  189. package/dist/index38.js.map +1 -1
  190. package/dist/index4.js +272 -132
  191. package/dist/index4.js.map +1 -1
  192. package/dist/index5.js +138 -388
  193. package/dist/index5.js.map +1 -1
  194. package/dist/index6.js +386 -7
  195. package/dist/index6.js.map +1 -1
  196. package/dist/index7.js +13 -92
  197. package/dist/index7.js.map +1 -1
  198. package/dist/index8.js +92 -43
  199. package/dist/index8.js.map +1 -1
  200. package/dist/index9.js +42 -102
  201. package/dist/index9.js.map +1 -1
  202. package/dist/lib/components/Alert/Alert.d.ts.map +1 -1
  203. package/dist/lib/components/Avatar/Avatar.d.ts.map +1 -1
  204. package/dist/lib/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  205. package/dist/lib/components/Button/Button.d.ts.map +1 -1
  206. package/dist/lib/components/Card/CardSkeleton.d.ts.map +1 -1
  207. package/dist/lib/components/Checkbox/Checkbox.d.ts.map +1 -1
  208. package/dist/lib/components/CheckboxGroup/CheckboxGroup.d.ts.map +1 -1
  209. package/dist/lib/components/Collapsible/Collapsible.d.ts.map +1 -1
  210. package/dist/lib/components/CompanySelector/CompanySelector.d.ts +4 -0
  211. package/dist/lib/components/CompanySelector/CompanySelector.d.ts.map +1 -0
  212. package/dist/lib/components/CompanySelector/index.d.ts +2 -0
  213. package/dist/lib/components/CompanySelector/index.d.ts.map +1 -0
  214. package/dist/lib/components/ConfirmHost/ConfirmHost.d.ts.map +1 -1
  215. package/dist/lib/components/CurrencyField/CurrencyField.d.ts.map +1 -1
  216. package/dist/lib/components/DangerZone/DangerZone.d.ts +3 -1
  217. package/dist/lib/components/DangerZone/DangerZone.d.ts.map +1 -1
  218. package/dist/lib/components/DataTable/CompactTableSkeleton.d.ts.map +1 -1
  219. package/dist/lib/components/DataTable/DataTable.d.ts.map +1 -1
  220. package/dist/lib/components/DataTable/cells/cells.d.ts.map +1 -1
  221. package/dist/lib/components/DataTable/components/DataTableSelectionBar.d.ts.map +1 -1
  222. package/dist/lib/components/DataTable/components/RowActions.d.ts.map +1 -1
  223. package/dist/lib/components/DataTable/hooks/useDataTable.d.ts.map +1 -1
  224. package/dist/lib/components/DataTable/store/store.d.ts.map +1 -1
  225. package/dist/lib/components/DataTable/types.d.ts.map +1 -1
  226. package/dist/lib/components/DatePicker/DatePicker.d.ts +2 -2
  227. package/dist/lib/components/DatePicker/DatePicker.d.ts.map +1 -1
  228. package/dist/lib/components/DetailField/DetailField.d.ts.map +1 -1
  229. package/dist/lib/components/DetailField/DetailHeader.d.ts.map +1 -1
  230. package/dist/lib/components/DetailField/DetailSectionSkeleton.d.ts.map +1 -1
  231. package/dist/lib/components/Dialog/Dialog.d.ts.map +1 -1
  232. package/dist/lib/components/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  233. package/dist/lib/components/DropdownMenu/types.d.ts.map +1 -1
  234. package/dist/lib/components/Editor/editor-ui/color-picker.d.ts.map +1 -1
  235. package/dist/lib/components/Editor/editor-ui/image-component.d.ts.map +1 -1
  236. package/dist/lib/components/Editor/nodes/autocomplete-node.d.ts.map +1 -1
  237. package/dist/lib/components/Editor/plugins/actions/max-length-plugin.d.ts.map +1 -1
  238. package/dist/lib/components/Editor/plugins/embeds/auto-embed-plugin.d.ts.map +1 -1
  239. package/dist/lib/components/Editor/plugins/embeds/youtube-plugin.d.ts.map +1 -1
  240. package/dist/lib/components/Editor/plugins/emojis-plugin.d.ts.map +1 -1
  241. package/dist/lib/components/Editor/plugins/floating-link-editor-plugin.d.ts.map +1 -1
  242. package/dist/lib/components/Editor/plugins/floating-text-format-plugin.d.ts.map +1 -1
  243. package/dist/lib/components/Editor/plugins/images-plugin.d.ts.map +1 -1
  244. package/dist/lib/components/Editor/plugins/keywords-plugin.d.ts.map +1 -1
  245. package/dist/lib/components/Editor/plugins/layout-plugin.d.ts.map +1 -1
  246. package/dist/lib/components/Editor/plugins/list-max-indent-level-plugin.d.ts.map +1 -1
  247. package/dist/lib/components/Editor/plugins/mentions-plugin.d.ts.map +1 -1
  248. package/dist/lib/components/Editor/plugins/picker/component-picker-option.d.ts.map +1 -1
  249. package/dist/lib/components/Editor/plugins/tab-focus-plugin.d.ts.map +1 -1
  250. package/dist/lib/components/Editor/plugins/table-plugin.d.ts.map +1 -1
  251. package/dist/lib/components/Editor/plugins/toolbar/clear-formatting-toolbar-plugin.d.ts.map +1 -1
  252. package/dist/lib/components/Editor/plugins/typing-pref-plugin.d.ts.map +1 -1
  253. package/dist/lib/components/Editor/shared/invariant.d.ts.map +1 -1
  254. package/dist/lib/components/Editor/shared/react-patches.d.ts.map +1 -1
  255. package/dist/lib/components/Editor/shared/react-test-utils.d.ts.map +1 -1
  256. package/dist/lib/components/Editor/shared/simple-diff-with-cursor.d.ts.map +1 -1
  257. package/dist/lib/components/Editor/shared/use-layout-effect.d.ts.map +1 -1
  258. package/dist/lib/components/Editor/transformers/markdown-table-transformer.d.ts.map +1 -1
  259. package/dist/lib/components/Editor/utils/collapsible.d.ts.map +1 -1
  260. package/dist/lib/components/Editor/utils/doc-serialization.d.ts.map +1 -1
  261. package/dist/lib/components/Editor/utils/emoji-list.d.ts.map +1 -1
  262. package/dist/lib/components/Editor/utils/get-dom-range-rect.d.ts.map +1 -1
  263. package/dist/lib/components/Editor/utils/get-selected-node.d.ts.map +1 -1
  264. package/dist/lib/components/Editor/utils/guard.d.ts.map +1 -1
  265. package/dist/lib/components/Editor/utils/set-floating-elem-position-for-link-editor.d.ts.map +1 -1
  266. package/dist/lib/components/Editor/utils/set-floating-elem-position.d.ts.map +1 -1
  267. package/dist/lib/components/Editor/utils/swipe.d.ts.map +1 -1
  268. package/dist/lib/components/Editor/utils/url.d.ts.map +1 -1
  269. package/dist/lib/components/Form/Form.d.ts.map +1 -1
  270. package/dist/lib/components/OTPField/OTPField.d.ts.map +1 -1
  271. package/dist/lib/components/PageContent/PageContent.d.ts.map +1 -1
  272. package/dist/lib/components/PageHeader/PageHeader.d.ts.map +1 -1
  273. package/dist/lib/components/PasswordField/PasswordField.d.ts.map +1 -1
  274. package/dist/lib/components/PermissionGate/PermissionGate.d.ts +15 -4
  275. package/dist/lib/components/PermissionGate/PermissionGate.d.ts.map +1 -1
  276. package/dist/lib/components/PermissionGate/index.d.ts +1 -1
  277. package/dist/lib/components/PermissionGate/index.d.ts.map +1 -1
  278. package/dist/lib/components/PersonSelector/PersonSelector.d.ts +4 -0
  279. package/dist/lib/components/PersonSelector/PersonSelector.d.ts.map +1 -0
  280. package/dist/lib/components/PersonSelector/index.d.ts +2 -0
  281. package/dist/lib/components/PersonSelector/index.d.ts.map +1 -0
  282. package/dist/lib/components/PhoneField/PhoneField.d.ts.map +1 -1
  283. package/dist/lib/components/RadioGroup/RadioGroup.d.ts.map +1 -1
  284. package/dist/lib/components/ScanBarcodeButton/ScanBarcodeButton.d.ts.map +1 -1
  285. package/dist/lib/components/Select/SelectFilter.d.ts.map +1 -1
  286. package/dist/lib/components/Select/components/MultiSelect/MultiSelect.d.ts.map +1 -1
  287. package/dist/lib/components/Select/components/MultiSelect/MultiSelectFilter.d.ts.map +1 -1
  288. package/dist/lib/components/Select/components/SingleSelect/SingleSelect.d.ts.map +1 -1
  289. package/dist/lib/components/Select/components/SingleSelect/SingleSelectFilter.d.ts.map +1 -1
  290. package/dist/lib/components/Select/hooks/useSelect.d.ts.map +1 -1
  291. package/dist/lib/components/Select/hooks/useSingleSelect.d.ts.map +1 -1
  292. package/dist/lib/components/Select/types.d.ts +1 -1
  293. package/dist/lib/components/Select/types.d.ts.map +1 -1
  294. package/dist/lib/components/Separator/Separator.d.ts.map +1 -1
  295. package/dist/lib/components/Sidebar/Sidebar.d.ts.map +1 -1
  296. package/dist/lib/components/Sonner/Sonner.d.ts.map +1 -1
  297. package/dist/lib/components/Sonner/toast.d.ts.map +1 -1
  298. package/dist/lib/components/StepProgressIndicator/StepProgressIndicator.d.ts.map +1 -1
  299. package/dist/lib/components/Switch/Switch.d.ts.map +1 -1
  300. package/dist/lib/components/Tabs/Tabs.d.ts +2 -0
  301. package/dist/lib/components/Tabs/Tabs.d.ts.map +1 -1
  302. package/dist/lib/components/Tabs/TabsSkeleton.d.ts.map +1 -1
  303. package/dist/lib/components/TextField/TextField.d.ts.map +1 -1
  304. package/dist/lib/components/ThemeToggle/ThemeToggle.d.ts.map +1 -1
  305. package/dist/lib/components/Toggle/Toggle.d.ts.map +1 -1
  306. package/dist/lib/components/Tooltip/Tooltip.d.ts.map +1 -1
  307. package/dist/lib/components/TreeView/TreeView.d.ts.map +1 -1
  308. package/dist/lib/components/Typography/Typography.d.ts.map +1 -1
  309. package/dist/lib/components/UploadFile/UploadFile.d.ts.map +1 -1
  310. package/dist/lib/components/index.d.ts +2 -0
  311. package/dist/lib/components/index.d.ts.map +1 -1
  312. package/dist/lib/config/index.d.ts.map +1 -1
  313. package/dist/lib/context/LayoutModeContext.d.ts.map +1 -1
  314. package/dist/lib/context/ThemeContext.d.ts.map +1 -1
  315. package/dist/lib/hooks/useBUCurrency.d.ts.map +1 -1
  316. package/dist/lib/hooks/useBUTimezone.d.ts.map +1 -1
  317. package/dist/lib/hooks/useBarcodeScanner.d.ts.map +1 -1
  318. package/dist/lib/hooks/useFormatters.d.ts.map +1 -1
  319. package/dist/lib/hooks/useSSE.d.ts.map +1 -1
  320. package/dist/lib/hooks/useTheme.d.ts.map +1 -1
  321. package/dist/lib/index.d.ts.map +1 -1
  322. package/dist/lib/selects/billing-cycle/BillingCycleFilter.d.ts +12 -0
  323. package/dist/lib/selects/billing-cycle/BillingCycleFilter.d.ts.map +1 -0
  324. package/dist/lib/selects/billing-cycle/BillingCycleSelector.d.ts +4 -0
  325. package/dist/lib/selects/billing-cycle/BillingCycleSelector.d.ts.map +1 -0
  326. package/dist/lib/selects/billing-cycle/index.d.ts +3 -0
  327. package/dist/lib/selects/billing-cycle/index.d.ts.map +1 -0
  328. package/dist/lib/selects/category/CategoryFilter.d.ts.map +1 -1
  329. package/dist/lib/selects/category/CategorySelector.d.ts.map +1 -1
  330. package/dist/lib/selects/cost-category/CostCategorySelector.d.ts.map +1 -1
  331. package/dist/lib/selects/country/CountryFilter.d.ts +12 -0
  332. package/dist/lib/selects/country/CountryFilter.d.ts.map +1 -0
  333. package/dist/lib/selects/country/CountrySelector.d.ts +4 -0
  334. package/dist/lib/selects/country/CountrySelector.d.ts.map +1 -0
  335. package/dist/lib/selects/country/index.d.ts +3 -0
  336. package/dist/lib/selects/country/index.d.ts.map +1 -0
  337. package/dist/lib/selects/feature-permission/FeaturePermissionFilter.d.ts +12 -0
  338. package/dist/lib/selects/feature-permission/FeaturePermissionFilter.d.ts.map +1 -0
  339. package/dist/lib/selects/feature-permission/FeaturePermissionSelector.d.ts +4 -0
  340. package/dist/lib/selects/feature-permission/FeaturePermissionSelector.d.ts.map +1 -0
  341. package/dist/lib/selects/feature-permission/index.d.ts +3 -0
  342. package/dist/lib/selects/feature-permission/index.d.ts.map +1 -0
  343. package/dist/lib/selects/icon/IconSelect.d.ts.map +1 -1
  344. package/dist/lib/selects/index.d.ts +9 -0
  345. package/dist/lib/selects/index.d.ts.map +1 -1
  346. package/dist/lib/selects/inventory-item/InventoryItemSelector.d.ts +2 -2
  347. package/dist/lib/selects/inventory-item/InventoryItemSelector.d.ts.map +1 -1
  348. package/dist/lib/selects/iso-country/ISOCountrySelect.d.ts +15 -0
  349. package/dist/lib/selects/iso-country/ISOCountrySelect.d.ts.map +1 -0
  350. package/dist/lib/selects/iso-country/index.d.ts +3 -0
  351. package/dist/lib/selects/iso-country/index.d.ts.map +1 -0
  352. package/dist/lib/selects/iso-country/iso-countries.d.ts +7 -0
  353. package/dist/lib/selects/iso-country/iso-countries.d.ts.map +1 -0
  354. package/dist/lib/selects/legal-entity/LegalEntityFilter.d.ts +12 -0
  355. package/dist/lib/selects/legal-entity/LegalEntityFilter.d.ts.map +1 -0
  356. package/dist/lib/selects/legal-entity/LegalEntitySelector.d.ts +4 -0
  357. package/dist/lib/selects/legal-entity/LegalEntitySelector.d.ts.map +1 -0
  358. package/dist/lib/selects/legal-entity/index.d.ts +3 -0
  359. package/dist/lib/selects/legal-entity/index.d.ts.map +1 -0
  360. package/dist/lib/selects/location/LocationSelector.d.ts.map +1 -1
  361. package/dist/lib/selects/purchase-order/PurchaseOrderSelector.d.ts.map +1 -1
  362. package/dist/lib/selects/purchase-order-item/PurchaseOrderItemSelector.d.ts.map +1 -1
  363. package/dist/lib/selects/role/RoleSelector.d.ts +4 -0
  364. package/dist/lib/selects/role/RoleSelector.d.ts.map +1 -0
  365. package/dist/lib/selects/role/index.d.ts +2 -0
  366. package/dist/lib/selects/role/index.d.ts.map +1 -0
  367. package/dist/lib/selects/serial/SerialSelector.d.ts.map +1 -1
  368. package/dist/lib/selects/site/SiteFilter.d.ts +12 -0
  369. package/dist/lib/selects/site/SiteFilter.d.ts.map +1 -0
  370. package/dist/lib/selects/site/SiteSelector.d.ts +4 -0
  371. package/dist/lib/selects/site/SiteSelector.d.ts.map +1 -0
  372. package/dist/lib/selects/site/index.d.ts +3 -0
  373. package/dist/lib/selects/site/index.d.ts.map +1 -0
  374. package/dist/lib/selects/site-group/SiteGroupFilter.d.ts +12 -0
  375. package/dist/lib/selects/site-group/SiteGroupFilter.d.ts.map +1 -0
  376. package/dist/lib/selects/site-group/SiteGroupSelector.d.ts +4 -0
  377. package/dist/lib/selects/site-group/SiteGroupSelector.d.ts.map +1 -0
  378. package/dist/lib/selects/site-group/index.d.ts +3 -0
  379. package/dist/lib/selects/site-group/index.d.ts.map +1 -0
  380. package/dist/lib/selects/supplier/SupplierSelector.d.ts.map +1 -1
  381. package/dist/lib/selects/supplier-item/SupplierItemFilter.d.ts.map +1 -1
  382. package/dist/lib/selects/supplier-item/SupplierItemSelector.d.ts.map +1 -1
  383. package/dist/lib/selects/tax-class/TaxClassSelector.d.ts +4 -0
  384. package/dist/lib/selects/tax-class/TaxClassSelector.d.ts.map +1 -0
  385. package/dist/lib/selects/tax-class/index.d.ts +2 -0
  386. package/dist/lib/selects/tax-class/index.d.ts.map +1 -0
  387. package/dist/lib/theme/index.d.ts.map +1 -1
  388. package/dist/lib/types/catalog-resolver.d.ts +50 -17
  389. package/dist/lib/types/catalog-resolver.d.ts.map +1 -1
  390. package/dist/lib/utils/axios.d.ts.map +1 -1
  391. package/dist/lib/utils/cn.d.ts +3 -0
  392. package/dist/lib/utils/cn.d.ts.map +1 -0
  393. package/dist/lib/utils/dagre.d.ts +2 -0
  394. package/dist/lib/utils/dagre.d.ts.map +1 -0
  395. package/dist/lib/utils/dnd-kit/core.d.ts +2 -0
  396. package/dist/lib/utils/dnd-kit/core.d.ts.map +1 -0
  397. package/dist/lib/utils/dnd-kit/sortable.d.ts +2 -0
  398. package/dist/lib/utils/dnd-kit/sortable.d.ts.map +1 -0
  399. package/dist/lib/utils/dnd-kit/utilities.d.ts +2 -0
  400. package/dist/lib/utils/dnd-kit/utilities.d.ts.map +1 -0
  401. package/dist/lib/utils/formHelpers.d.ts.map +1 -1
  402. package/dist/lib/utils/format.d.ts.map +1 -1
  403. package/dist/lib/utils/permission-deps.d.ts +9 -0
  404. package/dist/lib/utils/permission-deps.d.ts.map +1 -0
  405. package/dist/lib/utils/react-flow.d.ts +2 -0
  406. package/dist/lib/utils/react-flow.d.ts.map +1 -0
  407. package/dist/lib/utils/zod.d.ts +9 -0
  408. package/dist/lib/utils/zod.d.ts.map +1 -1
  409. package/dist/popover.js +1 -1
  410. package/dist/select2.js +1 -1
  411. package/dist/selects/billing-cycle.js +2 -0
  412. package/dist/selects/billing-cycle.js.map +1 -0
  413. package/dist/selects/cost-category.js +2 -2
  414. package/dist/selects/cost-category.js.map +1 -1
  415. package/dist/selects/country.js +2 -0
  416. package/dist/selects/country.js.map +1 -0
  417. package/dist/selects/feature-permission.js +2 -0
  418. package/dist/selects/feature-permission.js.map +1 -0
  419. package/dist/selects/iso-country.js +2 -0
  420. package/dist/selects/iso-country.js.map +1 -0
  421. package/dist/selects/legal-entity.js +2 -0
  422. package/dist/selects/legal-entity.js.map +1 -0
  423. package/dist/selects/purchase-order-item.js +1 -1
  424. package/dist/selects/purchase-order-item.js.map +1 -1
  425. package/dist/selects/role.js +2 -0
  426. package/dist/selects/role.js.map +1 -0
  427. package/dist/selects/site-group.js +2 -0
  428. package/dist/selects/site-group.js.map +1 -0
  429. package/dist/selects/site.js +2 -0
  430. package/dist/selects/site.js.map +1 -0
  431. package/dist/selects/tax-class.js +2 -0
  432. package/dist/selects/tax-class.js.map +1 -0
  433. package/dist/selects/tax-group.js +2 -2
  434. package/dist/selects/tax-group.js.map +1 -1
  435. package/dist/separator2.js +1 -1
  436. package/dist/sortable.esm.js +780 -0
  437. package/dist/sortable.esm.js.map +1 -0
  438. package/dist/theme/index.js.map +1 -1
  439. package/dist/toast.js +2 -26
  440. package/dist/toast.js.map +1 -1
  441. package/dist/tooltip2.js +1 -1
  442. package/dist/types/catalog-resolver.js +5 -2
  443. package/dist/types/catalog-resolver.js.map +1 -1
  444. package/dist/useBUTimezone.js.map +1 -1
  445. package/dist/useDataTable.js +58 -60
  446. package/dist/useDataTable.js.map +1 -1
  447. package/dist/useFormatters.js.map +1 -1
  448. package/dist/useTheme.js.map +1 -1
  449. package/dist/useTimer.js +2 -2
  450. package/dist/useTimer.js.map +1 -1
  451. package/dist/utilities.esm.js +333 -0
  452. package/dist/utilities.esm.js.map +1 -0
  453. package/dist/utils/axios.js +1 -1
  454. package/dist/utils/axios.js.map +1 -1
  455. package/dist/utils/cn.js +6 -0
  456. package/dist/utils/cn.js.map +1 -0
  457. package/dist/utils/currency.js +2 -2
  458. package/dist/utils/dagre.js +4 -0
  459. package/dist/utils/dagre.js.map +1 -0
  460. package/dist/utils/dnd-kit/core.js +2 -0
  461. package/dist/utils/dnd-kit/core.js.map +1 -0
  462. package/dist/utils/dnd-kit/sortable.js +2 -0
  463. package/dist/utils/dnd-kit/sortable.js.map +1 -0
  464. package/dist/utils/dnd-kit/utilities.js +2 -0
  465. package/dist/utils/dnd-kit/utilities.js.map +1 -0
  466. package/dist/utils/format.js +2 -2
  467. package/dist/utils/format.js.map +1 -1
  468. package/dist/utils/hotkeys.js +1 -1
  469. package/dist/utils/money.js +1 -1
  470. package/dist/utils/permission-deps.js +64 -0
  471. package/dist/utils/permission-deps.js.map +1 -0
  472. package/dist/utils/react-flow.js +2 -0
  473. package/dist/utils/react-flow.js.map +1 -0
  474. package/dist/utils/timezone.js +1 -1
  475. package/dist/utils/zod.js +11 -1
  476. package/dist/utils/zod.js.map +1 -1
  477. package/package.json +73 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TextField.js","sources":["../lib/components/TextField/TextField.tsx"],"sourcesContent":["import { ChevronDown, ChevronUp } from 'lucide-react';\nimport React from 'react';\nimport { Input } from '../../../shadcn/shadcnInput';\nimport { cn } from '../../../shadcn/utils';\nimport { Field, FieldDescription, FieldError, FieldLabel } from '../Field';\n\nexport interface TextFieldProps extends React.ComponentProps<'input'> {\n label?: string;\n description?: React.ReactNode;\n error?: string;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n // Blocks negative values and '-'/'e' keys. Combined with `integer`, also blocks `0` and\n // sets min to 1 (so positive+integer means ≥1). For decimal mode, zero is still typeable so\n // the user can start \"0.5\"; zod is the final gate.\n positive?: boolean;\n // Blocks zero. Combined with `integer`, blocks `0` as the first keystroke. Use independently\n // from `positive` when the field accepts signed-but-not-zero values.\n nonZero?: boolean;\n // Blocks decimal input ('.' and ','); switches inputMode to numeric\n integer?: boolean;\n}\n\n// TextField molecule - Input + Label composition using Field system\nexport const TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(\n (\n {\n label,\n description,\n error,\n className,\n id,\n disabled,\n startAdornment,\n endAdornment,\n positive,\n nonZero,\n integer,\n onChange,\n style,\n ...props\n },\n ref,\n ) => {\n const isNumberType = props.type === 'number';\n const normalizedType = isNumberType ? 'text' : props.type;\n const normalizedInputMode = props.inputMode ?? (isNumberType ? (integer ? 'numeric' : 'decimal') : undefined);\n // Resolve the actual minimum: positive floor takes precedence when both are set, so\n // `positive` always blocks negatives even if a contradictory `min` is passed.\n // For integer mode, `positive` means ≥1 (floor 1). For decimal mode, HTML min stays at 0 so\n // values like 0.3 / 0.5 remain typeable; the form/zod layer rejects plain 0.\n const positiveFloor = positive ? (integer ? 1 : 0) : undefined;\n const propsMinNum = props.min != null && props.min !== '' ? Number(props.min) : undefined;\n const propsMinValid = propsMinNum !== undefined && Number.isFinite(propsMinNum) ? propsMinNum : undefined;\n const effectiveMin =\n positiveFloor !== undefined && propsMinValid !== undefined\n ? Math.max(positiveFloor, propsMinValid)\n : (propsMinValid ?? positiveFloor);\n const inputRef = React.useRef<HTMLInputElement>(null);\n // Tracks the last raw string typed so intermediate states like \"-\" or \"0.\" survive the\n // round-trip through RHF. Must be state (not a ref) so updates trigger a re-render and\n // React's controlled input doesn't revert the DOM to the canonical number.\n const [rawInput, setRawInput] = React.useState<string>('');\n // Trailing overlay (constraint hint + stepper / end adornment) is measured at runtime so the\n // input reserves exactly its width as right padding — a one-char hint like \"+\" no longer costs\n // the same as \"Range: 0 - 100\". Re-measures on content/size changes via ResizeObserver.\n const endOverlayRef = React.useRef<HTMLDivElement>(null);\n const [endPadding, setEndPadding] = React.useState<number | undefined>(undefined);\n\n const assignRef = React.useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref],\n );\n\n const setInputNumericValue = React.useCallback(\n (delta: 1 | -1) => {\n if (!isNumberType || disabled) return;\n const input = inputRef.current;\n if (!input) return;\n\n const parsedStep = Number(props.step);\n const step = Number.isFinite(parsedStep) && parsedStep > 0 ? parsedStep : 1;\n const parsedMax = Number(props.max);\n const max = Number.isFinite(parsedMax) ? parsedMax : undefined;\n const current = Number(input.value);\n const baseValue = Number.isFinite(current) ? current : (effectiveMin ?? 0);\n\n let next = baseValue + delta * step;\n if (effectiveMin !== undefined) next = Math.max(effectiveMin, next);\n if (max !== undefined) next = Math.min(max, next);\n\n const stepString = String(step);\n const decimals = integer || stepString.includes('.') === false ? 0 : (stepString.split('.')[1]?.length ?? 0);\n const nextValue = decimals > 0 ? next.toFixed(decimals) : String(Math.round(next));\n\n const valueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value')?.set;\n valueSetter?.call(input, nextValue);\n input.dispatchEvent(new Event('input', { bubbles: true }));\n },\n [isNumberType, disabled, effectiveMin, integer, props.max, props.step],\n );\n\n const handleChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n if (isNumberType) {\n const raw = event.target.value;\n setRawInput(raw);\n const num = raw === '' ? NaN : Number(raw);\n (onChange as unknown as (v: number) => void)?.(num);\n } else {\n onChange?.(event);\n }\n },\n [isNumberType, onChange],\n );\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n props.onKeyDown?.(event);\n if (event.defaultPrevented || !isNumberType || disabled) return;\n if (positive && (event.key === '-' || event.key === 'e')) {\n event.preventDefault();\n return;\n }\n if (integer && (event.key === '.' || event.key === ',' || event.key === 'e')) {\n event.preventDefault();\n return;\n }\n // Block '0' as the first keystroke in integer mode when either `positive` (≥1) or\n // `nonZero` is set. Decimal mode needs '0' to remain typeable so the user can start \"0.3\".\n if (\n (positive || nonZero) &&\n integer &&\n event.key === '0' &&\n (event.currentTarget.value === '' || event.currentTarget.value === '0')\n ) {\n event.preventDefault();\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setInputNumericValue(1);\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n setInputNumericValue(-1);\n }\n },\n [isNumberType, disabled, positive, nonZero, integer, setInputNumericValue, props.onKeyDown],\n );\n\n // For number fields, prefer the raw typed string when it represents the same value as\n // the stored number — preserves intermediate states like \"0.\", \"1.50\", \"-\" that would\n // otherwise be lost as React reconciles the controlled input back to the canonical form.\n let displayValue: TextFieldProps['value'] = props.value;\n if (isNumberType && typeof props.value === 'number') {\n if (Number.isNaN(props.value)) {\n displayValue = rawInput;\n } else if (rawInput !== '' && Number(rawInput) === props.value) {\n displayValue = rawInput;\n }\n }\n\n const hasMin = propsMinValid !== undefined;\n const hasMax = props.max != null && props.max !== '';\n const hints: string[] = [];\n const integerLabel = positive ? '+Int' : 'Int';\n const positiveLabel = '+';\n const nonZeroLabel = '≠0';\n if (integer && nonZero) hints.push(`${integerLabel} ${nonZeroLabel}`);\n else if (integer) hints.push(integerLabel);\n else if (positive && nonZero) hints.push(`${positiveLabel} ${nonZeroLabel}`);\n else if (positive) hints.push(positiveLabel);\n else if (nonZero) hints.push(nonZeroLabel);\n if (hasMin && hasMax) hints.push(`Range: ${propsMinValid} - ${props.max}`);\n else if (hasMax) hints.push(`Max: ${props.max}`);\n else if (hasMin) hints.push(`Min: ${propsMinValid}`);\n const autoConstraintText = hints.join(', ');\n const combinedEndAdornment = (\n <>\n {autoConstraintText ? (\n <span className=\"text-xs text-muted-foreground whitespace-nowrap\">{autoConstraintText}</span>\n ) : null}\n {endAdornment}\n </>\n );\n\n const hasEndContent = isNumberType || !!endAdornment || !!autoConstraintText;\n\n React.useLayoutEffect(() => {\n const node = endOverlayRef.current;\n if (!hasEndContent || !node) {\n setEndPadding(undefined);\n return;\n }\n // Reserve the overlay's width plus a small gap so input text never sits under it.\n const measure = () => setEndPadding(node.offsetWidth + 4);\n measure();\n if (typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n return () => observer.disconnect();\n }, [hasEndContent]);\n\n return (\n <Field data-disabled={disabled}>\n {label && <FieldLabel>{label}</FieldLabel>}\n\n <div className=\"relative\">\n {startAdornment && (\n <div className=\"absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none\">{startAdornment}</div>\n )}\n <Input\n aria-invalid={!!error}\n ref={assignRef}\n disabled={disabled}\n className={cn(className, startAdornment && 'pl-10')}\n id={id}\n {...props}\n style={{ ...style, paddingRight: endPadding }}\n value={displayValue}\n min={effectiveMin}\n type={normalizedType}\n inputMode={normalizedInputMode}\n onKeyDown={handleKeyDown}\n onChange={handleChange}\n />\n {hasEndContent && (\n <div ref={endOverlayRef} className=\"absolute inset-y-0 right-0 z-10 flex items-center gap-2 pr-2\">\n {(endAdornment || autoConstraintText) && (\n <div className=\"flex items-center gap-2\">{combinedEndAdornment}</div>\n )}\n {isNumberType && (\n <div className=\"flex h-7 w-4 flex-col overflow-hidden rounded-sm border border-border bg-background\">\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"flex h-1/2 items-center justify-center border-b border-border text-muted-foreground hover:bg-accent disabled:opacity-50\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setInputNumericValue(1)}\n disabled={disabled}\n aria-label=\"Increase value\"\n >\n <ChevronUp className=\"size-2.5\" />\n </button>\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"flex h-1/2 items-center justify-center text-muted-foreground hover:bg-accent disabled:opacity-50\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setInputNumericValue(-1)}\n disabled={disabled}\n aria-label=\"Decrease value\"\n >\n <ChevronDown className=\"size-2.5\" />\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n\n {description && !error && <FieldDescription>{description}</FieldDescription>}\n {error && <FieldError>{error}</FieldError>}\n </Field>\n );\n },\n);\n\nTextField.displayName = 'TextField';\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"TextField.js","sources":["../lib/components/TextField/TextField.tsx"],"sourcesContent":["import { ChevronDown, ChevronUp } from 'lucide-react';\nimport React from 'react';\nimport { Input } from '../../../shadcn/shadcnInput';\nimport { cn } from '../../../shadcn/utils';\nimport { Field, FieldDescription, FieldError, FieldLabel } from '../Field';\n\nexport interface TextFieldProps extends React.ComponentProps<'input'> {\n label?: string;\n description?: React.ReactNode;\n error?: string;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n positive?: boolean;\n nonZero?: boolean;\n integer?: boolean;\n}\n\n// TextField molecule - Input + Label composition using Field system\nexport const TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(\n (\n {\n label,\n description,\n error,\n className,\n id,\n disabled,\n startAdornment,\n endAdornment,\n positive,\n nonZero,\n integer,\n onChange,\n style,\n ...props\n },\n ref,\n ) => {\n const isNumberType = props.type === 'number';\n const normalizedType = isNumberType ? 'text' : props.type;\n const normalizedInputMode = props.inputMode ?? (isNumberType ? (integer ? 'numeric' : 'decimal') : undefined);\n // Resolve the actual minimum: positive floor takes precedence over `min`; integer+positive means ≥1, decimal keeps min 0 so 0.x stays typeable.\n const positiveFloor = positive ? (integer ? 1 : 0) : undefined;\n const propsMinNum = props.min != null && props.min !== '' ? Number(props.min) : undefined;\n const propsMinValid = propsMinNum !== undefined && Number.isFinite(propsMinNum) ? propsMinNum : undefined;\n const effectiveMin =\n positiveFloor !== undefined && propsMinValid !== undefined\n ? Math.max(positiveFloor, propsMinValid)\n : (propsMinValid ?? positiveFloor);\n const inputRef = React.useRef<HTMLInputElement>(null);\n // Tracks the last raw string typed so intermediate states like \"-\" or \"0.\" survive the RHF round-trip; must be state so updates re-render and don't revert the controlled input.\n const [rawInput, setRawInput] = React.useState<string>('');\n // Trailing overlay is measured at runtime so the input reserves exactly its width as right padding; re-measures via ResizeObserver.\n const endOverlayRef = React.useRef<HTMLDivElement>(null);\n const [endPadding, setEndPadding] = React.useState<number | undefined>(undefined);\n\n const assignRef = React.useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref],\n );\n\n const setInputNumericValue = React.useCallback(\n (delta: 1 | -1) => {\n if (!isNumberType || disabled) return;\n const input = inputRef.current;\n if (!input) return;\n\n const parsedStep = Number(props.step);\n const step = Number.isFinite(parsedStep) && parsedStep > 0 ? parsedStep : 1;\n const parsedMax = Number(props.max);\n const max = Number.isFinite(parsedMax) ? parsedMax : undefined;\n const current = Number(input.value);\n const baseValue = Number.isFinite(current) ? current : (effectiveMin ?? 0);\n\n let next = baseValue + delta * step;\n if (effectiveMin !== undefined) next = Math.max(effectiveMin, next);\n if (max !== undefined) next = Math.min(max, next);\n\n const stepString = String(step);\n const decimals = integer || stepString.includes('.') === false ? 0 : (stepString.split('.')[1]?.length ?? 0);\n const nextValue = decimals > 0 ? next.toFixed(decimals) : String(Math.round(next));\n\n const valueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value')?.set;\n valueSetter?.call(input, nextValue);\n input.dispatchEvent(new Event('input', { bubbles: true }));\n },\n [isNumberType, disabled, effectiveMin, integer, props.max, props.step],\n );\n\n const handleChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n if (isNumberType) {\n const raw = event.target.value;\n setRawInput(raw);\n const num = raw === '' ? NaN : Number(raw);\n (onChange as unknown as (v: number) => void)?.(num);\n } else {\n onChange?.(event);\n }\n },\n [isNumberType, onChange],\n );\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n props.onKeyDown?.(event);\n if (event.defaultPrevented || !isNumberType || disabled) return;\n if (positive && (event.key === '-' || event.key === 'e')) {\n event.preventDefault();\n return;\n }\n if (integer && (event.key === '.' || event.key === ',' || event.key === 'e')) {\n event.preventDefault();\n return;\n }\n // Block '0' as the first keystroke in integer mode when `positive` (≥1) or `nonZero` is set; decimal mode keeps '0' typeable so the user can start \"0.3\".\n if (\n (positive || nonZero) &&\n integer &&\n event.key === '0' &&\n (event.currentTarget.value === '' || event.currentTarget.value === '0')\n ) {\n event.preventDefault();\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setInputNumericValue(1);\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n setInputNumericValue(-1);\n }\n },\n [isNumberType, disabled, positive, nonZero, integer, setInputNumericValue, props.onKeyDown],\n );\n\n // For number fields, prefer the raw typed string when it represents the same value as the stored number, preserving intermediate states like \"0.\", \"1.50\", \"-\".\n let displayValue: TextFieldProps['value'] = props.value;\n if (isNumberType && typeof props.value === 'number') {\n if (Number.isNaN(props.value)) {\n displayValue = rawInput;\n } else if (rawInput !== '' && Number(rawInput) === props.value) {\n displayValue = rawInput;\n }\n }\n\n const hasMin = propsMinValid !== undefined;\n const hasMax = props.max != null && props.max !== '';\n const hints: string[] = [];\n const integerLabel = positive ? '+Int' : 'Int';\n const positiveLabel = '+';\n const nonZeroLabel = '≠0';\n if (integer && nonZero) hints.push(`${integerLabel} ${nonZeroLabel}`);\n else if (integer) hints.push(integerLabel);\n else if (positive && nonZero) hints.push(`${positiveLabel} ${nonZeroLabel}`);\n else if (positive) hints.push(positiveLabel);\n else if (nonZero) hints.push(nonZeroLabel);\n if (hasMin && hasMax) hints.push(`Range: ${propsMinValid} - ${props.max}`);\n else if (hasMax) hints.push(`Max: ${props.max}`);\n else if (hasMin) hints.push(`Min: ${propsMinValid}`);\n const autoConstraintText = hints.join(', ');\n const combinedEndAdornment = (\n <>\n {autoConstraintText ? (\n <span className=\"text-xs text-muted-foreground whitespace-nowrap\">{autoConstraintText}</span>\n ) : null}\n {endAdornment}\n </>\n );\n\n const hasEndContent = isNumberType || !!endAdornment || !!autoConstraintText;\n\n React.useLayoutEffect(() => {\n const node = endOverlayRef.current;\n if (!hasEndContent || !node) {\n setEndPadding(undefined);\n return;\n }\n // Reserve the overlay's width plus a small gap so input text never sits under it.\n const measure = () => setEndPadding(node.offsetWidth + 4);\n measure();\n if (typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n return () => observer.disconnect();\n }, [hasEndContent]);\n\n return (\n <Field data-disabled={disabled}>\n {label && <FieldLabel>{label}</FieldLabel>}\n\n <div className=\"relative\">\n {startAdornment && (\n <div className=\"absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none\">{startAdornment}</div>\n )}\n <Input\n aria-invalid={!!error}\n ref={assignRef}\n disabled={disabled}\n className={cn(className, startAdornment && 'pl-10')}\n id={id}\n {...props}\n style={{ ...style, paddingRight: endPadding }}\n value={displayValue}\n min={effectiveMin}\n type={normalizedType}\n inputMode={normalizedInputMode}\n onKeyDown={handleKeyDown}\n onChange={handleChange}\n />\n {hasEndContent && (\n <div ref={endOverlayRef} className=\"absolute inset-y-0 right-0 z-10 flex items-center gap-2 pr-2\">\n {(endAdornment || autoConstraintText) && (\n <div className=\"flex items-center gap-2\">{combinedEndAdornment}</div>\n )}\n {isNumberType && (\n <div className=\"flex h-7 w-4 flex-col overflow-hidden rounded-sm border border-border bg-background\">\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"flex h-1/2 items-center justify-center border-b border-border text-muted-foreground hover:bg-accent disabled:opacity-50\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setInputNumericValue(1)}\n disabled={disabled}\n aria-label=\"Increase value\"\n >\n <ChevronUp className=\"size-2.5\" />\n </button>\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"flex h-1/2 items-center justify-center text-muted-foreground hover:bg-accent disabled:opacity-50\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setInputNumericValue(-1)}\n disabled={disabled}\n aria-label=\"Decrease value\"\n >\n <ChevronDown className=\"size-2.5\" />\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n\n {description && !error && <FieldDescription>{description}</FieldDescription>}\n {error && <FieldError>{error}</FieldError>}\n </Field>\n );\n },\n);\n\nTextField.displayName = 'TextField';\n"],"names":["React"],"mappings":";;;;;;;;AAkBO,MAAM,YAAYA,cAAA,CAAM,UAAA;AAAA,EAC7B,CACE;AAAA,IACE,KAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,EAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,KAAS,QAAA;AACpC,IAAA,MAAM,cAAA,GAAiB,YAAA,GAAe,MAAA,GAAS,KAAA,CAAM,IAAA;AACrD,IAAA,MAAM,sBAAsB,KAAA,CAAM,SAAA,KAAc,YAAA,GAAgB,OAAA,GAAU,YAAY,SAAA,GAAa,MAAA,CAAA;AAEnG,IAAA,MAAM,aAAA,GAAgB,QAAA,GAAY,OAAA,GAAU,CAAA,GAAI,CAAA,GAAK,MAAA;AACrD,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,GAAA,IAAO,IAAA,IAAQ,KAAA,CAAM,QAAQ,EAAA,GAAK,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,GAAI,MAAA;AAChF,IAAA,MAAM,gBAAgB,WAAA,KAAgB,MAAA,IAAa,OAAO,QAAA,CAAS,WAAW,IAAI,WAAA,GAAc,MAAA;AAChG,IAAA,MAAM,YAAA,GACJ,aAAA,KAAkB,MAAA,IAAa,aAAA,KAAkB,MAAA,GAC7C,KAAK,GAAA,CAAI,aAAA,EAAe,aAAa,CAAA,GACpC,aAAA,IAAiB,aAAA;AACxB,IAAA,MAAM,QAAA,GAAWA,cAAA,CAAM,MAAA,CAAyB,IAAI,CAAA;AAEpD,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAA,CAAM,SAAiB,EAAE,CAAA;AAEzD,IAAA,MAAM,aAAA,GAAgBA,cAAA,CAAM,MAAA,CAAuB,IAAI,CAAA;AACvD,IAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,cAAA,CAAM,SAA6B,MAAS,CAAA;AAEhF,IAAA,MAAM,YAAYA,cAAA,CAAM,WAAA;AAAA,MACtB,CAAC,IAAA,KAAkC;AACjC,QAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,QAAA,IAAI,OAAO,QAAQ,UAAA,EAAY;AAC7B,UAAA,GAAA,CAAI,IAAI,CAAA;AAAA,QACV,WAAW,GAAA,EAAK;AACd,UAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AAAA,QAChB;AAAA,MACF,CAAA;AAAA,MACA,CAAC,GAAG;AAAA,KACN;AAEA,IAAA,MAAM,uBAAuBA,cAAA,CAAM,WAAA;AAAA,MACjC,CAAC,KAAA,KAAkB;AACjB,QAAA,IAAI,CAAC,gBAAgB,QAAA,EAAU;AAC/B,QAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,QAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AACpC,QAAA,MAAM,OAAO,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,IAAK,UAAA,GAAa,IAAI,UAAA,GAAa,CAAA;AAC1E,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAClC,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAA,CAAS,SAAS,IAAI,SAAA,GAAY,MAAA;AACrD,QAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAClC,QAAA,MAAM,YAAY,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,GAAI,UAAW,YAAA,IAAgB,CAAA;AAExE,QAAA,IAAI,IAAA,GAAO,YAAY,KAAA,GAAQ,IAAA;AAC/B,QAAA,IAAI,iBAAiB,MAAA,EAAW,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,cAAc,IAAI,CAAA;AAClE,QAAA,IAAI,QAAQ,MAAA,EAAW,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA;AAEhD,QAAA,MAAM,UAAA,GAAa,OAAO,IAAI,CAAA;AAC9B,QAAA,MAAM,QAAA,GAAW,OAAA,IAAW,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,KAAM,KAAA,GAAQ,CAAA,GAAK,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,GAAG,MAAA,IAAU,CAAA;AAC1G,QAAA,MAAM,SAAA,GAAY,QAAA,GAAW,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAEjF,QAAA,MAAM,cAAc,MAAA,CAAO,wBAAA,CAAyB,OAAO,gBAAA,CAAiB,SAAA,EAAW,OAAO,CAAA,EAAG,GAAA;AACjG,QAAA,WAAA,EAAa,IAAA,CAAK,OAAO,SAAS,CAAA;AAClC,QAAA,KAAA,CAAM,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,MAC3D,CAAA;AAAA,MACA,CAAC,cAAc,QAAA,EAAU,YAAA,EAAc,SAAS,KAAA,CAAM,GAAA,EAAK,MAAM,IAAI;AAAA,KACvE;AAEA,IAAA,MAAM,eAAeA,cAAA,CAAM,WAAA;AAAA,MACzB,CAAC,KAAA,KAA+C;AAC9C,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,KAAA;AACzB,UAAA,WAAA,CAAY,GAAG,CAAA;AACf,UAAA,MAAM,GAAA,GAAM,GAAA,KAAQ,EAAA,GAAK,GAAA,GAAM,OAAO,GAAG,CAAA;AACzC,UAAC,WAA8C,GAAG,CAAA;AAAA,QACpD,CAAA,MAAO;AACL,UAAA,QAAA,GAAW,KAAK,CAAA;AAAA,QAClB;AAAA,MACF,CAAA;AAAA,MACA,CAAC,cAAc,QAAQ;AAAA,KACzB;AAEA,IAAA,MAAM,gBAAgBA,cAAA,CAAM,WAAA;AAAA,MAC1B,CAAC,KAAA,KAAiD;AAChD,QAAA,KAAA,CAAM,YAAY,KAAK,CAAA;AACvB,QAAA,IAAI,KAAA,CAAM,gBAAA,IAAoB,CAAC,YAAA,IAAgB,QAAA,EAAU;AACzD,QAAA,IAAI,aAAa,KAAA,CAAM,GAAA,KAAQ,GAAA,IAAO,KAAA,CAAM,QAAQ,GAAA,CAAA,EAAM;AACxD,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA;AAAA,QACF;AACA,QAAA,IAAI,OAAA,KAAY,MAAM,GAAA,KAAQ,GAAA,IAAO,MAAM,GAAA,KAAQ,GAAA,IAAO,KAAA,CAAM,GAAA,KAAQ,GAAA,CAAA,EAAM;AAC5E,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA;AAAA,QACF;AAEA,QAAA,IAAA,CACG,QAAA,IAAY,OAAA,KACb,OAAA,IACA,KAAA,CAAM,GAAA,KAAQ,GAAA,KACb,KAAA,CAAM,aAAA,CAAc,KAAA,KAAU,EAAA,IAAM,KAAA,CAAM,aAAA,CAAc,UAAU,GAAA,CAAA,EACnE;AACA,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA;AAAA,QACF;AACA,QAAA,IAAI,KAAA,CAAM,QAAQ,SAAA,EAAW;AAC3B,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,oBAAA,CAAqB,CAAC,CAAA;AAAA,QACxB,CAAA,MAAA,IAAW,KAAA,CAAM,GAAA,KAAQ,WAAA,EAAa;AACpC,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,oBAAA,CAAqB,EAAE,CAAA;AAAA,QACzB;AAAA,MACF,CAAA;AAAA,MACA,CAAC,cAAc,QAAA,EAAU,QAAA,EAAU,SAAS,OAAA,EAAS,oBAAA,EAAsB,MAAM,SAAS;AAAA,KAC5F;AAGA,IAAA,IAAI,eAAwC,KAAA,CAAM,KAAA;AAClD,IAAA,IAAI,YAAA,IAAgB,OAAO,KAAA,CAAM,KAAA,KAAU,QAAA,EAAU;AACnD,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,EAAG;AAC7B,QAAA,YAAA,GAAe,QAAA;AAAA,MACjB,WAAW,QAAA,KAAa,EAAA,IAAM,OAAO,QAAQ,CAAA,KAAM,MAAM,KAAA,EAAO;AAC9D,QAAA,YAAA,GAAe,QAAA;AAAA,MACjB;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,aAAA,KAAkB,MAAA;AACjC,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,IAAO,IAAA,IAAQ,MAAM,GAAA,KAAQ,EAAA;AAClD,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,YAAA,GAAe,WAAW,MAAA,GAAS,KAAA;AACzC,IAAA,MAAM,aAAA,GAAgB,GAAA;AACtB,IAAA,MAAM,YAAA,GAAe,IAAA;AACrB,IAAA,IAAI,OAAA,IAAW,SAAS,KAAA,CAAM,IAAA,CAAK,GAAG,YAAY,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,CAAA;AAAA,SAAA,IAC3D,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA;AAAA,SAAA,IAChC,QAAA,IAAY,SAAS,KAAA,CAAM,IAAA,CAAK,GAAG,aAAa,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,CAAA;AAAA,SAAA,IAClE,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA;AAAA,SAAA,IAClC,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA;AACzC,IAAA,IAAI,MAAA,IAAU,QAAQ,KAAA,CAAM,IAAA,CAAK,UAAU,aAAa,CAAA,GAAA,EAAM,KAAA,CAAM,GAAG,CAAA,CAAE,CAAA;AAAA,SAAA,IAChE,QAAQ,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,CAAA;AAAA,SAAA,IACtC,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,aAAa,CAAA,CAAE,CAAA;AACnD,IAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,MAAM,uCACJ,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,MAAA,kBAAA,mBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iDAAA,EAAmD,8BAAmB,CAAA,GACpF,IAAA;AAAA,MACH;AAAA,KAAA,EACH,CAAA;AAGF,IAAA,MAAM,gBAAgB,YAAA,IAAgB,CAAC,CAAC,YAAA,IAAgB,CAAC,CAAC,kBAAA;AAE1D,IAAAA,cAAA,CAAM,gBAAgB,MAAM;AAC1B,MAAA,MAAM,OAAO,aAAA,CAAc,OAAA;AAC3B,MAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,IAAA,EAAM;AAC3B,QAAA,aAAA,CAAc,MAAS,CAAA;AACvB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,IAAA,CAAK,cAAc,CAAC,CAAA;AACxD,MAAA,OAAA,EAAQ;AACR,MAAA,IAAI,OAAO,mBAAmB,WAAA,EAAa;AAC3C,MAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,OAAO,CAAA;AAC3C,MAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AACrB,MAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,IACnC,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAM,eAAA,EAAe,QAAA,EACnB,QAAA,EAAA;AAAA,MAAA,KAAA,oBAAS,GAAA,CAAC,cAAY,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBAE7B,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACZ,QAAA,EAAA;AAAA,QAAA,cAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EAAwE,QAAA,EAAA,cAAA,EAAe,CAAA;AAAA,wBAExG,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,cAAA,EAAc,CAAC,CAAC,KAAA;AAAA,YAChB,GAAA,EAAK,SAAA;AAAA,YACL,QAAA;AAAA,YACA,SAAA,EAAW,EAAA,CAAG,SAAA,EAAW,cAAA,IAAkB,OAAO,CAAA;AAAA,YAClD,EAAA;AAAA,YACC,GAAG,KAAA;AAAA,YACJ,KAAA,EAAO,EAAE,GAAG,KAAA,EAAO,cAAc,UAAA,EAAW;AAAA,YAC5C,KAAA,EAAO,YAAA;AAAA,YACP,GAAA,EAAK,YAAA;AAAA,YACL,IAAA,EAAM,cAAA;AAAA,YACN,SAAA,EAAW,mBAAA;AAAA,YACX,SAAA,EAAW,aAAA;AAAA,YACX,QAAA,EAAU;AAAA;AAAA,SACZ;AAAA,QACC,iCACC,IAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,aAAA,EAAe,WAAU,8DAAA,EAC/B,QAAA,EAAA;AAAA,UAAA,CAAA,YAAA,IAAgB,kBAAA,qBAChB,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAA2B,QAAA,EAAA,oBAAA,EAAqB,CAAA;AAAA,UAEhE,YAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qFAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,QAAA,EAAU,EAAA;AAAA,gBACV,SAAA,EAAU,yHAAA;AAAA,gBACV,WAAA,EAAa,CAAC,KAAA,KAAU,KAAA,CAAM,cAAA,EAAe;AAAA,gBAC7C,OAAA,EAAS,MAAM,oBAAA,CAAqB,CAAC,CAAA;AAAA,gBACrC,QAAA;AAAA,gBACA,YAAA,EAAW,gBAAA;AAAA,gBAEX,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA,aAClC;AAAA,4BACA,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,QAAA,EAAU,EAAA;AAAA,gBACV,SAAA,EAAU,kGAAA;AAAA,gBACV,WAAA,EAAa,CAAC,KAAA,KAAU,KAAA,CAAM,cAAA,EAAe;AAAA,gBAC7C,OAAA,EAAS,MAAM,oBAAA,CAAqB,EAAE,CAAA;AAAA,gBACtC,QAAA;AAAA,gBACA,YAAA,EAAW,gBAAA;AAAA,gBAEX,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA;AACpC,WAAA,EACF;AAAA,SAAA,EAEJ;AAAA,OAAA,EAEJ,CAAA;AAAA,MAEC,WAAA,IAAe,CAAC,KAAA,oBAAS,GAAA,CAAC,oBAAkB,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,MACxD,KAAA,oBAAS,GAAA,CAAC,UAAA,EAAA,EAAY,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EAC/B,CAAA;AAAA,EAEJ;AACF;AAEA,SAAA,CAAU,WAAA,GAAc,WAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeContext.js","sources":["../lib/context/ThemeContext.tsx"],"sourcesContent":["import { createContext, type ReactNode, useCallback, useLayoutEffect, useMemo, useState } from 'react';\n\n/**\n * Theme mode type - either 'light' or 'dark'\n */\nexport type ThemeMode = 'light' | 'dark';\n\n/**\n * Shape of the theme context value\n */\nexport interface ThemeContextValue {\n /** Current theme mode ('light' or 'dark') */\n theme: ThemeMode;\n /** Function to toggle between light and dark themes */\n toggleTheme: () => void;\n /** Function to set a specific theme */\n setTheme: (theme: ThemeMode) => void;\n}\n\n/**\n * Props for the ThemeProvider component\n */\nexport interface ThemeProviderProps {\n /** Child components that will have access to the theme context */\n children: ReactNode;\n /** Optional initial theme (defaults to system preference or localStorage) */\n defaultTheme?: ThemeMode;\n /** localStorage key for persisting theme preference */\n storageKey?: string;\n}\n\nconst THEME_STORAGE_KEY = 'theme';\n\n/**\n * Theme context for sharing theme state across components.\n * Use the useTheme hook to access this context.\n */\nexport const ThemeContext = createContext<ThemeContextValue | null>(null);\n\nThemeContext.displayName = 'ThemeContext';\n\n/**\n * Determines the initial theme based on localStorage and system preferences.\n * @param storageKey - The localStorage key to check for saved theme\n * @param defaultTheme - Optional default theme to use if no preference is found\n * @returns The determined initial theme\n */\nfunction getInitialTheme(storageKey: string, defaultTheme?: ThemeMode): ThemeMode {\n // Check for saved theme in localStorage\n if (typeof window !== 'undefined') {\n const savedTheme = localStorage.getItem(storageKey);\n if (savedTheme === 'dark' || savedTheme === 'light') {\n return savedTheme;\n }\n }\n\n // Use default theme if provided\n if (defaultTheme) {\n return defaultTheme;\n }\n\n // Fall back to system preference\n if (typeof window !== 'undefined') {\n const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n return systemPrefersDark ? 'dark' : 'light';\n }\n\n // Ultimate fallback\n return 'light';\n}\n\n/**\n * ThemeProvider component that manages theme state and provides it to the component tree.\n *\n * Features:\n * - Single source of truth for theme state\n * - Persists theme preference to localStorage\n * - Detects system color scheme preference on initial load\n * - Toggles the 'dark' class on document.documentElement\n * - Avoids flash of incorrect theme using useLayoutEffect\n *\n * @example\n * ```tsx\n * // Wrap your app with ThemeProvider\n * function App() {\n * return (\n * <ThemeProvider>\n * <YourApp />\n * </ThemeProvider>\n * );\n * }\n *\n * // With default theme\n * <ThemeProvider defaultTheme=\"dark\">\n * <YourApp />\n * </ThemeProvider>\n *\n * // With custom storage key\n * <ThemeProvider storageKey=\"my-app-theme\">\n * <YourApp />\n * </ThemeProvider>\n * ```\n */\nexport function ThemeProvider({ children, defaultTheme, storageKey = THEME_STORAGE_KEY }: ThemeProviderProps) {\n const [theme, setThemeState] = useState<ThemeMode>(() => getInitialTheme(storageKey, defaultTheme));\n\n // Apply theme to document on initial mount and when theme changes\n useLayoutEffect(() => {\n const isDark = theme === 'dark';\n document.documentElement.classList.toggle('dark', isDark);\n }, [theme]);\n\n // Persist to localStorage whenever theme changes\n useLayoutEffect(() => {\n localStorage.setItem(storageKey, theme);\n }, [theme, storageKey]);\n\n const setTheme = useCallback((newTheme: ThemeMode) => {\n setThemeState(newTheme);\n }, []);\n\n const toggleTheme = useCallback(() => {\n setThemeState((currentTheme) => (currentTheme === 'dark' ? 'light' : 'dark'));\n }, []);\n\n const value = useMemo<ThemeContextValue>(\n () => ({\n theme,\n toggleTheme,\n setTheme,\n }),\n [theme, toggleTheme, setTheme],\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\nThemeProvider.displayName = 'ThemeProvider';\n"],"names":[],"mappings":";;;AA+BA,MAAM,iBAAA,GAAoB,OAAA;AAMnB,MAAM,YAAA,GAAe,cAAwC,IAAI;AAExE,YAAA,CAAa,WAAA,GAAc,cAAA;AAQ3B,SAAS,eAAA,CAAgB,YAAoB,YAAA,EAAqC;AAEhF,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,CAAQ,UAAU,CAAA;AAClD,IAAA,IAAI,UAAA,KAAe,MAAA,IAAU,UAAA,KAAe,OAAA,EAAS;AACnD,MAAA,OAAO,UAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,YAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,MAAM,iBAAA,GAAoB,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA;AAC5E,IAAA,OAAO,oBAAoB,MAAA,GAAS,OAAA;AAAA,EACtC;AAGA,EAAA,OAAO,OAAA;AACT;AAkCO,SAAS,cAAc,EAAE,QAAA,EAAU,YAAA,EAAc,UAAA,GAAa,mBAAkB,EAAuB;AAC5G,EAAA,MAAM,CAAC,OAAO,aAAa,CAAA,GAAI,SAAoB,MAAM,eAAA,CAAgB,UAAA,EAAY,YAAY,CAAC,CAAA;AAGlG,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,MAAM,SAAS,KAAA,KAAU,MAAA;AACzB,IAAA,QAAA,CAAS,eAAA,CAAgB,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,MAAM,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,YAAA,CAAa,OAAA,CAAQ,YAAY,KAAK,CAAA;AAAA,EACxC,CAAA,EAAG,CAAC,KAAA,EAAO,UAAU,CAAC,CAAA;AAEtB,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAC,QAAA,KAAwB;AACpD,IAAA,aAAA,CAAc,QAAQ,CAAA;AAAA,EACxB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,aAAA,CAAc,CAAC,YAAA,KAAkB,YAAA,KAAiB,MAAA,GAAS,UAAU,MAAO,CAAA;AAAA,EAC9E,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO;AAAA,MACL,KAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,WAAA,EAAa,QAAQ;AAAA,GAC/B;AAEA,EAAA,uBAAO,GAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EAAsB,OAAe,QAAA,EAAS,CAAA;AACxD;AAEA,aAAA,CAAc,WAAA,GAAc,eAAA;;;;"}
1
+ {"version":3,"file":"ThemeContext.js","sources":["../lib/context/ThemeContext.tsx"],"sourcesContent":["import { createContext, type ReactNode, useCallback, useLayoutEffect, useMemo, useState } from 'react';\n\nexport type ThemeMode = 'light' | 'dark';\n\nexport interface ThemeContextValue {\n theme: ThemeMode;\n toggleTheme: () => void;\n setTheme: (theme: ThemeMode) => void;\n}\n\nexport interface ThemeProviderProps {\n children: ReactNode;\n defaultTheme?: ThemeMode;\n storageKey?: string;\n}\n\nconst THEME_STORAGE_KEY = 'theme';\n\nexport const ThemeContext = createContext<ThemeContextValue | null>(null);\n\nThemeContext.displayName = 'ThemeContext';\n\n// Determines the initial theme based on localStorage and system preferences.\nfunction getInitialTheme(storageKey: string, defaultTheme?: ThemeMode): ThemeMode {\n // Check for saved theme in localStorage\n if (typeof window !== 'undefined') {\n const savedTheme = localStorage.getItem(storageKey);\n if (savedTheme === 'dark' || savedTheme === 'light') {\n return savedTheme;\n }\n }\n\n // Use default theme if provided\n if (defaultTheme) {\n return defaultTheme;\n }\n\n // Fall back to system preference\n if (typeof window !== 'undefined') {\n const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n return systemPrefersDark ? 'dark' : 'light';\n }\n\n // Ultimate fallback\n return 'light';\n}\n\n// ThemeProvider component that manages theme state and provides it to the component tree.\nexport function ThemeProvider({ children, defaultTheme, storageKey = THEME_STORAGE_KEY }: ThemeProviderProps) {\n const [theme, setThemeState] = useState<ThemeMode>(() => getInitialTheme(storageKey, defaultTheme));\n\n // Apply theme to document on initial mount and when theme changes\n useLayoutEffect(() => {\n const isDark = theme === 'dark';\n document.documentElement.classList.toggle('dark', isDark);\n }, [theme]);\n\n // Persist to localStorage whenever theme changes\n useLayoutEffect(() => {\n localStorage.setItem(storageKey, theme);\n }, [theme, storageKey]);\n\n const setTheme = useCallback((newTheme: ThemeMode) => {\n setThemeState(newTheme);\n }, []);\n\n const toggleTheme = useCallback(() => {\n setThemeState((currentTheme) => (currentTheme === 'dark' ? 'light' : 'dark'));\n }, []);\n\n const value = useMemo<ThemeContextValue>(\n () => ({\n theme,\n toggleTheme,\n setTheme,\n }),\n [theme, toggleTheme, setTheme],\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\nThemeProvider.displayName = 'ThemeProvider';\n"],"names":[],"mappings":";;;AAgBA,MAAM,iBAAA,GAAoB,OAAA;AAEnB,MAAM,YAAA,GAAe,cAAwC,IAAI;AAExE,YAAA,CAAa,WAAA,GAAc,cAAA;AAG3B,SAAS,eAAA,CAAgB,YAAoB,YAAA,EAAqC;AAEhF,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,CAAQ,UAAU,CAAA;AAClD,IAAA,IAAI,UAAA,KAAe,MAAA,IAAU,UAAA,KAAe,OAAA,EAAS;AACnD,MAAA,OAAO,UAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,YAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,MAAM,iBAAA,GAAoB,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA;AAC5E,IAAA,OAAO,oBAAoB,MAAA,GAAS,OAAA;AAAA,EACtC;AAGA,EAAA,OAAO,OAAA;AACT;AAGO,SAAS,cAAc,EAAE,QAAA,EAAU,YAAA,EAAc,UAAA,GAAa,mBAAkB,EAAuB;AAC5G,EAAA,MAAM,CAAC,OAAO,aAAa,CAAA,GAAI,SAAoB,MAAM,eAAA,CAAgB,UAAA,EAAY,YAAY,CAAC,CAAA;AAGlG,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,MAAM,SAAS,KAAA,KAAU,MAAA;AACzB,IAAA,QAAA,CAAS,eAAA,CAAgB,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,MAAM,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,YAAA,CAAa,OAAA,CAAQ,YAAY,KAAK,CAAA;AAAA,EACxC,CAAA,EAAG,CAAC,KAAA,EAAO,UAAU,CAAC,CAAA;AAEtB,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAC,QAAA,KAAwB;AACpD,IAAA,aAAA,CAAc,QAAQ,CAAA;AAAA,EACxB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,aAAA,CAAc,CAAC,YAAA,KAAkB,YAAA,KAAiB,MAAA,GAAS,UAAU,MAAO,CAAA;AAAA,EAC9E,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO;AAAA,MACL,KAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,WAAA,EAAa,QAAQ;AAAA,GAC/B;AAEA,EAAA,uBAAO,GAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EAAsB,OAAe,QAAA,EAAS,CAAA;AACxD;AAEA,aAAA,CAAc,WAAA,GAAc,eAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeToggle.js","sources":["../lib/components/ThemeToggle/ThemeToggle.tsx"],"sourcesContent":["import { Moon, Sun } from 'lucide-react';\nimport type React from 'react';\nimport { useTheme } from '../../hooks/useTheme';\nimport { Button } from '../Button/Button';\n\nexport interface ThemeToggleProps {\n /**\n * Custom className for the toggle button\n */\n className?: string;\n\n /**\n * Size of the toggle button\n */\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * ThemeToggle component for switching between light and dark themes.\n *\n * Uses the useTheme hook internally for theme state management.\n *\n * @example\n * ```tsx\n * <ThemeToggle />\n * <ThemeToggle size=\"lg\" className=\"custom-class\" />\n * ```\n */\nexport const ThemeToggle: React.FC<ThemeToggleProps> = ({ className, size = 'md' }) => {\n const { theme, toggleTheme } = useTheme();\n const isDarkMode = theme === 'dark';\n\n return (\n <Button\n variant=\"ghost\"\n size={size === 'md' ? 'default' : size}\n onClick={toggleTheme}\n className={`text-foreground ${className}`}\n aria-label={`Switch to ${isDarkMode ? 'light' : 'dark'} theme`}\n >\n <Sun\n className={`h-4 w-4 transition-all ${isDarkMode ? 'scale-0 -rotate-90' : 'scale-100 rotate-0'}`}\n aria-hidden\n />\n <Moon\n className={`absolute h-4 w-4 transition-all ${isDarkMode ? 'scale-100 rotate-0' : 'scale-0 rotate-90'}`}\n aria-hidden\n />\n </Button>\n );\n};\n\nThemeToggle.displayName = 'ThemeToggle';\n"],"names":[],"mappings":";;;;;AA4BO,MAAM,cAA0C,CAAC,EAAE,SAAA,EAAW,IAAA,GAAO,MAAK,KAAM;AACrF,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,QAAA,EAAS;AACxC,EAAA,MAAM,aAAa,KAAA,KAAU,MAAA;AAE7B,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,IAAA,KAAS,IAAA,GAAO,SAAA,GAAY,IAAA;AAAA,MAClC,OAAA,EAAS,WAAA;AAAA,MACT,SAAA,EAAW,mBAAmB,SAAS,CAAA,CAAA;AAAA,MACvC,YAAA,EAAY,CAAA,UAAA,EAAa,UAAA,GAAa,OAAA,GAAU,MAAM,CAAA,MAAA,CAAA;AAAA,MAEtD,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,uBAAA,EAA0B,UAAA,GAAa,oBAAA,GAAuB,oBAAoB,CAAA,CAAA;AAAA,YAC7F,aAAA,EAAW;AAAA;AAAA,SACb;AAAA,wBACA,GAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,gCAAA,EAAmC,UAAA,GAAa,oBAAA,GAAuB,mBAAmB,CAAA,CAAA;AAAA,YACrG,aAAA,EAAW;AAAA;AAAA;AACb;AAAA;AAAA,GACF;AAEJ;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;;;;"}
1
+ {"version":3,"file":"ThemeToggle.js","sources":["../lib/components/ThemeToggle/ThemeToggle.tsx"],"sourcesContent":["import { Moon, Sun } from 'lucide-react';\nimport type React from 'react';\nimport { useTheme } from '../../hooks/useTheme';\nimport { Button } from '../Button/Button';\n\nexport interface ThemeToggleProps {\n className?: string;\n\n size?: 'sm' | 'md' | 'lg';\n}\n\n// ThemeToggle component for switching between light and dark themes.\nexport const ThemeToggle: React.FC<ThemeToggleProps> = ({ className, size = 'md' }) => {\n const { theme, toggleTheme } = useTheme();\n const isDarkMode = theme === 'dark';\n\n return (\n <Button\n variant=\"ghost\"\n size={size === 'md' ? 'default' : size}\n onClick={toggleTheme}\n className={`text-foreground ${className}`}\n aria-label={`Switch to ${isDarkMode ? 'light' : 'dark'} theme`}\n >\n <Sun\n className={`h-4 w-4 transition-all ${isDarkMode ? 'scale-0 -rotate-90' : 'scale-100 rotate-0'}`}\n aria-hidden\n />\n <Moon\n className={`absolute h-4 w-4 transition-all ${isDarkMode ? 'scale-100 rotate-0' : 'scale-0 rotate-90'}`}\n aria-hidden\n />\n </Button>\n );\n};\n\nThemeToggle.displayName = 'ThemeToggle';\n"],"names":[],"mappings":";;;;;AAYO,MAAM,cAA0C,CAAC,EAAE,SAAA,EAAW,IAAA,GAAO,MAAK,KAAM;AACrF,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,QAAA,EAAS;AACxC,EAAA,MAAM,aAAa,KAAA,KAAU,MAAA;AAE7B,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,IAAA,KAAS,IAAA,GAAO,SAAA,GAAY,IAAA;AAAA,MAClC,OAAA,EAAS,WAAA;AAAA,MACT,SAAA,EAAW,mBAAmB,SAAS,CAAA,CAAA;AAAA,MACvC,YAAA,EAAY,CAAA,UAAA,EAAa,UAAA,GAAa,OAAA,GAAU,MAAM,CAAA,MAAA,CAAA;AAAA,MAEtD,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,uBAAA,EAA0B,UAAA,GAAa,oBAAA,GAAuB,oBAAoB,CAAA,CAAA;AAAA,YAC7F,aAAA,EAAW;AAAA;AAAA,SACb;AAAA,wBACA,GAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,gCAAA,EAAmC,UAAA,GAAa,oBAAA,GAAuB,mBAAmB,CAAA,CAAA;AAAA,YACrG,aAAA,EAAW;AAAA;AAAA;AACb;AAAA;AAAA,GACF;AAEJ;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;;;;"}
package/dist/Toggle.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { R as Root } from './index34.js';
3
- import { c as cva } from './index8.js';
3
+ import { c as cva } from './index9.js';
4
4
  import { c as cn } from './utils.js';
5
5
 
6
6
  const toggleVariants$1 = cva(
@@ -1 +1 @@
1
- {"version":3,"file":"Toggle.js","sources":["../shadcn/shadcnToggle/Toggle.tsx","../lib/components/Toggle/Toggle.tsx"],"sourcesContent":["'use client';\n\nimport * as TogglePrimitive from '@radix-ui/react-toggle';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type * as React from 'react';\n\nimport { cn } from '../utils';\n\nconst toggleVariants = cva(\n \"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap\",\n {\n variants: {\n variant: {\n default: 'bg-transparent',\n outline: 'border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground',\n },\n size: {\n default: 'h-9 px-2 min-w-9',\n sm: 'h-8 px-1.5 min-w-8',\n lg: 'h-10 px-2.5 min-w-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nfunction Toggle({\n className,\n variant,\n size,\n ...props\n}: React.ComponentProps<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive.Root data-slot=\"toggle\" className={cn(toggleVariants({ variant, size, className }))} {...props} />\n );\n}\n\nexport { Toggle, toggleVariants };\n","import { Toggle as ShadcnToggle, toggleVariants as shadcnToggleVariants } from '../../../shadcn/shadcnToggle';\n\n/**\n * Toggle component - a two-state button for UI state changes (like toolbar buttons).\n *\n * **IMPORTANT: Toggle is NOT designed for form submission.**\n * - Toggle uses `pressed`/`onPressedChange` semantics (UI state, not form data)\n * - It doesn't provide `name`/`value` props required for form fields\n * - **For form-based on/off fields, use the `Switch` component instead**\n *\n * **Use Toggle for:**\n * - Toolbar buttons (bold, italic, underline in text editors)\n * - UI state toggles (show/hide panels, enable/disable features)\n * - Button-like interactions that don't need form submission\n *\n * **Use Switch for:**\n * - Form fields with on/off states\n * - Settings that need to be submitted with form data\n * - Fields that require validation and error display\n *\n * @example\n * ```tsx\n * // Toolbar button (Toggle) - CORRECT usage\n * <Toggle aria-label=\"Toggle italic\" onPressedChange={setItalic}>\n * <Italic className=\"h-4 w-4\" />\n * </Toggle>\n *\n * // Form field (Switch) - CORRECT usage\n * <Form form={form} onSubmit={handleSubmit}>\n * <Switch name=\"notifications\" label=\"Enable notifications\" />\n * </Form>\n *\n * // ❌ INCORRECT - Don't use Toggle in forms\n * <Form form={form} onSubmit={handleSubmit}>\n * <Toggle>Notifications</Toggle> // Won't work - use Switch instead\n * </Form>\n * ```\n */\nexport const Toggle = ShadcnToggle;\n\n/**\n * Toggle variants for custom styling.\n * Can be used with `cn()` to create custom toggle styles.\n */\nexport const toggleVariants = shadcnToggleVariants;\n"],"names":["toggleVariants","Toggle","TogglePrimitive.Root","ShadcnToggle","shadcnToggleVariants"],"mappings":";;;;;AAQA,MAAMA,gBAAA,GAAiB,GAAA;AAAA,EACrB,+iBAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,gBAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACX;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,kBAAA;AAAA,QACT,EAAA,EAAI,oBAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ,CAAA;AAEA,SAASC,QAAA,CAAO;AAAA,EACd,SAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA4F;AAC1F,EAAA,2BACGC,IAAgB,EAAhB,EAAqB,WAAA,EAAU,UAAS,SAAA,EAAW,EAAA,CAAGF,gBAAA,CAAe,EAAE,SAAS,IAAA,EAAM,SAAA,EAAW,CAAC,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AAErH;;ACAO,MAAM,MAAA,GAASG;AAMf,MAAM,cAAA,GAAiBC;;;;"}
1
+ {"version":3,"file":"Toggle.js","sources":["../shadcn/shadcnToggle/Toggle.tsx","../lib/components/Toggle/Toggle.tsx"],"sourcesContent":["'use client';\n\nimport * as TogglePrimitive from '@radix-ui/react-toggle';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type * as React from 'react';\n\nimport { cn } from '../utils';\n\nconst toggleVariants = cva(\n \"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap\",\n {\n variants: {\n variant: {\n default: 'bg-transparent',\n outline: 'border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground',\n },\n size: {\n default: 'h-9 px-2 min-w-9',\n sm: 'h-8 px-1.5 min-w-8',\n lg: 'h-10 px-2.5 min-w-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nfunction Toggle({\n className,\n variant,\n size,\n ...props\n}: React.ComponentProps<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive.Root data-slot=\"toggle\" className={cn(toggleVariants({ variant, size, className }))} {...props} />\n );\n}\n\nexport { Toggle, toggleVariants };\n","import { Toggle as ShadcnToggle, toggleVariants as shadcnToggleVariants } from '../../../shadcn/shadcnToggle';\n\nexport const Toggle = ShadcnToggle;\n\nexport const toggleVariants = shadcnToggleVariants;\n"],"names":["toggleVariants","Toggle","TogglePrimitive.Root","ShadcnToggle","shadcnToggleVariants"],"mappings":";;;;;AAQA,MAAMA,gBAAA,GAAiB,GAAA;AAAA,EACrB,+iBAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,gBAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACX;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,kBAAA;AAAA,QACT,EAAA,EAAI,oBAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ,CAAA;AAEA,SAASC,QAAA,CAAO;AAAA,EACd,SAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA4F;AAC1F,EAAA,2BACGC,IAAgB,EAAhB,EAAqB,WAAA,EAAU,UAAS,SAAA,EAAW,EAAA,CAAGF,gBAAA,CAAe,EAAE,SAAS,IAAA,EAAM,SAAA,EAAW,CAAC,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AAErH;;ACpCO,MAAM,MAAA,GAASG;AAEf,MAAM,cAAA,GAAiBC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.js","sources":["../lib/components/Tooltip/Tooltip.tsx"],"sourcesContent":["import type React from 'react';\nimport {\n Tooltip as ShadcnTooltip,\n TooltipContent as ShadcnTooltipContent,\n TooltipProvider as ShadcnTooltipProvider,\n TooltipTrigger as ShadcnTooltipTrigger,\n} from '../../../shadcn/shadcnTooltip';\n\nexport interface TooltipProps {\n /** The hover content shown in the floating tooltip */\n content: React.ReactNode;\n /** The trigger element the tooltip is anchored to */\n children: React.ReactNode;\n /** Side the tooltip opens toward */\n side?: 'top' | 'right' | 'bottom' | 'left';\n /** Alignment along the trigger edge */\n align?: 'start' | 'center' | 'end';\n /** Extra classes for the content surface */\n className?: string;\n /** Hover delay before opening (ms) */\n delayDuration?: number;\n /** When true (default), the trigger renders as its child instead of a wrapping button */\n asChild?: boolean;\n}\n\n// Composed single-import tooltip — pass `content` for the hover text and wrap the trigger as children.\nexport const Tooltip: React.FC<TooltipProps> = ({\n content,\n children,\n side = 'top',\n align = 'center',\n className,\n delayDuration = 200,\n asChild = true,\n}) => (\n <ShadcnTooltipProvider delayDuration={delayDuration}>\n <ShadcnTooltip>\n <ShadcnTooltipTrigger asChild={asChild}>{children}</ShadcnTooltipTrigger>\n <ShadcnTooltipContent side={side} align={align} className={className}>\n {content}\n </ShadcnTooltipContent>\n </ShadcnTooltip>\n </ShadcnTooltipProvider>\n);\n\nTooltip.displayName = 'Tooltip';\n"],"names":["ShadcnTooltipProvider","ShadcnTooltip","ShadcnTooltipTrigger","ShadcnTooltipContent"],"mappings":";;;AA0BO,MAAM,UAAkC,CAAC;AAAA,EAC9C,OAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA,GAAO,KAAA;AAAA,EACP,KAAA,GAAQ,QAAA;AAAA,EACR,SAAA;AAAA,EACA,aAAA,GAAgB,GAAA;AAAA,EAChB,OAAA,GAAU;AACZ,CAAA,qBACE,GAAA,CAACA,eAAA,EAAA,EAAsB,aAAA,EACrB,QAAA,kBAAA,IAAA,CAACC,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,kBAAA,GAAA,CAACC,cAAA,EAAA,EAAqB,SAAmB,QAAA,EAAS,CAAA;AAAA,kBAClD,GAAA,CAACC,cAAA,EAAA,EAAqB,IAAA,EAAY,KAAA,EAAc,WAC7C,QAAA,EAAA,OAAA,EACH;AAAA,CAAA,EACF,CAAA,EACF;AAGF,OAAA,CAAQ,WAAA,GAAc,SAAA;;;;"}
1
+ {"version":3,"file":"Tooltip.js","sources":["../lib/components/Tooltip/Tooltip.tsx"],"sourcesContent":["import type React from 'react';\nimport {\n Tooltip as ShadcnTooltip,\n TooltipContent as ShadcnTooltipContent,\n TooltipProvider as ShadcnTooltipProvider,\n TooltipTrigger as ShadcnTooltipTrigger,\n} from '../../../shadcn/shadcnTooltip';\n\nexport interface TooltipProps {\n content: React.ReactNode;\n children: React.ReactNode;\n side?: 'top' | 'right' | 'bottom' | 'left';\n align?: 'start' | 'center' | 'end';\n className?: string;\n delayDuration?: number;\n asChild?: boolean;\n}\n\n// Composed single-import tooltip — pass `content` for the hover text and wrap the trigger as children.\nexport const Tooltip: React.FC<TooltipProps> = ({\n content,\n children,\n side = 'top',\n align = 'center',\n className,\n delayDuration = 200,\n asChild = true,\n}) => (\n <ShadcnTooltipProvider delayDuration={delayDuration}>\n <ShadcnTooltip>\n <ShadcnTooltipTrigger asChild={asChild}>{children}</ShadcnTooltipTrigger>\n <ShadcnTooltipContent side={side} align={align} className={className}>\n {content}\n </ShadcnTooltipContent>\n </ShadcnTooltip>\n </ShadcnTooltipProvider>\n);\n\nTooltip.displayName = 'Tooltip';\n"],"names":["ShadcnTooltipProvider","ShadcnTooltip","ShadcnTooltipTrigger","ShadcnTooltipContent"],"mappings":";;;AAmBO,MAAM,UAAkC,CAAC;AAAA,EAC9C,OAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA,GAAO,KAAA;AAAA,EACP,KAAA,GAAQ,QAAA;AAAA,EACR,SAAA;AAAA,EACA,aAAA,GAAgB,GAAA;AAAA,EAChB,OAAA,GAAU;AACZ,CAAA,qBACE,GAAA,CAACA,eAAA,EAAA,EAAsB,aAAA,EACrB,QAAA,kBAAA,IAAA,CAACC,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,kBAAA,GAAA,CAACC,cAAA,EAAA,EAAqB,SAAmB,QAAA,EAAS,CAAA;AAAA,kBAClD,GAAA,CAACC,cAAA,EAAA,EAAqB,IAAA,EAAY,KAAA,EAAc,WAC7C,QAAA,EAAA,OAAA,EACH;AAAA,CAAA,EACF,CAAA,EACF;AAGF,OAAA,CAAQ,WAAA,GAAc,SAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Typography.js","sources":["../lib/components/Typography/Typography.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../../shadcn/utils';\n\nexport interface TypographyProps {\n /**\n * The content to render\n */\n children: React.ReactNode;\n\n /**\n * The semantic variant of the typography\n */\n variant?:\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'h5'\n | 'h6'\n | 'body1'\n | 'body2'\n | 'caption'\n | 'overline'\n | 'subtitle1'\n | 'subtitle2'\n | 'button'\n | 'code'\n | 'blockquote';\n\n /**\n * The color intent of the text\n */\n intent?: 'default' | 'primary' | 'secondary' | 'muted' | 'success' | 'warning' | 'error';\n\n /**\n * Whether text should be centered\n */\n align?: 'left' | 'center' | 'right' | 'justify';\n\n /**\n * Custom className\n */\n className?: string;\n}\n\nconst variantMap = {\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n h5: 'h5',\n h6: 'h6',\n body1: 'p',\n body2: 'p',\n caption: 'span',\n overline: 'span',\n subtitle1: 'h6',\n subtitle2: 'h6',\n button: 'span',\n code: 'code',\n blockquote: 'blockquote',\n} as const;\n\nexport const Typography: React.FC<TypographyProps> = ({\n children,\n variant = 'body1',\n intent = 'default',\n align = 'left',\n className,\n ...props\n}) => {\n const Component = variantMap[variant];\n\n const getVariantClasses = () => {\n switch (variant) {\n case 'h1':\n return 'scroll-m-20 text-4xl font-extrabold tracking-tight lg:text-5xl';\n case 'h2':\n return 'scroll-m-20 border-b pb-2 text-3xl font-semibold tracking-tight first:mt-0';\n case 'h3':\n return 'scroll-m-20 text-2xl font-semibold tracking-tight';\n case 'h4':\n return 'scroll-m-20 text-xl font-semibold tracking-tight';\n case 'h5':\n return 'scroll-m-20 text-lg font-semibold tracking-tight';\n case 'h6':\n return 'scroll-m-20 text-base font-semibold tracking-tight';\n case 'body1':\n return 'leading-7';\n case 'body2':\n return 'text-sm leading-6';\n case 'caption':\n return 'text-xs text-muted-foreground';\n case 'overline':\n return 'text-xs font-medium uppercase tracking-wide text-muted-foreground';\n case 'subtitle1':\n return 'text-lg font-medium';\n case 'subtitle2':\n return 'text-sm font-medium';\n case 'button':\n return 'text-sm font-medium';\n case 'code':\n return 'relative rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold';\n case 'blockquote':\n return 'mt-6 border-l-2 pl-6 italic';\n default:\n return 'leading-7';\n }\n };\n\n const getIntentClasses = () => {\n switch (intent) {\n case 'primary':\n return 'text-primary';\n case 'secondary':\n return 'text-secondary-foreground';\n case 'muted':\n return 'text-muted-foreground';\n case 'success':\n return 'text-green-600 dark:text-green-400';\n case 'warning':\n return 'text-yellow-600 dark:text-yellow-400';\n case 'error':\n return 'text-destructive';\n default:\n return 'text-foreground';\n }\n };\n\n const getAlignClasses = () => {\n switch (align) {\n case 'center':\n return 'text-center';\n case 'right':\n return 'text-right';\n case 'justify':\n return 'text-justify';\n default:\n return 'text-left';\n }\n };\n\n return (\n <Component className={cn(getVariantClasses(), getIntentClasses(), getAlignClasses(), className)} {...props}>\n {children}\n </Component>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Typography.js","sources":["../lib/components/Typography/Typography.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../../shadcn/utils';\n\nexport interface TypographyProps {\n children: React.ReactNode;\n\n variant?:\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'h5'\n | 'h6'\n | 'body1'\n | 'body2'\n | 'caption'\n | 'overline'\n | 'subtitle1'\n | 'subtitle2'\n | 'button'\n | 'code'\n | 'blockquote';\n\n intent?: 'default' | 'primary' | 'secondary' | 'muted' | 'success' | 'warning' | 'error';\n\n align?: 'left' | 'center' | 'right' | 'justify';\n\n className?: string;\n}\n\nconst variantMap = {\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n h5: 'h5',\n h6: 'h6',\n body1: 'p',\n body2: 'p',\n caption: 'span',\n overline: 'span',\n subtitle1: 'h6',\n subtitle2: 'h6',\n button: 'span',\n code: 'code',\n blockquote: 'blockquote',\n} as const;\n\nexport const Typography: React.FC<TypographyProps> = ({\n children,\n variant = 'body1',\n intent = 'default',\n align = 'left',\n className,\n ...props\n}) => {\n const Component = variantMap[variant];\n\n const getVariantClasses = () => {\n switch (variant) {\n case 'h1':\n return 'scroll-m-20 text-4xl font-extrabold tracking-tight lg:text-5xl';\n case 'h2':\n return 'scroll-m-20 border-b pb-2 text-3xl font-semibold tracking-tight first:mt-0';\n case 'h3':\n return 'scroll-m-20 text-2xl font-semibold tracking-tight';\n case 'h4':\n return 'scroll-m-20 text-xl font-semibold tracking-tight';\n case 'h5':\n return 'scroll-m-20 text-lg font-semibold tracking-tight';\n case 'h6':\n return 'scroll-m-20 text-base font-semibold tracking-tight';\n case 'body1':\n return 'leading-7';\n case 'body2':\n return 'text-sm leading-6';\n case 'caption':\n return 'text-xs text-muted-foreground';\n case 'overline':\n return 'text-xs font-medium uppercase tracking-wide text-muted-foreground';\n case 'subtitle1':\n return 'text-lg font-medium';\n case 'subtitle2':\n return 'text-sm font-medium';\n case 'button':\n return 'text-sm font-medium';\n case 'code':\n return 'relative rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold';\n case 'blockquote':\n return 'mt-6 border-l-2 pl-6 italic';\n default:\n return 'leading-7';\n }\n };\n\n const getIntentClasses = () => {\n switch (intent) {\n case 'primary':\n return 'text-primary';\n case 'secondary':\n return 'text-secondary-foreground';\n case 'muted':\n return 'text-muted-foreground';\n case 'success':\n return 'text-green-600 dark:text-green-400';\n case 'warning':\n return 'text-yellow-600 dark:text-yellow-400';\n case 'error':\n return 'text-destructive';\n default:\n return 'text-foreground';\n }\n };\n\n const getAlignClasses = () => {\n switch (align) {\n case 'center':\n return 'text-center';\n case 'right':\n return 'text-right';\n case 'justify':\n return 'text-justify';\n default:\n return 'text-left';\n }\n };\n\n return (\n <Component className={cn(getVariantClasses(), getIntentClasses(), getAlignClasses(), className)} {...props}>\n {children}\n </Component>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ const UomFilter = Object.assign(
11
11
  name: "uomId",
12
12
  label: "Unit of Measure",
13
13
  placeholder: "Select unit",
14
- optionsEndpoint: "commerce-api/uom/select",
14
+ optionsEndpoint: "commerce-api/select-api/uom",
15
15
  fieldKeys: { valueKey: "id", labelKey: "name" },
16
16
  ...props
17
17
  }
@@ -32,7 +32,7 @@ const UomSelector = forwardRef(({ fieldKeys, ...props }, ref) => /* @__PURE__ */
32
32
  label: "Unit of Measure",
33
33
  placeholder: "Select unit",
34
34
  searchable: true,
35
- optionsEndpoint: "commerce-api/uom/select",
35
+ optionsEndpoint: "commerce-api/select-api/uom",
36
36
  ...props,
37
37
  fieldKeys: { ...DEFAULT_FIELD_KEYS, ...fieldKeys }
38
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"UomSelector.js","sources":["../lib/selects/uom/UomFilter.tsx","../lib/selects/uom/UomSelector.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { SelectFilter, type SelectFilterProps } from '../../components/Select/SelectFilter';\n\nexport type UomFilterProps = Omit<SelectFilterProps, 'optionsEndpoint' | 'name'> & { name?: string };\n\n// Pre-configured SelectFilter for unit of measure filtering with async search\nexport const UomFilter = Object.assign(\n forwardRef<HTMLButtonElement, UomFilterProps>((props, ref) => (\n <SelectFilter\n ref={ref}\n name=\"uomId\"\n label=\"Unit of Measure\"\n placeholder=\"Select unit\"\n optionsEndpoint=\"commerce-api/uom/select\"\n fieldKeys={{ valueKey: 'id', labelKey: 'name' }}\n {...props}\n />\n )),\n { displayName: 'UomFilter', defaultLabel: 'Unit of Measure', defaultName: 'uomId' },\n);\n","import { forwardRef } from 'react';\nimport { Select, type SelectProps } from '../../components/Select/Select';\n\nexport type UomSelectorProps = Omit<SelectProps, 'optionsEndpoint'>;\n\nconst DEFAULT_FIELD_KEYS = {\n valueKey: 'id',\n labelKey: 'name',\n additionalKeys: 'allowDecimal',\n groupIdKey: 'dimensionId',\n} as const;\n\n// Pre-configured Select for unit of measure selection, grouped by dimension\nexport const UomSelector = forwardRef<HTMLButtonElement, UomSelectorProps>(({ fieldKeys, ...props }, ref) => (\n <Select\n ref={ref}\n label=\"Unit of Measure\"\n placeholder=\"Select unit\"\n searchable\n optionsEndpoint=\"commerce-api/uom/select\"\n {...props}\n fieldKeys={{ ...DEFAULT_FIELD_KEYS, ...fieldKeys }}\n />\n));\nUomSelector.displayName = 'UomSelector';\n"],"names":[],"mappings":";;;;;AAMO,MAAM,YAAY,MAAA,CAAO,MAAA;AAAA,EAC9B,UAAA,CAA8C,CAAC,KAAA,EAAO,GAAA,qBACpD,GAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,OAAA;AAAA,MACL,KAAA,EAAM,iBAAA;AAAA,MACN,WAAA,EAAY,aAAA;AAAA,MACZ,eAAA,EAAgB,yBAAA;AAAA,MAChB,SAAA,EAAW,EAAE,QAAA,EAAU,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC7C,GAAG;AAAA;AAAA,GAEP,CAAA;AAAA,EACD,EAAE,WAAA,EAAa,WAAA,EAAa,YAAA,EAAc,iBAAA,EAAmB,aAAa,OAAA;AAC5E;;ACdA,MAAM,kBAAA,GAAqB;AAAA,EACzB,QAAA,EAAU,IAAA;AAAA,EACV,QAAA,EAAU,MAAA;AAAA,EACV,cAAA,EAAgB,cAAA;AAAA,EAChB,UAAA,EAAY;AACd,CAAA;AAGO,MAAM,WAAA,GAAc,WAAgD,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBACnG,GAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,KAAA,EAAM,iBAAA;AAAA,IACN,WAAA,EAAY,aAAA;AAAA,IACZ,UAAA,EAAU,IAAA;AAAA,IACV,eAAA,EAAgB,yBAAA;AAAA,IACf,GAAG,KAAA;AAAA,IACJ,SAAA,EAAW,EAAE,GAAG,kBAAA,EAAoB,GAAG,SAAA;AAAU;AACnD,CACD;AACD,WAAA,CAAY,WAAA,GAAc,aAAA;;;;"}
1
+ {"version":3,"file":"UomSelector.js","sources":["../lib/selects/uom/UomFilter.tsx","../lib/selects/uom/UomSelector.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { SelectFilter, type SelectFilterProps } from '../../components/Select/SelectFilter';\n\nexport type UomFilterProps = Omit<SelectFilterProps, 'optionsEndpoint' | 'name'> & { name?: string };\n\n// Pre-configured SelectFilter for unit of measure filtering with async search\nexport const UomFilter = Object.assign(\n forwardRef<HTMLButtonElement, UomFilterProps>((props, ref) => (\n <SelectFilter\n ref={ref}\n name=\"uomId\"\n label=\"Unit of Measure\"\n placeholder=\"Select unit\"\n optionsEndpoint=\"commerce-api/select-api/uom\"\n fieldKeys={{ valueKey: 'id', labelKey: 'name' }}\n {...props}\n />\n )),\n { displayName: 'UomFilter', defaultLabel: 'Unit of Measure', defaultName: 'uomId' },\n);\n","import { forwardRef } from 'react';\nimport { Select, type SelectProps } from '../../components/Select/Select';\n\nexport type UomSelectorProps = Omit<SelectProps, 'optionsEndpoint'>;\n\nconst DEFAULT_FIELD_KEYS = {\n valueKey: 'id',\n labelKey: 'name',\n additionalKeys: 'allowDecimal',\n groupIdKey: 'dimensionId',\n} as const;\n\n// Pre-configured Select for unit of measure selection, grouped by dimension\nexport const UomSelector = forwardRef<HTMLButtonElement, UomSelectorProps>(({ fieldKeys, ...props }, ref) => (\n <Select\n ref={ref}\n label=\"Unit of Measure\"\n placeholder=\"Select unit\"\n searchable\n optionsEndpoint=\"commerce-api/select-api/uom\"\n {...props}\n fieldKeys={{ ...DEFAULT_FIELD_KEYS, ...fieldKeys }}\n />\n));\nUomSelector.displayName = 'UomSelector';\n"],"names":[],"mappings":";;;;;AAMO,MAAM,YAAY,MAAA,CAAO,MAAA;AAAA,EAC9B,UAAA,CAA8C,CAAC,KAAA,EAAO,GAAA,qBACpD,GAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,OAAA;AAAA,MACL,KAAA,EAAM,iBAAA;AAAA,MACN,WAAA,EAAY,aAAA;AAAA,MACZ,eAAA,EAAgB,6BAAA;AAAA,MAChB,SAAA,EAAW,EAAE,QAAA,EAAU,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC7C,GAAG;AAAA;AAAA,GAEP,CAAA;AAAA,EACD,EAAE,WAAA,EAAa,WAAA,EAAa,YAAA,EAAc,iBAAA,EAAmB,aAAa,OAAA;AAC5E;;ACdA,MAAM,kBAAA,GAAqB;AAAA,EACzB,QAAA,EAAU,IAAA;AAAA,EACV,QAAA,EAAU,MAAA;AAAA,EACV,cAAA,EAAgB,cAAA;AAAA,EAChB,UAAA,EAAY;AACd,CAAA;AAGO,MAAM,WAAA,GAAc,WAAgD,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBACnG,GAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,KAAA,EAAM,iBAAA;AAAA,IACN,WAAA,EAAY,aAAA;AAAA,IACZ,UAAA,EAAU,IAAA;AAAA,IACV,eAAA,EAAgB,6BAAA;AAAA,IACf,GAAG,KAAA;AAAA,IACJ,SAAA,EAAW,EAAE,GAAG,kBAAA,EAAoB,GAAG,SAAA;AAAU;AACnD,CACD;AACD,WAAA,CAAY,WAAA,GAAc,aAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"UploadFile.js","sources":["../lib/components/UploadFile/UploadFile.tsx"],"sourcesContent":["import { Camera, Upload, User, X } from 'lucide-react';\nimport type React from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport { cn } from '../../../shadcn/utils';\nimport { Button } from '../Button';\nimport { Field, FieldError, FieldLabel } from '../Field';\nimport { FilePreview } from '../FilePreview';\n\n// Preset anchor string values\ntype AnchorPreset = 'dropzone' | 'button' | 'avatar';\n\ninterface UploadFileBaseProps {\n // Trigger style — preset string or custom ReactNode (default: 'dropzone')\n anchor?: AnchorPreset | React.ReactNode;\n // Allow multiple file selection (default: false, returns single File)\n multiple?: boolean;\n // File type filter (accepts all files by default)\n accept?: string;\n // Disable the file input\n disabled?: boolean;\n // Optional field label\n label?: string;\n // Validation error message\n error?: string;\n // Primary text on the anchor (varies by anchor type)\n placeholder?: string;\n // Secondary descriptive text (e.g., \"PNG, JPG up to 10MB\")\n hint?: string;\n // Current file value — injected by Form Controller or passed directly\n value?: File | File[] | null;\n // Shows a pulsing loading animation on the file row during upload/processing.\n isLoading?: boolean;\n}\n\n// Standalone usage — onChange is required\ninterface UploadFileStandaloneProps extends UploadFileBaseProps {\n name?: never;\n onChange: (files: File | File[] | undefined) => void;\n}\n\n// Form usage — Controller injects onChange via name prop\ninterface UploadFileFormProps extends UploadFileBaseProps {\n name: string;\n onChange?: (files: File | File[] | undefined) => void;\n}\n\nexport type UploadFileProps = UploadFileStandaloneProps | UploadFileFormProps;\n\n// Circular avatar preview used by the avatar anchor preset\nconst AvatarPreview: React.FC<{ file: File; size: number }> = ({ file, size }) => {\n const [objectUrl, setObjectUrl] = useState<string | null>(null);\n\n useEffect(() => {\n const url = URL.createObjectURL(file);\n setObjectUrl(url);\n return () => URL.revokeObjectURL(url);\n }, [file]);\n\n if (!objectUrl) return null;\n\n return (\n <img\n src={objectUrl}\n alt={file.name}\n className=\"rounded-full object-cover w-full h-full\"\n style={{ width: size, height: size }}\n />\n );\n};\n\n// File upload trigger with optional preset anchors and built-in file preview\nexport const UploadFile: React.FC<UploadFileProps> = ({\n anchor = 'dropzone',\n multiple = false,\n accept,\n disabled,\n label,\n error,\n placeholder,\n hint,\n value,\n onChange,\n isLoading,\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Normalize value to an array for consistent handling\n const files: File[] = !value ? [] : Array.isArray(value) ? value : [value];\n const hasFiles = files.length > 0;\n\n // True when using a preset string anchor (not a custom ReactNode)\n const isPreset = anchor === 'dropzone' || anchor === 'button' || anchor === 'avatar';\n\n // Opens the native file picker\n function handleClick() {\n if (disabled) return;\n inputRef.current?.click();\n }\n\n // Forwards selected files to consumer and resets input\n function handleChange(event: React.ChangeEvent<HTMLInputElement>) {\n const fileList = event.target.files;\n if (!fileList || fileList.length === 0) return;\n\n if (multiple) {\n // Merge with existing files, avoiding duplicates by name+size\n const incoming = Array.from(fileList);\n const merged = [...files, ...incoming.filter((f) => !files.some((e) => e.name === f.name && e.size === f.size))];\n onChange?.(merged);\n } else {\n onChange?.(fileList[0]);\n }\n\n // Reset so the same file can be re-selected\n event.target.value = '';\n }\n\n // Removes a specific file from the selection\n function handleRemove(file: File) {\n if (multiple) {\n const remaining = files.filter((f) => f !== file);\n onChange?.(remaining.length ? remaining : undefined);\n } else {\n onChange?.(undefined);\n }\n }\n\n // Renders the clickable anchor element based on the anchor prop\n function renderAnchor() {\n // Custom ReactNode — preserve original headless behaviour\n if (!isPreset) {\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n style={{ all: 'unset', display: 'inline-block', cursor: disabled ? 'default' : 'pointer' }}\n >\n {anchor as React.ReactNode}\n </button>\n );\n }\n\n if (anchor === 'dropzone') {\n // In single mode with a file selected, the file row replaces the dropzone\n if (!multiple && hasFiles) return null;\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={cn(\n 'flex w-full flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed p-8 transition-colors',\n error ? 'border-destructive' : 'border-border',\n disabled ? 'cursor-default opacity-50' : 'cursor-pointer hover:bg-muted/50',\n )}\n >\n <Upload className=\"h-6 w-6 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">{placeholder ?? 'Click or drag to upload'}</p>\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </button>\n );\n }\n\n if (anchor === 'button') {\n // In single mode with a file selected, the file row replaces the button\n if (!multiple && hasFiles) return null;\n\n return (\n <Button type=\"button\" variant=\"outline\" onClick={handleClick} disabled={disabled}>\n <Upload className=\"h-4 w-4\" />\n {placeholder ?? 'Upload file'}\n </Button>\n );\n }\n\n if (anchor === 'avatar') {\n const avatarSize = 80;\n const firstFile = files[0];\n const hasImage = hasFiles && firstFile.type.startsWith('image/');\n\n return (\n // Wrapper provides positioning context for the badge outside overflow-hidden\n <div className=\"relative inline-block\" style={{ width: avatarSize, height: avatarSize }}>\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={cn(\n 'group relative h-full w-full overflow-hidden rounded-full bg-muted',\n disabled ? 'cursor-default opacity-50' : 'cursor-pointer',\n )}\n >\n {hasImage ? (\n <>\n <AvatarPreview file={firstFile} size={avatarSize} />\n {/* Camera overlay on hover */}\n <div className=\"absolute inset-0 flex items-center justify-center rounded-full bg-black/40 opacity-0 transition-opacity group-hover:opacity-100\">\n <Camera className=\"h-5 w-5 text-white\" />\n </div>\n </>\n ) : (\n <div className=\"flex h-full w-full items-center justify-center\">\n <User className=\"h-8 w-8 text-muted-foreground\" />\n </div>\n )}\n </button>\n\n {/* Badge sits outside overflow-hidden so it's never clipped */}\n {!hasImage && (\n <div className=\"pointer-events-none absolute -bottom-0.5 -right-0.5 flex h-6 w-6 items-center justify-center rounded-full bg-primary ring-2 ring-background\">\n <Upload className=\"h-3 w-3 text-primary-foreground\" />\n </div>\n )}\n </div>\n );\n }\n\n return null;\n }\n\n // Renders the file list below the anchor for preset anchors (not avatar)\n function renderFileList() {\n if (!isPreset || !hasFiles || anchor === 'avatar') return null;\n\n return (\n <div className=\"flex flex-col gap-2\">\n {files.map((file) => (\n <div\n key={`${file.name}-${file.size}`}\n className={cn(\n 'relative overflow-hidden flex items-center gap-3 rounded-lg border border-dashed p-3',\n isLoading ? 'border-primary/40 animate-pulse' : 'border-border',\n )}\n >\n {isLoading && <div className=\"absolute inset-0 bg-primary/5\" />}\n <div className=\"relative flex items-center gap-3 flex-1 min-w-0\">\n <FilePreview file={file} size={40} />\n <div className=\"flex-1 min-w-0\">\n <span className=\"block truncate text-sm\">{file.name}</span>\n {isLoading && <span className=\"text-xs text-muted-foreground\">Uploading...</span>}\n </div>\n {!isLoading && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n onClick={() => handleRemove(file)}\n disabled={disabled}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <Field data-disabled={disabled}>\n {label && <FieldLabel>{label}</FieldLabel>}\n\n {renderAnchor()}\n {renderFileList()}\n\n <input\n ref={inputRef}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n disabled={disabled}\n onChange={handleChange}\n style={{ display: 'none' }}\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n\n {error && <FieldError>{error}</FieldError>}\n </Field>\n );\n};\n\nUploadFile.displayName = 'UploadFile';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"UploadFile.js","sources":["../lib/components/UploadFile/UploadFile.tsx"],"sourcesContent":["import { Camera, Upload, User, X } from 'lucide-react';\nimport type React from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport { cn } from '../../../shadcn/utils';\nimport { Button } from '../Button';\nimport { Field, FieldError, FieldLabel } from '../Field';\nimport { FilePreview } from '../FilePreview';\n\ntype AnchorPreset = 'dropzone' | 'button' | 'avatar';\n\ninterface UploadFileBaseProps {\n anchor?: AnchorPreset | React.ReactNode;\n multiple?: boolean;\n accept?: string;\n disabled?: boolean;\n label?: string;\n error?: string;\n placeholder?: string;\n hint?: string;\n value?: File | File[] | null;\n isLoading?: boolean;\n}\n\ninterface UploadFileStandaloneProps extends UploadFileBaseProps {\n name?: never;\n onChange: (files: File | File[] | undefined) => void;\n}\n\ninterface UploadFileFormProps extends UploadFileBaseProps {\n name: string;\n onChange?: (files: File | File[] | undefined) => void;\n}\n\nexport type UploadFileProps = UploadFileStandaloneProps | UploadFileFormProps;\n\n// Circular avatar preview used by the avatar anchor preset\nconst AvatarPreview: React.FC<{ file: File; size: number }> = ({ file, size }) => {\n const [objectUrl, setObjectUrl] = useState<string | null>(null);\n\n useEffect(() => {\n const url = URL.createObjectURL(file);\n setObjectUrl(url);\n return () => URL.revokeObjectURL(url);\n }, [file]);\n\n if (!objectUrl) return null;\n\n return (\n <img\n src={objectUrl}\n alt={file.name}\n className=\"rounded-full object-cover w-full h-full\"\n style={{ width: size, height: size }}\n />\n );\n};\n\n// File upload trigger with optional preset anchors and built-in file preview\nexport const UploadFile: React.FC<UploadFileProps> = ({\n anchor = 'dropzone',\n multiple = false,\n accept,\n disabled,\n label,\n error,\n placeholder,\n hint,\n value,\n onChange,\n isLoading,\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Normalize value to an array for consistent handling\n const files: File[] = !value ? [] : Array.isArray(value) ? value : [value];\n const hasFiles = files.length > 0;\n\n // True when using a preset string anchor (not a custom ReactNode)\n const isPreset = anchor === 'dropzone' || anchor === 'button' || anchor === 'avatar';\n\n // Opens the native file picker\n function handleClick() {\n if (disabled) return;\n inputRef.current?.click();\n }\n\n // Forwards selected files to consumer and resets input\n function handleChange(event: React.ChangeEvent<HTMLInputElement>) {\n const fileList = event.target.files;\n if (!fileList || fileList.length === 0) return;\n\n if (multiple) {\n // Merge with existing files, avoiding duplicates by name+size\n const incoming = Array.from(fileList);\n const merged = [...files, ...incoming.filter((f) => !files.some((e) => e.name === f.name && e.size === f.size))];\n onChange?.(merged);\n } else {\n onChange?.(fileList[0]);\n }\n\n // Reset so the same file can be re-selected\n event.target.value = '';\n }\n\n // Removes a specific file from the selection\n function handleRemove(file: File) {\n if (multiple) {\n const remaining = files.filter((f) => f !== file);\n onChange?.(remaining.length ? remaining : undefined);\n } else {\n onChange?.(undefined);\n }\n }\n\n // Renders the clickable anchor element based on the anchor prop\n function renderAnchor() {\n // Custom ReactNode — preserve original headless behaviour\n if (!isPreset) {\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n style={{ all: 'unset', display: 'inline-block', cursor: disabled ? 'default' : 'pointer' }}\n >\n {anchor as React.ReactNode}\n </button>\n );\n }\n\n if (anchor === 'dropzone') {\n // In single mode with a file selected, the file row replaces the dropzone\n if (!multiple && hasFiles) return null;\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={cn(\n 'flex w-full flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed p-8 transition-colors',\n error ? 'border-destructive' : 'border-border',\n disabled ? 'cursor-default opacity-50' : 'cursor-pointer hover:bg-muted/50',\n )}\n >\n <Upload className=\"h-6 w-6 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">{placeholder ?? 'Click or drag to upload'}</p>\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </button>\n );\n }\n\n if (anchor === 'button') {\n // In single mode with a file selected, the file row replaces the button\n if (!multiple && hasFiles) return null;\n\n return (\n <Button type=\"button\" variant=\"outline\" onClick={handleClick} disabled={disabled}>\n <Upload className=\"h-4 w-4\" />\n {placeholder ?? 'Upload file'}\n </Button>\n );\n }\n\n if (anchor === 'avatar') {\n const avatarSize = 80;\n const firstFile = files[0];\n const hasImage = hasFiles && firstFile.type.startsWith('image/');\n\n return (\n // Wrapper provides positioning context for the badge outside overflow-hidden\n <div className=\"relative inline-block\" style={{ width: avatarSize, height: avatarSize }}>\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={cn(\n 'group relative h-full w-full overflow-hidden rounded-full bg-muted',\n disabled ? 'cursor-default opacity-50' : 'cursor-pointer',\n )}\n >\n {hasImage ? (\n <>\n <AvatarPreview file={firstFile} size={avatarSize} />\n {/* Camera overlay on hover */}\n <div className=\"absolute inset-0 flex items-center justify-center rounded-full bg-black/40 opacity-0 transition-opacity group-hover:opacity-100\">\n <Camera className=\"h-5 w-5 text-white\" />\n </div>\n </>\n ) : (\n <div className=\"flex h-full w-full items-center justify-center\">\n <User className=\"h-8 w-8 text-muted-foreground\" />\n </div>\n )}\n </button>\n\n {/* Badge sits outside overflow-hidden so it's never clipped */}\n {!hasImage && (\n <div className=\"pointer-events-none absolute -bottom-0.5 -right-0.5 flex h-6 w-6 items-center justify-center rounded-full bg-primary ring-2 ring-background\">\n <Upload className=\"h-3 w-3 text-primary-foreground\" />\n </div>\n )}\n </div>\n );\n }\n\n return null;\n }\n\n // Renders the file list below the anchor for preset anchors (not avatar)\n function renderFileList() {\n if (!isPreset || !hasFiles || anchor === 'avatar') return null;\n\n return (\n <div className=\"flex flex-col gap-2\">\n {files.map((file) => (\n <div\n key={`${file.name}-${file.size}`}\n className={cn(\n 'relative overflow-hidden flex items-center gap-3 rounded-lg border border-dashed p-3',\n isLoading ? 'border-primary/40 animate-pulse' : 'border-border',\n )}\n >\n {isLoading && <div className=\"absolute inset-0 bg-primary/5\" />}\n <div className=\"relative flex items-center gap-3 flex-1 min-w-0\">\n <FilePreview file={file} size={40} />\n <div className=\"flex-1 min-w-0\">\n <span className=\"block truncate text-sm\">{file.name}</span>\n {isLoading && <span className=\"text-xs text-muted-foreground\">Uploading...</span>}\n </div>\n {!isLoading && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n onClick={() => handleRemove(file)}\n disabled={disabled}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <Field data-disabled={disabled}>\n {label && <FieldLabel>{label}</FieldLabel>}\n\n {renderAnchor()}\n {renderFileList()}\n\n <input\n ref={inputRef}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n disabled={disabled}\n onChange={handleChange}\n style={{ display: 'none' }}\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n\n {error && <FieldError>{error}</FieldError>}\n </Field>\n );\n};\n\nUploadFile.displayName = 'UploadFile';\n"],"names":[],"mappings":"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"}
@@ -922,7 +922,7 @@ svg.react-flow__connectionline {
922
922
  --accent-foreground: oklch(0.5789 0.1833 256.2496);
923
923
  --destructive: oklch(0.5771 0.2152 27.325);
924
924
  --destructive-foreground: oklch(1 0 0);
925
- --warning: oklch(0.75 0.15 85);
925
+ --warning: oklch(0.62 0.14 78);
926
926
  --warning-foreground: oklch(0.2302 0.0547 256.1829);
927
927
  --success: oklch(0.65 0.15 145);
928
928
  --success-foreground: oklch(1 0 0);
@@ -1343,10 +1343,6 @@ select:-webkit-autofill:active {
1343
1343
  pointer-events: none;
1344
1344
  }
1345
1345
 
1346
- .collapse {
1347
- visibility: collapse;
1348
- }
1349
-
1350
1346
  .invisible {
1351
1347
  visibility: hidden;
1352
1348
  }
@@ -1957,6 +1953,10 @@ select:-webkit-autofill:active {
1957
1953
  height: calc(var(--spacing) * 4);
1958
1954
  }
1959
1955
 
1956
+ .h-4\.5 {
1957
+ height: calc(var(--spacing) * 4.5);
1958
+ }
1959
+
1960
1960
  .h-5 {
1961
1961
  height: calc(var(--spacing) * 5);
1962
1962
  }
@@ -2001,10 +2001,6 @@ select:-webkit-autofill:active {
2001
2001
  height: --cell-size;
2002
2002
  }
2003
2003
 
2004
- .h-\[18px\] {
2005
- height: 18px;
2006
- }
2007
-
2008
2004
  .h-\[42px\] {
2009
2005
  height: 42px;
2010
2006
  }
@@ -2241,6 +2237,10 @@ select:-webkit-autofill:active {
2241
2237
  width: calc(var(--spacing) * 48);
2242
2238
  }
2243
2239
 
2240
+ .w-50 {
2241
+ width: calc(var(--spacing) * 50);
2242
+ }
2243
+
2244
2244
  .w-56 {
2245
2245
  width: calc(var(--spacing) * 56);
2246
2246
  }
@@ -2401,6 +2401,10 @@ select:-webkit-autofill:active {
2401
2401
  min-width: calc(var(--spacing) * 4);
2402
2402
  }
2403
2403
 
2404
+ .min-w-4\.5 {
2405
+ min-width: calc(var(--spacing) * 4.5);
2406
+ }
2407
+
2404
2408
  .min-w-5 {
2405
2409
  min-width: calc(var(--spacing) * 5);
2406
2410
  }
@@ -2421,10 +2425,6 @@ select:-webkit-autofill:active {
2421
2425
  min-width: 8rem;
2422
2426
  }
2423
2427
 
2424
- .min-w-\[18px\] {
2425
- min-width: 18px;
2426
- }
2427
-
2428
2428
  .min-w-\[100px\] {
2429
2429
  min-width: 100px;
2430
2430
  }
@@ -3563,6 +3563,10 @@ select:-webkit-autofill:active {
3563
3563
  background-color: #0000;
3564
3564
  }
3565
3565
 
3566
+ .bg-transparent\! {
3567
+ background-color: #0000 !important;
3568
+ }
3569
+
3566
3570
  .bg-warning, .bg-warning\/10 {
3567
3571
  background-color: var(--warning);
3568
3572
  }
@@ -6800,10 +6804,18 @@ select:-webkit-autofill:active {
6800
6804
  border-bottom-left-radius: calc(var(--radius) - 2px);
6801
6805
  }
6802
6806
 
6807
+ .\[\&\>\*\]\:min-h-0 > * {
6808
+ min-height: calc(var(--spacing) * 0);
6809
+ }
6810
+
6803
6811
  .\[\&\>\*\]\:w-full > * {
6804
6812
  width: 100%;
6805
6813
  }
6806
6814
 
6815
+ .\[\&\>\*\]\:flex-1 > * {
6816
+ flex: 1;
6817
+ }
6818
+
6807
6819
  .\[\&\>\*\]\:focus-visible\:relative > :focus-visible {
6808
6820
  position: relative;
6809
6821
  }
package/dist/calendar2.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import React__default, { createContext, useContext, useCallback, useRef, useLayoutEffect, useState, useEffect, useMemo } from 'react';
3
3
  import { c as cn } from './utils.js';
4
- import { T as TZDate } from './index5.js';
4
+ import { T as TZDate } from './index6.js';
5
5
  import { e as enUS$1, s as startOfWeek } from './en-US.js';
6
6
  import { f as format, j as differenceInCalendarDays, c as getISOWeek, b as getWeek, k as isDate, s as startOfDay, a as startOfISOWeek, m as startOfYear } from './format.js';
7
7
  import { c as addDays, d as addMonths, e as addWeeks, f as addYears, h as differenceInCalendarMonths, j as eachMonthOfInterval, k as eachYearOfInterval, l as endOfISOWeek, n as endOfMonth, o as endOfWeek, q as endOfYear, r as getMonth, t as getYear, a as isAfter, i as isBefore, u as isSameDay, v as isSameMonth, w as isSameYear, m as max, b as min, x as setMonth, y as setYear, s as startOfMonth } from './setYear.js';
@@ -1,5 +1,5 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { R as Root, T as Trigger, C as Content } from './index4.js';
2
+ import { R as Root, T as Trigger, C as Content } from './index5.js';
3
3
 
4
4
  function Collapsible({ ...props }) {
5
5
  return /* @__PURE__ */ jsx(Root, { "data-slot": "collapsible", ...props });
@@ -0,0 +1,2 @@
1
+ export { C as CompanySelector } from '../CompanySelector.js';
2
+ //# sourceMappingURL=CompanySelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompanySelector.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,6 +1,6 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import '../index5.js';
3
- import { t as tz } from '../index6.js';
2
+ import '../index6.js';
3
+ import { t as tz } from '../index7.js';
4
4
  import { u as useBUTimezone } from '../useBUTimezone.js';
5
5
  import { u as useLocale } from '../useLocale.js';
6
6
  import { i as isValid, f as format } from '../format.js';
@@ -1,2 +1,3 @@
1
- export { H as Handle, a as HierarchyGraph, P as Position } from '../HierarchyGraph.js';
1
+ export { H as Handle, P as Position } from '../index3.js';
2
+ export { H as HierarchyGraph } from '../HierarchyGraph.js';
2
3
  //# sourceMappingURL=HierarchyGraph.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HierarchyGraph.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"HierarchyGraph.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,2 +1,2 @@
1
- export { P as PermissionGateProvider, a as PermissionLockIcon, l as lockedTip, u as usePermission, b as usePermissionGate } from '../PermissionGate.js';
1
+ export { P as PermissionGate, a as PermissionGateProvider, b as PermissionLockIcon, l as lockedTip, u as usePermission, c as usePermissionGate } from '../PermissionGate.js';
2
2
  //# sourceMappingURL=PermissionGate.js.map
@@ -0,0 +1,2 @@
1
+ export { P as PersonSelector } from '../PersonSelector.js';
2
+ //# sourceMappingURL=PersonSelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersonSelector.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"ScanBarcodeButton.js","sources":["../../lib/components/ScanBarcodeButton/ScanBarcodeButton.tsx"],"sourcesContent":["import { ScanBarcode } from 'lucide-react';\nimport type { UseBarcodeScannerResult } from '../../hooks/useBarcodeScanner';\nimport { Button } from '../Button';\nimport { KbdGroup } from '../Kbd';\n\nexport interface ScanBarcodeButtonProps {\n scanner: UseBarcodeScannerResult;\n disabled?: boolean;\n label?: string;\n loadingText?: string;\n}\n\n// Toggle button for a `useBarcodeScanner`. Reflects the scanner's active state (filled when on) and\n// its pending state (spinner while a scanned code is being submitted), and surfaces the toggle hotkey.\nexport function ScanBarcodeButton({\n scanner,\n disabled,\n label = 'Scan Barcode',\n loadingText = 'Scanning...',\n}: ScanBarcodeButtonProps) {\n return (\n <Button\n size=\"sm\"\n variant={scanner.isActive ? 'default' : 'outline'}\n startAdornment={<ScanBarcode className=\"size-4\" />}\n endAdornment={<KbdGroup className=\"ml-1\" shortcut={scanner.toggleShortcut} />}\n onClick={scanner.toggle}\n disabled={disabled}\n isLoading={scanner.isPending}\n loadingText={loadingText}\n >\n {label}\n </Button>\n );\n}\n"],"names":[],"mappings":";;;;;AAcO,SAAS,iBAAA,CAAkB;AAAA,EAChC,OAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,cAAA;AAAA,EACR,WAAA,GAAc;AAChB,CAAA,EAA2B;AACzB,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,IAAA;AAAA,MACL,OAAA,EAAS,OAAA,CAAQ,QAAA,GAAW,SAAA,GAAY,SAAA;AAAA,MACxC,cAAA,kBAAgB,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,MAChD,8BAAc,GAAA,CAAC,QAAA,EAAA,EAAS,WAAU,MAAA,EAAO,QAAA,EAAU,QAAQ,cAAA,EAAgB,CAAA;AAAA,MAC3E,SAAS,OAAA,CAAQ,MAAA;AAAA,MACjB,QAAA;AAAA,MACA,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,WAAA;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;;;;"}
1
+ {"version":3,"file":"ScanBarcodeButton.js","sources":["../../lib/components/ScanBarcodeButton/ScanBarcodeButton.tsx"],"sourcesContent":["import { ScanBarcode } from 'lucide-react';\nimport type { UseBarcodeScannerResult } from '../../hooks/useBarcodeScanner';\nimport { Button } from '../Button';\nimport { KbdGroup } from '../Kbd';\n\nexport interface ScanBarcodeButtonProps {\n scanner: UseBarcodeScannerResult;\n disabled?: boolean;\n label?: string;\n loadingText?: string;\n}\n\n// Toggle button for a `useBarcodeScanner` reflecting its active/pending state and surfacing the toggle hotkey\nexport function ScanBarcodeButton({\n scanner,\n disabled,\n label = 'Scan Barcode',\n loadingText = 'Scanning...',\n}: ScanBarcodeButtonProps) {\n return (\n <Button\n size=\"sm\"\n variant={scanner.isActive ? 'default' : 'outline'}\n startAdornment={<ScanBarcode className=\"size-4\" />}\n endAdornment={<KbdGroup className=\"ml-1\" shortcut={scanner.toggleShortcut} />}\n onClick={scanner.toggle}\n disabled={disabled}\n isLoading={scanner.isPending}\n loadingText={loadingText}\n >\n {label}\n </Button>\n );\n}\n"],"names":[],"mappings":";;;;;AAaO,SAAS,iBAAA,CAAkB;AAAA,EAChC,OAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,cAAA;AAAA,EACR,WAAA,GAAc;AAChB,CAAA,EAA2B;AACzB,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,IAAA;AAAA,MACL,OAAA,EAAS,OAAA,CAAQ,QAAA,GAAW,SAAA,GAAY,SAAA;AAAA,MACxC,cAAA,kBAAgB,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,MAChD,8BAAc,GAAA,CAAC,QAAA,EAAA,EAAS,WAAU,MAAA,EAAO,QAAA,EAAU,QAAQ,cAAA,EAAgB,CAAA;AAAA,MAC3E,SAAS,OAAA,CAAQ,MAAA;AAAA,MACjB,QAAA;AAAA,MACA,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,WAAA;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;;;;"}
@@ -1,12 +1,12 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import React__default from 'react';
3
- import { c as createContextScope } from '../index20.js';
4
- import { c as createCollection, u as useDirection } from '../index23.js';
5
- import { u as useComposedRefs } from '../index11.js';
6
- import { P as Primitive, u as useControllableState, c as composeEventHandlers } from '../index19.js';
7
- import { C as Content, T as Trigger, R as Root, c as createCollapsibleScope } from '../index4.js';
8
- import { u as useId } from '../index24.js';
9
- import { c as cva } from '../index8.js';
3
+ import { c as createContextScope } from '../index21.js';
4
+ import { c as createCollection, u as useDirection } from '../index24.js';
5
+ import { u as useComposedRefs } from '../index12.js';
6
+ import { P as Primitive, u as useControllableState, c as composeEventHandlers } from '../index20.js';
7
+ import { C as Content, T as Trigger, R as Root, c as createCollapsibleScope } from '../index5.js';
8
+ import { u as useId } from '../index25.js';
9
+ import { c as cva } from '../index9.js';
10
10
  import { c as cn } from '../utils.js';
11
11
  import { b as SortableList, a as SortableItem } from '../Sortable.js';
12
12
  import { C as ChevronDown } from '../chevron-down.js';