@nofinite/nui 1.1.2 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. package/README.md +61 -48
  2. package/dist/components/accordion/Accordion.cjs +1 -1
  3. package/dist/components/accordion/Accordion.cjs.map +1 -1
  4. package/dist/components/accordion/Accordion.js +64 -43
  5. package/dist/components/accordion/Accordion.js.map +1 -1
  6. package/dist/components/alert/Alert.cjs +1 -1
  7. package/dist/components/alert/Alert.cjs.map +1 -1
  8. package/dist/components/alert/Alert.js +39 -25
  9. package/dist/components/alert/Alert.js.map +1 -1
  10. package/dist/components/avatar/Avatar.cjs +1 -1
  11. package/dist/components/avatar/Avatar.cjs.map +1 -1
  12. package/dist/components/avatar/Avatar.js +58 -44
  13. package/dist/components/avatar/Avatar.js.map +1 -1
  14. package/dist/components/avatar/AvatarGroup.cjs +1 -1
  15. package/dist/components/avatar/AvatarGroup.cjs.map +1 -1
  16. package/dist/components/avatar/AvatarGroup.js +34 -25
  17. package/dist/components/avatar/AvatarGroup.js.map +1 -1
  18. package/dist/components/badge/Badge.cjs +1 -1
  19. package/dist/components/badge/Badge.cjs.map +1 -1
  20. package/dist/components/badge/Badge.js +43 -68
  21. package/dist/components/badge/Badge.js.map +1 -1
  22. package/dist/components/badge/BadgeGroup.cjs +1 -1
  23. package/dist/components/badge/BadgeGroup.cjs.map +1 -1
  24. package/dist/components/badge/BadgeGroup.js +20 -10
  25. package/dist/components/badge/BadgeGroup.js.map +1 -1
  26. package/dist/components/breadcrumbs/Breadcrumbs.cjs +1 -1
  27. package/dist/components/breadcrumbs/Breadcrumbs.cjs.map +1 -1
  28. package/dist/components/breadcrumbs/Breadcrumbs.js +59 -39
  29. package/dist/components/breadcrumbs/Breadcrumbs.js.map +1 -1
  30. package/dist/components/button/Button.cjs +1 -1
  31. package/dist/components/button/Button.cjs.map +1 -1
  32. package/dist/components/button/Button.js +52 -17
  33. package/dist/components/button/Button.js.map +1 -1
  34. package/dist/components/card/Card.cjs +1 -1
  35. package/dist/components/card/Card.cjs.map +1 -1
  36. package/dist/components/card/Card.js +44 -41
  37. package/dist/components/card/Card.js.map +1 -1
  38. package/dist/components/checkbox/Checkbox.cjs +1 -1
  39. package/dist/components/checkbox/Checkbox.cjs.map +1 -1
  40. package/dist/components/checkbox/Checkbox.js +59 -40
  41. package/dist/components/checkbox/Checkbox.js.map +1 -1
  42. package/dist/components/chip/Chip.cjs +1 -1
  43. package/dist/components/chip/Chip.cjs.map +1 -1
  44. package/dist/components/chip/Chip.js +67 -47
  45. package/dist/components/chip/Chip.js.map +1 -1
  46. package/dist/components/combobox/Combobox.cjs +1 -1
  47. package/dist/components/combobox/Combobox.cjs.map +1 -1
  48. package/dist/components/combobox/Combobox.js +123 -108
  49. package/dist/components/combobox/Combobox.js.map +1 -1
  50. package/dist/components/commandpalette/CommandPalette.cjs +1 -1
  51. package/dist/components/commandpalette/CommandPalette.cjs.map +1 -1
  52. package/dist/components/commandpalette/CommandPalette.js +96 -73
  53. package/dist/components/commandpalette/CommandPalette.js.map +1 -1
  54. package/dist/components/contextmenu/ContextMenu.cjs +1 -1
  55. package/dist/components/contextmenu/ContextMenu.cjs.map +1 -1
  56. package/dist/components/contextmenu/ContextMenu.js +79 -58
  57. package/dist/components/contextmenu/ContextMenu.js.map +1 -1
  58. package/dist/components/datagrid/DataGrid.cjs +1 -1
  59. package/dist/components/datagrid/DataGrid.cjs.map +1 -1
  60. package/dist/components/datagrid/DataGrid.js +184 -202
  61. package/dist/components/datagrid/DataGrid.js.map +1 -1
  62. package/dist/components/datepicker/DatePicker.cjs +1 -1
  63. package/dist/components/datepicker/DatePicker.cjs.map +1 -1
  64. package/dist/components/datepicker/DatePicker.js +197 -164
  65. package/dist/components/datepicker/DatePicker.js.map +1 -1
  66. package/dist/components/daterangepicker/DateRangePicker.cjs +1 -1
  67. package/dist/components/daterangepicker/DateRangePicker.cjs.map +1 -1
  68. package/dist/components/daterangepicker/DateRangePicker.js +254 -213
  69. package/dist/components/daterangepicker/DateRangePicker.js.map +1 -1
  70. package/dist/components/dialog/DialogProvider.cjs +2 -0
  71. package/dist/components/dialog/DialogProvider.cjs.map +1 -0
  72. package/dist/components/dialog/DialogProvider.js +71 -0
  73. package/dist/components/dialog/DialogProvider.js.map +1 -0
  74. package/dist/components/dialog/dialogStore.cjs +2 -0
  75. package/dist/components/dialog/dialogStore.cjs.map +1 -0
  76. package/dist/components/dialog/dialogStore.js +60 -0
  77. package/dist/components/dialog/dialogStore.js.map +1 -0
  78. package/dist/components/drawer/Drawer.cjs +1 -1
  79. package/dist/components/drawer/Drawer.cjs.map +1 -1
  80. package/dist/components/drawer/Drawer.js +69 -47
  81. package/dist/components/drawer/Drawer.js.map +1 -1
  82. package/dist/components/dropdown/Dropdown.cjs +1 -1
  83. package/dist/components/dropdown/Dropdown.cjs.map +1 -1
  84. package/dist/components/dropdown/Dropdown.js +134 -108
  85. package/dist/components/dropdown/Dropdown.js.map +1 -1
  86. package/dist/components/fileuploader/FileUploader.cjs +1 -1
  87. package/dist/components/fileuploader/FileUploader.cjs.map +1 -1
  88. package/dist/components/fileuploader/FileUploader.js +96 -61
  89. package/dist/components/fileuploader/FileUploader.js.map +1 -1
  90. package/dist/components/hovercard/HoverCard.cjs +1 -1
  91. package/dist/components/hovercard/HoverCard.cjs.map +1 -1
  92. package/dist/components/hovercard/HoverCard.js +124 -69
  93. package/dist/components/hovercard/HoverCard.js.map +1 -1
  94. package/dist/components/input/Input.cjs +1 -1
  95. package/dist/components/input/Input.cjs.map +1 -1
  96. package/dist/components/input/Input.js +62 -37
  97. package/dist/components/input/Input.js.map +1 -1
  98. package/dist/components/layout/Container.cjs +1 -1
  99. package/dist/components/layout/Container.cjs.map +1 -1
  100. package/dist/components/layout/Container.js +21 -30
  101. package/dist/components/layout/Container.js.map +1 -1
  102. package/dist/components/layout/Flex.cjs +1 -1
  103. package/dist/components/layout/Flex.cjs.map +1 -1
  104. package/dist/components/layout/Flex.js +36 -19
  105. package/dist/components/layout/Flex.js.map +1 -1
  106. package/dist/components/layout/Grid.cjs +1 -1
  107. package/dist/components/layout/Grid.cjs.map +1 -1
  108. package/dist/components/layout/Grid.js +30 -18
  109. package/dist/components/layout/Grid.js.map +1 -1
  110. package/dist/components/link/Link.cjs +2 -0
  111. package/dist/components/link/Link.cjs.map +1 -0
  112. package/dist/components/link/Link.js +41 -0
  113. package/dist/components/link/Link.js.map +1 -0
  114. package/dist/components/megamenu/MegaMenu.cjs +1 -1
  115. package/dist/components/megamenu/MegaMenu.cjs.map +1 -1
  116. package/dist/components/megamenu/MegaMenu.js +107 -38
  117. package/dist/components/megamenu/MegaMenu.js.map +1 -1
  118. package/dist/components/modal/Modal.cjs +1 -1
  119. package/dist/components/modal/Modal.cjs.map +1 -1
  120. package/dist/components/modal/Modal.js +91 -83
  121. package/dist/components/modal/Modal.js.map +1 -1
  122. package/dist/components/multiselect/MultiSelect.cjs +2 -0
  123. package/dist/components/multiselect/MultiSelect.cjs.map +1 -0
  124. package/dist/components/multiselect/MultiSelect.js +176 -0
  125. package/dist/components/multiselect/MultiSelect.js.map +1 -0
  126. package/dist/components/nuiprovider/NUIProvider.cjs +2 -0
  127. package/dist/components/nuiprovider/NUIProvider.cjs.map +1 -0
  128. package/dist/components/nuiprovider/NUIProvider.js +36 -0
  129. package/dist/components/nuiprovider/NUIProvider.js.map +1 -0
  130. package/dist/components/pagination/Pagination.cjs +1 -1
  131. package/dist/components/pagination/Pagination.cjs.map +1 -1
  132. package/dist/components/pagination/Pagination.js +74 -41
  133. package/dist/components/pagination/Pagination.js.map +1 -1
  134. package/dist/components/popover/Popover.cjs +1 -1
  135. package/dist/components/popover/Popover.cjs.map +1 -1
  136. package/dist/components/popover/Popover.js +99 -100
  137. package/dist/components/popover/Popover.js.map +1 -1
  138. package/dist/components/progress/Progress.cjs +1 -1
  139. package/dist/components/progress/Progress.cjs.map +1 -1
  140. package/dist/components/progress/Progress.js +44 -22
  141. package/dist/components/progress/Progress.js.map +1 -1
  142. package/dist/components/radiogroup/RadioGroup.cjs +1 -1
  143. package/dist/components/radiogroup/RadioGroup.cjs.map +1 -1
  144. package/dist/components/radiogroup/RadioGroup.js +69 -74
  145. package/dist/components/radiogroup/RadioGroup.js.map +1 -1
  146. package/dist/components/rating/Rating.cjs +1 -1
  147. package/dist/components/rating/Rating.cjs.map +1 -1
  148. package/dist/components/rating/Rating.js +72 -33
  149. package/dist/components/rating/Rating.js.map +1 -1
  150. package/dist/components/resizable/Resizable.cjs +2 -0
  151. package/dist/components/resizable/Resizable.cjs.map +1 -0
  152. package/dist/components/resizable/Resizable.js +134 -0
  153. package/dist/components/resizable/Resizable.js.map +1 -0
  154. package/dist/components/select/Select.cjs +1 -1
  155. package/dist/components/select/Select.cjs.map +1 -1
  156. package/dist/components/select/Select.js +114 -113
  157. package/dist/components/select/Select.js.map +1 -1
  158. package/dist/components/skeleton/Skeleton.cjs +1 -1
  159. package/dist/components/skeleton/Skeleton.cjs.map +1 -1
  160. package/dist/components/skeleton/Skeleton.js +90 -67
  161. package/dist/components/skeleton/Skeleton.js.map +1 -1
  162. package/dist/components/slider/Slider.cjs +1 -1
  163. package/dist/components/slider/Slider.cjs.map +1 -1
  164. package/dist/components/slider/Slider.js +85 -82
  165. package/dist/components/slider/Slider.js.map +1 -1
  166. package/dist/components/spinner/Spinner.cjs +1 -1
  167. package/dist/components/spinner/Spinner.cjs.map +1 -1
  168. package/dist/components/spinner/Spinner.js +60 -17
  169. package/dist/components/spinner/Spinner.js.map +1 -1
  170. package/dist/components/stepper/Stepper.cjs +1 -5
  171. package/dist/components/stepper/Stepper.cjs.map +1 -1
  172. package/dist/components/stepper/Stepper.js +65 -39
  173. package/dist/components/stepper/Stepper.js.map +1 -1
  174. package/dist/components/switch/Switch.cjs +1 -1
  175. package/dist/components/switch/Switch.cjs.map +1 -1
  176. package/dist/components/switch/Switch.js +89 -62
  177. package/dist/components/switch/Switch.js.map +1 -1
  178. package/dist/components/table/Table.cjs +1 -1
  179. package/dist/components/table/Table.cjs.map +1 -1
  180. package/dist/components/table/Table.js +62 -35
  181. package/dist/components/table/Table.js.map +1 -1
  182. package/dist/components/tabs/Tabs.cjs +1 -1
  183. package/dist/components/tabs/Tabs.cjs.map +1 -1
  184. package/dist/components/tabs/Tabs.js +110 -50
  185. package/dist/components/tabs/Tabs.js.map +1 -1
  186. package/dist/components/textarea/Textarea.cjs +1 -1
  187. package/dist/components/textarea/Textarea.cjs.map +1 -1
  188. package/dist/components/textarea/Textarea.js +63 -58
  189. package/dist/components/textarea/Textarea.js.map +1 -1
  190. package/dist/components/timepicker/TimePicker.cjs +2 -0
  191. package/dist/components/timepicker/TimePicker.cjs.map +1 -0
  192. package/dist/components/timepicker/TimePicker.js +159 -0
  193. package/dist/components/timepicker/TimePicker.js.map +1 -0
  194. package/dist/components/timerangepicker/TimeRangePicker.cjs +2 -0
  195. package/dist/components/timerangepicker/TimeRangePicker.cjs.map +1 -0
  196. package/dist/components/timerangepicker/TimeRangePicker.js +208 -0
  197. package/dist/components/timerangepicker/TimeRangePicker.js.map +1 -0
  198. package/dist/components/toast/Toast.cjs +1 -1
  199. package/dist/components/toast/Toast.cjs.map +1 -1
  200. package/dist/components/toast/Toast.js +91 -38
  201. package/dist/components/toast/Toast.js.map +1 -1
  202. package/dist/components/tooltip/Tooltip.cjs +1 -1
  203. package/dist/components/tooltip/Tooltip.cjs.map +1 -1
  204. package/dist/components/tooltip/Tooltip.js +72 -56
  205. package/dist/components/tooltip/Tooltip.js.map +1 -1
  206. package/dist/components/treeview/TreeView.cjs +1 -1
  207. package/dist/components/treeview/TreeView.cjs.map +1 -1
  208. package/dist/components/treeview/TreeView.js +120 -90
  209. package/dist/components/treeview/TreeView.js.map +1 -1
  210. package/dist/components/virtuallist/VirtualList.cjs +1 -1
  211. package/dist/components/virtuallist/VirtualList.cjs.map +1 -1
  212. package/dist/components/virtuallist/VirtualList.js +52 -34
  213. package/dist/components/virtuallist/VirtualList.js.map +1 -1
  214. package/dist/index.cjs +1 -1
  215. package/dist/index.css +1 -0
  216. package/dist/index.js +120 -106
  217. package/dist/index.js.map +1 -1
  218. package/dist/package.json +49 -6
  219. package/dist/types/components/accordion/Accordion.d.ts +7 -3
  220. package/dist/types/components/accordion/Accordion.d.ts.map +1 -1
  221. package/dist/types/components/alert/Alert.d.ts +18 -5
  222. package/dist/types/components/alert/Alert.d.ts.map +1 -1
  223. package/dist/types/components/avatar/Avatar.d.ts +12 -8
  224. package/dist/types/components/avatar/Avatar.d.ts.map +1 -1
  225. package/dist/types/components/avatar/AvatarGroup.d.ts +11 -4
  226. package/dist/types/components/avatar/AvatarGroup.d.ts.map +1 -1
  227. package/dist/types/components/badge/Badge.d.ts +19 -11
  228. package/dist/types/components/badge/Badge.d.ts.map +1 -1
  229. package/dist/types/components/badge/BadgeGroup.d.ts +7 -4
  230. package/dist/types/components/badge/BadgeGroup.d.ts.map +1 -1
  231. package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts +14 -6
  232. package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts.map +1 -1
  233. package/dist/types/components/button/Button.d.ts +25 -10
  234. package/dist/types/components/button/Button.d.ts.map +1 -1
  235. package/dist/types/components/card/Card.d.ts +12 -21
  236. package/dist/types/components/card/Card.d.ts.map +1 -1
  237. package/dist/types/components/checkbox/Checkbox.d.ts +12 -7
  238. package/dist/types/components/checkbox/Checkbox.d.ts.map +1 -1
  239. package/dist/types/components/chip/Chip.d.ts +14 -11
  240. package/dist/types/components/chip/Chip.d.ts.map +1 -1
  241. package/dist/types/components/combobox/Combobox.d.ts +15 -4
  242. package/dist/types/components/combobox/Combobox.d.ts.map +1 -1
  243. package/dist/types/components/commandpalette/CommandPalette.d.ts +12 -3
  244. package/dist/types/components/commandpalette/CommandPalette.d.ts.map +1 -1
  245. package/dist/types/components/contextmenu/ContextMenu.d.ts +14 -6
  246. package/dist/types/components/contextmenu/ContextMenu.d.ts.map +1 -1
  247. package/dist/types/components/datagrid/DataGrid.d.ts +16 -4
  248. package/dist/types/components/datagrid/DataGrid.d.ts.map +1 -1
  249. package/dist/types/components/datepicker/DatePicker.d.ts +13 -1
  250. package/dist/types/components/datepicker/DatePicker.d.ts.map +1 -1
  251. package/dist/types/components/daterangepicker/DateRangePicker.d.ts +3 -1
  252. package/dist/types/components/daterangepicker/DateRangePicker.d.ts.map +1 -1
  253. package/dist/types/components/dialog/DialogProvider.d.ts +2 -0
  254. package/dist/types/components/dialog/DialogProvider.d.ts.map +1 -0
  255. package/dist/types/components/dialog/dialogStore.d.ts +42 -0
  256. package/dist/types/components/dialog/dialogStore.d.ts.map +1 -0
  257. package/dist/types/components/drawer/Drawer.d.ts +18 -4
  258. package/dist/types/components/drawer/Drawer.d.ts.map +1 -1
  259. package/dist/types/components/dropdown/Dropdown.d.ts +21 -16
  260. package/dist/types/components/dropdown/Dropdown.d.ts.map +1 -1
  261. package/dist/types/components/fileuploader/FileUploader.d.ts +22 -3
  262. package/dist/types/components/fileuploader/FileUploader.d.ts.map +1 -1
  263. package/dist/types/components/hovercard/HoverCard.d.ts +45 -5
  264. package/dist/types/components/hovercard/HoverCard.d.ts.map +1 -1
  265. package/dist/types/components/input/Input.d.ts +20 -10
  266. package/dist/types/components/input/Input.d.ts.map +1 -1
  267. package/dist/types/components/layout/Container.d.ts +8 -4
  268. package/dist/types/components/layout/Container.d.ts.map +1 -1
  269. package/dist/types/components/layout/Flex.d.ts +27 -10
  270. package/dist/types/components/layout/Flex.d.ts.map +1 -1
  271. package/dist/types/components/layout/Grid.d.ts +11 -5
  272. package/dist/types/components/layout/Grid.d.ts.map +1 -1
  273. package/dist/types/components/link/Link.d.ts +22 -0
  274. package/dist/types/components/link/Link.d.ts.map +1 -0
  275. package/dist/types/components/megamenu/MegaMenu.d.ts +8 -11
  276. package/dist/types/components/megamenu/MegaMenu.d.ts.map +1 -1
  277. package/dist/types/components/modal/Modal.d.ts +8 -7
  278. package/dist/types/components/modal/Modal.d.ts.map +1 -1
  279. package/dist/types/components/multiselect/MultiSelect.d.ts +33 -0
  280. package/dist/types/components/multiselect/MultiSelect.d.ts.map +1 -0
  281. package/dist/types/components/nuiprovider/NUIProvider.d.ts +29 -0
  282. package/dist/types/components/nuiprovider/NUIProvider.d.ts.map +1 -0
  283. package/dist/types/components/pagination/Pagination.d.ts +17 -3
  284. package/dist/types/components/pagination/Pagination.d.ts.map +1 -1
  285. package/dist/types/components/popover/Popover.d.ts +54 -16
  286. package/dist/types/components/popover/Popover.d.ts.map +1 -1
  287. package/dist/types/components/progress/Progress.d.ts +17 -7
  288. package/dist/types/components/progress/Progress.d.ts.map +1 -1
  289. package/dist/types/components/radiogroup/RadioGroup.d.ts +15 -10
  290. package/dist/types/components/radiogroup/RadioGroup.d.ts.map +1 -1
  291. package/dist/types/components/rating/Rating.d.ts +24 -10
  292. package/dist/types/components/rating/Rating.d.ts.map +1 -1
  293. package/dist/types/components/resizable/Resizable.d.ts +24 -0
  294. package/dist/types/components/resizable/Resizable.d.ts.map +1 -0
  295. package/dist/types/components/select/Select.d.ts +17 -8
  296. package/dist/types/components/select/Select.d.ts.map +1 -1
  297. package/dist/types/components/skeleton/Skeleton.d.ts +37 -36
  298. package/dist/types/components/skeleton/Skeleton.d.ts.map +1 -1
  299. package/dist/types/components/slider/Slider.d.ts +15 -4
  300. package/dist/types/components/slider/Slider.d.ts.map +1 -1
  301. package/dist/types/components/spinner/Spinner.d.ts +14 -4
  302. package/dist/types/components/spinner/Spinner.d.ts.map +1 -1
  303. package/dist/types/components/stepper/Stepper.d.ts +17 -3
  304. package/dist/types/components/stepper/Stepper.d.ts.map +1 -1
  305. package/dist/types/components/switch/Switch.d.ts +20 -5
  306. package/dist/types/components/switch/Switch.d.ts.map +1 -1
  307. package/dist/types/components/table/Table.d.ts +24 -4
  308. package/dist/types/components/table/Table.d.ts.map +1 -1
  309. package/dist/types/components/tabs/Tabs.d.ts +25 -12
  310. package/dist/types/components/tabs/Tabs.d.ts.map +1 -1
  311. package/dist/types/components/textarea/Textarea.d.ts +8 -5
  312. package/dist/types/components/textarea/Textarea.d.ts.map +1 -1
  313. package/dist/types/components/timepicker/TimePicker.d.ts +26 -0
  314. package/dist/types/components/timepicker/TimePicker.d.ts.map +1 -0
  315. package/dist/types/components/timerangepicker/TimeRangePicker.d.ts +32 -0
  316. package/dist/types/components/timerangepicker/TimeRangePicker.d.ts.map +1 -0
  317. package/dist/types/components/toast/Toast.d.ts +23 -7
  318. package/dist/types/components/toast/Toast.d.ts.map +1 -1
  319. package/dist/types/components/tooltip/Tooltip.d.ts +13 -2
  320. package/dist/types/components/tooltip/Tooltip.d.ts.map +1 -1
  321. package/dist/types/components/treeview/TreeView.d.ts +20 -6
  322. package/dist/types/components/treeview/TreeView.d.ts.map +1 -1
  323. package/dist/types/components/virtuallist/VirtualList.d.ts +12 -16
  324. package/dist/types/components/virtuallist/VirtualList.d.ts.map +1 -1
  325. package/dist/types/index.d.ts +8 -4
  326. package/dist/types/index.d.ts.map +1 -1
  327. package/dist/types/utils/cn/cn.d.ts +19 -0
  328. package/dist/types/utils/cn/cn.d.ts.map +1 -0
  329. package/dist/types/utils/generateid/generateId.d.ts +7 -0
  330. package/dist/types/utils/generateid/generateId.d.ts.map +1 -1
  331. package/dist/types/utils/index.d.ts +2 -0
  332. package/dist/types/utils/index.d.ts.map +1 -1
  333. package/dist/types/utils/inertmanager/inertManager.d.ts +13 -0
  334. package/dist/types/utils/inertmanager/inertManager.d.ts.map +1 -1
  335. package/dist/types/utils/keyboardnav/keyboardNav.d.ts +17 -6
  336. package/dist/types/utils/keyboardnav/keyboardNav.d.ts.map +1 -1
  337. package/dist/types/utils/onclickoutside/onClickOutside.d.ts +9 -1
  338. package/dist/types/utils/onclickoutside/onClickOutside.d.ts.map +1 -1
  339. package/dist/types/utils/portal/portal.d.ts +14 -1
  340. package/dist/types/utils/portal/portal.d.ts.map +1 -1
  341. package/dist/types/utils/restorefocus/restoreFocus.d.ts +8 -4
  342. package/dist/types/utils/restorefocus/restoreFocus.d.ts.map +1 -1
  343. package/dist/types/utils/scrolllock/scrollLock.d.ts +10 -2
  344. package/dist/types/utils/scrolllock/scrollLock.d.ts.map +1 -1
  345. package/dist/types/utils/slot/slot.d.ts +12 -0
  346. package/dist/types/utils/slot/slot.d.ts.map +1 -0
  347. package/dist/types/utils/trapfocus/trapFocus.d.ts +6 -2
  348. package/dist/types/utils/trapfocus/trapFocus.d.ts.map +1 -1
  349. package/dist/utils/cn/cn.cjs +2 -0
  350. package/dist/utils/cn/cn.cjs.map +1 -0
  351. package/dist/utils/cn/cn.js +21 -0
  352. package/dist/utils/cn/cn.js.map +1 -0
  353. package/dist/utils/inertmanager/inertManager.cjs.map +1 -1
  354. package/dist/utils/inertmanager/inertManager.js.map +1 -1
  355. package/dist/utils/onclickoutside/onClickOutside.cjs +1 -1
  356. package/dist/utils/onclickoutside/onClickOutside.cjs.map +1 -1
  357. package/dist/utils/onclickoutside/onClickOutside.js +10 -6
  358. package/dist/utils/onclickoutside/onClickOutside.js.map +1 -1
  359. package/dist/utils/portal/portal.cjs.map +1 -1
  360. package/dist/utils/portal/portal.js.map +1 -1
  361. package/dist/utils/restorefocus/restoreFocus.cjs.map +1 -1
  362. package/dist/utils/restorefocus/restoreFocus.js.map +1 -1
  363. package/dist/utils/scrolllock/scrollLock.cjs.map +1 -1
  364. package/dist/utils/scrolllock/scrollLock.js +7 -0
  365. package/dist/utils/scrolllock/scrollLock.js.map +1 -1
  366. package/dist/utils/slot/slot.cjs +2 -0
  367. package/dist/utils/slot/slot.cjs.map +1 -0
  368. package/dist/utils/slot/slot.js +57 -0
  369. package/dist/utils/slot/slot.js.map +1 -0
  370. package/dist/utils/trapfocus/trapFocus.cjs.map +1 -1
  371. package/dist/utils/trapfocus/trapFocus.js.map +1 -1
  372. package/package.json +49 -6
  373. package/dist/components/layout/HStack.cjs +0 -2
  374. package/dist/components/layout/HStack.cjs.map +0 -1
  375. package/dist/components/layout/HStack.js +0 -9
  376. package/dist/components/layout/HStack.js.map +0 -1
  377. package/dist/components/layout/Stack.cjs +0 -2
  378. package/dist/components/layout/Stack.cjs.map +0 -1
  379. package/dist/components/layout/Stack.js +0 -9
  380. package/dist/components/layout/Stack.js.map +0 -1
  381. package/dist/styles/nui.css +0 -1
  382. package/dist/theme/NUIProvider.cjs +0 -2
  383. package/dist/theme/NUIProvider.cjs.map +0 -1
  384. package/dist/theme/NUIProvider.js +0 -34
  385. package/dist/theme/NUIProvider.js.map +0 -1
  386. package/dist/theme/useTheme.cjs +0 -2
  387. package/dist/theme/useTheme.cjs.map +0 -1
  388. package/dist/theme/useTheme.js +0 -9
  389. package/dist/theme/useTheme.js.map +0 -1
  390. package/dist/types/components/layout/HStack.d.ts +0 -8
  391. package/dist/types/components/layout/HStack.d.ts.map +0 -1
  392. package/dist/types/components/layout/Stack.d.ts +0 -8
  393. package/dist/types/components/layout/Stack.d.ts.map +0 -1
  394. package/dist/types/theme/NUIProvider.d.ts +0 -14
  395. package/dist/types/theme/NUIProvider.d.ts.map +0 -1
  396. package/dist/types/theme/useTheme.d.ts +0 -11
  397. package/dist/types/theme/useTheme.d.ts.map +0 -1
  398. package/dist/utils/generateid/generateId.cjs +0 -2
  399. package/dist/utils/generateid/generateId.cjs.map +0 -1
  400. package/dist/utils/generateid/generateId.js +0 -7
  401. package/dist/utils/generateid/generateId.js.map +0 -1
  402. package/dist/utils/keyboardnav/keyboardNav.cjs +0 -2
  403. package/dist/utils/keyboardnav/keyboardNav.cjs.map +0 -1
  404. package/dist/utils/keyboardnav/keyboardNav.js +0 -10
  405. package/dist/utils/keyboardnav/keyboardNav.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"trapFocus.d.ts","sourceRoot":"","sources":["../../../../src/utils/trapfocus/trapFocus.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,WAAW,cAgC/C"}
