@nofinite/nui 1.1.2 → 2.0.0

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.

Potentially problematic release.


This version of @nofinite/nui might be problematic. Click here for more details.

Files changed (739) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +61 -48
  3. package/dist/CHANGELOG.md +8 -0
  4. package/dist/LICENSE +201 -0
  5. package/dist/README.md +48 -0
  6. package/dist/components/accordion/Accordion.cjs +1 -1
  7. package/dist/components/accordion/Accordion.cjs.map +1 -1
  8. package/dist/components/accordion/Accordion.js +64 -43
  9. package/dist/components/accordion/Accordion.js.map +1 -1
  10. package/dist/components/alert/Alert.cjs +1 -1
  11. package/dist/components/alert/Alert.cjs.map +1 -1
  12. package/dist/components/alert/Alert.js +39 -25
  13. package/dist/components/alert/Alert.js.map +1 -1
  14. package/dist/components/avatar/Avatar.cjs +1 -1
  15. package/dist/components/avatar/Avatar.cjs.map +1 -1
  16. package/dist/components/avatar/Avatar.js +58 -44
  17. package/dist/components/avatar/Avatar.js.map +1 -1
  18. package/dist/components/avatar/AvatarGroup.cjs +1 -1
  19. package/dist/components/avatar/AvatarGroup.cjs.map +1 -1
  20. package/dist/components/avatar/AvatarGroup.js +34 -25
  21. package/dist/components/avatar/AvatarGroup.js.map +1 -1
  22. package/dist/components/badge/Badge.cjs +1 -1
  23. package/dist/components/badge/Badge.cjs.map +1 -1
  24. package/dist/components/badge/Badge.js +43 -68
  25. package/dist/components/badge/Badge.js.map +1 -1
  26. package/dist/components/badge/BadgeGroup.cjs +1 -1
  27. package/dist/components/badge/BadgeGroup.cjs.map +1 -1
  28. package/dist/components/badge/BadgeGroup.js +20 -10
  29. package/dist/components/badge/BadgeGroup.js.map +1 -1
  30. package/dist/components/breadcrumbs/Breadcrumbs.cjs +1 -1
  31. package/dist/components/breadcrumbs/Breadcrumbs.cjs.map +1 -1
  32. package/dist/components/breadcrumbs/Breadcrumbs.js +59 -39
  33. package/dist/components/breadcrumbs/Breadcrumbs.js.map +1 -1
  34. package/dist/components/button/Button.cjs +1 -1
  35. package/dist/components/button/Button.cjs.map +1 -1
  36. package/dist/components/button/Button.js +52 -17
  37. package/dist/components/button/Button.js.map +1 -1
  38. package/dist/components/card/Card.cjs +1 -1
  39. package/dist/components/card/Card.cjs.map +1 -1
  40. package/dist/components/card/Card.js +44 -41
  41. package/dist/components/card/Card.js.map +1 -1
  42. package/dist/components/checkbox/Checkbox.cjs +1 -1
  43. package/dist/components/checkbox/Checkbox.cjs.map +1 -1
  44. package/dist/components/checkbox/Checkbox.js +59 -40
  45. package/dist/components/checkbox/Checkbox.js.map +1 -1
  46. package/dist/components/chip/Chip.cjs +1 -1
  47. package/dist/components/chip/Chip.cjs.map +1 -1
  48. package/dist/components/chip/Chip.js +67 -47
  49. package/dist/components/chip/Chip.js.map +1 -1
  50. package/dist/components/combobox/Combobox.cjs +1 -1
  51. package/dist/components/combobox/Combobox.cjs.map +1 -1
  52. package/dist/components/combobox/Combobox.js +123 -108
  53. package/dist/components/combobox/Combobox.js.map +1 -1
  54. package/dist/components/commandpalette/CommandPalette.cjs +1 -1
  55. package/dist/components/commandpalette/CommandPalette.cjs.map +1 -1
  56. package/dist/components/commandpalette/CommandPalette.js +96 -73
  57. package/dist/components/commandpalette/CommandPalette.js.map +1 -1
  58. package/dist/components/contextmenu/ContextMenu.cjs +1 -1
  59. package/dist/components/contextmenu/ContextMenu.cjs.map +1 -1
  60. package/dist/components/contextmenu/ContextMenu.js +79 -58
  61. package/dist/components/contextmenu/ContextMenu.js.map +1 -1
  62. package/dist/components/datagrid/DataGrid.cjs +1 -1
  63. package/dist/components/datagrid/DataGrid.cjs.map +1 -1
  64. package/dist/components/datagrid/DataGrid.js +184 -202
  65. package/dist/components/datagrid/DataGrid.js.map +1 -1
  66. package/dist/components/datepicker/DatePicker.cjs +1 -1
  67. package/dist/components/datepicker/DatePicker.cjs.map +1 -1
  68. package/dist/components/datepicker/DatePicker.js +197 -164
  69. package/dist/components/datepicker/DatePicker.js.map +1 -1
  70. package/dist/components/daterangepicker/DateRangePicker.cjs +1 -1
  71. package/dist/components/daterangepicker/DateRangePicker.cjs.map +1 -1
  72. package/dist/components/daterangepicker/DateRangePicker.js +254 -213
  73. package/dist/components/daterangepicker/DateRangePicker.js.map +1 -1
  74. package/dist/components/dialog/DialogProvider.cjs +2 -0
  75. package/dist/components/dialog/DialogProvider.cjs.map +1 -0
  76. package/dist/components/dialog/DialogProvider.js +71 -0
  77. package/dist/components/dialog/DialogProvider.js.map +1 -0
  78. package/dist/components/dialog/dialogStore.cjs +2 -0
  79. package/dist/components/dialog/dialogStore.cjs.map +1 -0
  80. package/dist/components/dialog/dialogStore.js +60 -0
  81. package/dist/components/dialog/dialogStore.js.map +1 -0
  82. package/dist/components/drawer/Drawer.cjs +1 -1
  83. package/dist/components/drawer/Drawer.cjs.map +1 -1
  84. package/dist/components/drawer/Drawer.js +69 -47
  85. package/dist/components/drawer/Drawer.js.map +1 -1
  86. package/dist/components/dropdown/Dropdown.cjs +1 -1
  87. package/dist/components/dropdown/Dropdown.cjs.map +1 -1
  88. package/dist/components/dropdown/Dropdown.js +134 -108
  89. package/dist/components/dropdown/Dropdown.js.map +1 -1
  90. package/dist/components/fileuploader/FileUploader.cjs +1 -1
  91. package/dist/components/fileuploader/FileUploader.cjs.map +1 -1
  92. package/dist/components/fileuploader/FileUploader.js +96 -61
  93. package/dist/components/fileuploader/FileUploader.js.map +1 -1
  94. package/dist/components/hovercard/HoverCard.cjs +1 -1
  95. package/dist/components/hovercard/HoverCard.cjs.map +1 -1
  96. package/dist/components/hovercard/HoverCard.js +124 -69
  97. package/dist/components/hovercard/HoverCard.js.map +1 -1
  98. package/dist/components/input/Input.cjs +1 -1
  99. package/dist/components/input/Input.cjs.map +1 -1
  100. package/dist/components/input/Input.js +62 -37
  101. package/dist/components/input/Input.js.map +1 -1
  102. package/dist/components/layout/Container.cjs +1 -1
  103. package/dist/components/layout/Container.cjs.map +1 -1
  104. package/dist/components/layout/Container.js +21 -30
  105. package/dist/components/layout/Container.js.map +1 -1
  106. package/dist/components/layout/Flex.cjs +1 -1
  107. package/dist/components/layout/Flex.cjs.map +1 -1
  108. package/dist/components/layout/Flex.js +36 -19
  109. package/dist/components/layout/Flex.js.map +1 -1
  110. package/dist/components/layout/Grid.cjs +1 -1
  111. package/dist/components/layout/Grid.cjs.map +1 -1
  112. package/dist/components/layout/Grid.js +30 -18
  113. package/dist/components/layout/Grid.js.map +1 -1
  114. package/dist/components/link/Link.cjs +2 -0
  115. package/dist/components/link/Link.cjs.map +1 -0
  116. package/dist/components/link/Link.js +41 -0
  117. package/dist/components/link/Link.js.map +1 -0
  118. package/dist/components/megamenu/MegaMenu.cjs +1 -1
  119. package/dist/components/megamenu/MegaMenu.cjs.map +1 -1
  120. package/dist/components/megamenu/MegaMenu.js +107 -38
  121. package/dist/components/megamenu/MegaMenu.js.map +1 -1
  122. package/dist/components/modal/Modal.cjs +1 -1
  123. package/dist/components/modal/Modal.cjs.map +1 -1
  124. package/dist/components/modal/Modal.js +91 -83
  125. package/dist/components/modal/Modal.js.map +1 -1
  126. package/dist/components/multiselect/MultiSelect.cjs +2 -0
  127. package/dist/components/multiselect/MultiSelect.cjs.map +1 -0
  128. package/dist/components/multiselect/MultiSelect.js +176 -0
  129. package/dist/components/multiselect/MultiSelect.js.map +1 -0
  130. package/dist/components/nuiprovider/NUIProvider.cjs +2 -0
  131. package/dist/components/nuiprovider/NUIProvider.cjs.map +1 -0
  132. package/dist/components/nuiprovider/NUIProvider.js +36 -0
  133. package/dist/components/nuiprovider/NUIProvider.js.map +1 -0
  134. package/dist/components/pagination/Pagination.cjs +1 -1
  135. package/dist/components/pagination/Pagination.cjs.map +1 -1
  136. package/dist/components/pagination/Pagination.js +74 -41
  137. package/dist/components/pagination/Pagination.js.map +1 -1
  138. package/dist/components/popover/Popover.cjs +1 -1
  139. package/dist/components/popover/Popover.cjs.map +1 -1
  140. package/dist/components/popover/Popover.js +99 -100
  141. package/dist/components/popover/Popover.js.map +1 -1
  142. package/dist/components/progress/Progress.cjs +1 -1
  143. package/dist/components/progress/Progress.cjs.map +1 -1
  144. package/dist/components/progress/Progress.js +44 -22
  145. package/dist/components/progress/Progress.js.map +1 -1
  146. package/dist/components/radiogroup/RadioGroup.cjs +1 -1
  147. package/dist/components/radiogroup/RadioGroup.cjs.map +1 -1
  148. package/dist/components/radiogroup/RadioGroup.js +69 -74
  149. package/dist/components/radiogroup/RadioGroup.js.map +1 -1
  150. package/dist/components/rating/Rating.cjs +1 -1
  151. package/dist/components/rating/Rating.cjs.map +1 -1
  152. package/dist/components/rating/Rating.js +72 -33
  153. package/dist/components/rating/Rating.js.map +1 -1
  154. package/dist/components/resizable/Resizable.cjs +2 -0
  155. package/dist/components/resizable/Resizable.cjs.map +1 -0
  156. package/dist/components/resizable/Resizable.js +134 -0
  157. package/dist/components/resizable/Resizable.js.map +1 -0
  158. package/dist/components/select/Select.cjs +1 -1
  159. package/dist/components/select/Select.cjs.map +1 -1
  160. package/dist/components/select/Select.js +114 -113
  161. package/dist/components/select/Select.js.map +1 -1
  162. package/dist/components/skeleton/Skeleton.cjs +1 -1
  163. package/dist/components/skeleton/Skeleton.cjs.map +1 -1
  164. package/dist/components/skeleton/Skeleton.js +90 -67
  165. package/dist/components/skeleton/Skeleton.js.map +1 -1
  166. package/dist/components/slider/Slider.cjs +1 -1
  167. package/dist/components/slider/Slider.cjs.map +1 -1
  168. package/dist/components/slider/Slider.js +85 -82
  169. package/dist/components/slider/Slider.js.map +1 -1
  170. package/dist/components/spinner/Spinner.cjs +1 -1
  171. package/dist/components/spinner/Spinner.cjs.map +1 -1
  172. package/dist/components/spinner/Spinner.js +60 -17
  173. package/dist/components/spinner/Spinner.js.map +1 -1
  174. package/dist/components/stepper/Stepper.cjs +1 -5
  175. package/dist/components/stepper/Stepper.cjs.map +1 -1
  176. package/dist/components/stepper/Stepper.js +65 -39
  177. package/dist/components/stepper/Stepper.js.map +1 -1
  178. package/dist/components/switch/Switch.cjs +1 -1
  179. package/dist/components/switch/Switch.cjs.map +1 -1
  180. package/dist/components/switch/Switch.js +89 -62
  181. package/dist/components/switch/Switch.js.map +1 -1
  182. package/dist/components/table/Table.cjs +1 -1
  183. package/dist/components/table/Table.cjs.map +1 -1
  184. package/dist/components/table/Table.js +62 -35
  185. package/dist/components/table/Table.js.map +1 -1
  186. package/dist/components/tabs/Tabs.cjs +1 -1
  187. package/dist/components/tabs/Tabs.cjs.map +1 -1
  188. package/dist/components/tabs/Tabs.js +110 -50
  189. package/dist/components/tabs/Tabs.js.map +1 -1
  190. package/dist/components/textarea/Textarea.cjs +1 -1
  191. package/dist/components/textarea/Textarea.cjs.map +1 -1
  192. package/dist/components/textarea/Textarea.js +63 -58
  193. package/dist/components/textarea/Textarea.js.map +1 -1
  194. package/dist/components/timepicker/TimePicker.cjs +2 -0
  195. package/dist/components/timepicker/TimePicker.cjs.map +1 -0
  196. package/dist/components/timepicker/TimePicker.js +159 -0
  197. package/dist/components/timepicker/TimePicker.js.map +1 -0
  198. package/dist/components/timerangepicker/TimeRangePicker.cjs +2 -0
  199. package/dist/components/timerangepicker/TimeRangePicker.cjs.map +1 -0
  200. package/dist/components/timerangepicker/TimeRangePicker.js +208 -0
  201. package/dist/components/timerangepicker/TimeRangePicker.js.map +1 -0
  202. package/dist/components/toast/Toast.cjs +1 -1
  203. package/dist/components/toast/Toast.cjs.map +1 -1
  204. package/dist/components/toast/Toast.js +91 -38
  205. package/dist/components/toast/Toast.js.map +1 -1
  206. package/dist/components/tooltip/Tooltip.cjs +1 -1
  207. package/dist/components/tooltip/Tooltip.cjs.map +1 -1
  208. package/dist/components/tooltip/Tooltip.js +72 -56
  209. package/dist/components/tooltip/Tooltip.js.map +1 -1
  210. package/dist/components/treeview/TreeView.cjs +1 -1
  211. package/dist/components/treeview/TreeView.cjs.map +1 -1
  212. package/dist/components/treeview/TreeView.js +120 -90
  213. package/dist/components/treeview/TreeView.js.map +1 -1
  214. package/dist/components/virtuallist/VirtualList.cjs +1 -1
  215. package/dist/components/virtuallist/VirtualList.cjs.map +1 -1
  216. package/dist/components/virtuallist/VirtualList.js +52 -34
  217. package/dist/components/virtuallist/VirtualList.js.map +1 -1
  218. package/dist/dist/components/accordion/Accordion.cjs +2 -0
  219. package/dist/dist/components/accordion/Accordion.cjs.map +1 -0
  220. package/dist/dist/components/accordion/Accordion.js +51 -0
  221. package/dist/dist/components/accordion/Accordion.js.map +1 -0
  222. package/dist/dist/components/alert/Alert.cjs +2 -0
  223. package/dist/dist/components/alert/Alert.cjs.map +1 -0
  224. package/dist/dist/components/alert/Alert.js +32 -0
  225. package/dist/dist/components/alert/Alert.js.map +1 -0
  226. package/dist/dist/components/avatar/Avatar.cjs +2 -0
  227. package/dist/dist/components/avatar/Avatar.cjs.map +1 -0
  228. package/dist/dist/components/avatar/Avatar.js +51 -0
  229. package/dist/dist/components/avatar/Avatar.js.map +1 -0
  230. package/dist/dist/components/avatar/AvatarGroup.cjs +2 -0
  231. package/dist/dist/components/avatar/AvatarGroup.cjs.map +1 -0
  232. package/dist/dist/components/avatar/AvatarGroup.js +32 -0
  233. package/dist/dist/components/avatar/AvatarGroup.js.map +1 -0
  234. package/dist/dist/components/badge/Badge.cjs +2 -0
  235. package/dist/dist/components/badge/Badge.cjs.map +1 -0
  236. package/dist/dist/components/badge/Badge.js +81 -0
  237. package/dist/dist/components/badge/Badge.js.map +1 -0
  238. package/dist/dist/components/badge/BadgeGroup.cjs +2 -0
  239. package/dist/dist/components/badge/BadgeGroup.cjs.map +1 -0
  240. package/dist/dist/components/badge/BadgeGroup.js +17 -0
  241. package/dist/dist/components/badge/BadgeGroup.js.map +1 -0
  242. package/dist/dist/components/breadcrumbs/Breadcrumbs.cjs +2 -0
  243. package/dist/dist/components/breadcrumbs/Breadcrumbs.cjs.map +1 -0
  244. package/dist/dist/components/breadcrumbs/Breadcrumbs.js +46 -0
  245. package/dist/dist/components/breadcrumbs/Breadcrumbs.js.map +1 -0
  246. package/dist/dist/components/button/Button.cjs +2 -0
  247. package/dist/dist/components/button/Button.cjs.map +1 -0
  248. package/dist/dist/components/button/Button.js +21 -0
  249. package/dist/dist/components/button/Button.js.map +1 -0
  250. package/dist/dist/components/card/Card.cjs +2 -0
  251. package/dist/dist/components/card/Card.cjs.map +1 -0
  252. package/dist/dist/components/card/Card.js +50 -0
  253. package/dist/dist/components/card/Card.js.map +1 -0
  254. package/dist/dist/components/checkbox/Checkbox.cjs +2 -0
  255. package/dist/dist/components/checkbox/Checkbox.cjs.map +1 -0
  256. package/dist/dist/components/checkbox/Checkbox.js +46 -0
  257. package/dist/dist/components/checkbox/Checkbox.js.map +1 -0
  258. package/dist/dist/components/chip/Chip.cjs +2 -0
  259. package/dist/dist/components/chip/Chip.cjs.map +1 -0
  260. package/dist/dist/components/chip/Chip.js +51 -0
  261. package/dist/dist/components/chip/Chip.js.map +1 -0
  262. package/dist/dist/components/combobox/Combobox.cjs +2 -0
  263. package/dist/dist/components/combobox/Combobox.cjs.map +1 -0
  264. package/dist/dist/components/combobox/Combobox.js +114 -0
  265. package/dist/dist/components/combobox/Combobox.js.map +1 -0
  266. package/dist/dist/components/commandpalette/CommandPalette.cjs +2 -0
  267. package/dist/dist/components/commandpalette/CommandPalette.cjs.map +1 -0
  268. package/dist/dist/components/commandpalette/CommandPalette.js +111 -0
  269. package/dist/dist/components/commandpalette/CommandPalette.js.map +1 -0
  270. package/dist/dist/components/contextmenu/ContextMenu.cjs +2 -0
  271. package/dist/dist/components/contextmenu/ContextMenu.cjs.map +1 -0
  272. package/dist/dist/components/contextmenu/ContextMenu.js +104 -0
  273. package/dist/dist/components/contextmenu/ContextMenu.js.map +1 -0
  274. package/dist/dist/components/datagrid/DataGrid.cjs +2 -0
  275. package/dist/dist/components/datagrid/DataGrid.cjs.map +1 -0
  276. package/dist/dist/components/datagrid/DataGrid.js +227 -0
  277. package/dist/dist/components/datagrid/DataGrid.js.map +1 -0
  278. package/dist/dist/components/datepicker/DatePicker.cjs +2 -0
  279. package/dist/dist/components/datepicker/DatePicker.cjs.map +1 -0
  280. package/dist/dist/components/datepicker/DatePicker.js +265 -0
  281. package/dist/dist/components/datepicker/DatePicker.js.map +1 -0
  282. package/dist/dist/components/daterangepicker/DateRangePicker.cjs +2 -0
  283. package/dist/dist/components/daterangepicker/DateRangePicker.cjs.map +1 -0
  284. package/dist/dist/components/daterangepicker/DateRangePicker.js +322 -0
  285. package/dist/dist/components/daterangepicker/DateRangePicker.js.map +1 -0
  286. package/dist/dist/components/drawer/Drawer.cjs +2 -0
  287. package/dist/dist/components/drawer/Drawer.cjs.map +1 -0
  288. package/dist/dist/components/drawer/Drawer.js +57 -0
  289. package/dist/dist/components/drawer/Drawer.js.map +1 -0
  290. package/dist/dist/components/dropdown/Dropdown.cjs +2 -0
  291. package/dist/dist/components/dropdown/Dropdown.cjs.map +1 -0
  292. package/dist/dist/components/dropdown/Dropdown.js +115 -0
  293. package/dist/dist/components/dropdown/Dropdown.js.map +1 -0
  294. package/dist/dist/components/fileuploader/FileUploader.cjs +2 -0
  295. package/dist/dist/components/fileuploader/FileUploader.cjs.map +1 -0
  296. package/dist/dist/components/fileuploader/FileUploader.js +83 -0
  297. package/dist/dist/components/fileuploader/FileUploader.js.map +1 -0
  298. package/dist/dist/components/hovercard/HoverCard.cjs +2 -0
  299. package/dist/dist/components/hovercard/HoverCard.cjs.map +1 -0
  300. package/dist/dist/components/hovercard/HoverCard.js +78 -0
  301. package/dist/dist/components/hovercard/HoverCard.js.map +1 -0
  302. package/dist/dist/components/input/Input.cjs +2 -0
  303. package/dist/dist/components/input/Input.cjs.map +1 -0
  304. package/dist/dist/components/input/Input.js +41 -0
  305. package/dist/dist/components/input/Input.js.map +1 -0
  306. package/dist/dist/components/layout/Container.cjs +2 -0
  307. package/dist/dist/components/layout/Container.cjs.map +1 -0
  308. package/dist/dist/components/layout/Container.js +33 -0
  309. package/dist/dist/components/layout/Container.js.map +1 -0
  310. package/dist/dist/components/layout/Flex.cjs +2 -0
  311. package/dist/dist/components/layout/Flex.cjs.map +1 -0
  312. package/dist/dist/components/layout/Flex.js +26 -0
  313. package/dist/dist/components/layout/Flex.js.map +1 -0
  314. package/dist/dist/components/layout/Grid.cjs +2 -0
  315. package/dist/dist/components/layout/Grid.cjs.map +1 -0
  316. package/dist/dist/components/layout/Grid.js +21 -0
  317. package/dist/dist/components/layout/Grid.js.map +1 -0
  318. package/dist/dist/components/layout/HStack.cjs.map +1 -0
  319. package/dist/dist/components/layout/HStack.js.map +1 -0
  320. package/dist/dist/components/layout/Stack.cjs.map +1 -0
  321. package/dist/dist/components/layout/Stack.js.map +1 -0
  322. package/dist/dist/components/megamenu/MegaMenu.cjs +2 -0
  323. package/dist/dist/components/megamenu/MegaMenu.cjs.map +1 -0
  324. package/dist/dist/components/megamenu/MegaMenu.js +43 -0
  325. package/dist/dist/components/megamenu/MegaMenu.js.map +1 -0
  326. package/dist/dist/components/modal/Modal.cjs +2 -0
  327. package/dist/dist/components/modal/Modal.cjs.map +1 -0
  328. package/dist/dist/components/modal/Modal.js +91 -0
  329. package/dist/dist/components/modal/Modal.js.map +1 -0
  330. package/dist/dist/components/pagination/Pagination.cjs +2 -0
  331. package/dist/dist/components/pagination/Pagination.cjs.map +1 -0
  332. package/dist/dist/components/pagination/Pagination.js +62 -0
  333. package/dist/dist/components/pagination/Pagination.js.map +1 -0
  334. package/dist/dist/components/popover/Popover.cjs +2 -0
  335. package/dist/dist/components/popover/Popover.cjs.map +1 -0
  336. package/dist/dist/components/popover/Popover.js +123 -0
  337. package/dist/dist/components/popover/Popover.js.map +1 -0
  338. package/dist/dist/components/progress/Progress.cjs +2 -0
  339. package/dist/dist/components/progress/Progress.cjs.map +1 -0
  340. package/dist/dist/components/progress/Progress.js +33 -0
  341. package/dist/dist/components/progress/Progress.js.map +1 -0
  342. package/dist/dist/components/radiogroup/RadioGroup.cjs +2 -0
  343. package/dist/dist/components/radiogroup/RadioGroup.cjs.map +1 -0
  344. package/dist/dist/components/radiogroup/RadioGroup.js +79 -0
  345. package/dist/dist/components/radiogroup/RadioGroup.js.map +1 -0
  346. package/dist/dist/components/rating/Rating.cjs +2 -0
  347. package/dist/dist/components/rating/Rating.cjs.map +1 -0
  348. package/dist/dist/components/rating/Rating.js +49 -0
  349. package/dist/dist/components/rating/Rating.js.map +1 -0
  350. package/dist/dist/components/skeleton/Skeleton.cjs +2 -0
  351. package/dist/dist/components/skeleton/Skeleton.cjs.map +1 -0
  352. package/dist/dist/components/skeleton/Skeleton.js +86 -0
  353. package/dist/dist/components/skeleton/Skeleton.js.map +1 -0
  354. package/dist/dist/components/slider/Slider.cjs +2 -0
  355. package/dist/dist/components/slider/Slider.cjs.map +1 -0
  356. package/dist/dist/components/slider/Slider.js +116 -0
  357. package/dist/dist/components/slider/Slider.js.map +1 -0
  358. package/dist/dist/components/spinner/Spinner.cjs +2 -0
  359. package/dist/dist/components/spinner/Spinner.cjs.map +1 -0
  360. package/dist/dist/components/spinner/Spinner.js +21 -0
  361. package/dist/dist/components/spinner/Spinner.js.map +1 -0
  362. package/dist/dist/components/stepper/Stepper.cjs +6 -0
  363. package/dist/dist/components/stepper/Stepper.cjs.map +1 -0
  364. package/dist/dist/components/stepper/Stepper.js +43 -0
  365. package/dist/dist/components/stepper/Stepper.js.map +1 -0
  366. package/dist/dist/components/switch/Switch.cjs +2 -0
  367. package/dist/dist/components/switch/Switch.cjs.map +1 -0
  368. package/dist/dist/components/switch/Switch.js +67 -0
  369. package/dist/dist/components/switch/Switch.js.map +1 -0
  370. package/dist/dist/components/table/Table.cjs +2 -0
  371. package/dist/dist/components/table/Table.cjs.map +1 -0
  372. package/dist/dist/components/table/Table.js +46 -0
  373. package/dist/dist/components/table/Table.js.map +1 -0
  374. package/dist/dist/components/tabs/Tabs.cjs +2 -0
  375. package/dist/dist/components/tabs/Tabs.cjs.map +1 -0
  376. package/dist/dist/components/tabs/Tabs.js +56 -0
  377. package/dist/dist/components/tabs/Tabs.js.map +1 -0
  378. package/dist/dist/components/textarea/Textarea.cjs +2 -0
  379. package/dist/dist/components/textarea/Textarea.cjs.map +1 -0
  380. package/dist/dist/components/textarea/Textarea.js +75 -0
  381. package/dist/dist/components/textarea/Textarea.js.map +1 -0
  382. package/dist/dist/components/toast/Toast.cjs +2 -0
  383. package/dist/dist/components/toast/Toast.cjs.map +1 -0
  384. package/dist/dist/components/toast/Toast.js +52 -0
  385. package/dist/dist/components/toast/Toast.js.map +1 -0
  386. package/dist/dist/components/tooltip/Tooltip.cjs +2 -0
  387. package/dist/dist/components/tooltip/Tooltip.cjs.map +1 -0
  388. package/dist/dist/components/tooltip/Tooltip.js +73 -0
  389. package/dist/dist/components/tooltip/Tooltip.js.map +1 -0
  390. package/dist/dist/components/treeview/TreeView.cjs +2 -0
  391. package/dist/dist/components/treeview/TreeView.cjs.map +1 -0
  392. package/dist/dist/components/treeview/TreeView.js +98 -0
  393. package/dist/dist/components/treeview/TreeView.js.map +1 -0
  394. package/dist/dist/components/virtuallist/VirtualList.cjs +2 -0
  395. package/dist/dist/components/virtuallist/VirtualList.cjs.map +1 -0
  396. package/dist/dist/components/virtuallist/VirtualList.js +58 -0
  397. package/dist/dist/components/virtuallist/VirtualList.js.map +1 -0
  398. package/dist/dist/index.cjs +2 -0
  399. package/dist/dist/index.cjs.map +1 -0
  400. package/dist/dist/index.js +109 -0
  401. package/dist/dist/index.js.map +1 -0
  402. package/dist/dist/styles/index.css +1 -0
  403. package/dist/dist/theme/NUIProvider.cjs.map +1 -0
  404. package/dist/dist/theme/NUIProvider.js.map +1 -0
  405. package/dist/dist/theme/useTheme.cjs.map +1 -0
  406. package/dist/dist/theme/useTheme.js.map +1 -0
  407. package/dist/dist/types/components/accordion/Accordion.d.ts +18 -0
  408. package/dist/dist/types/components/accordion/Accordion.d.ts.map +1 -0
  409. package/dist/dist/types/components/alert/Alert.d.ts +13 -0
  410. package/dist/dist/types/components/alert/Alert.d.ts.map +1 -0
  411. package/dist/dist/types/components/avatar/Avatar.d.ts +18 -0
  412. package/dist/dist/types/components/avatar/Avatar.d.ts.map +1 -0
  413. package/dist/dist/types/components/avatar/AvatarGroup.d.ts +10 -0
  414. package/dist/dist/types/components/avatar/AvatarGroup.d.ts.map +1 -0
  415. package/dist/dist/types/components/badge/Badge.d.ts +22 -0
  416. package/dist/dist/types/components/badge/Badge.d.ts.map +1 -0
  417. package/dist/dist/types/components/badge/BadgeGroup.d.ts +9 -0
  418. package/dist/dist/types/components/badge/BadgeGroup.d.ts.map +1 -0
  419. package/dist/dist/types/components/breadcrumbs/Breadcrumbs.d.ts +15 -0
  420. package/dist/dist/types/components/breadcrumbs/Breadcrumbs.d.ts.map +1 -0
  421. package/dist/dist/types/components/button/Button.d.ts +15 -0
  422. package/dist/dist/types/components/button/Button.d.ts.map +1 -0
  423. package/dist/dist/types/components/card/Card.d.ts +27 -0
  424. package/dist/dist/types/components/card/Card.d.ts.map +1 -0
  425. package/dist/dist/types/components/checkbox/Checkbox.d.ts +15 -0
  426. package/dist/dist/types/components/checkbox/Checkbox.d.ts.map +1 -0
  427. package/dist/dist/types/components/chip/Chip.d.ts +21 -0
  428. package/dist/dist/types/components/chip/Chip.d.ts.map +1 -0
  429. package/dist/dist/types/components/combobox/Combobox.d.ts +24 -0
  430. package/dist/dist/types/components/combobox/Combobox.d.ts.map +1 -0
  431. package/dist/dist/types/components/commandpalette/CommandPalette.d.ts +21 -0
  432. package/dist/dist/types/components/commandpalette/CommandPalette.d.ts.map +1 -0
  433. package/dist/dist/types/components/contextmenu/ContextMenu.d.ts +17 -0
  434. package/dist/dist/types/components/contextmenu/ContextMenu.d.ts.map +1 -0
  435. package/dist/dist/types/components/datagrid/DataGrid.d.ts +28 -0
  436. package/dist/dist/types/components/datagrid/DataGrid.d.ts.map +1 -0
  437. package/dist/dist/types/components/datepicker/DatePicker.d.ts +14 -0
  438. package/dist/dist/types/components/datepicker/DatePicker.d.ts.map +1 -0
  439. package/dist/dist/types/components/daterangepicker/DateRangePicker.d.ts +19 -0
  440. package/dist/dist/types/components/daterangepicker/DateRangePicker.d.ts.map +1 -0
  441. package/dist/dist/types/components/drawer/Drawer.d.ts +12 -0
  442. package/dist/dist/types/components/drawer/Drawer.d.ts.map +1 -0
  443. package/dist/dist/types/components/dropdown/Dropdown.d.ts +18 -0
  444. package/dist/dist/types/components/dropdown/Dropdown.d.ts.map +1 -0
  445. package/dist/dist/types/components/fileuploader/FileUploader.d.ts +9 -0
  446. package/dist/dist/types/components/fileuploader/FileUploader.d.ts.map +1 -0
  447. package/dist/dist/types/components/hovercard/HoverCard.d.ts +10 -0
  448. package/dist/dist/types/components/hovercard/HoverCard.d.ts.map +1 -0
  449. package/dist/dist/types/components/input/Input.d.ts +15 -0
  450. package/dist/dist/types/components/input/Input.d.ts.map +1 -0
  451. package/dist/dist/types/components/layout/Container.d.ts +8 -0
  452. package/dist/dist/types/components/layout/Container.d.ts.map +1 -0
  453. package/dist/dist/types/components/layout/Flex.d.ts +14 -0
  454. package/dist/dist/types/components/layout/Flex.d.ts.map +1 -0
  455. package/dist/dist/types/components/layout/Grid.d.ts +10 -0
  456. package/dist/dist/types/components/layout/Grid.d.ts.map +1 -0
  457. package/dist/dist/types/components/layout/HStack.d.ts.map +1 -0
  458. package/dist/dist/types/components/layout/Stack.d.ts.map +1 -0
  459. package/dist/dist/types/components/megamenu/MegaMenu.d.ts +12 -0
  460. package/dist/dist/types/components/megamenu/MegaMenu.d.ts.map +1 -0
  461. package/dist/dist/types/components/modal/Modal.d.ts +16 -0
  462. package/dist/dist/types/components/modal/Modal.d.ts.map +1 -0
  463. package/dist/dist/types/components/pagination/Pagination.d.ts +9 -0
  464. package/dist/dist/types/components/pagination/Pagination.d.ts.map +1 -0
  465. package/dist/dist/types/components/popover/Popover.d.ts +21 -0
  466. package/dist/dist/types/components/popover/Popover.d.ts.map +1 -0
  467. package/dist/dist/types/components/progress/Progress.d.ts +13 -0
  468. package/dist/dist/types/components/progress/Progress.d.ts.map +1 -0
  469. package/dist/dist/types/components/radiogroup/RadioGroup.d.ts +18 -0
  470. package/dist/dist/types/components/radiogroup/RadioGroup.d.ts.map +1 -0
  471. package/dist/dist/types/components/rating/Rating.d.ts +19 -0
  472. package/dist/dist/types/components/rating/Rating.d.ts.map +1 -0
  473. package/dist/dist/types/components/select/Select.d.ts +20 -0
  474. package/dist/dist/types/components/select/Select.d.ts.map +1 -0
  475. package/dist/dist/types/components/skeleton/Skeleton.d.ts +44 -0
  476. package/dist/dist/types/components/skeleton/Skeleton.d.ts.map +1 -0
  477. package/dist/dist/types/components/slider/Slider.d.ts +13 -0
  478. package/dist/dist/types/components/slider/Slider.d.ts.map +1 -0
  479. package/dist/dist/types/components/spinner/Spinner.d.ts +7 -0
  480. package/dist/dist/types/components/spinner/Spinner.d.ts.map +1 -0
  481. package/dist/dist/types/components/stepper/Stepper.d.ts +12 -0
  482. package/dist/dist/types/components/stepper/Stepper.d.ts.map +1 -0
  483. package/dist/dist/types/components/switch/Switch.d.ts +15 -0
  484. package/dist/dist/types/components/switch/Switch.d.ts.map +1 -0
  485. package/dist/dist/types/components/table/Table.d.ts +14 -0
  486. package/dist/dist/types/components/table/Table.d.ts.map +1 -0
  487. package/dist/dist/types/components/tabs/Tabs.d.ts +14 -0
  488. package/dist/dist/types/components/tabs/Tabs.d.ts.map +1 -0
  489. package/dist/dist/types/components/textarea/Textarea.d.ts +14 -0
  490. package/dist/dist/types/components/textarea/Textarea.d.ts.map +1 -0
  491. package/dist/dist/types/components/toast/Toast.d.ts +16 -0
  492. package/dist/dist/types/components/toast/Toast.d.ts.map +1 -0
  493. package/dist/dist/types/components/tooltip/Tooltip.d.ts +10 -0
  494. package/dist/dist/types/components/tooltip/Tooltip.d.ts.map +1 -0
  495. package/dist/dist/types/components/treeview/TreeView.d.ts +16 -0
  496. package/dist/dist/types/components/treeview/TreeView.d.ts.map +1 -0
  497. package/dist/dist/types/components/virtuallist/VirtualList.d.ts +23 -0
  498. package/dist/dist/types/components/virtuallist/VirtualList.d.ts.map +1 -0
  499. package/dist/dist/types/index.d.ts +50 -0
  500. package/dist/dist/types/index.d.ts.map +1 -0
  501. package/dist/dist/types/theme/NUIProvider.d.ts.map +1 -0
  502. package/dist/dist/types/theme/useTheme.d.ts.map +1 -0
  503. package/dist/dist/types/utils/generateid/generateId.d.ts +2 -0
  504. package/dist/dist/types/utils/generateid/generateId.d.ts.map +1 -0
  505. package/dist/dist/types/utils/index.d.ts +9 -0
  506. package/dist/dist/types/utils/index.d.ts.map +1 -0
  507. package/dist/dist/types/utils/inertmanager/inertManager.d.ts +13 -0
  508. package/dist/dist/types/utils/inertmanager/inertManager.d.ts.map +1 -0
  509. package/dist/dist/types/utils/keyboardnav/keyboardNav.d.ts +11 -0
  510. package/dist/dist/types/utils/keyboardnav/keyboardNav.d.ts.map +1 -0
  511. package/dist/dist/types/utils/onclickoutside/onClickOutside.d.ts +3 -0
  512. package/dist/dist/types/utils/onclickoutside/onClickOutside.d.ts.map +1 -0
  513. package/dist/dist/types/utils/portal/portal.d.ts +4 -0
  514. package/dist/dist/types/utils/portal/portal.d.ts.map +1 -0
  515. package/dist/dist/types/utils/restorefocus/restoreFocus.d.ts +8 -0
  516. package/dist/dist/types/utils/restorefocus/restoreFocus.d.ts.map +1 -0
  517. package/dist/dist/types/utils/scrolllock/scrollLock.d.ts +11 -0
  518. package/dist/dist/types/utils/scrolllock/scrollLock.d.ts.map +1 -0
  519. package/dist/dist/types/utils/trapfocus/trapFocus.d.ts +8 -0
  520. package/dist/dist/types/utils/trapfocus/trapFocus.d.ts.map +1 -0
  521. package/dist/dist/utils/generateid/generateId.cjs.map +1 -0
  522. package/dist/dist/utils/generateid/generateId.js.map +1 -0
  523. package/dist/dist/utils/inertmanager/inertManager.cjs +2 -0
  524. package/dist/dist/utils/inertmanager/inertManager.cjs.map +1 -0
  525. package/dist/dist/utils/inertmanager/inertManager.js +18 -0
  526. package/dist/dist/utils/inertmanager/inertManager.js.map +1 -0
  527. package/dist/dist/utils/keyboardnav/keyboardNav.cjs.map +1 -0
  528. package/dist/dist/utils/keyboardnav/keyboardNav.js.map +1 -0
  529. package/dist/dist/utils/onclickoutside/onClickOutside.cjs +2 -0
  530. package/dist/dist/utils/onclickoutside/onClickOutside.cjs.map +1 -0
  531. package/dist/dist/utils/onclickoutside/onClickOutside.js +11 -0
  532. package/dist/dist/utils/onclickoutside/onClickOutside.js.map +1 -0
  533. package/dist/dist/utils/portal/portal.cjs +2 -0
  534. package/dist/dist/utils/portal/portal.cjs.map +1 -0
  535. package/dist/dist/utils/portal/portal.js +8 -0
  536. package/dist/dist/utils/portal/portal.js.map +1 -0
  537. package/dist/dist/utils/restorefocus/restoreFocus.cjs +2 -0
  538. package/dist/dist/utils/restorefocus/restoreFocus.cjs.map +1 -0
  539. package/dist/dist/utils/restorefocus/restoreFocus.js +7 -0
  540. package/dist/dist/utils/restorefocus/restoreFocus.js.map +1 -0
  541. package/dist/dist/utils/scrolllock/scrollLock.cjs +2 -0
  542. package/dist/dist/utils/scrolllock/scrollLock.cjs.map +1 -0
  543. package/dist/dist/utils/scrolllock/scrollLock.js +12 -0
  544. package/dist/dist/utils/scrolllock/scrollLock.js.map +1 -0
  545. package/dist/dist/utils/trapfocus/trapFocus.cjs +3 -0
  546. package/dist/dist/utils/trapfocus/trapFocus.cjs.map +1 -0
  547. package/dist/dist/utils/trapfocus/trapFocus.js +14 -0
  548. package/dist/dist/utils/trapfocus/trapFocus.js.map +1 -0
  549. package/dist/index.cjs +1 -1
  550. package/dist/index.js +118 -107
  551. package/dist/index.js.map +1 -1
  552. package/dist/package.json +2 -2
  553. package/dist/styles/nui.css +1 -1
  554. package/dist/types/components/accordion/Accordion.d.ts +7 -3
  555. package/dist/types/components/accordion/Accordion.d.ts.map +1 -1
  556. package/dist/types/components/alert/Alert.d.ts +18 -5
  557. package/dist/types/components/alert/Alert.d.ts.map +1 -1
  558. package/dist/types/components/avatar/Avatar.d.ts +12 -8
  559. package/dist/types/components/avatar/Avatar.d.ts.map +1 -1
  560. package/dist/types/components/avatar/AvatarGroup.d.ts +11 -4
  561. package/dist/types/components/avatar/AvatarGroup.d.ts.map +1 -1
  562. package/dist/types/components/badge/Badge.d.ts +19 -11
  563. package/dist/types/components/badge/Badge.d.ts.map +1 -1
  564. package/dist/types/components/badge/BadgeGroup.d.ts +7 -4
  565. package/dist/types/components/badge/BadgeGroup.d.ts.map +1 -1
  566. package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts +14 -6
  567. package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts.map +1 -1
  568. package/dist/types/components/button/Button.d.ts +25 -10
  569. package/dist/types/components/button/Button.d.ts.map +1 -1
  570. package/dist/types/components/card/Card.d.ts +12 -21
  571. package/dist/types/components/card/Card.d.ts.map +1 -1
  572. package/dist/types/components/checkbox/Checkbox.d.ts +12 -7
  573. package/dist/types/components/checkbox/Checkbox.d.ts.map +1 -1
  574. package/dist/types/components/chip/Chip.d.ts +14 -11
  575. package/dist/types/components/chip/Chip.d.ts.map +1 -1
  576. package/dist/types/components/combobox/Combobox.d.ts +15 -4
  577. package/dist/types/components/combobox/Combobox.d.ts.map +1 -1
  578. package/dist/types/components/commandpalette/CommandPalette.d.ts +12 -3
  579. package/dist/types/components/commandpalette/CommandPalette.d.ts.map +1 -1
  580. package/dist/types/components/contextmenu/ContextMenu.d.ts +14 -6
  581. package/dist/types/components/contextmenu/ContextMenu.d.ts.map +1 -1
  582. package/dist/types/components/datagrid/DataGrid.d.ts +16 -4
  583. package/dist/types/components/datagrid/DataGrid.d.ts.map +1 -1
  584. package/dist/types/components/datepicker/DatePicker.d.ts +13 -1
  585. package/dist/types/components/datepicker/DatePicker.d.ts.map +1 -1
  586. package/dist/types/components/daterangepicker/DateRangePicker.d.ts +3 -1
  587. package/dist/types/components/daterangepicker/DateRangePicker.d.ts.map +1 -1
  588. package/dist/types/components/dialog/DialogProvider.d.ts +2 -0
  589. package/dist/types/components/dialog/DialogProvider.d.ts.map +1 -0
  590. package/dist/types/components/dialog/dialogStore.d.ts +42 -0
  591. package/dist/types/components/dialog/dialogStore.d.ts.map +1 -0
  592. package/dist/types/components/drawer/Drawer.d.ts +18 -4
  593. package/dist/types/components/drawer/Drawer.d.ts.map +1 -1
  594. package/dist/types/components/dropdown/Dropdown.d.ts +21 -16
  595. package/dist/types/components/dropdown/Dropdown.d.ts.map +1 -1
  596. package/dist/types/components/fileuploader/FileUploader.d.ts +22 -3
  597. package/dist/types/components/fileuploader/FileUploader.d.ts.map +1 -1
  598. package/dist/types/components/hovercard/HoverCard.d.ts +45 -5
  599. package/dist/types/components/hovercard/HoverCard.d.ts.map +1 -1
  600. package/dist/types/components/input/Input.d.ts +20 -10
  601. package/dist/types/components/input/Input.d.ts.map +1 -1
  602. package/dist/types/components/layout/Container.d.ts +8 -4
  603. package/dist/types/components/layout/Container.d.ts.map +1 -1
  604. package/dist/types/components/layout/Flex.d.ts +27 -10
  605. package/dist/types/components/layout/Flex.d.ts.map +1 -1
  606. package/dist/types/components/layout/Grid.d.ts +11 -5
  607. package/dist/types/components/layout/Grid.d.ts.map +1 -1
  608. package/dist/types/components/link/Link.d.ts +22 -0
  609. package/dist/types/components/link/Link.d.ts.map +1 -0
  610. package/dist/types/components/megamenu/MegaMenu.d.ts +8 -11
  611. package/dist/types/components/megamenu/MegaMenu.d.ts.map +1 -1
  612. package/dist/types/components/modal/Modal.d.ts +8 -7
  613. package/dist/types/components/modal/Modal.d.ts.map +1 -1
  614. package/dist/types/components/multiselect/MultiSelect.d.ts +33 -0
  615. package/dist/types/components/multiselect/MultiSelect.d.ts.map +1 -0
  616. package/dist/types/components/nuiprovider/NUIProvider.d.ts +29 -0
  617. package/dist/types/components/nuiprovider/NUIProvider.d.ts.map +1 -0
  618. package/dist/types/components/pagination/Pagination.d.ts +17 -3
  619. package/dist/types/components/pagination/Pagination.d.ts.map +1 -1
  620. package/dist/types/components/popover/Popover.d.ts +54 -16
  621. package/dist/types/components/popover/Popover.d.ts.map +1 -1
  622. package/dist/types/components/progress/Progress.d.ts +17 -7
  623. package/dist/types/components/progress/Progress.d.ts.map +1 -1
  624. package/dist/types/components/radiogroup/RadioGroup.d.ts +15 -10
  625. package/dist/types/components/radiogroup/RadioGroup.d.ts.map +1 -1
  626. package/dist/types/components/rating/Rating.d.ts +24 -10
  627. package/dist/types/components/rating/Rating.d.ts.map +1 -1
  628. package/dist/types/components/resizable/Resizable.d.ts +24 -0
  629. package/dist/types/components/resizable/Resizable.d.ts.map +1 -0
  630. package/dist/types/components/select/Select.d.ts +17 -8
  631. package/dist/types/components/select/Select.d.ts.map +1 -1
  632. package/dist/types/components/skeleton/Skeleton.d.ts +37 -36
  633. package/dist/types/components/skeleton/Skeleton.d.ts.map +1 -1
  634. package/dist/types/components/slider/Slider.d.ts +15 -4
  635. package/dist/types/components/slider/Slider.d.ts.map +1 -1
  636. package/dist/types/components/spinner/Spinner.d.ts +14 -4
  637. package/dist/types/components/spinner/Spinner.d.ts.map +1 -1
  638. package/dist/types/components/stepper/Stepper.d.ts +17 -3
  639. package/dist/types/components/stepper/Stepper.d.ts.map +1 -1
  640. package/dist/types/components/switch/Switch.d.ts +20 -5
  641. package/dist/types/components/switch/Switch.d.ts.map +1 -1
  642. package/dist/types/components/table/Table.d.ts +24 -4
  643. package/dist/types/components/table/Table.d.ts.map +1 -1
  644. package/dist/types/components/tabs/Tabs.d.ts +25 -12
  645. package/dist/types/components/tabs/Tabs.d.ts.map +1 -1
  646. package/dist/types/components/textarea/Textarea.d.ts +8 -5
  647. package/dist/types/components/textarea/Textarea.d.ts.map +1 -1
  648. package/dist/types/components/timepicker/TimePicker.d.ts +26 -0
  649. package/dist/types/components/timepicker/TimePicker.d.ts.map +1 -0
  650. package/dist/types/components/timerangepicker/TimeRangePicker.d.ts +32 -0
  651. package/dist/types/components/timerangepicker/TimeRangePicker.d.ts.map +1 -0
  652. package/dist/types/components/toast/Toast.d.ts +23 -7
  653. package/dist/types/components/toast/Toast.d.ts.map +1 -1
  654. package/dist/types/components/tooltip/Tooltip.d.ts +13 -2
  655. package/dist/types/components/tooltip/Tooltip.d.ts.map +1 -1
  656. package/dist/types/components/treeview/TreeView.d.ts +20 -6
  657. package/dist/types/components/treeview/TreeView.d.ts.map +1 -1
  658. package/dist/types/components/virtuallist/VirtualList.d.ts +12 -16
  659. package/dist/types/components/virtuallist/VirtualList.d.ts.map +1 -1
  660. package/dist/types/index.d.ts +8 -4
  661. package/dist/types/index.d.ts.map +1 -1
  662. package/dist/types/utils/cn/cn.d.ts +19 -0
  663. package/dist/types/utils/cn/cn.d.ts.map +1 -0
  664. package/dist/types/utils/generateid/generateId.d.ts +7 -0
  665. package/dist/types/utils/generateid/generateId.d.ts.map +1 -1
  666. package/dist/types/utils/index.d.ts +2 -0
  667. package/dist/types/utils/index.d.ts.map +1 -1
  668. package/dist/types/utils/inertmanager/inertManager.d.ts +13 -0
  669. package/dist/types/utils/inertmanager/inertManager.d.ts.map +1 -1
  670. package/dist/types/utils/keyboardnav/keyboardNav.d.ts +17 -6
  671. package/dist/types/utils/keyboardnav/keyboardNav.d.ts.map +1 -1
  672. package/dist/types/utils/onclickoutside/onClickOutside.d.ts +9 -1
  673. package/dist/types/utils/onclickoutside/onClickOutside.d.ts.map +1 -1
  674. package/dist/types/utils/portal/portal.d.ts +14 -1
  675. package/dist/types/utils/portal/portal.d.ts.map +1 -1
  676. package/dist/types/utils/restorefocus/restoreFocus.d.ts +8 -4
  677. package/dist/types/utils/restorefocus/restoreFocus.d.ts.map +1 -1
  678. package/dist/types/utils/scrolllock/scrollLock.d.ts +10 -2
  679. package/dist/types/utils/scrolllock/scrollLock.d.ts.map +1 -1
  680. package/dist/types/utils/slot/slot.d.ts +12 -0
  681. package/dist/types/utils/slot/slot.d.ts.map +1 -0
  682. package/dist/types/utils/trapfocus/trapFocus.d.ts +6 -2
  683. package/dist/types/utils/trapfocus/trapFocus.d.ts.map +1 -1
  684. package/dist/utils/cn/cn.cjs +2 -0
  685. package/dist/utils/cn/cn.cjs.map +1 -0
  686. package/dist/utils/cn/cn.js +21 -0
  687. package/dist/utils/cn/cn.js.map +1 -0
  688. package/dist/utils/inertmanager/inertManager.cjs.map +1 -1
  689. package/dist/utils/inertmanager/inertManager.js.map +1 -1
  690. package/dist/utils/onclickoutside/onClickOutside.cjs +1 -1
  691. package/dist/utils/onclickoutside/onClickOutside.cjs.map +1 -1
  692. package/dist/utils/onclickoutside/onClickOutside.js +10 -6
  693. package/dist/utils/onclickoutside/onClickOutside.js.map +1 -1
  694. package/dist/utils/portal/portal.cjs.map +1 -1
  695. package/dist/utils/portal/portal.js.map +1 -1
  696. package/dist/utils/restorefocus/restoreFocus.cjs.map +1 -1
  697. package/dist/utils/restorefocus/restoreFocus.js.map +1 -1
  698. package/dist/utils/scrolllock/scrollLock.cjs.map +1 -1
  699. package/dist/utils/scrolllock/scrollLock.js +7 -0
  700. package/dist/utils/scrolllock/scrollLock.js.map +1 -1
  701. package/dist/utils/slot/slot.cjs +2 -0
  702. package/dist/utils/slot/slot.cjs.map +1 -0
  703. package/dist/utils/slot/slot.js +57 -0
  704. package/dist/utils/slot/slot.js.map +1 -0
  705. package/dist/utils/trapfocus/trapFocus.cjs.map +1 -1
  706. package/dist/utils/trapfocus/trapFocus.js.map +1 -1
  707. package/package.json +2 -2
  708. package/dist/components/layout/HStack.cjs.map +0 -1
  709. package/dist/components/layout/HStack.js.map +0 -1
  710. package/dist/components/layout/Stack.cjs.map +0 -1
  711. package/dist/components/layout/Stack.js.map +0 -1
  712. package/dist/theme/NUIProvider.cjs.map +0 -1
  713. package/dist/theme/NUIProvider.js.map +0 -1
  714. package/dist/theme/useTheme.cjs.map +0 -1
  715. package/dist/theme/useTheme.js.map +0 -1
  716. package/dist/types/components/layout/HStack.d.ts.map +0 -1
  717. package/dist/types/components/layout/Stack.d.ts.map +0 -1
  718. package/dist/types/theme/NUIProvider.d.ts.map +0 -1
  719. package/dist/types/theme/useTheme.d.ts.map +0 -1
  720. package/dist/utils/generateid/generateId.cjs.map +0 -1
  721. package/dist/utils/generateid/generateId.js.map +0 -1
  722. package/dist/utils/keyboardnav/keyboardNav.cjs.map +0 -1
  723. package/dist/utils/keyboardnav/keyboardNav.js.map +0 -1
  724. /package/dist/{components → dist/components}/layout/HStack.cjs +0 -0
  725. /package/dist/{components → dist/components}/layout/HStack.js +0 -0
  726. /package/dist/{components → dist/components}/layout/Stack.cjs +0 -0
  727. /package/dist/{components → dist/components}/layout/Stack.js +0 -0
  728. /package/dist/{theme → dist/theme}/NUIProvider.cjs +0 -0
  729. /package/dist/{theme → dist/theme}/NUIProvider.js +0 -0
  730. /package/dist/{theme → dist/theme}/useTheme.cjs +0 -0
  731. /package/dist/{theme → dist/theme}/useTheme.js +0 -0
  732. /package/dist/{types → dist/types}/components/layout/HStack.d.ts +0 -0
  733. /package/dist/{types → dist/types}/components/layout/Stack.d.ts +0 -0
  734. /package/dist/{types → dist/types}/theme/NUIProvider.d.ts +0 -0
  735. /package/dist/{types → dist/types}/theme/useTheme.d.ts +0 -0
  736. /package/dist/{utils → dist/utils}/generateid/generateId.cjs +0 -0
  737. /package/dist/{utils → dist/utils}/generateid/generateId.js +0 -0
  738. /package/dist/{utils → dist/utils}/keyboardnav/keyboardNav.cjs +0 -0
  739. /package/dist/{utils → dist/utils}/keyboardnav/keyboardNav.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"CommandPalette.js","sources":["../../../src/components/commandpalette/CommandPalette.tsx"],"sourcesContent":["/**\r\n * CommandPalette.tsx — FINAL VERSION\r\n * -----------------------------------\r\n * Full-featured Cmd+K command menu.\r\n * - Cmd+K / Ctrl+K global shortcut\r\n * - Search filter\r\n * - Keyboard navigation\r\n * - Portal + overlay\r\n * - Sections\r\n * - ARIA-compliant\r\n */\r\n\r\nimport {\r\n useEffect,\r\n useRef,\r\n useState,\r\n ReactNode,\r\n KeyboardEvent as ReactKeyboardEvent,\r\n} from 'react';\r\nimport './CommandPalette.css';\r\nimport { Portal, onClickOutside} from '../../utils/index';\r\n\r\nexport interface CommandItem {\r\n id: string;\r\n label: string;\r\n icon?: ReactNode;\r\n shortcut?: string;\r\n description?: string;\r\n onSelect?: () => void;\r\n}\r\n\r\nexport interface CommandSection {\r\n title?: string;\r\n items: CommandItem[];\r\n}\r\n\r\ninterface CommandPaletteProps {\r\n sections: CommandSection[];\r\n placeholder?: string;\r\n className?: string;\r\n}\r\n\r\nexport function CommandPalette({\r\n sections,\r\n placeholder = 'Search commands…',\r\n className = '',\r\n}: CommandPaletteProps) {\r\n const [open, setOpen] = useState(false);\r\n const [query, setQuery] = useState('');\r\n const [active, setActive] = useState<{ section: number; index: number }>({\r\n section: 0,\r\n index: 0,\r\n });\r\n\r\n const paletteRef = useRef<HTMLDivElement | null>(null);\r\n const inputRef = useRef<HTMLInputElement | null>(null);\r\n\r\n /** Global Cmd+K shortcut */\r\n useEffect(() => {\r\n const handler = (e: globalThis.KeyboardEvent) => {\r\n const isMac = navigator.platform.toLowerCase().includes('mac');\r\n const cmd = isMac ? e.metaKey : e.ctrlKey;\r\n\r\n if (cmd && e.key.toLowerCase() === 'k') {\r\n e.preventDefault();\r\n setOpen((o) => !o);\r\n }\r\n };\r\n\r\n document.addEventListener('keydown', handler as EventListener);\r\n return () =>\r\n document.removeEventListener('keydown', handler as EventListener);\r\n }, []);\r\n\r\n /** Close on ESC */\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const handler = (e: globalThis.KeyboardEvent) => {\r\n if (e.key === 'Escape') setOpen(false);\r\n };\r\n\r\n document.addEventListener('keydown', handler as EventListener);\r\n return () =>\r\n document.removeEventListener('keydown', handler as EventListener);\r\n }, [open]);\r\n\r\n /** Click outside to close */\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(paletteRef, () => setOpen(false));\r\n }, [open]);\r\n\r\n /** Autofocus search when opened */\r\n useEffect(() => {\r\n if (open) {\r\n setTimeout(() => inputRef.current?.focus(), 0);\r\n setQuery('');\r\n }\r\n }, [open]);\r\n\r\n /** Filtered list */\r\n const filteredSections = sections.map((sec) => ({\r\n ...sec,\r\n items: sec.items.filter((i) =>\r\n i.label.toLowerCase().includes(query.toLowerCase())\r\n ),\r\n }));\r\n\r\n /** Flatten for easier navigation */\r\n const flatList = filteredSections.flatMap((sec, sIdx) =>\r\n sec.items.map((_, iIdx) => ({ section: sIdx, index: iIdx }))\r\n );\r\n\r\n /** Handle keyboard navigation */\r\n const move = (dir: 1 | -1) => {\r\n if (flatList.length === 0) return;\r\n\r\n const currentIndex = flatList.findIndex(\r\n (x) => x.section === active.section && x.index === active.index\r\n );\r\n\r\n let next = currentIndex + dir;\r\n if (next < 0) next = flatList.length - 1;\r\n if (next >= flatList.length) next = 0;\r\n\r\n setActive(flatList[next]);\r\n };\r\n\r\n const handleKey = (e: ReactKeyboardEvent<HTMLDivElement>) => {\r\n const key = e.key;\r\n\r\n if (key === 'ArrowDown') {\r\n e.preventDefault();\r\n move(1);\r\n } else if (key === 'ArrowUp') {\r\n e.preventDefault();\r\n move(-1);\r\n } else if (key === 'Enter') {\r\n e.preventDefault();\r\n\r\n const sec = filteredSections[active.section];\r\n const item = sec?.items[active.index];\r\n\r\n if (item && item.onSelect) {\r\n item.onSelect();\r\n setOpen(false);\r\n }\r\n }\r\n };\r\n\r\n if (!open) return null;\r\n\r\n return (\r\n <Portal>\r\n <div className=\"ui-cmd-overlay\" />\r\n\r\n <div\r\n ref={paletteRef}\r\n className={`ui-cmd ${className}`}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n onKeyDown={handleKey}\r\n >\r\n {/* Search bar */}\r\n <input\r\n ref={inputRef}\r\n className=\"ui-cmd-input\"\r\n placeholder={placeholder}\r\n value={query}\r\n onChange={(e) => setQuery(e.target.value)}\r\n />\r\n\r\n <div className=\"ui-cmd-list\">\r\n {filteredSections.map((sec, sIdx) => (\r\n <div key={sIdx} className=\"ui-cmd-section\">\r\n {sec.title && (\r\n <div className=\"ui-cmd-section-title\">{sec.title}</div>\r\n )}\r\n\r\n {sec.items.length === 0 ? (\r\n <div className=\"ui-cmd-empty\">No results</div>\r\n ) : (\r\n sec.items.map((item, iIdx) => {\r\n const isActive =\r\n active.section === sIdx && active.index === iIdx;\r\n\r\n return (\r\n <div\r\n key={item.id}\r\n className={`ui-cmd-item ${isActive ? 'active' : ''}`}\r\n onMouseEnter={() =>\r\n setActive({ section: sIdx, index: iIdx })\r\n }\r\n onClick={() => {\r\n item.onSelect?.();\r\n setOpen(false);\r\n }}\r\n >\r\n {item.icon && (\r\n <span className=\"ui-cmd-icon\">{item.icon}</span>\r\n )}\r\n\r\n <div className=\"ui-cmd-meta\">\r\n <div className=\"ui-cmd-label\">{item.label}</div>\r\n {item.description && (\r\n <div className=\"ui-cmd-description\">\r\n {item.description}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {item.shortcut && (\r\n <span className=\"ui-cmd-shortcut\">{item.shortcut}</span>\r\n )}\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </Portal>\r\n );\r\n}\r\n"],"names":["CommandPalette","sections","placeholder","className","open","setOpen","useState","query","setQuery","active","setActive","paletteRef","useRef","inputRef","useEffect","handler","e","o","onClickOutside","filteredSections","sec","i","flatList","sIdx","_","iIdx","move","dir","next","x","handleKey","key","item","Portal","jsx","jsxs","isActive"],"mappings":"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"}
