@nofinite/nui 1.1.1 → 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 +1 @@
1
- {"version":3,"file":"DateRangePicker.js","sources":["../../../src/components/daterangepicker/DateRangePicker.tsx"],"sourcesContent":["// DateRangePicker.tsx\r\n// Fully compliant, theme-aware, drag-select range picker\r\n// Matches your DatePicker UX exactly.\r\n\r\n// DateRangePicker.tsx — Final, Clean, Fully-Compliant Version\r\n\r\nimport {\r\n useState,\r\n useRef,\r\n useEffect,\r\n useMemo,\r\n useCallback,\r\n KeyboardEvent,\r\n} from 'react';\r\nimport './DateRangePicker.css';\r\nimport { Portal, onClickOutside, restoreFocus } from '../../utils/index';\r\n\r\n/* ----------------------------------------------------\r\n Helpers\r\n---------------------------------------------------- */\r\n\r\nconst pad = (n: number) => (n < 10 ? `0${n}` : `${n}`);\r\nconst toISO = (d: Date) =>\r\n `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\r\n\r\nfunction fromISO(s?: string | null): Date | null {\r\n if (!s) return null;\r\n const [y, m, d] = s.split('-').map(Number);\r\n const dt = new Date(y, m - 1, d);\r\n return Number.isNaN(dt.getTime()) ? null : dt;\r\n}\r\n\r\nconst asDate = (v: Date | null | undefined): Date | null => (v ? v : null);\r\n\r\nconst startOfMonth = (d: Date) => new Date(d.getFullYear(), d.getMonth(), 1);\r\nconst addMonths = (d: Date, n: number) =>\r\n new Date(d.getFullYear(), d.getMonth() + n, 1);\r\nconst daysInMonth = (d: Date) =>\r\n new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();\r\n\r\n/* ----------------------------------------------------\r\n Types\r\n---------------------------------------------------- */\r\n\r\nexport interface DateRange {\r\n from?: string;\r\n to?: string;\r\n}\r\n\r\nexport interface DateRangePickerProps {\r\n value?: DateRange;\r\n defaultValue?: DateRange;\r\n onChange?: (r: DateRange) => void;\r\n\r\n minDate?: string;\r\n maxDate?: string;\r\n\r\n placeholder?: string;\r\n locale?: string;\r\n\r\n id?: string;\r\n className?: string;\r\n\r\n nameFrom?: string;\r\n nameTo?: string;\r\n}\r\n\r\n/* ----------------------------------------------------\r\n Component\r\n---------------------------------------------------- */\r\n\r\nexport function DateRangePicker({\r\n value,\r\n defaultValue,\r\n onChange,\r\n minDate,\r\n maxDate,\r\n placeholder = 'Pick range',\r\n locale = 'en-US',\r\n id,\r\n className = '',\r\n nameFrom,\r\n nameTo,\r\n}: DateRangePickerProps) {\r\n const controlled = value !== undefined;\r\n const [internal, setInternal] = useState<DateRange | undefined>(defaultValue);\r\n const range: DateRange = controlled ? value || {} : internal || {};\r\n\r\n const fromDate = fromISO(range.from);\r\n const toDate = fromISO(range.to);\r\n\r\n const today = new Date();\r\n const initialVisible = startOfMonth(fromDate ?? toDate ?? today);\r\n\r\n const [visible, setVisible] = useState<Date>(initialVisible);\r\n const [open, setOpen] = useState(false);\r\n const [showYMM, setShowYMM] = useState(false);\r\n\r\n const [activePart, setActivePart] = useState<'from' | 'to'>('from');\r\n\r\n const triggerRef = useRef<HTMLButtonElement | null>(null);\r\n const popRef = useRef<HTMLDivElement | null>(null);\r\n const dayRefs = useRef<Record<string, HTMLButtonElement | null>>({});\r\n\r\n /* ----------------------------------------------------\r\n Min/max\r\n ---------------------------------------------------- */\r\n\r\n const minDt = fromISO(minDate);\r\n const maxDt = fromISO(maxDate);\r\n\r\n const isDisabled = (d: Date) => {\r\n if (minDt && d < minDt) return true;\r\n if (maxDt && d > maxDt) return true;\r\n return false;\r\n };\r\n\r\n /* ----------------------------------------------------\r\n Drag select\r\n ---------------------------------------------------- */\r\n\r\n const [dragStart, setDragStart] = useState<Date | null>(null);\r\n const [dragEnd, setDragEnd] = useState<Date | null>(null);\r\n const [isDragging, setIsDragging] = useState(false);\r\n\r\n const inDragRange = (d: Date) => {\r\n if (!isDragging || !dragStart || !dragEnd) return false;\r\n const t = d.getTime();\r\n const a = dragStart.getTime();\r\n const b = dragEnd.getTime();\r\n return t >= Math.min(a, b) && t <= Math.max(a, b);\r\n };\r\n\r\n /* ----------------------------------------------------\r\n Click outside to close\r\n ---------------------------------------------------- */\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(popRef, () => {\r\n setOpen(false);\r\n setShowYMM(false);\r\n });\r\n }, [open]);\r\n\r\n /* ----------------------------------------------------\r\n Restore focus\r\n ---------------------------------------------------- */\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const t = triggerRef.current;\r\n return () => restoreFocus(t);\r\n }, [open]);\r\n\r\n /* ----------------------------------------------------\r\n Popover position\r\n ---------------------------------------------------- */\r\n\r\n const [pos, setPos] = useState<{ top: number; left: number } | null>(null);\r\n\r\n useEffect(() => {\r\n if (!open || !triggerRef.current) return;\r\n const r = triggerRef.current.getBoundingClientRect();\r\n setPos({ top: r.bottom + 8, left: r.left });\r\n }, [open, visible]);\r\n\r\n /* ----------------------------------------------------\r\n Grid computation\r\n ---------------------------------------------------- */\r\n\r\n const grid = useMemo(() => {\r\n const first = startOfMonth(visible);\r\n const startDow = first.getDay();\r\n const total = daysInMonth(visible);\r\n\r\n const g: (number | null)[] = [];\r\n for (let i = 0; i < startDow; i++) g.push(null);\r\n for (let d = 1; d <= total; d++) g.push(d);\r\n while (g.length % 7 !== 0) g.push(null);\r\n return g;\r\n }, [visible]);\r\n\r\n const weekdays = useMemo(\r\n () =>\r\n Array.from({ length: 7 }).map((_, i) =>\r\n new Date(2020, 5, 7 + i).toLocaleDateString(locale, {\r\n weekday: 'short',\r\n })\r\n ),\r\n [locale]\r\n );\r\n\r\n /* ----------------------------------------------------\r\n Month/year panel\r\n ---------------------------------------------------- */\r\n\r\n const visibleYear = visible.getFullYear();\r\n const YEAR_SPAN = 100;\r\n const yearStart = visibleYear - YEAR_SPAN;\r\n\r\n const years = useMemo(\r\n () =>\r\n Array.from({ length: YEAR_SPAN * 2 + 1 }).map((_, i) => yearStart + i),\r\n [yearStart]\r\n );\r\n\r\n const months = useMemo(\r\n () =>\r\n Array.from({ length: 12 }).map((_, i) =>\r\n new Date(2020, i, 1).toLocaleDateString(locale, { month: 'short' })\r\n ),\r\n [locale]\r\n );\r\n\r\n const isMonthDisabled = (y: number, m: number) => {\r\n const s = new Date(y, m, 1);\r\n const e = new Date(y, m, daysInMonth(s));\r\n if (minDt && e < minDt) return true;\r\n if (maxDt && s > maxDt) return true;\r\n return false;\r\n };\r\n\r\n /* ----------------------------------------------------\r\n Normalize + commit range\r\n ---------------------------------------------------- */\r\n\r\n const normalizeRange = (a: Date | null, b: Date | null) => {\r\n if (!a && !b) return { from: undefined, to: undefined };\r\n if (!a) return { from: undefined, to: b ? toISO(b) : undefined };\r\n if (!b) return { from: toISO(a), to: undefined };\r\n\r\n const ta = a.getTime();\r\n const tb = b.getTime();\r\n\r\n return ta <= tb\r\n ? { from: toISO(a), to: toISO(b) }\r\n : { from: toISO(b), to: toISO(a) };\r\n };\r\n\r\n const commitRange = useCallback(\r\n (a: Date | null, b: Date | null) => {\r\n const out = normalizeRange(a, b);\r\n if (!controlled) setInternal(out);\r\n onChange?.(out);\r\n },\r\n [onChange, controlled]\r\n );\r\n\r\n /* ----------------------------------------------------\r\n Clicking days\r\n ---------------------------------------------------- */\r\n\r\n const pickDay = (d: number) => {\r\n const dt = new Date(visible.getFullYear(), visible.getMonth(), d);\r\n if (isDisabled(dt)) return;\r\n\r\n let s = fromDate;\r\n let e = toDate;\r\n\r\n if (activePart === 'from') {\r\n s = dt;\r\n if (e && dt > e) e = null;\r\n } else {\r\n e = dt;\r\n if (s && dt < s) {\r\n s = dt;\r\n e = null;\r\n }\r\n }\r\n\r\n commitRange(asDate(s), asDate(e));\r\n\r\n if (s && e) {\r\n setOpen(false);\r\n setShowYMM(false);\r\n }\r\n };\r\n\r\n /* ----------------------------------------------------\r\n Drag end (global)\r\n ---------------------------------------------------- */\r\n\r\n useEffect(() => {\r\n const stopDrag = () => {\r\n if (!isDragging) return;\r\n\r\n setIsDragging(false);\r\n\r\n if (dragStart && dragEnd) {\r\n const a = dragStart;\r\n const b = dragEnd;\r\n const s = a <= b ? a : b;\r\n const e = a <= b ? b : a;\r\n\r\n commitRange(s, e);\r\n setOpen(false);\r\n setShowYMM(false);\r\n }\r\n\r\n setDragStart(null);\r\n setDragEnd(null);\r\n };\r\n\r\n window.addEventListener('mouseup', stopDrag);\r\n return () => window.removeEventListener('mouseup', stopDrag);\r\n }, [isDragging, dragStart, dragEnd, commitRange]);\r\n\r\n /* ----------------------------------------------------\r\n Range flags\r\n ---------------------------------------------------- */\r\n\r\n const inRange = (dt: Date) => {\r\n if (!fromDate || !toDate) return false;\r\n return dt > fromDate && dt < toDate;\r\n };\r\n\r\n const isStart = (dt: Date) => fromDate && dt.getTime() === fromDate.getTime();\r\n const isEnd = (dt: Date) => toDate && dt.getTime() === toDate.getTime();\r\n\r\n /* ----------------------------------------------------\r\n Keyboard nav\r\n ---------------------------------------------------- */\r\n\r\n const focusDay = (idx: number) => {\r\n if (idx < 0 || idx >= grid.length) return;\r\n const d = grid[idx];\r\n if (!d) return;\r\n const key = `${visible.getFullYear()}-${visible.getMonth()}-${d}`;\r\n dayRefs.current[key]?.focus();\r\n };\r\n\r\n const onDayKey = (e: KeyboardEvent<HTMLButtonElement>, day: number) => {\r\n const idx = grid.findIndex((c) => c === day);\r\n if (idx === -1) return;\r\n\r\n const cols = 7;\r\n let nextIdx: number | null = null;\r\n\r\n switch (e.key) {\r\n case 'ArrowRight':\r\n nextIdx = idx + 1;\r\n break;\r\n case 'ArrowLeft':\r\n nextIdx = idx - 1;\r\n break;\r\n case 'ArrowDown':\r\n nextIdx = idx + cols;\r\n break;\r\n case 'ArrowUp':\r\n nextIdx = idx - cols;\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n e.preventDefault();\r\n pickDay(day);\r\n return;\r\n case 'PageUp':\r\n setVisible((v) => addMonths(v, -1));\r\n return;\r\n case 'PageDown':\r\n setVisible((v) => addMonths(v, 1));\r\n return;\r\n case 'Escape':\r\n setOpen(false);\r\n return;\r\n default:\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n if (nextIdx != null && grid[nextIdx] != null) focusDay(nextIdx);\r\n };\r\n\r\n /* ----------------------------------------------------\r\n Trigger label\r\n ---------------------------------------------------- */\r\n\r\n const label = (): string => {\r\n if (!range.from && !range.to) return placeholder;\r\n if (range.from && !range.to) return `${range.from} → `;\r\n if (!range.from && range.to) return ` → ${range.to}`;\r\n return `${range.from} → ${range.to}`;\r\n };\r\n\r\n /* ----------------------------------------------------\r\n Render\r\n ---------------------------------------------------- */\r\n\r\n return (\r\n <div className={`ui-daterange-picker ${className}`}>\r\n {nameFrom && (\r\n <input type=\"hidden\" name={nameFrom} value={range.from ?? ''} />\r\n )}\r\n {nameTo && <input type=\"hidden\" name={nameTo} value={range.to ?? ''} />}\r\n\r\n <button\r\n id={id}\r\n ref={triggerRef}\r\n type=\"button\"\r\n className=\"drp-trigger\"\r\n aria-haspopup=\"dialog\"\r\n aria-expanded={open}\r\n onClick={() => {\r\n setOpen((s) => !s);\r\n setShowYMM(false);\r\n }}\r\n >\r\n {label()}\r\n </button>\r\n\r\n <div className=\"drp-actions\">\r\n <button\r\n className={`drp-part ${activePart === 'from' ? 'active' : ''}`}\r\n onClick={() => setActivePart('from')}\r\n >\r\n From\r\n </button>\r\n\r\n <button\r\n className={`drp-part ${activePart === 'to' ? 'active' : ''}`}\r\n onClick={() => setActivePart('to')}\r\n >\r\n To\r\n </button>\r\n </div>\r\n\r\n {open && pos && (\r\n <Portal>\r\n <div\r\n ref={popRef}\r\n className=\"drp-popover\"\r\n style={{ position: 'fixed', top: pos.top, left: pos.left }}\r\n >\r\n <div className=\"drp-panel\">\r\n {/* HEADER */}\r\n <div className=\"drp-header\">\r\n <button\r\n className=\"drp-arrow\"\r\n onClick={() => setVisible((v) => addMonths(v, -1))}\r\n >\r\n ‹\r\n </button>\r\n\r\n <button\r\n className=\"drp-title\"\r\n onClick={() => setShowYMM((s) => !s)}\r\n >\r\n {visible.toLocaleDateString(locale, {\r\n month: 'long',\r\n })}{' '}\r\n {visible.getFullYear()}\r\n </button>\r\n\r\n <button\r\n className=\"drp-arrow\"\r\n onClick={() => setVisible((v) => addMonths(v, 1))}\r\n >\r\n ›\r\n </button>\r\n </div>\r\n\r\n {/* YEAR + MONTH PANEL */}\r\n {showYMM && (\r\n <div className=\"drp-ym\">\r\n <div className=\"drp-year-grid\">\r\n {years.map((y) => (\r\n <button\r\n key={y}\r\n className={`drp-year ${\r\n y === visible.getFullYear() ? 'selected' : ''\r\n }`}\r\n onClick={() =>\r\n setVisible(\r\n startOfMonth(new Date(y, visible.getMonth(), 1))\r\n )\r\n }\r\n >\r\n {y}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n <div className=\"drp-month-grid\">\r\n {months.map((ml, i) => {\r\n const disabled = isMonthDisabled(\r\n visible.getFullYear(),\r\n i\r\n );\r\n return (\r\n <button\r\n key={i}\r\n className={`drp-month ${disabled ? 'disabled' : ''} ${\r\n i === visible.getMonth() ? 'selected' : ''\r\n }`}\r\n disabled={disabled ? true : undefined}\r\n onClick={() =>\r\n !disabled &&\r\n setVisible(\r\n startOfMonth(\r\n new Date(visible.getFullYear(), i, 1)\r\n )\r\n )\r\n }\r\n >\r\n {ml}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* CALENDAR */}\r\n {!showYMM && (\r\n <div className=\"drp-calendar\">\r\n <div className=\"drp-weekdays\">\r\n {weekdays.map((w, i) => (\r\n <div key={i} className=\"drp-weekday\">\r\n {w}\r\n </div>\r\n ))}\r\n </div>\r\n\r\n <div className=\"drp-days\">\r\n {grid.map((cell, idx) => {\r\n if (cell === null)\r\n return <div key={idx} className=\"drp-day-empty\" />;\r\n\r\n const dt = new Date(\r\n visible.getFullYear(),\r\n visible.getMonth(),\r\n cell\r\n );\r\n const disabled = isDisabled(dt);\r\n\r\n const start = isStart(dt);\r\n const end = isEnd(dt);\r\n const between = inRange(dt);\r\n const drag = inDragRange(dt);\r\n\r\n const key = `${visible.getFullYear()}-${visible.getMonth()}-${cell}`;\r\n\r\n return (\r\n <button\r\n key={key}\r\n ref={(el) => {\r\n dayRefs.current[key] = el;\r\n }}\r\n disabled={disabled ? true : undefined}\r\n className={[\r\n 'drp-day',\r\n start ? 'start' : '',\r\n end ? 'end' : '',\r\n between ? 'between' : '',\r\n drag ? 'dragging' : '',\r\n disabled ? 'disabled' : '',\r\n ].join(' ')}\r\n onClick={() => !disabled && pickDay(cell)}\r\n onKeyDown={(e) => onDayKey(e, cell)}\r\n onMouseDown={(e) => {\r\n if (disabled) return;\r\n e.preventDefault();\r\n setDragStart(dt);\r\n setDragEnd(dt);\r\n setIsDragging(true);\r\n }}\r\n onMouseEnter={() => {\r\n if (!isDragging || disabled) return;\r\n setDragEnd(dt);\r\n }}\r\n >\r\n {cell}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* FOOTER */}\r\n <div className=\"drp-footer\">\r\n <button\r\n className=\"drp-clear\"\r\n onClick={() => {\r\n const empty = { from: undefined, to: undefined };\r\n if (!controlled) setInternal(empty);\r\n onChange?.(empty);\r\n setOpen(false);\r\n setShowYMM(false);\r\n }}\r\n >\r\n Clear\r\n </button>\r\n\r\n <button\r\n className=\"drp-close\"\r\n onClick={() => {\r\n setOpen(false);\r\n setShowYMM(false);\r\n }}\r\n >\r\n Close\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </Portal>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["pad","n","toISO","d","fromISO","s","y","m","dt","asDate","v","startOfMonth","addMonths","daysInMonth","DateRangePicker","value","defaultValue","onChange","minDate","maxDate","placeholder","locale","id","className","nameFrom","nameTo","controlled","internal","setInternal","useState","range","fromDate","toDate","initialVisible","visible","setVisible","open","setOpen","showYMM","setShowYMM","activePart","setActivePart","triggerRef","useRef","popRef","dayRefs","minDt","maxDt","isDisabled","dragStart","setDragStart","dragEnd","setDragEnd","isDragging","setIsDragging","inDragRange","a","b","useEffect","onClickOutside","t","restoreFocus","pos","setPos","r","grid","useMemo","startDow","total","g","i","weekdays","_","visibleYear","YEAR_SPAN","yearStart","years","months","isMonthDisabled","e","normalizeRange","ta","tb","commitRange","useCallback","out","pickDay","stopDrag","inRange","isStart","isEnd","focusDay","idx","key","onDayKey","day","c","cols","nextIdx","label","jsxs","jsx","Portal","ml","disabled","w","cell","start","end","between","drag","el","empty"],"mappings":"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"}
1
+ {"version":3,"file":"DateRangePicker.js","sources":["../../../src/components/daterangepicker/DateRangePicker.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useState,\n useRef,\n useEffect,\n useMemo,\n useCallback,\n KeyboardEvent,\n useLayoutEffect,\n} from 'react';\nimport { cn } from '../../utils';\nimport { Portal, onClickOutside, restoreFocus } from '../../utils';\nimport './DateRangePicker.css';\n\n/* ----------------------------------------------------\n Helpers\n---------------------------------------------------- */\nconst pad = (n: number) => (n < 10 ? `0${n}` : `${n}`);\nconst toISO = (d: Date) => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n\nfunction fromISO(s?: string | null): Date | null {\n if (!s) return null;\n const [y, m, d] = s.split('-').map(Number);\n const dt = new Date(y, m - 1, d);\n return Number.isNaN(dt.getTime()) ? null : dt;\n}\n\nconst asDate = (v: Date | null | undefined): Date | null => (v ? v : null);\nconst startOfMonth = (d: Date) => new Date(d.getFullYear(), d.getMonth(), 1);\nconst addMonths = (d: Date, n: number) => new Date(d.getFullYear(), d.getMonth() + n, 1);\nconst daysInMonth = (d: Date) => new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();\n\n/* ----------------------------------------------------\n Types\n---------------------------------------------------- */\nexport interface DateRange {\n from?: string;\n to?: string;\n}\n\nexport interface DateRangePickerProps {\n value?: DateRange;\n defaultValue?: DateRange;\n onChange?: (r: DateRange) => void;\n\n minDate?: string;\n maxDate?: string;\n\n placeholder?: string;\n locale?: string;\n\n id?: string;\n className?: string;\n\n nameFrom?: string;\n nameTo?: string;\n disabled?: boolean;\n \n formatDisplay?: (date: Date) => string;\n}\n\n/* ----------------------------------------------------\n Component\n---------------------------------------------------- */\nexport function DateRangePicker({\n value,\n defaultValue,\n onChange,\n minDate,\n maxDate,\n placeholder = 'Pick range',\n locale = 'en-US',\n id,\n className,\n nameFrom,\n nameTo,\n disabled = false,\n formatDisplay,\n}: DateRangePickerProps) {\n const controlled = value !== undefined;\n const [internal, setInternal] = useState<DateRange | undefined>(defaultValue);\n const range: DateRange = controlled ? value || {} : internal || {};\n\n const fromDate = fromISO(range.from);\n const toDate = fromISO(range.to);\n\n const today = new Date();\n const initialVisible = startOfMonth(fromDate ?? toDate ?? today);\n\n const [visible, setVisible] = useState<Date>(initialVisible);\n const [open, setOpen] = useState(false);\n const [showYMM, setShowYMM] = useState(false);\n\n const [activePart, setActivePart] = useState<'from' | 'to'>('from');\n\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const popRef = useRef<HTMLDivElement | null>(null);\n const dayRefs = useRef<Record<string, HTMLButtonElement | null>>({});\n const selectedYearRef = useRef<HTMLButtonElement | null>(null);\n \n const calendarRef = useRef<HTMLDivElement | null>(null);\n\n /* ----------------------------------------------------\n Min/max\n ---------------------------------------------------- */\n const minDt = fromISO(minDate);\n const maxDt = fromISO(maxDate);\n\n const isDisabled = useCallback((d: Date) => {\n if (minDt && d < minDt) return true;\n if (maxDt && d > maxDt) return true;\n return false;\n }, [minDt, maxDt]);\n\n /* ----------------------------------------------------\n Drag select\n ---------------------------------------------------- */\n const [dragStart, setDragStart] = useState<Date | null>(null);\n const [dragEnd, setDragEnd] = useState<Date | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n\n const inDragRange = useCallback((d: Date) => {\n if (!isDragging || !dragStart || !dragEnd) return false;\n const t = d.getTime();\n const a = dragStart.getTime();\n const b = dragEnd.getTime();\n return t >= Math.min(a, b) && t <= Math.max(a, b);\n }, [isDragging, dragStart, dragEnd]);\n\n /* ----------------------------------------------------\n Click outside to close & Restore Focus\n ---------------------------------------------------- */\n useEffect(() => {\n if (!open) return;\n const cleanup = onClickOutside([popRef, triggerRef], () => {\n setOpen(false);\n setShowYMM(false);\n });\n return cleanup;\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n const t = triggerRef.current;\n \n const timeoutId = setTimeout(() => {\n if (calendarRef.current && !showYMM) {\n calendarRef.current.focus();\n }\n }, 10);\n\n return () => {\n clearTimeout(timeoutId);\n restoreFocus(t);\n };\n }, [open, showYMM]);\n\n /* ----------------------------------------------------\n Smart Popover Position (with collision math)\n ---------------------------------------------------- */\n const [coords, setCoords] = useState({ top: -9999, left: -9999 });\n\n const updatePosition = useCallback(() => {\n if (!triggerRef.current || !popRef.current) return;\n\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const popRect = popRef.current.getBoundingClientRect();\n\n const scrollY = window.scrollY;\n const scrollX = window.scrollX;\n\n let top = triggerRect.bottom + scrollY + 8;\n let left = triggerRect.left + scrollX;\n\n const padding = 16;\n\n const maxLeft = document.documentElement.clientWidth - popRect.width - padding;\n if (left > maxLeft + scrollX) {\n left = triggerRect.right + scrollX - popRect.width;\n if (left < padding + scrollX) left = padding + scrollX; \n }\n\n if (triggerRect.bottom + popRect.height + 8 > document.documentElement.clientHeight - padding) {\n top = triggerRect.top + scrollY - popRect.height - 8;\n \n if (top < padding + scrollY) {\n top = padding + scrollY; \n }\n }\n\n setCoords({ top, left });\n }, []);\n\n useLayoutEffect(() => {\n if (!open) return;\n updatePosition();\n window.addEventListener('resize', updatePosition);\n window.addEventListener('scroll', updatePosition, true);\n return () => {\n window.removeEventListener('resize', updatePosition);\n window.removeEventListener('scroll', updatePosition, true);\n };\n }, [open, updatePosition]);\n\n /* ------------------------------------------\n Auto-Scroll Year Selector\n ------------------------------------------- */\n useEffect(() => {\n if (showYMM && selectedYearRef.current) {\n selectedYearRef.current.scrollIntoView({ block: 'center', behavior: 'smooth' });\n }\n }, [showYMM]);\n\n /* ----------------------------------------------------\n Grid computation\n ---------------------------------------------------- */\n const grid = useMemo(() => {\n const first = startOfMonth(visible);\n const startDow = first.getDay();\n const total = daysInMonth(visible);\n const g: (number | null)[] = [];\n \n for (let i = 0; i < startDow; i++) g.push(null);\n for (let d = 1; d <= total; d++) g.push(d);\n while (g.length % 7 !== 0) g.push(null);\n return g;\n }, [visible]);\n\n const weekdays = useMemo(\n () => Array.from({ length: 7 }).map((_, i) =>\n new Date(2020, 5, 7 + i).toLocaleDateString(locale, { weekday: 'short' })\n ),\n [locale]\n );\n\n /* ----------------------------------------------------\n Month/year panel\n ---------------------------------------------------- */\n const visibleYear = visible.getFullYear();\n const YEAR_SPAN = 100;\n const yearStart = visibleYear - YEAR_SPAN;\n\n const years = useMemo(\n () => Array.from({ length: YEAR_SPAN * 2 + 1 }).map((_, i) => yearStart + i),\n [yearStart]\n );\n\n const months = useMemo(\n () => Array.from({ length: 12 }).map((_, i) =>\n new Date(2020, i, 1).toLocaleDateString(locale, { month: 'short' })\n ),\n [locale]\n );\n\n const isMonthDisabled = useCallback((y: number, m: number) => {\n const s = new Date(y, m, 1);\n const e = new Date(y, m, daysInMonth(s));\n if (minDt && e < minDt) return true;\n if (maxDt && s > maxDt) return true;\n return false;\n }, [minDt, maxDt]);\n\n /* ----------------------------------------------------\n Normalize + commit range\n ---------------------------------------------------- */\n const normalizeRange = (a: Date | null, b: Date | null) => {\n if (!a && !b) return { from: undefined, to: undefined };\n if (!a) return { from: undefined, to: b ? toISO(b) : undefined };\n if (!b) return { from: toISO(a), to: undefined };\n\n return a.getTime() <= b.getTime()\n ? { from: toISO(a), to: toISO(b) }\n : { from: toISO(b), to: toISO(a) };\n };\n\n const commitRange = useCallback((a: Date | null, b: Date | null) => {\n const out = normalizeRange(a, b);\n if (!controlled) setInternal(out);\n onChange?.(out);\n }, [onChange, controlled]);\n\n /* ----------------------------------------------------\n Clicking days\n ---------------------------------------------------- */\n const pickDay = (d: number) => {\n const dt = new Date(visible.getFullYear(), visible.getMonth(), d);\n if (isDisabled(dt)) return;\n\n let s = fromDate;\n let e = toDate;\n\n if (activePart === 'from') {\n s = dt;\n if (e && dt > e) e = null;\n setActivePart('to'); \n } else {\n e = dt;\n if (s && dt < s) {\n s = dt;\n e = null;\n }\n }\n\n commitRange(asDate(s), asDate(e));\n };\n\n /* ----------------------------------------------------\n Drag end (global)\n ---------------------------------------------------- */\n useEffect(() => {\n const stopDrag = () => {\n if (!isDragging) return;\n setIsDragging(false);\n\n if (dragStart && dragEnd) {\n if (dragStart.getTime() !== dragEnd.getTime()) {\n const s = dragStart <= dragEnd ? dragStart : dragEnd;\n const e = dragStart <= dragEnd ? dragEnd : dragStart;\n commitRange(s, e);\n setActivePart('from');\n }\n }\n\n setDragStart(null);\n setDragEnd(null);\n };\n\n window.addEventListener('mouseup', stopDrag);\n return () => window.removeEventListener('mouseup', stopDrag);\n }, [isDragging, dragStart, dragEnd, commitRange]);\n\n /* ----------------------------------------------------\n Range flags\n ---------------------------------------------------- */\n const inRange = useCallback((dt: Date) => {\n if (!fromDate || !toDate) return false;\n return dt > fromDate && dt < toDate;\n }, [fromDate, toDate]);\n\n const isStart = useCallback((dt: Date) => \n fromDate && dt.getTime() === fromDate.getTime()\n , [fromDate]);\n \n const isEnd = useCallback((dt: Date) => \n toDate && dt.getTime() === toDate.getTime()\n , [toDate]);\n\n /* ----------------------------------------------------\n Keyboard nav\n ---------------------------------------------------- */\n const focusDay = (idx: number) => {\n if (idx < 0 || idx >= grid.length) return;\n const d = grid[idx];\n if (!d) return;\n const key = `${visible.getFullYear()}-${visible.getMonth()}-${d}`;\n dayRefs.current[key]?.focus();\n };\n\n const onCalendarKey = (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.target === calendarRef.current && ['ArrowRight', 'ArrowLeft', 'ArrowDown', 'ArrowUp'].includes(e.key)) {\n e.preventDefault();\n \n const targetDate = fromDate || new Date();\n const d = (targetDate.getMonth() === visible.getMonth() && targetDate.getFullYear() === visible.getFullYear())\n ? targetDate.getDate()\n : 1;\n\n const idx = grid.findIndex((c) => c === d);\n \n if (idx !== -1) {\n focusDay(idx);\n } else {\n const firstValidIdx = grid.findIndex((c) => c !== null);\n if (firstValidIdx !== -1) focusDay(firstValidIdx);\n }\n }\n }\n\n const onDayKey = (e: KeyboardEvent<HTMLButtonElement>, day: number) => {\n const idx = grid.findIndex((c) => c === day);\n if (idx === -1) return;\n\n const cols = 7;\n let nextIdx: number | null = null;\n\n switch (e.key) {\n case 'ArrowRight': nextIdx = idx + 1; break;\n case 'ArrowLeft': nextIdx = idx - 1; break;\n case 'ArrowDown': nextIdx = idx + cols; break;\n case 'ArrowUp': nextIdx = idx - cols; break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n pickDay(day);\n return;\n case 'PageUp':\n setVisible((v) => addMonths(v, -1));\n return;\n case 'PageDown':\n setVisible((v) => addMonths(v, 1));\n return;\n case 'Escape':\n setOpen(false);\n return;\n default: return;\n }\n\n e.preventDefault();\n if (nextIdx != null && grid[nextIdx] != null) focusDay(nextIdx);\n };\n\n /* ----------------------------------------------------\n Trigger label (with formatting)\n ---------------------------------------------------- */\n const formatLabel = (iso?: string) => {\n if (!iso) return null;\n const d = fromISO(iso);\n if (!d) return null;\n return formatDisplay \n ? formatDisplay(d)\n : new Intl.DateTimeFormat(locale, { year: 'numeric', month: 'short', day: 'numeric' }).format(d);\n };\n\n const label = (): string => {\n if (!range.from && !range.to) return placeholder;\n const f = formatLabel(range.from);\n const t = formatLabel(range.to);\n \n if (f && !t) return `${f} → `;\n if (!f && t) return ` → ${t}`;\n return `${f} → ${t}`;\n };\n\n /* ----------------------------------------------------\n Render\n ---------------------------------------------------- */\n return (\n <div className={cn(\"nui-daterange-root\", className)}>\n {nameFrom && <input type=\"hidden\" name={nameFrom} value={range.from ?? ''} />}\n {nameTo && <input type=\"hidden\" name={nameTo} value={range.to ?? ''} />}\n\n <button\n id={id}\n ref={triggerRef}\n type=\"button\"\n disabled={disabled}\n className=\"nui-daterange-trigger\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={() => {\n setOpen((s) => !s);\n setShowYMM(false);\n if (!range.from && !range.to) {\n setActivePart('from');\n }\n }}\n >\n <span className={(!range.from && !range.to) ? \"nui-daterange-placeholder\" : \"\"}>\n {label()}\n </span>\n <svg className=\"nui-daterange-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line>\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line>\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line>\n </svg>\n </button>\n\n {open && (\n <Portal>\n <div\n ref={popRef}\n className=\"nui-daterange-popover\"\n style={{ position: 'absolute', top: coords.top, left: coords.left }}\n >\n <div className=\"nui-daterange-panel\">\n \n {/* Internal Part Toggle */}\n <div className=\"nui-daterange-actions\">\n <button\n className={cn(\"nui-daterange-part\", activePart === 'from' && \"active\")}\n onClick={() => setActivePart('from')}\n >\n Start Date\n </button>\n <button\n disabled={!range.from}\n className={cn(\"nui-daterange-part\", activePart === 'to' && \"active\")}\n onClick={() => setActivePart('to')}\n >\n End Date\n </button>\n </div>\n\n {/* HEADER */}\n <div className=\"nui-daterange-header\">\n <button\n className=\"nui-daterange-arrow\"\n onClick={() => setVisible((v) => addMonths(v, -1))}\n aria-label=\"Previous Month\"\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\n <button\n className=\"nui-daterange-ym-toggle\"\n onClick={() => setShowYMM((s) => !s)}\n >\n {visible.toLocaleDateString(locale, { month: 'long' })} {visible.getFullYear()}\n </button>\n\n <button\n className=\"nui-daterange-arrow\"\n onClick={() => setVisible((v) => addMonths(v, 1))}\n aria-label=\"Next Month\"\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\n {/* YEAR + MONTH PANEL */}\n {showYMM && (\n <div className=\"nui-daterange-ym-panel\">\n <div className=\"nui-daterange-year-grid\">\n {years.map((y) => {\n const sel = y === visible.getFullYear();\n return (\n <button\n key={y}\n ref={sel ? selectedYearRef : null}\n className={cn(\"nui-daterange-year\", sel && \"selected\")}\n onClick={() => setVisible(startOfMonth(new Date(y, visible.getMonth(), 1)))}\n >\n {y}\n </button>\n );\n })}\n </div>\n\n <div className=\"nui-daterange-month-grid\">\n {months.map((ml, i) => {\n const disabled = isMonthDisabled(visible.getFullYear(), i);\n const sel = i === visible.getMonth();\n return (\n <button\n key={i}\n className={cn(\"nui-daterange-month\", disabled && \"disabled\", sel && \"selected\")}\n disabled={disabled ? true : undefined}\n onClick={() => {\n if (!disabled) {\n setVisible(startOfMonth(new Date(visible.getFullYear(), i, 1)));\n setShowYMM(false);\n }\n }}\n >\n {ml}\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* CALENDAR */}\n {!showYMM && (\n <div \n className=\"nui-daterange-calendar\" \n role=\"grid\"\n ref={calendarRef}\n tabIndex={-1}\n onKeyDown={onCalendarKey}\n style={{ outline: 'none' }}\n >\n <div className=\"nui-daterange-weekdays\" role=\"row\">\n {weekdays.map((w, i) => (\n <div key={i} className=\"nui-daterange-weekday\" role=\"columnheader\">{w}</div>\n ))}\n </div>\n\n <div className=\"nui-daterange-days\" role=\"rowgroup\">\n {grid.map((cell, idx) => {\n if (cell === null) return <div key={idx} className=\"nui-daterange-empty\" role=\"gridcell\" />;\n\n const dt = new Date(visible.getFullYear(), visible.getMonth(), cell);\n const disabled = isDisabled(dt);\n\n const start = isStart(dt);\n const end = isEnd(dt);\n const between = inRange(dt);\n const drag = inDragRange(dt);\n\n const key = `${visible.getFullYear()}-${visible.getMonth()}-${cell}`;\n\n return (\n <button\n key={key}\n role=\"gridcell\"\n ref={(el) => { dayRefs.current[key] = el; }}\n disabled={disabled ? true : undefined}\n className={cn(\n \"nui-daterange-day\",\n start && \"start\",\n end && \"end\",\n between && \"between\",\n drag && \"dragging\",\n disabled && \"disabled\"\n )}\n onClick={() => !disabled && pickDay(cell)}\n onKeyDown={(e) => onDayKey(e, cell)}\n onMouseDown={(e) => {\n if (disabled) return;\n e.preventDefault(); \n setDragStart(dt);\n setDragEnd(dt);\n setIsDragging(true);\n }}\n onMouseEnter={() => {\n if (!isDragging || disabled) return;\n setDragEnd(dt);\n }}\n >\n {cell}\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* FOOTER */}\n <div className=\"nui-daterange-footer\">\n <button\n className=\"nui-daterange-clear\"\n onClick={() => {\n const empty = { from: undefined, to: undefined };\n if (!controlled) setInternal(empty);\n onChange?.(empty);\n setActivePart('from');\n setOpen(false); // Restored proper clear/close behavior\n setShowYMM(false);\n }}\n >\n Clear\n </button>\n\n <button\n className=\"nui-daterange-close\"\n onClick={() => {\n setOpen(false);\n setShowYMM(false);\n }}\n >\n Apply\n </button>\n </div>\n </div>\n </div>\n </Portal>\n )}\n </div>\n );\n}"],"names":["pad","n","toISO","d","fromISO","s","y","m","dt","asDate","v","startOfMonth","addMonths","daysInMonth","DateRangePicker","value","defaultValue","onChange","minDate","maxDate","placeholder","locale","id","className","nameFrom","nameTo","disabled","formatDisplay","controlled","internal","setInternal","useState","range","fromDate","toDate","initialVisible","visible","setVisible","open","setOpen","showYMM","setShowYMM","activePart","setActivePart","triggerRef","useRef","popRef","dayRefs","selectedYearRef","calendarRef","minDt","maxDt","isDisabled","useCallback","dragStart","setDragStart","dragEnd","setDragEnd","isDragging","setIsDragging","inDragRange","a","b","useEffect","onClickOutside","t","timeoutId","restoreFocus","coords","setCoords","updatePosition","triggerRect","popRect","scrollY","scrollX","top","left","padding","maxLeft","useLayoutEffect","grid","useMemo","startDow","total","g","i","weekdays","_","visibleYear","YEAR_SPAN","yearStart","years","months","isMonthDisabled","e","normalizeRange","commitRange","out","pickDay","stopDrag","inRange","isStart","isEnd","focusDay","idx","key","onCalendarKey","targetDate","c","firstValidIdx","onDayKey","day","cols","nextIdx","formatLabel","iso","label","f","cn","jsx","jsxs","Portal","sel","ml","w","cell","start","end","between","drag","el","empty"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),a=require("react"),s=require("./dialogStore.cjs"),u=require("../modal/Modal.cjs"),l=require("../button/Button.cjs"),d=require("../toast/Toast.cjs"),g=()=>{const e=a.useSyncExternalStore(s.dialogStore.subscribe,s.dialogStore.getState,s.dialogStore.getState),i=n=>{e.resolve&&e.resolve(n),s.dialogStore.setState({isOpen:!1,resolve:null})},c=()=>{i(e.type==="alert")},{show:r}=d.useToast();return a.useEffect(()=>s.toastEmitter.subscribe(o=>{r(o.message,{variant:o.variant,...o.options})}),[r]),t.jsxs(u.Modal,{open:e.isOpen,onClose:c,title:e.title,disableClickOutside:e.type==="confirm",hideCloseButton:!0,style:{maxWidth:"400px"},children:[t.jsx("div",{className:"nui-dialog-message",style:{color:"var(--nui-fg-subtle)",fontSize:"var(--nui-text-sm)",lineHeight:1.5,marginBottom:"var(--nui-space-6)"},children:e.message}),t.jsxs("div",{className:"nui-dialog-actions",style:{display:"flex",justifyContent:"flex-end",gap:"var(--nui-space-3)"},children:[e.type==="confirm"&&t.jsx(l.Button,{variant:"outline",onClick:()=>i(!1),children:e.cancelText}),t.jsx(l.Button,{variant:e.isDanger?"danger":"primary",onClick:()=>i(!0),children:e.confirmText})]})]})};exports.DialogProvider=g;
2
+ //# sourceMappingURL=DialogProvider.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DialogProvider.cjs","sources":["../../../src/components/dialog/DialogProvider.tsx"],"sourcesContent":["// src/components/dialog/DialogProvider.tsx\n\"use client\";\n\nimport { useSyncExternalStore, useEffect } from 'react';\nimport { dialogStore, toastEmitter } from './dialogStore';\nimport { Modal } from '../modal/Modal'; \nimport { Button } from '../button/Button';\nimport { useToast } from '../toast/Toast'; \n\nexport const DialogProvider = () => {\n /* --- 1. DIALOG LOGIC --- */\n const state = useSyncExternalStore(\n dialogStore.subscribe,\n dialogStore.getState,\n dialogStore.getState \n );\n\n const handleClose = (result: boolean) => {\n if (state.resolve) state.resolve(result);\n dialogStore.setState({ isOpen: false, resolve: null });\n };\n\n const handleModalClose = () => {\n handleClose(state.type === 'alert' ? true : false);\n };\n\n /* --- 2. TOAST EVENT BRIDGE LOGIC --- */\n // We grab the show function from your existing untouched ToastProvider\n const { show } = useToast();\n\n useEffect(() => {\n // Whenever a developer calls nui.success() in vanilla JS, this catches it\n const unsubscribe = toastEmitter.subscribe((payload) => {\n // And passes it to your untouched React Toast system!\n show(payload.message, { variant: payload.variant, ...payload.options });\n });\n\n return unsubscribe;\n }, [show]);\n\n /* --- 3. RENDER --- */\n return (\n <Modal\n open={state.isOpen}\n onClose={handleModalClose}\n title={state.title}\n disableClickOutside={state.type === 'confirm'}\n hideCloseButton={true}\n style={{ maxWidth: '400px' }} \n >\n <div \n className=\"nui-dialog-message\" \n style={{ \n color: 'var(--nui-fg-subtle)', \n fontSize: 'var(--nui-text-sm)', \n lineHeight: 1.5,\n marginBottom: 'var(--nui-space-6)' \n }}\n >\n {state.message}\n </div>\n\n <div \n className=\"nui-dialog-actions\" \n style={{ \n display: 'flex', \n justifyContent: 'flex-end', \n gap: 'var(--nui-space-3)' \n }}\n >\n {state.type === 'confirm' && (\n <Button variant=\"outline\" onClick={() => handleClose(false)}>\n {state.cancelText}\n </Button>\n )}\n\n <Button\n variant={state.isDanger ? 'danger' : 'primary'}\n onClick={() => handleClose(true)}\n >\n {state.confirmText}\n </Button>\n </div>\n </Modal>\n );\n};"],"names":["DialogProvider","state","useSyncExternalStore","dialogStore","handleClose","result","handleModalClose","show","useToast","useEffect","toastEmitter","payload","jsxs","Modal","jsx","Button"],"mappings":"yQASaA,EAAiB,IAAM,CAElC,MAAMC,EAAQC,EAAAA,qBACZC,EAAAA,YAAY,UACZA,EAAAA,YAAY,SACZA,cAAY,QAAA,EAGRC,EAAeC,GAAoB,CACnCJ,EAAM,SAASA,EAAM,QAAQI,CAAM,EACvCF,EAAAA,YAAY,SAAS,CAAE,OAAQ,GAAO,QAAS,KAAM,CACvD,EAEMG,EAAmB,IAAM,CAC7BF,EAAYH,EAAM,OAAS,OAAsB,CACnD,EAIM,CAAE,KAAAM,CAAA,EAASC,WAAA,EAEjBC,OAAAA,EAAAA,UAAU,IAEYC,EAAAA,aAAa,UAAWC,GAAY,CAEtDJ,EAAKI,EAAQ,QAAS,CAAE,QAASA,EAAQ,QAAS,GAAGA,EAAQ,QAAS,CACxE,CAAC,EAGA,CAACJ,CAAI,CAAC,EAIPK,EAAAA,KAACC,EAAAA,MAAA,CACC,KAAMZ,EAAM,OACZ,QAASK,EACT,MAAOL,EAAM,MACb,oBAAqBA,EAAM,OAAS,UACpC,gBAAiB,GACjB,MAAO,CAAE,SAAU,OAAA,EAEnB,SAAA,CAAAa,EAAAA,IAAC,MAAA,CACC,UAAU,qBACV,MAAO,CACL,MAAO,uBACP,SAAU,qBACV,WAAY,IACZ,aAAc,oBAAA,EAGf,SAAAb,EAAM,OAAA,CAAA,EAGTW,EAAAA,KAAC,MAAA,CACC,UAAU,qBACV,MAAO,CACL,QAAS,OACT,eAAgB,WAChB,IAAK,oBAAA,EAGN,SAAA,CAAAX,EAAM,OAAS,WACda,EAAAA,IAACC,EAAAA,OAAA,CAAO,QAAQ,UAAU,QAAS,IAAMX,EAAY,EAAK,EACvD,SAAAH,EAAM,WACT,EAGFa,EAAAA,IAACC,EAAAA,OAAA,CACC,QAASd,EAAM,SAAW,SAAW,UACrC,QAAS,IAAMG,EAAY,EAAI,EAE9B,SAAAH,EAAM,WAAA,CAAA,CACT,CAAA,CAAA,CACF,CAAA,CAAA,CAGN"}
@@ -0,0 +1,71 @@
1
+ import { jsxs as a, jsx as r } from "react/jsx-runtime";
2
+ import { useSyncExternalStore as u, useEffect as m } from "react";
3
+ import { dialogStore as t, toastEmitter as d } from "./dialogStore.js";
4
+ import { Modal as f } from "../modal/Modal.js";
5
+ import { Button as l } from "../button/Button.js";
6
+ import { useToast as p } from "../toast/Toast.js";
7
+ const C = () => {
8
+ const e = u(
9
+ t.subscribe,
10
+ t.getState,
11
+ t.getState
12
+ ), s = (n) => {
13
+ e.resolve && e.resolve(n), t.setState({ isOpen: !1, resolve: null });
14
+ }, c = () => {
15
+ s(e.type === "alert");
16
+ }, { show: o } = p();
17
+ return m(() => d.subscribe((i) => {
18
+ o(i.message, { variant: i.variant, ...i.options });
19
+ }), [o]), /* @__PURE__ */ a(
20
+ f,
21
+ {
22
+ open: e.isOpen,
23
+ onClose: c,
24
+ title: e.title,
25
+ disableClickOutside: e.type === "confirm",
26
+ hideCloseButton: !0,
27
+ style: { maxWidth: "400px" },
28
+ children: [
29
+ /* @__PURE__ */ r(
30
+ "div",
31
+ {
32
+ className: "nui-dialog-message",
33
+ style: {
34
+ color: "var(--nui-fg-subtle)",
35
+ fontSize: "var(--nui-text-sm)",
36
+ lineHeight: 1.5,
37
+ marginBottom: "var(--nui-space-6)"
38
+ },
39
+ children: e.message
40
+ }
41
+ ),
42
+ /* @__PURE__ */ a(
43
+ "div",
44
+ {
45
+ className: "nui-dialog-actions",
46
+ style: {
47
+ display: "flex",
48
+ justifyContent: "flex-end",
49
+ gap: "var(--nui-space-3)"
50
+ },
51
+ children: [
52
+ e.type === "confirm" && /* @__PURE__ */ r(l, { variant: "outline", onClick: () => s(!1), children: e.cancelText }),
53
+ /* @__PURE__ */ r(
54
+ l,
55
+ {
56
+ variant: e.isDanger ? "danger" : "primary",
57
+ onClick: () => s(!0),
58
+ children: e.confirmText
59
+ }
60
+ )
61
+ ]
62
+ }
63
+ )
64
+ ]
65
+ }
66
+ );
67
+ };
68
+ export {
69
+ C as DialogProvider
70
+ };
71
+ //# sourceMappingURL=DialogProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DialogProvider.js","sources":["../../../src/components/dialog/DialogProvider.tsx"],"sourcesContent":["// src/components/dialog/DialogProvider.tsx\n\"use client\";\n\nimport { useSyncExternalStore, useEffect } from 'react';\nimport { dialogStore, toastEmitter } from './dialogStore';\nimport { Modal } from '../modal/Modal'; \nimport { Button } from '../button/Button';\nimport { useToast } from '../toast/Toast'; \n\nexport const DialogProvider = () => {\n /* --- 1. DIALOG LOGIC --- */\n const state = useSyncExternalStore(\n dialogStore.subscribe,\n dialogStore.getState,\n dialogStore.getState \n );\n\n const handleClose = (result: boolean) => {\n if (state.resolve) state.resolve(result);\n dialogStore.setState({ isOpen: false, resolve: null });\n };\n\n const handleModalClose = () => {\n handleClose(state.type === 'alert' ? true : false);\n };\n\n /* --- 2. TOAST EVENT BRIDGE LOGIC --- */\n // We grab the show function from your existing untouched ToastProvider\n const { show } = useToast();\n\n useEffect(() => {\n // Whenever a developer calls nui.success() in vanilla JS, this catches it\n const unsubscribe = toastEmitter.subscribe((payload) => {\n // And passes it to your untouched React Toast system!\n show(payload.message, { variant: payload.variant, ...payload.options });\n });\n\n return unsubscribe;\n }, [show]);\n\n /* --- 3. RENDER --- */\n return (\n <Modal\n open={state.isOpen}\n onClose={handleModalClose}\n title={state.title}\n disableClickOutside={state.type === 'confirm'}\n hideCloseButton={true}\n style={{ maxWidth: '400px' }} \n >\n <div \n className=\"nui-dialog-message\" \n style={{ \n color: 'var(--nui-fg-subtle)', \n fontSize: 'var(--nui-text-sm)', \n lineHeight: 1.5,\n marginBottom: 'var(--nui-space-6)' \n }}\n >\n {state.message}\n </div>\n\n <div \n className=\"nui-dialog-actions\" \n style={{ \n display: 'flex', \n justifyContent: 'flex-end', \n gap: 'var(--nui-space-3)' \n }}\n >\n {state.type === 'confirm' && (\n <Button variant=\"outline\" onClick={() => handleClose(false)}>\n {state.cancelText}\n </Button>\n )}\n\n <Button\n variant={state.isDanger ? 'danger' : 'primary'}\n onClick={() => handleClose(true)}\n >\n {state.confirmText}\n </Button>\n </div>\n </Modal>\n );\n};"],"names":["DialogProvider","state","useSyncExternalStore","dialogStore","handleClose","result","handleModalClose","show","useToast","useEffect","toastEmitter","payload","jsxs","Modal","jsx","Button"],"mappings":";;;;;;AASO,MAAMA,IAAiB,MAAM;AAElC,QAAMC,IAAQC;AAAA,IACZC,EAAY;AAAA,IACZA,EAAY;AAAA,IACZA,EAAY;AAAA,EAAA,GAGRC,IAAc,CAACC,MAAoB;AACvC,IAAIJ,EAAM,WAASA,EAAM,QAAQI,CAAM,GACvCF,EAAY,SAAS,EAAE,QAAQ,IAAO,SAAS,MAAM;AAAA,EACvD,GAEMG,IAAmB,MAAM;AAC7B,IAAAF,EAAYH,EAAM,SAAS,OAAsB;AAAA,EACnD,GAIM,EAAE,MAAAM,EAAA,IAASC,EAAA;AAEjB,SAAAC,EAAU,MAEYC,EAAa,UAAU,CAACC,MAAY;AAEtD,IAAAJ,EAAKI,EAAQ,SAAS,EAAE,SAASA,EAAQ,SAAS,GAAGA,EAAQ,SAAS;AAAA,EACxE,CAAC,GAGA,CAACJ,CAAI,CAAC,GAIP,gBAAAK;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAMZ,EAAM;AAAA,MACZ,SAASK;AAAA,MACT,OAAOL,EAAM;AAAA,MACb,qBAAqBA,EAAM,SAAS;AAAA,MACpC,iBAAiB;AAAA,MACjB,OAAO,EAAE,UAAU,QAAA;AAAA,MAEnB,UAAA;AAAA,QAAA,gBAAAa;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,OAAO;AAAA,cACP,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,cAAc;AAAA,YAAA;AAAA,YAGf,UAAAb,EAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAGT,gBAAAW;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,SAAS;AAAA,cACT,gBAAgB;AAAA,cAChB,KAAK;AAAA,YAAA;AAAA,YAGN,UAAA;AAAA,cAAAX,EAAM,SAAS,aACd,gBAAAa,EAACC,GAAA,EAAO,SAAQ,WAAU,SAAS,MAAMX,EAAY,EAAK,GACvD,UAAAH,EAAM,YACT;AAAA,cAGF,gBAAAa;AAAA,gBAACC;AAAA,gBAAA;AAAA,kBACC,SAASd,EAAM,WAAW,WAAW;AAAA,kBACrC,SAAS,MAAMG,EAAY,EAAI;AAAA,kBAE9B,UAAAH,EAAM;AAAA,gBAAA;AAAA,cAAA;AAAA,YACT;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});let a=[],n={isOpen:!1,type:"alert",message:"",resolve:null};const l={getState:()=>n,subscribe:t=>(a.push(t),()=>{a=a.filter(e=>e!==t)}),setState:t=>{n={...n,...t},a.forEach(e=>e())}};let i=[];const r={subscribe:t=>(i.push(t),()=>{i=i.filter(e=>e!==t)}),emit:t=>{i.forEach(e=>e(t))}},c={confirm:(t,e)=>new Promise(s=>{l.setState({isOpen:!0,type:"confirm",message:t,title:e?.title||"Confirm",confirmText:e?.confirmText||"Confirm",cancelText:e?.cancelText||"Cancel",isDanger:e?.isDanger||!1,resolve:s})}),alert:(t,e)=>new Promise(s=>{l.setState({isOpen:!0,type:"alert",message:t,title:e?.title||"Alert",confirmText:e?.confirmText||"OK",isDanger:e?.isDanger||!1,resolve:s})}),toast:(t,e)=>r.emit({variant:"default",message:t,options:e}),success:(t,e)=>r.emit({variant:"success",message:t,options:e}),error:(t,e)=>r.emit({variant:"error",message:t,options:e}),warn:(t,e)=>r.emit({variant:"warning",message:t,options:e})};exports.dialogStore=l;exports.nui=c;exports.toastEmitter=r;
2
+ //# sourceMappingURL=dialogStore.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialogStore.cjs","sources":["../../../src/components/dialog/dialogStore.ts"],"sourcesContent":["// src/components/dialog/dialogStore.ts\nimport React from 'react';\n\n/* -------------------------------------------------------------------------- */\n/* DIALOG LOGIC (Untouched) */\n/* -------------------------------------------------------------------------- */\nexport type DialogType = 'alert' | 'confirm';\n\nexport interface DialogOptions {\n title?: string;\n message: React.ReactNode;\n confirmText?: string;\n cancelText?: string;\n isDanger?: boolean;\n}\n\nexport interface DialogState extends DialogOptions {\n isOpen: boolean;\n type: DialogType;\n resolve: ((value: boolean) => void) | null;\n}\n\nlet dialogListeners: Array<() => void> = [];\nlet dialogState: DialogState = {\n isOpen: false,\n type: 'alert',\n message: '',\n resolve: null,\n};\n\nexport const dialogStore = {\n getState: () => dialogState,\n subscribe: (listener: () => void) => {\n dialogListeners.push(listener);\n return () => {\n dialogListeners = dialogListeners.filter((l) => l !== listener);\n };\n },\n setState: (newState: Partial<DialogState>) => {\n dialogState = { ...dialogState, ...newState };\n dialogListeners.forEach((listener) => listener());\n },\n};\n\n/* -------------------------------------------------------------------------- */\n/* TOAST EVENT BRIDGE */\n/* -------------------------------------------------------------------------- */\n\n// 1. Define the strictly typed options we expect from the user\nexport interface ExternalToastOptions {\n duration?: number;\n description?: React.ReactNode;\n}\n\n// 2. Use the strict interface in the payload instead of 'any'\ntype ToastEventPayload = {\n variant: 'default' | 'success' | 'error' | 'warning';\n message: React.ReactNode;\n options?: ExternalToastOptions;\n};\n\nlet toastListeners: Array<(payload: ToastEventPayload) => void> = [];\n\nexport const toastEmitter = {\n subscribe: (listener: (payload: ToastEventPayload) => void) => {\n toastListeners.push(listener);\n return () => {\n toastListeners = toastListeners.filter((l) => l !== listener);\n };\n },\n emit: (payload: ToastEventPayload) => {\n toastListeners.forEach((listener) => listener(payload));\n },\n};\n\n/* -------------------------------------------------------------------------- */\n/* UNIFIED NUI API */\n/* -------------------------------------------------------------------------- */\nexport const nui = {\n // Dialogs\n confirm: (\n message: React.ReactNode,\n options?: Omit<DialogOptions, 'message'>\n ): Promise<boolean> => {\n return new Promise((resolve) => {\n dialogStore.setState({\n isOpen: true,\n type: 'confirm',\n message,\n title: options?.title || 'Confirm',\n confirmText: options?.confirmText || 'Confirm',\n cancelText: options?.cancelText || 'Cancel',\n isDanger: options?.isDanger || false,\n resolve,\n });\n });\n },\n\n alert: (\n message: React.ReactNode,\n options?: Omit<DialogOptions, 'message'>\n ): Promise<boolean> => {\n return new Promise((resolve) => {\n dialogStore.setState({\n isOpen: true,\n type: 'alert',\n message,\n title: options?.title || 'Alert',\n confirmText: options?.confirmText || 'OK',\n isDanger: options?.isDanger || false,\n resolve,\n });\n });\n },\n\n // Toasts (Fires events to be caught by the DialogProvider)\n toast: (message: React.ReactNode, options?: ExternalToastOptions) =>\n toastEmitter.emit({ variant: 'default', message, options }),\n\n success: (message: React.ReactNode, options?: ExternalToastOptions) =>\n toastEmitter.emit({ variant: 'success', message, options }),\n\n error: (message: React.ReactNode, options?: ExternalToastOptions) =>\n toastEmitter.emit({ variant: 'error', message, options }),\n\n warn: (message: React.ReactNode, options?: ExternalToastOptions) =>\n toastEmitter.emit({ variant: 'warning', message, options }),\n};\n"],"names":["dialogListeners","dialogState","dialogStore","listener","l","newState","toastListeners","toastEmitter","payload","nui","message","options","resolve"],"mappings":"gFAsBA,IAAIA,EAAqC,CAAA,EACrCC,EAA2B,CAC7B,OAAQ,GACR,KAAM,QACN,QAAS,GACT,QAAS,IACX,EAEO,MAAMC,EAAc,CACzB,SAAU,IAAMD,EAChB,UAAYE,IACVH,EAAgB,KAAKG,CAAQ,EACtB,IAAM,CACXH,EAAkBA,EAAgB,OAAQI,GAAMA,IAAMD,CAAQ,CAChE,GAEF,SAAWE,GAAmC,CAC5CJ,EAAc,CAAE,GAAGA,EAAa,GAAGI,CAAA,EACnCL,EAAgB,QAASG,GAAaA,EAAA,CAAU,CAClD,CACF,EAmBA,IAAIG,EAA8D,CAAA,EAE3D,MAAMC,EAAe,CAC1B,UAAYJ,IACVG,EAAe,KAAKH,CAAQ,EACrB,IAAM,CACXG,EAAiBA,EAAe,OAAQF,GAAMA,IAAMD,CAAQ,CAC9D,GAEF,KAAOK,GAA+B,CACpCF,EAAe,QAASH,GAAaA,EAASK,CAAO,CAAC,CACxD,CACF,EAKaC,EAAM,CAEjB,QAAS,CACPC,EACAC,IAEO,IAAI,QAASC,GAAY,CAC9BV,EAAY,SAAS,CACnB,OAAQ,GACR,KAAM,UACN,QAAAQ,EACA,MAAOC,GAAS,OAAS,UACzB,YAAaA,GAAS,aAAe,UACrC,WAAYA,GAAS,YAAc,SACnC,SAAUA,GAAS,UAAY,GAC/B,QAAAC,CAAA,CACD,CACH,CAAC,EAGH,MAAO,CACLF,EACAC,IAEO,IAAI,QAASC,GAAY,CAC9BV,EAAY,SAAS,CACnB,OAAQ,GACR,KAAM,QACN,QAAAQ,EACA,MAAOC,GAAS,OAAS,QACzB,YAAaA,GAAS,aAAe,KACrC,SAAUA,GAAS,UAAY,GAC/B,QAAAC,CAAA,CACD,CACH,CAAC,EAIH,MAAO,CAACF,EAA0BC,IAChCJ,EAAa,KAAK,CAAE,QAAS,UAAW,QAAAG,EAAS,QAAAC,EAAS,EAE5D,QAAS,CAACD,EAA0BC,IAClCJ,EAAa,KAAK,CAAE,QAAS,UAAW,QAAAG,EAAS,QAAAC,EAAS,EAE5D,MAAO,CAACD,EAA0BC,IAChCJ,EAAa,KAAK,CAAE,QAAS,QAAS,QAAAG,EAAS,QAAAC,EAAS,EAE1D,KAAM,CAACD,EAA0BC,IAC/BJ,EAAa,KAAK,CAAE,QAAS,UAAW,QAAAG,EAAS,QAAAC,CAAA,CAAS,CAC9D"}
@@ -0,0 +1,60 @@
1
+ let r = [], n = {
2
+ isOpen: !1,
3
+ type: "alert",
4
+ message: "",
5
+ resolve: null
6
+ };
7
+ const l = {
8
+ getState: () => n,
9
+ subscribe: (t) => (r.push(t), () => {
10
+ r = r.filter((e) => e !== t);
11
+ }),
12
+ setState: (t) => {
13
+ n = { ...n, ...t }, r.forEach((e) => e());
14
+ }
15
+ };
16
+ let a = [];
17
+ const i = {
18
+ subscribe: (t) => (a.push(t), () => {
19
+ a = a.filter((e) => e !== t);
20
+ }),
21
+ emit: (t) => {
22
+ a.forEach((e) => e(t));
23
+ }
24
+ }, c = {
25
+ // Dialogs
26
+ confirm: (t, e) => new Promise((s) => {
27
+ l.setState({
28
+ isOpen: !0,
29
+ type: "confirm",
30
+ message: t,
31
+ title: e?.title || "Confirm",
32
+ confirmText: e?.confirmText || "Confirm",
33
+ cancelText: e?.cancelText || "Cancel",
34
+ isDanger: e?.isDanger || !1,
35
+ resolve: s
36
+ });
37
+ }),
38
+ alert: (t, e) => new Promise((s) => {
39
+ l.setState({
40
+ isOpen: !0,
41
+ type: "alert",
42
+ message: t,
43
+ title: e?.title || "Alert",
44
+ confirmText: e?.confirmText || "OK",
45
+ isDanger: e?.isDanger || !1,
46
+ resolve: s
47
+ });
48
+ }),
49
+ // Toasts (Fires events to be caught by the DialogProvider)
50
+ toast: (t, e) => i.emit({ variant: "default", message: t, options: e }),
51
+ success: (t, e) => i.emit({ variant: "success", message: t, options: e }),
52
+ error: (t, e) => i.emit({ variant: "error", message: t, options: e }),
53
+ warn: (t, e) => i.emit({ variant: "warning", message: t, options: e })
54
+ };
55
+ export {
56
+ l as dialogStore,
57
+ c as nui,
58
+ i as toastEmitter
59
+ };
60
+ //# sourceMappingURL=dialogStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialogStore.js","sources":["../../../src/components/dialog/dialogStore.ts"],"sourcesContent":["// src/components/dialog/dialogStore.ts\nimport React from 'react';\n\n/* -------------------------------------------------------------------------- */\n/* DIALOG LOGIC (Untouched) */\n/* -------------------------------------------------------------------------- */\nexport type DialogType = 'alert' | 'confirm';\n\nexport interface DialogOptions {\n title?: string;\n message: React.ReactNode;\n confirmText?: string;\n cancelText?: string;\n isDanger?: boolean;\n}\n\nexport interface DialogState extends DialogOptions {\n isOpen: boolean;\n type: DialogType;\n resolve: ((value: boolean) => void) | null;\n}\n\nlet dialogListeners: Array<() => void> = [];\nlet dialogState: DialogState = {\n isOpen: false,\n type: 'alert',\n message: '',\n resolve: null,\n};\n\nexport const dialogStore = {\n getState: () => dialogState,\n subscribe: (listener: () => void) => {\n dialogListeners.push(listener);\n return () => {\n dialogListeners = dialogListeners.filter((l) => l !== listener);\n };\n },\n setState: (newState: Partial<DialogState>) => {\n dialogState = { ...dialogState, ...newState };\n dialogListeners.forEach((listener) => listener());\n },\n};\n\n/* -------------------------------------------------------------------------- */\n/* TOAST EVENT BRIDGE */\n/* -------------------------------------------------------------------------- */\n\n// 1. Define the strictly typed options we expect from the user\nexport interface ExternalToastOptions {\n duration?: number;\n description?: React.ReactNode;\n}\n\n// 2. Use the strict interface in the payload instead of 'any'\ntype ToastEventPayload = {\n variant: 'default' | 'success' | 'error' | 'warning';\n message: React.ReactNode;\n options?: ExternalToastOptions;\n};\n\nlet toastListeners: Array<(payload: ToastEventPayload) => void> = [];\n\nexport const toastEmitter = {\n subscribe: (listener: (payload: ToastEventPayload) => void) => {\n toastListeners.push(listener);\n return () => {\n toastListeners = toastListeners.filter((l) => l !== listener);\n };\n },\n emit: (payload: ToastEventPayload) => {\n toastListeners.forEach((listener) => listener(payload));\n },\n};\n\n/* -------------------------------------------------------------------------- */\n/* UNIFIED NUI API */\n/* -------------------------------------------------------------------------- */\nexport const nui = {\n // Dialogs\n confirm: (\n message: React.ReactNode,\n options?: Omit<DialogOptions, 'message'>\n ): Promise<boolean> => {\n return new Promise((resolve) => {\n dialogStore.setState({\n isOpen: true,\n type: 'confirm',\n message,\n title: options?.title || 'Confirm',\n confirmText: options?.confirmText || 'Confirm',\n cancelText: options?.cancelText || 'Cancel',\n isDanger: options?.isDanger || false,\n resolve,\n });\n });\n },\n\n alert: (\n message: React.ReactNode,\n options?: Omit<DialogOptions, 'message'>\n ): Promise<boolean> => {\n return new Promise((resolve) => {\n dialogStore.setState({\n isOpen: true,\n type: 'alert',\n message,\n title: options?.title || 'Alert',\n confirmText: options?.confirmText || 'OK',\n isDanger: options?.isDanger || false,\n resolve,\n });\n });\n },\n\n // Toasts (Fires events to be caught by the DialogProvider)\n toast: (message: React.ReactNode, options?: ExternalToastOptions) =>\n toastEmitter.emit({ variant: 'default', message, options }),\n\n success: (message: React.ReactNode, options?: ExternalToastOptions) =>\n toastEmitter.emit({ variant: 'success', message, options }),\n\n error: (message: React.ReactNode, options?: ExternalToastOptions) =>\n toastEmitter.emit({ variant: 'error', message, options }),\n\n warn: (message: React.ReactNode, options?: ExternalToastOptions) =>\n toastEmitter.emit({ variant: 'warning', message, options }),\n};\n"],"names":["dialogListeners","dialogState","dialogStore","listener","l","newState","toastListeners","toastEmitter","payload","nui","message","options","resolve"],"mappings":"AAsBA,IAAIA,IAAqC,CAAA,GACrCC,IAA2B;AAAA,EAC7B,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AACX;AAEO,MAAMC,IAAc;AAAA,EACzB,UAAU,MAAMD;AAAA,EAChB,WAAW,CAACE,OACVH,EAAgB,KAAKG,CAAQ,GACtB,MAAM;AACX,IAAAH,IAAkBA,EAAgB,OAAO,CAACI,MAAMA,MAAMD,CAAQ;AAAA,EAChE;AAAA,EAEF,UAAU,CAACE,MAAmC;AAC5C,IAAAJ,IAAc,EAAE,GAAGA,GAAa,GAAGI,EAAA,GACnCL,EAAgB,QAAQ,CAACG,MAAaA,EAAA,CAAU;AAAA,EAClD;AACF;AAmBA,IAAIG,IAA8D,CAAA;AAE3D,MAAMC,IAAe;AAAA,EAC1B,WAAW,CAACJ,OACVG,EAAe,KAAKH,CAAQ,GACrB,MAAM;AACX,IAAAG,IAAiBA,EAAe,OAAO,CAACF,MAAMA,MAAMD,CAAQ;AAAA,EAC9D;AAAA,EAEF,MAAM,CAACK,MAA+B;AACpC,IAAAF,EAAe,QAAQ,CAACH,MAAaA,EAASK,CAAO,CAAC;AAAA,EACxD;AACF,GAKaC,IAAM;AAAA;AAAA,EAEjB,SAAS,CACPC,GACAC,MAEO,IAAI,QAAQ,CAACC,MAAY;AAC9B,IAAAV,EAAY,SAAS;AAAA,MACnB,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAAQ;AAAA,MACA,OAAOC,GAAS,SAAS;AAAA,MACzB,aAAaA,GAAS,eAAe;AAAA,MACrC,YAAYA,GAAS,cAAc;AAAA,MACnC,UAAUA,GAAS,YAAY;AAAA,MAC/B,SAAAC;AAAA,IAAA,CACD;AAAA,EACH,CAAC;AAAA,EAGH,OAAO,CACLF,GACAC,MAEO,IAAI,QAAQ,CAACC,MAAY;AAC9B,IAAAV,EAAY,SAAS;AAAA,MACnB,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAAQ;AAAA,MACA,OAAOC,GAAS,SAAS;AAAA,MACzB,aAAaA,GAAS,eAAe;AAAA,MACrC,UAAUA,GAAS,YAAY;AAAA,MAC/B,SAAAC;AAAA,IAAA,CACD;AAAA,EACH,CAAC;AAAA;AAAA,EAIH,OAAO,CAACF,GAA0BC,MAChCJ,EAAa,KAAK,EAAE,SAAS,WAAW,SAAAG,GAAS,SAAAC,GAAS;AAAA,EAE5D,SAAS,CAACD,GAA0BC,MAClCJ,EAAa,KAAK,EAAE,SAAS,WAAW,SAAAG,GAAS,SAAAC,GAAS;AAAA,EAE5D,OAAO,CAACD,GAA0BC,MAChCJ,EAAa,KAAK,EAAE,SAAS,SAAS,SAAAG,GAAS,SAAAC,GAAS;AAAA,EAE1D,MAAM,CAACD,GAA0BC,MAC/BJ,EAAa,KAAK,EAAE,SAAS,WAAW,SAAAG,GAAS,SAAAC,EAAA,CAAS;AAC9D;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),r=require("react");;/* empty css */const v=require("../../utils/scrolllock/scrollLock.cjs"),m=require("../../utils/inertmanager/inertManager.cjs"),g=require("../../utils/trapfocus/trapFocus.cjs"),p=require("../../utils/onclickoutside/onClickOutside.cjs"),w=require("../../utils/restorefocus/restoreFocus.cjs"),R=require("../../utils/portal/portal.cjs");function F({open:e,onClose:l,position:k="right",className:y="",children:q,disableEsc:i=!1,disableClickOutside:a=!1}){const o=r.useRef(null),t=r.useRef(null),d=r.useRef(null),n=r.useCallback(()=>{l()},[l]);return r.useEffect(()=>{if(!e||i)return;const u=c=>{c.key==="Escape"&&(c.preventDefault(),n())};return document.addEventListener("keydown",u),()=>document.removeEventListener("keydown",u)},[e,i,n]),r.useEffect(()=>{if(!e)return;d.current=document.activeElement,v.scrollLock.lock();const u=o.current?m.applyInertToSiblings(o.current):[],c=t.current?g.trapFocus(t.current):void 0;let f;return!a&&t.current&&(f=p.onClickOutside(t,n)),()=>{f?.(),c?.(),v.scrollLock.unlock(),m.removeInertFromSiblings(u),w.restoreFocus(d.current)}},[e,a,n]),e?s.jsx(R.Portal,{children:s.jsx("div",{ref:o,className:`ui-drawer-overlay ${e?"open":""}`,children:s.jsx("div",{ref:t,className:`ui-drawer ${k} ${e?"open":""} ${y}`,role:"dialog","aria-modal":"true",children:q})})}):null}exports.Drawer=F;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),r=require("react");;/* empty css */const k=require("../../utils/scrolllock/scrollLock.cjs"),q=require("../../utils/inertmanager/inertManager.cjs"),D=require("../../utils/trapfocus/trapFocus.cjs"),L=require("../../utils/onclickoutside/onClickOutside.cjs"),h=require("../../utils/restorefocus/restoreFocus.cjs"),x=require("../../utils/portal/portal.cjs"),w=require("../../utils/cn/cn.cjs"),R=r.forwardRef(({open:c,onClose:l,position:g="right",className:b,overlayClassName:E,children:F,disableEsc:f=!1,disableClickOutside:d=!1,...S},s)=>{const[T,m]=r.useState(c),[t,p]=r.useState(!1),i=r.useRef(null),n=r.useRef(null),v=r.useRef(null),j=r.useCallback(e=>{n.current=e,typeof s=="function"?s(e):s&&(s.current=e)},[s]),u=r.useCallback(()=>{l()},[l]);return r.useEffect(()=>{let e;return c?(m(!0),e=setTimeout(()=>p(!0),15)):(p(!1),e=setTimeout(()=>m(!1),300)),()=>{e&&clearTimeout(e)}},[c]),r.useEffect(()=>{if(!t||f)return;const e=o=>{o.key==="Escape"&&(o.preventDefault(),u())};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[t,f,u]),r.useEffect(()=>{if(!t)return;v.current=document.activeElement,k.scrollLock.lock();const e=i.current?q.applyInertToSiblings(i.current):[],o=n.current?D.trapFocus(n.current):void 0;let y;return!d&&n.current&&(y=L.onClickOutside(n,u)),()=>{y?.(),o?.(),k.scrollLock.unlock(),q.removeInertFromSiblings(e),h.restoreFocus(v.current)}},[t,d,u]),T?a.jsxs(x.Portal,{children:[a.jsx("div",{ref:i,className:w.cn("nui-drawer-overlay",E),"data-state":t?"open":"closed","aria-hidden":"true"}),a.jsx("div",{ref:j,className:w.cn("nui-drawer",`nui-drawer--${g}`,b),"data-state":t?"open":"closed",role:"dialog","aria-modal":"true",...S,children:F})]}):null});R.displayName="Drawer";exports.Drawer=R;
2
2
  //# sourceMappingURL=Drawer.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Drawer.cjs","sources":["../../../src/components/drawer/Drawer.tsx"],"sourcesContent":["/**\r\n * Drawer.tsx\r\n * ----------\r\n * WCAG-compliant drawer component.\r\n * - Focus trap\r\n * - Scroll lock\r\n * - Click outside\r\n * - Esc to close\r\n * - Portal\r\n */\r\n\r\n/**\r\n * Drawer.tsx — Headless Drawer (no default UI)\r\n * User controls close button & styles fully.\r\n */\r\n\r\nimport React, { useRef, useEffect, useCallback } from 'react';\r\nimport './Drawer.css';\r\n\r\nimport { Portal, onClickOutside, trapFocus, restoreFocus, scrollLock, applyInertToSiblings,\r\n removeInertFromSiblings } from '../../utils/index';\r\n\r\nexport interface DrawerProps {\r\n open: boolean;\r\n onClose: () => void;\r\n position?: 'left' | 'right' | 'bottom' | 'top';\r\n className?: string;\r\n children?: React.ReactNode;\r\n\r\n disableEsc?: boolean;\r\n disableClickOutside?: boolean;\r\n}\r\n\r\nexport function Drawer({\r\n open,\r\n onClose,\r\n position = 'right',\r\n className = '',\r\n children,\r\n disableEsc = false,\r\n disableClickOutside = false,\r\n}: DrawerProps) {\r\n const overlayRef = useRef<HTMLDivElement | null>(null);\r\n const drawerRef = useRef<HTMLDivElement | null>(null);\r\n const previouslyFocused = useRef<HTMLElement | null>(null);\r\n\r\n const handleClose = useCallback(() => {\r\n onClose();\r\n }, [onClose]);\r\n\r\n // ESC key\r\n useEffect(() => {\r\n if (!open || disableEsc) return;\r\n\r\n const onKey = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') {\r\n e.preventDefault();\r\n handleClose();\r\n }\r\n };\r\n\r\n document.addEventListener('keydown', onKey);\r\n return () => document.removeEventListener('keydown', onKey);\r\n }, [open, disableEsc, handleClose]);\r\n\r\n // Open/close lifecycle\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n previouslyFocused.current = document.activeElement as HTMLElement;\r\n\r\n scrollLock.lock();\r\n\r\n const inertTargets = overlayRef.current\r\n ? applyInertToSiblings(overlayRef.current)\r\n : [];\r\n\r\n const trapCleanup = drawerRef.current\r\n ? trapFocus(drawerRef.current)\r\n : undefined;\r\n\r\n // Click outside\r\n let cleanupOutside: (() => void) | undefined;\r\n if (!disableClickOutside && drawerRef.current) {\r\n cleanupOutside = onClickOutside(drawerRef, handleClose);\r\n }\r\n\r\n return () => {\r\n cleanupOutside?.();\r\n trapCleanup?.();\r\n scrollLock.unlock();\r\n removeInertFromSiblings(inertTargets);\r\n restoreFocus(previouslyFocused.current);\r\n };\r\n }, [open, disableClickOutside, handleClose]);\r\n\r\n if (!open) return null;\r\n\r\n return (\r\n <Portal>\r\n <div\r\n ref={overlayRef}\r\n className={`ui-drawer-overlay ${open ? 'open' : ''}`}\r\n >\r\n <div\r\n ref={drawerRef}\r\n className={`ui-drawer ${position} ${open ? 'open' : ''} ${className}`}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n </Portal>\r\n );\r\n}\r\n"],"names":["Drawer","open","onClose","position","className","children","disableEsc","disableClickOutside","overlayRef","useRef","drawerRef","previouslyFocused","handleClose","useCallback","useEffect","onKey","e","scrollLock","inertTargets","applyInertToSiblings","trapCleanup","trapFocus","cleanupOutside","onClickOutside","removeInertFromSiblings","restoreFocus","Portal","jsx"],"mappings":"keAiCO,SAASA,EAAO,CACrB,KAAAC,EACA,QAAAC,EACA,SAAAC,EAAW,QACX,UAAAC,EAAY,GACZ,SAAAC,EACA,WAAAC,EAAa,GACb,oBAAAC,EAAsB,EACxB,EAAgB,CACd,MAAMC,EAAaC,EAAAA,OAA8B,IAAI,EAC/CC,EAAYD,EAAAA,OAA8B,IAAI,EAC9CE,EAAoBF,EAAAA,OAA2B,IAAI,EAEnDG,EAAcC,EAAAA,YAAY,IAAM,CACpCX,EAAA,CACF,EAAG,CAACA,CAAO,CAAC,EAgDZ,OA7CAY,EAAAA,UAAU,IAAM,CACd,GAAI,CAACb,GAAQK,EAAY,OAEzB,MAAMS,EAASC,GAAqB,CAC9BA,EAAE,MAAQ,WACZA,EAAE,eAAA,EACFJ,EAAA,EAEJ,EAEA,gBAAS,iBAAiB,UAAWG,CAAK,EACnC,IAAM,SAAS,oBAAoB,UAAWA,CAAK,CAC5D,EAAG,CAACd,EAAMK,EAAYM,CAAW,CAAC,EAGlCE,EAAAA,UAAU,IAAM,CACd,GAAI,CAACb,EAAM,OAEXU,EAAkB,QAAU,SAAS,cAErCM,EAAAA,WAAW,KAAA,EAEX,MAAMC,EAAeV,EAAW,QAC5BW,EAAAA,qBAAqBX,EAAW,OAAO,EACvC,CAAA,EAEEY,EAAcV,EAAU,QAC1BW,EAAAA,UAAUX,EAAU,OAAO,EAC3B,OAGJ,IAAIY,EACJ,MAAI,CAACf,GAAuBG,EAAU,UACpCY,EAAiBC,EAAAA,eAAeb,EAAWE,CAAW,GAGjD,IAAM,CACXU,IAAA,EACAF,IAAA,EACAH,EAAAA,WAAW,OAAA,EACXO,EAAAA,wBAAwBN,CAAY,EACpCO,EAAAA,aAAad,EAAkB,OAAO,CACxC,CACF,EAAG,CAACV,EAAMM,EAAqBK,CAAW,CAAC,EAEtCX,QAGFyB,EAAAA,OAAA,CACC,SAAAC,EAAAA,IAAC,MAAA,CACC,IAAKnB,EACL,UAAW,qBAAqBP,EAAO,OAAS,EAAE,GAElD,SAAA0B,EAAAA,IAAC,MAAA,CACC,IAAKjB,EACL,UAAW,aAAaP,CAAQ,IAAIF,EAAO,OAAS,EAAE,IAAIG,CAAS,GACnE,KAAK,SACL,aAAW,OAEV,SAAAC,CAAA,CAAA,CACH,CAAA,EAEJ,EAjBgB,IAmBpB"}
1
+ {"version":3,"file":"Drawer.cjs","sources":["../../../src/components/drawer/Drawer.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useRef, useEffect, useCallback, useState, forwardRef } from 'react';\nimport { cn } from '../../utils';\nimport { \n Portal, \n onClickOutside, \n trapFocus, \n restoreFocus, \n scrollLock, \n applyInertToSiblings, \n removeInertFromSiblings \n} from '../../utils';\nimport './Drawer.css';\n\n/* ----------------------------------------------------\n Props\n---------------------------------------------------- */\nexport interface DrawerProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Controls the open/closed state of the drawer */\n open: boolean;\n /** Callback fired when the drawer requests to be closed (e.g., Escape key, outside click) */\n onClose: () => void;\n /** The edge of the screen the drawer attaches to. Defaults to 'right' */\n position?: 'left' | 'right' | 'bottom' | 'top';\n /** Prevents the drawer from closing when the Escape key is pressed */\n disableEsc?: boolean;\n /** Prevents the drawer from closing when a click occurs outside the content area */\n disableClickOutside?: boolean;\n /** Custom class name applied to the backdrop overlay */\n overlayClassName?: string;\n}\n\n/* ----------------------------------------------------\n Component\n---------------------------------------------------- */\n\n/**\n * Drawer Component\n * * A sliding panel overlay for auxiliary content.\n * * Architecture Note (2-Step Unmount):\n * To allow smooth CSS exit transitions, the component uses two states:\n * 1. `isMounted`: Controls presence in the React Tree (DOM).\n * 2. `isVisible`: Controls the `data-state` attribute which triggers CSS transforms.\n * Upon closing, `isVisible` flips immediately, then a 300ms timeout delays the `isMounted` flip.\n */\nexport const Drawer = forwardRef<HTMLDivElement, DrawerProps>(\n (\n {\n open,\n onClose,\n position = 'right',\n className,\n overlayClassName,\n children,\n disableEsc = false,\n disableClickOutside = false,\n ...props\n },\n ref\n ) => {\n // 1. Mount & Animation States\n const [isMounted, setIsMounted] = useState(open);\n const [isVisible, setIsVisible] = useState(false);\n\n const overlayRef = useRef<HTMLDivElement | null>(null);\n const internalDrawerRef = useRef<HTMLDivElement | null>(null);\n const previouslyFocused = useRef<HTMLElement | null>(null);\n\n // Merge forwarded ref with internal ref\n const setRefs = useCallback(\n (node: HTMLDivElement) => {\n internalDrawerRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref]\n );\n\n const handleClose = useCallback(() => {\n onClose();\n }, [onClose]);\n\n // 2. Handle Entrance & Exit Animations\n useEffect(() => {\n let timer: ReturnType<typeof setTimeout>;\n\n if (open) {\n setIsMounted(true);\n // Micro-delay to ensure the DOM paints the element before applying the active transform class\n timer = setTimeout(() => setIsVisible(true), 15);\n } else {\n setIsVisible(false);\n // Wait for CSS transition (0.3s) to finish before unmounting from DOM\n timer = setTimeout(() => setIsMounted(false), 300);\n }\n\n return () => {\n if (timer) clearTimeout(timer);\n };\n }, [open]);\n\n // 3. Handle Escape Key\n useEffect(() => {\n if (!isVisible || disableEsc) return;\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n handleClose();\n }\n };\n\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [isVisible, disableEsc, handleClose]);\n\n // 4. Accessibility & Lifecycle Effects\n useEffect(() => {\n if (!isVisible) return;\n\n // Capture the element that had focus before the drawer opened\n previouslyFocused.current = document.activeElement as HTMLElement;\n\n // Lock body scroll\n scrollLock.lock();\n\n // WAI-ARIA Standard: Hide siblings from screen readers\n const inertTargets = overlayRef.current\n ? applyInertToSiblings(overlayRef.current)\n : [];\n\n // Trap focus inside the drawer\n const trapCleanup = internalDrawerRef.current\n ? trapFocus(internalDrawerRef.current)\n : undefined;\n\n // Click outside\n let cleanupOutside: (() => void) | undefined;\n if (!disableClickOutside && internalDrawerRef.current) {\n cleanupOutside = onClickOutside(internalDrawerRef, handleClose);\n }\n\n return () => {\n cleanupOutside?.();\n trapCleanup?.();\n scrollLock.unlock();\n removeInertFromSiblings(inertTargets);\n restoreFocus(previouslyFocused.current);\n };\n }, [isVisible, disableClickOutside, handleClose]);\n\n if (!isMounted) return null;\n\n return (\n <Portal>\n <div\n ref={overlayRef}\n className={cn('nui-drawer-overlay', overlayClassName)}\n data-state={isVisible ? 'open' : 'closed'}\n aria-hidden=\"true\"\n />\n <div\n ref={setRefs}\n className={cn('nui-drawer', `nui-drawer--${position}`, className)}\n data-state={isVisible ? 'open' : 'closed'}\n role=\"dialog\"\n aria-modal=\"true\"\n {...props}\n >\n {children}\n </div>\n </Portal>\n );\n }\n);\n\nDrawer.displayName = 'Drawer';"],"names":["Drawer","forwardRef","open","onClose","position","className","overlayClassName","children","disableEsc","disableClickOutside","props","ref","isMounted","setIsMounted","useState","isVisible","setIsVisible","overlayRef","useRef","internalDrawerRef","previouslyFocused","setRefs","useCallback","node","handleClose","useEffect","timer","onKey","e","scrollLock","inertTargets","applyInertToSiblings","trapCleanup","trapFocus","cleanupOutside","onClickOutside","removeInertFromSiblings","restoreFocus","Portal","jsx","cn"],"mappings":"qgBA8CaA,EAASC,EAAAA,WACpB,CACE,CACE,KAAAC,EACA,QAAAC,EACA,SAAAC,EAAW,QACX,UAAAC,EACA,iBAAAC,EACA,SAAAC,EACA,WAAAC,EAAa,GACb,oBAAAC,EAAsB,GACtB,GAAGC,CAAA,EAELC,IACG,CAEH,KAAM,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAASZ,CAAI,EACzC,CAACa,EAAWC,CAAY,EAAIF,EAAAA,SAAS,EAAK,EAE1CG,EAAaC,EAAAA,OAA8B,IAAI,EAC/CC,EAAoBD,EAAAA,OAA8B,IAAI,EACtDE,EAAoBF,EAAAA,OAA2B,IAAI,EAGnDG,EAAUC,EAAAA,YACbC,GAAyB,CACxBJ,EAAkB,QAAUI,EACxB,OAAOZ,GAAQ,WAAYA,EAAIY,CAAI,EAC9BZ,MAAS,QAAUY,EAC9B,EACA,CAACZ,CAAG,CAAA,EAGAa,EAAcF,EAAAA,YAAY,IAAM,CACpCnB,EAAA,CACF,EAAG,CAACA,CAAO,CAAC,EAuEZ,OApEAsB,EAAAA,UAAU,IAAM,CACd,IAAIC,EAEJ,OAAIxB,GACFW,EAAa,EAAI,EAEjBa,EAAQ,WAAW,IAAMV,EAAa,EAAI,EAAG,EAAE,IAE/CA,EAAa,EAAK,EAElBU,EAAQ,WAAW,IAAMb,EAAa,EAAK,EAAG,GAAG,GAG5C,IAAM,CACPa,gBAAoBA,CAAK,CAC/B,CACF,EAAG,CAACxB,CAAI,CAAC,EAGTuB,EAAAA,UAAU,IAAM,CACd,GAAI,CAACV,GAAaP,EAAY,OAE9B,MAAMmB,EAASC,GAAqB,CAC9BA,EAAE,MAAQ,WACZA,EAAE,eAAA,EACFJ,EAAA,EAEJ,EAEA,gBAAS,iBAAiB,UAAWG,CAAK,EACnC,IAAM,SAAS,oBAAoB,UAAWA,CAAK,CAC5D,EAAG,CAACZ,EAAWP,EAAYgB,CAAW,CAAC,EAGvCC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACV,EAAW,OAGhBK,EAAkB,QAAU,SAAS,cAGrCS,EAAAA,WAAW,KAAA,EAGX,MAAMC,EAAeb,EAAW,QAC5Bc,EAAAA,qBAAqBd,EAAW,OAAO,EACvC,CAAA,EAGEe,EAAcb,EAAkB,QAClCc,EAAAA,UAAUd,EAAkB,OAAO,EACnC,OAGJ,IAAIe,EACJ,MAAI,CAACzB,GAAuBU,EAAkB,UAC5Ce,EAAiBC,EAAAA,eAAehB,EAAmBK,CAAW,GAGzD,IAAM,CACXU,IAAA,EACAF,IAAA,EACAH,EAAAA,WAAW,OAAA,EACXO,EAAAA,wBAAwBN,CAAY,EACpCO,EAAAA,aAAajB,EAAkB,OAAO,CACxC,CACF,EAAG,CAACL,EAAWN,EAAqBe,CAAW,CAAC,EAE3CZ,SAGF0B,SAAA,CACC,SAAA,CAAAC,EAAAA,IAAC,MAAA,CACC,IAAKtB,EACL,UAAWuB,EAAAA,GAAG,qBAAsBlC,CAAgB,EACpD,aAAYS,EAAY,OAAS,SACjC,cAAY,MAAA,CAAA,EAEdwB,EAAAA,IAAC,MAAA,CACC,IAAKlB,EACL,UAAWmB,EAAAA,GAAG,aAAc,eAAepC,CAAQ,GAAIC,CAAS,EAChE,aAAYU,EAAY,OAAS,SACjC,KAAK,SACL,aAAW,OACV,GAAGL,EAEH,SAAAH,CAAA,CAAA,CACH,EACF,EApBqB,IAsBzB,CACF,EAEAP,EAAO,YAAc"}
@@ -1,57 +1,79 @@
1
- import { jsx as l } from "react/jsx-runtime";
2
- import { useRef as c, useCallback as w, useEffect as d } from "react";
1
+ import { jsxs as L, jsx as w } from "react/jsx-runtime";
2
+ import { forwardRef as N, useState as k, useRef as a, useCallback as g, useEffect as l } from "react";
3
3
  /* empty css */
4
- import { scrollLock as p } from "../../utils/scrolllock/scrollLock.js";
5
- import { applyInertToSiblings as g, removeInertFromSiblings as h } from "../../utils/inertmanager/inertManager.js";
6
- import { trapFocus as E } from "../../utils/trapfocus/trapFocus.js";
7
- import { onClickOutside as F } from "../../utils/onclickoutside/onClickOutside.js";
8
- import { restoreFocus as $ } from "../../utils/restorefocus/restoreFocus.js";
9
- import { Portal as L } from "../../utils/portal/portal.js";
10
- function j({
11
- open: r,
12
- onClose: i,
13
- position: v = "right",
14
- className: y = "",
15
- children: k,
16
- disableEsc: a = !1,
17
- disableClickOutside: m = !1
18
- }) {
19
- const u = c(null), e = c(null), s = c(null), t = w(() => {
20
- i();
21
- }, [i]);
22
- return d(() => {
23
- if (!r || a) return;
24
- const o = (n) => {
25
- n.key === "Escape" && (n.preventDefault(), t());
26
- };
27
- return document.addEventListener("keydown", o), () => document.removeEventListener("keydown", o);
28
- }, [r, a, t]), d(() => {
29
- if (!r) return;
30
- s.current = document.activeElement, p.lock();
31
- const o = u.current ? g(u.current) : [], n = e.current ? E(e.current) : void 0;
32
- let f;
33
- return !m && e.current && (f = F(e, t)), () => {
34
- f?.(), n?.(), p.unlock(), h(o), $(s.current);
35
- };
36
- }, [r, m, t]), r ? /* @__PURE__ */ l(L, { children: /* @__PURE__ */ l(
37
- "div",
38
- {
39
- ref: u,
40
- className: `ui-drawer-overlay ${r ? "open" : ""}`,
41
- children: /* @__PURE__ */ l(
4
+ import { scrollLock as R } from "../../utils/scrolllock/scrollLock.js";
5
+ import { applyInertToSiblings as S, removeInertFromSiblings as j } from "../../utils/inertmanager/inertManager.js";
6
+ import { trapFocus as C } from "../../utils/trapfocus/trapFocus.js";
7
+ import { onClickOutside as M } from "../../utils/onclickoutside/onClickOutside.js";
8
+ import { restoreFocus as V } from "../../utils/restorefocus/restoreFocus.js";
9
+ import { Portal as K } from "../../utils/portal/portal.js";
10
+ import { cn as T } from "../../utils/cn/cn.js";
11
+ const O = N(
12
+ ({
13
+ open: i,
14
+ onClose: c,
15
+ position: h = "right",
16
+ className: D,
17
+ overlayClassName: E,
18
+ children: F,
19
+ disableEsc: m = !1,
20
+ disableClickOutside: f = !1,
21
+ ...I
22
+ }, t) => {
23
+ const [b, d] = k(i), [r, p] = k(!1), u = a(null), o = a(null), v = a(null), x = g(
24
+ (e) => {
25
+ o.current = e, typeof t == "function" ? t(e) : t && (t.current = e);
26
+ },
27
+ [t]
28
+ ), n = g(() => {
29
+ c();
30
+ }, [c]);
31
+ return l(() => {
32
+ let e;
33
+ return i ? (d(!0), e = setTimeout(() => p(!0), 15)) : (p(!1), e = setTimeout(() => d(!1), 300)), () => {
34
+ e && clearTimeout(e);
35
+ };
36
+ }, [i]), l(() => {
37
+ if (!r || m) return;
38
+ const e = (s) => {
39
+ s.key === "Escape" && (s.preventDefault(), n());
40
+ };
41
+ return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
42
+ }, [r, m, n]), l(() => {
43
+ if (!r) return;
44
+ v.current = document.activeElement, R.lock();
45
+ const e = u.current ? S(u.current) : [], s = o.current ? C(o.current) : void 0;
46
+ let y;
47
+ return !f && o.current && (y = M(o, n)), () => {
48
+ y?.(), s?.(), R.unlock(), j(e), V(v.current);
49
+ };
50
+ }, [r, f, n]), b ? /* @__PURE__ */ L(K, { children: [
51
+ /* @__PURE__ */ w(
42
52
  "div",
43
53
  {
44
- ref: e,
45
- className: `ui-drawer ${v} ${r ? "open" : ""} ${y}`,
54
+ ref: u,
55
+ className: T("nui-drawer-overlay", E),
56
+ "data-state": r ? "open" : "closed",
57
+ "aria-hidden": "true"
58
+ }
59
+ ),
60
+ /* @__PURE__ */ w(
61
+ "div",
62
+ {
63
+ ref: x,
64
+ className: T("nui-drawer", `nui-drawer--${h}`, D),
65
+ "data-state": r ? "open" : "closed",
46
66
  role: "dialog",
47
67
  "aria-modal": "true",
48
- children: k
68
+ ...I,
69
+ children: F
49
70
  }
50
71
  )
51
- }
52
- ) }) : null;
53
- }
72
+ ] }) : null;
73
+ }
74
+ );
75
+ O.displayName = "Drawer";
54
76
  export {
55
- j as Drawer
77
+ O as Drawer
56
78
  };
57
79
  //# sourceMappingURL=Drawer.js.map