1
+ {"version":3,"file":"trapFocus.d.ts","sourceRoot":"","sources":["../../../../src/utils/trapfocus/trapFocus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,WAAW,GAAG,MAAM,IAAI,CAkC5D"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function i(...o){const t=[];for(const e of o)if(e){if(typeof e=="string"||typeof e=="number")t.push(e.toString());else if(Array.isArray(e)){if(e.length){const n=i(...e);n&&t.push(n)}}else if(typeof e=="object")for(const n in e)e[n]&&t.push(n)}return t.join(" ")}exports.cn=i;
2
+ //# sourceMappingURL=cn.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cn.cjs","sources":["../../../src/utils/cn/cn.ts"],"sourcesContent":["/**\n * Represents a dictionary of class names where the key is the class string\n * and the value is a boolean (or nullish) indicating if it should be applied.\n */\ntype ClassDictionary = Record<string, boolean | undefined | null>;\n\n/**\n * A recursive type representing the valid inputs for the cn utility.\n * Accepts strings, numbers, booleans, null/undefined, dictionaries, or an array of these.\n */\nexport type ClassValue = \n | string \n | number \n | boolean \n | undefined \n | null \n | ClassDictionary \n | ClassValue[]; \n\n/**\n * Conditionally joins class names together into a single string.\n * Evaluates objects for truthy values and recursively flattens nested arrays.\n * * @param inputs - A variadic list of class values to evaluate and merge.\n * @returns A space-separated string of the active class names.\n */\nexport function cn(...inputs: ClassValue[]): string {\n const classes: string[] = [];\n\n for (const input of inputs) {\n // 1. Skip falsy values (false, null, undefined, '')\n if (!input) continue;\n\n // 2. Handle flat strings and numbers\n if (typeof input === 'string' || typeof input === 'number') {\n classes.push(input.toString());\n } \n // 3. Handle arrays recursively\n else if (Array.isArray(input)) {\n if (input.length) {\n // Recursive call handles nested arrays (e.g., [['rounded']])\n const inner = cn(...input);\n if (inner) classes.push(inner);\n }\n } \n // 4. Handle object dictionaries\n else if (typeof input === 'object') {\n for (const key in input) {\n // Strict check to satisfy TypeScript\n if (input[key]) {\n classes.push(key);\n }\n }\n }\n }\n\n return classes.join(' ');\n}"],"names":["cn","inputs","classes","input","inner","key"],"mappings":"gFAyBO,SAASA,KAAMC,EAA8B,CAClD,MAAMC,EAAoB,CAAA,EAE1B,UAAWC,KAASF,EAElB,GAAKE,GAGL,GAAI,OAAOA,GAAU,UAAY,OAAOA,GAAU,SAChDD,EAAQ,KAAKC,EAAM,UAAU,UAGtB,MAAM,QAAQA,CAAK,GAC1B,GAAIA,EAAM,OAAQ,CAEhB,MAAMC,EAAQJ,EAAG,GAAGG,CAAK,EACrBC,GAAOF,EAAQ,KAAKE,CAAK,CAC/B,UAGO,OAAOD,GAAU,SACxB,UAAWE,KAAOF,EAEZA,EAAME,CAAG,GACXH,EAAQ,KAAKG,CAAG,EAMxB,OAAOH,EAAQ,KAAK,GAAG,CACzB"}
@@ -0,0 +1,21 @@
1
+ function o(...i) {
2
+ const e = [];
3
+ for (const n of i)
4
+ if (n) {
5
+ if (typeof n == "string" || typeof n == "number")
6
+ e.push(n.toString());
7
+ else if (Array.isArray(n)) {
8
+ if (n.length) {
9
+ const t = o(...n);
10
+ t && e.push(t);
11
+ }
12
+ } else if (typeof n == "object")
13
+ for (const t in n)
14
+ n[t] && e.push(t);
15
+ }
16
+ return e.join(" ");
17
+ }
18
+ export {
19
+ o as cn
20
+ };
21
+ //# sourceMappingURL=cn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cn.js","sources":["../../../src/utils/cn/cn.ts"],"sourcesContent":["/**\n * Represents a dictionary of class names where the key is the class string\n * and the value is a boolean (or nullish) indicating if it should be applied.\n */\ntype ClassDictionary = Record<string, boolean | undefined | null>;\n\n/**\n * A recursive type representing the valid inputs for the cn utility.\n * Accepts strings, numbers, booleans, null/undefined, dictionaries, or an array of these.\n */\nexport type ClassValue = \n | string \n | number \n | boolean \n | undefined \n | null \n | ClassDictionary \n | ClassValue[]; \n\n/**\n * Conditionally joins class names together into a single string.\n * Evaluates objects for truthy values and recursively flattens nested arrays.\n * * @param inputs - A variadic list of class values to evaluate and merge.\n * @returns A space-separated string of the active class names.\n */\nexport function cn(...inputs: ClassValue[]): string {\n const classes: string[] = [];\n\n for (const input of inputs) {\n // 1. Skip falsy values (false, null, undefined, '')\n if (!input) continue;\n\n // 2. Handle flat strings and numbers\n if (typeof input === 'string' || typeof input === 'number') {\n classes.push(input.toString());\n } \n // 3. Handle arrays recursively\n else if (Array.isArray(input)) {\n if (input.length) {\n // Recursive call handles nested arrays (e.g., [['rounded']])\n const inner = cn(...input);\n if (inner) classes.push(inner);\n }\n } \n // 4. Handle object dictionaries\n else if (typeof input === 'object') {\n for (const key in input) {\n // Strict check to satisfy TypeScript\n if (input[key]) {\n classes.push(key);\n }\n }\n }\n }\n\n return classes.join(' ');\n}"],"names":["cn","inputs","classes","input","inner","key"],"mappings":"AAyBO,SAASA,KAAMC,GAA8B;AAClD,QAAMC,IAAoB,CAAA;AAE1B,aAAWC,KAASF;AAElB,QAAKE;AAGL,UAAI,OAAOA,KAAU,YAAY,OAAOA,KAAU;AAChD,QAAAD,EAAQ,KAAKC,EAAM,UAAU;AAAA,eAGtB,MAAM,QAAQA,CAAK;AAC1B,YAAIA,EAAM,QAAQ;AAEhB,gBAAMC,IAAQJ,EAAG,GAAGG,CAAK;AACzB,UAAIC,KAAOF,EAAQ,KAAKE,CAAK;AAAA,QAC/B;AAAA,iBAGO,OAAOD,KAAU;AACxB,mBAAWE,KAAOF;AAEhB,UAAIA,EAAME,CAAG,KACXH,EAAQ,KAAKG,CAAG;AAAA;AAMxB,SAAOH,EAAQ,KAAK,GAAG;AACzB;"}
@@ -1 +1 @@
1
- {"version":3,"file":"inertManager.cjs","sources":["../../../src/utils/inertmanager/inertManager.ts"],"sourcesContent":["/**\r\n * inertManager.ts\r\n * ----------------\r\n * Applies true \"modalization\" to the page:\r\n * - disables ALL siblings of the modal overlay\r\n * - prevents keyboard interaction (inert)\r\n * - prevents screen reader access (aria-hidden)\r\n *\r\n * This is REQUIRED for WCAG-level dialog compliance.\r\n */\r\n\r\nexport function applyInertToSiblings(modalElement: HTMLElement) {\r\n const parent = modalElement.parentElement;\r\n if (!parent) return [];\r\n\r\n const affected: HTMLElement[] = [];\r\n\r\n Array.from(parent.children).forEach((child) => {\r\n if (child !== modalElement && child instanceof HTMLElement) {\r\n child.setAttribute('inert', '');\r\n child.setAttribute('aria-hidden', 'true');\r\n affected.push(child);\r\n }\r\n });\r\n\r\n return affected;\r\n}\r\n\r\nexport function removeInertFromSiblings(elements: HTMLElement[]) {\r\n elements.forEach((el) => {\r\n el.removeAttribute('inert');\r\n el.removeAttribute('aria-hidden');\r\n });\r\n}\r\n"],"names":["applyInertToSiblings","modalElement","parent","affected","child","removeInertFromSiblings","elements","el"],"mappings":"gFAWO,SAASA,EAAqBC,EAA2B,CAC9D,MAAMC,EAASD,EAAa,cAC5B,GAAI,CAACC,EAAQ,MAAO,CAAA,EAEpB,MAAMC,EAA0B,CAAA,EAEhC,aAAM,KAAKD,EAAO,QAAQ,EAAE,QAASE,GAAU,CACzCA,IAAUH,GAAgBG,aAAiB,cAC7CA,EAAM,aAAa,QAAS,EAAE,EAC9BA,EAAM,aAAa,cAAe,MAAM,EACxCD,EAAS,KAAKC,CAAK,EAEvB,CAAC,EAEMD,CACT,CAEO,SAASE,EAAwBC,EAAyB,CAC/DA,EAAS,QAASC,GAAO,CACvBA,EAAG,gBAAgB,OAAO,EAC1BA,EAAG,gBAAgB,aAAa,CAClC,CAAC,CACH"}
1
+ {"version":3,"file":"inertManager.cjs","sources":["../../../src/utils/inertmanager/inertManager.ts"],"sourcesContent":["/**\n * inertManager.ts\n * ----------------\n * Applies true \"modalization\" to the page:\n * - disables ALL siblings of the modal overlay\n * - prevents keyboard interaction (inert)\n * - prevents screen reader access (aria-hidden)\n *\n * This is REQUIRED for WCAG-level dialog compliance.\n */\n\n/**\n * Applies `inert` and `aria-hidden` attributes to all sibling elements of the provided modal.\n * This ensures focus is trapped and the rest of the page is hidden from screen readers.\n *\n * @param modalElement - The modal or overlay HTML element whose siblings should be disabled.\n * @returns An array of the HTMLElements that were modified, which is needed for cleanup.\n */\nexport function applyInertToSiblings(modalElement: HTMLElement): HTMLElement[] {\n const parent = modalElement.parentElement;\n if (!parent) return [];\n\n const affected: HTMLElement[] = [];\n\n Array.from(parent.children).forEach((child) => {\n if (child !== modalElement && child instanceof HTMLElement) {\n child.setAttribute('inert', '');\n child.setAttribute('aria-hidden', 'true');\n affected.push(child);\n }\n });\n\n return affected;\n}\n\n/**\n * Restores previously disabled sibling elements to their normal interactive state\n * by removing the `inert` and `aria-hidden` attributes.\n *\n * @param elements - The array of HTMLElements previously modified by `applyInertToSiblings`.\n */\nexport function removeInertFromSiblings(elements: HTMLElement[]): void {\n elements.forEach((el) => {\n el.removeAttribute('inert');\n el.removeAttribute('aria-hidden');\n });\n}"],"names":["applyInertToSiblings","modalElement","parent","affected","child","removeInertFromSiblings","elements","el"],"mappings":"gFAkBO,SAASA,EAAqBC,EAA0C,CAC7E,MAAMC,EAASD,EAAa,cAC5B,GAAI,CAACC,EAAQ,MAAO,CAAA,EAEpB,MAAMC,EAA0B,CAAA,EAEhC,aAAM,KAAKD,EAAO,QAAQ,EAAE,QAASE,GAAU,CACzCA,IAAUH,GAAgBG,aAAiB,cAC7CA,EAAM,aAAa,QAAS,EAAE,EAC9BA,EAAM,aAAa,cAAe,MAAM,EACxCD,EAAS,KAAKC,CAAK,EAEvB,CAAC,EAEMD,CACT,CAQO,SAASE,EAAwBC,EAA+B,CACrEA,EAAS,QAASC,GAAO,CACvBA,EAAG,gBAAgB,OAAO,EAC1BA,EAAG,gBAAgB,aAAa,CAClC,CAAC,CACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"inertManager.js","sources":["../../../src/utils/inertmanager/inertManager.ts"],"sourcesContent":["/**\r\n * inertManager.ts\r\n * ----------------\r\n * Applies true \"modalization\" to the page:\r\n * - disables ALL siblings of the modal overlay\r\n * - prevents keyboard interaction (inert)\r\n * - prevents screen reader access (aria-hidden)\r\n *\r\n * This is REQUIRED for WCAG-level dialog compliance.\r\n */\r\n\r\nexport function applyInertToSiblings(modalElement: HTMLElement) {\r\n const parent = modalElement.parentElement;\r\n if (!parent) return [];\r\n\r\n const affected: HTMLElement[] = [];\r\n\r\n Array.from(parent.children).forEach((child) => {\r\n if (child !== modalElement && child instanceof HTMLElement) {\r\n child.setAttribute('inert', '');\r\n child.setAttribute('aria-hidden', 'true');\r\n affected.push(child);\r\n }\r\n });\r\n\r\n return affected;\r\n}\r\n\r\nexport function removeInertFromSiblings(elements: HTMLElement[]) {\r\n elements.forEach((el) => {\r\n el.removeAttribute('inert');\r\n el.removeAttribute('aria-hidden');\r\n });\r\n}\r\n"],"names":["applyInertToSiblings","modalElement","parent","affected","child","removeInertFromSiblings","elements","el"],"mappings":"AAWO,SAASA,EAAqBC,GAA2B;AAC9D,QAAMC,IAASD,EAAa;AAC5B,MAAI,CAACC,EAAQ,QAAO,CAAA;AAEpB,QAAMC,IAA0B,CAAA;AAEhC,eAAM,KAAKD,EAAO,QAAQ,EAAE,QAAQ,CAACE,MAAU;AAC7C,IAAIA,MAAUH,KAAgBG,aAAiB,gBAC7CA,EAAM,aAAa,SAAS,EAAE,GAC9BA,EAAM,aAAa,eAAe,MAAM,GACxCD,EAAS,KAAKC,CAAK;AAAA,EAEvB,CAAC,GAEMD;AACT;AAEO,SAASE,EAAwBC,GAAyB;AAC/D,EAAAA,EAAS,QAAQ,CAACC,MAAO;AACvB,IAAAA,EAAG,gBAAgB,OAAO,GAC1BA,EAAG,gBAAgB,aAAa;AAAA,EAClC,CAAC;AACH;"}
1
+ {"version":3,"file":"inertManager.js","sources":["../../../src/utils/inertmanager/inertManager.ts"],"sourcesContent":["/**\n * inertManager.ts\n * ----------------\n * Applies true \"modalization\" to the page:\n * - disables ALL siblings of the modal overlay\n * - prevents keyboard interaction (inert)\n * - prevents screen reader access (aria-hidden)\n *\n * This is REQUIRED for WCAG-level dialog compliance.\n */\n\n/**\n * Applies `inert` and `aria-hidden` attributes to all sibling elements of the provided modal.\n * This ensures focus is trapped and the rest of the page is hidden from screen readers.\n *\n * @param modalElement - The modal or overlay HTML element whose siblings should be disabled.\n * @returns An array of the HTMLElements that were modified, which is needed for cleanup.\n */\nexport function applyInertToSiblings(modalElement: HTMLElement): HTMLElement[] {\n const parent = modalElement.parentElement;\n if (!parent) return [];\n\n const affected: HTMLElement[] = [];\n\n Array.from(parent.children).forEach((child) => {\n if (child !== modalElement && child instanceof HTMLElement) {\n child.setAttribute('inert', '');\n child.setAttribute('aria-hidden', 'true');\n affected.push(child);\n }\n });\n\n return affected;\n}\n\n/**\n * Restores previously disabled sibling elements to their normal interactive state\n * by removing the `inert` and `aria-hidden` attributes.\n *\n * @param elements - The array of HTMLElements previously modified by `applyInertToSiblings`.\n */\nexport function removeInertFromSiblings(elements: HTMLElement[]): void {\n elements.forEach((el) => {\n el.removeAttribute('inert');\n el.removeAttribute('aria-hidden');\n });\n}"],"names":["applyInertToSiblings","modalElement","parent","affected","child","removeInertFromSiblings","elements","el"],"mappings":"AAkBO,SAASA,EAAqBC,GAA0C;AAC7E,QAAMC,IAASD,EAAa;AAC5B,MAAI,CAACC,EAAQ,QAAO,CAAA;AAEpB,QAAMC,IAA0B,CAAA;AAEhC,eAAM,KAAKD,EAAO,QAAQ,EAAE,QAAQ,CAACE,MAAU;AAC7C,IAAIA,MAAUH,KAAgBG,aAAiB,gBAC7CA,EAAM,aAAa,SAAS,EAAE,GAC9BA,EAAM,aAAa,eAAe,MAAM,GACxCD,EAAS,KAAKC,CAAK;AAAA,EAEvB,CAAC,GAEMD;AACT;AAQO,SAASE,EAAwBC,GAA+B;AACrE,EAAAA,EAAS,QAAQ,CAACC,MAAO;AACvB,IAAAA,EAAG,gBAAgB,OAAO,GAC1BA,EAAG,gBAAgB,aAAa;AAAA,EAClC,CAAC;AACH;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function i(n,o){function e(r){const t=n.current;t&&(t.contains(r.target)||o())}return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)}exports.onClickOutside=i;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function s(t,o){function e(n){(Array.isArray(t)?t:[t]).some(i=>{const r=i.current;return r&&r.contains(n.target)})||o(n)}return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}}exports.onClickOutside=s;
2
2
  //# sourceMappingURL=onClickOutside.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"onClickOutside.cjs","sources":["../../../src/utils/onclickoutside/onClickOutside.ts"],"sourcesContent":["/**\r\n * onClickOutside\r\n * ---------------\r\n * Calls `handler` when the user clicks outside the\r\n * referenced element. Used in dropdowns, popovers, etc.\r\n */\r\n\r\n/**\r\n * onClickOutside\r\n * ---------------\r\n * Allows ANY element type (HTMLDivElement, HTMLButtonElement, etc.)\r\n * and supports both RefObject and MutableRefObject.\r\n */\r\n\r\nimport React from 'react';\r\n\r\nexport function onClickOutside<T extends HTMLElement>(\r\n ref: React.RefObject<T | null>,\r\n handler: () => void\r\n) {\r\n function listener(e: MouseEvent) {\r\n const el = ref.current;\r\n if (!el) return;\r\n if (el.contains(e.target as Node)) return;\r\n handler();\r\n }\r\n\r\n document.addEventListener('mousedown', listener);\r\n return () => document.removeEventListener('mousedown', listener);\r\n}\r\n"],"names":["onClickOutside","ref","handler","listener","e","el"],"mappings":"gFAgBO,SAASA,EACdC,EACAC,EACA,CACA,SAASC,EAASC,EAAe,CAC/B,MAAMC,EAAKJ,EAAI,QACVI,IACDA,EAAG,SAASD,EAAE,MAAc,GAChCF,EAAA,EACF,CAEA,gBAAS,iBAAiB,YAAaC,CAAQ,EACxC,IAAM,SAAS,oBAAoB,YAAaA,CAAQ,CACjE"}
1
+ {"version":3,"file":"onClickOutside.cjs","sources":["../../../src/utils/onclickoutside/onClickOutside.ts"],"sourcesContent":["import React from 'react';\n\n/**\n * Executes a callback handler when the user clicks or taps outside of the referenced element(s).\n * Supports both single DOM elements and arrays of elements (useful for complex UI like modals or dropdowns with triggers).\n *\n * @param refs - A single React ref or an array of React refs representing the elements to ignore.\n * @param handler - The callback function to execute when an outside click/tap is detected.\n * @returns A cleanup function that removes the attached event listeners.\n */\nexport function onClickOutside(\n refs: React.RefObject<HTMLElement | null> | Array<React.RefObject<HTMLElement | null>>,\n handler: (e: MouseEvent | TouchEvent) => void\n) {\n function listener(e: MouseEvent | TouchEvent) {\n // Normalize to an array so we can check multiple refs easily\n const refArray = Array.isArray(refs) ? refs : [refs];\n \n // Check if the click target is inside ANY of the provided refs\n const isInsideAny = refArray.some((ref) => {\n const el = ref.current;\n return el && el.contains(e.target as Node);\n });\n\n // If they clicked inside any of our protected refs, do nothing\n if (isInsideAny) return;\n \n // Otherwise, they clicked outside. Fire the handler!\n handler(e);\n }\n\n document.addEventListener('mousedown', listener);\n document.addEventListener('touchstart', listener);\n\n return () => {\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n };\n}"],"names":["onClickOutside","refs","handler","listener","e","ref","el"],"mappings":"gFAUO,SAASA,EACdC,EACAC,EACA,CACA,SAASC,EAASC,EAA4B,EAE3B,MAAM,QAAQH,CAAI,EAAIA,EAAO,CAACA,CAAI,GAGtB,KAAMI,GAAQ,CACzC,MAAMC,EAAKD,EAAI,QACf,OAAOC,GAAMA,EAAG,SAASF,EAAE,MAAc,CAC3C,CAAC,GAMDF,EAAQE,CAAC,CACX,CAEA,gBAAS,iBAAiB,YAAaD,CAAQ,EAC/C,SAAS,iBAAiB,aAAcA,CAAQ,EAEzC,IAAM,CACX,SAAS,oBAAoB,YAAaA,CAAQ,EAClD,SAAS,oBAAoB,aAAcA,CAAQ,CACrD,CACF"}
@@ -1,11 +1,15 @@
1
- function u(t, r) {
2
- function e(o) {
3
- const n = t.current;
4
- n && (n.contains(o.target) || r());
1
+ function c(n, o) {
2
+ function e(t) {
3
+ (Array.isArray(n) ? n : [n]).some((s) => {
4
+ const r = s.current;
5
+ return r && r.contains(t.target);
6
+ }) || o(t);
5
7
  }
6
- return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
8
+ return document.addEventListener("mousedown", e), document.addEventListener("touchstart", e), () => {
9
+ document.removeEventListener("mousedown", e), document.removeEventListener("touchstart", e);
10
+ };
7
11
  }
8
12
  export {
9
- u as onClickOutside
13
+ c as onClickOutside
10
14
  };
11
15
  //# sourceMappingURL=onClickOutside.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"onClickOutside.js","sources":["../../../src/utils/onclickoutside/onClickOutside.ts"],"sourcesContent":["/**\r\n * onClickOutside\r\n * ---------------\r\n * Calls `handler` when the user clicks outside the\r\n * referenced element. Used in dropdowns, popovers, etc.\r\n */\r\n\r\n/**\r\n * onClickOutside\r\n * ---------------\r\n * Allows ANY element type (HTMLDivElement, HTMLButtonElement, etc.)\r\n * and supports both RefObject and MutableRefObject.\r\n */\r\n\r\nimport React from 'react';\r\n\r\nexport function onClickOutside<T extends HTMLElement>(\r\n ref: React.RefObject<T | null>,\r\n handler: () => void\r\n) {\r\n function listener(e: MouseEvent) {\r\n const el = ref.current;\r\n if (!el) return;\r\n if (el.contains(e.target as Node)) return;\r\n handler();\r\n }\r\n\r\n document.addEventListener('mousedown', listener);\r\n return () => document.removeEventListener('mousedown', listener);\r\n}\r\n"],"names":["onClickOutside","ref","handler","listener","e","el"],"mappings":"AAgBO,SAASA,EACdC,GACAC,GACA;AACA,WAASC,EAASC,GAAe;AAC/B,UAAMC,IAAKJ,EAAI;AACf,IAAKI,MACDA,EAAG,SAASD,EAAE,MAAc,KAChCF,EAAA;AAAA,EACF;AAEA,kBAAS,iBAAiB,aAAaC,CAAQ,GACxC,MAAM,SAAS,oBAAoB,aAAaA,CAAQ;AACjE;"}
1
+ {"version":3,"file":"onClickOutside.js","sources":["../../../src/utils/onclickoutside/onClickOutside.ts"],"sourcesContent":["import React from 'react';\n\n/**\n * Executes a callback handler when the user clicks or taps outside of the referenced element(s).\n * Supports both single DOM elements and arrays of elements (useful for complex UI like modals or dropdowns with triggers).\n *\n * @param refs - A single React ref or an array of React refs representing the elements to ignore.\n * @param handler - The callback function to execute when an outside click/tap is detected.\n * @returns A cleanup function that removes the attached event listeners.\n */\nexport function onClickOutside(\n refs: React.RefObject<HTMLElement | null> | Array<React.RefObject<HTMLElement | null>>,\n handler: (e: MouseEvent | TouchEvent) => void\n) {\n function listener(e: MouseEvent | TouchEvent) {\n // Normalize to an array so we can check multiple refs easily\n const refArray = Array.isArray(refs) ? refs : [refs];\n \n // Check if the click target is inside ANY of the provided refs\n const isInsideAny = refArray.some((ref) => {\n const el = ref.current;\n return el && el.contains(e.target as Node);\n });\n\n // If they clicked inside any of our protected refs, do nothing\n if (isInsideAny) return;\n \n // Otherwise, they clicked outside. Fire the handler!\n handler(e);\n }\n\n document.addEventListener('mousedown', listener);\n document.addEventListener('touchstart', listener);\n\n return () => {\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n };\n}"],"names":["onClickOutside","refs","handler","listener","e","ref","el"],"mappings":"AAUO,SAASA,EACdC,GACAC,GACA;AACA,WAASC,EAASC,GAA4B;AAW5C,KATiB,MAAM,QAAQH,CAAI,IAAIA,IAAO,CAACA,CAAI,GAGtB,KAAK,CAACI,MAAQ;AACzC,YAAMC,IAAKD,EAAI;AACf,aAAOC,KAAMA,EAAG,SAASF,EAAE,MAAc;AAAA,IAC3C,CAAC,KAMDF,EAAQE,CAAC;AAAA,EACX;AAEA,kBAAS,iBAAiB,aAAaD,CAAQ,GAC/C,SAAS,iBAAiB,cAAcA,CAAQ,GAEzC,MAAM;AACX,aAAS,oBAAoB,aAAaA,CAAQ,GAClD,SAAS,oBAAoB,cAAcA,CAAQ;AAAA,EACrD;AACF;"}
@@ -1 +1 @@
1
- {"version":3,"file":"portal.cjs","sources":["../../../src/utils/portal/portal.ts"],"sourcesContent":["/**\r\n * Portal\r\n * -------\r\n * Safely renders children into document.body.\r\n * Provides layering support for overlays & modals.\r\n */\r\nimport { createPortal } from 'react-dom';\r\n\r\nexport function Portal({ children }: { children: React.ReactNode }) {\r\n return createPortal(children, document.body);\r\n}\r\n"],"names":["Portal","children","createPortal"],"mappings":"6GAQO,SAASA,EAAO,CAAE,SAAAC,GAA2C,CAClE,OAAOC,eAAaD,EAAU,SAAS,IAAI,CAC7C"}
1
+ {"version":3,"file":"portal.cjs","sources":["../../../src/utils/portal/portal.ts"],"sourcesContent":["import { createPortal } from 'react-dom';\nimport type React from 'react';\n\n/**\n * Portal Component\n * ----------------\n * Safely escapes the current React DOM hierarchy and renders children directly into `document.body`.\n * Essential for building overlays, modals, tooltips, and dropdowns that need to break out of \n * `overflow: hidden` containers and manage global z-index layering.\n * * Note: In SSR environments, the parent consuming this component should ensure it is only \n * rendered on the client (e.g., using a `mounted` state) to prevent hydration errors.\n *\n * @param props.children - The React nodes to be portaled to the document body.\n * @returns A React Portal directly targeting `document.body`.\n */\nexport function Portal({ children }: { children: React.ReactNode }) {\n return createPortal(children, document.body);\n}"],"names":["Portal","children","createPortal"],"mappings":"6GAeO,SAASA,EAAO,CAAE,SAAAC,GAA2C,CAClE,OAAOC,eAAaD,EAAU,SAAS,IAAI,CAC7C"}
@@ -1 +1 @@
1
- {"version":3,"file":"portal.js","sources":["../../../src/utils/portal/portal.ts"],"sourcesContent":["/**\r\n * Portal\r\n * -------\r\n * Safely renders children into document.body.\r\n * Provides layering support for overlays & modals.\r\n */\r\nimport { createPortal } from 'react-dom';\r\n\r\nexport function Portal({ children }: { children: React.ReactNode }) {\r\n return createPortal(children, document.body);\r\n}\r\n"],"names":["Portal","children","createPortal"],"mappings":";AAQO,SAASA,EAAO,EAAE,UAAAC,KAA2C;AAClE,SAAOC,EAAaD,GAAU,SAAS,IAAI;AAC7C;"}
1
+ {"version":3,"file":"portal.js","sources":["../../../src/utils/portal/portal.ts"],"sourcesContent":["import { createPortal } from 'react-dom';\nimport type React from 'react';\n\n/**\n * Portal Component\n * ----------------\n * Safely escapes the current React DOM hierarchy and renders children directly into `document.body`.\n * Essential for building overlays, modals, tooltips, and dropdowns that need to break out of \n * `overflow: hidden` containers and manage global z-index layering.\n * * Note: In SSR environments, the parent consuming this component should ensure it is only \n * rendered on the client (e.g., using a `mounted` state) to prevent hydration errors.\n *\n * @param props.children - The React nodes to be portaled to the document body.\n * @returns A React Portal directly targeting `document.body`.\n */\nexport function Portal({ children }: { children: React.ReactNode }) {\n return createPortal(children, document.body);\n}"],"names":["Portal","children","createPortal"],"mappings":";AAeO,SAASA,EAAO,EAAE,UAAAC,KAA2C;AAClE,SAAOC,EAAaD,GAAU,SAAS,IAAI;AAC7C;"}
@@ -1 +1 @@
1
- {"version":3,"file":"restoreFocus.cjs","sources":["../../../src/utils/restorefocus/restoreFocus.ts"],"sourcesContent":["/**\r\n * restoreFocus\r\n * -------------\r\n * Restores focus to a previously focused element.\r\n * Required for WCAG compliance on modals/dialogs.\r\n */\r\nexport function restoreFocus(element: HTMLElement | null) {\r\n element?.focus();\r\n}\r\n"],"names":["restoreFocus","element"],"mappings":"gFAMO,SAASA,EAAaC,EAA6B,CACxDA,GAAS,MAAA,CACX"}
1
+ {"version":3,"file":"restoreFocus.cjs","sources":["../../../src/utils/restorefocus/restoreFocus.ts"],"sourcesContent":["/**\n * Restores keyboard focus to a previously focused element.\n * --------------------------------------------------------\n * This is a strict WCAG accessibility requirement for modals, dialogs, and popovers.\n * When an overlay closes, the user's focus must be returned to the element \n * that originally triggered the overlay, preventing screen readers and keyboard \n * users from losing their place on the page.\n *\n * @param element - The HTML element to receive focus. Safely ignores `null` or `undefined`.\n */\nexport function restoreFocus(element: HTMLElement | null): void {\n element?.focus();\n}"],"names":["restoreFocus","element"],"mappings":"gFAUO,SAASA,EAAaC,EAAmC,CAC9DA,GAAS,MAAA,CACX"}
@@ -1 +1 @@
1
- {"version":3,"file":"restoreFocus.js","sources":["../../../src/utils/restorefocus/restoreFocus.ts"],"sourcesContent":["/**\r\n * restoreFocus\r\n * -------------\r\n * Restores focus to a previously focused element.\r\n * Required for WCAG compliance on modals/dialogs.\r\n */\r\nexport function restoreFocus(element: HTMLElement | null) {\r\n element?.focus();\r\n}\r\n"],"names":["restoreFocus","element"],"mappings":"AAMO,SAASA,EAAaC,GAA6B;AACxD,EAAAA,GAAS,MAAA;AACX;"}
1
+ {"version":3,"file":"restoreFocus.js","sources":["../../../src/utils/restorefocus/restoreFocus.ts"],"sourcesContent":["/**\n * Restores keyboard focus to a previously focused element.\n * --------------------------------------------------------\n * This is a strict WCAG accessibility requirement for modals, dialogs, and popovers.\n * When an overlay closes, the user's focus must be returned to the element \n * that originally triggered the overlay, preventing screen readers and keyboard \n * users from losing their place on the page.\n *\n * @param element - The HTML element to receive focus. Safely ignores `null` or `undefined`.\n */\nexport function restoreFocus(element: HTMLElement | null): void {\n element?.focus();\n}"],"names":["restoreFocus","element"],"mappings":"AAUO,SAASA,EAAaC,GAAmC;AAC9D,EAAAA,GAAS,MAAA;AACX;"}
@@ -1 +1 @@
1
- {"version":3,"file":"scrollLock.cjs","sources":["../../../src/utils/scrolllock/scrollLock.ts"],"sourcesContent":["/**\r\n * scrollLock\r\n * ----------\r\n * Locks page scrolling while overlays are open.\r\n * Prevents background content movement.\r\n */\r\nexport const scrollLock = {\r\n lock() {\r\n document.body.style.overflow = 'hidden';\r\n },\r\n unlock() {\r\n document.body.style.overflow = '';\r\n },\r\n};\r\n"],"names":["scrollLock"],"mappings":"gFAMO,MAAMA,EAAa,CACxB,MAAO,CACL,SAAS,KAAK,MAAM,SAAW,QACjC,EACA,QAAS,CACP,SAAS,KAAK,MAAM,SAAW,EACjC,CACF"}
1
+ {"version":3,"file":"scrollLock.cjs","sources":["../../../src/utils/scrolllock/scrollLock.ts"],"sourcesContent":["/**\n * scrollLock\n * ----------\n * Utility to temporarily disable document scrolling. \n * Essential for maintaining context when modals, drawers, or fullscreen overlays are open.\n * Prevents the background content from moving while the user interacts with the overlay.\n */\nexport const scrollLock = {\n /**\n * Locks the page scroll by applying `overflow: hidden` directly to the body's inline style.\n */\n lock(): void {\n document.body.style.overflow = 'hidden';\n },\n \n /**\n * Unlocks the page scroll by clearing the inline `overflow` style.\n * This allows the body to fall back to its default state defined in the CSS stylesheets.\n */\n unlock(): void {\n document.body.style.overflow = '';\n },\n};"],"names":["scrollLock"],"mappings":"gFAOO,MAAMA,EAAa,CAIxB,MAAa,CACX,SAAS,KAAK,MAAM,SAAW,QACjC,EAMA,QAAe,CACb,SAAS,KAAK,MAAM,SAAW,EACjC,CACF"}
@@ -1,7 +1,14 @@
1
1
  const o = {
2
+ /**
3
+ * Locks the page scroll by applying `overflow: hidden` directly to the body's inline style.
4
+ */
2
5
  lock() {
3
6
  document.body.style.overflow = "hidden";
4
7
  },
8
+ /**
9
+ * Unlocks the page scroll by clearing the inline `overflow` style.
10
+ * This allows the body to fall back to its default state defined in the CSS stylesheets.
11
+ */
5
12
  unlock() {
6
13
  document.body.style.overflow = "";
7
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scrollLock.js","sources":["../../../src/utils/scrolllock/scrollLock.ts"],"sourcesContent":["/**\r\n * scrollLock\r\n * ----------\r\n * Locks page scrolling while overlays are open.\r\n * Prevents background content movement.\r\n */\r\nexport const scrollLock = {\r\n lock() {\r\n document.body.style.overflow = 'hidden';\r\n },\r\n unlock() {\r\n document.body.style.overflow = '';\r\n },\r\n};\r\n"],"names":["scrollLock"],"mappings":"AAMO,MAAMA,IAAa;AAAA,EACxB,OAAO;AACL,aAAS,KAAK,MAAM,WAAW;AAAA,EACjC;AAAA,EACA,SAAS;AACP,aAAS,KAAK,MAAM,WAAW;AAAA,EACjC;AACF;"}
1
+ {"version":3,"file":"scrollLock.js","sources":["../../../src/utils/scrolllock/scrollLock.ts"],"sourcesContent":["/**\n * scrollLock\n * ----------\n * Utility to temporarily disable document scrolling. \n * Essential for maintaining context when modals, drawers, or fullscreen overlays are open.\n * Prevents the background content from moving while the user interacts with the overlay.\n */\nexport const scrollLock = {\n /**\n * Locks the page scroll by applying `overflow: hidden` directly to the body's inline style.\n */\n lock(): void {\n document.body.style.overflow = 'hidden';\n },\n \n /**\n * Unlocks the page scroll by clearing the inline `overflow` style.\n * This allows the body to fall back to its default state defined in the CSS stylesheets.\n */\n unlock(): void {\n document.body.style.overflow = '';\n },\n};"],"names":["scrollLock"],"mappings":"AAOO,MAAMA,IAAa;AAAA;AAAA;AAAA;AAAA,EAIxB,OAAa;AACX,aAAS,KAAK,MAAM,WAAW;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAe;AACb,aAAS,KAAK,MAAM,WAAW;AAAA,EACjC;AACF;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("react/jsx-runtime"),l=require("react"),m=require("../cn/cn.cjs");function y(...o){return n=>{o.forEach(e=>{typeof e=="function"?e(n):e!=null&&typeof e=="object"&&(e.current=n)})}}function h(o){const n=o.props,e=o;return n.ref||e.ref}function S(o,n){const e={...n};for(const t in n){const r=o[t],s=n[t];/^on[A-Z]/.test(t)?typeof r=="function"&&typeof s=="function"?e[t]=(...c)=>{s(...c),r(...c)}:r&&(e[t]=r):t==="style"?e[t]={...r||{},...s||{}}:t==="className"&&(e[t]=m.cn(r,s))}return{...o,...e}}const a=({children:o})=>u.jsx(u.Fragment,{children:o});a.displayName="Slottable";const f=l.forwardRef((o,n)=>{const{children:e,...t}=o;if(l.isValidElement(e)){const r=h(e),s=e.props,i=S(t,s);return l.cloneElement(e,{...i,ref:n?y(n,r):r})}return l.Children.count(e)>1?l.Children.only(null):null});f.displayName="SlotClone";const d=l.forwardRef((o,n)=>{const{children:e,...t}=o,r=l.Children.toArray(e),s=r.find(i=>l.isValidElement(i)&&i.type===a);if(s){const i=s.props.children,c=r.map(p=>p===s?l.isValidElement(i)?i.props.children:null:p);return u.jsx(f,{...t,ref:n,children:l.isValidElement(i)?l.cloneElement(i,void 0,c):null})}return u.jsx(f,{...t,ref:n,children:e})});d.displayName="Slot";exports.Slot=d;exports.Slottable=a;
2
+ //# sourceMappingURL=slot.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slot.cjs","sources":["../../../src/utils/slot/slot.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../cn/cn';\n\ntype AnyProps = Record<string, unknown>;\n\n/* -------------------------------------------------------------------------------------------------\n * Utility: Compose Refs\n * -----------------------------------------------------------------------------------------------*/\nfunction composeRefs<T>(...refs: (React.Ref<T> | undefined)[]) {\n return (node: T) => {\n refs.forEach((ref) => {\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref != null && typeof ref === 'object') {\n (ref as React.MutableRefObject<T>).current = node;\n }\n });\n };\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Utility: Safely Extract Ref\n * Handles both React 18 (ref on element) and React 19 (ref on props) without using `any`.\n * -----------------------------------------------------------------------------------------------*/\nfunction getElementRef(element: React.ReactElement): React.Ref<HTMLElement> | undefined {\n const props = element.props as { ref?: React.Ref<HTMLElement> };\n const el = element as unknown as { ref?: React.Ref<HTMLElement> };\n return props.ref || el.ref;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Utility: Merge Props\n * -----------------------------------------------------------------------------------------------*/\nfunction mergeProps(slotProps: AnyProps, childProps: AnyProps): AnyProps {\n const overrideProps: AnyProps = { ...childProps };\n\n for (const propName in childProps) {\n const slotPropValue = slotProps[propName];\n const childPropValue = childProps[propName];\n\n const isHandler = /^on[A-Z]/.test(propName);\n\n if (isHandler) {\n if (typeof slotPropValue === 'function' && typeof childPropValue === 'function') {\n overrideProps[propName] = (...args: unknown[]) => {\n childPropValue(...args);\n slotPropValue(...args);\n };\n } else if (slotPropValue) {\n overrideProps[propName] = slotPropValue;\n }\n } else if (propName === 'style') {\n overrideProps[propName] = {\n ...(slotPropValue as React.CSSProperties || {}),\n ...(childPropValue as React.CSSProperties || {}),\n };\n } else if (propName === 'className') {\n overrideProps[propName] = cn(slotPropValue as string, childPropValue as string);\n }\n }\n\n return { ...slotProps, ...overrideProps };\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Slottable\n * -----------------------------------------------------------------------------------------------*/\nexport const Slottable = ({ children }: { children: React.ReactNode }) => {\n return <>{children}</>;\n};\nSlottable.displayName = 'Slottable';\n\n/* -------------------------------------------------------------------------------------------------\n * SlotClone (Internal)\n * -----------------------------------------------------------------------------------------------*/\ninterface SlotCloneProps extends React.HTMLAttributes<HTMLElement> {\n children: React.ReactNode;\n}\n\nconst SlotClone = React.forwardRef<HTMLElement, SlotCloneProps>((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n\n if (React.isValidElement(children)) {\n const childrenRef = getElementRef(children);\n const childProps = children.props as AnyProps;\n const mergedProps = mergeProps(slotProps as AnyProps, childProps);\n\n // Casting the final merged result to React's expected attributes format\n return React.cloneElement(children, {\n ...mergedProps,\n ref: forwardedRef ? composeRefs(forwardedRef, childrenRef) : childrenRef,\n } as React.HTMLAttributes<HTMLElement> & React.RefAttributes<HTMLElement>);\n }\n\n return React.Children.count(children) > 1 ? React.Children.only(null) : null;\n});\nSlotClone.displayName = 'SlotClone';\n\n/* -------------------------------------------------------------------------------------------------\n * Slot (Public)\n * -----------------------------------------------------------------------------------------------*/\nexport interface SlotProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode;\n}\n\nexport const Slot = React.forwardRef<HTMLElement, SlotProps>((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n const childrenArray = React.Children.toArray(children);\n\n // Type Guard: Safely verify this is a Slottable component and extract its strict prop types\n const slottable = childrenArray.find(\n (child): child is React.ReactElement<{ children: React.ReactNode }> =>\n React.isValidElement(child) && child.type === Slottable\n );\n\n if (slottable) {\n // Because of the type guard above, TypeScript now knows slottable.props is safe to access\n const newElement = slottable.props.children;\n\n const newChildren = childrenArray.map((child) => {\n if (child === slottable) {\n // Another safety check before trying to read the Next.js Link's children\n if (React.isValidElement(newElement)) {\n return (newElement.props as { children?: React.ReactNode }).children;\n }\n return null;\n }\n return child;\n });\n\n return (\n <SlotClone {...slotProps} ref={forwardedRef}>\n {React.isValidElement(newElement)\n ? React.cloneElement(newElement, undefined, newChildren)\n : null}\n </SlotClone>\n );\n }\n\n return (\n <SlotClone {...slotProps} ref={forwardedRef}>\n {children}\n </SlotClone>\n );\n});\nSlot.displayName = 'Slot';"],"names":["composeRefs","refs","node","ref","getElementRef","element","props","el","mergeProps","slotProps","childProps","overrideProps","propName","slotPropValue","childPropValue","args","cn","Slottable","children","SlotClone","React","forwardedRef","childrenRef","mergedProps","Slot","childrenArray","slottable","child","newElement","newChildren"],"mappings":"kKAQA,SAASA,KAAkBC,EAAoC,CAC7D,OAAQC,GAAY,CAClBD,EAAK,QAASE,GAAQ,CAChB,OAAOA,GAAQ,WACjBA,EAAID,CAAI,EACCC,GAAO,MAAQ,OAAOA,GAAQ,WACtCA,EAAkC,QAAUD,EAEjD,CAAC,CACH,CACF,CAMA,SAASE,EAAcC,EAAiE,CACtF,MAAMC,EAAQD,EAAQ,MAChBE,EAAKF,EACX,OAAOC,EAAM,KAAOC,EAAG,GACzB,CAKA,SAASC,EAAWC,EAAqBC,EAAgC,CACvE,MAAMC,EAA0B,CAAE,GAAGD,CAAA,EAErC,UAAWE,KAAYF,EAAY,CACjC,MAAMG,EAAgBJ,EAAUG,CAAQ,EAClCE,EAAiBJ,EAAWE,CAAQ,EAExB,WAAW,KAAKA,CAAQ,EAGpC,OAAOC,GAAkB,YAAc,OAAOC,GAAmB,WACnEH,EAAcC,CAAQ,EAAI,IAAIG,IAAoB,CAChDD,EAAe,GAAGC,CAAI,EACtBF,EAAc,GAAGE,CAAI,CACvB,EACSF,IACTF,EAAcC,CAAQ,EAAIC,GAEnBD,IAAa,QACtBD,EAAcC,CAAQ,EAAI,CACxB,GAAIC,GAAwC,CAAA,EAC5C,GAAIC,GAAyC,CAAA,CAAC,EAEvCF,IAAa,cACtBD,EAAcC,CAAQ,EAAII,KAAGH,EAAyBC,CAAwB,EAElF,CAEA,MAAO,CAAE,GAAGL,EAAW,GAAGE,CAAA,CAC5B,CAKO,MAAMM,EAAY,CAAC,CAAE,SAAAC,uBAChB,SAAAA,EAAS,EAErBD,EAAU,YAAc,YASxB,MAAME,EAAYC,EAAM,WAAwC,CAACd,EAAOe,IAAiB,CACvF,KAAM,CAAE,SAAAH,EAAU,GAAGT,CAAA,EAAcH,EAEnC,GAAIc,EAAM,eAAeF,CAAQ,EAAG,CAClC,MAAMI,EAAclB,EAAcc,CAAQ,EACpCR,EAAaQ,EAAS,MACtBK,EAAcf,EAAWC,EAAuBC,CAAU,EAGhE,OAAOU,EAAM,aAAaF,EAAU,CAClC,GAAGK,EACH,IAAKF,EAAerB,EAAYqB,EAAcC,CAAW,EAAIA,CAAA,CACU,CAC3E,CAEA,OAAOF,EAAM,SAAS,MAAMF,CAAQ,EAAI,EAAIE,EAAM,SAAS,KAAK,IAAI,EAAI,IAC1E,CAAC,EACDD,EAAU,YAAc,YASjB,MAAMK,EAAOJ,EAAM,WAAmC,CAACd,EAAOe,IAAiB,CACpF,KAAM,CAAE,SAAAH,EAAU,GAAGT,CAAA,EAAcH,EAC7BmB,EAAgBL,EAAM,SAAS,QAAQF,CAAQ,EAG/CQ,EAAYD,EAAc,KAC7BE,GACCP,EAAM,eAAeO,CAAK,GAAKA,EAAM,OAASV,CAAA,EAGlD,GAAIS,EAAW,CAEb,MAAME,EAAaF,EAAU,MAAM,SAE7BG,EAAcJ,EAAc,IAAKE,GACjCA,IAAUD,EAERN,EAAM,eAAeQ,CAAU,EACzBA,EAAW,MAAyC,SAEvD,KAEFD,CACR,EAED,aACGR,EAAA,CAAW,GAAGV,EAAW,IAAKY,EAC5B,SAAAD,EAAM,eAAeQ,CAAU,EAC5BR,EAAM,aAAaQ,EAAY,OAAWC,CAAW,EACrD,KACN,CAEJ,CAEA,aACGV,EAAA,CAAW,GAAGV,EAAW,IAAKY,EAC5B,SAAAH,EACH,CAEJ,CAAC,EACDM,EAAK,YAAc"}
@@ -0,0 +1,57 @@
1
+ import { jsx as f, Fragment as m } from "react/jsx-runtime";
2
+ import l from "react";
3
+ import { cn as d } from "../cn/cn.js";
4
+ function y(...o) {
5
+ return (n) => {
6
+ o.forEach((e) => {
7
+ typeof e == "function" ? e(n) : e != null && typeof e == "object" && (e.current = n);
8
+ });
9
+ };
10
+ }
11
+ function h(o) {
12
+ const n = o.props, e = o;
13
+ return n.ref || e.ref;
14
+ }
15
+ function E(o, n) {
16
+ const e = { ...n };
17
+ for (const t in n) {
18
+ const r = o[t], s = n[t];
19
+ /^on[A-Z]/.test(t) ? typeof r == "function" && typeof s == "function" ? e[t] = (...c) => {
20
+ s(...c), r(...c);
21
+ } : r && (e[t] = r) : t === "style" ? e[t] = {
22
+ ...r || {},
23
+ ...s || {}
24
+ } : t === "className" && (e[t] = d(r, s));
25
+ }
26
+ return { ...o, ...e };
27
+ }
28
+ const a = ({ children: o }) => /* @__PURE__ */ f(m, { children: o });
29
+ a.displayName = "Slottable";
30
+ const p = l.forwardRef((o, n) => {
31
+ const { children: e, ...t } = o;
32
+ if (l.isValidElement(e)) {
33
+ const r = h(e), s = e.props, i = E(t, s);
34
+ return l.cloneElement(e, {
35
+ ...i,
36
+ ref: n ? y(n, r) : r
37
+ });
38
+ }
39
+ return l.Children.count(e) > 1 ? l.Children.only(null) : null;
40
+ });
41
+ p.displayName = "SlotClone";
42
+ const C = l.forwardRef((o, n) => {
43
+ const { children: e, ...t } = o, r = l.Children.toArray(e), s = r.find(
44
+ (i) => l.isValidElement(i) && i.type === a
45
+ );
46
+ if (s) {
47
+ const i = s.props.children, c = r.map((u) => u === s ? l.isValidElement(i) ? i.props.children : null : u);
48
+ return /* @__PURE__ */ f(p, { ...t, ref: n, children: l.isValidElement(i) ? l.cloneElement(i, void 0, c) : null });
49
+ }
50
+ return /* @__PURE__ */ f(p, { ...t, ref: n, children: e });
51
+ });
52
+ C.displayName = "Slot";
53
+ export {
54
+ C as Slot,
55
+ a as Slottable
56
+ };
57
+ //# sourceMappingURL=slot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slot.js","sources":["../../../src/utils/slot/slot.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../cn/cn';\n\ntype AnyProps = Record<string, unknown>;\n\n/* -------------------------------------------------------------------------------------------------\n * Utility: Compose Refs\n * -----------------------------------------------------------------------------------------------*/\nfunction composeRefs<T>(...refs: (React.Ref<T> | undefined)[]) {\n return (node: T) => {\n refs.forEach((ref) => {\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref != null && typeof ref === 'object') {\n (ref as React.MutableRefObject<T>).current = node;\n }\n });\n };\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Utility: Safely Extract Ref\n * Handles both React 18 (ref on element) and React 19 (ref on props) without using `any`.\n * -----------------------------------------------------------------------------------------------*/\nfunction getElementRef(element: React.ReactElement): React.Ref<HTMLElement> | undefined {\n const props = element.props as { ref?: React.Ref<HTMLElement> };\n const el = element as unknown as { ref?: React.Ref<HTMLElement> };\n return props.ref || el.ref;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Utility: Merge Props\n * -----------------------------------------------------------------------------------------------*/\nfunction mergeProps(slotProps: AnyProps, childProps: AnyProps): AnyProps {\n const overrideProps: AnyProps = { ...childProps };\n\n for (const propName in childProps) {\n const slotPropValue = slotProps[propName];\n const childPropValue = childProps[propName];\n\n const isHandler = /^on[A-Z]/.test(propName);\n\n if (isHandler) {\n if (typeof slotPropValue === 'function' && typeof childPropValue === 'function') {\n overrideProps[propName] = (...args: unknown[]) => {\n childPropValue(...args);\n slotPropValue(...args);\n };\n } else if (slotPropValue) {\n overrideProps[propName] = slotPropValue;\n }\n } else if (propName === 'style') {\n overrideProps[propName] = {\n ...(slotPropValue as React.CSSProperties || {}),\n ...(childPropValue as React.CSSProperties || {}),\n };\n } else if (propName === 'className') {\n overrideProps[propName] = cn(slotPropValue as string, childPropValue as string);\n }\n }\n\n return { ...slotProps, ...overrideProps };\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Slottable\n * -----------------------------------------------------------------------------------------------*/\nexport const Slottable = ({ children }: { children: React.ReactNode }) => {\n return <>{children}</>;\n};\nSlottable.displayName = 'Slottable';\n\n/* -------------------------------------------------------------------------------------------------\n * SlotClone (Internal)\n * -----------------------------------------------------------------------------------------------*/\ninterface SlotCloneProps extends React.HTMLAttributes<HTMLElement> {\n children: React.ReactNode;\n}\n\nconst SlotClone = React.forwardRef<HTMLElement, SlotCloneProps>((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n\n if (React.isValidElement(children)) {\n const childrenRef = getElementRef(children);\n const childProps = children.props as AnyProps;\n const mergedProps = mergeProps(slotProps as AnyProps, childProps);\n\n // Casting the final merged result to React's expected attributes format\n return React.cloneElement(children, {\n ...mergedProps,\n ref: forwardedRef ? composeRefs(forwardedRef, childrenRef) : childrenRef,\n } as React.HTMLAttributes<HTMLElement> & React.RefAttributes<HTMLElement>);\n }\n\n return React.Children.count(children) > 1 ? React.Children.only(null) : null;\n});\nSlotClone.displayName = 'SlotClone';\n\n/* -------------------------------------------------------------------------------------------------\n * Slot (Public)\n * -----------------------------------------------------------------------------------------------*/\nexport interface SlotProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode;\n}\n\nexport const Slot = React.forwardRef<HTMLElement, SlotProps>((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n const childrenArray = React.Children.toArray(children);\n\n // Type Guard: Safely verify this is a Slottable component and extract its strict prop types\n const slottable = childrenArray.find(\n (child): child is React.ReactElement<{ children: React.ReactNode }> =>\n React.isValidElement(child) && child.type === Slottable\n );\n\n if (slottable) {\n // Because of the type guard above, TypeScript now knows slottable.props is safe to access\n const newElement = slottable.props.children;\n\n const newChildren = childrenArray.map((child) => {\n if (child === slottable) {\n // Another safety check before trying to read the Next.js Link's children\n if (React.isValidElement(newElement)) {\n return (newElement.props as { children?: React.ReactNode }).children;\n }\n return null;\n }\n return child;\n });\n\n return (\n <SlotClone {...slotProps} ref={forwardedRef}>\n {React.isValidElement(newElement)\n ? React.cloneElement(newElement, undefined, newChildren)\n : null}\n </SlotClone>\n );\n }\n\n return (\n <SlotClone {...slotProps} ref={forwardedRef}>\n {children}\n </SlotClone>\n );\n});\nSlot.displayName = 'Slot';"],"names":["composeRefs","refs","node","ref","getElementRef","element","props","el","mergeProps","slotProps","childProps","overrideProps","propName","slotPropValue","childPropValue","args","cn","Slottable","children","SlotClone","React","forwardedRef","childrenRef","mergedProps","Slot","childrenArray","slottable","child","newElement","newChildren"],"mappings":";;;AAQA,SAASA,KAAkBC,GAAoC;AAC7D,SAAO,CAACC,MAAY;AAClB,IAAAD,EAAK,QAAQ,CAACE,MAAQ;AACpB,MAAI,OAAOA,KAAQ,aACjBA,EAAID,CAAI,IACCC,KAAO,QAAQ,OAAOA,KAAQ,aACtCA,EAAkC,UAAUD;AAAA,IAEjD,CAAC;AAAA,EACH;AACF;AAMA,SAASE,EAAcC,GAAiE;AACtF,QAAMC,IAAQD,EAAQ,OAChBE,IAAKF;AACX,SAAOC,EAAM,OAAOC,EAAG;AACzB;AAKA,SAASC,EAAWC,GAAqBC,GAAgC;AACvE,QAAMC,IAA0B,EAAE,GAAGD,EAAA;AAErC,aAAWE,KAAYF,GAAY;AACjC,UAAMG,IAAgBJ,EAAUG,CAAQ,GAClCE,IAAiBJ,EAAWE,CAAQ;AAI1C,IAFkB,WAAW,KAAKA,CAAQ,IAGpC,OAAOC,KAAkB,cAAc,OAAOC,KAAmB,aACnEH,EAAcC,CAAQ,IAAI,IAAIG,MAAoB;AAChD,MAAAD,EAAe,GAAGC,CAAI,GACtBF,EAAc,GAAGE,CAAI;AAAA,IACvB,IACSF,MACTF,EAAcC,CAAQ,IAAIC,KAEnBD,MAAa,UACtBD,EAAcC,CAAQ,IAAI;AAAA,MACxB,GAAIC,KAAwC,CAAA;AAAA,MAC5C,GAAIC,KAAyC,CAAA;AAAA,IAAC,IAEvCF,MAAa,gBACtBD,EAAcC,CAAQ,IAAII,EAAGH,GAAyBC,CAAwB;AAAA,EAElF;AAEA,SAAO,EAAE,GAAGL,GAAW,GAAGE,EAAA;AAC5B;AAKO,MAAMM,IAAY,CAAC,EAAE,UAAAC,+BAChB,UAAAA,GAAS;AAErBD,EAAU,cAAc;AASxB,MAAME,IAAYC,EAAM,WAAwC,CAACd,GAAOe,MAAiB;AACvF,QAAM,EAAE,UAAAH,GAAU,GAAGT,EAAA,IAAcH;AAEnC,MAAIc,EAAM,eAAeF,CAAQ,GAAG;AAClC,UAAMI,IAAclB,EAAcc,CAAQ,GACpCR,IAAaQ,EAAS,OACtBK,IAAcf,EAAWC,GAAuBC,CAAU;AAGhE,WAAOU,EAAM,aAAaF,GAAU;AAAA,MAClC,GAAGK;AAAA,MACH,KAAKF,IAAerB,EAAYqB,GAAcC,CAAW,IAAIA;AAAA,IAAA,CACU;AAAA,EAC3E;AAEA,SAAOF,EAAM,SAAS,MAAMF,CAAQ,IAAI,IAAIE,EAAM,SAAS,KAAK,IAAI,IAAI;AAC1E,CAAC;AACDD,EAAU,cAAc;AASjB,MAAMK,IAAOJ,EAAM,WAAmC,CAACd,GAAOe,MAAiB;AACpF,QAAM,EAAE,UAAAH,GAAU,GAAGT,EAAA,IAAcH,GAC7BmB,IAAgBL,EAAM,SAAS,QAAQF,CAAQ,GAG/CQ,IAAYD,EAAc;AAAA,IAC9B,CAACE,MACCP,EAAM,eAAeO,CAAK,KAAKA,EAAM,SAASV;AAAA,EAAA;AAGlD,MAAIS,GAAW;AAEb,UAAME,IAAaF,EAAU,MAAM,UAE7BG,IAAcJ,EAAc,IAAI,CAACE,MACjCA,MAAUD,IAERN,EAAM,eAAeQ,CAAU,IACzBA,EAAW,MAAyC,WAEvD,OAEFD,CACR;AAED,6BACGR,GAAA,EAAW,GAAGV,GAAW,KAAKY,GAC5B,UAAAD,EAAM,eAAeQ,CAAU,IAC5BR,EAAM,aAAaQ,GAAY,QAAWC,CAAW,IACrD,MACN;AAAA,EAEJ;AAEA,2BACGV,GAAA,EAAW,GAAGV,GAAW,KAAKY,GAC5B,UAAAH,GACH;AAEJ,CAAC;AACDM,EAAK,cAAc;"}
@@ -1 +1 @@
1
- {"version":3,"file":"trapFocus.cjs","sources":["../../../src/utils/trapfocus/trapFocus.ts"],"sourcesContent":["/**\r\n * trapFocus\r\n * ---------\r\n * WCAG-compliant focus trap for modals, dialogs, menus.\r\n * Prevents keyboard users from escaping the component.\r\n */\r\nexport function trapFocus(container: HTMLElement) {\r\n const focusable = container.querySelectorAll<HTMLElement>(\r\n `a[href], button:not([disabled]), textarea,\r\n input, select, [tabindex]:not([tabindex=\"-1\"])`\r\n );\r\n\r\n const first = focusable[0];\r\n const last = focusable[focusable.length - 1];\r\n\r\n function handle(e: KeyboardEvent) {\r\n if (e.key !== 'Tab') return;\r\n\r\n // Shift+Tab → Move focus backwards\r\n if (e.shiftKey && document.activeElement === first) {\r\n e.preventDefault();\r\n last.focus();\r\n }\r\n\r\n // Tab → Move focus forward\r\n if (!e.shiftKey && document.activeElement === last) {\r\n e.preventDefault();\r\n first.focus();\r\n }\r\n }\r\n\r\n container.addEventListener('keydown', handle);\r\n\r\n // Initially focus the first element\r\n first?.focus();\r\n\r\n // Cleanup handler on removal\r\n return () => container.removeEventListener('keydown', handle);\r\n}\r\n"],"names":["trapFocus","container","focusable","first","last","handle"],"mappings":"gFAMO,SAASA,EAAUC,EAAwB,CAChD,MAAMC,EAAYD,EAAU,iBAC1B;AAAA,oDAAA,EAIIE,EAAQD,EAAU,CAAC,EACnBE,EAAOF,EAAUA,EAAU,OAAS,CAAC,EAE3C,SAASG,EAAO,EAAkB,CAC5B,EAAE,MAAQ,QAGV,EAAE,UAAY,SAAS,gBAAkBF,IAC3C,EAAE,eAAA,EACFC,EAAK,MAAA,GAIH,CAAC,EAAE,UAAY,SAAS,gBAAkBA,IAC5C,EAAE,eAAA,EACFD,EAAM,MAAA,GAEV,CAEA,OAAAF,EAAU,iBAAiB,UAAWI,CAAM,EAG5CF,GAAO,MAAA,EAGA,IAAMF,EAAU,oBAAoB,UAAWI,CAAM,CAC9D"}
1
+ {"version":3,"file":"trapFocus.cjs","sources":["../../../src/utils/trapfocus/trapFocus.ts"],"sourcesContent":["/**\n * trapFocus\n * ---------\n * A WCAG-compliant focus trap utility for modals, dialogs, and off-canvas menus.\n * Prevents keyboard-only users (and screen readers) from tabbing out of the active \n * component and interacting with background elements.\n *\n * @param container - The DOM element containing the focusable items.\n * @returns A cleanup function to remove the 'keydown' event listener when the container unmounts.\n */\nexport function trapFocus(container: HTMLElement): () => void {\n // Query all standard interactive HTML elements within the container\n const focusable = container.querySelectorAll<HTMLElement>(\n `a[href], button:not([disabled]), textarea,\n input, select, [tabindex]:not([tabindex=\"-1\"])`\n );\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n function handle(e: KeyboardEvent) {\n if (e.key !== 'Tab') return;\n\n // Shift+Tab → If focused on the first element, loop around to the last element\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n }\n\n // Tab → If focused on the last element, loop around to the first element\n if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n\n // Attach the boundary logic\n container.addEventListener('keydown', handle);\n\n // Automatically shift the user's focus into the trap when initialized\n first?.focus();\n\n // Return the cleanup handler\n return () => container.removeEventListener('keydown', handle);\n}"],"names":["trapFocus","container","focusable","first","last","handle"],"mappings":"gFAUO,SAASA,EAAUC,EAAoC,CAE5D,MAAMC,EAAYD,EAAU,iBAC1B;AAAA,oDAAA,EAIIE,EAAQD,EAAU,CAAC,EACnBE,EAAOF,EAAUA,EAAU,OAAS,CAAC,EAE3C,SAASG,EAAO,EAAkB,CAC5B,EAAE,MAAQ,QAGV,EAAE,UAAY,SAAS,gBAAkBF,IAC3C,EAAE,eAAA,EACFC,EAAK,MAAA,GAIH,CAAC,EAAE,UAAY,SAAS,gBAAkBA,IAC5C,EAAE,eAAA,EACFD,EAAM,MAAA,GAEV,CAGA,OAAAF,EAAU,iBAAiB,UAAWI,CAAM,EAG5CF,GAAO,MAAA,EAGA,IAAMF,EAAU,oBAAoB,UAAWI,CAAM,CAC9D"}
@@ -1 +1 @@
1
- {"version":3,"file":"trapFocus.js","sources":["../../../src/utils/trapfocus/trapFocus.ts"],"sourcesContent":["/**\r\n * trapFocus\r\n * ---------\r\n * WCAG-compliant focus trap for modals, dialogs, menus.\r\n * Prevents keyboard users from escaping the component.\r\n */\r\nexport function trapFocus(container: HTMLElement) {\r\n const focusable = container.querySelectorAll<HTMLElement>(\r\n `a[href], button:not([disabled]), textarea,\r\n input, select, [tabindex]:not([tabindex=\"-1\"])`\r\n );\r\n\r\n const first = focusable[0];\r\n const last = focusable[focusable.length - 1];\r\n\r\n function handle(e: KeyboardEvent) {\r\n if (e.key !== 'Tab') return;\r\n\r\n // Shift+Tab → Move focus backwards\r\n if (e.shiftKey && document.activeElement === first) {\r\n e.preventDefault();\r\n last.focus();\r\n }\r\n\r\n // Tab → Move focus forward\r\n if (!e.shiftKey && document.activeElement === last) {\r\n e.preventDefault();\r\n first.focus();\r\n }\r\n }\r\n\r\n container.addEventListener('keydown', handle);\r\n\r\n // Initially focus the first element\r\n first?.focus();\r\n\r\n // Cleanup handler on removal\r\n return () => container.removeEventListener('keydown', handle);\r\n}\r\n"],"names":["trapFocus","container","focusable","first","last","handle"],"mappings":"AAMO,SAASA,EAAUC,GAAwB;AAChD,QAAMC,IAAYD,EAAU;AAAA,IAC1B;AAAA;AAAA,EAAA,GAIIE,IAAQD,EAAU,CAAC,GACnBE,IAAOF,EAAUA,EAAU,SAAS,CAAC;AAE3C,WAASG,EAAO,GAAkB;AAChC,IAAI,EAAE,QAAQ,UAGV,EAAE,YAAY,SAAS,kBAAkBF,MAC3C,EAAE,eAAA,GACFC,EAAK,MAAA,IAIH,CAAC,EAAE,YAAY,SAAS,kBAAkBA,MAC5C,EAAE,eAAA,GACFD,EAAM,MAAA;AAAA,EAEV;AAEA,SAAAF,EAAU,iBAAiB,WAAWI,CAAM,GAG5CF,GAAO,MAAA,GAGA,MAAMF,EAAU,oBAAoB,WAAWI,CAAM;AAC9D;"}
1
+ {"version":3,"file":"trapFocus.js","sources":["../../../src/utils/trapfocus/trapFocus.ts"],"sourcesContent":["/**\n * trapFocus\n * ---------\n * A WCAG-compliant focus trap utility for modals, dialogs, and off-canvas menus.\n * Prevents keyboard-only users (and screen readers) from tabbing out of the active \n * component and interacting with background elements.\n *\n * @param container - The DOM element containing the focusable items.\n * @returns A cleanup function to remove the 'keydown' event listener when the container unmounts.\n */\nexport function trapFocus(container: HTMLElement): () => void {\n // Query all standard interactive HTML elements within the container\n const focusable = container.querySelectorAll<HTMLElement>(\n `a[href], button:not([disabled]), textarea,\n input, select, [tabindex]:not([tabindex=\"-1\"])`\n );\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n function handle(e: KeyboardEvent) {\n if (e.key !== 'Tab') return;\n\n // Shift+Tab → If focused on the first element, loop around to the last element\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n }\n\n // Tab → If focused on the last element, loop around to the first element\n if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n\n // Attach the boundary logic\n container.addEventListener('keydown', handle);\n\n // Automatically shift the user's focus into the trap when initialized\n first?.focus();\n\n // Return the cleanup handler\n return () => container.removeEventListener('keydown', handle);\n}"],"names":["trapFocus","container","focusable","first","last","handle"],"mappings":"AAUO,SAASA,EAAUC,GAAoC;AAE5D,QAAMC,IAAYD,EAAU;AAAA,IAC1B;AAAA;AAAA,EAAA,GAIIE,IAAQD,EAAU,CAAC,GACnBE,IAAOF,EAAUA,EAAU,SAAS,CAAC;AAE3C,WAASG,EAAO,GAAkB;AAChC,IAAI,EAAE,QAAQ,UAGV,EAAE,YAAY,SAAS,kBAAkBF,MAC3C,EAAE,eAAA,GACFC,EAAK,MAAA,IAIH,CAAC,EAAE,YAAY,SAAS,kBAAkBA,MAC5C,EAAE,eAAA,GACFD,EAAM,MAAA;AAAA,EAEV;AAGA,SAAAF,EAAU,iBAAiB,WAAWI,CAAM,GAG5CF,GAAO,MAAA,GAGA,MAAMF,EAAU,oBAAoB,WAAWI,CAAM;AAC9D;"}
package/package.json CHANGED
@@ -1,33 +1,76 @@
1
1
  {
2
2
  "name": "@nofinite/nui",
3
- "version": "1.1.2",
3
+ "version": "2.0.2",
4
4
  "type": "module",
5
+
5
6
  "main": "./dist/index.cjs",
6
7
  "module": "./dist/index.js",
7
8
  "types": "./dist/types/index.d.ts",
9
+
8
10
  "sideEffects": [
9
11
  "**/*.css"
10
12
  ],
13
+
11
14
  "exports": {
12
15
  ".": {
13
16
  "types": "./dist/types/index.d.ts",
14
17
  "import": "./dist/index.js",
15
- "require": "./dist/index.cjs"
18
+ "require": "./dist/index.cjs",
19
+ "default": "./dist/index.js"
16
20
  },
17
- "./nui.css": "./dist/styles/nui.css",
21
+
22
+ "./styles.css": {
23
+ "default": "./dist/index.css"
24
+ },
25
+
26
+ "./components/*": {
27
+ "types": "./dist/types/components/*.d.ts",
28
+ "import": "./dist/components/*.js",
29
+ "require": "./dist/components/*.cjs",
30
+ "default": "./dist/components/*.js"
31
+ },
32
+
33
+ "./utils/*": {
34
+ "types": "./dist/types/utils/*.d.ts",
35
+ "import": "./dist/utils/*.js",
36
+ "require": "./dist/utils/*.cjs",
37
+ "default": "./dist/utils/*.js"
38
+ },
39
+
18
40
  "./package.json": "./package.json"
19
41
  },
42
+
20
43
  "files": [
21
44
  "dist",
22
45
  "README.md",
23
- "LICENSE",
24
- "package.json"
46
+ "LICENSE"
25
47
  ],
48
+
26
49
  "peerDependencies": {
27
50
  "react": ">=18.0.0",
28
51
  "react-dom": ">=18.0.0"
29
52
  },
53
+
54
+ "engines": {
55
+ "node": ">=18"
56
+ },
57
+
58
+ "repository": {
59
+ "type": "git",
60
+ "url": "https://github.com/nofinitehq/nui"
61
+ },
62
+
63
+ "keywords": [
64
+ "nofinite",
65
+ "nui",
66
+ "react",
67
+ "react-components",
68
+ "ui",
69
+ "design-system",
70
+ "component-library"
71
+ ],
72
+
30
73
  "publishConfig": {
31
74
  "access": "public"
32
75
  }
33
- }
76
+ }
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("react/jsx-runtime"),n=require("./Flex.cjs");function o({gap:e=8,children:t,...r}){return i.jsx(n.Flex,{direction:"row",gap:e,...r,children:t})}exports.HStack=o;
2
- //# sourceMappingURL=HStack.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HStack.cjs","sources":["../../../src/components/layout/HStack.tsx"],"sourcesContent":["import React from 'react';\r\nimport { Flex } from './Flex';\r\n\r\ninterface HStackProps extends React.HTMLAttributes<HTMLDivElement> {\r\n gap?: number | string;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport function HStack({ gap = 8, children, ...rest }: HStackProps) {\r\n return (\r\n <Flex direction=\"row\" gap={gap} {...rest}>\r\n {children}\r\n </Flex>\r\n );\r\n}\r\n"],"names":["HStack","gap","children","rest","Flex"],"mappings":"6IAQO,SAASA,EAAO,CAAE,IAAAC,EAAM,EAAG,SAAAC,EAAU,GAAGC,GAAqB,CAClE,aACGC,EAAAA,KAAA,CAAK,UAAU,MAAM,IAAAH,EAAW,GAAGE,EACjC,SAAAD,EACH,CAEJ"}
@@ -1,9 +0,0 @@
1
- import { jsx as i } from "react/jsx-runtime";
2
- import { Flex as e } from "./Flex.js";
3
- function c({ gap: r = 8, children: o, ...t }) {
4
- return /* @__PURE__ */ i(e, { direction: "row", gap: r, ...t, children: o });
5
- }
6
- export {
7
- c as HStack
8
- };
9
- //# sourceMappingURL=HStack.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HStack.js","sources":["../../../src/components/layout/HStack.tsx"],"sourcesContent":["import React from 'react';\r\nimport { Flex } from './Flex';\r\n\r\ninterface HStackProps extends React.HTMLAttributes<HTMLDivElement> {\r\n gap?: number | string;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport function HStack({ gap = 8, children, ...rest }: HStackProps) {\r\n return (\r\n <Flex direction=\"row\" gap={gap} {...rest}>\r\n {children}\r\n </Flex>\r\n );\r\n}\r\n"],"names":["HStack","gap","children","rest","Flex"],"mappings":";;AAQO,SAASA,EAAO,EAAE,KAAAC,IAAM,GAAG,UAAAC,GAAU,GAAGC,KAAqB;AAClE,2BACGC,GAAA,EAAK,WAAU,OAAM,KAAAH,GAAW,GAAGE,GACjC,UAAAD,GACH;AAEJ;"}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),c=require("./Flex.cjs");function i({gap:e=8,children:t,...r}){return n.jsx(c.Flex,{direction:"column",gap:e,...r,children:t})}exports.Stack=i;
2
- //# sourceMappingURL=Stack.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Stack.cjs","sources":["../../../src/components/layout/Stack.tsx"],"sourcesContent":["import React from 'react';\r\nimport { Flex } from './Flex';\r\n\r\ninterface StackProps extends React.HTMLAttributes<HTMLDivElement> {\r\n gap?: number | string;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport function Stack({ gap = 8, children, ...rest }: StackProps) {\r\n return (\r\n <Flex direction=\"column\" gap={gap} {...rest}>\r\n {children}\r\n </Flex>\r\n );\r\n}\r\n"],"names":["Stack","gap","children","rest","Flex"],"mappings":"6IAQO,SAASA,EAAM,CAAE,IAAAC,EAAM,EAAG,SAAAC,EAAU,GAAGC,GAAoB,CAChE,aACGC,EAAAA,KAAA,CAAK,UAAU,SAAS,IAAAH,EAAW,GAAGE,EACpC,SAAAD,EACH,CAEJ"}
@@ -1,9 +0,0 @@
1
- import { jsx as i } from "react/jsx-runtime";
2
- import { Flex as m } from "./Flex.js";
3
- function e({ gap: o = 8, children: r, ...t }) {
4
- return /* @__PURE__ */ i(m, { direction: "column", gap: o, ...t, children: r });
5
- }
6
- export {
7
- e as Stack
8
- };
9
- //# sourceMappingURL=Stack.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Stack.js","sources":["../../../src/components/layout/Stack.tsx"],"sourcesContent":["import React from 'react';\r\nimport { Flex } from './Flex';\r\n\r\ninterface StackProps extends React.HTMLAttributes<HTMLDivElement> {\r\n gap?: number | string;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport function Stack({ gap = 8, children, ...rest }: StackProps) {\r\n return (\r\n <Flex direction=\"column\" gap={gap} {...rest}>\r\n {children}\r\n </Flex>\r\n );\r\n}\r\n"],"names":["Stack","gap","children","rest","Flex"],"mappings":";;AAQO,SAASA,EAAM,EAAE,KAAAC,IAAM,GAAG,UAAAC,GAAU,GAAGC,KAAoB;AAChE,2BACGC,GAAA,EAAK,WAAU,UAAS,KAAAH,GAAW,GAAGE,GACpC,UAAAD,GACH;AAEJ;"}
@@ -1 +0,0 @@
1
- *,:before,:after{box-sizing:border-box;margin:0;padding:0}html{font-family:var(--font-base);background-color:var(--color-bg);color:var(--color-text)}.ui-btn{padding:var(--space-2)var(--space-3);font-family:var(--font-base);background-color:var(--color-bg-secondary);color:var(--color-text);border:1px solid var(--color-border);border-radius:var(--radius-md);cursor:pointer;justify-content:center;align-items:center;font-size:14px;font-weight:500;line-height:1.5;transition:all .2s ease-in-out;display:inline-flex}.ui-btn:hover:not(:disabled){filter:brightness(.9);border-color:#0003}.ui-btn:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-btn:disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.ui-btn--primary{background-color:var(--color-primary);color:#fff;border-color:var(--color-primary)}.ui-btn--sm{padding:var(--space-1)var(--space-2);font-size:13px}.ui-btn--lg{padding:var(--space-3)var(--space-4);font-size:16px}.ui-modal-overlay{z-index:9999;pointer-events:none;place-items:center;display:grid;position:fixed;inset:0}.ui-modal-overlay:before{content:"";-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);pointer-events:auto;background:#00000073;position:absolute;inset:0}.ui-modal-container{z-index:10000;background:var(--color-bg);width:min(90vw,720px);max-height:90vh;color:var(--color-text);border-radius:var(--radius-lg);padding:calc(var(--space-3)*1.5);pointer-events:auto;transform-origin:50%;outline:none;position:relative;overflow-y:auto;box-shadow:0 10px 30px #00000040}.ui-modal-content{margin-top:var(--space-2)}.ui-modal-title{font-size:1.125rem;font-weight:600;line-height:1.2}.ui-modal-description{margin-top:var(--space-1);color:var(--color-text-secondary);font-size:.95rem}.ui-modal-close{top:var(--space-2);right:var(--space-2);cursor:pointer;color:var(--color-text-secondary);background:0 0;border:none;padding:6px;font-size:1.25rem;line-height:1;position:absolute}.ui-modal-close:focus-visible{outline:2px solid var(--color-primary);outline-offset:3px}.ui-modal-overlay-catcher{pointer-events:auto;opacity:0;background:0 0;border:0;position:absolute;inset:0}@media (prefers-reduced-motion:no-preference){.ui-modal-container{animation:ui-modal-in .18s var(--transition-fast)both}@keyframes ui-modal-in{0%{opacity:0;transform:translateY(8px)scale(.985)}to{opacity:1;transform:translateY(0)scale(1)}}}@media (prefers-reduced-motion:reduce){.ui-modal-container{transition:none;animation:none}}.ui-dropdown{display:inline-block}.ui-dropdown-trigger{padding:var(--space-2)var(--space-3);border:1px solid var(--color-border);background:var(--color-bg-secondary);color:var(--color-text);border-radius:var(--radius-md);cursor:pointer;transition:background-color var(--transition-fast)}.ui-dropdown-trigger:hover{background:var(--color-bg)}.ui-dropdown-trigger:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-dropdown-menu-wrapper{z-index:9999;position:absolute}.ui-dropdown-menu{background:var(--color-bg);color:var(--color-text);border:1px solid var(--color-border);border-radius:var(--radius-md);min-width:160px;padding:4px 0;box-shadow:0 4px 20px #0003}.ui-dropdown-item{padding:var(--space-2)var(--space-3);cursor:pointer;white-space:nowrap;-webkit-user-select:none;user-select:none;outline:none}.ui-dropdown-item:hover,.ui-dropdown-item:focus-visible{background-color:var(--color-primary);color:#fff}.ui-input-wrapper{flex-direction:column;gap:4px;width:100%;display:flex}.ui-input-label{color:var(--color-text);font-size:14px;font-weight:500}.ui-input-description{color:var(--color-text-secondary);font-size:12px}.ui-input-error{color:#e11d48;font-size:12px}.ui-input{width:100%;padding:var(--space-2);border:1px solid var(--color-border);background-color:var(--color-bg-secondary);color:var(--color-text);border-radius:var(--radius-md);transition:border-color var(--transition-fast),background var(--transition-fast);font-size:14px}.ui-input:hover{background-color:var(--color-bg)}.ui-input:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-input:disabled{opacity:.6;cursor:not-allowed}.ui-input--error{background:#fee2e2;border-color:#e11d48}.ui-input--error:focus-visible{outline-color:#e11d48}.ui-input--sm{padding:var(--space-1);font-size:13px}.ui-input--lg{padding:var(--space-3);font-size:15px}.ui-tabs{width:100%}.ui-tabs-list{border-bottom:1px solid var(--color-border);gap:8px;display:flex}.ui-tab{padding:var(--space-2)var(--space-3);cursor:pointer;color:var(--color-text-secondary);border-radius:var(--radius-md)var(--radius-md)0 0;transition:color var(--transition-fast),background var(--transition-fast);background:0 0;border:none;font-size:14px}.ui-tab:hover{color:var(--color-text);background:var(--color-bg-secondary)}.ui-tab:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-tab[aria-selected=true]{color:var(--color-text);background:var(--color-bg);border-bottom:2px solid var(--color-primary);font-weight:500}.ui-tabs-panel{padding:var(--space-3);color:var(--color-text)}:root{--tooltip-bg:#1e293b;--tooltip-text:#fff;--tooltip-radius:6px;--tooltip-shadow:0 10px 30px #0003;--tooltip-arrow-size:8px}.ui-tooltip-container{display:inline-flex}.ui-tooltip-bubble{z-index:10000;background:var(--tooltip-bg);max-width:260px;color:var(--tooltip-text);border-radius:var(--tooltip-radius);text-align:center;pointer-events:none;box-shadow:var(--tooltip-shadow);padding:6px 12px;font-size:.75rem;font-weight:500;line-height:1.4;animation:.12s ease-out tooltip-in;transform:translate(-50%)}.ui-tooltip-bubble:before{content:"";width:var(--tooltip-arrow-size);height:var(--tooltip-arrow-size);background:var(--tooltip-bg);position:absolute;left:50%;transform:translate(-50%)rotate(45deg)}.ui-tooltip-bubble[data-placement=top]:before{bottom:-4px}.ui-tooltip-bubble[data-placement=bottom]:before{top:-4px}@keyframes tooltip-in{0%{opacity:0;transform:translate(-50%)scale(.96)}to{opacity:1;transform:translate(-50%)scale(1)}}@media (prefers-reduced-motion:reduce){.ui-tooltip-bubble{animation:none}}.ui-toast-container{z-index:999999;flex-direction:column;gap:12px;display:flex;position:fixed;bottom:20px;right:20px}.ui-toast{background:var(--color-bg);color:var(--color-text);border-left:4px solid var(--color-primary);border-radius:var(--radius-md);justify-content:space-between;align-items:center;min-width:240px;max-width:320px;padding:12px 16px;font-size:14px;animation:.15s ease-out forwards ui-toast-in;display:flex;box-shadow:0 4px 20px #00000026}.ui-toast button{color:var(--color-text-secondary);cursor:pointer;background:0 0;border:none;margin-left:12px;font-size:16px}@keyframes ui-toast-in{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){.ui-toast{animation:none}}.ui-accordion{width:100%}.ui-accordion-item{border-bottom:1px solid var(--color-border)}.ui-accordion-header{padding:var(--space-2)0;cursor:pointer;color:var(--color-text);text-align:left;background:0 0;border:none;justify-content:space-between;align-items:center;width:100%;font-size:15px;display:flex}.ui-accordion-header:hover{opacity:.9}.ui-accordion-header:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-accordion-panel{max-height:0;transition:max-height var(--transition-fast);overflow:hidden}.ui-accordion-panel--open{max-height:500px}@media (prefers-reduced-motion:reduce){.ui-accordion-panel,.ui-accordion-panel--open{max-height:none;transition:none}}.ui-skeleton{background:linear-gradient(90deg,#00000008 0%,#0000000f 50%,#00000008 100%);background-color:var(--skeleton-bg,var(--color-bg-tertiary));color:#0000;border-radius:var(--radius-sm);-webkit-user-select:none;user-select:none;line-height:1;display:inline-block;overflow:hidden}.ui-skeleton--xs{height:8px}.ui-skeleton--sm{height:12px}.ui-skeleton--md{height:16px}.ui-skeleton--lg{height:24px}.ui-skeleton--xl{height:32px}.ui-skeleton--w-100{width:100%}.ui-skeleton--w-75{width:75%}.ui-skeleton--w-50{width:50%}.ui-skeleton--w-25{width:25%}.ui-skeleton--circle{border-radius:50%}@keyframes ui-skeleton-shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}.ui-skeleton--animated{background-size:200% 100%;animation:1.2s linear infinite ui-skeleton-shimmer}@media (prefers-reduced-motion:reduce){.ui-skeleton--animated{animation:none}}.ui-slider{align-items:center;width:100%;height:24px;display:flex;position:relative}.ui-slider-track{background:var(--color-border);border-radius:2px;width:100%;height:4px;position:relative}.ui-slider-fill{background:var(--color-primary);border-radius:2px;height:100%;position:absolute}.ui-slider-thumb{background:var(--color-bg);border:2px solid var(--color-primary);cursor:grab;border-radius:50%;width:16px;height:16px;position:absolute;top:50%;transform:translate(-50%,-50%)}.ui-slider-thumb:active{cursor:grabbing}.ui-slider-thumb:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-slider.disabled{opacity:.5;pointer-events:none}@media (prefers-reduced-motion:reduce){.ui-slider-thumb,.ui-slider-fill{transition:none}}.ui-checkbox-root{cursor:pointer;align-items:center;gap:8px;display:inline-flex}.ui-checkbox-input{appearance:none;border:2px solid var(--color-border);background:var(--color-bg);border-radius:4px;justify-content:center;align-items:center;width:16px;height:16px;transition:background .15s;display:inline-flex}.ui-checkbox-input:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-checkbox-input[data-state=checked],.ui-checkbox-input[data-state=indeterminate]{background:var(--color-primary);border-color:var(--color-primary)}.ui-checkbox-check{color:#fff;pointer-events:none;font-size:12px;line-height:1}.ui-checkbox-label{color:var(--color-text);-webkit-user-select:none;user-select:none}.ui-radio-group{flex-direction:column;gap:8px;display:flex}.ui-radio-item{cursor:pointer;align-items:center;gap:8px;display:flex}.ui-radio-input{appearance:none;border:2px solid var(--color-border);cursor:pointer;border-radius:50%;width:16px;height:16px;position:relative}.ui-radio-input:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-radio-input[data-state=checked]{border-color:var(--color-primary)}.ui-radio-input[data-state=checked]:after{content:"";background:var(--color-primary);border-radius:50%;width:8px;height:8px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.ui-radio-label{color:var(--color-text);-webkit-user-select:none;user-select:none}.ui-switch-root{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:8px;display:inline-flex}.ui-switch-control{background:var(--color-border);width:44px;height:24px;transition:background var(--transition-fast),box-shadow var(--transition-fast);border-radius:9999px;flex:none;position:relative}.ui-switch-thumb{background:var(--color-bg);width:16px;height:16px;transition:transform var(--transition-fast),background var(--transition-fast);border-radius:50%;position:absolute;top:50%;left:4px;transform:translateY(-50%);box-shadow:0 1px 2px #0000001f}.ui-switch-control[data-state=on]{background:var(--color-primary);box-shadow:0 4px 12px #0000001f}.ui-switch-control[data-state=on] .ui-switch-thumb{transform:translate(20px,-50%)}.ui-switch-control:focus-visible{outline:2px solid var(--color-primary);outline-offset:3px}.ui-switch-root[aria-disabled=true]{opacity:.6;cursor:not-allowed}.ui-switch-label{color:var(--color-text)}:root,[data-theme=light]{--ui-bg:#fff;--ui-surface:#fafafa;--ui-bg-hover:#f2f2f2;--ui-border:#0000001f;--ui-shadow:#00000014;--ui-text:#111;--ui-text-muted:#666;--ui-primary:#007aff;--ui-primary-hover:#0062d6;--ui-primary-contrast:#fff}[data-theme=dark]{--ui-bg:#111112;--ui-surface:#1c1c1e;--ui-bg-hover:#2a2a2d;--ui-border:#ffffff24;--ui-shadow:#0009;--ui-text:#f5f5f5;--ui-text-muted:#b6b6b6;--ui-primary:#3b82f6;--ui-primary-hover:#2968cc;--ui-primary-contrast:#fff}.ui-datepicker{font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial}.ui-datepicker-input{text-align:left;border:1px solid var(--ui-border);background:var(--ui-bg);width:230px;color:var(--ui-text);cursor:pointer;box-shadow:0 1px 3px var(--ui-shadow);border-radius:10px;padding:8px 12px;font-size:14px}.ui-datepicker-popover{z-index:99999}.ui-datepicker-panel{background:var(--ui-bg);border:1px solid var(--ui-border);width:300px;color:var(--ui-text);box-shadow:0 8px 25px var(--ui-shadow);border-radius:12px;padding:12px}.ui-header-row{justify-content:space-between;align-items:center;display:flex}.ui-arrow{cursor:pointer;color:var(--ui-text);background:0 0;border:none;border-radius:8px;padding:6px 8px;font-size:20px}.ui-arrow:hover{background:var(--ui-bg-hover)}.ui-header-center{cursor:pointer;color:var(--ui-text);background:0 0;border:none;border-radius:8px;padding:6px 10px;font-size:14px;font-weight:600}.ui-header-center:hover{background:var(--ui-bg-hover)}.ui-ym-panel{flex-direction:column;gap:12px;margin:10px 0;display:flex}.ui-year-grid{grid-template-columns:repeat(4,1fr);gap:6px;max-height:160px;padding-right:4px;display:grid;overflow-y:auto}.ui-year-item{background:var(--ui-surface);color:var(--ui-text);cursor:pointer;border:none;border-radius:8px;padding:8px 0;font-size:13px}.ui-year-item:hover:not(.selected){background:var(--ui-bg-hover)}.ui-year-item.selected{background:linear-gradient(180deg,var(--ui-primary),var(--ui-primary-hover));color:var(--ui-primary-contrast);box-shadow:0 3px 12px var(--ui-shadow)}.ui-month-grid{grid-template-columns:repeat(3,1fr);gap:6px;display:grid}.ui-month-item{background:var(--ui-surface);cursor:pointer;color:var(--ui-text);border:none;border-radius:8px;padding:8px 0;font-size:13px}.ui-month-item:hover:not(.selected){background:var(--ui-bg-hover)}.ui-month-item.selected{background:linear-gradient(180deg,var(--ui-primary),var(--ui-primary-hover));color:var(--ui-primary-contrast);box-shadow:0 3px 12px var(--ui-shadow)}.ui-month-item.disabled{opacity:.45;cursor:not-allowed}.ui-calendar{flex-direction:column;gap:6px;display:flex}.ui-weekdays{text-align:center;color:var(--ui-text-muted);grid-template-columns:repeat(7,1fr);font-size:12px;display:grid}.ui-days-grid{grid-template-columns:repeat(7,1fr);gap:6px;display:grid}.ui-day,.ui-day-empty{cursor:pointer;width:36px;height:36px;color:var(--ui-text);background:0 0;border:none;border-radius:8px;font-size:14px}.ui-day:hover:not(.selected){background:var(--ui-bg-hover)}.ui-day.selected{background:linear-gradient(180deg,var(--ui-primary),var(--ui-primary-hover));color:var(--ui-primary-contrast);box-shadow:0 4px 12px var(--ui-shadow)}.ui-footer{justify-content:flex-end;margin-top:10px;display:flex}.ui-footer button{background:var(--ui-surface);cursor:pointer;color:var(--ui-text);border:none;border-radius:8px;padding:6px 12px}.ui-footer button:hover{background:var(--ui-bg-hover)}.ui-daterange-picker{align-items:center;gap:8px;font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial;display:inline-flex}.drp-trigger{background:var(--ui-bg);color:var(--ui-text);border:1px solid var(--ui-border);cursor:pointer;border-radius:10px;min-width:220px;padding:8px 12px}.drp-actions{gap:6px;display:inline-flex}.drp-part{background:var(--ui-surface);cursor:pointer;color:var(--ui-text);border:none;border-radius:8px;padding:6px 8px}.drp-part.active{background:linear-gradient(180deg,var(--ui-primary),var(--ui-primary-hover));color:var(--ui-primary-contrast);box-shadow:0 3px 10px var(--ui-shadow)}.drp-popover{z-index:99999}.drp-panel{background:var(--ui-bg);border:1px solid var(--ui-border);width:360px;box-shadow:0 8px 30px var(--ui-shadow);color:var(--ui-text);border-radius:12px;padding:12px}.drp-header{justify-content:space-between;align-items:center;display:flex}.drp-arrow{cursor:pointer;color:var(--ui-text);background:0 0;border:none;padding:6px;font-size:18px}.drp-arrow:hover{background:var(--ui-bg-hover);border-radius:6px}.drp-title{cursor:pointer;color:var(--ui-text);background:0 0;border:none;border-radius:8px;padding:6px 8px;font-weight:600}.drp-title:hover{background:var(--ui-bg-hover)}.drp-ym{flex-direction:column;gap:12px;margin:8px 0;display:flex}.drp-year-grid{grid-template-columns:repeat(4,1fr);gap:6px;max-height:160px;display:grid;overflow-y:auto}.drp-year{background:var(--ui-surface);cursor:pointer;border:none;border-radius:8px;padding:8px 0}.drp-year:hover:not(.selected){background:var(--ui-bg-hover)}.drp-year.selected{background:linear-gradient(180deg,var(--ui-primary),var(--ui-primary-hover));color:var(--ui-primary-contrast);box-shadow:0 4px 14px var(--ui-shadow)}.drp-month-grid{grid-template-columns:repeat(3,1fr);gap:6px;display:grid}.drp-month{background:var(--ui-surface);cursor:pointer;border:none;border-radius:8px;padding:8px 0}.drp-month.disabled{opacity:.4;cursor:not-allowed}.drp-month:hover:not(.selected):not(.disabled){background:var(--ui-bg-hover)}.drp-month.selected{background:linear-gradient(180deg,var(--ui-primary),var(--ui-primary-hover));color:var(--ui-primary-contrast);box-shadow:0 4px 14px var(--ui-shadow)}.drp-calendar{margin-top:8px}.drp-weekdays{color:var(--ui-text-muted);grid-template-columns:repeat(7,1fr);gap:6px;font-size:12px;display:grid}.drp-days{grid-template-columns:repeat(7,1fr);gap:6px;display:grid}.drp-day,.drp-day-empty{cursor:pointer;width:40px;height:40px;color:var(--ui-text);background:0 0;border:none;border-radius:8px;justify-content:center;align-items:center;font-size:14px;display:flex}.drp-day:hover:not(.disabled):not(.start):not(.end){background:var(--ui-bg-hover)}.drp-day.start,.drp-day.end{background:linear-gradient(180deg,var(--ui-primary),var(--ui-primary-hover));color:var(--ui-primary-contrast);box-shadow:0 5px 16px var(--ui-shadow)}.drp-day.between{background:#0000000d}[data-theme=dark] .drp-day.between{background:#ffffff12}.drp-day.dragging{background:#648cff33;border-radius:8px}.drp-day.dragging:not(.start):not(.end){box-shadow:inset 0 0 0 1.5px var(--ui-primary)}.drp-day.disabled{opacity:.4;cursor:not-allowed}.drp-footer{justify-content:flex-end;gap:8px;margin-top:12px;display:flex}.drp-footer button{cursor:pointer;color:var(--ui-text);background:var(--ui-surface);border:none;border-radius:8px;padding:6px 12px;font-size:13px}.drp-footer button:hover{background:var(--ui-bg-hover)}.drp-clear{color:var(--ui-text-muted)!important;background:0 0!important}.drp-clear:hover{background:var(--ui-bg-hover)!important}.ui-drawer-overlay{z-index:99999;opacity:0;background:#00000073;transition:opacity .25s;display:block;position:fixed;inset:0}.ui-drawer-overlay.open{opacity:1}.ui-drawer{background:var(--color-bg);color:var(--color-text);will-change:transform;flex-direction:column;transition:transform .3s;display:flex;position:absolute;box-shadow:0 0 20px #0003}.ui-drawer.left{width:320px;top:0;bottom:0;transform:translate(-100%)}.ui-drawer.right{width:320px;top:0;bottom:0;right:0;transform:translate(100%)}.ui-drawer.top{height:260px;left:0;right:0;transform:translateY(-100%)}.ui-drawer.bottom{height:280px;bottom:0;left:0;right:0;transform:translateY(100%)}.ui-drawer.open.left,.ui-drawer.open.right{transform:translate(0)}.ui-drawer.open.top,.ui-drawer.open.bottom{transform:translateY(0)}@media (prefers-reduced-motion:reduce){.ui-drawer,.ui-drawer-overlay{transition:none}}.ui-card{background:var(--color-bg);color:var(--color-text);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:var(--space-3);box-shadow:var(--shadow-sm);transition:box-shadow .15s,transform .15s}.ui-card--hover:hover{box-shadow:var(--shadow-md)}.ui-card--clickable{cursor:pointer}.ui-card--clickable:active{transform:scale(.98)}.ui-card-header{margin-bottom:var(--space-2);font-size:16px;font-weight:600}.ui-card-body{font-size:14px;line-height:1.5}.ui-card-footer{margin-top:var(--space-3);gap:var(--space-2);display:flex}.ui-card-divider{background:var(--color-border);height:1px;margin:var(--space-3)0}.ui-alert{align-items:flex-start;gap:var(--space-2);padding:var(--space-3);border-radius:var(--radius-md);border:1px solid var(--color-border);background:var(--color-bg-secondary);color:var(--color-text);font-size:14px;display:flex}.ui-alert--info{border-color:var(--color-primary);background:var(--color-primary-bg);color:var(--color-primary-text)}.ui-alert--success{border-color:var(--color-success);background:var(--color-success-bg);color:var(--color-success-text)}.ui-alert--warning{border-color:var(--color-warning);background:var(--color-warning-bg);color:var(--color-warning-text)}.ui-alert--error{border-color:var(--color-danger);background:var(--color-danger-bg);color:var(--color-danger-text)}.ui-alert-title{margin-bottom:4px;font-weight:600}.ui-alert-content{flex:1}.ui-alert-close{cursor:pointer;color:inherit;background:0 0;border:none;margin-left:auto;font-size:18px;line-height:1}.ui-alert-close:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-table-container{width:100%;overflow-x:auto}.ui-table{border-collapse:collapse;width:100%;font-size:14px}.ui-table th,.ui-table td{padding:var(--space-2)var(--space-3);border-bottom:1px solid var(--color-border);text-align:left;white-space:nowrap}.ui-table th{background:var(--color-bg-secondary);color:var(--color-text);font-weight:600}.ui-table-row:hover{background:var(--color-bg-hover)}.ui-table-sort-button{cursor:pointer;font:inherit;background:0 0;border:none;align-items:center;gap:4px;display:inline-flex}.ui-table-sort-indicator{opacity:.6;font-size:10px}.ui-table-sort-indicator.active{opacity:1}.ui-table-empty{text-align:center;padding:var(--space-4);color:var(--color-text-secondary)}@media (prefers-reduced-motion:reduce){.ui-table-row{transition:none}}.sr-only{clip:rect(1px,1px,1px,1px);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;position:absolute!important}.ui-badge{font-family:var(--font-base);border-radius:var(--radius-md);border:1px solid var(--color-border);background:var(--color-bg-secondary);color:var(--color-text);white-space:nowrap;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;gap:4px;padding:4px 8px;font-size:13px;font-weight:600;line-height:1;display:inline-flex}.ui-badge--sm{padding:2px 6px;font-size:12px}.ui-badge--md{padding:4px 8px;font-size:13px}.ui-badge--lg{padding:6px 10px;font-size:14px}.ui-badge--pill{border-radius:9999px}.ui-badge--dot{border-radius:9999px;width:10px;min-width:10px;height:10px;padding:0}.ui-badge--default{background:var(--color-bg-secondary);color:var(--color-text);border-color:var(--color-border)}.ui-badge--primary{background:var(--color-primary);color:#fff;border-color:var(--color-primary)}.ui-badge--success{background:var(--color-success,#10b981);color:#fff;border-color:var(--color-success,#10b981)}.ui-badge--warning{background:var(--color-warning,#f59e0b);color:#000;border-color:var(--color-warning,#f59e0b)}.ui-badge--danger{background:var(--color-danger,#ef4444);color:#fff;border-color:var(--color-danger,#ef4444)}.ui-badge--interactive{cursor:pointer}.ui-badge--interactive:active{transform:translateY(1px)}@media (prefers-reduced-motion:reduce){.ui-badge--interactive:active{transform:none}}.ui-badge__icon{line-height:0;display:inline-flex}.ui-badge-group{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.ui-avatar{background:var(--color-bg-secondary);color:var(--color-text);-webkit-user-select:none;user-select:none;border-radius:50%;justify-content:center;align-items:center;font-weight:600;display:inline-flex;position:relative;overflow:hidden}.ui-avatar--circle{border-radius:50%}.ui-avatar--rounded{border-radius:var(--radius-md)}.ui-avatar--square{border-radius:0}.ui-avatar--sm{width:28px;height:28px;font-size:12px}.ui-avatar--md{width:40px;height:40px;font-size:14px}.ui-avatar--lg{width:56px;height:56px;font-size:18px}.ui-avatar--xl{width:72px;height:72px;font-size:24px}.ui-avatar img{object-fit:cover;width:100%;height:100%}.ui-avatar-status{border:2px solid var(--color-bg);background:gray;border-radius:50%;width:10px;height:10px;position:absolute;bottom:0;right:0}.ui-avatar-status--online{background:var(--color-success,#22c55e)}.ui-avatar-status--offline{background:var(--color-border)}.ui-avatar-status--busy{background:var(--color-danger,#ef4444)}.ui-avatar-loading{background:var(--color-bg-tertiary);animation:1.4s infinite avatarPulse}@keyframes avatarPulse{0%{opacity:.6}50%{opacity:.3}to{opacity:.6}}.ui-avatar-group{align-items:center;display:flex}.ui-avatar-group .ui-avatar{border:2px solid var(--color-bg);margin-left:-8px}.ui-avatar-group .ui-avatar:first-child{margin-left:0}.ui-avatar-group-overflow{background:var(--color-border);color:var(--color-text);justify-content:center;align-items:center;display:inline-flex!important}.ui-select{min-width:200px;font-family:var(--font-base);display:inline-block;position:relative}.ui-select-trigger{width:100%;padding:var(--space-2);border:1px solid var(--color-border);background:var(--color-bg-secondary);color:var(--color-text);border-radius:var(--radius-md);cursor:pointer;justify-content:space-between;align-items:center;display:flex}.ui-select-trigger:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-select-placeholder{color:var(--color-text-secondary)}.ui-select-listbox{z-index:99999;background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-md);min-width:200px;max-height:320px;position:fixed;overflow:auto;box-shadow:0 8px 24px #0000001f}.ui-select-option{padding:var(--space-2);cursor:pointer;-webkit-user-select:none;user-select:none}.ui-select-option[aria-selected=true]{background:var(--color-primary);color:#fff}.ui-select-option[aria-disabled=true]{opacity:.5;cursor:not-allowed}.ui-select-option:hover,.ui-select-option:focus-visible{background:var(--color-bg-secondary)}.ui-select-chevron{opacity:.8;margin-left:8px}.ui-combobox{width:100%;position:relative}.ui-combobox-input{border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg);width:100%;color:var(--color-text);padding:8px 10px;font-size:14px}.ui-combobox-input:focus{outline:2px solid var(--color-primary);outline-offset:2px}.ui-combobox-listbox{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-md);width:100%;max-height:240px;box-shadow:var(--shadow-md);z-index:2000;position:absolute;top:calc(100% + 4px);left:0;overflow-y:auto}.ui-combobox-option{cursor:pointer;padding:8px 10px}.ui-combobox-option[aria-selected=true],.ui-combobox-option.active{background:var(--color-bg-hover)}.ui-combobox-empty{color:var(--color-text-secondary);padding:8px 10px;font-style:italic}.ui-combobox-input-wrapper{width:100%;position:relative}.ui-combobox-left-icon{pointer-events:none;opacity:.7;align-items:center;display:flex;position:absolute;top:50%;left:8px;transform:translateY(-50%)}.ui-combobox-right-icon{opacity:.7;align-items:center;display:flex;position:absolute;top:50%;right:8px;transform:translateY(-50%)}.ui-combobox-input.has-left-icon{padding-left:32px}.ui-combobox-input.has-right-icon{padding-right:32px}.ui-combobox-option-icon{opacity:.85;margin-right:8px;display:inline-flex}.ui-megamenu{position:relative}.ui-megamenu-trigger{cursor:pointer;color:var(--color-text);background:0 0;border:none;align-items:center;gap:6px;font-size:15px;display:flex}.ui-megamenu-panel{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);z-index:1000;min-width:320px;display:none;position:absolute;top:100%;left:0;box-shadow:0 4px 20px #0000001f}.ui-megamenu-panel--open{display:block}.ui-megamenu-grid{gap:var(--space-3);grid-template-columns:repeat(2,minmax(140px,1fr));display:grid}.ui-megamenu-item{flex-direction:column;gap:4px;display:flex}.ui-megamenu-item-title{color:var(--color-text);font-weight:600}.ui-megamenu-item-desc{color:var(--color-text-secondary);font-size:13px}.ui-textarea-wrapper{width:100%;font-family:var(--font-base);display:block;position:relative}.ui-textarea{box-sizing:border-box;width:100%;padding:calc(var(--space-2))calc(var(--space-3));border-radius:var(--radius-md);border:1px solid var(--color-border);background:var(--color-bg-secondary);color:var(--color-text);resize:none;min-height:calc(var(--space-6));transition:border-color var(--transition-fast),box-shadow var(--transition-fast);font-size:14px;line-height:1.45;overflow:hidden!important}.ui-textarea:focus{border-color:var(--color-primary);box-shadow:0 0 0 3px #3b82f614}.ui-textarea:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-textarea:disabled{opacity:.6;cursor:not-allowed;background:var(--color-bg)}.ui-textarea--error{border-color:#e63600;box-shadow:0 0 0 3px #ef44440f}.ui-textarea-counter{color:var(--color-text-secondary);text-align:right;-webkit-user-select:none;user-select:none;margin-top:6px;font-size:12px}@media (prefers-reduced-motion:reduce){.ui-textarea,.ui-textarea:focus,.ui-textarea:disabled{transition:none}}:root{--popover-bg:#fff;--popover-border:#e2e8f0;--popover-text:#1e293b;--popover-radius:8px;--popover-shadow:0 4px 6px -1px #0000001a,0 2px 4px -1px #0000000f;--arrow-size:12px;--arrow-offset:6px}.ui-popover-root{display:inline-block;position:relative}.ui-popover-trigger{appearance:none;cursor:pointer;background:0 0;border:none;padding:0;display:inline-flex}.ui-popover-trigger:focus-visible{outline-offset:2px;border-radius:4px;outline:2px solid #3b82f6}.ui-popover-content{z-index:9999;background-color:var(--popover-bg);min-width:200px;max-width:320px;color:var(--popover-text);border:1px solid var(--popover-border);border-radius:var(--popover-radius);box-shadow:none;filter:drop-shadow(0 4px 6px #0000001a);padding:16px;animation:.2s cubic-bezier(.16,1,.3,1) forwards popover-scale-in;position:absolute}.ui-popover-content:before{content:"";width:var(--arrow-size);height:var(--arrow-size);background-color:var(--popover-bg);border:1px solid var(--popover-border);z-index:1;border-radius:2px;position:absolute;transform:rotate(45deg)}.ui-popover-bottom{margin-top:10px;transform:translate(-50%)}.ui-popover-bottom:before{top:calc(var(--arrow-offset)*-1);margin-left:calc(var(--arrow-offset)*-1);border-bottom-color:#0000;border-right-color:#0000;left:50%}.ui-popover-top{margin-top:-10px;transform:translate(-50%)translateY(-100%)}.ui-popover-top:before{bottom:calc(var(--arrow-offset)*-1);margin-left:calc(var(--arrow-offset)*-1);border-top-color:#0000;border-left-color:#0000;left:50%}.ui-popover-left{margin-left:-10px;transform:translateY(-50%)translate(-100%)}.ui-popover-left:before{right:calc(var(--arrow-offset)*-1);margin-top:calc(var(--arrow-offset)*-1);border-bottom-color:#0000;border-left-color:#0000;top:50%}.ui-popover-right{margin-left:10px;transform:translateY(-50%)}.ui-popover-right:before{left:calc(var(--arrow-offset)*-1);margin-top:calc(var(--arrow-offset)*-1);border-top-color:#0000;border-right-color:#0000;top:50%}.ui-popover-close{text-align:center;color:#475569;border:1px solid var(--popover-border);cursor:pointer;background-color:#f8fafc;border-radius:4px;width:100%;margin-top:12px;padding:8px 12px;font-size:.875rem;font-weight:500;transition:background-color .2s;display:block}.ui-popover-close:hover{color:#1e293b;background-color:#f1f5f9}.ui-popover-close:focus-visible{outline-offset:2px;outline:2px solid #3b82f6}@keyframes popover-scale-in{0%{opacity:0;transform:translate(var(--tw-translate-x),var(--tw-translate-y))scale(.95)}to{opacity:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y))scale(1)}}.ui-popover-bottom{--tw-translate-x:-50%;--tw-translate-y:0}.ui-popover-top{--tw-translate-x:-50%;--tw-translate-y:-100%}.ui-popover-left{--tw-translate-x:-100%;--tw-translate-y:-50%}.ui-popover-right{--tw-translate-x:0;--tw-translate-y:-50%}@media (prefers-reduced-motion:reduce){.ui-popover-content{transition:opacity .2s;animation:none}}.ui-pagination{font-family:var(--font-base);align-items:center;gap:6px;display:flex}.ui-page-btn{border-radius:var(--radius-md);border:1px solid var(--color-border);background:var(--color-bg-secondary);min-width:32px;height:32px;color:var(--color-text);cursor:pointer;transition:background var(--transition-fast);padding:0 8px}.ui-page-btn:hover:not(:disabled){background:var(--color-bg)}.ui-page-btn:disabled{opacity:.5;cursor:not-allowed}.ui-page-btn.active{background:var(--color-primary);color:#fff;border-color:var(--color-primary)}.ui-page-ellipsis{opacity:.6;-webkit-user-select:none;user-select:none;padding:0 4px}.ui-breadcrumbs{font-family:var(--font-base);color:var(--color-text)}.ui-breadcrumbs-list{align-items:center;gap:4px;list-style:none;display:flex}.ui-breadcrumb-item{align-items:center;gap:4px;display:flex}.ui-breadcrumb-link{color:var(--color-text-secondary);transition:color var(--transition-fast);font-size:14px;text-decoration:none}.ui-breadcrumb-link:hover{color:var(--color-text)}.ui-breadcrumb-link.active,.ui-breadcrumb-link[aria-current=page]{color:var(--color-text);font-weight:500}.ui-breadcrumb-separator{color:var(--color-text-secondary);-webkit-user-select:none;user-select:none}.ui-breadcrumb-ellipsis{color:var(--color-text-secondary);-webkit-user-select:none;user-select:none;font-size:14px}.ui-progress{background:var(--color-bg-secondary);border-radius:var(--radius-md);width:100%;height:8px;position:relative;overflow:hidden}.ui-progress-bar{background:var(--color-primary);border-radius:inherit;height:100%;transition:width .25s}.ui-progress-bar.indeterminate{width:30%;animation:1.2s linear infinite ui-progress-indeterminate;position:absolute;left:-30%}@keyframes ui-progress-indeterminate{0%{left:-30%}50%{left:50%}to{left:100%}}.ui-spinner{justify-content:center;align-items:center;display:inline-flex}.ui-spinner--sm{width:16px;height:16px}.ui-spinner--md{width:24px;height:24px}.ui-spinner--lg{width:36px;height:36px}.ui-spinner-circle{border:3px solid var(--color-border);border-top-color:var(--color-primary);border-radius:50%;width:100%;height:100%;animation:.7s linear infinite ui-spin}@keyframes ui-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.ui-stepper{width:100%;font-family:var(--font-base)}.ui-stepper-list{align-items:center;gap:12px;padding:0;list-style:none;display:flex}.ui-stepper-item{align-items:center;gap:12px;display:flex}.ui-stepper-button{cursor:pointer;text-align:center;background:0 0;border:none;flex-direction:column;align-items:center;gap:4px;padding:0;display:flex}.ui-stepper-circle{border:2px solid var(--color-border);background:var(--color-bg-secondary);width:28px;height:28px;color:var(--color-text);transition:all var(--transition-fast);border-radius:50%;justify-content:center;align-items:center;font-size:13px;font-weight:500;display:flex}.ui-stepper-item.active .ui-stepper-circle{border-color:var(--color-primary);background:var(--color-primary);color:#fff}.ui-stepper-item.completed .ui-stepper-circle{background:var(--color-primary);border-color:var(--color-primary);color:#fff}.ui-stepper-label{color:var(--color-text-secondary);transition:color var(--transition-fast);font-size:12px}.ui-stepper-item.active .ui-stepper-label{color:var(--color-text)}.ui-stepper-line{background:var(--color-border);flex-grow:1;height:2px}.ui-stepper-item.completed+.ui-stepper-line,.ui-stepper-item.active+.ui-stepper-line{background:var(--color-primary)}.ui-chip{border-radius:var(--radius-lg);background:var(--color-bg-secondary);border:1px solid var(--color-border);color:var(--color-text);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast);align-items:center;gap:6px;padding:4px 10px;font-size:14px;display:inline-flex}.ui-chip:hover{background:var(--color-bg)}.ui-chip.selected{background:var(--color-primary);border-color:var(--color-primary);color:#fff}.ui-chip--sm{padding:3px 8px;font-size:12px}.ui-chip--md{padding:4px 10px;font-size:14px}.ui-chip-icon-left,.ui-chip-icon-right{opacity:.8;align-items:center;display:inline-flex}.ui-chip-remove{color:inherit;cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;margin-left:2px;font-size:14px;display:inline-flex}.ui-chip-remove:hover{opacity:.7}.ui-chip:focus-visible{outline:2px solid var(--color-primary);outline-offset:3px}.ui-rating{cursor:pointer;color:var(--color-text-secondary);font-family:var(--font-base);gap:4px;display:inline-flex}.ui-rating:focus-visible{outline:2px solid var(--color-primary);outline-offset:4px}.ui-rating--sm{font-size:16px}.ui-rating--md{font-size:20px}.ui-rating--lg{font-size:28px}.ui-rating-item{-webkit-user-select:none;user-select:none;transition:color var(--transition-fast),transform var(--transition-fast)}.ui-rating-item.filled{color:var(--color-primary)}.ui-rating-item:hover{transform:scale(1.1)}.ui-hovercard-root{display:inline-block}.ui-hovercard-trigger{display:inline-flex}.ui-hovercard{z-index:99999;background:var(--color-bg);color:var(--color-text);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);animation:.12s ease-out ui-hovercard-fade;position:fixed;box-shadow:0 8px 24px #00000024}@keyframes ui-hovercard-fade{0%{opacity:0;transform:translateY(-3px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){.ui-hovercard{animation:none}}.ui-fileupload{font-family:var(--font-base);flex-direction:column;gap:10px;display:flex}.ui-fileupload-dropzone{border:2px dashed var(--color-border);background:var(--color-bg-secondary);border-radius:var(--radius-md);text-align:center;color:var(--color-text-secondary);cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast);padding:20px}.ui-fileupload-dropzone:hover{border-color:var(--color-primary);background:var(--color-bg)}.ui-fileupload-dropzone.dragover{border-color:var(--color-primary);background:var(--color-bg);color:var(--color-primary)}.ui-fileupload-list{flex-direction:column;gap:4px;margin:0;padding:0;list-style:none;display:flex}.ui-fileupload-item{background:var(--color-bg-secondary);padding:var(--space-2);border-radius:var(--radius-md);border:1px solid var(--color-border);justify-content:space-between;align-items:center;display:flex}.ui-fileupload-filename{color:var(--color-text);word-break:break-all}.ui-fileupload-remove{color:var(--color-text-secondary);cursor:pointer;background:0 0;border:none;padding:0 4px;font-size:18px}.ui-fileupload-remove:hover{color:var(--color-primary)}.ui-fileupload-dropzone:focus-visible{outline:2px solid var(--color-primary);outline-offset:4px}.ui-contextmenu-wrapper{display:inline-block}.ui-contextmenu{z-index:99999;background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-md);min-width:180px;font-family:var(--font-base);padding:4px 0;animation:80ms ease-out ui-menu-fade;position:fixed;box-shadow:0 8px 24px #00000026}@keyframes ui-menu-fade{0%{opacity:0;transform:scale(.98)}to{opacity:1;transform:scale(1)}}.ui-contextmenu-separator{background:var(--color-border);height:1px;margin:4px 0}.ui-contextmenu-item{padding:var(--space-2)var(--space-3);cursor:pointer;color:var(--color-text);white-space:nowrap;align-items:center;gap:8px;display:flex}.ui-contextmenu-item:hover,.ui-contextmenu-item.active{background:var(--color-bg-secondary)}.ui-contextmenu-item.disabled{opacity:.5;cursor:not-allowed}.ui-contextmenu-item.danger{color:#dc2626}.ui-contextmenu-icon{opacity:.8}.ui-cmd-overlay{z-index:99998;background:#0006;position:fixed;inset:0}.ui-cmd{background:var(--color-bg);width:520px;max-height:70vh;color:var(--color-text);border-radius:var(--radius-lg);border:1px solid var(--color-border);z-index:99999;flex-direction:column;animation:.12s ui-cmd-fade;display:flex;position:fixed;top:15%;left:50%;overflow:hidden;transform:translate(-50%);box-shadow:0 20px 40px #00000040}@keyframes ui-cmd-fade{0%{opacity:0;transform:translate(-50%,-8px)}to{opacity:1;transform:translate(-50%)}}.ui-cmd-input{width:100%;padding:var(--space-3);border:none;border-bottom:1px solid var(--color-border);background:var(--color-bg);color:var(--color-text);font-size:16px}.ui-cmd-input:focus{outline:none}.ui-cmd-list{max-height:60vh;overflow-y:auto}.ui-cmd-section-title{padding:var(--space-2)var(--space-3);opacity:.7;font-size:12px}.ui-cmd-item{padding:var(--space-2)var(--space-3);cursor:pointer;transition:background var(--transition-fast);align-items:center;gap:10px;display:flex}.ui-cmd-item.active,.ui-cmd-item:hover{background:var(--color-bg-secondary)}.ui-cmd-icon{opacity:.85;font-size:18px}.ui-cmd-meta{flex:1}.ui-cmd-description{opacity:.6;font-size:12px}.ui-cmd-shortcut{opacity:.7;font-size:12px}.ui-cmd-empty{padding:var(--space-3);text-align:center;opacity:.7}.ui-treeview{font-family:var(--font-base);color:var(--color-text);-webkit-user-select:none;user-select:none;width:100%}.ui-tree-node{cursor:pointer;border-radius:var(--radius-sm);transition:background var(--transition-fast);align-items:center;gap:6px;padding:4px 6px;display:flex}.ui-tree-node:hover{background:var(--color-bg-secondary)}.ui-tree-node.selected{background:var(--color-primary);color:#fff}.ui-tree-node.active{outline:2px solid var(--color-primary);outline-offset:2px}.ui-tree-arrow{opacity:.8;font-size:10px;transition:transform .15s;display:inline-block}.ui-tree-arrow.open{transform:rotate(90deg)}.ui-tree-arrow.empty{opacity:0;width:10px}.ui-tree-icon{opacity:.9}.ui-tree-label{font-size:14px}.ui-datagrid{font-family:var(--font-base);color:var(--color-text);background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-md);outline:none;display:block;overflow:hidden}.ui-datagrid-table{display:block}.ui-datagrid-header{background:var(--color-bg);border-bottom:1px solid var(--color-border);z-index:10;grid-auto-flow:column;align-items:center;gap:0;padding:8px 0;display:grid;position:sticky;top:0}.ui-datagrid-cell{box-sizing:border-box;align-items:center;min-width:80px;padding:10px 12px;display:flex}.ui-datagrid-cell--header{background:var(--color-bg);cursor:default;-webkit-user-select:none;user-select:none;font-size:13px;font-weight:600}.ui-datagrid-cell--header .ui-datagrid-header-content{align-items:center;gap:8px;display:inline-flex}.ui-datagrid-cell--left{text-align:left;justify-content:flex-start}.ui-datagrid-cell--center{text-align:center;justify-content:center}.ui-datagrid-cell--right{text-align:right;justify-content:flex-end}.ui-datagrid-cell--select{justify-content:center;width:48px}.ui-datagrid-cell--actions{justify-content:center;width:64px}.ui-datagrid-cell--header[aria-sort=ascending],.ui-datagrid-cell--header[aria-sort=descending]{color:var(--color-text)}.ui-datagrid-sort-indicator{opacity:.8;font-size:12px}.ui-datagrid-body{max-height:420px;display:block;overflow:auto}.ui-datagrid-row{border-bottom:1px solid var(--color-bg-muted,transparent);transition:background var(--transition-fast);background:0 0;grid-auto-flow:column;align-items:center;gap:0;display:grid}.ui-datagrid-row .ui-datagrid-cell{background:0 0;padding:10px 12px;font-size:14px}.ui-datagrid-row:hover{background:var(--color-bg-secondary)}.ui-datagrid-row.focused{outline:2px solid var(--color-primary);outline-offset:-2px}.ui-datagrid-row.selected{background:#3b82f614}.ui-datagrid-empty{text-align:center;color:var(--color-text-secondary);padding:20px}.ui-datagrid-footer{border-top:1px solid var(--color-border);background:var(--color-bg);justify-content:flex-end;align-items:center;gap:8px;padding:8px;display:flex}.ui-datagrid-page-btn{border-radius:var(--radius-sm);border:1px solid var(--color-border);background:var(--color-bg-secondary);cursor:pointer;padding:6px 10px}.ui-datagrid-page-btn:disabled{opacity:.5;cursor:not-allowed}.ui-datagrid-page-info{color:var(--color-text-secondary);padding:4px 8px;font-size:13px}@media (max-width:720px){.ui-datagrid-cell{min-width:60px;padding:8px;font-size:13px}.ui-datagrid-body{max-height:320px}}.ui-virtual-list{will-change:transform;background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-md);width:100%;position:relative;overflow:hidden auto}.ui-virtual-spacer{pointer-events:none;width:100%}.ui-virtual-items{width:100%;position:absolute;top:0;left:0}.ui-virtual-row{border-bottom:1px solid var(--color-border);background:var(--color-bg);color:var(--color-text);white-space:nowrap;align-items:center;padding:0 12px;font-size:14px;display:flex}.ui-virtual-row:hover{background:var(--color-bg-secondary)}:root{--color-bg:#fff;--color-bg-secondary:#f6f6f7;--color-text:#111;--color-text-secondary:#666;--color-border:#dcdcdc;--color-primary:#3b82f6;--radius-sm:4px;--radius-md:6px;--radius-lg:10px;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--transition-fast:.15s ease;--transition-medium:.25s ease;--font-base:system-ui,Arial,sans-serif}[data-theme=dark]{--color-bg:#0d0d0f;--color-bg-secondary:#151518;--color-text:#fff;--color-text-secondary:#aaa;--color-border:#2a2a2f;--color-primary:#60a5fa}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("react/jsx-runtime"),s=require("react");;/* empty css */const h=()=>{throw new Error("setTheme used outside of <UIProvider>")},i=s.createContext({theme:"system",resolved:"light",setTheme:h});function l({defaultTheme:o="system",children:m}){const[t,c]=s.useState(o),[a,u]=s.useState("light"),n=e=>{const r=e==="system"?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":e;document.documentElement.setAttribute("data-theme",r),u(r)};return s.useLayoutEffect(()=>{const e=localStorage.getItem("ui-theme");e?(c(e),n(e)):(c(o),n(o))},[o]),s.useEffect(()=>{localStorage.setItem("ui-theme",t),n(t)},[t]),s.useEffect(()=>{if(t!=="system")return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>n("system");return e.addEventListener("change",r),()=>e.removeEventListener("change",r)},[t]),d.jsx(i.Provider,{value:{theme:t,resolved:a,setTheme:c},children:m})}exports.NUIProvider=l;exports.ThemeContext=i;
2
- //# sourceMappingURL=NUIProvider.cjs.map