@nofinite/nui 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/dist/components/accordion/Accordion.cjs +2 -0
  2. package/dist/components/accordion/Accordion.cjs.map +1 -0
  3. package/dist/components/accordion/Accordion.js +51 -0
  4. package/dist/components/accordion/Accordion.js.map +1 -0
  5. package/dist/components/alert/Alert.cjs +2 -0
  6. package/dist/components/alert/Alert.cjs.map +1 -0
  7. package/dist/components/alert/Alert.js +32 -0
  8. package/dist/components/alert/Alert.js.map +1 -0
  9. package/dist/components/avatar/Avatar.cjs +2 -0
  10. package/dist/components/avatar/Avatar.cjs.map +1 -0
  11. package/dist/components/avatar/Avatar.js +51 -0
  12. package/dist/components/avatar/Avatar.js.map +1 -0
  13. package/dist/components/avatar/AvatarGroup.cjs +2 -0
  14. package/dist/components/avatar/AvatarGroup.cjs.map +1 -0
  15. package/dist/components/avatar/AvatarGroup.js +32 -0
  16. package/dist/components/avatar/AvatarGroup.js.map +1 -0
  17. package/dist/components/badge/Badge.cjs +2 -0
  18. package/dist/components/badge/Badge.cjs.map +1 -0
  19. package/dist/components/badge/Badge.js +81 -0
  20. package/dist/components/badge/Badge.js.map +1 -0
  21. package/dist/components/badge/BadgeGroup.cjs +2 -0
  22. package/dist/components/badge/BadgeGroup.cjs.map +1 -0
  23. package/dist/components/badge/BadgeGroup.js +17 -0
  24. package/dist/components/badge/BadgeGroup.js.map +1 -0
  25. package/dist/components/breadcrumbs/Breadcrumbs.cjs +2 -0
  26. package/dist/components/breadcrumbs/Breadcrumbs.cjs.map +1 -0
  27. package/dist/components/breadcrumbs/Breadcrumbs.js +46 -0
  28. package/dist/components/breadcrumbs/Breadcrumbs.js.map +1 -0
  29. package/dist/components/button/Button.cjs +2 -0
  30. package/dist/components/button/Button.cjs.map +1 -0
  31. package/dist/components/button/Button.js +21 -0
  32. package/dist/components/button/Button.js.map +1 -0
  33. package/dist/components/card/Card.cjs +2 -0
  34. package/dist/components/card/Card.cjs.map +1 -0
  35. package/dist/components/card/Card.js +50 -0
  36. package/dist/components/card/Card.js.map +1 -0
  37. package/dist/components/checkbox/Checkbox.cjs +2 -0
  38. package/dist/components/checkbox/Checkbox.cjs.map +1 -0
  39. package/dist/components/checkbox/Checkbox.js +46 -0
  40. package/dist/components/checkbox/Checkbox.js.map +1 -0
  41. package/dist/components/chip/Chip.cjs +2 -0
  42. package/dist/components/chip/Chip.cjs.map +1 -0
  43. package/dist/components/chip/Chip.js +51 -0
  44. package/dist/components/chip/Chip.js.map +1 -0
  45. package/dist/components/combobox/Combobox.cjs +2 -0
  46. package/dist/components/combobox/Combobox.cjs.map +1 -0
  47. package/dist/components/combobox/Combobox.js +114 -0
  48. package/dist/components/combobox/Combobox.js.map +1 -0
  49. package/dist/components/commandpalette/CommandPalette.cjs +2 -0
  50. package/dist/components/commandpalette/CommandPalette.cjs.map +1 -0
  51. package/dist/components/commandpalette/CommandPalette.js +111 -0
  52. package/dist/components/commandpalette/CommandPalette.js.map +1 -0
  53. package/dist/components/contextmenu/ContextMenu.cjs +2 -0
  54. package/dist/components/contextmenu/ContextMenu.cjs.map +1 -0
  55. package/dist/components/contextmenu/ContextMenu.js +104 -0
  56. package/dist/components/contextmenu/ContextMenu.js.map +1 -0
  57. package/dist/components/datagrid/DataGrid.cjs +2 -0
  58. package/dist/components/datagrid/DataGrid.cjs.map +1 -0
  59. package/dist/components/datagrid/DataGrid.js +227 -0
  60. package/dist/components/datagrid/DataGrid.js.map +1 -0
  61. package/dist/components/datepicker/DatePicker.cjs +2 -0
  62. package/dist/components/datepicker/DatePicker.cjs.map +1 -0
  63. package/dist/components/datepicker/DatePicker.js +265 -0
  64. package/dist/components/datepicker/DatePicker.js.map +1 -0
  65. package/dist/components/daterangepicker/DateRangePicker.cjs +2 -0
  66. package/dist/components/daterangepicker/DateRangePicker.cjs.map +1 -0
  67. package/dist/components/daterangepicker/DateRangePicker.js +322 -0
  68. package/dist/components/daterangepicker/DateRangePicker.js.map +1 -0
  69. package/dist/components/drawer/Drawer.cjs +2 -0
  70. package/dist/components/drawer/Drawer.cjs.map +1 -0
  71. package/dist/components/drawer/Drawer.js +57 -0
  72. package/dist/components/drawer/Drawer.js.map +1 -0
  73. package/dist/components/dropdown/Dropdown.cjs +2 -0
  74. package/dist/components/dropdown/Dropdown.cjs.map +1 -0
  75. package/dist/components/dropdown/Dropdown.js +115 -0
  76. package/dist/components/dropdown/Dropdown.js.map +1 -0
  77. package/dist/components/fileuploader/FileUploader.cjs +2 -0
  78. package/dist/components/fileuploader/FileUploader.cjs.map +1 -0
  79. package/dist/components/fileuploader/FileUploader.js +83 -0
  80. package/dist/components/fileuploader/FileUploader.js.map +1 -0
  81. package/dist/components/hovercard/HoverCard.cjs +2 -0
  82. package/dist/components/hovercard/HoverCard.cjs.map +1 -0
  83. package/dist/components/hovercard/HoverCard.js +78 -0
  84. package/dist/components/hovercard/HoverCard.js.map +1 -0
  85. package/dist/components/input/Input.cjs +2 -0
  86. package/dist/components/input/Input.cjs.map +1 -0
  87. package/dist/components/input/Input.js +41 -0
  88. package/dist/components/input/Input.js.map +1 -0
  89. package/dist/components/layout/Container.cjs +2 -0
  90. package/dist/components/layout/Container.cjs.map +1 -0
  91. package/dist/components/layout/Container.js +33 -0
  92. package/dist/components/layout/Container.js.map +1 -0
  93. package/dist/components/layout/Flex.cjs +2 -0
  94. package/dist/components/layout/Flex.cjs.map +1 -0
  95. package/dist/components/layout/Flex.js +26 -0
  96. package/dist/components/layout/Flex.js.map +1 -0
  97. package/dist/components/layout/Grid.cjs +2 -0
  98. package/dist/components/layout/Grid.cjs.map +1 -0
  99. package/dist/components/layout/Grid.js +21 -0
  100. package/dist/components/layout/Grid.js.map +1 -0
  101. package/dist/components/layout/HStack.cjs +2 -0
  102. package/dist/components/layout/HStack.cjs.map +1 -0
  103. package/dist/components/layout/HStack.js +9 -0
  104. package/dist/components/layout/HStack.js.map +1 -0
  105. package/dist/components/layout/Stack.cjs +2 -0
  106. package/dist/components/layout/Stack.cjs.map +1 -0
  107. package/dist/components/layout/Stack.js +9 -0
  108. package/dist/components/layout/Stack.js.map +1 -0
  109. package/dist/components/megamenu/MegaMenu.cjs +2 -0
  110. package/dist/components/megamenu/MegaMenu.cjs.map +1 -0
  111. package/dist/components/megamenu/MegaMenu.js +43 -0
  112. package/dist/components/megamenu/MegaMenu.js.map +1 -0
  113. package/dist/components/modal/Modal.cjs +2 -0
  114. package/dist/components/modal/Modal.cjs.map +1 -0
  115. package/dist/components/modal/Modal.js +91 -0
  116. package/dist/components/modal/Modal.js.map +1 -0
  117. package/dist/components/pagination/Pagination.cjs +2 -0
  118. package/dist/components/pagination/Pagination.cjs.map +1 -0
  119. package/dist/components/pagination/Pagination.js +62 -0
  120. package/dist/components/pagination/Pagination.js.map +1 -0
  121. package/dist/components/popover/Popover.cjs +2 -0
  122. package/dist/components/popover/Popover.cjs.map +1 -0
  123. package/dist/components/popover/Popover.js +123 -0
  124. package/dist/components/popover/Popover.js.map +1 -0
  125. package/dist/components/progress/Progress.cjs +2 -0
  126. package/dist/components/progress/Progress.cjs.map +1 -0
  127. package/dist/components/progress/Progress.js +33 -0
  128. package/dist/components/progress/Progress.js.map +1 -0
  129. package/dist/components/radiogroup/RadioGroup.cjs +2 -0
  130. package/dist/components/radiogroup/RadioGroup.cjs.map +1 -0
  131. package/dist/components/radiogroup/RadioGroup.js +79 -0
  132. package/dist/components/radiogroup/RadioGroup.js.map +1 -0
  133. package/dist/components/rating/Rating.cjs +2 -0
  134. package/dist/components/rating/Rating.cjs.map +1 -0
  135. package/dist/components/rating/Rating.js +49 -0
  136. package/dist/components/rating/Rating.js.map +1 -0
  137. package/dist/components/skeleton/Skeleton.cjs +2 -0
  138. package/dist/components/skeleton/Skeleton.cjs.map +1 -0
  139. package/dist/components/skeleton/Skeleton.js +86 -0
  140. package/dist/components/skeleton/Skeleton.js.map +1 -0
  141. package/dist/components/slider/Slider.cjs +2 -0
  142. package/dist/components/slider/Slider.cjs.map +1 -0
  143. package/dist/components/slider/Slider.js +116 -0
  144. package/dist/components/slider/Slider.js.map +1 -0
  145. package/dist/components/spinner/Spinner.cjs +2 -0
  146. package/dist/components/spinner/Spinner.cjs.map +1 -0
  147. package/dist/components/spinner/Spinner.js +21 -0
  148. package/dist/components/spinner/Spinner.js.map +1 -0
  149. package/dist/components/stepper/Stepper.cjs +6 -0
  150. package/dist/components/stepper/Stepper.cjs.map +1 -0
  151. package/dist/components/stepper/Stepper.js +43 -0
  152. package/dist/components/stepper/Stepper.js.map +1 -0
  153. package/dist/components/switch/Switch.cjs +2 -0
  154. package/dist/components/switch/Switch.cjs.map +1 -0
  155. package/dist/components/switch/Switch.js +67 -0
  156. package/dist/components/switch/Switch.js.map +1 -0
  157. package/dist/components/table/Table.cjs +2 -0
  158. package/dist/components/table/Table.cjs.map +1 -0
  159. package/dist/components/table/Table.js +46 -0
  160. package/dist/components/table/Table.js.map +1 -0
  161. package/dist/components/tabs/Tabs.cjs +2 -0
  162. package/dist/components/tabs/Tabs.cjs.map +1 -0
  163. package/dist/components/tabs/Tabs.js +56 -0
  164. package/dist/components/tabs/Tabs.js.map +1 -0
  165. package/dist/components/textarea/Textarea.cjs +2 -0
  166. package/dist/components/textarea/Textarea.cjs.map +1 -0
  167. package/dist/components/textarea/Textarea.js +75 -0
  168. package/dist/components/textarea/Textarea.js.map +1 -0
  169. package/dist/components/toast/Toast.cjs +2 -0
  170. package/dist/components/toast/Toast.cjs.map +1 -0
  171. package/dist/components/toast/Toast.js +52 -0
  172. package/dist/components/toast/Toast.js.map +1 -0
  173. package/dist/components/tooltip/Tooltip.cjs +2 -0
  174. package/dist/components/tooltip/Tooltip.cjs.map +1 -0
  175. package/dist/components/tooltip/Tooltip.js +73 -0
  176. package/dist/components/tooltip/Tooltip.js.map +1 -0
  177. package/dist/components/treeview/TreeView.cjs +2 -0
  178. package/dist/components/treeview/TreeView.cjs.map +1 -0
  179. package/dist/components/treeview/TreeView.js +98 -0
  180. package/dist/components/treeview/TreeView.js.map +1 -0
  181. package/dist/components/virtuallist/VirtualList.cjs +2 -0
  182. package/dist/components/virtuallist/VirtualList.cjs.map +1 -0
  183. package/dist/components/virtuallist/VirtualList.js +58 -0
  184. package/dist/components/virtuallist/VirtualList.js.map +1 -0
  185. package/dist/index.cjs +2 -0
  186. package/dist/index.cjs.map +1 -0
  187. package/dist/index.js +109 -0
  188. package/dist/index.js.map +1 -0
  189. package/dist/styles/index.css +1 -0
  190. package/dist/theme/NUIProvider.cjs +2 -0
  191. package/dist/theme/NUIProvider.cjs.map +1 -0
  192. package/dist/theme/NUIProvider.js +34 -0
  193. package/dist/theme/NUIProvider.js.map +1 -0
  194. package/dist/theme/useTheme.cjs +2 -0
  195. package/dist/theme/useTheme.cjs.map +1 -0
  196. package/dist/theme/useTheme.js +9 -0
  197. package/dist/theme/useTheme.js.map +1 -0
  198. package/dist/types/components/accordion/Accordion.d.ts +18 -0
  199. package/dist/types/components/accordion/Accordion.d.ts.map +1 -0
  200. package/dist/types/components/alert/Alert.d.ts +13 -0
  201. package/dist/types/components/alert/Alert.d.ts.map +1 -0
  202. package/dist/types/components/avatar/Avatar.d.ts +18 -0
  203. package/dist/types/components/avatar/Avatar.d.ts.map +1 -0
  204. package/dist/types/components/avatar/AvatarGroup.d.ts +10 -0
  205. package/dist/types/components/avatar/AvatarGroup.d.ts.map +1 -0
  206. package/dist/types/components/badge/Badge.d.ts +22 -0
  207. package/dist/types/components/badge/Badge.d.ts.map +1 -0
  208. package/dist/types/components/badge/BadgeGroup.d.ts +9 -0
  209. package/dist/types/components/badge/BadgeGroup.d.ts.map +1 -0
  210. package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts +15 -0
  211. package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts.map +1 -0
  212. package/dist/types/components/button/Button.d.ts +15 -0
  213. package/dist/types/components/button/Button.d.ts.map +1 -0
  214. package/dist/types/components/card/Card.d.ts +27 -0
  215. package/dist/types/components/card/Card.d.ts.map +1 -0
  216. package/dist/types/components/checkbox/Checkbox.d.ts +15 -0
  217. package/dist/types/components/checkbox/Checkbox.d.ts.map +1 -0
  218. package/dist/types/components/chip/Chip.d.ts +21 -0
  219. package/dist/types/components/chip/Chip.d.ts.map +1 -0
  220. package/dist/types/components/combobox/Combobox.d.ts +24 -0
  221. package/dist/types/components/combobox/Combobox.d.ts.map +1 -0
  222. package/dist/types/components/commandpalette/CommandPalette.d.ts +21 -0
  223. package/dist/types/components/commandpalette/CommandPalette.d.ts.map +1 -0
  224. package/dist/types/components/contextmenu/ContextMenu.d.ts +17 -0
  225. package/dist/types/components/contextmenu/ContextMenu.d.ts.map +1 -0
  226. package/dist/types/components/datagrid/DataGrid.d.ts +28 -0
  227. package/dist/types/components/datagrid/DataGrid.d.ts.map +1 -0
  228. package/dist/types/components/datepicker/DatePicker.d.ts +14 -0
  229. package/dist/types/components/datepicker/DatePicker.d.ts.map +1 -0
  230. package/dist/types/components/daterangepicker/DateRangePicker.d.ts +19 -0
  231. package/dist/types/components/daterangepicker/DateRangePicker.d.ts.map +1 -0
  232. package/dist/types/components/drawer/Drawer.d.ts +12 -0
  233. package/dist/types/components/drawer/Drawer.d.ts.map +1 -0
  234. package/dist/types/components/dropdown/Dropdown.d.ts +18 -0
  235. package/dist/types/components/dropdown/Dropdown.d.ts.map +1 -0
  236. package/dist/types/components/fileuploader/FileUploader.d.ts +9 -0
  237. package/dist/types/components/fileuploader/FileUploader.d.ts.map +1 -0
  238. package/dist/types/components/hovercard/HoverCard.d.ts +10 -0
  239. package/dist/types/components/hovercard/HoverCard.d.ts.map +1 -0
  240. package/dist/types/components/input/Input.d.ts +15 -0
  241. package/dist/types/components/input/Input.d.ts.map +1 -0
  242. package/dist/types/components/layout/Container.d.ts +8 -0
  243. package/dist/types/components/layout/Container.d.ts.map +1 -0
  244. package/dist/types/components/layout/Flex.d.ts +14 -0
  245. package/dist/types/components/layout/Flex.d.ts.map +1 -0
  246. package/dist/types/components/layout/Grid.d.ts +10 -0
  247. package/dist/types/components/layout/Grid.d.ts.map +1 -0
  248. package/dist/types/components/layout/HStack.d.ts +8 -0
  249. package/dist/types/components/layout/HStack.d.ts.map +1 -0
  250. package/dist/types/components/layout/Stack.d.ts +8 -0
  251. package/dist/types/components/layout/Stack.d.ts.map +1 -0
  252. package/dist/types/components/megamenu/MegaMenu.d.ts +12 -0
  253. package/dist/types/components/megamenu/MegaMenu.d.ts.map +1 -0
  254. package/dist/types/components/modal/Modal.d.ts +16 -0
  255. package/dist/types/components/modal/Modal.d.ts.map +1 -0
  256. package/dist/types/components/pagination/Pagination.d.ts +9 -0
  257. package/dist/types/components/pagination/Pagination.d.ts.map +1 -0
  258. package/dist/types/components/popover/Popover.d.ts +21 -0
  259. package/dist/types/components/popover/Popover.d.ts.map +1 -0
  260. package/dist/types/components/progress/Progress.d.ts +13 -0
  261. package/dist/types/components/progress/Progress.d.ts.map +1 -0
  262. package/dist/types/components/radiogroup/RadioGroup.d.ts +18 -0
  263. package/dist/types/components/radiogroup/RadioGroup.d.ts.map +1 -0
  264. package/dist/types/components/rating/Rating.d.ts +19 -0
  265. package/dist/types/components/rating/Rating.d.ts.map +1 -0
  266. package/dist/types/components/select/Select.d.ts +20 -0
  267. package/dist/types/components/select/Select.d.ts.map +1 -0
  268. package/dist/types/components/skeleton/Skeleton.d.ts +44 -0
  269. package/dist/types/components/skeleton/Skeleton.d.ts.map +1 -0
  270. package/dist/types/components/slider/Slider.d.ts +13 -0
  271. package/dist/types/components/slider/Slider.d.ts.map +1 -0
  272. package/dist/types/components/spinner/Spinner.d.ts +7 -0
  273. package/dist/types/components/spinner/Spinner.d.ts.map +1 -0
  274. package/dist/types/components/stepper/Stepper.d.ts +12 -0
  275. package/dist/types/components/stepper/Stepper.d.ts.map +1 -0
  276. package/dist/types/components/switch/Switch.d.ts +15 -0
  277. package/dist/types/components/switch/Switch.d.ts.map +1 -0
  278. package/dist/types/components/table/Table.d.ts +14 -0
  279. package/dist/types/components/table/Table.d.ts.map +1 -0
  280. package/dist/types/components/tabs/Tabs.d.ts +14 -0
  281. package/dist/types/components/tabs/Tabs.d.ts.map +1 -0
  282. package/dist/types/components/textarea/Textarea.d.ts +14 -0
  283. package/dist/types/components/textarea/Textarea.d.ts.map +1 -0
  284. package/dist/types/components/toast/Toast.d.ts +16 -0
  285. package/dist/types/components/toast/Toast.d.ts.map +1 -0
  286. package/dist/types/components/tooltip/Tooltip.d.ts +10 -0
  287. package/dist/types/components/tooltip/Tooltip.d.ts.map +1 -0
  288. package/dist/types/components/treeview/TreeView.d.ts +16 -0
  289. package/dist/types/components/treeview/TreeView.d.ts.map +1 -0
  290. package/dist/types/components/virtuallist/VirtualList.d.ts +23 -0
  291. package/dist/types/components/virtuallist/VirtualList.d.ts.map +1 -0
  292. package/dist/types/index.d.ts +50 -0
  293. package/dist/types/index.d.ts.map +1 -0
  294. package/dist/types/theme/NUIProvider.d.ts +14 -0
  295. package/dist/types/theme/NUIProvider.d.ts.map +1 -0
  296. package/dist/types/theme/useTheme.d.ts +11 -0
  297. package/dist/types/theme/useTheme.d.ts.map +1 -0
  298. package/dist/types/utils/generateid/generateId.d.ts +2 -0
  299. package/dist/types/utils/generateid/generateId.d.ts.map +1 -0
  300. package/dist/types/utils/index.d.ts +9 -0
  301. package/dist/types/utils/index.d.ts.map +1 -0
  302. package/dist/types/utils/inertmanager/inertManager.d.ts +13 -0
  303. package/dist/types/utils/inertmanager/inertManager.d.ts.map +1 -0
  304. package/dist/types/utils/keyboardnav/keyboardNav.d.ts +11 -0
  305. package/dist/types/utils/keyboardnav/keyboardNav.d.ts.map +1 -0
  306. package/dist/types/utils/onclickoutside/onClickOutside.d.ts +3 -0
  307. package/dist/types/utils/onclickoutside/onClickOutside.d.ts.map +1 -0
  308. package/dist/types/utils/portal/portal.d.ts +4 -0
  309. package/dist/types/utils/portal/portal.d.ts.map +1 -0
  310. package/dist/types/utils/restorefocus/restoreFocus.d.ts +8 -0
  311. package/dist/types/utils/restorefocus/restoreFocus.d.ts.map +1 -0
  312. package/dist/types/utils/scrolllock/scrollLock.d.ts +11 -0
  313. package/dist/types/utils/scrolllock/scrollLock.d.ts.map +1 -0
  314. package/dist/types/utils/trapfocus/trapFocus.d.ts +8 -0
  315. package/dist/types/utils/trapfocus/trapFocus.d.ts.map +1 -0
  316. package/dist/utils/generateid/generateId.cjs +2 -0
  317. package/dist/utils/generateid/generateId.cjs.map +1 -0
  318. package/dist/utils/generateid/generateId.js +7 -0
  319. package/dist/utils/generateid/generateId.js.map +1 -0
  320. package/dist/utils/inertmanager/inertManager.cjs +2 -0
  321. package/dist/utils/inertmanager/inertManager.cjs.map +1 -0
  322. package/dist/utils/inertmanager/inertManager.js +18 -0
  323. package/dist/utils/inertmanager/inertManager.js.map +1 -0
  324. package/dist/utils/keyboardnav/keyboardNav.cjs +2 -0
  325. package/dist/utils/keyboardnav/keyboardNav.cjs.map +1 -0
  326. package/dist/utils/keyboardnav/keyboardNav.js +10 -0
  327. package/dist/utils/keyboardnav/keyboardNav.js.map +1 -0
  328. package/dist/utils/onclickoutside/onClickOutside.cjs +2 -0
  329. package/dist/utils/onclickoutside/onClickOutside.cjs.map +1 -0
  330. package/dist/utils/onclickoutside/onClickOutside.js +11 -0
  331. package/dist/utils/onclickoutside/onClickOutside.js.map +1 -0
  332. package/dist/utils/portal/portal.cjs +2 -0
  333. package/dist/utils/portal/portal.cjs.map +1 -0
  334. package/dist/utils/portal/portal.js +8 -0
  335. package/dist/utils/portal/portal.js.map +1 -0
  336. package/dist/utils/restorefocus/restoreFocus.cjs +2 -0
  337. package/dist/utils/restorefocus/restoreFocus.cjs.map +1 -0
  338. package/dist/utils/restorefocus/restoreFocus.js +7 -0
  339. package/dist/utils/restorefocus/restoreFocus.js.map +1 -0
  340. package/dist/utils/scrolllock/scrollLock.cjs +2 -0
  341. package/dist/utils/scrolllock/scrollLock.cjs.map +1 -0
  342. package/dist/utils/scrolllock/scrollLock.js +12 -0
  343. package/dist/utils/scrolllock/scrollLock.js.map +1 -0
  344. package/dist/utils/trapfocus/trapFocus.cjs +3 -0
  345. package/dist/utils/trapfocus/trapFocus.cjs.map +1 -0
  346. package/dist/utils/trapfocus/trapFocus.js +14 -0
  347. package/dist/utils/trapfocus/trapFocus.js.map +1 -0
  348. package/package.json +3 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TreeView.js","sources":["../../../../src/components/treeview/TreeView.tsx"],"sourcesContent":["/**\r\n * TreeView.tsx — FINAL VERSION\r\n * ----------------------------\r\n * Features:\r\n * - Expand/collapse\r\n * - Recursive rendering\r\n * - Arrow key navigation\r\n * - Enter/Space to select\r\n * - ARIA TreeView roles\r\n * - Value controlled OR internal state\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport './TreeView.css';\r\n\r\nexport interface TreeNode {\r\n id: string;\r\n label: string;\r\n icon?: React.ReactNode;\r\n children?: TreeNode[];\r\n}\r\n\r\ninterface TreeViewProps {\r\n data: TreeNode[];\r\n selectedId?: string;\r\n onSelect?: (id: string) => void;\r\n className?: string;\r\n}\r\n\r\nexport function TreeView({\r\n data,\r\n selectedId,\r\n onSelect,\r\n className = '',\r\n}: TreeViewProps) {\r\n const [openNodes, setOpenNodes] = useState<Set<string>>(new Set());\r\n const [activeNode, setActiveNode] = useState<string | null>(null);\r\n\r\n const toggleNode = (id: string) => {\r\n setOpenNodes((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(id)) next.delete(id);\r\n else next.add(id);\r\n return next;\r\n });\r\n };\r\n\r\n const flatten = (nodes: TreeNode[], acc: TreeNode[] = []): TreeNode[] => {\r\n nodes.forEach((node) => {\r\n acc.push(node);\r\n\r\n const isOpen = openNodes.has(node.id);\r\n if (node.children && node.children.length > 0 && isOpen) {\r\n flatten(node.children, acc);\r\n }\r\n });\r\n return acc;\r\n };\r\n\r\n const handleKeyDown = (\r\n e: React.KeyboardEvent,\r\n node: TreeNode,\r\n parent: TreeNode | undefined\r\n ) => {\r\n const key = e.key;\r\n\r\n // Select\r\n if (key === 'Enter' || key === ' ') {\r\n e.preventDefault();\r\n if (onSelect) onSelect(node.id);\r\n return;\r\n }\r\n\r\n // Collapse or go to parent\r\n if (key === 'ArrowLeft') {\r\n e.preventDefault();\r\n\r\n const hasChildren = node.children && node.children.length > 0;\r\n const isOpen = openNodes.has(node.id);\r\n\r\n if (hasChildren && isOpen) {\r\n toggleNode(node.id);\r\n return;\r\n }\r\n\r\n if (parent) {\r\n setActiveNode(parent.id);\r\n }\r\n return;\r\n }\r\n\r\n // Expand or go to first child\r\n if (key === 'ArrowRight') {\r\n e.preventDefault();\r\n\r\n const hasChildren = node.children && node.children.length > 0;\r\n const isOpen = openNodes.has(node.id);\r\n\r\n if (hasChildren && !isOpen) {\r\n toggleNode(node.id);\r\n return;\r\n }\r\n\r\n if (hasChildren && isOpen) {\r\n const firstChild =\r\n Array.isArray(node.children) && node.children.length > 0\r\n ? node.children[0]\r\n : undefined;\r\n\r\n if (firstChild) {\r\n setActiveNode(firstChild.id);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n // Up/Down navigation\r\n if (key === 'ArrowUp' || key === 'ArrowDown') {\r\n e.preventDefault();\r\n const flat = flatten(data);\r\n const index = flat.findIndex((n) => n.id === node.id);\r\n\r\n if (index === -1) return;\r\n\r\n const nextIndex = key === 'ArrowUp' ? index - 1 : index + 1;\r\n const nextNode = flat[nextIndex];\r\n\r\n if (nextNode) {\r\n setActiveNode(nextNode.id);\r\n }\r\n }\r\n };\r\n\r\n const renderNode = (\r\n node: TreeNode,\r\n parent: TreeNode | undefined,\r\n depth: number\r\n ) => {\r\n const isOpen = openNodes.has(node.id);\r\n const isSelected = node.id === selectedId;\r\n const isActive = node.id === activeNode;\r\n const hasChildren =\r\n Array.isArray(node.children) && node.children.length > 0;\r\n\r\n return (\r\n <div key={node.id}>\r\n <div\r\n role=\"treeitem\"\r\n aria-expanded={hasChildren ? isOpen : undefined}\r\n tabIndex={isActive ? 0 : -1}\r\n className={[\r\n 'ui-tree-node',\r\n isSelected ? 'selected' : '',\r\n isActive ? 'active' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n style={{ paddingLeft: depth * 16 }}\r\n onClick={() => {\r\n if (onSelect) onSelect(node.id);\r\n setActiveNode(node.id);\r\n\r\n const hasChildren =\r\n Array.isArray(node.children) && node.children.length > 0;\r\n\r\n // Clicking node should expand/collapse just like arrow\r\n if (hasChildren) {\r\n toggleNode(node.id);\r\n }\r\n }}\r\n onKeyDown={(e) => handleKeyDown(e, node, parent)}\r\n >\r\n {/* Arrow */}\r\n {hasChildren ? (\r\n <span\r\n className={`ui-tree-arrow ${isOpen ? 'open' : ''}`}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n toggleNode(node.id);\r\n }}\r\n >\r\n ▶\r\n </span>\r\n ) : (\r\n <span className=\"ui-tree-arrow empty\">•</span>\r\n )}\r\n\r\n {/* Icon */}\r\n {node.icon && <span className=\"ui-tree-icon\">{node.icon}</span>}\r\n\r\n <span className=\"ui-tree-label\">{node.label}</span>\r\n </div>\r\n\r\n {/* Children */}\r\n {hasChildren && isOpen && node.children && (\r\n <div role=\"group\">\r\n {node.children.map((child) => renderNode(child, node, depth + 1))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className={`ui-treeview ${className}`} role=\"tree\">\r\n {data.map((node) => renderNode(node, undefined, 0))}\r\n </div>\r\n );\r\n}\r\n"],"names":["TreeView","data","selectedId","onSelect","className","openNodes","setOpenNodes","useState","activeNode","setActiveNode","toggleNode","id","prev","next","flatten","nodes","acc","node","isOpen","handleKeyDown","e","parent","key","hasChildren","firstChild","flat","index","n","nextIndex","nextNode","renderNode","depth","isSelected","isActive","jsxs","jsx","child"],"mappings":";;;AA6BO,SAASA,EAAS;AAAA,EACvB,MAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC,IAAY;AACd,GAAkB;AAChB,QAAM,CAACC,GAAWC,CAAY,IAAIC,EAAsB,oBAAI,KAAK,GAC3D,CAACC,GAAYC,CAAa,IAAIF,EAAwB,IAAI,GAE1DG,IAAa,CAACC,MAAe;AACjC,IAAAL,EAAa,CAACM,MAAS;AACrB,YAAMC,IAAO,IAAI,IAAID,CAAI;AACzB,aAAIC,EAAK,IAAIF,CAAE,IAAGE,EAAK,OAAOF,CAAE,IAC3BE,EAAK,IAAIF,CAAE,GACTE;AAAA,IACT,CAAC;AAAA,EACH,GAEMC,IAAU,CAACC,GAAmBC,IAAkB,CAAA,OACpDD,EAAM,QAAQ,CAACE,MAAS;AACtB,IAAAD,EAAI,KAAKC,CAAI;AAEb,UAAMC,IAASb,EAAU,IAAIY,EAAK,EAAE;AACpC,IAAIA,EAAK,YAAYA,EAAK,SAAS,SAAS,KAAKC,KAC/CJ,EAAQG,EAAK,UAAUD,CAAG;AAAA,EAE9B,CAAC,GACMA,IAGHG,IAAgB,CACpBC,GACAH,GACAI,MACG;AACH,UAAMC,IAAMF,EAAE;AAGd,QAAIE,MAAQ,WAAWA,MAAQ,KAAK;AAClC,MAAAF,EAAE,eAAA,GACEjB,KAAUA,EAASc,EAAK,EAAE;AAC9B;AAAA,IACF;AAGA,QAAIK,MAAQ,aAAa;AACvB,MAAAF,EAAE,eAAA;AAEF,YAAMG,IAAcN,EAAK,YAAYA,EAAK,SAAS,SAAS,GACtDC,IAASb,EAAU,IAAIY,EAAK,EAAE;AAEpC,UAAIM,KAAeL,GAAQ;AACzB,QAAAR,EAAWO,EAAK,EAAE;AAClB;AAAA,MACF;AAEA,MAAII,KACFZ,EAAcY,EAAO,EAAE;AAEzB;AAAA,IACF;AAGA,QAAIC,MAAQ,cAAc;AACxB,MAAAF,EAAE,eAAA;AAEF,YAAMG,IAAcN,EAAK,YAAYA,EAAK,SAAS,SAAS,GACtDC,IAASb,EAAU,IAAIY,EAAK,EAAE;AAEpC,UAAIM,KAAe,CAACL,GAAQ;AAC1B,QAAAR,EAAWO,EAAK,EAAE;AAClB;AAAA,MACF;AAEA,UAAIM,KAAeL,GAAQ;AACzB,cAAMM,IACJ,MAAM,QAAQP,EAAK,QAAQ,KAAKA,EAAK,SAAS,SAAS,IACnDA,EAAK,SAAS,CAAC,IACf;AAEN,QAAIO,KACFf,EAAce,EAAW,EAAE;AAAA,MAE/B;AACA;AAAA,IACF;AAGA,QAAIF,MAAQ,aAAaA,MAAQ,aAAa;AAC5C,MAAAF,EAAE,eAAA;AACF,YAAMK,IAAOX,EAAQb,CAAI,GACnByB,IAAQD,EAAK,UAAU,CAACE,MAAMA,EAAE,OAAOV,EAAK,EAAE;AAEpD,UAAIS,MAAU,GAAI;AAElB,YAAME,IAAYN,MAAQ,YAAYI,IAAQ,IAAIA,IAAQ,GACpDG,IAAWJ,EAAKG,CAAS;AAE/B,MAAIC,KACFpB,EAAcoB,EAAS,EAAE;AAAA,IAE7B;AAAA,EACF,GAEMC,IAAa,CACjBb,GACAI,GACAU,MACG;AACH,UAAMb,IAASb,EAAU,IAAIY,EAAK,EAAE,GAC9Be,IAAaf,EAAK,OAAOf,GACzB+B,IAAWhB,EAAK,OAAOT,GACvBe,IACJ,MAAM,QAAQN,EAAK,QAAQ,KAAKA,EAAK,SAAS,SAAS;AAEzD,6BACG,OAAA,EACC,UAAA;AAAA,MAAA,gBAAAiB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,iBAAeX,IAAcL,IAAS;AAAA,UACtC,UAAUe,IAAW,IAAI;AAAA,UACzB,WAAW;AAAA,YACT;AAAA,YACAD,IAAa,aAAa;AAAA,YAC1BC,IAAW,WAAW;AAAA,UAAA,EAErB,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,UACX,OAAO,EAAE,aAAaF,IAAQ,GAAA;AAAA,UAC9B,SAAS,MAAM;AACb,YAAI5B,KAAUA,EAASc,EAAK,EAAE,GAC9BR,EAAcQ,EAAK,EAAE,GAGnB,MAAM,QAAQA,EAAK,QAAQ,KAAKA,EAAK,SAAS,SAAS,KAIvDP,EAAWO,EAAK,EAAE;AAAA,UAEtB;AAAA,UACA,WAAW,CAACG,MAAMD,EAAcC,GAAGH,GAAMI,CAAM;AAAA,UAG9C,UAAA;AAAA,YAAAE,IACC,gBAAAY;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW,iBAAiBjB,IAAS,SAAS,EAAE;AAAA,gBAChD,SAAS,CAACE,MAAM;AACd,kBAAAA,EAAE,gBAAA,GACFV,EAAWO,EAAK,EAAE;AAAA,gBACpB;AAAA,gBACD,UAAA;AAAA,cAAA;AAAA,YAAA,IAID,gBAAAkB,EAAC,QAAA,EAAK,WAAU,uBAAsB,UAAA,KAAC;AAAA,YAIxClB,EAAK,QAAQ,gBAAAkB,EAAC,UAAK,WAAU,gBAAgB,YAAK,MAAK;AAAA,YAExD,gBAAAA,EAAC,QAAA,EAAK,WAAU,iBAAiB,YAAK,MAAA,CAAM;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAI7CZ,KAAeL,KAAUD,EAAK,YAC7B,gBAAAkB,EAAC,OAAA,EAAI,MAAK,SACP,UAAAlB,EAAK,SAAS,IAAI,CAACmB,MAAUN,EAAWM,GAAOnB,GAAMc,IAAQ,CAAC,CAAC,EAAA,CAClE;AAAA,IAAA,EAAA,GApDMd,EAAK,EAsDf;AAAA,EAEJ;AAEA,2BACG,OAAA,EAAI,WAAW,eAAeb,CAAS,IAAI,MAAK,QAC9C,UAAAH,EAAK,IAAI,CAACgB,MAASa,EAAWb,GAAM,QAAW,CAAC,CAAC,GACpD;AAEJ;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react/jsx-runtime"),n=require("react");;/* empty css */function L({items:o,height:a,itemHeight:e=36,renderItem:d,className:v=""}){const s=n.useRef(null),[f,x]=n.useState(0),c=n.useCallback(()=>{s.current&&x(s.current.scrollTop)},[]),i=o.length,p=Math.ceil(a/e)+2,r=Math.max(0,Math.floor(f/e)-1),m=Math.min(i-1,r+p),y=r*e,h=o.slice(r,m+1);return n.useLayoutEffect(()=>{const t=s.current;if(t)return t.addEventListener("scroll",c,{passive:!0}),()=>t.removeEventListener("scroll",c)},[c]),l.jsxs("div",{ref:s,className:`ui-virtual-list ${v}`,style:{height:a},children:[l.jsx("div",{className:"ui-virtual-spacer",style:{height:i*e}}),l.jsx("div",{className:"ui-virtual-items",style:{transform:`translateY(${y}px)`},children:h.map((t,j)=>{const u=r+j;return l.jsx("div",{className:"ui-virtual-row",style:{height:e},children:d(t,u)},u)})})]})}exports.VirtualList=L;
