@nofinite/nui 1.1.2 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. package/README.md +61 -48
  2. package/dist/components/accordion/Accordion.cjs +1 -1
  3. package/dist/components/accordion/Accordion.cjs.map +1 -1
  4. package/dist/components/accordion/Accordion.js +64 -43
  5. package/dist/components/accordion/Accordion.js.map +1 -1
  6. package/dist/components/alert/Alert.cjs +1 -1
  7. package/dist/components/alert/Alert.cjs.map +1 -1
  8. package/dist/components/alert/Alert.js +39 -25
  9. package/dist/components/alert/Alert.js.map +1 -1
  10. package/dist/components/avatar/Avatar.cjs +1 -1
  11. package/dist/components/avatar/Avatar.cjs.map +1 -1
  12. package/dist/components/avatar/Avatar.js +58 -44
  13. package/dist/components/avatar/Avatar.js.map +1 -1
  14. package/dist/components/avatar/AvatarGroup.cjs +1 -1
  15. package/dist/components/avatar/AvatarGroup.cjs.map +1 -1
  16. package/dist/components/avatar/AvatarGroup.js +34 -25
  17. package/dist/components/avatar/AvatarGroup.js.map +1 -1
  18. package/dist/components/badge/Badge.cjs +1 -1
  19. package/dist/components/badge/Badge.cjs.map +1 -1
  20. package/dist/components/badge/Badge.js +43 -68
  21. package/dist/components/badge/Badge.js.map +1 -1
  22. package/dist/components/badge/BadgeGroup.cjs +1 -1
  23. package/dist/components/badge/BadgeGroup.cjs.map +1 -1
  24. package/dist/components/badge/BadgeGroup.js +20 -10
  25. package/dist/components/badge/BadgeGroup.js.map +1 -1
  26. package/dist/components/breadcrumbs/Breadcrumbs.cjs +1 -1
  27. package/dist/components/breadcrumbs/Breadcrumbs.cjs.map +1 -1
  28. package/dist/components/breadcrumbs/Breadcrumbs.js +59 -39
  29. package/dist/components/breadcrumbs/Breadcrumbs.js.map +1 -1
  30. package/dist/components/button/Button.cjs +1 -1
  31. package/dist/components/button/Button.cjs.map +1 -1
  32. package/dist/components/button/Button.js +52 -17
  33. package/dist/components/button/Button.js.map +1 -1
  34. package/dist/components/card/Card.cjs +1 -1
  35. package/dist/components/card/Card.cjs.map +1 -1
  36. package/dist/components/card/Card.js +44 -41
  37. package/dist/components/card/Card.js.map +1 -1
  38. package/dist/components/checkbox/Checkbox.cjs +1 -1
  39. package/dist/components/checkbox/Checkbox.cjs.map +1 -1
  40. package/dist/components/checkbox/Checkbox.js +59 -40
  41. package/dist/components/checkbox/Checkbox.js.map +1 -1
  42. package/dist/components/chip/Chip.cjs +1 -1
  43. package/dist/components/chip/Chip.cjs.map +1 -1
  44. package/dist/components/chip/Chip.js +67 -47
  45. package/dist/components/chip/Chip.js.map +1 -1
  46. package/dist/components/combobox/Combobox.cjs +1 -1
  47. package/dist/components/combobox/Combobox.cjs.map +1 -1
  48. package/dist/components/combobox/Combobox.js +123 -108
  49. package/dist/components/combobox/Combobox.js.map +1 -1
  50. package/dist/components/commandpalette/CommandPalette.cjs +1 -1
  51. package/dist/components/commandpalette/CommandPalette.cjs.map +1 -1
  52. package/dist/components/commandpalette/CommandPalette.js +96 -73
  53. package/dist/components/commandpalette/CommandPalette.js.map +1 -1
  54. package/dist/components/contextmenu/ContextMenu.cjs +1 -1
  55. package/dist/components/contextmenu/ContextMenu.cjs.map +1 -1
  56. package/dist/components/contextmenu/ContextMenu.js +79 -58
  57. package/dist/components/contextmenu/ContextMenu.js.map +1 -1
  58. package/dist/components/datagrid/DataGrid.cjs +1 -1
  59. package/dist/components/datagrid/DataGrid.cjs.map +1 -1
  60. package/dist/components/datagrid/DataGrid.js +184 -202
  61. package/dist/components/datagrid/DataGrid.js.map +1 -1
  62. package/dist/components/datepicker/DatePicker.cjs +1 -1
  63. package/dist/components/datepicker/DatePicker.cjs.map +1 -1
  64. package/dist/components/datepicker/DatePicker.js +197 -164
  65. package/dist/components/datepicker/DatePicker.js.map +1 -1
  66. package/dist/components/daterangepicker/DateRangePicker.cjs +1 -1
  67. package/dist/components/daterangepicker/DateRangePicker.cjs.map +1 -1
  68. package/dist/components/daterangepicker/DateRangePicker.js +254 -213
  69. package/dist/components/daterangepicker/DateRangePicker.js.map +1 -1
  70. package/dist/components/dialog/DialogProvider.cjs +2 -0
  71. package/dist/components/dialog/DialogProvider.cjs.map +1 -0
  72. package/dist/components/dialog/DialogProvider.js +71 -0
  73. package/dist/components/dialog/DialogProvider.js.map +1 -0
  74. package/dist/components/dialog/dialogStore.cjs +2 -0
  75. package/dist/components/dialog/dialogStore.cjs.map +1 -0
  76. package/dist/components/dialog/dialogStore.js +60 -0
  77. package/dist/components/dialog/dialogStore.js.map +1 -0
  78. package/dist/components/drawer/Drawer.cjs +1 -1
  79. package/dist/components/drawer/Drawer.cjs.map +1 -1
  80. package/dist/components/drawer/Drawer.js +69 -47
  81. package/dist/components/drawer/Drawer.js.map +1 -1
  82. package/dist/components/dropdown/Dropdown.cjs +1 -1
  83. package/dist/components/dropdown/Dropdown.cjs.map +1 -1
  84. package/dist/components/dropdown/Dropdown.js +134 -108
  85. package/dist/components/dropdown/Dropdown.js.map +1 -1
  86. package/dist/components/fileuploader/FileUploader.cjs +1 -1
  87. package/dist/components/fileuploader/FileUploader.cjs.map +1 -1
  88. package/dist/components/fileuploader/FileUploader.js +96 -61
  89. package/dist/components/fileuploader/FileUploader.js.map +1 -1
  90. package/dist/components/hovercard/HoverCard.cjs +1 -1
  91. package/dist/components/hovercard/HoverCard.cjs.map +1 -1
  92. package/dist/components/hovercard/HoverCard.js +124 -69
  93. package/dist/components/hovercard/HoverCard.js.map +1 -1
  94. package/dist/components/input/Input.cjs +1 -1
  95. package/dist/components/input/Input.cjs.map +1 -1
  96. package/dist/components/input/Input.js +62 -37
  97. package/dist/components/input/Input.js.map +1 -1
  98. package/dist/components/layout/Container.cjs +1 -1
  99. package/dist/components/layout/Container.cjs.map +1 -1
  100. package/dist/components/layout/Container.js +21 -30
  101. package/dist/components/layout/Container.js.map +1 -1
  102. package/dist/components/layout/Flex.cjs +1 -1
  103. package/dist/components/layout/Flex.cjs.map +1 -1
  104. package/dist/components/layout/Flex.js +36 -19
  105. package/dist/components/layout/Flex.js.map +1 -1
  106. package/dist/components/layout/Grid.cjs +1 -1
  107. package/dist/components/layout/Grid.cjs.map +1 -1
  108. package/dist/components/layout/Grid.js +30 -18
  109. package/dist/components/layout/Grid.js.map +1 -1
  110. package/dist/components/link/Link.cjs +2 -0
  111. package/dist/components/link/Link.cjs.map +1 -0
  112. package/dist/components/link/Link.js +41 -0
  113. package/dist/components/link/Link.js.map +1 -0
  114. package/dist/components/megamenu/MegaMenu.cjs +1 -1
  115. package/dist/components/megamenu/MegaMenu.cjs.map +1 -1
  116. package/dist/components/megamenu/MegaMenu.js +107 -38
  117. package/dist/components/megamenu/MegaMenu.js.map +1 -1
  118. package/dist/components/modal/Modal.cjs +1 -1
  119. package/dist/components/modal/Modal.cjs.map +1 -1
  120. package/dist/components/modal/Modal.js +91 -83
  121. package/dist/components/modal/Modal.js.map +1 -1
  122. package/dist/components/multiselect/MultiSelect.cjs +2 -0
  123. package/dist/components/multiselect/MultiSelect.cjs.map +1 -0
  124. package/dist/components/multiselect/MultiSelect.js +176 -0
  125. package/dist/components/multiselect/MultiSelect.js.map +1 -0
  126. package/dist/components/nuiprovider/NUIProvider.cjs +2 -0
  127. package/dist/components/nuiprovider/NUIProvider.cjs.map +1 -0
  128. package/dist/components/nuiprovider/NUIProvider.js +36 -0
  129. package/dist/components/nuiprovider/NUIProvider.js.map +1 -0
  130. package/dist/components/pagination/Pagination.cjs +1 -1
  131. package/dist/components/pagination/Pagination.cjs.map +1 -1
  132. package/dist/components/pagination/Pagination.js +74 -41
  133. package/dist/components/pagination/Pagination.js.map +1 -1
  134. package/dist/components/popover/Popover.cjs +1 -1
  135. package/dist/components/popover/Popover.cjs.map +1 -1
  136. package/dist/components/popover/Popover.js +99 -100
  137. package/dist/components/popover/Popover.js.map +1 -1
  138. package/dist/components/progress/Progress.cjs +1 -1
  139. package/dist/components/progress/Progress.cjs.map +1 -1
  140. package/dist/components/progress/Progress.js +44 -22
  141. package/dist/components/progress/Progress.js.map +1 -1
  142. package/dist/components/radiogroup/RadioGroup.cjs +1 -1
  143. package/dist/components/radiogroup/RadioGroup.cjs.map +1 -1
  144. package/dist/components/radiogroup/RadioGroup.js +69 -74
  145. package/dist/components/radiogroup/RadioGroup.js.map +1 -1
  146. package/dist/components/rating/Rating.cjs +1 -1
  147. package/dist/components/rating/Rating.cjs.map +1 -1
  148. package/dist/components/rating/Rating.js +72 -33
  149. package/dist/components/rating/Rating.js.map +1 -1
  150. package/dist/components/resizable/Resizable.cjs +2 -0
  151. package/dist/components/resizable/Resizable.cjs.map +1 -0
  152. package/dist/components/resizable/Resizable.js +134 -0
  153. package/dist/components/resizable/Resizable.js.map +1 -0
  154. package/dist/components/select/Select.cjs +1 -1
  155. package/dist/components/select/Select.cjs.map +1 -1
  156. package/dist/components/select/Select.js +114 -113
  157. package/dist/components/select/Select.js.map +1 -1
  158. package/dist/components/skeleton/Skeleton.cjs +1 -1
  159. package/dist/components/skeleton/Skeleton.cjs.map +1 -1
  160. package/dist/components/skeleton/Skeleton.js +90 -67
  161. package/dist/components/skeleton/Skeleton.js.map +1 -1
  162. package/dist/components/slider/Slider.cjs +1 -1
  163. package/dist/components/slider/Slider.cjs.map +1 -1
  164. package/dist/components/slider/Slider.js +85 -82
  165. package/dist/components/slider/Slider.js.map +1 -1
  166. package/dist/components/spinner/Spinner.cjs +1 -1
  167. package/dist/components/spinner/Spinner.cjs.map +1 -1
  168. package/dist/components/spinner/Spinner.js +60 -17
  169. package/dist/components/spinner/Spinner.js.map +1 -1
  170. package/dist/components/stepper/Stepper.cjs +1 -5
  171. package/dist/components/stepper/Stepper.cjs.map +1 -1
  172. package/dist/components/stepper/Stepper.js +65 -39
  173. package/dist/components/stepper/Stepper.js.map +1 -1
  174. package/dist/components/switch/Switch.cjs +1 -1
  175. package/dist/components/switch/Switch.cjs.map +1 -1
  176. package/dist/components/switch/Switch.js +89 -62
  177. package/dist/components/switch/Switch.js.map +1 -1
  178. package/dist/components/table/Table.cjs +1 -1
  179. package/dist/components/table/Table.cjs.map +1 -1
  180. package/dist/components/table/Table.js +62 -35
  181. package/dist/components/table/Table.js.map +1 -1
  182. package/dist/components/tabs/Tabs.cjs +1 -1
  183. package/dist/components/tabs/Tabs.cjs.map +1 -1
  184. package/dist/components/tabs/Tabs.js +110 -50
  185. package/dist/components/tabs/Tabs.js.map +1 -1
  186. package/dist/components/textarea/Textarea.cjs +1 -1
  187. package/dist/components/textarea/Textarea.cjs.map +1 -1
  188. package/dist/components/textarea/Textarea.js +63 -58
  189. package/dist/components/textarea/Textarea.js.map +1 -1
  190. package/dist/components/timepicker/TimePicker.cjs +2 -0
  191. package/dist/components/timepicker/TimePicker.cjs.map +1 -0
  192. package/dist/components/timepicker/TimePicker.js +159 -0
  193. package/dist/components/timepicker/TimePicker.js.map +1 -0
  194. package/dist/components/timerangepicker/TimeRangePicker.cjs +2 -0
  195. package/dist/components/timerangepicker/TimeRangePicker.cjs.map +1 -0
  196. package/dist/components/timerangepicker/TimeRangePicker.js +208 -0
  197. package/dist/components/timerangepicker/TimeRangePicker.js.map +1 -0
  198. package/dist/components/toast/Toast.cjs +1 -1
  199. package/dist/components/toast/Toast.cjs.map +1 -1
  200. package/dist/components/toast/Toast.js +91 -38
  201. package/dist/components/toast/Toast.js.map +1 -1
  202. package/dist/components/tooltip/Tooltip.cjs +1 -1
  203. package/dist/components/tooltip/Tooltip.cjs.map +1 -1
  204. package/dist/components/tooltip/Tooltip.js +72 -56
  205. package/dist/components/tooltip/Tooltip.js.map +1 -1
  206. package/dist/components/treeview/TreeView.cjs +1 -1
  207. package/dist/components/treeview/TreeView.cjs.map +1 -1
  208. package/dist/components/treeview/TreeView.js +120 -90
  209. package/dist/components/treeview/TreeView.js.map +1 -1
  210. package/dist/components/virtuallist/VirtualList.cjs +1 -1
  211. package/dist/components/virtuallist/VirtualList.cjs.map +1 -1
  212. package/dist/components/virtuallist/VirtualList.js +52 -34
  213. package/dist/components/virtuallist/VirtualList.js.map +1 -1
  214. package/dist/index.cjs +1 -1
  215. package/dist/index.css +1 -0
  216. package/dist/index.js +118 -107
  217. package/dist/index.js.map +1 -1
  218. package/dist/package.json +49 -6
  219. package/dist/types/components/accordion/Accordion.d.ts +7 -3
  220. package/dist/types/components/accordion/Accordion.d.ts.map +1 -1
  221. package/dist/types/components/alert/Alert.d.ts +18 -5
  222. package/dist/types/components/alert/Alert.d.ts.map +1 -1
  223. package/dist/types/components/avatar/Avatar.d.ts +12 -8
  224. package/dist/types/components/avatar/Avatar.d.ts.map +1 -1
  225. package/dist/types/components/avatar/AvatarGroup.d.ts +11 -4
  226. package/dist/types/components/avatar/AvatarGroup.d.ts.map +1 -1
  227. package/dist/types/components/badge/Badge.d.ts +19 -11
  228. package/dist/types/components/badge/Badge.d.ts.map +1 -1
  229. package/dist/types/components/badge/BadgeGroup.d.ts +7 -4
  230. package/dist/types/components/badge/BadgeGroup.d.ts.map +1 -1
  231. package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts +14 -6
  232. package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts.map +1 -1
  233. package/dist/types/components/button/Button.d.ts +25 -10
  234. package/dist/types/components/button/Button.d.ts.map +1 -1
  235. package/dist/types/components/card/Card.d.ts +12 -21
  236. package/dist/types/components/card/Card.d.ts.map +1 -1
  237. package/dist/types/components/checkbox/Checkbox.d.ts +12 -7
  238. package/dist/types/components/checkbox/Checkbox.d.ts.map +1 -1
  239. package/dist/types/components/chip/Chip.d.ts +14 -11
  240. package/dist/types/components/chip/Chip.d.ts.map +1 -1
  241. package/dist/types/components/combobox/Combobox.d.ts +15 -4
  242. package/dist/types/components/combobox/Combobox.d.ts.map +1 -1
  243. package/dist/types/components/commandpalette/CommandPalette.d.ts +12 -3
  244. package/dist/types/components/commandpalette/CommandPalette.d.ts.map +1 -1
  245. package/dist/types/components/contextmenu/ContextMenu.d.ts +14 -6
  246. package/dist/types/components/contextmenu/ContextMenu.d.ts.map +1 -1
  247. package/dist/types/components/datagrid/DataGrid.d.ts +16 -4
  248. package/dist/types/components/datagrid/DataGrid.d.ts.map +1 -1
  249. package/dist/types/components/datepicker/DatePicker.d.ts +13 -1
  250. package/dist/types/components/datepicker/DatePicker.d.ts.map +1 -1
  251. package/dist/types/components/daterangepicker/DateRangePicker.d.ts +3 -1
  252. package/dist/types/components/daterangepicker/DateRangePicker.d.ts.map +1 -1
  253. package/dist/types/components/dialog/DialogProvider.d.ts +2 -0
  254. package/dist/types/components/dialog/DialogProvider.d.ts.map +1 -0
  255. package/dist/types/components/dialog/dialogStore.d.ts +42 -0
  256. package/dist/types/components/dialog/dialogStore.d.ts.map +1 -0
  257. package/dist/types/components/drawer/Drawer.d.ts +18 -4
  258. package/dist/types/components/drawer/Drawer.d.ts.map +1 -1
  259. package/dist/types/components/dropdown/Dropdown.d.ts +21 -16
  260. package/dist/types/components/dropdown/Dropdown.d.ts.map +1 -1
  261. package/dist/types/components/fileuploader/FileUploader.d.ts +22 -3
  262. package/dist/types/components/fileuploader/FileUploader.d.ts.map +1 -1
  263. package/dist/types/components/hovercard/HoverCard.d.ts +45 -5
  264. package/dist/types/components/hovercard/HoverCard.d.ts.map +1 -1
  265. package/dist/types/components/input/Input.d.ts +20 -10
  266. package/dist/types/components/input/Input.d.ts.map +1 -1
  267. package/dist/types/components/layout/Container.d.ts +8 -4
  268. package/dist/types/components/layout/Container.d.ts.map +1 -1
  269. package/dist/types/components/layout/Flex.d.ts +27 -10
  270. package/dist/types/components/layout/Flex.d.ts.map +1 -1
  271. package/dist/types/components/layout/Grid.d.ts +11 -5
  272. package/dist/types/components/layout/Grid.d.ts.map +1 -1
  273. package/dist/types/components/link/Link.d.ts +22 -0
  274. package/dist/types/components/link/Link.d.ts.map +1 -0
  275. package/dist/types/components/megamenu/MegaMenu.d.ts +8 -11
  276. package/dist/types/components/megamenu/MegaMenu.d.ts.map +1 -1
  277. package/dist/types/components/modal/Modal.d.ts +8 -7
  278. package/dist/types/components/modal/Modal.d.ts.map +1 -1
  279. package/dist/types/components/multiselect/MultiSelect.d.ts +33 -0
  280. package/dist/types/components/multiselect/MultiSelect.d.ts.map +1 -0
  281. package/dist/types/components/nuiprovider/NUIProvider.d.ts +29 -0
  282. package/dist/types/components/nuiprovider/NUIProvider.d.ts.map +1 -0
  283. package/dist/types/components/pagination/Pagination.d.ts +17 -3
  284. package/dist/types/components/pagination/Pagination.d.ts.map +1 -1
  285. package/dist/types/components/popover/Popover.d.ts +54 -16
  286. package/dist/types/components/popover/Popover.d.ts.map +1 -1
  287. package/dist/types/components/progress/Progress.d.ts +17 -7
  288. package/dist/types/components/progress/Progress.d.ts.map +1 -1
  289. package/dist/types/components/radiogroup/RadioGroup.d.ts +15 -10
  290. package/dist/types/components/radiogroup/RadioGroup.d.ts.map +1 -1
  291. package/dist/types/components/rating/Rating.d.ts +24 -10
  292. package/dist/types/components/rating/Rating.d.ts.map +1 -1
  293. package/dist/types/components/resizable/Resizable.d.ts +24 -0
  294. package/dist/types/components/resizable/Resizable.d.ts.map +1 -0
  295. package/dist/types/components/select/Select.d.ts +17 -8
  296. package/dist/types/components/select/Select.d.ts.map +1 -1
  297. package/dist/types/components/skeleton/Skeleton.d.ts +37 -36
  298. package/dist/types/components/skeleton/Skeleton.d.ts.map +1 -1
  299. package/dist/types/components/slider/Slider.d.ts +15 -4
  300. package/dist/types/components/slider/Slider.d.ts.map +1 -1
  301. package/dist/types/components/spinner/Spinner.d.ts +14 -4
  302. package/dist/types/components/spinner/Spinner.d.ts.map +1 -1
  303. package/dist/types/components/stepper/Stepper.d.ts +17 -3
  304. package/dist/types/components/stepper/Stepper.d.ts.map +1 -1
  305. package/dist/types/components/switch/Switch.d.ts +20 -5
  306. package/dist/types/components/switch/Switch.d.ts.map +1 -1
  307. package/dist/types/components/table/Table.d.ts +24 -4
  308. package/dist/types/components/table/Table.d.ts.map +1 -1
  309. package/dist/types/components/tabs/Tabs.d.ts +25 -12
  310. package/dist/types/components/tabs/Tabs.d.ts.map +1 -1
  311. package/dist/types/components/textarea/Textarea.d.ts +8 -5
  312. package/dist/types/components/textarea/Textarea.d.ts.map +1 -1
  313. package/dist/types/components/timepicker/TimePicker.d.ts +26 -0
  314. package/dist/types/components/timepicker/TimePicker.d.ts.map +1 -0
  315. package/dist/types/components/timerangepicker/TimeRangePicker.d.ts +32 -0
  316. package/dist/types/components/timerangepicker/TimeRangePicker.d.ts.map +1 -0
  317. package/dist/types/components/toast/Toast.d.ts +23 -7
  318. package/dist/types/components/toast/Toast.d.ts.map +1 -1
  319. package/dist/types/components/tooltip/Tooltip.d.ts +13 -2
  320. package/dist/types/components/tooltip/Tooltip.d.ts.map +1 -1
  321. package/dist/types/components/treeview/TreeView.d.ts +20 -6
  322. package/dist/types/components/treeview/TreeView.d.ts.map +1 -1
  323. package/dist/types/components/virtuallist/VirtualList.d.ts +12 -16
  324. package/dist/types/components/virtuallist/VirtualList.d.ts.map +1 -1
  325. package/dist/types/index.d.ts +8 -4
  326. package/dist/types/index.d.ts.map +1 -1
  327. package/dist/types/utils/cn/cn.d.ts +19 -0
  328. package/dist/types/utils/cn/cn.d.ts.map +1 -0
  329. package/dist/types/utils/generateid/generateId.d.ts +7 -0
  330. package/dist/types/utils/generateid/generateId.d.ts.map +1 -1
  331. package/dist/types/utils/index.d.ts +2 -0
  332. package/dist/types/utils/index.d.ts.map +1 -1
  333. package/dist/types/utils/inertmanager/inertManager.d.ts +13 -0
  334. package/dist/types/utils/inertmanager/inertManager.d.ts.map +1 -1
  335. package/dist/types/utils/keyboardnav/keyboardNav.d.ts +17 -6
  336. package/dist/types/utils/keyboardnav/keyboardNav.d.ts.map +1 -1
  337. package/dist/types/utils/onclickoutside/onClickOutside.d.ts +9 -1
  338. package/dist/types/utils/onclickoutside/onClickOutside.d.ts.map +1 -1
  339. package/dist/types/utils/portal/portal.d.ts +14 -1
  340. package/dist/types/utils/portal/portal.d.ts.map +1 -1
  341. package/dist/types/utils/restorefocus/restoreFocus.d.ts +8 -4
  342. package/dist/types/utils/restorefocus/restoreFocus.d.ts.map +1 -1
  343. package/dist/types/utils/scrolllock/scrollLock.d.ts +10 -2
  344. package/dist/types/utils/scrolllock/scrollLock.d.ts.map +1 -1
  345. package/dist/types/utils/slot/slot.d.ts +12 -0
  346. package/dist/types/utils/slot/slot.d.ts.map +1 -0
  347. package/dist/types/utils/trapfocus/trapFocus.d.ts +6 -2
  348. package/dist/types/utils/trapfocus/trapFocus.d.ts.map +1 -1
  349. package/dist/utils/cn/cn.cjs +2 -0
  350. package/dist/utils/cn/cn.cjs.map +1 -0
  351. package/dist/utils/cn/cn.js +21 -0
  352. package/dist/utils/cn/cn.js.map +1 -0
  353. package/dist/utils/inertmanager/inertManager.cjs.map +1 -1
  354. package/dist/utils/inertmanager/inertManager.js.map +1 -1
  355. package/dist/utils/onclickoutside/onClickOutside.cjs +1 -1
  356. package/dist/utils/onclickoutside/onClickOutside.cjs.map +1 -1
  357. package/dist/utils/onclickoutside/onClickOutside.js +10 -6
  358. package/dist/utils/onclickoutside/onClickOutside.js.map +1 -1
  359. package/dist/utils/portal/portal.cjs.map +1 -1
  360. package/dist/utils/portal/portal.js.map +1 -1
  361. package/dist/utils/restorefocus/restoreFocus.cjs.map +1 -1
  362. package/dist/utils/restorefocus/restoreFocus.js.map +1 -1
  363. package/dist/utils/scrolllock/scrollLock.cjs.map +1 -1
  364. package/dist/utils/scrolllock/scrollLock.js +7 -0
  365. package/dist/utils/scrolllock/scrollLock.js.map +1 -1
  366. package/dist/utils/slot/slot.cjs +2 -0
  367. package/dist/utils/slot/slot.cjs.map +1 -0
  368. package/dist/utils/slot/slot.js +57 -0
  369. package/dist/utils/slot/slot.js.map +1 -0
  370. package/dist/utils/trapfocus/trapFocus.cjs.map +1 -1
  371. package/dist/utils/trapfocus/trapFocus.js.map +1 -1
  372. package/package.json +49 -6
  373. package/dist/components/layout/HStack.cjs +0 -2
  374. package/dist/components/layout/HStack.cjs.map +0 -1
  375. package/dist/components/layout/HStack.js +0 -9
  376. package/dist/components/layout/HStack.js.map +0 -1
  377. package/dist/components/layout/Stack.cjs +0 -2
  378. package/dist/components/layout/Stack.cjs.map +0 -1
  379. package/dist/components/layout/Stack.js +0 -9
  380. package/dist/components/layout/Stack.js.map +0 -1
  381. package/dist/styles/nui.css +0 -1
  382. package/dist/theme/NUIProvider.cjs +0 -2
  383. package/dist/theme/NUIProvider.cjs.map +0 -1
  384. package/dist/theme/NUIProvider.js +0 -34
  385. package/dist/theme/NUIProvider.js.map +0 -1
  386. package/dist/theme/useTheme.cjs +0 -2
  387. package/dist/theme/useTheme.cjs.map +0 -1
  388. package/dist/theme/useTheme.js +0 -9
  389. package/dist/theme/useTheme.js.map +0 -1
  390. package/dist/types/components/layout/HStack.d.ts +0 -8
  391. package/dist/types/components/layout/HStack.d.ts.map +0 -1
  392. package/dist/types/components/layout/Stack.d.ts +0 -8
  393. package/dist/types/components/layout/Stack.d.ts.map +0 -1
  394. package/dist/types/theme/NUIProvider.d.ts +0 -14
  395. package/dist/types/theme/NUIProvider.d.ts.map +0 -1
  396. package/dist/types/theme/useTheme.d.ts +0 -11
  397. package/dist/types/theme/useTheme.d.ts.map +0 -1
  398. package/dist/utils/generateid/generateId.cjs +0 -2
  399. package/dist/utils/generateid/generateId.cjs.map +0 -1
  400. package/dist/utils/generateid/generateId.js +0 -7
  401. package/dist/utils/generateid/generateId.js.map +0 -1
  402. package/dist/utils/keyboardnav/keyboardNav.cjs +0 -2
  403. package/dist/utils/keyboardnav/keyboardNav.cjs.map +0 -1
  404. package/dist/utils/keyboardnav/keyboardNav.js +0 -10
  405. package/dist/utils/keyboardnav/keyboardNav.js.map +0 -1