1
+ {"version":3,"file":"CommandPalette.js","sources":["../../../src/components/commandpalette/CommandPalette.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useEffect,\n useRef,\n useState,\n ReactNode,\n KeyboardEvent as ReactKeyboardEvent,\n useCallback,\n} from 'react';\nimport { Portal, onClickOutside, cn } from '../../utils';\nimport './CommandPalette.css';\n\n/* ============================================================\n * Types\n * ============================================================ */\n\nexport interface CommandItem {\n id: string;\n label: string;\n icon?: ReactNode;\n /** Displayed as a <kbd> hint, e.g., \"⌘ K\" */\n shortcut?: string;\n description?: string;\n onSelect?: () => void;\n}\n\nexport interface CommandSection {\n title?: string;\n items: CommandItem[];\n}\n\nexport interface CommandPaletteProps {\n sections: CommandSection[];\n placeholder?: string;\n className?: string;\n /** Forces the palette open/closed. If undefined, it operates purely via Cmd+K internally. */\n open?: boolean; \n onOpenChange?: (open: boolean) => void;\n}\n\n/* ============================================================\n * Component\n * ============================================================ */\n\n/**\n * CommandPalette Component\n * * A fast, composable, unstyled command menu for React.\n * Architecture Note: Manages a nested data structure (Sections > Items) but mathematically \n * flattens it for seamless O(1) keyboard navigation across section boundaries.\n */\nexport function CommandPalette({\n sections,\n placeholder = 'Search commands…',\n className,\n open: controlledOpen,\n onOpenChange,\n}: CommandPaletteProps) {\n const [internalOpen, setInternalOpen] = useState(false);\n const isOpen = controlledOpen !== undefined ? controlledOpen : internalOpen;\n\n const handleOpenChange = useCallback((newOpen: boolean) => {\n if (controlledOpen === undefined) setInternalOpen(newOpen);\n onOpenChange?.(newOpen);\n }, [controlledOpen, onOpenChange]);\n\n const [query, setQuery] = useState('');\n const [active, setActive] = useState<{ section: number; index: number }>({\n section: 0,\n index: 0,\n });\n\n const paletteRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const activeItemRef = useRef<HTMLDivElement | null>(null);\n\n /* ----------------------------------------------------\n Filtering & Flat Mapping\n ---------------------------------------------------- */\n // 1. Filter items based on query (checks both label and description)\n // 2. Filter out sections that end up completely empty\n const filteredSections = sections\n .map((sec) => ({\n ...sec,\n items: sec.items.filter(\n (i) =>\n i.label.toLowerCase().includes(query.toLowerCase()) ||\n i.description?.toLowerCase().includes(query.toLowerCase())\n ),\n }))\n .filter((sec) => sec.items.length > 0); \n\n // * Navigation Engine: \n // Creates a flat list of coordinates [{section: 0, index: 0}, {section: 0, index: 1}, {section: 1, index: 0}]\n // This allows the ArrowUp/ArrowDown keys to easily increment/decrement a single integer \n // and look up the exact multidimensional coordinate.\n const flatList = filteredSections.flatMap((sec, sIdx) =>\n sec.items.map((_, iIdx) => ({ section: sIdx, index: iIdx }))\n );\n\n /* ----------------------------------------------------\n Event Listeners & Effects\n ---------------------------------------------------- */\n // Global Cmd+K / Ctrl+K shortcut\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n const isMac = navigator.platform.toLowerCase().includes('mac');\n const cmd = isMac ? e.metaKey : e.ctrlKey;\n\n if (cmd && e.key.toLowerCase() === 'k') {\n e.preventDefault();\n handleOpenChange(!isOpen);\n }\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [isOpen, handleOpenChange]);\n\n // Close on ESC\n useEffect(() => {\n if (!isOpen) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') handleOpenChange(false);\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [isOpen, handleOpenChange]);\n\n // Click outside to close\n useEffect(() => {\n if (!isOpen) return;\n return onClickOutside(paletteRef, () => handleOpenChange(false));\n }, [isOpen, handleOpenChange]);\n\n // Reset state and autofocus when opened\n useEffect(() => {\n if (isOpen) {\n setQuery('');\n setActive({ section: 0, index: 0 });\n // Small timeout ensures the React Portal has mounted the DOM node before focusing\n setTimeout(() => inputRef.current?.focus(), 10);\n }\n }, [isOpen]);\n\n // Auto-scroll active item into view\n useEffect(() => {\n if (isOpen && activeItemRef.current) {\n activeItemRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [active, isOpen, query]);\n\n // Reset active index when user types (so it jumps back to top)\n useEffect(() => {\n setActive({ section: 0, index: 0 });\n }, [query]);\n\n /* ----------------------------------------------------\n Keyboard Navigation\n ---------------------------------------------------- */\n const move = (dir: 1 | -1) => {\n if (flatList.length === 0) return;\n\n const currentIndex = flatList.findIndex(\n (x) => x.section === active.section && x.index === active.index\n );\n\n let next = currentIndex + dir;\n // Wrap around logic\n if (next < 0) next = flatList.length - 1;\n if (next >= flatList.length) next = 0;\n\n setActive(flatList[next]);\n };\n\n const handleKey = (e: ReactKeyboardEvent<HTMLDivElement>) => {\n const key = e.key;\n\n if (key === 'ArrowDown') {\n e.preventDefault();\n move(1);\n } else if (key === 'ArrowUp') {\n e.preventDefault();\n move(-1);\n } else if (key === 'Enter') {\n e.preventDefault();\n const sec = filteredSections[active.section];\n const item = sec?.items[active.index];\n\n if (item && item.onSelect) {\n item.onSelect();\n handleOpenChange(false);\n }\n }\n };\n\n /* ----------------------------------------------------\n Render\n ---------------------------------------------------- */\n if (!isOpen) return null;\n\n return (\n <Portal>\n <div className=\"nui-cmd-overlay\" />\n\n <div\n ref={paletteRef}\n className={cn(\"nui-cmd\", className)}\n role=\"dialog\"\n aria-modal=\"true\"\n onKeyDown={handleKey}\n >\n {/* Search Header */}\n <div className=\"nui-cmd-header\">\n <svg className=\"nui-cmd-search-icon\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n </svg>\n <input\n ref={inputRef}\n className=\"nui-cmd-input\"\n placeholder={placeholder}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n />\n {query && (\n <button className=\"nui-cmd-clear\" onClick={() => setQuery('')}>\n ESC\n </button>\n )}\n </div>\n\n {/* Results List */}\n <div className=\"nui-cmd-list\" role=\"listbox\">\n {filteredSections.length === 0 ? (\n <div className=\"nui-cmd-empty\">\n <span className=\"nui-cmd-empty-text\">No results found for \"{query}\"</span>\n </div>\n ) : (\n filteredSections.map((sec, sIdx) => (\n <div key={sIdx} className=\"nui-cmd-section\">\n {sec.title && (\n <div className=\"nui-cmd-section-title\">{sec.title}</div>\n )}\n\n <div className=\"nui-cmd-section-items\">\n {sec.items.map((item, iIdx) => {\n const isActive = active.section === sIdx && active.index === iIdx;\n\n return (\n <div\n key={item.id}\n ref={isActive ? activeItemRef : null}\n role=\"option\"\n aria-selected={isActive}\n className={cn(\"nui-cmd-item\", isActive && \"active\")}\n onMouseEnter={() => setActive({ section: sIdx, index: iIdx })}\n onClick={() => {\n item.onSelect?.();\n handleOpenChange(false);\n }}\n >\n {item.icon && (\n <div className=\"nui-cmd-item-icon\">{item.icon}</div>\n )}\n\n <div className=\"nui-cmd-item-meta\">\n <div className=\"nui-cmd-item-label\">{item.label}</div>\n {item.description && (\n <div className=\"nui-cmd-item-description\">\n {item.description}\n </div>\n )}\n </div>\n\n {item.shortcut && (\n <div className=\"nui-cmd-item-shortcut\">\n {item.shortcut.split(' ').map((key, k) => (\n <kbd key={k}>{key}</kbd>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </Portal>\n );\n}"],"names":["CommandPalette","sections","placeholder","className","controlledOpen","onOpenChange","internalOpen","setInternalOpen","useState","isOpen","handleOpenChange","useCallback","newOpen","query","setQuery","active","setActive","paletteRef","useRef","inputRef","activeItemRef","filteredSections","sec","i","flatList","sIdx","_","iIdx","useEffect","handler","e","onClickOutside","move","dir","next","x","handleKey","key","item","Portal","jsx","jsxs","cn","isActive","k"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),o=require("react");;/* empty css */const E=require("../../utils/onclickoutside/onClickOutside.cjs"),g=require("../../utils/portal/portal.cjs");function w({trigger:x,items:r,className:v=""}){const[l,a]=o.useState(!1),[c,b]=o.useState(null),d=o.useRef(null),[u,i]=o.useState(0),h=e=>{e.preventDefault(),b({top:e.clientY,left:e.clientX}),a(!0),i(f())},f=()=>r.findIndex(e=>e.type!=="separator"&&!e.disabled),y=()=>{for(let e=r.length-1;e>=0;e--){const n=r[e];if(n.type!=="separator"&&!n.disabled)return e}return 0},p=e=>{let n=u;for(;;){n=n+e,n<0&&(n=r.length-1),n>=r.length&&(n=0);const t=r[n];if(t.type!=="separator"&&!t.disabled){i(n);break}}},j=e=>{const{key:n}=e;if(n==="ArrowDown")e.preventDefault(),p(1);else if(n==="ArrowUp")e.preventDefault(),p(-1);else if(n==="Home")e.preventDefault(),i(f());else if(n==="End")e.preventDefault(),i(y());else if(n==="Enter"||n===" "){e.preventDefault();const t=r[u];t&&!t.disabled&&t.onSelect&&(t.onSelect(),a(!1))}};return o.useEffect(()=>{if(!l)return;const e=n=>{n.key==="Escape"&&a(!1)};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[l]),o.useEffect(()=>{if(l)return E.onClickOutside(d,()=>a(!1))},[l]),s.jsxs("div",{className:"ui-contextmenu-wrapper",children:[s.jsx("div",{onContextMenu:h,children:x}),l&&c&&s.jsx(g.Portal,{children:s.jsx("div",{ref:d,className:`ui-contextmenu ${v}`,role:"menu",tabIndex:-1,style:{top:c.top,left:c.left,position:"fixed"},onKeyDown:j,children:r.map((e,n)=>{if(e.type==="separator")return s.jsx("div",{className:"ui-contextmenu-separator"},n);const t=n===u;return s.jsxs("div",{className:["ui-contextmenu-item",e.disabled?"disabled":"",e.danger?"danger":"",t?"active":""].filter(Boolean).join(" "),role:"menuitem",tabIndex:-1,"aria-disabled":e.disabled||void 0,onMouseEnter:()=>i(n),onClick:()=>{e.disabled||(e.onSelect?.(),a(!1))},children:[e.icon&&s.jsx("span",{className:"ui-contextmenu-icon",children:e.icon}),s.jsx("span",{children:e.label})]},n)})})})]})}exports.ContextMenu=w;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),o=require("react");;/* empty css */const S=require("../../utils/onclickoutside/onClickOutside.cjs"),k=require("../../utils/portal/portal.cjs"),g=require("../../utils/cn/cn.cjs");function L({children:f,items:i,className:m,asChild:E=!1}){const[s,u]=o.useState(!1),[p,y]=o.useState({top:0,left:0}),[x,d]=o.useState(0),l=o.useRef(null),v=e=>{e.preventDefault(),y({top:e.clientY,left:e.clientX}),u(!0),d(w())};o.useLayoutEffect(()=>{if(!s||!l.current)return;const e=l.current.getBoundingClientRect(),n=window.innerWidth,t=window.innerHeight;let{top:c,left:a}=p;const b=8;a+e.width>n-b&&(a=a-e.width),c+e.height>t-b&&(c=c-e.height),l.current.style.top=`${c}px`,l.current.style.left=`${a}px`,l.current.focus()},[s,p]);const w=()=>i.findIndex(e=>e.type!=="separator"&&!e.disabled),j=()=>{for(let e=i.length-1;e>=0;e--){const n=i[e];if(n.type!=="separator"&&!n.disabled)return e}return 0},h=e=>{let n=x;const t=i.length;if(t!==0)for(let c=0;c<t;c++){n=(n+e+t)%t;const a=i[n];if(a.type!=="separator"&&!a.disabled){d(n);break}}},C=e=>{const{key:n}=e;if(n==="ArrowDown")e.preventDefault(),h(1);else if(n==="ArrowUp")e.preventDefault(),h(-1);else if(n==="Home")e.preventDefault(),d(w());else if(n==="End")e.preventDefault(),d(j());else if(n==="Enter"||n===" "){e.preventDefault();const t=i[x];t&&!t.disabled&&t.onSelect&&(t.onSelect(),u(!1))}};o.useEffect(()=>{if(!s)return;const e=n=>{n.key==="Escape"&&u(!1)};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[s]),o.useEffect(()=>{if(s)return S.onClickOutside(l,()=>u(!1))},[s]),o.useEffect(()=>{if(!s)return;const e=()=>u(!1);return window.addEventListener("resize",e),window.addEventListener("scroll",e,!0),()=>{window.removeEventListener("resize",e),window.removeEventListener("scroll",e,!0)}},[s]);const D=()=>E&&o.isValidElement(f)?o.cloneElement(f,{onContextMenu:e=>{v(e);const n=f.props;n.onContextMenu&&n.onContextMenu(e)}}):r.jsx("div",{onContextMenu:v,className:"nui-contextmenu-wrapper",children:f});return r.jsxs(r.Fragment,{children:[D(),s&&r.jsx(k.Portal,{children:r.jsx("div",{ref:l,className:g.cn("nui-contextmenu",m),role:"menu",tabIndex:-1,style:{position:"fixed",top:p.top,left:p.left},onKeyDown:C,children:i.map((e,n)=>{if(e.type==="separator")return r.jsx("div",{className:"nui-contextmenu-separator",role:"separator"},`sep-${n}`);const t=n===x;return r.jsxs("div",{className:g.cn("nui-contextmenu-item",e.disabled&&"disabled",e.danger&&"danger",t&&"active"),role:"menuitem",tabIndex:-1,"aria-disabled":e.disabled||void 0,onMouseEnter:()=>!e.disabled&&d(n),onClick:()=>{e.disabled||(e.onSelect?.(),u(!1))},children:[e.icon&&r.jsx("span",{className:"nui-contextmenu-icon",children:e.icon}),r.jsx("span",{className:"nui-contextmenu-label",children:e.label}),!e.icon&&r.jsx("span",{className:"nui-contextmenu-icon-placeholder"})]},`item-${n}`)})})})]})}exports.ContextMenu=L;
2
2
  //# sourceMappingURL=ContextMenu.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ContextMenu.cjs","sources":["../../../src/components/contextmenu/ContextMenu.tsx"],"sourcesContent":["/**\r\n * ContextMenu.tsx — FINAL VERSION\r\n * --------------------------------\r\n * Features:\r\n * - Right-click (contextmenu)\r\n * - Arrow key navigation\r\n * - Roving tabIndex\r\n * - ESC + click outside to close\r\n * - Portal rendering\r\n * - Separators + icons + danger items\r\n */\r\n/**\r\n * ContextMenu.tsx — FINAL CLEAN VERSION\r\n * --------------------------------------\r\n * Features:\r\n * - Right-click context menu\r\n * - Keyboard navigation (ArrowUp/Down, Home, End, Enter)\r\n * - ESC + click outside to close\r\n * - Roving active index\r\n * - Portal rendering\r\n * - Separators + icons + danger/disabled\r\n * - 100% TypeScript safe\r\n */\r\n\r\nimport React, {\r\n useEffect,\r\n useRef,\r\n useState,\r\n ReactNode,\r\n KeyboardEvent as ReactKeyboardEvent,\r\n} from 'react';\r\nimport './ContextMenu.css';\r\nimport { Portal, onClickOutside } from '../../utils/index';\r\n\r\nexport interface MenuItem {\r\n label?: string;\r\n icon?: ReactNode;\r\n onSelect?: () => void;\r\n danger?: boolean;\r\n disabled?: boolean;\r\n type?: 'item' | 'separator';\r\n}\r\n\r\ninterface ContextMenuProps {\r\n trigger: ReactNode;\r\n items: MenuItem[];\r\n className?: string;\r\n}\r\n\r\nexport function ContextMenu({\r\n trigger,\r\n items,\r\n className = '',\r\n}: ContextMenuProps) {\r\n const [open, setOpen] = useState(false);\r\n const [pos, setPos] = useState<{ top: number; left: number } | null>(null);\r\n\r\n const menuRef = useRef<HTMLDivElement | null>(null);\r\n\r\n // active index for keyboard navigation\r\n const [activeIndex, setActiveIndex] = useState<number>(0);\r\n\r\n const handleContext = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n setPos({ top: e.clientY, left: e.clientX });\r\n setOpen(true);\r\n setActiveIndex(getFirstEnabledIndex());\r\n };\r\n\r\n /** Returns index of first enabled, non-separator item */\r\n const getFirstEnabledIndex = () => {\r\n return items.findIndex((i) => i.type !== 'separator' && !i.disabled);\r\n };\r\n\r\n /** Returns index of last enabled, non-separator item */\r\n const getLastEnabledIndex = () => {\r\n for (let i = items.length - 1; i >= 0; i--) {\r\n const it = items[i];\r\n if (it.type !== 'separator' && !it.disabled) return i;\r\n }\r\n return 0;\r\n };\r\n\r\n /** Move selection up/down */\r\n const move = (direction: 1 | -1) => {\r\n let idx = activeIndex;\r\n\r\n while (true) {\r\n idx = idx + direction;\r\n\r\n if (idx < 0) idx = items.length - 1;\r\n if (idx >= items.length) idx = 0;\r\n\r\n const it = items[idx];\r\n if (it.type !== 'separator' && !it.disabled) {\r\n setActiveIndex(idx);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n /** Keyboard events inside menu */\r\n const handleKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>) => {\r\n const { key } = e;\r\n\r\n if (key === 'ArrowDown') {\r\n e.preventDefault();\r\n move(1);\r\n } else if (key === 'ArrowUp') {\r\n e.preventDefault();\r\n move(-1);\r\n } else if (key === 'Home') {\r\n e.preventDefault();\r\n setActiveIndex(getFirstEnabledIndex());\r\n } else if (key === 'End') {\r\n e.preventDefault();\r\n setActiveIndex(getLastEnabledIndex());\r\n } else if (key === 'Enter' || key === ' ') {\r\n e.preventDefault();\r\n const it = items[activeIndex];\r\n if (it && !it.disabled && it.onSelect) {\r\n it.onSelect();\r\n setOpen(false);\r\n }\r\n }\r\n };\r\n\r\n /** ESC close – FIXED TYPE (no TS errors) */\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const handler = (e: globalThis.KeyboardEvent) => {\r\n if (e.key === 'Escape') setOpen(false);\r\n };\r\n\r\n document.addEventListener('keydown', handler as EventListener);\r\n return () =>\r\n document.removeEventListener('keydown', handler as EventListener);\r\n }, [open]);\r\n\r\n /** Click outside to close */\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(menuRef, () => setOpen(false));\r\n }, [open]);\r\n\r\n return (\r\n <div className=\"ui-contextmenu-wrapper\">\r\n <div onContextMenu={handleContext}>{trigger}</div>\r\n\r\n {open && pos && (\r\n <Portal>\r\n <div\r\n ref={menuRef}\r\n className={`ui-contextmenu ${className}`}\r\n role=\"menu\"\r\n tabIndex={-1}\r\n style={{\r\n top: pos.top,\r\n left: pos.left,\r\n position: 'fixed',\r\n }}\r\n onKeyDown={handleKeyDown}\r\n >\r\n {items.map((item, idx) => {\r\n if (item.type === 'separator') {\r\n return <div key={idx} className=\"ui-contextmenu-separator\" />;\r\n }\r\n\r\n const isActive = idx === activeIndex;\r\n\r\n return (\r\n <div\r\n key={idx}\r\n className={[\r\n 'ui-contextmenu-item',\r\n item.disabled ? 'disabled' : '',\r\n item.danger ? 'danger' : '',\r\n isActive ? 'active' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"menuitem\"\r\n tabIndex={-1}\r\n aria-disabled={item.disabled || undefined}\r\n onMouseEnter={() => setActiveIndex(idx)}\r\n onClick={() => {\r\n if (!item.disabled) {\r\n item.onSelect?.();\r\n setOpen(false);\r\n }\r\n }}\r\n >\r\n {item.icon && (\r\n <span className=\"ui-contextmenu-icon\">{item.icon}</span>\r\n )}\r\n <span>{item.label}</span>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </Portal>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["ContextMenu","trigger","items","className","open","setOpen","useState","pos","setPos","menuRef","useRef","activeIndex","setActiveIndex","handleContext","getFirstEnabledIndex","i","getLastEnabledIndex","it","move","direction","idx","handleKeyDown","key","useEffect","handler","e","onClickOutside","jsxs","jsx","Portal","item","isActive"],"mappings":"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"}
1
+ {"version":3,"file":"ContextMenu.cjs","sources":["../../../src/components/contextmenu/ContextMenu.tsx"],"sourcesContent":["\"use client\";\n\nimport React, {\n useEffect,\n useRef,\n useState,\n useLayoutEffect,\n ReactNode,\n KeyboardEvent as ReactKeyboardEvent,\n} from 'react';\nimport { cn, Portal, onClickOutside } from '../../utils';\nimport './ContextMenu.css';\n\n/* ============================================================\n * Types\n * ============================================================ */\n\nexport interface ContextMenuItem {\n label?: string;\n icon?: ReactNode;\n onSelect?: () => void;\n danger?: boolean;\n disabled?: boolean;\n type?: 'item' | 'separator';\n}\n\nexport interface ContextMenuProps {\n children: ReactNode;\n items: ContextMenuItem[];\n className?: string;\n /** * If true, the ContextMenu will not wrap children in a <div>.\n * Instead, it clones the child and directly attaches the onContextMenu event.\n * Child MUST be a valid single React Element. \n */\n asChild?: boolean; \n}\n\n/* ============================================================\n * Component\n * ============================================================ */\n\n/**\n * ContextMenu Component\n * * A custom right-click menu that replaces the browser's native context menu.\n */\nexport function ContextMenu({\n children,\n items,\n className,\n asChild = false,\n}: ContextMenuProps) {\n const [open, setOpen] = useState(false);\n const [pos, setPos] = useState({ top: 0, left: 0 });\n const [activeIndex, setActiveIndex] = useState<number>(0);\n\n const menuRef = useRef<HTMLDivElement | null>(null);\n\n /* ----------------------------------------------------\n Opening & Collision Detection\n ---------------------------------------------------- */\n const handleContext = (e: React.MouseEvent) => {\n e.preventDefault();\n \n // 1. Set initial position to exact mouse coordinates\n setPos({ top: e.clientY, left: e.clientX });\n setOpen(true);\n setActiveIndex(getFirstEnabledIndex());\n };\n\n // * Architecture Note: We use useLayoutEffect instead of useEffect here.\n // This runs synchronously immediately after React updates the DOM but BEFORE the browser\n // paints it to the screen. This ensures the collision-detection coordinate shift \n // happens instantly without a visual \"jump\".\n useLayoutEffect(() => {\n if (!open || !menuRef.current) return;\n\n // 2. Adjust position if it collides with viewport edges\n const menuRect = menuRef.current.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let { top, left } = pos;\n const padding = 8; // Keep it slightly away from the exact edge\n\n // Collision Right\n if (left + menuRect.width > viewportWidth - padding) {\n left = left - menuRect.width;\n }\n // Collision Bottom\n if (top + menuRect.height > viewportHeight - padding) {\n top = top - menuRect.height;\n }\n\n // Apply adjustments directly to the DOM to avoid triggering another React render cycle\n menuRef.current.style.top = `${top}px`;\n menuRef.current.style.left = `${left}px`;\n \n // 3. Force focus onto the menu so keyboard events (ArrowDown, etc) work immediately\n menuRef.current.focus();\n\n }, [open, pos]);\n\n /* ----------------------------------------------------\n Keyboard Navigation Helpers\n ---------------------------------------------------- */\n const getFirstEnabledIndex = () => {\n return items.findIndex((i) => i.type !== 'separator' && !i.disabled);\n };\n\n const getLastEnabledIndex = () => {\n for (let i = items.length - 1; i >= 0; i--) {\n const it = items[i];\n if (it.type !== 'separator' && !it.disabled) return i;\n }\n return 0;\n };\n\n const move = (direction: 1 | -1) => {\n let idx = activeIndex;\n const len = items.length;\n\n if (len === 0) return;\n\n // Loop until we find a valid item, preventing infinite loops\n for (let i = 0; i < len; i++) {\n idx = (idx + direction + len) % len;\n const it = items[idx];\n if (it.type !== 'separator' && !it.disabled) {\n setActiveIndex(idx);\n break;\n }\n }\n };\n\n /* ----------------------------------------------------\n Event Listeners\n ---------------------------------------------------- */\n const handleKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>) => {\n const { key } = e;\n\n if (key === 'ArrowDown') {\n e.preventDefault();\n move(1);\n } else if (key === 'ArrowUp') {\n e.preventDefault();\n move(-1);\n } else if (key === 'Home') {\n e.preventDefault();\n setActiveIndex(getFirstEnabledIndex());\n } else if (key === 'End') {\n e.preventDefault();\n setActiveIndex(getLastEnabledIndex());\n } else if (key === 'Enter' || key === ' ') {\n e.preventDefault();\n const it = items[activeIndex];\n if (it && !it.disabled && it.onSelect) {\n it.onSelect();\n setOpen(false);\n }\n }\n };\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n return onClickOutside(menuRef, () => setOpen(false));\n }, [open]);\n\n // Hide context menu on scroll or window resize\n useEffect(() => {\n if (!open) return;\n const handleScrollOrResize = () => setOpen(false);\n window.addEventListener('resize', handleScrollOrResize);\n window.addEventListener('scroll', handleScrollOrResize, true);\n return () => {\n window.removeEventListener('resize', handleScrollOrResize);\n window.removeEventListener('scroll', handleScrollOrResize, true);\n };\n }, [open]);\n\n /* ----------------------------------------------------\n Render\n ---------------------------------------------------- */\n \n const renderTrigger = () => {\n // * Polymorphic Architecture:\n // When asChild is true, we clone the user's React element and attach the onContextMenu \n // event directly to it. This avoids creating unnecessary <div> wrappers in the DOM.\n if (asChild && React.isValidElement(children)) {\n return React.cloneElement(children, {\n onContextMenu: (e: React.MouseEvent<Element>) => {\n handleContext(e);\n \n const childProps = children.props as React.DOMAttributes<Element>;\n if (childProps.onContextMenu) {\n childProps.onContextMenu(e);\n }\n }\n } as React.DOMAttributes<Element>);\n }\n\n return (\n <div onContextMenu={handleContext} className=\"nui-contextmenu-wrapper\">\n {children}\n </div>\n );\n };\n\n return (\n <>\n {renderTrigger()}\n\n {open && (\n <Portal>\n <div\n ref={menuRef}\n className={cn(\"nui-contextmenu\", className)}\n role=\"menu\"\n tabIndex={-1} \n style={{ position: 'fixed', top: pos.top, left: pos.left }}\n onKeyDown={handleKeyDown}\n >\n {items.map((item, idx) => {\n if (item.type === 'separator') {\n return <div key={`sep-${idx}`} className=\"nui-contextmenu-separator\" role=\"separator\" />;\n }\n\n const isActive = idx === activeIndex;\n\n return (\n <div\n key={`item-${idx}`}\n className={cn(\n \"nui-contextmenu-item\",\n item.disabled && \"disabled\",\n item.danger && \"danger\",\n isActive && \"active\"\n )}\n role=\"menuitem\"\n tabIndex={-1}\n aria-disabled={item.disabled || undefined}\n onMouseEnter={() => !item.disabled && setActiveIndex(idx)}\n onClick={() => {\n if (!item.disabled) {\n item.onSelect?.();\n setOpen(false);\n }\n }}\n >\n {item.icon && (\n <span className=\"nui-contextmenu-icon\">{item.icon}</span>\n )}\n <span className=\"nui-contextmenu-label\">{item.label}</span>\n \n {!item.icon && <span className=\"nui-contextmenu-icon-placeholder\" />}\n </div>\n );\n })}\n </div>\n </Portal>\n )}\n </>\n );\n}"],"names":["ContextMenu","children","items","className","asChild","open","setOpen","useState","pos","setPos","activeIndex","setActiveIndex","menuRef","useRef","handleContext","getFirstEnabledIndex","useLayoutEffect","menuRect","viewportWidth","viewportHeight","top","left","padding","i","getLastEnabledIndex","it","move","direction","idx","len","handleKeyDown","key","useEffect","handler","e","onClickOutside","handleScrollOrResize","renderTrigger","React","childProps","jsxs","Fragment","Portal","jsx","cn","item","isActive"],"mappings":"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"}
@@ -1,97 +1,118 @@
1
- import { jsxs as v, jsx as r } from "react/jsx-runtime";
2
- import { useState as c, useRef as E, useEffect as x } from "react";
1
+ import { jsxs as b, Fragment as N, jsx as a } from "react/jsx-runtime";
2
+ import E, { useState as m, useRef as M, useLayoutEffect as R, useEffect as v } from "react";
3
3
  /* empty css */
4
- import { onClickOutside as g } from "../../utils/onclickoutside/onClickOutside.js";
5
- import { Portal as k } from "../../utils/portal/portal.js";
6
- function j({
7
- trigger: b,
4
+ import { onClickOutside as S } from "../../utils/onclickoutside/onClickOutside.js";
5
+ import { Portal as A } from "../../utils/portal/portal.js";
6
+ import { cn as y } from "../../utils/cn/cn.js";
7
+ function K({
8
+ children: u,
8
9
  items: o,
9
- className: m = ""
10
+ className: C,
11
+ asChild: D = !1
10
12
  }) {
11
- const [l, a] = c(!1), [i, h] = c(null), f = E(null), [d, s] = c(0), y = (e) => {
12
- e.preventDefault(), h({ top: e.clientY, left: e.clientX }), a(!0), s(u());
13
- }, u = () => o.findIndex((e) => e.type !== "separator" && !e.disabled), w = () => {
13
+ const [r, c] = m(!1), [f, L] = m({ top: 0, left: 0 }), [p, d] = m(0), s = M(null), w = (e) => {
14
+ e.preventDefault(), L({ top: e.clientY, left: e.clientX }), c(!0), d(x());
15
+ };
16
+ R(() => {
17
+ if (!r || !s.current) return;
18
+ const e = s.current.getBoundingClientRect(), n = window.innerWidth, t = window.innerHeight;
19
+ let { top: i, left: l } = f;
20
+ const g = 8;
21
+ l + e.width > n - g && (l = l - e.width), i + e.height > t - g && (i = i - e.height), s.current.style.top = `${i}px`, s.current.style.left = `${l}px`, s.current.focus();
22
+ }, [r, f]);
23
+ const x = () => o.findIndex((e) => e.type !== "separator" && !e.disabled), k = () => {
14
24
  for (let e = o.length - 1; e >= 0; e--) {
15
25
  const n = o[e];
16
26
  if (n.type !== "separator" && !n.disabled) return e;
17
27
  }
18
28
  return 0;
19
- }, p = (e) => {
20
- let n = d;
21
- for (; ; ) {
22
- n = n + e, n < 0 && (n = o.length - 1), n >= o.length && (n = 0);
23
- const t = o[n];
24
- if (t.type !== "separator" && !t.disabled) {
25
- s(n);
26
- break;
29
+ }, h = (e) => {
30
+ let n = p;
31
+ const t = o.length;
32
+ if (t !== 0)
33
+ for (let i = 0; i < t; i++) {
34
+ n = (n + e + t) % t;
35
+ const l = o[n];
36
+ if (l.type !== "separator" && !l.disabled) {
37
+ d(n);
38
+ break;
39
+ }
27
40
  }
28
- }
29
- }, D = (e) => {
41
+ }, I = (e) => {
30
42
  const { key: n } = e;
31
43
  if (n === "ArrowDown")
32
- e.preventDefault(), p(1);
44
+ e.preventDefault(), h(1);
33
45
  else if (n === "ArrowUp")
34
- e.preventDefault(), p(-1);
46
+ e.preventDefault(), h(-1);
35
47
  else if (n === "Home")
36
- e.preventDefault(), s(u());
48
+ e.preventDefault(), d(x());
37
49
  else if (n === "End")
38
- e.preventDefault(), s(w());
50
+ e.preventDefault(), d(k());
39
51
  else if (n === "Enter" || n === " ") {
40
52
  e.preventDefault();
41
- const t = o[d];
42
- t && !t.disabled && t.onSelect && (t.onSelect(), a(!1));
53
+ const t = o[p];
54
+ t && !t.disabled && t.onSelect && (t.onSelect(), c(!1));
43
55
  }
44
56
  };
45
- return x(() => {
46
- if (!l) return;
57
+ return v(() => {
58
+ if (!r) return;
47
59
  const e = (n) => {
48
- n.key === "Escape" && a(!1);
60
+ n.key === "Escape" && c(!1);
49
61
  };
50
62
  return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
51
- }, [l]), x(() => {
52
- if (l)
53
- return g(f, () => a(!1));
54
- }, [l]), /* @__PURE__ */ v("div", { className: "ui-contextmenu-wrapper", children: [
55
- /* @__PURE__ */ r("div", { onContextMenu: y, children: b }),
56
- l && i && /* @__PURE__ */ r(k, { children: /* @__PURE__ */ r(
63
+ }, [r]), v(() => {
64
+ if (r)
65
+ return S(s, () => c(!1));
66
+ }, [r]), v(() => {
67
+ if (!r) return;
68
+ const e = () => c(!1);
69
+ return window.addEventListener("resize", e), window.addEventListener("scroll", e, !0), () => {
70
+ window.removeEventListener("resize", e), window.removeEventListener("scroll", e, !0);
71
+ };
72
+ }, [r]), /* @__PURE__ */ b(N, { children: [
73
+ D && E.isValidElement(u) ? E.cloneElement(u, {
74
+ onContextMenu: (e) => {
75
+ w(e);
76
+ const n = u.props;
77
+ n.onContextMenu && n.onContextMenu(e);
78
+ }
79
+ }) : /* @__PURE__ */ a("div", { onContextMenu: w, className: "nui-contextmenu-wrapper", children: u }),
80
+ r && /* @__PURE__ */ a(A, { children: /* @__PURE__ */ a(
57
81
  "div",
58
82
  {
59
- ref: f,
60
- className: `ui-contextmenu ${m}`,
83
+ ref: s,
84
+ className: y("nui-contextmenu", C),
61
85
  role: "menu",
62
86
  tabIndex: -1,
63
- style: {
64
- top: i.top,
65
- left: i.left,
66
- position: "fixed"
67
- },
68
- onKeyDown: D,
87
+ style: { position: "fixed", top: f.top, left: f.left },
88
+ onKeyDown: I,
69
89
  children: o.map((e, n) => {
70
90
  if (e.type === "separator")
71
- return /* @__PURE__ */ r("div", { className: "ui-contextmenu-separator" }, n);
72
- const t = n === d;
73
- return /* @__PURE__ */ v(
91
+ return /* @__PURE__ */ a("div", { className: "nui-contextmenu-separator", role: "separator" }, `sep-${n}`);
92
+ const t = n === p;
93
+ return /* @__PURE__ */ b(
74
94
  "div",
75
95
  {
76
- className: [
77
- "ui-contextmenu-item",
78
- e.disabled ? "disabled" : "",
79
- e.danger ? "danger" : "",
80
- t ? "active" : ""
81
- ].filter(Boolean).join(" "),
96
+ className: y(
97
+ "nui-contextmenu-item",
98
+ e.disabled && "disabled",
99
+ e.danger && "danger",
100
+ t && "active"
101
+ ),
82
102
  role: "menuitem",
83
103
  tabIndex: -1,
84
104
  "aria-disabled": e.disabled || void 0,
85
- onMouseEnter: () => s(n),
105
+ onMouseEnter: () => !e.disabled && d(n),
86
106
  onClick: () => {
87
- e.disabled || (e.onSelect?.(), a(!1));
107
+ e.disabled || (e.onSelect?.(), c(!1));
88
108
  },
89
109
  children: [
90
- e.icon && /* @__PURE__ */ r("span", { className: "ui-contextmenu-icon", children: e.icon }),
91
- /* @__PURE__ */ r("span", { children: e.label })
110
+ e.icon && /* @__PURE__ */ a("span", { className: "nui-contextmenu-icon", children: e.icon }),
111
+ /* @__PURE__ */ a("span", { className: "nui-contextmenu-label", children: e.label }),
112
+ !e.icon && /* @__PURE__ */ a("span", { className: "nui-contextmenu-icon-placeholder" })
92
113
  ]
93
114
  },
94
- n
115
+ `item-${n}`
95
116
  );
96
117
  })
97
118
  }
@@ -99,6 +120,6 @@ function j({
99
120
  ] });
100
121
  }
101
122
  export {
102
- j as ContextMenu
123
+ K as ContextMenu
103
124
  };
104
125
  //# sourceMappingURL=ContextMenu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ContextMenu.js","sources":["../../../src/components/contextmenu/ContextMenu.tsx"],"sourcesContent":["/**\r\n * ContextMenu.tsx — FINAL VERSION\r\n * --------------------------------\r\n * Features:\r\n * - Right-click (contextmenu)\r\n * - Arrow key navigation\r\n * - Roving tabIndex\r\n * - ESC + click outside to close\r\n * - Portal rendering\r\n * - Separators + icons + danger items\r\n */\r\n/**\r\n * ContextMenu.tsx — FINAL CLEAN VERSION\r\n * --------------------------------------\r\n * Features:\r\n * - Right-click context menu\r\n * - Keyboard navigation (ArrowUp/Down, Home, End, Enter)\r\n * - ESC + click outside to close\r\n * - Roving active index\r\n * - Portal rendering\r\n * - Separators + icons + danger/disabled\r\n * - 100% TypeScript safe\r\n */\r\n\r\nimport React, {\r\n useEffect,\r\n useRef,\r\n useState,\r\n ReactNode,\r\n KeyboardEvent as ReactKeyboardEvent,\r\n} from 'react';\r\nimport './ContextMenu.css';\r\nimport { Portal, onClickOutside } from '../../utils/index';\r\n\r\nexport interface MenuItem {\r\n label?: string;\r\n icon?: ReactNode;\r\n onSelect?: () => void;\r\n danger?: boolean;\r\n disabled?: boolean;\r\n type?: 'item' | 'separator';\r\n}\r\n\r\ninterface ContextMenuProps {\r\n trigger: ReactNode;\r\n items: MenuItem[];\r\n className?: string;\r\n}\r\n\r\nexport function ContextMenu({\r\n trigger,\r\n items,\r\n className = '',\r\n}: ContextMenuProps) {\r\n const [open, setOpen] = useState(false);\r\n const [pos, setPos] = useState<{ top: number; left: number } | null>(null);\r\n\r\n const menuRef = useRef<HTMLDivElement | null>(null);\r\n\r\n // active index for keyboard navigation\r\n const [activeIndex, setActiveIndex] = useState<number>(0);\r\n\r\n const handleContext = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n setPos({ top: e.clientY, left: e.clientX });\r\n setOpen(true);\r\n setActiveIndex(getFirstEnabledIndex());\r\n };\r\n\r\n /** Returns index of first enabled, non-separator item */\r\n const getFirstEnabledIndex = () => {\r\n return items.findIndex((i) => i.type !== 'separator' && !i.disabled);\r\n };\r\n\r\n /** Returns index of last enabled, non-separator item */\r\n const getLastEnabledIndex = () => {\r\n for (let i = items.length - 1; i >= 0; i--) {\r\n const it = items[i];\r\n if (it.type !== 'separator' && !it.disabled) return i;\r\n }\r\n return 0;\r\n };\r\n\r\n /** Move selection up/down */\r\n const move = (direction: 1 | -1) => {\r\n let idx = activeIndex;\r\n\r\n while (true) {\r\n idx = idx + direction;\r\n\r\n if (idx < 0) idx = items.length - 1;\r\n if (idx >= items.length) idx = 0;\r\n\r\n const it = items[idx];\r\n if (it.type !== 'separator' && !it.disabled) {\r\n setActiveIndex(idx);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n /** Keyboard events inside menu */\r\n const handleKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>) => {\r\n const { key } = e;\r\n\r\n if (key === 'ArrowDown') {\r\n e.preventDefault();\r\n move(1);\r\n } else if (key === 'ArrowUp') {\r\n e.preventDefault();\r\n move(-1);\r\n } else if (key === 'Home') {\r\n e.preventDefault();\r\n setActiveIndex(getFirstEnabledIndex());\r\n } else if (key === 'End') {\r\n e.preventDefault();\r\n setActiveIndex(getLastEnabledIndex());\r\n } else if (key === 'Enter' || key === ' ') {\r\n e.preventDefault();\r\n const it = items[activeIndex];\r\n if (it && !it.disabled && it.onSelect) {\r\n it.onSelect();\r\n setOpen(false);\r\n }\r\n }\r\n };\r\n\r\n /** ESC close – FIXED TYPE (no TS errors) */\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const handler = (e: globalThis.KeyboardEvent) => {\r\n if (e.key === 'Escape') setOpen(false);\r\n };\r\n\r\n document.addEventListener('keydown', handler as EventListener);\r\n return () =>\r\n document.removeEventListener('keydown', handler as EventListener);\r\n }, [open]);\r\n\r\n /** Click outside to close */\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(menuRef, () => setOpen(false));\r\n }, [open]);\r\n\r\n return (\r\n <div className=\"ui-contextmenu-wrapper\">\r\n <div onContextMenu={handleContext}>{trigger}</div>\r\n\r\n {open && pos && (\r\n <Portal>\r\n <div\r\n ref={menuRef}\r\n className={`ui-contextmenu ${className}`}\r\n role=\"menu\"\r\n tabIndex={-1}\r\n style={{\r\n top: pos.top,\r\n left: pos.left,\r\n position: 'fixed',\r\n }}\r\n onKeyDown={handleKeyDown}\r\n >\r\n {items.map((item, idx) => {\r\n if (item.type === 'separator') {\r\n return <div key={idx} className=\"ui-contextmenu-separator\" />;\r\n }\r\n\r\n const isActive = idx === activeIndex;\r\n\r\n return (\r\n <div\r\n key={idx}\r\n className={[\r\n 'ui-contextmenu-item',\r\n item.disabled ? 'disabled' : '',\r\n item.danger ? 'danger' : '',\r\n isActive ? 'active' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"menuitem\"\r\n tabIndex={-1}\r\n aria-disabled={item.disabled || undefined}\r\n onMouseEnter={() => setActiveIndex(idx)}\r\n onClick={() => {\r\n if (!item.disabled) {\r\n item.onSelect?.();\r\n setOpen(false);\r\n }\r\n }}\r\n >\r\n {item.icon && (\r\n <span className=\"ui-contextmenu-icon\">{item.icon}</span>\r\n )}\r\n <span>{item.label}</span>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </Portal>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["ContextMenu","trigger","items","className","open","setOpen","useState","pos","setPos","menuRef","useRef","activeIndex","setActiveIndex","handleContext","getFirstEnabledIndex","i","getLastEnabledIndex","it","move","direction","idx","handleKeyDown","key","useEffect","handler","e","onClickOutside","jsxs","jsx","Portal","item","isActive"],"mappings":"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"}
1
+ {"version":3,"file":"ContextMenu.js","sources":["../../../src/components/contextmenu/ContextMenu.tsx"],"sourcesContent":["\"use client\";\n\nimport React, {\n useEffect,\n useRef,\n useState,\n useLayoutEffect,\n ReactNode,\n KeyboardEvent as ReactKeyboardEvent,\n} from 'react';\nimport { cn, Portal, onClickOutside } from '../../utils';\nimport './ContextMenu.css';\n\n/* ============================================================\n * Types\n * ============================================================ */\n\nexport interface ContextMenuItem {\n label?: string;\n icon?: ReactNode;\n onSelect?: () => void;\n danger?: boolean;\n disabled?: boolean;\n type?: 'item' | 'separator';\n}\n\nexport interface ContextMenuProps {\n children: ReactNode;\n items: ContextMenuItem[];\n className?: string;\n /** * If true, the ContextMenu will not wrap children in a <div>.\n * Instead, it clones the child and directly attaches the onContextMenu event.\n * Child MUST be a valid single React Element. \n */\n asChild?: boolean; \n}\n\n/* ============================================================\n * Component\n * ============================================================ */\n\n/**\n * ContextMenu Component\n * * A custom right-click menu that replaces the browser's native context menu.\n */\nexport function ContextMenu({\n children,\n items,\n className,\n asChild = false,\n}: ContextMenuProps) {\n const [open, setOpen] = useState(false);\n const [pos, setPos] = useState({ top: 0, left: 0 });\n const [activeIndex, setActiveIndex] = useState<number>(0);\n\n const menuRef = useRef<HTMLDivElement | null>(null);\n\n /* ----------------------------------------------------\n Opening & Collision Detection\n ---------------------------------------------------- */\n const handleContext = (e: React.MouseEvent) => {\n e.preventDefault();\n \n // 1. Set initial position to exact mouse coordinates\n setPos({ top: e.clientY, left: e.clientX });\n setOpen(true);\n setActiveIndex(getFirstEnabledIndex());\n };\n\n // * Architecture Note: We use useLayoutEffect instead of useEffect here.\n // This runs synchronously immediately after React updates the DOM but BEFORE the browser\n // paints it to the screen. This ensures the collision-detection coordinate shift \n // happens instantly without a visual \"jump\".\n useLayoutEffect(() => {\n if (!open || !menuRef.current) return;\n\n // 2. Adjust position if it collides with viewport edges\n const menuRect = menuRef.current.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let { top, left } = pos;\n const padding = 8; // Keep it slightly away from the exact edge\n\n // Collision Right\n if (left + menuRect.width > viewportWidth - padding) {\n left = left - menuRect.width;\n }\n // Collision Bottom\n if (top + menuRect.height > viewportHeight - padding) {\n top = top - menuRect.height;\n }\n\n // Apply adjustments directly to the DOM to avoid triggering another React render cycle\n menuRef.current.style.top = `${top}px`;\n menuRef.current.style.left = `${left}px`;\n \n // 3. Force focus onto the menu so keyboard events (ArrowDown, etc) work immediately\n menuRef.current.focus();\n\n }, [open, pos]);\n\n /* ----------------------------------------------------\n Keyboard Navigation Helpers\n ---------------------------------------------------- */\n const getFirstEnabledIndex = () => {\n return items.findIndex((i) => i.type !== 'separator' && !i.disabled);\n };\n\n const getLastEnabledIndex = () => {\n for (let i = items.length - 1; i >= 0; i--) {\n const it = items[i];\n if (it.type !== 'separator' && !it.disabled) return i;\n }\n return 0;\n };\n\n const move = (direction: 1 | -1) => {\n let idx = activeIndex;\n const len = items.length;\n\n if (len === 0) return;\n\n // Loop until we find a valid item, preventing infinite loops\n for (let i = 0; i < len; i++) {\n idx = (idx + direction + len) % len;\n const it = items[idx];\n if (it.type !== 'separator' && !it.disabled) {\n setActiveIndex(idx);\n break;\n }\n }\n };\n\n /* ----------------------------------------------------\n Event Listeners\n ---------------------------------------------------- */\n const handleKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>) => {\n const { key } = e;\n\n if (key === 'ArrowDown') {\n e.preventDefault();\n move(1);\n } else if (key === 'ArrowUp') {\n e.preventDefault();\n move(-1);\n } else if (key === 'Home') {\n e.preventDefault();\n setActiveIndex(getFirstEnabledIndex());\n } else if (key === 'End') {\n e.preventDefault();\n setActiveIndex(getLastEnabledIndex());\n } else if (key === 'Enter' || key === ' ') {\n e.preventDefault();\n const it = items[activeIndex];\n if (it && !it.disabled && it.onSelect) {\n it.onSelect();\n setOpen(false);\n }\n }\n };\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n return onClickOutside(menuRef, () => setOpen(false));\n }, [open]);\n\n // Hide context menu on scroll or window resize\n useEffect(() => {\n if (!open) return;\n const handleScrollOrResize = () => setOpen(false);\n window.addEventListener('resize', handleScrollOrResize);\n window.addEventListener('scroll', handleScrollOrResize, true);\n return () => {\n window.removeEventListener('resize', handleScrollOrResize);\n window.removeEventListener('scroll', handleScrollOrResize, true);\n };\n }, [open]);\n\n /* ----------------------------------------------------\n Render\n ---------------------------------------------------- */\n \n const renderTrigger = () => {\n // * Polymorphic Architecture:\n // When asChild is true, we clone the user's React element and attach the onContextMenu \n // event directly to it. This avoids creating unnecessary <div> wrappers in the DOM.\n if (asChild && React.isValidElement(children)) {\n return React.cloneElement(children, {\n onContextMenu: (e: React.MouseEvent<Element>) => {\n handleContext(e);\n \n const childProps = children.props as React.DOMAttributes<Element>;\n if (childProps.onContextMenu) {\n childProps.onContextMenu(e);\n }\n }\n } as React.DOMAttributes<Element>);\n }\n\n return (\n <div onContextMenu={handleContext} className=\"nui-contextmenu-wrapper\">\n {children}\n </div>\n );\n };\n\n return (\n <>\n {renderTrigger()}\n\n {open && (\n <Portal>\n <div\n ref={menuRef}\n className={cn(\"nui-contextmenu\", className)}\n role=\"menu\"\n tabIndex={-1} \n style={{ position: 'fixed', top: pos.top, left: pos.left }}\n onKeyDown={handleKeyDown}\n >\n {items.map((item, idx) => {\n if (item.type === 'separator') {\n return <div key={`sep-${idx}`} className=\"nui-contextmenu-separator\" role=\"separator\" />;\n }\n\n const isActive = idx === activeIndex;\n\n return (\n <div\n key={`item-${idx}`}\n className={cn(\n \"nui-contextmenu-item\",\n item.disabled && \"disabled\",\n item.danger && \"danger\",\n isActive && \"active\"\n )}\n role=\"menuitem\"\n tabIndex={-1}\n aria-disabled={item.disabled || undefined}\n onMouseEnter={() => !item.disabled && setActiveIndex(idx)}\n onClick={() => {\n if (!item.disabled) {\n item.onSelect?.();\n setOpen(false);\n }\n }}\n >\n {item.icon && (\n <span className=\"nui-contextmenu-icon\">{item.icon}</span>\n )}\n <span className=\"nui-contextmenu-label\">{item.label}</span>\n \n {!item.icon && <span className=\"nui-contextmenu-icon-placeholder\" />}\n </div>\n );\n })}\n </div>\n </Portal>\n )}\n </>\n );\n}"],"names":["ContextMenu","children","items","className","asChild","open","setOpen","useState","pos","setPos","activeIndex","setActiveIndex","menuRef","useRef","handleContext","getFirstEnabledIndex","useLayoutEffect","menuRect","viewportWidth","viewportHeight","top","left","padding","i","getLastEnabledIndex","it","move","direction","idx","len","handleKeyDown","key","useEffect","handler","e","onClickOutside","handleScrollOrResize","jsxs","Fragment","React","childProps","Portal","jsx","cn","item","isActive"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),u=require("react");;/* empty css */function O({columns:D,rows:g,page:w,pageSize:m=10,onPageChange:I,selectable:v=!1,selectedRowIds:y,onSelectionChange:b,onRowClick:M,renderRowActions:C,className:E="",disablePagination:x=!1}){const[c,T]=u.useState({key:null,dir:null}),[q,A]=u.useState(1),d=w??q,[B,P]=u.useState(new Set),p=y??B,h=u.useMemo(()=>x?1:Math.max(1,Math.ceil(g.length/m)),[g.length,m,x]),N=u.useMemo(()=>{if(!c.key||!c.dir)return[...g];const e=c.key,t=c.dir==="asc"?1:-1;return[...g].sort((s,a)=>{const i=s[e],r=a[e];return i===void 0&&r!==void 0?-1*t:r===void 0&&i!==void 0?1*t:typeof i=="number"&&typeof r=="number"?(i-r)*t:i instanceof Date&&r instanceof Date?(i.getTime()-r.getTime())*t:String(i??"").localeCompare(String(r??""))*t})},[g,c]),l=u.useMemo(()=>{if(x)return N;const e=(d-1)*m;return N.slice(e,e+m)},[N,d,m,x]),[k,o]=u.useState(null),j=(e,t)=>e.id??`row-${t}-${Math.random().toString(36).slice(2,7)}`,F=e=>{T(t=>t.key!==e?{key:e,dir:"asc"}:t.dir==="asc"?{key:e,dir:"desc"}:{key:null,dir:null})},f=e=>{const t=Math.max(1,Math.min(h,e));w===void 0&&A(t),I?.(t)},S=e=>{const t=s=>{const a=new Set(s);return a.has(e)?a.delete(e):a.add(e),a};if(y){const s=t(p);b?.(s)}else P(s=>{const a=t(s);return b?.(a),a})},G=()=>{const e=l.map((a,i)=>a.id??j(a,i)),t=e.every(a=>p.has(a)),s=a=>{const i=new Set(a);return t?e.forEach(r=>i.delete(r)):e.forEach(r=>i.add(r)),i};if(y){const a=s(p);b?.(a)}else P(a=>{const i=s(a);return b?.(i),i})},K=e=>{if(l.length!==0)switch(e.key){case"ArrowDown":e.preventDefault(),o(t=>t===null?0:Math.min(l.length-1,t+1));break;case"ArrowUp":e.preventDefault(),o(t=>t===null?0:Math.max(0,t-1));break;case"PageDown":e.preventDefault(),f(d+1),o(0);break;case"PageUp":e.preventDefault(),f(d-1),o(0);break;case"Home":e.preventDefault(),o(0);break;case"End":e.preventDefault(),o(l.length-1);break;case"Enter":if(e.preventDefault(),k!==null){const t=l[k],s=t.id??j(t,k);v&&S(s),M?.(t)}break}},$=!!C;return n.jsx("div",{className:`ui-datagrid ${E}`,onKeyDown:K,tabIndex:0,role:"grid","aria-rowcount":g.length,children:n.jsxs("div",{className:"ui-datagrid-table",children:[n.jsxs("div",{className:"ui-datagrid-header",role:"row",children:[v&&n.jsx("div",{className:"ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--select",children:n.jsx("input",{type:"checkbox","aria-label":"Select all on page",onChange:G,checked:l.length>0&&l.every((e,t)=>p.has(e.id??j(e,t)))})}),D.map(e=>{const t=c.key===e.key;return n.jsx("div",{className:`ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--${e.align??"left"}`,role:"columnheader",style:{width:e.width},"aria-sort":t?c.dir==="asc"?"ascending":"descending":"none",onClick:()=>e.sortable&&F(e.key),children:n.jsxs("div",{className:"ui-datagrid-header-content",children:[n.jsx("span",{children:e.title}),e.sortable&&n.jsx("span",{className:"ui-datagrid-sort-indicator",children:t?c.dir==="asc"?"":"":""})]})},e.key)}),$&&n.jsx("div",{className:"ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--actions"})]}),n.jsx("div",{className:"ui-datagrid-body",role:"rowgroup",children:l.length===0?n.jsx("div",{className:"ui-datagrid-empty",children:"No data"}):l.map((e,t)=>{const s=e.id??j(e,t),a=p.has(s),i=k===t;return n.jsxs("div",{className:["ui-datagrid-row",a?"selected":"",i?"focused":""].filter(Boolean).join(" "),role:"row",tabIndex:i?0:-1,"aria-selected":a||void 0,onClick:()=>{v&&S(s),M?.(e),o(t)},onFocus:()=>o(t),children:[v&&n.jsx("div",{className:"ui-datagrid-cell ui-datagrid-cell--select",children:n.jsx("input",{type:"checkbox",checked:a,onClick:r=>r.stopPropagation(),onChange:()=>S(s),"aria-label":`Select row ${String(s)}`})}),D.map(r=>n.jsx("div",{role:"gridcell",className:`ui-datagrid-cell ui-datagrid-cell--${r.align??"left"}`,style:{width:r.width},children:r.render?r.render(e):String(e[r.key]??"")},r.key)),$&&n.jsx("div",{className:"ui-datagrid-cell ui-datagrid-cell--actions",children:C?.(e)})]},String(s))})}),!x&&h>1&&n.jsxs("div",{className:"ui-datagrid-footer",children:[n.jsx("button",{className:"ui-datagrid-page-btn",onClick:()=>f(1),disabled:d===1,children:"«"}),n.jsx("button",{className:"ui-datagrid-page-btn",onClick:()=>f(d-1),disabled:d===1,children:""}),n.jsxs("div",{className:"ui-datagrid-page-info",children:["Page ",d," of ",h]}),n.jsx("button",{className:"ui-datagrid-page-btn",onClick:()=>f(d+1),disabled:d===h,children:""}),n.jsx("button",{className:"ui-datagrid-page-btn",onClick:()=>f(h),disabled:d===h,children:"»"})]})]})})}exports.DataGrid=O;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),h=require("react");;/* empty css */const N=require("../../utils/cn/cn.cjs");function U({columns:g,rows:l,page:C,pageSize:x=10,onPageChange:F,selectable:f=!1,selectedRowIds:v,onSelectionChange:j,onRowClick:w,renderRowActions:L,className:I,disablePagination:p=!1}){const[d,q]=h.useState({key:null,dir:null}),[T,W]=h.useState(1),u=C??T,[E,A]=h.useState(new Set),k=v??E,m=h.useMemo(()=>p||l.length===0?1:Math.ceil(l.length/x),[l.length,x,p]),S=h.useMemo(()=>{if(!d.key||!d.dir)return[...l];const e=d.key,t=d.dir==="asc"?1:-1,i=g.find(r=>r.key===e);return[...l].sort((r,s)=>{if(i?.sortFn)return d.dir==="asc"?i.sortFn(r,s):i.sortFn(s,r);const a=r[e],c=s[e];return a===c?0:a==null?-1*t:c==null?1*t:typeof a=="number"&&typeof c=="number"?(a-c)*t:a instanceof Date&&c instanceof Date?(a.getTime()-c.getTime())*t:String(a).localeCompare(String(c))*t})},[l,d,g]),o=h.useMemo(()=>{if(p)return S;const e=(u-1)*x;return S.slice(e,e+x)},[S,u,x,p]),[y,D]=h.useState(null),b=(e,t)=>e.id??`row-${t}`,G=e=>{q(t=>t.key!==e?{key:e,dir:"asc"}:t.dir==="asc"?{key:e,dir:"desc"}:{key:null,dir:null})},B=e=>{const t=Math.max(1,Math.min(m,e));C===void 0&&W(t),F?.(t)},M=e=>{const t=i=>{const r=new Set(i);return r.has(e)?r.delete(e):r.add(e),r};v?j?.(t(k)):A(i=>{const r=t(i);return j?.(r),r})},K=()=>{const e=o.map((r,s)=>b(r,s)),t=e.every(r=>k.has(r)),i=r=>{const s=new Set(r);return t?e.forEach(a=>s.delete(a)):e.forEach(a=>s.add(a)),s};v?j?.(i(k)):A(r=>{const s=i(r);return j?.(s),s})},O=e=>{if(o.length!==0)switch(e.key){case"ArrowDown":e.preventDefault(),D(t=>t===null?0:Math.min(o.length-1,t+1));break;case"ArrowUp":e.preventDefault(),D(t=>t===null?0:Math.max(0,t-1));break;case"Enter":case" ":if(e.preventDefault(),y!==null){const t=o[y],i=b(t,y);f&&M(i),w?.(t)}break}},P=!!L,R=o.length>0&&o.every((e,t)=>k.has(b(e,t)));return n.jsxs("div",{className:N.cn("nui-datagrid-root",I),children:[n.jsx("div",{className:"nui-datagrid-table-wrapper",onKeyDown:O,tabIndex:0,children:n.jsxs("table",{className:"nui-datagrid-table",role:"grid","aria-rowcount":l.length,children:[n.jsx("thead",{className:"nui-datagrid-thead",children:n.jsxs("tr",{role:"row",children:[f&&n.jsx("th",{className:"nui-datagrid-th nui-datagrid-th--select",scope:"col",children:n.jsx("input",{type:"checkbox","aria-label":"Select all on page",onChange:K,checked:R,className:"nui-datagrid-checkbox"})}),g.map(e=>{const t=d.key===e.key;return n.jsx("th",{className:"nui-datagrid-th",style:{width:e.width,textAlign:e.align||"left"},scope:"col","aria-sort":t?d.dir==="asc"?"ascending":"descending":"none",children:n.jsxs("div",{className:N.cn("nui-datagrid-th-content",e.sortable&&"sortable",e.align==="right"&&"justify-end",e.align==="center"&&"justify-center"),onClick:()=>e.sortable&&G(e.key),children:[n.jsx("span",{className:"nui-datagrid-th-title",children:e.title}),e.sortable&&n.jsx("span",{className:N.cn("nui-datagrid-sort-icon",t&&"active"),children:t&&d.dir==="desc"?n.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:n.jsx("path",{d:"m6 9 6 6 6-6"})}):n.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:n.jsx("path",{d:"m18 15-6-6-6 6"})})})]})},e.key)}),P&&n.jsx("th",{className:"nui-datagrid-th nui-datagrid-th--actions",scope:"col"})]})}),n.jsx("tbody",{className:"nui-datagrid-tbody",role:"rowgroup",children:o.length===0?n.jsx("tr",{children:n.jsx("td",{colSpan:g.length+(f?1:0)+(P?1:0),className:"nui-datagrid-empty",children:"No data available"})}):o.map((e,t)=>{const i=b(e,t),r=k.has(i),s=y===t;return n.jsxs("tr",{role:"row",tabIndex:-1,"aria-selected":r,className:N.cn("nui-datagrid-tr",r&&"selected",s&&"focused",w&&"clickable"),onClick:()=>{f&&M(i),w?.(e),D(t)},children:[f&&n.jsx("td",{className:"nui-datagrid-td nui-datagrid-td--select",children:n.jsx("input",{type:"checkbox",checked:r,onClick:a=>a.stopPropagation(),onChange:()=>M(i),"aria-label":"Select row",className:"nui-datagrid-checkbox"})}),g.map(a=>n.jsx("td",{role:"gridcell",className:"nui-datagrid-td",style:{textAlign:a.align||"left"},children:a.render?a.render(e):String(e[a.key]??"")},a.key)),P&&n.jsx("td",{className:"nui-datagrid-td nui-datagrid-td--actions",onClick:a=>a.stopPropagation(),children:L?.(e)})]},String(i))})})]})}),!p&&m>1&&n.jsxs("div",{className:"nui-datagrid-pagination",children:[n.jsxs("span",{className:"nui-datagrid-page-info",children:["Page ",u," of ",m]}),n.jsxs("div",{className:"nui-datagrid-page-controls",children:[n.jsx("button",{className:"nui-datagrid-page-btn",onClick:()=>B(u-1),disabled:u===1,"aria-label":"Previous Page",children:n.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:n.jsx("polyline",{points:"15 18 9 12 15 6"})})}),n.jsx("button",{className:"nui-datagrid-page-btn",onClick:()=>B(u+1),disabled:u===m,"aria-label":"Next Page",children:n.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:n.jsx("polyline",{points:"9 18 15 12 9 6"})})})]})]})]})}exports.DataGrid=U;
2
2
  //# sourceMappingURL=DataGrid.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataGrid.cjs","sources":["../../../src/components/datagrid/DataGrid.tsx"],"sourcesContent":["/**\r\n * DataGrid.tsx\r\n * -------------\r\n * Vercel-style DataGrid for NUI\r\n *\r\n * Features:\r\n * - Sortable columns\r\n * - Sticky header\r\n * - Optional row selection (checkbox)\r\n * - Row actions slot\r\n * - Pagination (client-side)\r\n * - Keyboard navigation & focus\r\n * - Accessible (aria-sort, aria-selected, table/grid roles)\r\n */\r\n\r\nimport React, { useMemo, useState } from 'react';\r\nimport './DataGrid.css';\r\n\r\nexport type DataRow = Record<string, unknown> & {\r\n id?: string | number;\r\n};\r\n\r\nexport type DataGridColumn<T extends DataRow = DataRow> = {\r\n key: keyof T & string;\r\n title: React.ReactNode;\r\n sortable?: boolean;\r\n width?: number | string;\r\n align?: 'left' | 'center' | 'right';\r\n render?: (row: T) => React.ReactNode;\r\n};\r\n\r\nexport interface DataGridProps<T extends DataRow = DataRow> {\r\n columns: DataGridColumn<T>[];\r\n rows: T[];\r\n\r\n page?: number;\r\n pageSize?: number;\r\n onPageChange?: (page: number) => void;\r\n\r\n selectable?: boolean;\r\n selectedRowIds?: Set<string | number>;\r\n onSelectionChange?: (ids: Set<string | number>) => void;\r\n\r\n onRowClick?: (row: T) => void;\r\n renderRowActions?: (row: T) => React.ReactNode;\r\n\r\n className?: string;\r\n disablePagination?: boolean;\r\n}\r\n\r\ntype SortState = { key: string | null; dir: 'asc' | 'desc' | null };\r\n\r\nexport function DataGrid<T extends DataRow = DataRow>({\r\n columns,\r\n rows,\r\n page: controlledPage,\r\n pageSize = 10,\r\n onPageChange,\r\n\r\n selectable = false,\r\n selectedRowIds,\r\n onSelectionChange,\r\n\r\n onRowClick,\r\n renderRowActions,\r\n className = '',\r\n disablePagination = false,\r\n}: DataGridProps<T>) {\r\n const [sort, setSort] = useState<SortState>({ key: null, dir: null });\r\n const [internalPage, setInternalPage] = useState(1);\r\n const currentPage = controlledPage ?? internalPage;\r\n\r\n const [internalSelection, setInternalSelection] = useState<\r\n Set<string | number>\r\n >(new Set());\r\n\r\n const selection = selectedRowIds ?? internalSelection;\r\n\r\n const totalPages = useMemo(() => {\r\n if (disablePagination) return 1;\r\n return Math.max(1, Math.ceil(rows.length / pageSize));\r\n }, [rows.length, pageSize, disablePagination]);\r\n\r\n const sortedRows = useMemo(() => {\r\n if (!sort.key || !sort.dir) return [...rows];\r\n\r\n const key = sort.key as keyof T;\r\n const dir = sort.dir === 'asc' ? 1 : -1;\r\n\r\n return [...rows].sort((a, b) => {\r\n const va = a[key];\r\n const vb = b[key];\r\n\r\n if (va === undefined && vb !== undefined) return -1 * dir;\r\n if (vb === undefined && va !== undefined) return 1 * dir;\r\n\r\n if (typeof va === 'number' && typeof vb === 'number') {\r\n return (va - vb) * dir;\r\n }\r\n\r\n if (va instanceof Date && vb instanceof Date) {\r\n return (va.getTime() - vb.getTime()) * dir;\r\n }\r\n\r\n return String(va ?? '').localeCompare(String(vb ?? '')) * dir;\r\n });\r\n }, [rows, sort]);\r\n\r\n const paginatedRows = useMemo(() => {\r\n if (disablePagination) return sortedRows;\r\n const start = (currentPage - 1) * pageSize;\r\n return sortedRows.slice(start, start + pageSize);\r\n }, [sortedRows, currentPage, pageSize, disablePagination]);\r\n\r\n const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\r\n\r\n const rowId = (r: T, idx: number) =>\r\n r.id ?? `row-${idx}-${Math.random().toString(36).slice(2, 7)}`;\r\n\r\n const toggleSort = (key: string) => {\r\n setSort((prev) => {\r\n if (prev.key !== key) return { key, dir: 'asc' };\r\n if (prev.dir === 'asc') return { key, dir: 'desc' };\r\n return { key: null, dir: null };\r\n });\r\n };\r\n\r\n const setPage = (page: number) => {\r\n const next = Math.max(1, Math.min(totalPages, page));\r\n if (controlledPage === undefined) setInternalPage(next);\r\n onPageChange?.(next);\r\n };\r\n\r\n const toggleSelectRow = (id: string | number) => {\r\n const update = (set: Set<string | number>) => {\r\n const next = new Set(set);\r\n if (next.has(id)) next.delete(id);\r\n else next.add(id);\r\n return next;\r\n };\r\n\r\n if (selectedRowIds) {\r\n const next = update(selection);\r\n onSelectionChange?.(next);\r\n } else {\r\n setInternalSelection((prev) => {\r\n const next = update(prev);\r\n onSelectionChange?.(next);\r\n return next;\r\n });\r\n }\r\n };\r\n\r\n const selectAllOnPage = () => {\r\n const ids = paginatedRows.map((r, i) => r.id ?? rowId(r, i));\r\n const allSelected = ids.every((id) => selection.has(id));\r\n\r\n const update = (set: Set<string | number>) => {\r\n const next = new Set(set);\r\n if (allSelected) ids.forEach((id) => next.delete(id));\r\n else ids.forEach((id) => next.add(id));\r\n return next;\r\n };\r\n\r\n if (selectedRowIds) {\r\n const next = update(selection);\r\n onSelectionChange?.(next);\r\n } else {\r\n setInternalSelection((prev) => {\r\n const next = update(prev);\r\n onSelectionChange?.(next);\r\n return next;\r\n });\r\n }\r\n };\r\n\r\n const onKeyDownTable = (e: React.KeyboardEvent<HTMLDivElement>): void => {\r\n if (paginatedRows.length === 0) return;\r\n\r\n switch (e.key) {\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n setFocusedIndex((prev) =>\r\n prev === null ? 0 : Math.min(paginatedRows.length - 1, prev + 1)\r\n );\r\n break;\r\n\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n setFocusedIndex((prev) => (prev === null ? 0 : Math.max(0, prev - 1)));\r\n break;\r\n\r\n case 'PageDown':\r\n e.preventDefault();\r\n setPage(currentPage + 1);\r\n setFocusedIndex(0);\r\n break;\r\n\r\n case 'PageUp':\r\n e.preventDefault();\r\n setPage(currentPage - 1);\r\n setFocusedIndex(0);\r\n break;\r\n\r\n case 'Home':\r\n e.preventDefault();\r\n setFocusedIndex(0);\r\n break;\r\n\r\n case 'End':\r\n e.preventDefault();\r\n setFocusedIndex(paginatedRows.length - 1);\r\n break;\r\n\r\n case 'Enter':\r\n e.preventDefault();\r\n if (focusedIndex !== null) {\r\n const row = paginatedRows[focusedIndex];\r\n const id = row.id ?? rowId(row, focusedIndex);\r\n if (selectable) toggleSelectRow(id);\r\n onRowClick?.(row);\r\n }\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n const showActions = Boolean(renderRowActions);\r\n\r\n return (\r\n <div\r\n className={`ui-datagrid ${className}`}\r\n onKeyDown={onKeyDownTable}\r\n tabIndex={0}\r\n role=\"grid\"\r\n aria-rowcount={rows.length}\r\n >\r\n <div className=\"ui-datagrid-table\">\r\n {/* HEADER */}\r\n <div className=\"ui-datagrid-header\" role=\"row\">\r\n {selectable && (\r\n <div className=\"ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--select\">\r\n <input\r\n type=\"checkbox\"\r\n aria-label=\"Select all on page\"\r\n onChange={selectAllOnPage}\r\n checked={\r\n paginatedRows.length > 0 &&\r\n paginatedRows.every((r, i) =>\r\n selection.has(r.id ?? rowId(r, i))\r\n )\r\n }\r\n />\r\n </div>\r\n )}\r\n\r\n {columns.map((col) => {\r\n const isSorted = sort.key === col.key;\r\n return (\r\n <div\r\n key={col.key}\r\n className={`ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--${\r\n col.align ?? 'left'\r\n }`}\r\n role=\"columnheader\"\r\n style={{ width: col.width }}\r\n aria-sort={\r\n isSorted\r\n ? sort.dir === 'asc'\r\n ? 'ascending'\r\n : 'descending'\r\n : 'none'\r\n }\r\n onClick={() => col.sortable && toggleSort(col.key)}\r\n >\r\n <div className=\"ui-datagrid-header-content\">\r\n <span>{col.title}</span>\r\n {col.sortable && (\r\n <span className=\"ui-datagrid-sort-indicator\">\r\n {isSorted ? (sort.dir === 'asc' ? '▲' : '▼') : '⤓'}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n\r\n {showActions && (\r\n <div className=\"ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--actions\" />\r\n )}\r\n </div>\r\n\r\n {/* BODY */}\r\n <div className=\"ui-datagrid-body\" role=\"rowgroup\">\r\n {paginatedRows.length === 0 ? (\r\n <div className=\"ui-datagrid-empty\">No data</div>\r\n ) : (\r\n paginatedRows.map((row, idx) => {\r\n const rid = row.id ?? rowId(row, idx);\r\n const isSelected = selection.has(rid);\r\n const focused = focusedIndex === idx;\r\n\r\n return (\r\n <div\r\n key={String(rid)}\r\n className={[\r\n 'ui-datagrid-row',\r\n isSelected ? 'selected' : '',\r\n focused ? 'focused' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"row\"\r\n tabIndex={focused ? 0 : -1}\r\n aria-selected={isSelected || undefined}\r\n onClick={() => {\r\n if (selectable) toggleSelectRow(rid);\r\n onRowClick?.(row);\r\n setFocusedIndex(idx);\r\n }}\r\n onFocus={() => setFocusedIndex(idx)}\r\n >\r\n {selectable && (\r\n <div className=\"ui-datagrid-cell ui-datagrid-cell--select\">\r\n <input\r\n type=\"checkbox\"\r\n checked={isSelected}\r\n onClick={(e) => e.stopPropagation()}\r\n onChange={() => toggleSelectRow(rid)}\r\n aria-label={`Select row ${String(rid)}`}\r\n />\r\n </div>\r\n )}\r\n\r\n {columns.map((col) => (\r\n <div\r\n key={col.key}\r\n role=\"gridcell\"\r\n className={`ui-datagrid-cell ui-datagrid-cell--${\r\n col.align ?? 'left'\r\n }`}\r\n style={{ width: col.width }}\r\n >\r\n {col.render\r\n ? col.render(row)\r\n : String(row[col.key] ?? '')}\r\n </div>\r\n ))}\r\n\r\n {showActions && (\r\n <div className=\"ui-datagrid-cell ui-datagrid-cell--actions\">\r\n {renderRowActions?.(row)}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n\r\n {/* PAGINATION */}\r\n {!disablePagination && totalPages > 1 && (\r\n <div className=\"ui-datagrid-footer\">\r\n <button\r\n className=\"ui-datagrid-page-btn\"\r\n onClick={() => setPage(1)}\r\n disabled={currentPage === 1}\r\n >\r\n «\r\n </button>\r\n\r\n <button\r\n className=\"ui-datagrid-page-btn\"\r\n onClick={() => setPage(currentPage - 1)}\r\n disabled={currentPage === 1}\r\n >\r\n ‹\r\n </button>\r\n\r\n <div className=\"ui-datagrid-page-info\">\r\n Page {currentPage} of {totalPages}\r\n </div>\r\n\r\n <button\r\n className=\"ui-datagrid-page-btn\"\r\n onClick={() => setPage(currentPage + 1)}\r\n disabled={currentPage === totalPages}\r\n >\r\n ›\r\n </button>\r\n\r\n <button\r\n className=\"ui-datagrid-page-btn\"\r\n onClick={() => setPage(totalPages)}\r\n disabled={currentPage === totalPages}\r\n >\r\n »\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["DataGrid","columns","rows","controlledPage","pageSize","onPageChange","selectable","selectedRowIds","onSelectionChange","onRowClick","renderRowActions","className","disablePagination","sort","setSort","useState","internalPage","setInternalPage","currentPage","internalSelection","setInternalSelection","selection","totalPages","useMemo","sortedRows","key","dir","a","b","va","vb","paginatedRows","start","focusedIndex","setFocusedIndex","rowId","r","idx","toggleSort","prev","setPage","page","next","toggleSelectRow","id","update","set","selectAllOnPage","ids","allSelected","onKeyDownTable","row","showActions","jsx","jsxs","i","col","isSorted","rid","isSelected","focused","e"],"mappings":"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"}
1
+ {"version":3,"file":"DataGrid.cjs","sources":["../../../src/components/datagrid/DataGrid.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useMemo, useState } from 'react';\nimport { cn } from '../../utils';\nimport './DataGrid.css';\n\n/* ============================================================\n * Types\n * ============================================================ */\n\nexport type DataRow = Record<string, unknown> & {\n /** Strongly recommended to provide an ID for reliable row selection */\n id?: string | number;\n};\n\nexport type DataGridColumn<T> = {\n /** The key must exist on the generic type T */\n key: Extract<keyof T, string>;\n title: React.ReactNode;\n sortable?: boolean;\n width?: number | string;\n align?: 'left' | 'center' | 'right';\n /** Custom render function for the cell content. Useful for formatting dates or rendering JSX. */\n render?: (row: T) => React.ReactNode;\n /** Custom sort function. If omitted, the grid falls back to a robust default string/number sort. */\n sortFn?: (a: T, b: T) => number; \n};\n\nexport interface DataGridProps<T> {\n columns: DataGridColumn<T>[];\n rows: T[];\n /** Controlled page number */\n page?: number;\n pageSize?: number;\n onPageChange?: (page: number) => void;\n selectable?: boolean;\n /** Controlled selection state */\n selectedRowIds?: Set<string | number>;\n onSelectionChange?: (ids: Set<string | number>) => void;\n onRowClick?: (row: T) => void;\n /** Renders a floating action column on the far right of the grid */\n renderRowActions?: (row: T) => React.ReactNode;\n className?: string;\n disablePagination?: boolean;\n}\n\ntype SortState = { key: string | null; dir: 'asc' | 'desc' | null };\n\n/* ============================================================\n * Component\n * ============================================================ */\n\n/**\n * DataGrid Component\n * * A highly performant, accessible table for displaying structured data.\n */\nexport function DataGrid<T>({\n columns,\n rows,\n page: controlledPage,\n pageSize = 10,\n onPageChange,\n selectable = false,\n selectedRowIds,\n onSelectionChange,\n onRowClick,\n renderRowActions,\n className,\n disablePagination = false,\n}: DataGridProps<T>) {\n const [sort, setSort] = useState<SortState>({ key: null, dir: null });\n const [internalPage, setInternalPage] = useState(1);\n const currentPage = controlledPage ?? internalPage;\n\n const [internalSelection, setInternalSelection] = useState<Set<string | number>>(new Set());\n const selection = selectedRowIds ?? internalSelection;\n\n /* ----------------------------------------------------\n Data Processing Engine\n ---------------------------------------------------- */\n const totalPages = useMemo(() => {\n if (disablePagination || rows.length === 0) return 1;\n return Math.ceil(rows.length / pageSize);\n }, [rows.length, pageSize, disablePagination]);\n\n const sortedRows = useMemo(() => {\n if (!sort.key || !sort.dir) return [...rows];\n\n const key = sort.key as keyof T;\n const dir = sort.dir === 'asc' ? 1 : -1;\n const column = columns.find(c => c.key === key);\n\n return [...rows].sort((a, b) => {\n // 1. Custom Sort Function override\n if (column?.sortFn) {\n return sort.dir === 'asc' ? column.sortFn(a, b) : column.sortFn(b, a);\n }\n\n // 2. Default Universal Sort\n const va = a[key];\n const vb = b[key];\n\n if (va === vb) return 0;\n if (va === undefined || va === null) return -1 * dir;\n if (vb === undefined || vb === null) return 1 * dir;\n\n if (typeof va === 'number' && typeof vb === 'number') return (va - vb) * dir;\n if (va instanceof Date && vb instanceof Date) return (va.getTime() - vb.getTime()) * dir;\n\n return String(va).localeCompare(String(vb)) * dir;\n });\n }, [rows, sort, columns]);\n\n const paginatedRows = useMemo(() => {\n if (disablePagination) return sortedRows;\n const start = (currentPage - 1) * pageSize;\n return sortedRows.slice(start, start + pageSize);\n }, [sortedRows, currentPage, pageSize, disablePagination]);\n\n /* ----------------------------------------------------\n Event Handlers\n ---------------------------------------------------- */\n const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\n\n const getRowId = (r: T, idx: number) => {\n // Safely cast to extract ID, fallback to index if missing\n const row = r as { id?: string | number };\n return row.id ?? `row-${idx}`;\n };\n\n const toggleSort = (key: string) => {\n setSort((prev) => {\n // Cycle state: asc -> desc -> un-sorted\n if (prev.key !== key) return { key, dir: 'asc' };\n if (prev.dir === 'asc') return { key, dir: 'desc' };\n return { key: null, dir: null };\n });\n };\n\n const setPage = (page: number) => {\n const next = Math.max(1, Math.min(totalPages, page));\n if (controlledPage === undefined) setInternalPage(next);\n onPageChange?.(next);\n };\n\n const toggleSelectRow = (id: string | number) => {\n const update = (set: Set<string | number>) => {\n const next = new Set(set);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n };\n\n if (selectedRowIds) {\n onSelectionChange?.(update(selection));\n } else {\n setInternalSelection((prev) => {\n const next = update(prev);\n onSelectionChange?.(next);\n return next;\n });\n }\n };\n\n const selectAllOnPage = () => {\n const ids = paginatedRows.map((r, i) => getRowId(r, i));\n const allSelected = ids.every((id) => selection.has(id));\n\n const update = (set: Set<string | number>) => {\n const next = new Set(set);\n if (allSelected) ids.forEach((id) => next.delete(id));\n else ids.forEach((id) => next.add(id));\n return next;\n };\n\n if (selectedRowIds) {\n onSelectionChange?.(update(selection));\n } else {\n setInternalSelection((prev) => {\n const next = update(prev);\n onSelectionChange?.(next);\n return next;\n });\n }\n };\n\n const onKeyDownTable = (e: React.KeyboardEvent<HTMLDivElement>): void => {\n if (paginatedRows.length === 0) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n setFocusedIndex((prev) => prev === null ? 0 : Math.min(paginatedRows.length - 1, prev + 1));\n break;\n case 'ArrowUp':\n e.preventDefault();\n setFocusedIndex((prev) => (prev === null ? 0 : Math.max(0, prev - 1)));\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (focusedIndex !== null) {\n const row = paginatedRows[focusedIndex];\n const id = getRowId(row, focusedIndex);\n if (selectable) toggleSelectRow(id);\n onRowClick?.(row);\n }\n break;\n default:\n break;\n }\n };\n\n const showActions = Boolean(renderRowActions);\n const isAllPageSelected = paginatedRows.length > 0 && paginatedRows.every((r, i) => selection.has(getRowId(r, i)));\n\n /* ----------------------------------------------------\n Render\n ---------------------------------------------------- */\n return (\n <div className={cn(\"nui-datagrid-root\", className)}>\n <div \n className=\"nui-datagrid-table-wrapper\"\n onKeyDown={onKeyDownTable}\n tabIndex={0}\n >\n <table className=\"nui-datagrid-table\" role=\"grid\" aria-rowcount={rows.length}>\n \n {/* HEADER */}\n <thead className=\"nui-datagrid-thead\">\n <tr role=\"row\">\n {selectable && (\n <th className=\"nui-datagrid-th nui-datagrid-th--select\" scope=\"col\">\n <input\n type=\"checkbox\"\n aria-label=\"Select all on page\"\n onChange={selectAllOnPage}\n checked={isAllPageSelected}\n className=\"nui-datagrid-checkbox\"\n />\n </th>\n )}\n\n {columns.map((col) => {\n const isSorted = sort.key === col.key;\n return (\n <th\n key={col.key}\n className=\"nui-datagrid-th\"\n style={{ \n width: col.width,\n textAlign: col.align || 'left'\n }}\n scope=\"col\"\n aria-sort={isSorted ? (sort.dir === 'asc' ? 'ascending' : 'descending') : 'none'}\n >\n <div \n className={cn(\n \"nui-datagrid-th-content\",\n col.sortable && \"sortable\",\n col.align === 'right' && \"justify-end\",\n col.align === 'center' && \"justify-center\"\n )}\n onClick={() => col.sortable && toggleSort(col.key)}\n >\n <span className=\"nui-datagrid-th-title\">{col.title}</span>\n {col.sortable && (\n <span className={cn(\"nui-datagrid-sort-icon\", isSorted && \"active\")}>\n {isSorted && sort.dir === 'desc' ? (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"m6 9 6 6 6-6\"/></svg>\n ) : (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"m18 15-6-6-6 6\"/></svg>\n )}\n </span>\n )}\n </div>\n </th>\n );\n })}\n\n {showActions && <th className=\"nui-datagrid-th nui-datagrid-th--actions\" scope=\"col\"></th>}\n </tr>\n </thead>\n\n {/* BODY */}\n <tbody className=\"nui-datagrid-tbody\" role=\"rowgroup\">\n {paginatedRows.length === 0 ? (\n <tr>\n <td colSpan={columns.length + (selectable ? 1 : 0) + (showActions ? 1 : 0)} className=\"nui-datagrid-empty\">\n No data available\n </td>\n </tr>\n ) : (\n paginatedRows.map((row, idx) => {\n const rid = getRowId(row, idx);\n const isSelected = selection.has(rid);\n const isFocused = focusedIndex === idx;\n\n return (\n <tr\n key={String(rid)}\n role=\"row\"\n tabIndex={-1}\n aria-selected={isSelected}\n className={cn(\n \"nui-datagrid-tr\",\n isSelected && \"selected\",\n isFocused && \"focused\",\n onRowClick && \"clickable\"\n )}\n onClick={() => {\n if (selectable) toggleSelectRow(rid);\n onRowClick?.(row);\n setFocusedIndex(idx);\n }}\n >\n {selectable && (\n <td className=\"nui-datagrid-td nui-datagrid-td--select\">\n <input\n type=\"checkbox\"\n checked={isSelected}\n onClick={(e) => e.stopPropagation()}\n onChange={() => toggleSelectRow(rid)}\n aria-label={`Select row`}\n className=\"nui-datagrid-checkbox\"\n />\n </td>\n )}\n\n {columns.map((col) => (\n <td\n key={col.key}\n role=\"gridcell\"\n className=\"nui-datagrid-td\"\n style={{ textAlign: col.align || 'left' }}\n >\n {col.render ? col.render(row) : String(row[col.key] ?? '')}\n </td>\n ))}\n\n {showActions && (\n <td className=\"nui-datagrid-td nui-datagrid-td--actions\" onClick={(e) => e.stopPropagation()}>\n {renderRowActions?.(row)}\n </td>\n )}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n\n {/* PAGINATION */}\n {!disablePagination && totalPages > 1 && (\n <div className=\"nui-datagrid-pagination\">\n <span className=\"nui-datagrid-page-info\">\n Page {currentPage} of {totalPages}\n </span>\n <div className=\"nui-datagrid-page-controls\">\n <button\n className=\"nui-datagrid-page-btn\"\n onClick={() => setPage(currentPage - 1)}\n disabled={currentPage === 1}\n aria-label=\"Previous Page\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><polyline points=\"15 18 9 12 15 6\"></polyline></svg>\n </button>\n <button\n className=\"nui-datagrid-page-btn\"\n onClick={() => setPage(currentPage + 1)}\n disabled={currentPage === totalPages}\n aria-label=\"Next Page\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><polyline points=\"9 18 15 12 9 6\"></polyline></svg>\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}"],"names":["DataGrid","columns","rows","controlledPage","pageSize","onPageChange","selectable","selectedRowIds","onSelectionChange","onRowClick","renderRowActions","className","disablePagination","sort","setSort","useState","internalPage","setInternalPage","currentPage","internalSelection","setInternalSelection","selection","totalPages","useMemo","sortedRows","key","dir","column","c","a","b","va","vb","paginatedRows","start","focusedIndex","setFocusedIndex","getRowId","r","idx","toggleSort","prev","setPage","page","next","toggleSelectRow","id","update","set","selectAllOnPage","ids","i","allSelected","onKeyDownTable","row","showActions","isAllPageSelected","cn","jsx","jsxs","col","isSorted","rid","isSelected","isFocused","e"],"mappings":"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"}