2
+ //# sourceMappingURL=VirtualList.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VirtualList.cjs","sources":["../../../../src/components/virtuallist/VirtualList.tsx"],"sourcesContent":["import React, { useRef, useState, useLayoutEffect, useCallback } from 'react';\r\nimport './VirtualList.css';\r\n\r\nexport interface VirtualListProps<T> {\r\n items: T[];\r\n /** Height of the viewport container */\r\n height: number;\r\n /** Fixed height for each row */\r\n itemHeight?: number; // default: 36px\r\n /** Renderer function */\r\n renderItem: (item: T, index: number) => React.ReactNode;\r\n /** Optional class */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Virtualized List (Fixed Row Height)\r\n * -----------------------------------\r\n * • Ultra-fast\r\n * • Handles 10k+ rows easily\r\n * • Smooth scroll\r\n * • Zero dependencies\r\n * • Precision scrolling\r\n */\r\nexport function VirtualList<T>({\r\n items,\r\n height,\r\n itemHeight = 36,\r\n renderItem,\r\n className = '',\r\n}: VirtualListProps<T>) {\r\n const containerRef = useRef<HTMLDivElement | null>(null);\r\n\r\n // visible window\r\n const [scrollTop, setScrollTop] = useState(0);\r\n\r\n const onScroll = useCallback(() => {\r\n if (containerRef.current) {\r\n setScrollTop(containerRef.current.scrollTop);\r\n }\r\n }, []);\r\n\r\n // compute visible range\r\n const total = items.length;\r\n const viewCount = Math.ceil(height / itemHeight) + 2; // overscan\r\n const startIndex = Math.max(0, Math.floor(scrollTop / itemHeight) - 1);\r\n const endIndex = Math.min(total - 1, startIndex + viewCount);\r\n\r\n // positioning\r\n const offsetTop = startIndex * itemHeight;\r\n const visibleItems = items.slice(startIndex, endIndex + 1);\r\n\r\n // ensure scroll events update immediately\r\n useLayoutEffect(() => {\r\n const el = containerRef.current;\r\n if (!el) return;\r\n\r\n el.addEventListener('scroll', onScroll, { passive: true });\r\n return () => el.removeEventListener('scroll', onScroll);\r\n }, [onScroll]);\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={`ui-virtual-list ${className}`}\r\n style={{ height }}\r\n >\r\n <div\r\n className=\"ui-virtual-spacer\"\r\n style={{ height: total * itemHeight }}\r\n />\r\n\r\n <div\r\n className=\"ui-virtual-items\"\r\n style={{ transform: `translateY(${offsetTop}px)` }}\r\n >\r\n {visibleItems.map((item, i) => {\r\n const index = startIndex + i;\r\n return (\r\n <div\r\n key={index}\r\n className=\"ui-virtual-row\"\r\n style={{ height: itemHeight }}\r\n >\r\n {renderItem(item, index)}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["VirtualList","items","height","itemHeight","renderItem","className","containerRef","useRef","scrollTop","setScrollTop","useState","onScroll","useCallback","total","viewCount","startIndex","endIndex","offsetTop","visibleItems","useLayoutEffect","el","jsxs","jsx","item","i","index"],"mappings":"yKAwBO,SAASA,EAAe,CAC7B,MAAAC,EACA,OAAAC,EACA,WAAAC,EAAa,GACb,WAAAC,EACA,UAAAC,EAAY,EACd,EAAwB,CACtB,MAAMC,EAAeC,EAAAA,OAA8B,IAAI,EAGjD,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAAS,CAAC,EAEtCC,EAAWC,EAAAA,YAAY,IAAM,CAC7BN,EAAa,SACfG,EAAaH,EAAa,QAAQ,SAAS,CAE/C,EAAG,CAAA,CAAE,EAGCO,EAAQZ,EAAM,OACda,EAAY,KAAK,KAAKZ,EAASC,CAAU,EAAI,EAC7CY,EAAa,KAAK,IAAI,EAAG,KAAK,MAAMP,EAAYL,CAAU,EAAI,CAAC,EAC/Da,EAAW,KAAK,IAAIH,EAAQ,EAAGE,EAAaD,CAAS,EAGrDG,EAAYF,EAAaZ,EACzBe,EAAejB,EAAM,MAAMc,EAAYC,EAAW,CAAC,EAGzDG,OAAAA,EAAAA,gBAAgB,IAAM,CACpB,MAAMC,EAAKd,EAAa,QACxB,GAAKc,EAEL,OAAAA,EAAG,iBAAiB,SAAUT,EAAU,CAAE,QAAS,GAAM,EAClD,IAAMS,EAAG,oBAAoB,SAAUT,CAAQ,CACxD,EAAG,CAACA,CAAQ,CAAC,EAGXU,EAAAA,KAAC,MAAA,CACC,IAAKf,EACL,UAAW,mBAAmBD,CAAS,GACvC,MAAO,CAAE,OAAAH,CAAA,EAET,SAAA,CAAAoB,EAAAA,IAAC,MAAA,CACC,UAAU,oBACV,MAAO,CAAE,OAAQT,EAAQV,CAAA,CAAW,CAAA,EAGtCmB,EAAAA,IAAC,MAAA,CACC,UAAU,mBACV,MAAO,CAAE,UAAW,cAAcL,CAAS,KAAA,EAE1C,SAAAC,EAAa,IAAI,CAACK,EAAMC,IAAM,CAC7B,MAAMC,EAAQV,EAAaS,EAC3B,OACEF,EAAAA,IAAC,MAAA,CAEC,UAAU,iBACV,MAAO,CAAE,OAAQnB,CAAA,EAEhB,SAAAC,EAAWmB,EAAME,CAAK,CAAA,EAJlBA,CAAA,CAOX,CAAC,CAAA,CAAA,CACH,CAAA,CAAA,CAGN"}
@@ -0,0 +1,58 @@
1
+ import { jsxs as L, jsx as n } from "react/jsx-runtime";
2
+ import { useRef as M, useState as N, useCallback as T, useLayoutEffect as E } from "react";
3
+ /* empty css */
4
+ function j({
5
+ items: o,
6
+ height: c,
7
+ itemHeight: t = 36,
8
+ renderItem: u,
9
+ className: f = ""
10
+ }) {
11
+ const e = M(null), [v, d] = N(0), l = T(() => {
12
+ e.current && d(e.current.scrollTop);
13
+ }, []), a = o.length, p = Math.ceil(c / t) + 2, r = Math.max(0, Math.floor(v / t) - 1), m = Math.min(a - 1, r + p), x = r * t, h = o.slice(r, m + 1);
14
+ return E(() => {
15
+ const s = e.current;
16
+ if (s)
17
+ return s.addEventListener("scroll", l, { passive: !0 }), () => s.removeEventListener("scroll", l);
18
+ }, [l]), /* @__PURE__ */ L(
19
+ "div",
20
+ {
21
+ ref: e,
22
+ className: `ui-virtual-list ${f}`,
23
+ style: { height: c },
24
+ children: [
25
+ /* @__PURE__ */ n(
26
+ "div",
27
+ {
28
+ className: "ui-virtual-spacer",
29
+ style: { height: a * t }
30
+ }
31
+ ),
32
+ /* @__PURE__ */ n(
33
+ "div",
34
+ {
35
+ className: "ui-virtual-items",
36
+ style: { transform: `translateY(${x}px)` },
37
+ children: h.map((s, y) => {
38
+ const i = r + y;
39
+ return /* @__PURE__ */ n(
40
+ "div",
41
+ {
42
+ className: "ui-virtual-row",
43
+ style: { height: t },
44
+ children: u(s, i)
45
+ },
46
+ i
47
+ );
48
+ })
49
+ }
50
+ )
51
+ ]
52
+ }
53
+ );
54
+ }
55
+ export {
56
+ j as VirtualList
57
+ };
58
+ //# sourceMappingURL=VirtualList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VirtualList.js","sources":["../../../../src/components/virtuallist/VirtualList.tsx"],"sourcesContent":["import React, { useRef, useState, useLayoutEffect, useCallback } from 'react';\r\nimport './VirtualList.css';\r\n\r\nexport interface VirtualListProps<T> {\r\n items: T[];\r\n /** Height of the viewport container */\r\n height: number;\r\n /** Fixed height for each row */\r\n itemHeight?: number; // default: 36px\r\n /** Renderer function */\r\n renderItem: (item: T, index: number) => React.ReactNode;\r\n /** Optional class */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Virtualized List (Fixed Row Height)\r\n * -----------------------------------\r\n * • Ultra-fast\r\n * • Handles 10k+ rows easily\r\n * • Smooth scroll\r\n * • Zero dependencies\r\n * • Precision scrolling\r\n */\r\nexport function VirtualList<T>({\r\n items,\r\n height,\r\n itemHeight = 36,\r\n renderItem,\r\n className = '',\r\n}: VirtualListProps<T>) {\r\n const containerRef = useRef<HTMLDivElement | null>(null);\r\n\r\n // visible window\r\n const [scrollTop, setScrollTop] = useState(0);\r\n\r\n const onScroll = useCallback(() => {\r\n if (containerRef.current) {\r\n setScrollTop(containerRef.current.scrollTop);\r\n }\r\n }, []);\r\n\r\n // compute visible range\r\n const total = items.length;\r\n const viewCount = Math.ceil(height / itemHeight) + 2; // overscan\r\n const startIndex = Math.max(0, Math.floor(scrollTop / itemHeight) - 1);\r\n const endIndex = Math.min(total - 1, startIndex + viewCount);\r\n\r\n // positioning\r\n const offsetTop = startIndex * itemHeight;\r\n const visibleItems = items.slice(startIndex, endIndex + 1);\r\n\r\n // ensure scroll events update immediately\r\n useLayoutEffect(() => {\r\n const el = containerRef.current;\r\n if (!el) return;\r\n\r\n el.addEventListener('scroll', onScroll, { passive: true });\r\n return () => el.removeEventListener('scroll', onScroll);\r\n }, [onScroll]);\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={`ui-virtual-list ${className}`}\r\n style={{ height }}\r\n >\r\n <div\r\n className=\"ui-virtual-spacer\"\r\n style={{ height: total * itemHeight }}\r\n />\r\n\r\n <div\r\n className=\"ui-virtual-items\"\r\n style={{ transform: `translateY(${offsetTop}px)` }}\r\n >\r\n {visibleItems.map((item, i) => {\r\n const index = startIndex + i;\r\n return (\r\n <div\r\n key={index}\r\n className=\"ui-virtual-row\"\r\n style={{ height: itemHeight }}\r\n >\r\n {renderItem(item, index)}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["VirtualList","items","height","itemHeight","renderItem","className","containerRef","useRef","scrollTop","setScrollTop","useState","onScroll","useCallback","total","viewCount","startIndex","endIndex","offsetTop","visibleItems","useLayoutEffect","el","jsxs","jsx","item","i","index"],"mappings":";;;AAwBO,SAASA,EAAe;AAAA,EAC7B,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,YAAAC,IAAa;AAAA,EACb,YAAAC;AAAA,EACA,WAAAC,IAAY;AACd,GAAwB;AACtB,QAAMC,IAAeC,EAA8B,IAAI,GAGjD,CAACC,GAAWC,CAAY,IAAIC,EAAS,CAAC,GAEtCC,IAAWC,EAAY,MAAM;AACjC,IAAIN,EAAa,WACfG,EAAaH,EAAa,QAAQ,SAAS;AAAA,EAE/C,GAAG,CAAA,CAAE,GAGCO,IAAQZ,EAAM,QACda,IAAY,KAAK,KAAKZ,IAASC,CAAU,IAAI,GAC7CY,IAAa,KAAK,IAAI,GAAG,KAAK,MAAMP,IAAYL,CAAU,IAAI,CAAC,GAC/Da,IAAW,KAAK,IAAIH,IAAQ,GAAGE,IAAaD,CAAS,GAGrDG,IAAYF,IAAaZ,GACzBe,IAAejB,EAAM,MAAMc,GAAYC,IAAW,CAAC;AAGzD,SAAAG,EAAgB,MAAM;AACpB,UAAMC,IAAKd,EAAa;AACxB,QAAKc;AAEL,aAAAA,EAAG,iBAAiB,UAAUT,GAAU,EAAE,SAAS,IAAM,GAClD,MAAMS,EAAG,oBAAoB,UAAUT,CAAQ;AAAA,EACxD,GAAG,CAACA,CAAQ,CAAC,GAGX,gBAAAU;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKf;AAAA,MACL,WAAW,mBAAmBD,CAAS;AAAA,MACvC,OAAO,EAAE,QAAAH,EAAA;AAAA,MAET,UAAA;AAAA,QAAA,gBAAAoB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,QAAQT,IAAQV,EAAA;AAAA,UAAW;AAAA,QAAA;AAAA,QAGtC,gBAAAmB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,WAAW,cAAcL,CAAS,MAAA;AAAA,YAE1C,UAAAC,EAAa,IAAI,CAACK,GAAMC,MAAM;AAC7B,oBAAMC,IAAQV,IAAaS;AAC3B,qBACE,gBAAAF;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,WAAU;AAAA,kBACV,OAAO,EAAE,QAAQnB,EAAA;AAAA,kBAEhB,UAAAC,EAAWmB,GAAME,CAAK;AAAA,gBAAA;AAAA,gBAJlBA;AAAA,cAAA;AAAA,YAOX,CAAC;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAAA;AAGN;"}
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});;/* empty css */const i=require("./components/button/Button.cjs"),n=require("./components/modal/Modal.cjs"),e=require("./components/dropdown/Dropdown.cjs"),a=require("./components/input/Input.cjs"),u=require("./components/tabs/Tabs.cjs"),s=require("./components/tooltip/Tooltip.cjs"),o=require("./components/toast/Toast.cjs"),c=require("./components/accordion/Accordion.cjs"),d=require("./components/skeleton/Skeleton.cjs"),p=require("./components/slider/Slider.cjs"),q=require("./components/checkbox/Checkbox.cjs"),l=require("./components/radiogroup/RadioGroup.cjs"),T=require("./components/switch/Switch.cjs"),g=require("./components/datepicker/DatePicker.cjs"),C=require("./components/daterangepicker/DateRangePicker.cjs"),P=require("./components/drawer/Drawer.cjs"),v=require("./components/card/Card.cjs"),S=require("./components/alert/Alert.cjs"),D=require("./components/table/Table.cjs"),b=require("./components/badge/Badge.cjs"),m=require("./components/badge/BadgeGroup.cjs"),k=require("./components/avatar/Avatar.cjs"),w=require("./components/avatar/AvatarGroup.cjs"),x=require("./components/combobox/Combobox.cjs"),G=require("./components/megamenu/MegaMenu.cjs"),M=require("./components/layout/Container.cjs"),h=require("./components/layout/Grid.cjs"),A=require("./components/layout/Flex.cjs"),B=require("./components/layout/Stack.cjs"),R=require("./components/layout/HStack.cjs"),I=require("./components/textarea/Textarea.cjs"),r=require("./components/popover/Popover.cjs"),F=require("./components/pagination/Pagination.cjs"),H=require("./components/breadcrumbs/Breadcrumbs.cjs"),U=require("./components/progress/Progress.cjs"),V=require("./components/spinner/Spinner.cjs"),L=require("./components/stepper/Stepper.cjs"),N=require("./components/chip/Chip.cjs"),y=require("./components/rating/Rating.cjs"),f=require("./components/hovercard/HoverCard.cjs"),j=require("./components/fileuploader/FileUploader.cjs"),O=require("./components/contextmenu/ContextMenu.cjs"),z=require("./components/commandpalette/CommandPalette.cjs"),E=require("./components/treeview/TreeView.cjs"),J=require("./components/datagrid/DataGrid.cjs"),K=require("./components/virtuallist/VirtualList.cjs"),t=require("./theme/NUIProvider.cjs"),Q=require("./theme/useTheme.cjs");exports.Button=i.Button;exports.Modal=n.Modal;exports.Dropdown=e.Dropdown;exports.DropdownItem=e.DropdownItem;exports.DropdownMenu=e.DropdownMenu;exports.DropdownTrigger=e.DropdownTrigger;exports.Input=a.Input;exports.Tabs=u.Tabs;exports.Tooltip=s.Tooltip;exports.Toast=o.Toast;exports.ToastProvider=o.ToastProvider;exports.useToast=o.useToast;exports.Accordion=c.Accordion;exports.Skeleton=d.Skeleton;exports.Slider=p.Slider;exports.Checkbox=q.Checkbox;exports.RadioGroup=l.RadioGroup;exports.Switch=T.Switch;exports.DatePicker=g.DatePicker;exports.DateRangePicker=C.DateRangePicker;exports.Drawer=P.Drawer;exports.Card=v.Card;exports.Alert=S.Alert;exports.Table=D.Table;exports.Badge=b.Badge;exports.BadgeGroup=m.BadgeGroup;exports.Avatar=k.Avatar;exports.AvatarGroup=w.AvatarGroup;exports.Combobox=x.Combobox;exports.MegaMenu=G.MegaMenu;exports.Container=M.Container;exports.Grid=h.Grid;exports.Flex=A.Flex;exports.Stack=B.Stack;exports.HStack=R.HStack;exports.Textarea=I.Textarea;exports.Popover=r.Popover;exports.PopoverClose=r.PopoverClose;exports.PopoverContent=r.PopoverContent;exports.PopoverTrigger=r.PopoverTrigger;exports.Pagination=F.Pagination;exports.Breadcrumbs=H.Breadcrumbs;exports.Progress=U.Progress;exports.Spinner=V.Spinner;exports.Stepper=L.Stepper;exports.Chip=N.Chip;exports.Rating=y.Rating;exports.HoverCard=f.HoverCard;exports.FileUploader=j.FileUploader;exports.ContextMenu=O.ContextMenu;exports.CommandPalette=z.CommandPalette;exports.TreeView=E.TreeView;exports.DataGrid=J.DataGrid;exports.VirtualList=K.VirtualList;exports.NUIProvider=t.NUIProvider;exports.ThemeContext=t.ThemeContext;exports.useTheme=Q.useTheme;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,109 @@
1
+ /* empty css */
2
+ import { Button as t } from "./components/button/Button.js";
3
+ import { Modal as m } from "./components/modal/Modal.js";
4
+ import { Dropdown as f, DropdownItem as a, DropdownMenu as i, DropdownTrigger as n } from "./components/dropdown/Dropdown.js";
5
+ import { Input as l } from "./components/input/Input.js";
6
+ import { Tabs as T } from "./components/tabs/Tabs.js";
7
+ import { Tooltip as s } from "./components/tooltip/Tooltip.js";
8
+ import { Toast as P, ToastProvider as c, useToast as v } from "./components/toast/Toast.js";
9
+ import { Accordion as w } from "./components/accordion/Accordion.js";
10
+ import { Skeleton as b } from "./components/skeleton/Skeleton.js";
11
+ import { Slider as h } from "./components/slider/Slider.js";
12
+ import { Checkbox as M } from "./components/checkbox/Checkbox.js";
13
+ import { RadioGroup as B } from "./components/radiogroup/RadioGroup.js";
14
+ import { Switch as R } from "./components/switch/Switch.js";
15
+ import { DatePicker as H } from "./components/datepicker/DatePicker.js";
16
+ import { DateRangePicker as V } from "./components/daterangepicker/DateRangePicker.js";
17
+ import { Drawer as N } from "./components/drawer/Drawer.js";
18
+ import { Card as q } from "./components/card/Card.js";
19
+ import { Alert as z } from "./components/alert/Alert.js";
20
+ import { Table as J } from "./components/table/Table.js";
21
+ import { Badge as O } from "./components/badge/Badge.js";
22
+ import { BadgeGroup as W } from "./components/badge/BadgeGroup.js";
23
+ import { Avatar as Y } from "./components/avatar/Avatar.js";
24
+ import { AvatarGroup as _ } from "./components/avatar/AvatarGroup.js";
25
+ import { Combobox as oo } from "./components/combobox/Combobox.js";
26
+ import { MegaMenu as eo } from "./components/megamenu/MegaMenu.js";
27
+ import { Container as po } from "./components/layout/Container.js";
28
+ import { Grid as xo } from "./components/layout/Grid.js";
29
+ import { Flex as ao } from "./components/layout/Flex.js";
30
+ import { Stack as no } from "./components/layout/Stack.js";
31
+ import { HStack as uo } from "./components/layout/HStack.js";
32
+ import { Textarea as go } from "./components/textarea/Textarea.js";
33
+ import { Popover as Co, PopoverClose as Po, PopoverContent as co, PopoverTrigger as vo } from "./components/popover/Popover.js";
34
+ import { Pagination as wo } from "./components/pagination/Pagination.js";
35
+ import { Breadcrumbs as bo } from "./components/breadcrumbs/Breadcrumbs.js";
36
+ import { Progress as ho } from "./components/progress/Progress.js";
37
+ import { Spinner as Mo } from "./components/spinner/Spinner.js";
38
+ import { Stepper as Bo } from "./components/stepper/Stepper.js";
39
+ import { Chip as Ro } from "./components/chip/Chip.js";
40
+ import { Rating as Ho } from "./components/rating/Rating.js";
41
+ import { HoverCard as Vo } from "./components/hovercard/HoverCard.js";
42
+ import { FileUploader as No } from "./components/fileuploader/FileUploader.js";
43
+ import { ContextMenu as qo } from "./components/contextmenu/ContextMenu.js";
44
+ import { CommandPalette as zo } from "./components/commandpalette/CommandPalette.js";
45
+ import { TreeView as Jo } from "./components/treeview/TreeView.js";
46
+ import { DataGrid as Oo } from "./components/datagrid/DataGrid.js";
47
+ import { VirtualList as Wo } from "./components/virtuallist/VirtualList.js";
48
+ import { NUIProvider as Yo, ThemeContext as Zo } from "./theme/NUIProvider.js";
49
+ import { useTheme as $o } from "./theme/useTheme.js";
50
+ export {
51
+ w as Accordion,
52
+ z as Alert,
53
+ Y as Avatar,
54
+ _ as AvatarGroup,
55
+ O as Badge,
56
+ W as BadgeGroup,
57
+ bo as Breadcrumbs,
58
+ t as Button,
59
+ q as Card,
60
+ M as Checkbox,
61
+ Ro as Chip,
62
+ oo as Combobox,
63
+ zo as CommandPalette,
64
+ po as Container,
65
+ qo as ContextMenu,
66
+ Oo as DataGrid,
67
+ H as DatePicker,
68
+ V as DateRangePicker,
69
+ N as Drawer,
70
+ f as Dropdown,
71
+ a as DropdownItem,
72
+ i as DropdownMenu,
73
+ n as DropdownTrigger,
74
+ No as FileUploader,
75
+ ao as Flex,
76
+ xo as Grid,
77
+ uo as HStack,
78
+ Vo as HoverCard,
79
+ l as Input,
80
+ eo as MegaMenu,
81
+ m as Modal,
82
+ Yo as NUIProvider,
83
+ wo as Pagination,
84
+ Co as Popover,
85
+ Po as PopoverClose,
86
+ co as PopoverContent,
87
+ vo as PopoverTrigger,
88
+ ho as Progress,
89
+ B as RadioGroup,
90
+ Ho as Rating,
91
+ b as Skeleton,
92
+ h as Slider,
93
+ Mo as Spinner,
94
+ no as Stack,
95
+ Bo as Stepper,
96
+ R as Switch,
97
+ J as Table,
98
+ T as Tabs,
99
+ go as Textarea,
100
+ Zo as ThemeContext,
101
+ P as Toast,
102
+ c as ToastProvider,
103
+ s as Tooltip,
104
+ Jo as TreeView,
105
+ Wo as VirtualList,
106
+ $o as useTheme,
107
+ v as useToast
108
+ };
109
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1 @@
1
+ *,:before,:after{box-sizing:border-box;margin:0;padding:0}html{font-family:var(--font-base);background-color:var(--color-bg);color:var(--color-text)}.ui-btn{padding:var(--space-2)var(--space-3);font-family:var(--font-base);background-color:var(--color-bg-secondary);color:var(--color-text);border:1px solid var(--color-border);border-radius:var(--radius-md);cursor:pointer;justify-content:center;align-items:center;font-size:14px;font-weight:500;line-height:1.5;transition:all .2s ease-in-out;display:inline-flex}.ui-btn:hover:not(:disabled){filter:brightness(.9);border-color:#0003}.ui-btn:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-btn:disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.ui-btn--primary{background-color:var(--color-primary);color:#fff;border-color:var(--color-primary)}.ui-btn--sm{padding:var(--space-1)var(--space-2);font-size:13px}.ui-btn--lg{padding:var(--space-3)var(--space-4);font-size:16px}.ui-modal-overlay{z-index:9999;pointer-events:none;place-items:center;display:grid;position:fixed;inset:0}.ui-modal-overlay:before{content:"";-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);pointer-events:auto;background:#00000073;position:absolute;inset:0}.ui-modal-container{z-index:10000;background:var(--color-bg);width:min(90vw,720px);max-height:90vh;color:var(--color-text);border-radius:var(--radius-lg);padding:calc(var(--space-3)*1.5);pointer-events:auto;transform-origin:50%;outline:none;position:relative;overflow-y:auto;box-shadow:0 10px 30px #00000040}.ui-modal-content{margin-top:var(--space-2)}.ui-modal-title{font-size:1.125rem;font-weight:600;line-height:1.2}.ui-modal-description{margin-top:var(--space-1);color:var(--color-text-secondary);font-size:.95rem}.ui-modal-close{top:var(--space-2);right:var(--space-2);cursor:pointer;color:var(--color-text-secondary);background:0 0;border:none;padding:6px;font-size:1.25rem;line-height:1;position:absolute}.ui-modal-close:focus-visible{outline:2px solid var(--color-primary);outline-offset:3px}.ui-modal-overlay-catcher{pointer-events:auto;opacity:0;background:0 0;border:0;position:absolute;inset:0}@media (prefers-reduced-motion:no-preference){.ui-modal-container{animation:ui-modal-in .18s var(--transition-fast)both}@keyframes ui-modal-in{0%{opacity:0;transform:translateY(8px)scale(.985)}to{opacity:1;transform:translateY(0)scale(1)}}}@media (prefers-reduced-motion:reduce){.ui-modal-container{transition:none;animation:none}}.ui-dropdown{display:inline-block}.ui-dropdown-trigger{padding:var(--space-2)var(--space-3);border:1px solid var(--color-border);background:var(--color-bg-secondary);color:var(--color-text);border-radius:var(--radius-md);cursor:pointer;transition:background-color var(--transition-fast)}.ui-dropdown-trigger:hover{background:var(--color-bg)}.ui-dropdown-trigger:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-dropdown-menu-wrapper{z-index:9999;position:absolute}.ui-dropdown-menu{background:var(--color-bg);color:var(--color-text);border:1px solid var(--color-border);border-radius:var(--radius-md);min-width:160px;padding:4px 0;box-shadow:0 4px 20px #0003}.ui-dropdown-item{padding:var(--space-2)var(--space-3);cursor:pointer;white-space:nowrap;-webkit-user-select:none;user-select:none;outline:none}.ui-dropdown-item:hover,.ui-dropdown-item:focus-visible{background-color:var(--color-primary);color:#fff}.ui-input-wrapper{flex-direction:column;gap:4px;width:100%;display:flex}.ui-input-label{color:var(--color-text);font-size:14px;font-weight:500}.ui-input-description{color:var(--color-text-secondary);font-size:12px}.ui-input-error{color:#e11d48;font-size:12px}.ui-input{width:100%;padding:var(--space-2);border:1px solid var(--color-border);background-color:var(--color-bg-secondary);color:var(--color-text);border-radius:var(--radius-md);transition:border-color var(--transition-fast),background var(--transition-fast);font-size:14px}.ui-input:hover{background-color:var(--color-bg)}.ui-input:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-input:disabled{opacity:.6;cursor:not-allowed}.ui-input--error{background:#fee2e2;border-color:#e11d48}.ui-input--error:focus-visible{outline-color:#e11d48}.ui-input--sm{padding:var(--space-1);font-size:13px}.ui-input--lg{padding:var(--space-3);font-size:15px}.ui-tabs{width:100%}.ui-tabs-list{border-bottom:1px solid var(--color-border);gap:8px;display:flex}.ui-tab{padding:var(--space-2)var(--space-3);cursor:pointer;color:var(--color-text-secondary);border-radius:var(--radius-md)var(--radius-md)0 0;transition:color var(--transition-fast),background var(--transition-fast);background:0 0;border:none;font-size:14px}.ui-tab:hover{color:var(--color-text);background:var(--color-bg-secondary)}.ui-tab:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-tab[aria-selected=true]{color:var(--color-text);background:var(--color-bg);border-bottom:2px solid var(--color-primary);font-weight:500}.ui-tabs-panel{padding:var(--space-3);color:var(--color-text)}:root{--tooltip-bg:#1e293b;--tooltip-text:#fff;--tooltip-radius:6px;--tooltip-shadow:0 10px 30px #0003;--tooltip-arrow-size:8px}.ui-tooltip-container{display:inline-flex}.ui-tooltip-bubble{z-index:10000;background:var(--tooltip-bg);max-width:260px;color:var(--tooltip-text);border-radius:var(--tooltip-radius);text-align:center;pointer-events:none;box-shadow:var(--tooltip-shadow);padding:6px 12px;font-size:.75rem;font-weight:500;line-height:1.4;animation:.12s ease-out tooltip-in;transform:translate(-50%)}.ui-tooltip-bubble:before{content:"";width:var(--tooltip-arrow-size);height:var(--tooltip-arrow-size);background:var(--tooltip-bg);position:absolute;left:50%;transform:translate(-50%)rotate(45deg)}.ui-tooltip-bubble[data-placement=top]:before{bottom:-4px}.ui-tooltip-bubble[data-placement=bottom]:before{top:-4px}@keyframes tooltip-in{0%{opacity:0;transform:translate(-50%)scale(.96)}to{opacity:1;transform:translate(-50%)scale(1)}}@media (prefers-reduced-motion:reduce){.ui-tooltip-bubble{animation:none}}.ui-toast-container{z-index:999999;flex-direction:column;gap:12px;display:flex;position:fixed;bottom:20px;right:20px}.ui-toast{background:var(--color-bg);color:var(--color-text);border-left:4px solid var(--color-primary);border-radius:var(--radius-md);justify-content:space-between;align-items:center;min-width:240px;max-width:320px;padding:12px 16px;font-size:14px;animation:.15s ease-out forwards ui-toast-in;display:flex;box-shadow:0 4px 20px #00000026}.ui-toast button{color:var(--color-text-secondary);cursor:pointer;background:0 0;border:none;margin-left:12px;font-size:16px}@keyframes ui-toast-in{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){.ui-toast{animation:none}}.ui-accordion{width:100%}.ui-accordion-item{border-bottom:1px solid var(--color-border)}.ui-accordion-header{padding:var(--space-2)0;cursor:pointer;color:var(--color-text);text-align:left;background:0 0;border:none;justify-content:space-between;align-items:center;width:100%;font-size:15px;display:flex}.ui-accordion-header:hover{opacity:.9}.ui-accordion-header:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-accordion-panel{max-height:0;transition:max-height var(--transition-fast);overflow:hidden}.ui-accordion-panel--open{max-height:500px}@media (prefers-reduced-motion:reduce){.ui-accordion-panel,.ui-accordion-panel--open{max-height:none;transition:none}}.ui-skeleton{background:linear-gradient(90deg,#00000008 0%,#0000000f 50%,#00000008 100%);background-color:var(--skeleton-bg,var(--color-bg-tertiary));color:#0000;border-radius:var(--radius-sm);-webkit-user-select:none;user-select:none;line-height:1;display:inline-block;overflow:hidden}.ui-skeleton--xs{height:8px}.ui-skeleton--sm{height:12px}.ui-skeleton--md{height:16px}.ui-skeleton--lg{height:24px}.ui-skeleton--xl{height:32px}.ui-skeleton--w-100{width:100%}.ui-skeleton--w-75{width:75%}.ui-skeleton--w-50{width:50%}.ui-skeleton--w-25{width:25%}.ui-skeleton--circle{border-radius:50%}@keyframes ui-skeleton-shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}.ui-skeleton--animated{background-size:200% 100%;animation:1.2s linear infinite ui-skeleton-shimmer}@media (prefers-reduced-motion:reduce){.ui-skeleton--animated{animation:none}}.ui-slider{align-items:center;width:100%;height:24px;display:flex;position:relative}.ui-slider-track{background:var(--color-border);border-radius:2px;width:100%;height:4px;position:relative}.ui-slider-fill{background:var(--color-primary);border-radius:2px;height:100%;position:absolute}.ui-slider-thumb{background:var(--color-bg);border:2px solid var(--color-primary);cursor:grab;border-radius:50%;width:16px;height:16px;position:absolute;top:50%;transform:translate(-50%,-50%)}.ui-slider-thumb:active{cursor:grabbing}.ui-slider-thumb:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-slider.disabled{opacity:.5;pointer-events:none}@media (prefers-reduced-motion:reduce){.ui-slider-thumb,.ui-slider-fill{transition:none}}.ui-checkbox-root{cursor:pointer;align-items:center;gap:8px;display:inline-flex}.ui-checkbox-input{appearance:none;border:2px solid var(--color-border);background:var(--color-bg);border-radius:4px;justify-content:center;align-items:center;width:16px;height:16px;transition:background .15s;display:inline-flex}.ui-checkbox-input:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-checkbox-input[data-state=checked],.ui-checkbox-input[data-state=indeterminate]{background:var(--color-primary);border-color:var(--color-primary)}.ui-checkbox-check{color:#fff;pointer-events:none;font-size:12px;line-height:1}.ui-checkbox-label{color:var(--color-text);-webkit-user-select:none;user-select:none}.ui-radio-group{flex-direction:column;gap:8px;display:flex}.ui-radio-item{cursor:pointer;align-items:center;gap:8px;display:flex}.ui-radio-input{appearance:none;border:2px solid var(--color-border);cursor:pointer;border-radius:50%;width:16px;height:16px;position:relative}.ui-radio-input:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-radio-input[data-state=checked]{border-color:var(--color-primary)}.ui-radio-input[data-state=checked]:after{content:"";background:var(--color-primary);border-radius:50%;width:8px;height:8px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.ui-radio-label{color:var(--color-text);-webkit-user-select:none;user-select:none}.ui-switch-root{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:8px;display:inline-flex}.ui-switch-control{background:var(--color-border);width:44px;height:24px;transition:background var(--transition-fast),box-shadow var(--transition-fast);border-radius:9999px;flex:none;position:relative}.ui-switch-thumb{background:var(--color-bg);width:16px;height:16px;transition:transform var(--transition-fast),background var(--transition-fast);border-radius:50%;position:absolute;top:50%;left:4px;transform:translateY(-50%);box-shadow:0 1px 2px #0000001f}.ui-switch-control[data-state=on]{background:var(--color-primary);box-shadow:0 4px 12px #0000001f}.ui-switch-control[data-state=on] .ui-switch-thumb{transform:translate(20px,-50%)}.ui-switch-control:focus-visible{outline:2px solid var(--color-primary);outline-offset:3px}.ui-switch-root[aria-disabled=true]{opacity:.6;cursor:not-allowed}.ui-switch-label{color:var(--color-text)}:root,[data-theme=light]{--ui-bg:#fff;--ui-surface:#fafafa;--ui-bg-hover:#f2f2f2;--ui-border:#0000001f;--ui-shadow:#00000014;--ui-text:#111;--ui-text-muted:#666;--ui-primary:#007aff;--ui-primary-hover:#0062d6;--ui-primary-contrast:#fff}[data-theme=dark]{--ui-bg:#111112;--ui-surface:#1c1c1e;--ui-bg-hover:#2a2a2d;--ui-border:#ffffff24;--ui-shadow:#0009;--ui-text:#f5f5f5;--ui-text-muted:#b6b6b6;--ui-primary:#3b82f6;--ui-primary-hover:#2968cc;--ui-primary-contrast:#fff}.ui-datepicker{font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial}.ui-datepicker-input{text-align:left;border:1px solid var(--ui-border);background:var(--ui-bg);width:230px;color:var(--ui-text);cursor:pointer;box-shadow:0 1px 3px var(--ui-shadow);border-radius:10px;padding:8px 12px;font-size:14px}.ui-datepicker-popover{z-index:99999}.ui-datepicker-panel{background:var(--ui-bg);border:1px solid var(--ui-border);width:300px;color:var(--ui-text);box-shadow:0 8px 25px var(--ui-shadow);border-radius:12px;padding:12px}.ui-header-row{justify-content:space-between;align-items:center;display:flex}.ui-arrow{cursor:pointer;color:var(--ui-text);background:0 0;border:none;border-radius:8px;padding:6px 8px;font-size:20px}.ui-arrow:hover{background:var(--ui-bg-hover)}.ui-header-center{cursor:pointer;color:var(--ui-text);background:0 0;border:none;border-radius:8px;padding:6px 10px;font-size:14px;font-weight:600}.ui-header-center:hover{background:var(--ui-bg-hover)}.ui-ym-panel{flex-direction:column;gap:12px;margin:10px 0;display:flex}.ui-year-grid{grid-template-columns:repeat(4,1fr);gap:6px;max-height:160px;padding-right:4px;display:grid;overflow-y:auto}.ui-year-item{background:var(--ui-surface);color:var(--ui-text);cursor:pointer;border:none;border-radius:8px;padding:8px 0;font-size:13px}.ui-year-item:hover:not(.selected){background:var(--ui-bg-hover)}.ui-year-item.selected{background:linear-gradient(180deg,var(--ui-primary),var(--ui-primary-hover));color:var(--ui-primary-contrast);box-shadow:0 3px 12px var(--ui-shadow)}.ui-month-grid{grid-template-columns:repeat(3,1fr);gap:6px;display:grid}.ui-month-item{background:var(--ui-surface);cursor:pointer;color:var(--ui-text);border:none;border-radius:8px;padding:8px 0;font-size:13px}.ui-month-item:hover:not(.selected){background:var(--ui-bg-hover)}.ui-month-item.selected{background:linear-gradient(180deg,var(--ui-primary),var(--ui-primary-hover));color:var(--ui-primary-contrast);box-shadow:0 3px 12px var(--ui-shadow)}.ui-month-item.disabled{opacity:.45;cursor:not-allowed}.ui-calendar{flex-direction:column;gap:6px;display:flex}.ui-weekdays{text-align:center;color:var(--ui-text-muted);grid-template-columns:repeat(7,1fr);font-size:12px;display:grid}.ui-days-grid{grid-template-columns:repeat(7,1fr);gap:6px;display:grid}.ui-day,.ui-day-empty{cursor:pointer;width:36px;height:36px;color:var(--ui-text);background:0 0;border:none;border-radius:8px;font-size:14px}.ui-day:hover:not(.selected){background:var(--ui-bg-hover)}.ui-day.selected{background:linear-gradient(180deg,var(--ui-primary),var(--ui-primary-hover));color:var(--ui-primary-contrast);box-shadow:0 4px 12px var(--ui-shadow)}.ui-footer{justify-content:flex-end;margin-top:10px;display:flex}.ui-footer button{background:var(--ui-surface);cursor:pointer;color:var(--ui-text);border:none;border-radius:8px;padding:6px 12px}.ui-footer button:hover{background:var(--ui-bg-hover)}.ui-daterange-picker{align-items:center;gap:8px;font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial;display:inline-flex}.drp-trigger{background:var(--ui-bg);color:var(--ui-text);border:1px solid var(--ui-border);cursor:pointer;border-radius:10px;min-width:220px;padding:8px 12px}.drp-actions{gap:6px;display:inline-flex}.drp-part{background:var(--ui-surface);cursor:pointer;color:var(--ui-text);border:none;border-radius:8px;padding:6px 8px}.drp-part.active{background:linear-gradient(180deg,var(--ui-primary),var(--ui-primary-hover));color:var(--ui-primary-contrast);box-shadow:0 3px 10px var(--ui-shadow)}.drp-popover{z-index:99999}.drp-panel{background:var(--ui-bg);border:1px solid var(--ui-border);width:360px;box-shadow:0 8px 30px var(--ui-shadow);color:var(--ui-text);border-radius:12px;padding:12px}.drp-header{justify-content:space-between;align-items:center;display:flex}.drp-arrow{cursor:pointer;color:var(--ui-text);background:0 0;border:none;padding:6px;font-size:18px}.drp-arrow:hover{background:var(--ui-bg-hover);border-radius:6px}.drp-title{cursor:pointer;color:var(--ui-text);background:0 0;border:none;border-radius:8px;padding:6px 8px;font-weight:600}.drp-title:hover{background:var(--ui-bg-hover)}.drp-ym{flex-direction:column;gap:12px;margin:8px 0;display:flex}.drp-year-grid{grid-template-columns:repeat(4,1fr);gap:6px;max-height:160px;display:grid;overflow-y:auto}.drp-year{background:var(--ui-surface);cursor:pointer;border:none;border-radius:8px;padding:8px 0}.drp-year:hover:not(.selected){background:var(--ui-bg-hover)}.drp-year.selected{background:linear-gradient(180deg,var(--ui-primary),var(--ui-primary-hover));color:var(--ui-primary-contrast);box-shadow:0 4px 14px var(--ui-shadow)}.drp-month-grid{grid-template-columns:repeat(3,1fr);gap:6px;display:grid}.drp-month{background:var(--ui-surface);cursor:pointer;border:none;border-radius:8px;padding:8px 0}.drp-month.disabled{opacity:.4;cursor:not-allowed}.drp-month:hover:not(.selected):not(.disabled){background:var(--ui-bg-hover)}.drp-month.selected{background:linear-gradient(180deg,var(--ui-primary),var(--ui-primary-hover));color:var(--ui-primary-contrast);box-shadow:0 4px 14px var(--ui-shadow)}.drp-calendar{margin-top:8px}.drp-weekdays{color:var(--ui-text-muted);grid-template-columns:repeat(7,1fr);gap:6px;font-size:12px;display:grid}.drp-days{grid-template-columns:repeat(7,1fr);gap:6px;display:grid}.drp-day,.drp-day-empty{cursor:pointer;width:40px;height:40px;color:var(--ui-text);background:0 0;border:none;border-radius:8px;justify-content:center;align-items:center;font-size:14px;display:flex}.drp-day:hover:not(.disabled):not(.start):not(.end){background:var(--ui-bg-hover)}.drp-day.start,.drp-day.end{background:linear-gradient(180deg,var(--ui-primary),var(--ui-primary-hover));color:var(--ui-primary-contrast);box-shadow:0 5px 16px var(--ui-shadow)}.drp-day.between{background:#0000000d}[data-theme=dark] .drp-day.between{background:#ffffff12}.drp-day.dragging{background:#648cff33;border-radius:8px}.drp-day.dragging:not(.start):not(.end){box-shadow:inset 0 0 0 1.5px var(--ui-primary)}.drp-day.disabled{opacity:.4;cursor:not-allowed}.drp-footer{justify-content:flex-end;gap:8px;margin-top:12px;display:flex}.drp-footer button{cursor:pointer;color:var(--ui-text);background:var(--ui-surface);border:none;border-radius:8px;padding:6px 12px;font-size:13px}.drp-footer button:hover{background:var(--ui-bg-hover)}.drp-clear{color:var(--ui-text-muted)!important;background:0 0!important}.drp-clear:hover{background:var(--ui-bg-hover)!important}.ui-drawer-overlay{z-index:99999;opacity:0;background:#00000073;transition:opacity .25s;display:block;position:fixed;inset:0}.ui-drawer-overlay.open{opacity:1}.ui-drawer{background:var(--color-bg);color:var(--color-text);will-change:transform;flex-direction:column;transition:transform .3s;display:flex;position:absolute;box-shadow:0 0 20px #0003}.ui-drawer.left{width:320px;top:0;bottom:0;transform:translate(-100%)}.ui-drawer.right{width:320px;top:0;bottom:0;right:0;transform:translate(100%)}.ui-drawer.top{height:260px;left:0;right:0;transform:translateY(-100%)}.ui-drawer.bottom{height:280px;bottom:0;left:0;right:0;transform:translateY(100%)}.ui-drawer.open.left,.ui-drawer.open.right{transform:translate(0)}.ui-drawer.open.top,.ui-drawer.open.bottom{transform:translateY(0)}@media (prefers-reduced-motion:reduce){.ui-drawer,.ui-drawer-overlay{transition:none}}.ui-card{background:var(--color-bg);color:var(--color-text);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:var(--space-3);box-shadow:var(--shadow-sm);transition:box-shadow .15s,transform .15s}.ui-card--hover:hover{box-shadow:var(--shadow-md)}.ui-card--clickable{cursor:pointer}.ui-card--clickable:active{transform:scale(.98)}.ui-card-header{margin-bottom:var(--space-2);font-size:16px;font-weight:600}.ui-card-body{font-size:14px;line-height:1.5}.ui-card-footer{margin-top:var(--space-3);gap:var(--space-2);display:flex}.ui-card-divider{background:var(--color-border);height:1px;margin:var(--space-3)0}.ui-alert{align-items:flex-start;gap:var(--space-2);padding:var(--space-3);border-radius:var(--radius-md);border:1px solid var(--color-border);background:var(--color-bg-secondary);color:var(--color-text);font-size:14px;display:flex}.ui-alert--info{border-color:var(--color-primary);background:var(--color-primary-bg);color:var(--color-primary-text)}.ui-alert--success{border-color:var(--color-success);background:var(--color-success-bg);color:var(--color-success-text)}.ui-alert--warning{border-color:var(--color-warning);background:var(--color-warning-bg);color:var(--color-warning-text)}.ui-alert--error{border-color:var(--color-danger);background:var(--color-danger-bg);color:var(--color-danger-text)}.ui-alert-title{margin-bottom:4px;font-weight:600}.ui-alert-content{flex:1}.ui-alert-close{cursor:pointer;color:inherit;background:0 0;border:none;margin-left:auto;font-size:18px;line-height:1}.ui-alert-close:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-table-container{width:100%;overflow-x:auto}.ui-table{border-collapse:collapse;width:100%;font-size:14px}.ui-table th,.ui-table td{padding:var(--space-2)var(--space-3);border-bottom:1px solid var(--color-border);text-align:left;white-space:nowrap}.ui-table th{background:var(--color-bg-secondary);color:var(--color-text);font-weight:600}.ui-table-row:hover{background:var(--color-bg-hover)}.ui-table-sort-button{cursor:pointer;font:inherit;background:0 0;border:none;align-items:center;gap:4px;display:inline-flex}.ui-table-sort-indicator{opacity:.6;font-size:10px}.ui-table-sort-indicator.active{opacity:1}.ui-table-empty{text-align:center;padding:var(--space-4);color:var(--color-text-secondary)}@media (prefers-reduced-motion:reduce){.ui-table-row{transition:none}}.sr-only{clip:rect(1px,1px,1px,1px);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;position:absolute!important}.ui-badge{font-family:var(--font-base);border-radius:var(--radius-md);border:1px solid var(--color-border);background:var(--color-bg-secondary);color:var(--color-text);white-space:nowrap;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;gap:4px;padding:4px 8px;font-size:13px;font-weight:600;line-height:1;display:inline-flex}.ui-badge--sm{padding:2px 6px;font-size:12px}.ui-badge--md{padding:4px 8px;font-size:13px}.ui-badge--lg{padding:6px 10px;font-size:14px}.ui-badge--pill{border-radius:9999px}.ui-badge--dot{border-radius:9999px;width:10px;min-width:10px;height:10px;padding:0}.ui-badge--default{background:var(--color-bg-secondary);color:var(--color-text);border-color:var(--color-border)}.ui-badge--primary{background:var(--color-primary);color:#fff;border-color:var(--color-primary)}.ui-badge--success{background:var(--color-success,#10b981);color:#fff;border-color:var(--color-success,#10b981)}.ui-badge--warning{background:var(--color-warning,#f59e0b);color:#000;border-color:var(--color-warning,#f59e0b)}.ui-badge--danger{background:var(--color-danger,#ef4444);color:#fff;border-color:var(--color-danger,#ef4444)}.ui-badge--interactive{cursor:pointer}.ui-badge--interactive:active{transform:translateY(1px)}@media (prefers-reduced-motion:reduce){.ui-badge--interactive:active{transform:none}}.ui-badge__icon{line-height:0;display:inline-flex}.ui-badge-group{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.ui-avatar{background:var(--color-bg-secondary);color:var(--color-text);-webkit-user-select:none;user-select:none;border-radius:50%;justify-content:center;align-items:center;font-weight:600;display:inline-flex;position:relative;overflow:hidden}.ui-avatar--circle{border-radius:50%}.ui-avatar--rounded{border-radius:var(--radius-md)}.ui-avatar--square{border-radius:0}.ui-avatar--sm{width:28px;height:28px;font-size:12px}.ui-avatar--md{width:40px;height:40px;font-size:14px}.ui-avatar--lg{width:56px;height:56px;font-size:18px}.ui-avatar--xl{width:72px;height:72px;font-size:24px}.ui-avatar img{object-fit:cover;width:100%;height:100%}.ui-avatar-status{border:2px solid var(--color-bg);background:gray;border-radius:50%;width:10px;height:10px;position:absolute;bottom:0;right:0}.ui-avatar-status--online{background:var(--color-success,#22c55e)}.ui-avatar-status--offline{background:var(--color-border)}.ui-avatar-status--busy{background:var(--color-danger,#ef4444)}.ui-avatar-loading{background:var(--color-bg-tertiary);animation:1.4s infinite avatarPulse}@keyframes avatarPulse{0%{opacity:.6}50%{opacity:.3}to{opacity:.6}}.ui-avatar-group{align-items:center;display:flex}.ui-avatar-group .ui-avatar{border:2px solid var(--color-bg);margin-left:-8px}.ui-avatar-group .ui-avatar:first-child{margin-left:0}.ui-avatar-group-overflow{background:var(--color-border);color:var(--color-text);justify-content:center;align-items:center;display:inline-flex!important}.ui-combobox{width:100%;position:relative}.ui-combobox-input{border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg);width:100%;color:var(--color-text);padding:8px 10px;font-size:14px}.ui-combobox-input:focus{outline:2px solid var(--color-primary);outline-offset:2px}.ui-combobox-listbox{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-md);width:100%;max-height:240px;box-shadow:var(--shadow-md);z-index:2000;position:absolute;top:calc(100% + 4px);left:0;overflow-y:auto}.ui-combobox-option{cursor:pointer;padding:8px 10px}.ui-combobox-option[aria-selected=true],.ui-combobox-option.active{background:var(--color-bg-hover)}.ui-combobox-empty{color:var(--color-text-secondary);padding:8px 10px;font-style:italic}.ui-combobox-input-wrapper{width:100%;position:relative}.ui-combobox-left-icon{pointer-events:none;opacity:.7;align-items:center;display:flex;position:absolute;top:50%;left:8px;transform:translateY(-50%)}.ui-combobox-right-icon{opacity:.7;align-items:center;display:flex;position:absolute;top:50%;right:8px;transform:translateY(-50%)}.ui-combobox-input.has-left-icon{padding-left:32px}.ui-combobox-input.has-right-icon{padding-right:32px}.ui-combobox-option-icon{opacity:.85;margin-right:8px;display:inline-flex}.ui-megamenu{position:relative}.ui-megamenu-trigger{cursor:pointer;color:var(--color-text);background:0 0;border:none;align-items:center;gap:6px;font-size:15px;display:flex}.ui-megamenu-panel{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);z-index:1000;min-width:320px;display:none;position:absolute;top:100%;left:0;box-shadow:0 4px 20px #0000001f}.ui-megamenu-panel--open{display:block}.ui-megamenu-grid{gap:var(--space-3);grid-template-columns:repeat(2,minmax(140px,1fr));display:grid}.ui-megamenu-item{flex-direction:column;gap:4px;display:flex}.ui-megamenu-item-title{color:var(--color-text);font-weight:600}.ui-megamenu-item-desc{color:var(--color-text-secondary);font-size:13px}.ui-textarea-wrapper{width:100%;font-family:var(--font-base);display:block;position:relative}.ui-textarea{box-sizing:border-box;width:100%;padding:calc(var(--space-2))calc(var(--space-3));border-radius:var(--radius-md);border:1px solid var(--color-border);background:var(--color-bg-secondary);color:var(--color-text);resize:none;min-height:calc(var(--space-6));transition:border-color var(--transition-fast),box-shadow var(--transition-fast);font-size:14px;line-height:1.45;overflow:hidden!important}.ui-textarea:focus{border-color:var(--color-primary);box-shadow:0 0 0 3px #3b82f614}.ui-textarea:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ui-textarea:disabled{opacity:.6;cursor:not-allowed;background:var(--color-bg)}.ui-textarea--error{border-color:#e63600;box-shadow:0 0 0 3px #ef44440f}.ui-textarea-counter{color:var(--color-text-secondary);text-align:right;-webkit-user-select:none;user-select:none;margin-top:6px;font-size:12px}@media (prefers-reduced-motion:reduce){.ui-textarea,.ui-textarea:focus,.ui-textarea:disabled{transition:none}}:root{--popover-bg:#fff;--popover-border:#e2e8f0;--popover-text:#1e293b;--popover-radius:8px;--popover-shadow:0 4px 6px -1px #0000001a,0 2px 4px -1px #0000000f;--arrow-size:12px;--arrow-offset:6px}.ui-popover-root{display:inline-block;position:relative}.ui-popover-trigger{appearance:none;cursor:pointer;background:0 0;border:none;padding:0;display:inline-flex}.ui-popover-trigger:focus-visible{outline-offset:2px;border-radius:4px;outline:2px solid #3b82f6}.ui-popover-content{z-index:9999;background-color:var(--popover-bg);min-width:200px;max-width:320px;color:var(--popover-text);border:1px solid var(--popover-border);border-radius:var(--popover-radius);box-shadow:none;filter:drop-shadow(0 4px 6px #0000001a);padding:16px;animation:.2s cubic-bezier(.16,1,.3,1) forwards popover-scale-in;position:absolute}.ui-popover-content:before{content:"";width:var(--arrow-size);height:var(--arrow-size);background-color:var(--popover-bg);border:1px solid var(--popover-border);z-index:1;border-radius:2px;position:absolute;transform:rotate(45deg)}.ui-popover-bottom{margin-top:10px;transform:translate(-50%)}.ui-popover-bottom:before{top:calc(var(--arrow-offset)*-1);margin-left:calc(var(--arrow-offset)*-1);border-bottom-color:#0000;border-right-color:#0000;left:50%}.ui-popover-top{margin-top:-10px;transform:translate(-50%)translateY(-100%)}.ui-popover-top:before{bottom:calc(var(--arrow-offset)*-1);margin-left:calc(var(--arrow-offset)*-1);border-top-color:#0000;border-left-color:#0000;left:50%}.ui-popover-left{margin-left:-10px;transform:translateY(-50%)translate(-100%)}.ui-popover-left:before{right:calc(var(--arrow-offset)*-1);margin-top:calc(var(--arrow-offset)*-1);border-bottom-color:#0000;border-left-color:#0000;top:50%}.ui-popover-right{margin-left:10px;transform:translateY(-50%)}.ui-popover-right:before{left:calc(var(--arrow-offset)*-1);margin-top:calc(var(--arrow-offset)*-1);border-top-color:#0000;border-right-color:#0000;top:50%}.ui-popover-close{text-align:center;color:#475569;border:1px solid var(--popover-border);cursor:pointer;background-color:#f8fafc;border-radius:4px;width:100%;margin-top:12px;padding:8px 12px;font-size:.875rem;font-weight:500;transition:background-color .2s;display:block}.ui-popover-close:hover{color:#1e293b;background-color:#f1f5f9}.ui-popover-close:focus-visible{outline-offset:2px;outline:2px solid #3b82f6}@keyframes popover-scale-in{0%{opacity:0;transform:translate(var(--tw-translate-x),var(--tw-translate-y))scale(.95)}to{opacity:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y))scale(1)}}.ui-popover-bottom{--tw-translate-x:-50%;--tw-translate-y:0}.ui-popover-top{--tw-translate-x:-50%;--tw-translate-y:-100%}.ui-popover-left{--tw-translate-x:-100%;--tw-translate-y:-50%}.ui-popover-right{--tw-translate-x:0;--tw-translate-y:-50%}@media (prefers-reduced-motion:reduce){.ui-popover-content{transition:opacity .2s;animation:none}}.ui-pagination{font-family:var(--font-base);align-items:center;gap:6px;display:flex}.ui-page-btn{border-radius:var(--radius-md);border:1px solid var(--color-border);background:var(--color-bg-secondary);min-width:32px;height:32px;color:var(--color-text);cursor:pointer;transition:background var(--transition-fast);padding:0 8px}.ui-page-btn:hover:not(:disabled){background:var(--color-bg)}.ui-page-btn:disabled{opacity:.5;cursor:not-allowed}.ui-page-btn.active{background:var(--color-primary);color:#fff;border-color:var(--color-primary)}.ui-page-ellipsis{opacity:.6;-webkit-user-select:none;user-select:none;padding:0 4px}.ui-breadcrumbs{font-family:var(--font-base);color:var(--color-text)}.ui-breadcrumbs-list{align-items:center;gap:4px;list-style:none;display:flex}.ui-breadcrumb-item{align-items:center;gap:4px;display:flex}.ui-breadcrumb-link{color:var(--color-text-secondary);transition:color var(--transition-fast);font-size:14px;text-decoration:none}.ui-breadcrumb-link:hover{color:var(--color-text)}.ui-breadcrumb-link.active,.ui-breadcrumb-link[aria-current=page]{color:var(--color-text);font-weight:500}.ui-breadcrumb-separator{color:var(--color-text-secondary);-webkit-user-select:none;user-select:none}.ui-breadcrumb-ellipsis{color:var(--color-text-secondary);-webkit-user-select:none;user-select:none;font-size:14px}.ui-progress{background:var(--color-bg-secondary);border-radius:var(--radius-md);width:100%;height:8px;position:relative;overflow:hidden}.ui-progress-bar{background:var(--color-primary);border-radius:inherit;height:100%;transition:width .25s}.ui-progress-bar.indeterminate{width:30%;animation:1.2s linear infinite ui-progress-indeterminate;position:absolute;left:-30%}@keyframes ui-progress-indeterminate{0%{left:-30%}50%{left:50%}to{left:100%}}.ui-spinner{justify-content:center;align-items:center;display:inline-flex}.ui-spinner--sm{width:16px;height:16px}.ui-spinner--md{width:24px;height:24px}.ui-spinner--lg{width:36px;height:36px}.ui-spinner-circle{border:3px solid var(--color-border);border-top-color:var(--color-primary);border-radius:50%;width:100%;height:100%;animation:.7s linear infinite ui-spin}@keyframes ui-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.ui-stepper{width:100%;font-family:var(--font-base)}.ui-stepper-list{align-items:center;gap:12px;padding:0;list-style:none;display:flex}.ui-stepper-item{align-items:center;gap:12px;display:flex}.ui-stepper-button{cursor:pointer;text-align:center;background:0 0;border:none;flex-direction:column;align-items:center;gap:4px;padding:0;display:flex}.ui-stepper-circle{border:2px solid var(--color-border);background:var(--color-bg-secondary);width:28px;height:28px;color:var(--color-text);transition:all var(--transition-fast);border-radius:50%;justify-content:center;align-items:center;font-size:13px;font-weight:500;display:flex}.ui-stepper-item.active .ui-stepper-circle{border-color:var(--color-primary);background:var(--color-primary);color:#fff}.ui-stepper-item.completed .ui-stepper-circle{background:var(--color-primary);border-color:var(--color-primary);color:#fff}.ui-stepper-label{color:var(--color-text-secondary);transition:color var(--transition-fast);font-size:12px}.ui-stepper-item.active .ui-stepper-label{color:var(--color-text)}.ui-stepper-line{background:var(--color-border);flex-grow:1;height:2px}.ui-stepper-item.completed+.ui-stepper-line,.ui-stepper-item.active+.ui-stepper-line{background:var(--color-primary)}.ui-chip{border-radius:var(--radius-lg);background:var(--color-bg-secondary);border:1px solid var(--color-border);color:var(--color-text);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast);align-items:center;gap:6px;padding:4px 10px;font-size:14px;display:inline-flex}.ui-chip:hover{background:var(--color-bg)}.ui-chip.selected{background:var(--color-primary);border-color:var(--color-primary);color:#fff}.ui-chip--sm{padding:3px 8px;font-size:12px}.ui-chip--md{padding:4px 10px;font-size:14px}.ui-chip-icon-left,.ui-chip-icon-right{opacity:.8;align-items:center;display:inline-flex}.ui-chip-remove{color:inherit;cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;margin-left:2px;font-size:14px;display:inline-flex}.ui-chip-remove:hover{opacity:.7}.ui-chip:focus-visible{outline:2px solid var(--color-primary);outline-offset:3px}.ui-rating{cursor:pointer;color:var(--color-text-secondary);font-family:var(--font-base);gap:4px;display:inline-flex}.ui-rating:focus-visible{outline:2px solid var(--color-primary);outline-offset:4px}.ui-rating--sm{font-size:16px}.ui-rating--md{font-size:20px}.ui-rating--lg{font-size:28px}.ui-rating-item{-webkit-user-select:none;user-select:none;transition:color var(--transition-fast),transform var(--transition-fast)}.ui-rating-item.filled{color:var(--color-primary)}.ui-rating-item:hover{transform:scale(1.1)}.ui-hovercard-root{display:inline-block}.ui-hovercard-trigger{display:inline-flex}.ui-hovercard{z-index:99999;background:var(--color-bg);color:var(--color-text);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);animation:.12s ease-out ui-hovercard-fade;position:fixed;box-shadow:0 8px 24px #00000024}@keyframes ui-hovercard-fade{0%{opacity:0;transform:translateY(-3px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){.ui-hovercard{animation:none}}.ui-fileupload{font-family:var(--font-base);flex-direction:column;gap:10px;display:flex}.ui-fileupload-dropzone{border:2px dashed var(--color-border);background:var(--color-bg-secondary);border-radius:var(--radius-md);text-align:center;color:var(--color-text-secondary);cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast);padding:20px}.ui-fileupload-dropzone:hover{border-color:var(--color-primary);background:var(--color-bg)}.ui-fileupload-dropzone.dragover{border-color:var(--color-primary);background:var(--color-bg);color:var(--color-primary)}.ui-fileupload-list{flex-direction:column;gap:4px;margin:0;padding:0;list-style:none;display:flex}.ui-fileupload-item{background:var(--color-bg-secondary);padding:var(--space-2);border-radius:var(--radius-md);border:1px solid var(--color-border);justify-content:space-between;align-items:center;display:flex}.ui-fileupload-filename{color:var(--color-text);word-break:break-all}.ui-fileupload-remove{color:var(--color-text-secondary);cursor:pointer;background:0 0;border:none;padding:0 4px;font-size:18px}.ui-fileupload-remove:hover{color:var(--color-primary)}.ui-fileupload-dropzone:focus-visible{outline:2px solid var(--color-primary);outline-offset:4px}.ui-contextmenu-wrapper{display:inline-block}.ui-contextmenu{z-index:99999;background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-md);min-width:180px;font-family:var(--font-base);padding:4px 0;animation:80ms ease-out ui-menu-fade;position:fixed;box-shadow:0 8px 24px #00000026}@keyframes ui-menu-fade{0%{opacity:0;transform:scale(.98)}to{opacity:1;transform:scale(1)}}.ui-contextmenu-separator{background:var(--color-border);height:1px;margin:4px 0}.ui-contextmenu-item{padding:var(--space-2)var(--space-3);cursor:pointer;color:var(--color-text);white-space:nowrap;align-items:center;gap:8px;display:flex}.ui-contextmenu-item:hover,.ui-contextmenu-item.active{background:var(--color-bg-secondary)}.ui-contextmenu-item.disabled{opacity:.5;cursor:not-allowed}.ui-contextmenu-item.danger{color:#dc2626}.ui-contextmenu-icon{opacity:.8}.ui-cmd-overlay{z-index:99998;background:#0006;position:fixed;inset:0}.ui-cmd{background:var(--color-bg);width:520px;max-height:70vh;color:var(--color-text);border-radius:var(--radius-lg);border:1px solid var(--color-border);z-index:99999;flex-direction:column;animation:.12s ui-cmd-fade;display:flex;position:fixed;top:15%;left:50%;overflow:hidden;transform:translate(-50%);box-shadow:0 20px 40px #00000040}@keyframes ui-cmd-fade{0%{opacity:0;transform:translate(-50%,-8px)}to{opacity:1;transform:translate(-50%)}}.ui-cmd-input{width:100%;padding:var(--space-3);border:none;border-bottom:1px solid var(--color-border);background:var(--color-bg);color:var(--color-text);font-size:16px}.ui-cmd-input:focus{outline:none}.ui-cmd-list{max-height:60vh;overflow-y:auto}.ui-cmd-section-title{padding:var(--space-2)var(--space-3);opacity:.7;font-size:12px}.ui-cmd-item{padding:var(--space-2)var(--space-3);cursor:pointer;transition:background var(--transition-fast);align-items:center;gap:10px;display:flex}.ui-cmd-item.active,.ui-cmd-item:hover{background:var(--color-bg-secondary)}.ui-cmd-icon{opacity:.85;font-size:18px}.ui-cmd-meta{flex:1}.ui-cmd-description{opacity:.6;font-size:12px}.ui-cmd-shortcut{opacity:.7;font-size:12px}.ui-cmd-empty{padding:var(--space-3);text-align:center;opacity:.7}.ui-treeview{font-family:var(--font-base);color:var(--color-text);-webkit-user-select:none;user-select:none;width:100%}.ui-tree-node{cursor:pointer;border-radius:var(--radius-sm);transition:background var(--transition-fast);align-items:center;gap:6px;padding:4px 6px;display:flex}.ui-tree-node:hover{background:var(--color-bg-secondary)}.ui-tree-node.selected{background:var(--color-primary);color:#fff}.ui-tree-node.active{outline:2px solid var(--color-primary);outline-offset:2px}.ui-tree-arrow{opacity:.8;font-size:10px;transition:transform .15s;display:inline-block}.ui-tree-arrow.open{transform:rotate(90deg)}.ui-tree-arrow.empty{opacity:0;width:10px}.ui-tree-icon{opacity:.9}.ui-tree-label{font-size:14px}.ui-datagrid{font-family:var(--font-base);color:var(--color-text);background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-md);outline:none;display:block;overflow:hidden}.ui-datagrid-table{display:block}.ui-datagrid-header{background:var(--color-bg);border-bottom:1px solid var(--color-border);z-index:10;grid-auto-flow:column;align-items:center;gap:0;padding:8px 0;display:grid;position:sticky;top:0}.ui-datagrid-cell{box-sizing:border-box;align-items:center;min-width:80px;padding:10px 12px;display:flex}.ui-datagrid-cell--header{background:var(--color-bg);cursor:default;-webkit-user-select:none;user-select:none;font-size:13px;font-weight:600}.ui-datagrid-cell--header .ui-datagrid-header-content{align-items:center;gap:8px;display:inline-flex}.ui-datagrid-cell--left{text-align:left;justify-content:flex-start}.ui-datagrid-cell--center{text-align:center;justify-content:center}.ui-datagrid-cell--right{text-align:right;justify-content:flex-end}.ui-datagrid-cell--select{justify-content:center;width:48px}.ui-datagrid-cell--actions{justify-content:center;width:64px}.ui-datagrid-cell--header[aria-sort=ascending],.ui-datagrid-cell--header[aria-sort=descending]{color:var(--color-text)}.ui-datagrid-sort-indicator{opacity:.8;font-size:12px}.ui-datagrid-body{max-height:420px;display:block;overflow:auto}.ui-datagrid-row{border-bottom:1px solid var(--color-bg-muted,transparent);transition:background var(--transition-fast);background:0 0;grid-auto-flow:column;align-items:center;gap:0;display:grid}.ui-datagrid-row .ui-datagrid-cell{background:0 0;padding:10px 12px;font-size:14px}.ui-datagrid-row:hover{background:var(--color-bg-secondary)}.ui-datagrid-row.focused{outline:2px solid var(--color-primary);outline-offset:-2px}.ui-datagrid-row.selected{background:#3b82f614}.ui-datagrid-empty{text-align:center;color:var(--color-text-secondary);padding:20px}.ui-datagrid-footer{border-top:1px solid var(--color-border);background:var(--color-bg);justify-content:flex-end;align-items:center;gap:8px;padding:8px;display:flex}.ui-datagrid-page-btn{border-radius:var(--radius-sm);border:1px solid var(--color-border);background:var(--color-bg-secondary);cursor:pointer;padding:6px 10px}.ui-datagrid-page-btn:disabled{opacity:.5;cursor:not-allowed}.ui-datagrid-page-info{color:var(--color-text-secondary);padding:4px 8px;font-size:13px}@media (max-width:720px){.ui-datagrid-cell{min-width:60px;padding:8px;font-size:13px}.ui-datagrid-body{max-height:320px}}.ui-virtual-list{will-change:transform;background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-md);width:100%;position:relative;overflow:hidden auto}.ui-virtual-spacer{pointer-events:none;width:100%}.ui-virtual-items{width:100%;position:absolute;top:0;left:0}.ui-virtual-row{border-bottom:1px solid var(--color-border);background:var(--color-bg);color:var(--color-text);white-space:nowrap;align-items:center;padding:0 12px;font-size:14px;display:flex}.ui-virtual-row:hover{background:var(--color-bg-secondary)}:root{--color-bg:#fff;--color-bg-secondary:#f6f6f7;--color-text:#111;--color-text-secondary:#666;--color-border:#dcdcdc;--color-primary:#3b82f6;--radius-sm:4px;--radius-md:6px;--radius-lg:10px;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--transition-fast:.15s ease;--transition-medium:.25s ease;--font-base:system-ui,Arial,sans-serif}[data-theme=dark]{--color-bg:#0d0d0f;--color-bg-secondary:#151518;--color-text:#fff;--color-text-secondary:#aaa;--color-border:#2a2a2f;--color-primary:#60a5fa}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("react/jsx-runtime"),s=require("react");;/* empty css */const h=()=>{throw new Error("setTheme used outside of <UIProvider>")},i=s.createContext({theme:"system",resolved:"light",setTheme:h});function l({defaultTheme:o="system",children:m}){const[t,c]=s.useState(o),[a,u]=s.useState("light"),n=e=>{const r=e==="system"?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":e;document.documentElement.setAttribute("data-theme",r),u(r)};return s.useLayoutEffect(()=>{const e=localStorage.getItem("ui-theme");e?(c(e),n(e)):(c(o),n(o))},[o]),s.useEffect(()=>{localStorage.setItem("ui-theme",t),n(t)},[t]),s.useEffect(()=>{if(t!=="system")return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>n("system");return e.addEventListener("change",r),()=>e.removeEventListener("change",r)},[t]),d.jsx(i.Provider,{value:{theme:t,resolved:a,setTheme:c},children:m})}exports.NUIProvider=l;exports.ThemeContext=i;
2
+ //# sourceMappingURL=NUIProvider.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NUIProvider.cjs","sources":["../../../src/theme/NUIProvider.tsx"],"sourcesContent":["/**\r\n * NUIProvider.tsx\r\n * ---------------------------------------\r\n * Global Theme Provider for entire UI system.\r\n * - Light / Dark theme\r\n * - Sync with `prefers-color-scheme`\r\n * - LocalStorage persistence\r\n * - No flash on load\r\n */\r\n\r\n/**\r\n * UIProvider.tsx (Lint-Clean Version)\r\n */\r\n\r\nimport React, { useEffect, useState, useLayoutEffect } from 'react';\r\nimport './theme.css';\r\n\r\nexport type ThemeMode = 'light' | 'dark' | 'system';\r\n\r\ninterface NUIProviderProps {\r\n defaultTheme?: ThemeMode;\r\n children: React.ReactNode;\r\n}\r\n\r\n// FIX: no empty function, use a safe fallback\r\nconst noop = () => {\r\n throw new Error('setTheme used outside of <UIProvider>');\r\n};\r\n\r\nexport const ThemeContext = React.createContext<{\r\n theme: ThemeMode;\r\n resolved: 'light' | 'dark';\r\n setTheme: (t: ThemeMode) => void;\r\n}>({\r\n theme: 'system',\r\n resolved: 'light',\r\n setTheme: noop,\r\n});\r\n\r\nexport function NUIProvider({\r\n defaultTheme = 'system',\r\n children,\r\n}: NUIProviderProps) {\r\n const [theme, setTheme] = useState<ThemeMode>(defaultTheme);\r\n const [resolved, setResolved] = useState<'light' | 'dark'>('light');\r\n\r\n /**\r\n * Apply theme — extracted so it can be reused safely\r\n */\r\n const applyTheme = (mode: ThemeMode) => {\r\n const final: 'light' | 'dark' =\r\n mode === 'system'\r\n ? window.matchMedia('(prefers-color-scheme: dark)').matches\r\n ? 'dark'\r\n : 'light'\r\n : mode;\r\n\r\n document.documentElement.setAttribute('data-theme', final);\r\n setResolved(final);\r\n };\r\n\r\n /**\r\n * FIX: useLayoutEffect must include defaultTheme\r\n * We only run this logic once (when mounting),\r\n * so using defaultTheme in deps is correct.\r\n */\r\n useLayoutEffect(() => {\r\n const stored = localStorage.getItem('ui-theme') as ThemeMode | null;\r\n\r\n if (stored) {\r\n setTheme(stored);\r\n applyTheme(stored);\r\n } else {\r\n setTheme(defaultTheme);\r\n applyTheme(defaultTheme);\r\n }\r\n }, [defaultTheme]);\r\n\r\n /**\r\n * When theme changes manually\r\n */\r\n useEffect(() => {\r\n localStorage.setItem('ui-theme', theme);\r\n applyTheme(theme);\r\n }, [theme]);\r\n\r\n /**\r\n * System theme listener (only when theme === system)\r\n */\r\n useEffect(() => {\r\n if (theme !== 'system') return;\r\n\r\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\r\n const handler = () => applyTheme('system');\r\n\r\n mql.addEventListener('change', handler);\r\n return () => mql.removeEventListener('change', handler);\r\n }, [theme]);\r\n\r\n return (\r\n <ThemeContext.Provider value={{ theme, resolved, setTheme }}>\r\n {children}\r\n </ThemeContext.Provider>\r\n );\r\n}\r\n"],"names":["noop","ThemeContext","React","NUIProvider","defaultTheme","children","theme","setTheme","useState","resolved","setResolved","applyTheme","mode","final","useLayoutEffect","stored","useEffect","mql","handler","jsx"],"mappings":"mKAyBA,MAAMA,EAAO,IAAM,CACjB,MAAM,IAAI,MAAM,uCAAuC,CACzD,EAEaC,EAAeC,EAAM,cAI/B,CACD,MAAO,SACP,SAAU,QACV,SAAUF,CACZ,CAAC,EAEM,SAASG,EAAY,CAC1B,aAAAC,EAAe,SACf,SAAAC,CACF,EAAqB,CACnB,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAoBJ,CAAY,EACpD,CAACK,EAAUC,CAAW,EAAIF,EAAAA,SAA2B,OAAO,EAK5DG,EAAcC,GAAoB,CACtC,MAAMC,EACJD,IAAS,SACL,OAAO,WAAW,8BAA8B,EAAE,QAChD,OACA,QACFA,EAEN,SAAS,gBAAgB,aAAa,aAAcC,CAAK,EACzDH,EAAYG,CAAK,CACnB,EAOAC,OAAAA,EAAAA,gBAAgB,IAAM,CACpB,MAAMC,EAAS,aAAa,QAAQ,UAAU,EAE1CA,GACFR,EAASQ,CAAM,EACfJ,EAAWI,CAAM,IAEjBR,EAASH,CAAY,EACrBO,EAAWP,CAAY,EAE3B,EAAG,CAACA,CAAY,CAAC,EAKjBY,EAAAA,UAAU,IAAM,CACd,aAAa,QAAQ,WAAYV,CAAK,EACtCK,EAAWL,CAAK,CAClB,EAAG,CAACA,CAAK,CAAC,EAKVU,EAAAA,UAAU,IAAM,CACd,GAAIV,IAAU,SAAU,OAExB,MAAMW,EAAM,OAAO,WAAW,8BAA8B,EACtDC,EAAU,IAAMP,EAAW,QAAQ,EAEzC,OAAAM,EAAI,iBAAiB,SAAUC,CAAO,EAC/B,IAAMD,EAAI,oBAAoB,SAAUC,CAAO,CACxD,EAAG,CAACZ,CAAK,CAAC,EAGRa,MAAClB,EAAa,SAAb,CAAsB,MAAO,CAAE,MAAAK,EAAO,SAAAG,EAAU,SAAAF,GAC9C,SAAAF,EACH,CAEJ"}
@@ -0,0 +1,34 @@
1
+ import { jsx as d } from "react/jsx-runtime";
2
+ import l, { useState as m, useLayoutEffect as u, useEffect as c } from "react";
3
+ /* empty css */
4
+ const f = () => {
5
+ throw new Error("setTheme used outside of <UIProvider>");
6
+ }, v = l.createContext({
7
+ theme: "system",
8
+ resolved: "light",
9
+ setTheme: f
10
+ });
11
+ function w({
12
+ defaultTheme: s = "system",
13
+ children: i
14
+ }) {
15
+ const [t, n] = m(s), [a, h] = m("light"), r = (e) => {
16
+ const o = e === "system" ? window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light" : e;
17
+ document.documentElement.setAttribute("data-theme", o), h(o);
18
+ };
19
+ return u(() => {
20
+ const e = localStorage.getItem("ui-theme");
21
+ e ? (n(e), r(e)) : (n(s), r(s));
22
+ }, [s]), c(() => {
23
+ localStorage.setItem("ui-theme", t), r(t);
24
+ }, [t]), c(() => {
25
+ if (t !== "system") return;
26
+ const e = window.matchMedia("(prefers-color-scheme: dark)"), o = () => r("system");
27
+ return e.addEventListener("change", o), () => e.removeEventListener("change", o);
28
+ }, [t]), /* @__PURE__ */ d(v.Provider, { value: { theme: t, resolved: a, setTheme: n }, children: i });
29
+ }
30
+ export {
31
+ w as NUIProvider,
32
+ v as ThemeContext
33
+ };
34
+ //# sourceMappingURL=NUIProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NUIProvider.js","sources":["../../../src/theme/NUIProvider.tsx"],"sourcesContent":["/**\r\n * NUIProvider.tsx\r\n * ---------------------------------------\r\n * Global Theme Provider for entire UI system.\r\n * - Light / Dark theme\r\n * - Sync with `prefers-color-scheme`\r\n * - LocalStorage persistence\r\n * - No flash on load\r\n */\r\n\r\n/**\r\n * UIProvider.tsx (Lint-Clean Version)\r\n */\r\n\r\nimport React, { useEffect, useState, useLayoutEffect } from 'react';\r\nimport './theme.css';\r\n\r\nexport type ThemeMode = 'light' | 'dark' | 'system';\r\n\r\ninterface NUIProviderProps {\r\n defaultTheme?: ThemeMode;\r\n children: React.ReactNode;\r\n}\r\n\r\n// FIX: no empty function, use a safe fallback\r\nconst noop = () => {\r\n throw new Error('setTheme used outside of <UIProvider>');\r\n};\r\n\r\nexport const ThemeContext = React.createContext<{\r\n theme: ThemeMode;\r\n resolved: 'light' | 'dark';\r\n setTheme: (t: ThemeMode) => void;\r\n}>({\r\n theme: 'system',\r\n resolved: 'light',\r\n setTheme: noop,\r\n});\r\n\r\nexport function NUIProvider({\r\n defaultTheme = 'system',\r\n children,\r\n}: NUIProviderProps) {\r\n const [theme, setTheme] = useState<ThemeMode>(defaultTheme);\r\n const [resolved, setResolved] = useState<'light' | 'dark'>('light');\r\n\r\n /**\r\n * Apply theme — extracted so it can be reused safely\r\n */\r\n const applyTheme = (mode: ThemeMode) => {\r\n const final: 'light' | 'dark' =\r\n mode === 'system'\r\n ? window.matchMedia('(prefers-color-scheme: dark)').matches\r\n ? 'dark'\r\n : 'light'\r\n : mode;\r\n\r\n document.documentElement.setAttribute('data-theme', final);\r\n setResolved(final);\r\n };\r\n\r\n /**\r\n * FIX: useLayoutEffect must include defaultTheme\r\n * We only run this logic once (when mounting),\r\n * so using defaultTheme in deps is correct.\r\n */\r\n useLayoutEffect(() => {\r\n const stored = localStorage.getItem('ui-theme') as ThemeMode | null;\r\n\r\n if (stored) {\r\n setTheme(stored);\r\n applyTheme(stored);\r\n } else {\r\n setTheme(defaultTheme);\r\n applyTheme(defaultTheme);\r\n }\r\n }, [defaultTheme]);\r\n\r\n /**\r\n * When theme changes manually\r\n */\r\n useEffect(() => {\r\n localStorage.setItem('ui-theme', theme);\r\n applyTheme(theme);\r\n }, [theme]);\r\n\r\n /**\r\n * System theme listener (only when theme === system)\r\n */\r\n useEffect(() => {\r\n if (theme !== 'system') return;\r\n\r\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\r\n const handler = () => applyTheme('system');\r\n\r\n mql.addEventListener('change', handler);\r\n return () => mql.removeEventListener('change', handler);\r\n }, [theme]);\r\n\r\n return (\r\n <ThemeContext.Provider value={{ theme, resolved, setTheme }}>\r\n {children}\r\n </ThemeContext.Provider>\r\n );\r\n}\r\n"],"names":["noop","ThemeContext","React","NUIProvider","defaultTheme","children","theme","setTheme","useState","resolved","setResolved","applyTheme","mode","final","useLayoutEffect","stored","useEffect","mql","handler","jsx"],"mappings":";;;AAyBA,MAAMA,IAAO,MAAM;AACjB,QAAM,IAAI,MAAM,uCAAuC;AACzD,GAEaC,IAAeC,EAAM,cAI/B;AAAA,EACD,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAUF;AACZ,CAAC;AAEM,SAASG,EAAY;AAAA,EAC1B,cAAAC,IAAe;AAAA,EACf,UAAAC;AACF,GAAqB;AACnB,QAAM,CAACC,GAAOC,CAAQ,IAAIC,EAAoBJ,CAAY,GACpD,CAACK,GAAUC,CAAW,IAAIF,EAA2B,OAAO,GAK5DG,IAAa,CAACC,MAAoB;AACtC,UAAMC,IACJD,MAAS,WACL,OAAO,WAAW,8BAA8B,EAAE,UAChD,SACA,UACFA;AAEN,aAAS,gBAAgB,aAAa,cAAcC,CAAK,GACzDH,EAAYG,CAAK;AAAA,EACnB;AAOA,SAAAC,EAAgB,MAAM;AACpB,UAAMC,IAAS,aAAa,QAAQ,UAAU;AAE9C,IAAIA,KACFR,EAASQ,CAAM,GACfJ,EAAWI,CAAM,MAEjBR,EAASH,CAAY,GACrBO,EAAWP,CAAY;AAAA,EAE3B,GAAG,CAACA,CAAY,CAAC,GAKjBY,EAAU,MAAM;AACd,iBAAa,QAAQ,YAAYV,CAAK,GACtCK,EAAWL,CAAK;AAAA,EAClB,GAAG,CAACA,CAAK,CAAC,GAKVU,EAAU,MAAM;AACd,QAAIV,MAAU,SAAU;AAExB,UAAMW,IAAM,OAAO,WAAW,8BAA8B,GACtDC,IAAU,MAAMP,EAAW,QAAQ;AAEzC,WAAAM,EAAI,iBAAiB,UAAUC,CAAO,GAC/B,MAAMD,EAAI,oBAAoB,UAAUC,CAAO;AAAA,EACxD,GAAG,CAACZ,CAAK,CAAC,GAGR,gBAAAa,EAAClB,EAAa,UAAb,EAAsB,OAAO,EAAE,OAAAK,GAAO,UAAAG,GAAU,UAAAF,KAC9C,UAAAF,GACH;AAEJ;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react"),t=require("./NUIProvider.cjs");function r(){return e.useContext(t.ThemeContext)}exports.useTheme=r;
2
+ //# sourceMappingURL=useTheme.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTheme.cjs","sources":["../../../src/theme/useTheme.ts"],"sourcesContent":["/**\r\n * useTheme.ts\r\n * --------------------------\r\n * Hook wrapper for ThemeContext.\r\n */\r\n\r\nimport { useContext } from 'react';\r\nimport { ThemeContext } from './NUIProvider';\r\n\r\nexport function useTheme() {\r\n return useContext(ThemeContext);\r\n}\r\n"],"names":["useTheme","useContext","ThemeContext"],"mappings":"wIASO,SAASA,GAAW,CACzB,OAAOC,EAAAA,WAAWC,EAAAA,YAAY,CAChC"}
@@ -0,0 +1,9 @@
1
+ import { useContext as e } from "react";
2
+ import { ThemeContext as t } from "./NUIProvider.js";
3
+ function m() {
4
+ return e(t);
5
+ }
6
+ export {
7
+ m as useTheme
8
+ };
9
+ //# sourceMappingURL=useTheme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTheme.js","sources":["../../../src/theme/useTheme.ts"],"sourcesContent":["/**\r\n * useTheme.ts\r\n * --------------------------\r\n * Hook wrapper for ThemeContext.\r\n */\r\n\r\nimport { useContext } from 'react';\r\nimport { ThemeContext } from './NUIProvider';\r\n\r\nexport function useTheme() {\r\n return useContext(ThemeContext);\r\n}\r\n"],"names":["useTheme","useContext","ThemeContext"],"mappings":";;AASO,SAASA,IAAW;AACzB,SAAOC,EAAWC,CAAY;AAChC;"}
@@ -0,0 +1,18 @@
1
+ import { default as React } from 'react';
2
+ export interface AccordionItem {
3
+ id: string;
4
+ title: string;
5
+ content: React.ReactNode;
6
+ }
7
+ interface AccordionProps {
8
+ /** List of accordion sections */
9
+ items: AccordionItem[];
10
+ /** Default opened item ID (optional) */
11
+ defaultOpenId?: string;
12
+ /** Allow multiple open panels? Default: false */
13
+ multiple?: boolean;
14
+ className?: string;
15
+ }
16
+ export declare function Accordion({ items, defaultOpenId, multiple, className, }: AccordionProps): import("react/jsx-runtime").JSX.Element;
17
+ export {};
18
+ //# sourceMappingURL=Accordion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Accordion.d.ts","sourceRoot":"","sources":["../../../../../src/components/accordion/Accordion.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,iBAAiB,CAAC;AAEzB,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AAED,UAAU,cAAc;IACtB,iCAAiC;IACjC,KAAK,EAAE,aAAa,EAAE,CAAC;IAEvB,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,aAAa,EACb,QAAgB,EAChB,SAAc,GACf,EAAE,cAAc,2CA8DhB"}
@@ -0,0 +1,13 @@
1
+ import { default as React } from 'react';
2
+ type AlertType = 'info' | 'success' | 'warning' | 'error';
3
+ interface AlertProps {
4
+ type?: AlertType;
5
+ title?: string;
6
+ children?: React.ReactNode;
7
+ closable?: boolean;
8
+ onClose?: () => void;
9
+ className?: string;
10
+ }
11
+ export declare function Alert({ type, title, children, closable, onClose, className, }: AlertProps): import("react/jsx-runtime").JSX.Element;
12
+ export {};
13
+ //# sourceMappingURL=Alert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Alert.d.ts","sourceRoot":"","sources":["../../../../../src/components/alert/Alert.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,aAAa,CAAC;AAErB,KAAK,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAE1D,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,KAAK,CAAC,EACpB,IAAa,EACb,KAAK,EACL,QAAQ,EACR,QAAgB,EAChB,OAAO,EACP,SAAc,GACf,EAAE,UAAU,2CAyBZ"}
@@ -0,0 +1,18 @@
1
+ import { default as React } from 'react';
2
+ type AvatarSize = 'sm' | 'md' | 'lg' | 'xl';
3
+ type AvatarShape = 'circle' | 'rounded' | 'square';
4
+ type Status = 'online' | 'offline' | 'busy' | undefined;
5
+ interface AvatarProps {
6
+ src?: string;
7
+ alt?: string;
8
+ name?: string;
9
+ size?: AvatarSize;
10
+ shape?: AvatarShape;
11
+ status?: Status;
12
+ loading?: boolean;
13
+ className?: string;
14
+ fallbackIcon?: React.ReactNode;
15
+ }
16
+ export declare function Avatar({ src, alt, name, size, shape, status, loading, className, fallbackIcon, }: AvatarProps): import("react/jsx-runtime").JSX.Element;
17
+ export {};
18
+ //# sourceMappingURL=Avatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../../../../src/components/avatar/Avatar.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAmB,MAAM,OAAO,CAAC;AACxC,OAAO,cAAc,CAAC;AAEtB,KAAK,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAC5C,KAAK,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AACnD,KAAK,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAExD,UAAU,WAAW;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAChC;AASD,wBAAgB,MAAM,CAAC,EACrB,GAAG,EACH,GAAG,EACH,IAAI,EACJ,IAAW,EACX,KAAgB,EAChB,MAAM,EACN,OAAe,EACf,SAAc,EACd,YAAY,GACb,EAAE,WAAW,2CA6Cb"}
@@ -0,0 +1,10 @@
1
+ import { default as React } from 'react';
2
+ interface AvatarGroupProps {
3
+ children: React.ReactNode[];
4
+ max?: number;
5
+ size?: 'sm' | 'md' | 'lg' | 'xl';
6
+ className?: string;
7
+ }
8
+ export declare function AvatarGroup({ children, max, size, className, }: AvatarGroupProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=AvatarGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AvatarGroup.d.ts","sourceRoot":"","sources":["../../../../../src/components/avatar/AvatarGroup.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,cAAc,CAAC;AAEtB,UAAU,gBAAgB;IACxB,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,GAAO,EACP,IAAW,EACX,SAAc,GACf,EAAE,gBAAgB,2CAwBlB"}
@@ -0,0 +1,22 @@
1
+ import { default as React } from 'react';
2
+ type Variant = 'default' | 'primary' | 'success' | 'warning' | 'danger';
3
+ type Size = 'sm' | 'md' | 'lg';
4
+ interface BadgeProps {
5
+ children?: React.ReactNode;
6
+ count?: number;
7
+ max?: number;
8
+ variant?: Variant;
9
+ size?: Size;
10
+ pill?: boolean;
11
+ dot?: boolean;
12
+ href?: string;
13
+ onClick?: () => void;
14
+ ariaLabel?: string;
15
+ className?: string;
16
+ title?: string;
17
+ iconLeft?: React.ReactNode;
18
+ iconRight?: React.ReactNode;
19
+ }
20
+ export declare function Badge({ children, count, max, variant, size, pill, dot, href, onClick, ariaLabel, className, title, iconLeft, iconRight, }: BadgeProps): import("react/jsx-runtime").JSX.Element;
21
+ export {};
22
+ //# sourceMappingURL=Badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.d.ts","sourceRoot":"","sources":["../../../../../src/components/badge/Badge.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,aAAa,CAAC;AAErB,KAAK,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AACxE,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/B,UAAU,UAAU;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAG3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IAEd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC7B;AAkBD,wBAAgB,KAAK,CAAC,EACpB,QAAQ,EACR,KAAK,EACL,GAAG,EACH,OAAmB,EACnB,IAAW,EACX,IAAY,EACZ,GAAW,EACX,IAAI,EACJ,OAAO,EACP,SAAS,EACT,SAAc,EACd,KAAK,EACL,QAAQ,EACR,SAAS,GACV,EAAE,UAAU,2CA4GZ"}
@@ -0,0 +1,9 @@
1
+ import { default as React } from 'react';
2
+ interface BadgeGroupProps {
3
+ items: React.ReactNode[];
4
+ max?: number;
5
+ className?: string;
6
+ }
7
+ export declare function BadgeGroup({ items, max, className, }: BadgeGroupProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=BadgeGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BadgeGroup.d.ts","sourceRoot":"","sources":["../../../../../src/components/badge/BadgeGroup.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,eAAe;IACvB,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,GAAO,EACP,SAAc,GACf,EAAE,eAAe,2CAajB"}
@@ -0,0 +1,15 @@
1
+ import { default as React } from 'react';
2
+ export interface Crumb {
3
+ label: React.ReactNode;
4
+ href?: string;
5
+ onClick?: () => void;
6
+ }
7
+ export interface BreadcrumbsProps {
8
+ items: Crumb[];
9
+ maxItems?: number;
10
+ separator?: React.ReactNode;
11
+ className?: string;
12
+ }
13
+ export declare function Breadcrumbs({ items, maxItems, // default collapse threshold
14
+ separator, className, }: BreadcrumbsProps): import("react/jsx-runtime").JSX.Element | null;
15
+ //# sourceMappingURL=Breadcrumbs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Breadcrumbs.d.ts","sourceRoot":"","sources":["../../../../../src/components/breadcrumbs/Breadcrumbs.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,mBAAmB,CAAC;AAE3B,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAY,EAAE,6BAA6B;AAC3C,SAAe,EACf,SAAc,GACf,EAAE,gBAAgB,kDA4DlB"}
@@ -0,0 +1,15 @@
1
+ import { default as React } from 'react';
2
+ export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
3
+ /**
4
+ * Visual appearance of the button.
5
+ * "default" = subtle background
6
+ * "primary" = strong emphasis (blue)
7
+ */
8
+ variant?: 'default' | 'primary';
9
+ /**
10
+ * Adjusts padding & font-size.
11
+ */
12
+ size?: 'sm' | 'md' | 'lg';
13
+ }
14
+ export declare function Button({ variant, size, className, ...props }: ButtonProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=Button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../../../src/components/button/Button.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,cAAc,CAAC;AAEtB,MAAM,WAAW,WACf,SAAQ,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;IACrD;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAEhC;;OAEG;IACH,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,MAAM,CAAC,EACrB,OAAmB,EACnB,IAAW,EACX,SAAc,EACd,GAAG,KAAK,EACT,EAAE,WAAW,2CAYb"}