@@ -1,114 +1,129 @@
1
- import { jsxs as v, jsx as i } from "react/jsx-runtime";
2
- import { useState as k, useRef as M, useCallback as w, useEffect as R } from "react";
1
+ import { jsxs as k, jsx as a } from "react/jsx-runtime";
2
+ import { forwardRef as G, useId as H, useState as D, useRef as J, useCallback as h, useEffect as M } from "react";
3
3
  /* empty css */
4
- import { generateId as U } from "../../utils/generateid/generateId.js";
5
- import { onClickOutside as q } from "../../utils/onclickoutside/onClickOutside.js";
6
- function Q({
7
- options: n,
8
- value: a,
9
- defaultValue: N,
10
- onChange: C,
11
- placeholder: S = "Select...",
12
- disabled: l = !1,
13
- className: $ = "",
14
- emptyMessage: B = "No results found",
15
- filter: D,
16
- leftIcon: b,
17
- rightIcon: m,
18
- renderOption: L,
19
- renderOptionIcon: y
20
- }) {
21
- const f = a !== void 0, [d, r] = k(() => f && a ? n.find((o) => o.value === a)?.label ?? "" : N ? n.find((o) => o.value === N)?.label ?? "" : ""), [t, g] = k(!1), [p, x] = k(-1), j = M(null), A = M(U("combobox-list")).current, u = n.filter(
22
- (e) => D ? D(d, e) : e.label.toLowerCase().includes(d.toLowerCase())
23
- ), E = w(
24
- (e) => {
25
- C?.(e);
26
- },
27
- [C]
28
- ), c = w(() => {
29
- l || g(!0);
30
- }, [l]), s = w(() => {
31
- g(!1), x(-1);
32
- }, []);
33
- R(() => {
34
- if (t)
35
- return q(j, s);
36
- }, [t, s]), R(() => {
37
- if (f && a !== void 0) {
38
- const e = n.find((o) => o.value === a);
39
- r(e?.label || "");
40
- }
41
- }, [f, a, n]);
42
- const F = (e) => {
43
- if (!l)
44
- switch (e.key) {
45
- case "ArrowDown":
46
- e.preventDefault(), t || c(), x((o) => Math.min(u.length - 1, o + 1));
47
- break;
48
- case "ArrowUp":
49
- e.preventDefault(), t || c(), x((o) => Math.max(0, o - 1));
50
- break;
51
- case "Enter":
52
- if (t && p >= 0) {
53
- const o = u[p];
54
- r(o.label), E(o.value), s();
55
- }
56
- break;
57
- case "Escape":
58
- t && (e.preventDefault(), s());
59
- break;
4
+ import { cn as y } from "../../utils/cn/cn.js";
5
+ const O = G(
6
+ ({
7
+ options: s,
8
+ value: t,
9
+ defaultValue: b,
10
+ onChange: j,
11
+ placeholder: F = "Select...",
12
+ disabled: m = !1,
13
+ className: I,
14
+ emptyMessage: K = "No results found",
15
+ filter: E,
16
+ leftIcon: w,
17
+ rightIcon: L,
18
+ renderOption: g,
19
+ renderOptionIcon: $,
20
+ ...U
21
+ }, r) => {
22
+ const l = t !== void 0, d = `${H()}-listbox`, [f, p] = D(() => l && t ? s.find((e) => e.value === t)?.label ?? "" : b ? s.find((e) => e.value === b)?.label ?? "" : ""), [n, A] = D(!1), [i, v] = D(-1), N = J(null), q = h(
23
+ (e) => {
24
+ N.current = e, typeof r == "function" ? r(e) : r && (r.current = e);
25
+ },
26
+ [r]
27
+ ), u = s.filter(
28
+ (e) => E ? E(f, e) : e.label.toLowerCase().includes(f.toLowerCase())
29
+ ), c = h(() => {
30
+ m || A(!0);
31
+ }, [m]), x = h(() => {
32
+ A(!1), v(-1);
33
+ }, []), C = h(() => {
34
+ const e = l ? t : b, o = s.find((_) => _.value === e);
35
+ p(o?.label || "");
36
+ }, [l, t, b, s]);
37
+ M(() => {
38
+ if (!n) return;
39
+ const e = (o) => {
40
+ N.current && !N.current.contains(o.target) && (x(), C());
41
+ };
42
+ return document.addEventListener("mousedown", e), document.addEventListener("touchstart", e), () => {
43
+ document.removeEventListener("mousedown", e), document.removeEventListener("touchstart", e);
44
+ };
45
+ }, [n, x, C]), M(() => {
46
+ if (l && t !== void 0) {
47
+ const e = s.find((o) => o.value === t);
48
+ p(e?.label || "");
60
49
  }
61
- }, K = (e) => {
62
- r(e.label), E(e.value), s();
63
- };
64
- return /* @__PURE__ */ v("div", { ref: j, className: `ui-combobox ${$}`, children: [
65
- /* @__PURE__ */ v("div", { className: "ui-combobox-input-wrapper", children: [
66
- b && /* @__PURE__ */ i("span", { className: "ui-combobox-left-icon", children: b }),
67
- /* @__PURE__ */ i(
68
- "input",
69
- {
70
- className: [
71
- "ui-combobox-input",
72
- b && "has-left-icon",
73
- m && "has-right-icon"
74
- ].filter(Boolean).join(" "),
75
- role: "combobox",
76
- "aria-expanded": t,
77
- "aria-controls": A,
78
- placeholder: S,
79
- disabled: l,
80
- value: d,
81
- onFocus: c,
82
- onClick: c,
83
- onChange: (e) => {
84
- r(e.target.value), t || c();
85
- },
86
- onKeyDown: F
50
+ }, [l, t, s]);
51
+ const z = (e) => {
52
+ if (!m)
53
+ switch (e.key) {
54
+ case "ArrowDown":
55
+ e.preventDefault(), n || c(), v((o) => Math.min(u.length - 1, o + 1));
56
+ break;
57
+ case "ArrowUp":
58
+ e.preventDefault(), n || c(), v((o) => Math.max(0, o - 1));
59
+ break;
60
+ case "Enter":
61
+ n && i >= 0 && u[i] ? (e.preventDefault(), R(u[i])) : n || c();
62
+ break;
63
+ case "Escape":
64
+ n && (e.preventDefault(), x(), C());
65
+ break;
87
66
  }
88
- ),
89
- m && /* @__PURE__ */ i("span", { className: "ui-combobox-right-icon", children: m })
90
- ] }),
91
- t && /* @__PURE__ */ i("div", { id: A, role: "listbox", className: "ui-combobox-listbox", children: u.length === 0 ? /* @__PURE__ */ i("div", { className: "ui-combobox-empty", children: B }) : u.map((e, o) => {
92
- const h = o === p;
93
- return /* @__PURE__ */ v(
94
- "div",
95
- {
96
- role: "option",
97
- "aria-selected": h,
98
- className: `ui-combobox-option ${h ? "active" : ""}`,
99
- onMouseDown: (O) => O.preventDefault(),
100
- onClick: () => K(e),
101
- children: [
102
- y && /* @__PURE__ */ i("span", { className: "ui-combobox-option-icon", children: y(e) }),
103
- L ? L(e, h) : e.label
104
- ]
105
- },
106
- e.value
107
- );
108
- }) })
109
- ] });
110
- }
67
+ }, R = (e) => {
68
+ p(e.label), j?.(e.value), x();
69
+ };
70
+ return /* @__PURE__ */ k("div", { ref: q, className: y("nui-combobox", I), ...U, children: [
71
+ /* @__PURE__ */ k("div", { className: "nui-combobox__wrapper", children: [
72
+ w && /* @__PURE__ */ a("span", { className: "nui-combobox__icon -left", children: w }),
73
+ /* @__PURE__ */ a(
74
+ "input",
75
+ {
76
+ className: y(
77
+ "nui-combobox__input",
78
+ !!w && "nui-combobox__input--has-left",
79
+ !!L && "nui-combobox__input--has-right"
80
+ ),
81
+ role: "combobox",
82
+ "aria-expanded": n,
83
+ "aria-controls": d,
84
+ "aria-autocomplete": "list",
85
+ "aria-activedescendant": n && i >= 0 ? `${d}-option-${i}` : void 0,
86
+ placeholder: F,
87
+ disabled: m,
88
+ value: f,
89
+ onFocus: c,
90
+ onClick: c,
91
+ onChange: (e) => {
92
+ p(e.target.value), n || c(), v(-1);
93
+ },
94
+ onKeyDown: z
95
+ }
96
+ ),
97
+ L && /* @__PURE__ */ a("span", { className: "nui-combobox__icon -right", children: L })
98
+ ] }),
99
+ n && /* @__PURE__ */ a("div", { id: d, role: "listbox", className: "nui-combobox__listbox", children: u.length === 0 ? /* @__PURE__ */ a("div", { className: "nui-combobox__empty", children: K }) : u.map((e, o) => {
100
+ const _ = o === i, S = e.label === f;
101
+ return /* @__PURE__ */ k(
102
+ "div",
103
+ {
104
+ id: `${d}-option-${o}`,
105
+ role: "option",
106
+ "aria-selected": S,
107
+ className: y(
108
+ "nui-combobox__option",
109
+ _ && "nui-combobox__option--active",
110
+ S && "nui-combobox__option--selected"
111
+ ),
112
+ onMouseDown: (B) => B.preventDefault(),
113
+ onClick: () => R(e),
114
+ children: [
115
+ $ && /* @__PURE__ */ a("span", { className: "nui-combobox__option-icon", children: $(e) }),
116
+ g ? g(e, _) : e.label
117
+ ]
118
+ },
119
+ e.value
120
+ );
121
+ }) })
122
+ ] });
123
+ }
124
+ );
125
+ O.displayName = "Combobox";
111
126
  export {
112
- Q as Combobox
127
+ O as Combobox
113
128
  };
114
129
  //# sourceMappingURL=Combobox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Combobox.js","sources":["../../../src/components/combobox/Combobox.tsx"],"sourcesContent":["/**\r\n * Combobox.tsx\r\n * Fully WCAG-compliant Combobox integrated with your existing utilities.\r\n */\r\n\r\n/**\r\n * Combobox.tsx\r\n * Now includes:\r\n * - leftIcon (input)\r\n * - rightIcon (input)\r\n * - renderOptionIcon (listbox)\r\n */\r\n/**\r\n * Combobox.tsx\r\n * Fully WCAG-Compliant Combobox with:\r\n * - Icons (input + option)\r\n * - Value→Label mapping fixed\r\n * - Keyboard navigation\r\n * - Click outside to close\r\n * - Controlled/uncontrolled\r\n */\r\n\r\nimport React, {\r\n useState,\r\n useEffect,\r\n useRef,\r\n useCallback,\r\n KeyboardEvent,\r\n} from 'react';\r\n\r\nimport './Combobox.css';\r\n\r\n// USING YOUR EXISTING UTILS\r\nimport { onClickOutside, generateId } from '../../utils/index';\r\n\r\nexport interface ComboboxOption {\r\n label: string;\r\n value: string;\r\n icon?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxProps {\r\n options: ComboboxOption[];\r\n\r\n value?: string;\r\n defaultValue?: string;\r\n onChange?: (value: string) => void;\r\n\r\n placeholder?: string;\r\n disabled?: boolean;\r\n className?: string;\r\n emptyMessage?: string;\r\n\r\n filter?: (input: string, option: ComboboxOption) => boolean;\r\n\r\n leftIcon?: React.ReactNode;\r\n rightIcon?: React.ReactNode;\r\n\r\n renderOption?: (option: ComboboxOption, active: boolean) => React.ReactNode;\r\n renderOptionIcon?: (option: ComboboxOption) => React.ReactNode;\r\n}\r\n\r\nexport function Combobox({\r\n options,\r\n value,\r\n defaultValue,\r\n onChange,\r\n placeholder = 'Select...',\r\n disabled = false,\r\n className = '',\r\n emptyMessage = 'No results found',\r\n filter,\r\n leftIcon,\r\n rightIcon,\r\n renderOption,\r\n renderOptionIcon,\r\n}: ComboboxProps) {\r\n const isControlled = value !== undefined;\r\n\r\n /**\r\n * displayLabel = what the user SEEES in input\r\n * value = actual selected value (sent to parent)\r\n */\r\n const [displayLabel, setDisplayLabel] = useState<string>(() => {\r\n if (isControlled && value) {\r\n const match = options.find((o) => o.value === value);\r\n return match?.label ?? '';\r\n }\r\n if (defaultValue) {\r\n const match = options.find((o) => o.value === defaultValue);\r\n return match?.label ?? '';\r\n }\r\n return '';\r\n });\r\n\r\n const [open, setOpen] = useState(false);\r\n const [activeIndex, setActiveIndex] = useState<number>(-1);\r\n\r\n const wrapperRef = useRef<HTMLDivElement | null>(null);\r\n const listboxId = useRef(generateId('combobox-list')).current;\r\n\r\n /** Filtered options */\r\n const filtered = options.filter((opt) =>\r\n filter\r\n ? filter(displayLabel, opt)\r\n : opt.label.toLowerCase().includes(displayLabel.toLowerCase())\r\n );\r\n\r\n /** Set parent value */\r\n const setValue = useCallback(\r\n (val: string) => {\r\n onChange?.(val);\r\n },\r\n [onChange]\r\n );\r\n\r\n const openList = useCallback(() => {\r\n if (!disabled) setOpen(true);\r\n }, [disabled]);\r\n\r\n const closeList = useCallback(() => {\r\n setOpen(false);\r\n setActiveIndex(-1);\r\n }, []);\r\n\r\n /** Click outside to close */\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(wrapperRef, closeList);\r\n }, [open, closeList]);\r\n\r\n /** Sync controlled (value → label) */\r\n useEffect(() => {\r\n if (isControlled && value !== undefined) {\r\n const found = options.find((o) => o.value === value);\r\n setDisplayLabel(found?.label || '');\r\n }\r\n }, [isControlled, value, options]);\r\n\r\n /** Keyboard behavior */\r\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\r\n if (disabled) return;\r\n\r\n switch (e.key) {\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n if (!open) openList();\r\n setActiveIndex((i) => Math.min(filtered.length - 1, i + 1));\r\n break;\r\n\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n if (!open) openList();\r\n setActiveIndex((i) => Math.max(0, i - 1));\r\n break;\r\n\r\n case 'Enter':\r\n if (open && activeIndex >= 0) {\r\n const opt = filtered[activeIndex];\r\n setDisplayLabel(opt.label);\r\n setValue(opt.value);\r\n closeList();\r\n }\r\n break;\r\n\r\n case 'Escape':\r\n if (open) {\r\n e.preventDefault();\r\n closeList();\r\n }\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n /** Option click */\r\n const onOptionClick = (opt: ComboboxOption) => {\r\n setDisplayLabel(opt.label);\r\n setValue(opt.value);\r\n closeList();\r\n };\r\n\r\n return (\r\n <div ref={wrapperRef} className={`ui-combobox ${className}`}>\r\n {/* Input + Icons */}\r\n <div className=\"ui-combobox-input-wrapper\">\r\n {leftIcon && <span className=\"ui-combobox-left-icon\">{leftIcon}</span>}\r\n\r\n <input\r\n className={[\r\n 'ui-combobox-input',\r\n leftIcon && 'has-left-icon',\r\n rightIcon && 'has-right-icon',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"combobox\"\r\n aria-expanded={open}\r\n aria-controls={listboxId}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n value={displayLabel}\r\n onFocus={openList}\r\n onClick={openList}\r\n onChange={(e) => {\r\n setDisplayLabel(e.target.value);\r\n if (!open) openList();\r\n }}\r\n onKeyDown={onKeyDown}\r\n />\r\n\r\n {rightIcon && (\r\n <span className=\"ui-combobox-right-icon\">{rightIcon}</span>\r\n )}\r\n </div>\r\n\r\n {open && (\r\n <div id={listboxId} role=\"listbox\" className=\"ui-combobox-listbox\">\r\n {filtered.length === 0 ? (\r\n <div className=\"ui-combobox-empty\">{emptyMessage}</div>\r\n ) : (\r\n filtered.map((opt, index) => {\r\n const active = index === activeIndex;\r\n\r\n return (\r\n <div\r\n key={opt.value}\r\n role=\"option\"\r\n aria-selected={active}\r\n className={`ui-combobox-option ${active ? 'active' : ''}`}\r\n onMouseDown={(e) => e.preventDefault()}\r\n onClick={() => onOptionClick(opt)}\r\n >\r\n {/* Option icon (if provided through renderOptionIcon) */}\r\n {renderOptionIcon && (\r\n <span className=\"ui-combobox-option-icon\">\r\n {renderOptionIcon(opt)}\r\n </span>\r\n )}\r\n\r\n {renderOption ? renderOption(opt, active) : opt.label}\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["Combobox","options","value","defaultValue","onChange","placeholder","disabled","className","emptyMessage","filter","leftIcon","rightIcon","renderOption","renderOptionIcon","isControlled","displayLabel","setDisplayLabel","useState","open","setOpen","activeIndex","setActiveIndex","wrapperRef","useRef","listboxId","generateId","filtered","opt","setValue","useCallback","val","openList","closeList","useEffect","onClickOutside","found","onKeyDown","i","onOptionClick","jsxs","jsx","index","active","e"],"mappings":"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"}
1
+ {"version":3,"file":"Combobox.js","sources":["../../../src/components/combobox/Combobox.tsx"],"sourcesContent":["\"use client\";\n\nimport React, {\n useState,\n useEffect,\n useRef,\n useCallback,\n KeyboardEvent,\n useId,\n forwardRef,\n} from 'react';\nimport { cn } from '../../utils';\nimport './Combobox.css';\n\nexport interface ComboboxOption {\n label: string;\n value: string;\n icon?: React.ReactNode;\n}\n\nexport interface ComboboxProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n options: ComboboxOption[];\n /** Controlled value of the combobox */\n value?: string;\n /** Initial uncontrolled value */\n defaultValue?: string;\n /** Callback fired when an option is selected */\n onChange?: (value: string) => void;\n placeholder?: string;\n disabled?: boolean;\n /** Message displayed when filtering returns zero results */\n emptyMessage?: string;\n /** Custom filter function. Defaults to simple substring matching on the label. */\n filter?: (input: string, option: ComboboxOption) => boolean;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n /** Custom renderer for the entire option row */\n renderOption?: (option: ComboboxOption, active: boolean) => React.ReactNode;\n /** Custom renderer strictly for the option's icon */\n renderOptionIcon?: (option: ComboboxOption) => React.ReactNode;\n}\n\n/**\n * Combobox Component\n * * A text input that provides a dropdown list of options to help users enter data.\n * Architecture Note: Implements the WAI-ARIA Combobox pattern, supporting full keyboard \n * navigation (Arrow keys, Enter, Escape) and click-outside dismissal.\n */\nexport const Combobox = forwardRef<HTMLDivElement, ComboboxProps>(\n (\n {\n options,\n value,\n defaultValue,\n onChange,\n placeholder = 'Select...',\n disabled = false,\n className,\n emptyMessage = 'No results found',\n filter,\n leftIcon,\n rightIcon,\n renderOption,\n renderOptionIcon,\n ...props\n },\n ref\n ) => {\n const isControlled = value !== undefined;\n const baseId = useId();\n const listboxId = `${baseId}-listbox`;\n\n // * State Management\n // displayLabel tracks what the user is currently typing OR the label of the selected option.\n const [displayLabel, setDisplayLabel] = useState<string>(() => {\n if (isControlled && value) return options.find((o) => o.value === value)?.label ?? '';\n if (defaultValue) return options.find((o) => o.value === defaultValue)?.label ?? '';\n return '';\n });\n \n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number>(-1);\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n\n // Merge forwarded ref with our internal wrapper ref\n const setRefs = useCallback(\n (node: HTMLDivElement) => {\n wrapperRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref]\n );\n\n // Filter Options based on current input\n const filtered = options.filter((opt) =>\n filter\n ? filter(displayLabel, opt)\n : opt.label.toLowerCase().includes(displayLabel.toLowerCase())\n );\n\n const openList = useCallback(() => {\n if (!disabled) setOpen(true);\n }, [disabled]);\n\n const closeList = useCallback(() => {\n setOpen(false);\n setActiveIndex(-1);\n }, []);\n\n // * UX Architecture: Revert Label\n // If a user types \"App\", sees \"Apple\", but clicks away without selecting it,\n // we must revert the input field back to whatever value was previously confirmed,\n // rather than leaving \"App\" dangling in the input.\n const revertLabel = useCallback(() => {\n const currentValue = isControlled ? value : defaultValue;\n const match = options.find((o) => o.value === currentValue);\n setDisplayLabel(match?.label || '');\n }, [isControlled, value, defaultValue, options]);\n\n // Click outside to close\n useEffect(() => {\n if (!open) return;\n const handleClickOutside = (event: MouseEvent | TouchEvent) => {\n if (wrapperRef.current && !wrapperRef.current.contains(event.target as Node)) {\n closeList();\n revertLabel();\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('touchstart', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('touchstart', handleClickOutside);\n };\n }, [open, closeList, revertLabel]);\n\n // Sync controlled value changes from parent\n useEffect(() => {\n if (isControlled && value !== undefined) {\n const found = options.find((o) => o.value === value);\n setDisplayLabel(found?.label || '');\n }\n }, [isControlled, value, options]);\n\n // Keyboard Navigation\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!open) openList();\n setActiveIndex((i) => Math.min(filtered.length - 1, i + 1));\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (!open) openList();\n setActiveIndex((i) => Math.max(0, i - 1));\n break;\n case 'Enter':\n if (open && activeIndex >= 0 && filtered[activeIndex]) {\n e.preventDefault();\n handleSelect(filtered[activeIndex]);\n } else if (!open) {\n openList();\n }\n break;\n case 'Escape':\n if (open) {\n e.preventDefault();\n closeList();\n revertLabel();\n }\n break;\n }\n };\n\n // Selection Handler\n const handleSelect = (opt: ComboboxOption) => {\n setDisplayLabel(opt.label);\n onChange?.(opt.value);\n closeList();\n };\n\n return (\n <div ref={setRefs} className={cn('nui-combobox', className)} {...props}>\n {/* INPUT WRAPPER */}\n <div className=\"nui-combobox__wrapper\">\n {leftIcon && <span className=\"nui-combobox__icon -left\">{leftIcon}</span>}\n\n <input\n className={cn(\n 'nui-combobox__input',\n !!leftIcon && 'nui-combobox__input--has-left',\n !!rightIcon && 'nui-combobox__input--has-right'\n )}\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n open && activeIndex >= 0 ? `${listboxId}-option-${activeIndex}` : undefined\n }\n placeholder={placeholder}\n disabled={disabled}\n value={displayLabel}\n onFocus={openList}\n onClick={openList}\n onChange={(e) => {\n setDisplayLabel(e.target.value);\n if (!open) openList();\n setActiveIndex(-1); // Reset highlight when typing\n }}\n onKeyDown={onKeyDown}\n />\n\n {rightIcon && <span className=\"nui-combobox__icon -right\">{rightIcon}</span>}\n </div>\n\n {/* DROPDOWN LISTBOX */}\n {open && (\n <div id={listboxId} role=\"listbox\" className=\"nui-combobox__listbox\">\n {filtered.length === 0 ? (\n <div className=\"nui-combobox__empty\">{emptyMessage}</div>\n ) : (\n filtered.map((opt, index) => {\n const isActive = index === activeIndex;\n const isSelected = opt.label === displayLabel; \n\n return (\n <div\n key={opt.value}\n id={`${listboxId}-option-${index}`}\n role=\"option\"\n aria-selected={isSelected}\n className={cn(\n 'nui-combobox__option',\n isActive && 'nui-combobox__option--active',\n isSelected && 'nui-combobox__option--selected'\n )}\n // Prevent input blur when clicking an option\n onMouseDown={(e) => e.preventDefault()} \n onClick={() => handleSelect(opt)}\n >\n {renderOptionIcon && (\n <span className=\"nui-combobox__option-icon\">\n {renderOptionIcon(opt)}\n </span>\n )}\n\n {renderOption ? renderOption(opt, isActive) : opt.label}\n </div>\n );\n })\n )}\n </div>\n )}\n </div>\n );\n }\n);\n\nCombobox.displayName = 'Combobox';"],"names":["Combobox","forwardRef","options","value","defaultValue","onChange","placeholder","disabled","className","emptyMessage","filter","leftIcon","rightIcon","renderOption","renderOptionIcon","props","ref","isControlled","listboxId","useId","displayLabel","setDisplayLabel","useState","o","open","setOpen","activeIndex","setActiveIndex","wrapperRef","useRef","setRefs","useCallback","node","filtered","opt","openList","closeList","revertLabel","currentValue","match","useEffect","handleClickOutside","event","found","onKeyDown","i","handleSelect","jsxs","cn","jsx","index","isActive","isSelected","e"],"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"),c=require("react");;/* empty css */const w=require("../../utils/onclickoutside/onClickOutside.cjs"),E=require("../../utils/portal/portal.cjs");function g({sections:y,placeholder:j="Search commands…",className:N=""}){const[r,a]=c.useState(!1),[m,f]=c.useState(""),[o,v]=c.useState({section:0,index:0}),p=c.useRef(null),h=c.useRef(null);c.useEffect(()=>{const e=t=>{(navigator.platform.toLowerCase().includes("mac")?t.metaKey:t.ctrlKey)&&t.key.toLowerCase()==="k"&&(t.preventDefault(),a(u=>!u))};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[]),c.useEffect(()=>{if(!r)return;const e=t=>{t.key==="Escape"&&a(!1)};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[r]),c.useEffect(()=>{if(r)return w.onClickOutside(p,()=>a(!1))},[r]),c.useEffect(()=>{r&&(setTimeout(()=>h.current?.focus(),0),f(""))},[r]);const d=y.map(e=>({...e,items:e.items.filter(t=>t.label.toLowerCase().includes(m.toLowerCase()))})),l=d.flatMap((e,t)=>e.items.map((n,i)=>({section:t,index:i}))),x=e=>{if(l.length===0)return;let n=l.findIndex(i=>i.section===o.section&&i.index===o.index)+e;n<0&&(n=l.length-1),n>=l.length&&(n=0),v(l[n])},k=e=>{const t=e.key;if(t==="ArrowDown")e.preventDefault(),x(1);else if(t==="ArrowUp")e.preventDefault(),x(-1);else if(t==="Enter"){e.preventDefault();const i=d[o.section]?.items[o.index];i&&i.onSelect&&(i.onSelect(),a(!1))}};return r?s.jsxs(E.Portal,{children:[s.jsx("div",{className:"ui-cmd-overlay"}),s.jsxs("div",{ref:p,className:`ui-cmd ${N}`,role:"dialog","aria-modal":"true",onKeyDown:k,children:[s.jsx("input",{ref:h,className:"ui-cmd-input",placeholder:j,value:m,onChange:e=>f(e.target.value)}),s.jsx("div",{className:"ui-cmd-list",children:d.map((e,t)=>s.jsxs("div",{className:"ui-cmd-section",children:[e.title&&s.jsx("div",{className:"ui-cmd-section-title",children:e.title}),e.items.length===0?s.jsx("div",{className:"ui-cmd-empty",children:"No results"}):e.items.map((n,i)=>{const u=o.section===t&&o.index===i;return s.jsxs("div",{className:`ui-cmd-item ${u?"active":""}`,onMouseEnter:()=>v({section:t,index:i}),onClick:()=>{n.onSelect?.(),a(!1)},children:[n.icon&&s.jsx("span",{className:"ui-cmd-icon",children:n.icon}),s.jsxs("div",{className:"ui-cmd-meta",children:[s.jsx("div",{className:"ui-cmd-label",children:n.label}),n.description&&s.jsx("div",{className:"ui-cmd-description",children:n.description})]}),n.shortcut&&s.jsx("span",{className:"ui-cmd-shortcut",children:n.shortcut})]},n.id)})]},t))})]})]}):null}exports.CommandPalette=g;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),i=require("react");;/* empty css */const q=require("../../utils/onclickoutside/onClickOutside.cjs"),D=require("../../utils/portal/portal.cjs"),N=require("../../utils/cn/cn.cjs");function M({sections:w,placeholder:C="Search commands…",className:E,open:u,onOpenChange:p}){const[g,L]=i.useState(!1),r=u!==void 0?u:g,o=i.useCallback(e=>{u===void 0&&L(e),p?.(e)},[u,p]),[l,h]=i.useState(""),[a,m]=i.useState({section:0,index:0}),j=i.useRef(null),y=i.useRef(null),v=i.useRef(null),f=w.map(e=>({...e,items:e.items.filter(n=>n.label.toLowerCase().includes(l.toLowerCase())||n.description?.toLowerCase().includes(l.toLowerCase()))})).filter(e=>e.items.length>0),d=f.flatMap((e,n)=>e.items.map((s,c)=>({section:n,index:c})));i.useEffect(()=>{const e=n=>{(navigator.platform.toLowerCase().includes("mac")?n.metaKey:n.ctrlKey)&&n.key.toLowerCase()==="k"&&(n.preventDefault(),o(!r))};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[r,o]),i.useEffect(()=>{if(!r)return;const e=n=>{n.key==="Escape"&&o(!1)};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[r,o]),i.useEffect(()=>{if(r)return q.onClickOutside(j,()=>o(!1))},[r,o]),i.useEffect(()=>{r&&(h(""),m({section:0,index:0}),setTimeout(()=>y.current?.focus(),10))},[r]),i.useEffect(()=>{r&&v.current&&v.current.scrollIntoView({block:"nearest"})},[a,r,l]),i.useEffect(()=>{m({section:0,index:0})},[l]);const k=e=>{if(d.length===0)return;let s=d.findIndex(c=>c.section===a.section&&c.index===a.index)+e;s<0&&(s=d.length-1),s>=d.length&&(s=0),m(d[s])},S=e=>{const n=e.key;if(n==="ArrowDown")e.preventDefault(),k(1);else if(n==="ArrowUp")e.preventDefault(),k(-1);else if(n==="Enter"){e.preventDefault();const c=f[a.section]?.items[a.index];c&&c.onSelect&&(c.onSelect(),o(!1))}};return r?t.jsxs(D.Portal,{children:[t.jsx("div",{className:"nui-cmd-overlay"}),t.jsxs("div",{ref:j,className:N.cn("nui-cmd",E),role:"dialog","aria-modal":"true",onKeyDown:S,children:[t.jsxs("div",{className:"nui-cmd-header",children:[t.jsxs("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",children:[t.jsx("circle",{cx:"11",cy:"11",r:"8"}),t.jsx("line",{x1:"21",y1:"21",x2:"16.65",y2:"16.65"})]}),t.jsx("input",{ref:y,className:"nui-cmd-input",placeholder:C,value:l,onChange:e=>h(e.target.value)}),l&&t.jsx("button",{className:"nui-cmd-clear",onClick:()=>h(""),children:"ESC"})]}),t.jsx("div",{className:"nui-cmd-list",role:"listbox",children:f.length===0?t.jsx("div",{className:"nui-cmd-empty",children:t.jsxs("span",{className:"nui-cmd-empty-text",children:['No results found for "',l,'"']})}):f.map((e,n)=>t.jsxs("div",{className:"nui-cmd-section",children:[e.title&&t.jsx("div",{className:"nui-cmd-section-title",children:e.title}),t.jsx("div",{className:"nui-cmd-section-items",children:e.items.map((s,c)=>{const x=a.section===n&&a.index===c;return t.jsxs("div",{ref:x?v:null,role:"option","aria-selected":x,className:N.cn("nui-cmd-item",x&&"active"),onMouseEnter:()=>m({section:n,index:c}),onClick:()=>{s.onSelect?.(),o(!1)},children:[s.icon&&t.jsx("div",{className:"nui-cmd-item-icon",children:s.icon}),t.jsxs("div",{className:"nui-cmd-item-meta",children:[t.jsx("div",{className:"nui-cmd-item-label",children:s.label}),s.description&&t.jsx("div",{className:"nui-cmd-item-description",children:s.description})]}),s.shortcut&&t.jsx("div",{className:"nui-cmd-item-shortcut",children:s.shortcut.split(" ").map((b,R)=>t.jsx("kbd",{children:b},R))})]},s.id)})})]},n))})]})]}):null}exports.CommandPalette=M;
2
2
  //# sourceMappingURL=CommandPalette.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"CommandPalette.cjs","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.cjs","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,111 +1,134 @@
1
- import { jsxs as l, jsx as c } from "react/jsx-runtime";
2
- import { useState as f, useRef as k, useEffect as d } from "react";
1
+ import { jsxs as o, jsx as i } from "react/jsx-runtime";
2
+ import { useState as k, useCallback as j, useRef as N, useEffect as d } from "react";
3
3
  /* empty css */
4
- import { onClickOutside as E } from "../../utils/onclickoutside/onClickOutside.js";
5
- import { Portal as D } from "../../utils/portal/portal.js";
6
- function R({
7
- sections: x,
8
- placeholder: L = "Search commands…",
9
- className: g = ""
4
+ import { onClickOutside as I } from "../../utils/onclickoutside/onClickOutside.js";
5
+ import { Portal as P } from "../../utils/portal/portal.js";
6
+ import { cn as g } from "../../utils/cn/cn.js";
7
+ function W({
8
+ sections: E,
9
+ placeholder: b = "Search commands…",
10
+ className: S,
11
+ open: u,
12
+ onOpenChange: x
10
13
  }) {
11
- const [s, r] = f(!1), [p, v] = f(""), [o, h] = f({
14
+ const [D, A] = k(!1), s = u !== void 0 ? u : D, r = j((e) => {
15
+ u === void 0 && A(e), x?.(e);
16
+ }, [u, x]), [l, v] = k(""), [a, f] = k({
12
17
  section: 0,
13
18
  index: 0
14
- }), y = k(null), N = k(null);
19
+ }), w = N(null), C = N(null), p = N(null), h = E.map((e) => ({
20
+ ...e,
21
+ items: e.items.filter(
22
+ (n) => n.label.toLowerCase().includes(l.toLowerCase()) || n.description?.toLowerCase().includes(l.toLowerCase())
23
+ )
24
+ })).filter((e) => e.items.length > 0), m = h.flatMap(
25
+ (e, n) => e.items.map((t, c) => ({ section: n, index: c }))
26
+ );
15
27
  d(() => {
16
- const e = (t) => {
17
- (navigator.platform.toLowerCase().includes("mac") ? t.metaKey : t.ctrlKey) && t.key.toLowerCase() === "k" && (t.preventDefault(), r((u) => !u));
28
+ const e = (n) => {
29
+ (navigator.platform.toLowerCase().includes("mac") ? n.metaKey : n.ctrlKey) && n.key.toLowerCase() === "k" && (n.preventDefault(), r(!s));
18
30
  };
19
31
  return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
20
- }, []), d(() => {
32
+ }, [s, r]), d(() => {
21
33
  if (!s) return;
22
- const e = (t) => {
23
- t.key === "Escape" && r(!1);
34
+ const e = (n) => {
35
+ n.key === "Escape" && r(!1);
24
36
  };
25
37
  return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
26
- }, [s]), d(() => {
38
+ }, [s, r]), d(() => {
27
39
  if (s)
28
- return E(y, () => r(!1));
40
+ return I(w, () => r(!1));
41
+ }, [s, r]), d(() => {
42
+ s && (v(""), f({ section: 0, index: 0 }), setTimeout(() => C.current?.focus(), 10));
29
43
  }, [s]), d(() => {
30
- s && (setTimeout(() => N.current?.focus(), 0), v(""));
31
- }, [s]);
32
- const m = x.map((e) => ({
33
- ...e,
34
- items: e.items.filter(
35
- (t) => t.label.toLowerCase().includes(p.toLowerCase())
36
- )
37
- })), a = m.flatMap(
38
- (e, t) => e.items.map((n, i) => ({ section: t, index: i }))
39
- ), w = (e) => {
40
- if (a.length === 0) return;
41
- let n = a.findIndex(
42
- (i) => i.section === o.section && i.index === o.index
44
+ s && p.current && p.current.scrollIntoView({ block: "nearest" });
45
+ }, [a, s, l]), d(() => {
46
+ f({ section: 0, index: 0 });
47
+ }, [l]);
48
+ const L = (e) => {
49
+ if (m.length === 0) return;
50
+ let t = m.findIndex(
51
+ (c) => c.section === a.section && c.index === a.index
43
52
  ) + e;
44
- n < 0 && (n = a.length - 1), n >= a.length && (n = 0), h(a[n]);
45
- }, C = (e) => {
46
- const t = e.key;
47
- if (t === "ArrowDown")
48
- e.preventDefault(), w(1);
49
- else if (t === "ArrowUp")
50
- e.preventDefault(), w(-1);
51
- else if (t === "Enter") {
53
+ t < 0 && (t = m.length - 1), t >= m.length && (t = 0), f(m[t]);
54
+ }, K = (e) => {
55
+ const n = e.key;
56
+ if (n === "ArrowDown")
57
+ e.preventDefault(), L(1);
58
+ else if (n === "ArrowUp")
59
+ e.preventDefault(), L(-1);
60
+ else if (n === "Enter") {
52
61
  e.preventDefault();
53
- const i = m[o.section]?.items[o.index];
54
- i && i.onSelect && (i.onSelect(), r(!1));
62
+ const c = h[a.section]?.items[a.index];
63
+ c && c.onSelect && (c.onSelect(), r(!1));
55
64
  }
56
65
  };
57
- return s ? /* @__PURE__ */ l(D, { children: [
58
- /* @__PURE__ */ c("div", { className: "ui-cmd-overlay" }),
59
- /* @__PURE__ */ l(
66
+ return s ? /* @__PURE__ */ o(P, { children: [
67
+ /* @__PURE__ */ i("div", { className: "nui-cmd-overlay" }),
68
+ /* @__PURE__ */ o(
60
69
  "div",
61
70
  {
62
- ref: y,
63
- className: `ui-cmd ${g}`,
71
+ ref: w,
72
+ className: g("nui-cmd", S),
64
73
  role: "dialog",
65
74
  "aria-modal": "true",
66
- onKeyDown: C,
75
+ onKeyDown: K,
67
76
  children: [
68
- /* @__PURE__ */ c(
69
- "input",
70
- {
71
- ref: N,
72
- className: "ui-cmd-input",
73
- placeholder: L,
74
- value: p,
75
- onChange: (e) => v(e.target.value)
76
- }
77
- ),
78
- /* @__PURE__ */ c("div", { className: "ui-cmd-list", children: m.map((e, t) => /* @__PURE__ */ l("div", { className: "ui-cmd-section", children: [
79
- e.title && /* @__PURE__ */ c("div", { className: "ui-cmd-section-title", children: e.title }),
80
- e.items.length === 0 ? /* @__PURE__ */ c("div", { className: "ui-cmd-empty", children: "No results" }) : e.items.map((n, i) => {
81
- const u = o.section === t && o.index === i;
82
- return /* @__PURE__ */ l(
77
+ /* @__PURE__ */ o("div", { className: "nui-cmd-header", children: [
78
+ /* @__PURE__ */ o("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", children: [
79
+ /* @__PURE__ */ i("circle", { cx: "11", cy: "11", r: "8" }),
80
+ /* @__PURE__ */ i("line", { x1: "21", y1: "21", x2: "16.65", y2: "16.65" })
81
+ ] }),
82
+ /* @__PURE__ */ i(
83
+ "input",
84
+ {
85
+ ref: C,
86
+ className: "nui-cmd-input",
87
+ placeholder: b,
88
+ value: l,
89
+ onChange: (e) => v(e.target.value)
90
+ }
91
+ ),
92
+ l && /* @__PURE__ */ i("button", { className: "nui-cmd-clear", onClick: () => v(""), children: "ESC" })
93
+ ] }),
94
+ /* @__PURE__ */ i("div", { className: "nui-cmd-list", role: "listbox", children: h.length === 0 ? /* @__PURE__ */ i("div", { className: "nui-cmd-empty", children: /* @__PURE__ */ o("span", { className: "nui-cmd-empty-text", children: [
95
+ 'No results found for "',
96
+ l,
97
+ '"'
98
+ ] }) }) : h.map((e, n) => /* @__PURE__ */ o("div", { className: "nui-cmd-section", children: [
99
+ e.title && /* @__PURE__ */ i("div", { className: "nui-cmd-section-title", children: e.title }),
100
+ /* @__PURE__ */ i("div", { className: "nui-cmd-section-items", children: e.items.map((t, c) => {
101
+ const y = a.section === n && a.index === c;
102
+ return /* @__PURE__ */ o(
83
103
  "div",
84
104
  {
85
- className: `ui-cmd-item ${u ? "active" : ""}`,
86
- onMouseEnter: () => h({ section: t, index: i }),
105
+ ref: y ? p : null,
106
+ role: "option",
107
+ "aria-selected": y,
108
+ className: g("nui-cmd-item", y && "active"),
109
+ onMouseEnter: () => f({ section: n, index: c }),
87
110
  onClick: () => {
88
- n.onSelect?.(), r(!1);
111
+ t.onSelect?.(), r(!1);
89
112
  },
90
113
  children: [
91
- n.icon && /* @__PURE__ */ c("span", { className: "ui-cmd-icon", children: n.icon }),
92
- /* @__PURE__ */ l("div", { className: "ui-cmd-meta", children: [
93
- /* @__PURE__ */ c("div", { className: "ui-cmd-label", children: n.label }),
94
- n.description && /* @__PURE__ */ c("div", { className: "ui-cmd-description", children: n.description })
114
+ t.icon && /* @__PURE__ */ i("div", { className: "nui-cmd-item-icon", children: t.icon }),
115
+ /* @__PURE__ */ o("div", { className: "nui-cmd-item-meta", children: [
116
+ /* @__PURE__ */ i("div", { className: "nui-cmd-item-label", children: t.label }),
117
+ t.description && /* @__PURE__ */ i("div", { className: "nui-cmd-item-description", children: t.description })
95
118
  ] }),
96
- n.shortcut && /* @__PURE__ */ c("span", { className: "ui-cmd-shortcut", children: n.shortcut })
119
+ t.shortcut && /* @__PURE__ */ i("div", { className: "nui-cmd-item-shortcut", children: t.shortcut.split(" ").map((M, R) => /* @__PURE__ */ i("kbd", { children: M }, R)) })
97
120
  ]
98
121
  },
99
- n.id
122
+ t.id
100
123
  );
101
- })
102
- ] }, t)) })
124
+ }) })
125
+ ] }, n)) })
103
126
  ]
104
127
  }
105
128
  )
106
129
  ] }) : null;
107
130
  }
108
131
  export {
109
- R as CommandPalette
132
+ W as CommandPalette
110
133
  };
111
134
  //# sourceMappingURL=CommandPalette.js.map