@nofinite/nui 1.1.2 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -48
- package/dist/components/accordion/Accordion.cjs +1 -1
- package/dist/components/accordion/Accordion.cjs.map +1 -1
- package/dist/components/accordion/Accordion.js +64 -43
- package/dist/components/accordion/Accordion.js.map +1 -1
- package/dist/components/alert/Alert.cjs +1 -1
- package/dist/components/alert/Alert.cjs.map +1 -1
- package/dist/components/alert/Alert.js +39 -25
- package/dist/components/alert/Alert.js.map +1 -1
- package/dist/components/avatar/Avatar.cjs +1 -1
- package/dist/components/avatar/Avatar.cjs.map +1 -1
- package/dist/components/avatar/Avatar.js +58 -44
- package/dist/components/avatar/Avatar.js.map +1 -1
- package/dist/components/avatar/AvatarGroup.cjs +1 -1
- package/dist/components/avatar/AvatarGroup.cjs.map +1 -1
- package/dist/components/avatar/AvatarGroup.js +34 -25
- package/dist/components/avatar/AvatarGroup.js.map +1 -1
- package/dist/components/badge/Badge.cjs +1 -1
- package/dist/components/badge/Badge.cjs.map +1 -1
- package/dist/components/badge/Badge.js +43 -68
- package/dist/components/badge/Badge.js.map +1 -1
- package/dist/components/badge/BadgeGroup.cjs +1 -1
- package/dist/components/badge/BadgeGroup.cjs.map +1 -1
- package/dist/components/badge/BadgeGroup.js +20 -10
- package/dist/components/badge/BadgeGroup.js.map +1 -1
- package/dist/components/breadcrumbs/Breadcrumbs.cjs +1 -1
- package/dist/components/breadcrumbs/Breadcrumbs.cjs.map +1 -1
- package/dist/components/breadcrumbs/Breadcrumbs.js +59 -39
- package/dist/components/breadcrumbs/Breadcrumbs.js.map +1 -1
- package/dist/components/button/Button.cjs +1 -1
- package/dist/components/button/Button.cjs.map +1 -1
- package/dist/components/button/Button.js +52 -17
- package/dist/components/button/Button.js.map +1 -1
- package/dist/components/card/Card.cjs +1 -1
- package/dist/components/card/Card.cjs.map +1 -1
- package/dist/components/card/Card.js +44 -41
- package/dist/components/card/Card.js.map +1 -1
- package/dist/components/checkbox/Checkbox.cjs +1 -1
- package/dist/components/checkbox/Checkbox.cjs.map +1 -1
- package/dist/components/checkbox/Checkbox.js +59 -40
- package/dist/components/checkbox/Checkbox.js.map +1 -1
- package/dist/components/chip/Chip.cjs +1 -1
- package/dist/components/chip/Chip.cjs.map +1 -1
- package/dist/components/chip/Chip.js +67 -47
- package/dist/components/chip/Chip.js.map +1 -1
- package/dist/components/combobox/Combobox.cjs +1 -1
- package/dist/components/combobox/Combobox.cjs.map +1 -1
- package/dist/components/combobox/Combobox.js +123 -108
- package/dist/components/combobox/Combobox.js.map +1 -1
- package/dist/components/commandpalette/CommandPalette.cjs +1 -1
- package/dist/components/commandpalette/CommandPalette.cjs.map +1 -1
- package/dist/components/commandpalette/CommandPalette.js +96 -73
- package/dist/components/commandpalette/CommandPalette.js.map +1 -1
- package/dist/components/contextmenu/ContextMenu.cjs +1 -1
- package/dist/components/contextmenu/ContextMenu.cjs.map +1 -1
- package/dist/components/contextmenu/ContextMenu.js +79 -58
- package/dist/components/contextmenu/ContextMenu.js.map +1 -1
- package/dist/components/datagrid/DataGrid.cjs +1 -1
- package/dist/components/datagrid/DataGrid.cjs.map +1 -1
- package/dist/components/datagrid/DataGrid.js +184 -202
- package/dist/components/datagrid/DataGrid.js.map +1 -1
- package/dist/components/datepicker/DatePicker.cjs +1 -1
- package/dist/components/datepicker/DatePicker.cjs.map +1 -1
- package/dist/components/datepicker/DatePicker.js +197 -164
- package/dist/components/datepicker/DatePicker.js.map +1 -1
- package/dist/components/daterangepicker/DateRangePicker.cjs +1 -1
- package/dist/components/daterangepicker/DateRangePicker.cjs.map +1 -1
- package/dist/components/daterangepicker/DateRangePicker.js +254 -213
- package/dist/components/daterangepicker/DateRangePicker.js.map +1 -1
- package/dist/components/dialog/DialogProvider.cjs +2 -0
- package/dist/components/dialog/DialogProvider.cjs.map +1 -0
- package/dist/components/dialog/DialogProvider.js +71 -0
- package/dist/components/dialog/DialogProvider.js.map +1 -0
- package/dist/components/dialog/dialogStore.cjs +2 -0
- package/dist/components/dialog/dialogStore.cjs.map +1 -0
- package/dist/components/dialog/dialogStore.js +60 -0
- package/dist/components/dialog/dialogStore.js.map +1 -0
- package/dist/components/drawer/Drawer.cjs +1 -1
- package/dist/components/drawer/Drawer.cjs.map +1 -1
- package/dist/components/drawer/Drawer.js +69 -47
- package/dist/components/drawer/Drawer.js.map +1 -1
- package/dist/components/dropdown/Dropdown.cjs +1 -1
- package/dist/components/dropdown/Dropdown.cjs.map +1 -1
- package/dist/components/dropdown/Dropdown.js +134 -108
- package/dist/components/dropdown/Dropdown.js.map +1 -1
- package/dist/components/fileuploader/FileUploader.cjs +1 -1
- package/dist/components/fileuploader/FileUploader.cjs.map +1 -1
- package/dist/components/fileuploader/FileUploader.js +96 -61
- package/dist/components/fileuploader/FileUploader.js.map +1 -1
- package/dist/components/hovercard/HoverCard.cjs +1 -1
- package/dist/components/hovercard/HoverCard.cjs.map +1 -1
- package/dist/components/hovercard/HoverCard.js +124 -69
- package/dist/components/hovercard/HoverCard.js.map +1 -1
- package/dist/components/input/Input.cjs +1 -1
- package/dist/components/input/Input.cjs.map +1 -1
- package/dist/components/input/Input.js +62 -37
- package/dist/components/input/Input.js.map +1 -1
- package/dist/components/layout/Container.cjs +1 -1
- package/dist/components/layout/Container.cjs.map +1 -1
- package/dist/components/layout/Container.js +21 -30
- package/dist/components/layout/Container.js.map +1 -1
- package/dist/components/layout/Flex.cjs +1 -1
- package/dist/components/layout/Flex.cjs.map +1 -1
- package/dist/components/layout/Flex.js +36 -19
- package/dist/components/layout/Flex.js.map +1 -1
- package/dist/components/layout/Grid.cjs +1 -1
- package/dist/components/layout/Grid.cjs.map +1 -1
- package/dist/components/layout/Grid.js +30 -18
- package/dist/components/layout/Grid.js.map +1 -1
- package/dist/components/link/Link.cjs +2 -0
- package/dist/components/link/Link.cjs.map +1 -0
- package/dist/components/link/Link.js +41 -0
- package/dist/components/link/Link.js.map +1 -0
- package/dist/components/megamenu/MegaMenu.cjs +1 -1
- package/dist/components/megamenu/MegaMenu.cjs.map +1 -1
- package/dist/components/megamenu/MegaMenu.js +107 -38
- package/dist/components/megamenu/MegaMenu.js.map +1 -1
- package/dist/components/modal/Modal.cjs +1 -1
- package/dist/components/modal/Modal.cjs.map +1 -1
- package/dist/components/modal/Modal.js +91 -83
- package/dist/components/modal/Modal.js.map +1 -1
- package/dist/components/multiselect/MultiSelect.cjs +2 -0
- package/dist/components/multiselect/MultiSelect.cjs.map +1 -0
- package/dist/components/multiselect/MultiSelect.js +176 -0
- package/dist/components/multiselect/MultiSelect.js.map +1 -0
- package/dist/components/nuiprovider/NUIProvider.cjs +2 -0
- package/dist/components/nuiprovider/NUIProvider.cjs.map +1 -0
- package/dist/components/nuiprovider/NUIProvider.js +36 -0
- package/dist/components/nuiprovider/NUIProvider.js.map +1 -0
- package/dist/components/pagination/Pagination.cjs +1 -1
- package/dist/components/pagination/Pagination.cjs.map +1 -1
- package/dist/components/pagination/Pagination.js +74 -41
- package/dist/components/pagination/Pagination.js.map +1 -1
- package/dist/components/popover/Popover.cjs +1 -1
- package/dist/components/popover/Popover.cjs.map +1 -1
- package/dist/components/popover/Popover.js +99 -100
- package/dist/components/popover/Popover.js.map +1 -1
- package/dist/components/progress/Progress.cjs +1 -1
- package/dist/components/progress/Progress.cjs.map +1 -1
- package/dist/components/progress/Progress.js +44 -22
- package/dist/components/progress/Progress.js.map +1 -1
- package/dist/components/radiogroup/RadioGroup.cjs +1 -1
- package/dist/components/radiogroup/RadioGroup.cjs.map +1 -1
- package/dist/components/radiogroup/RadioGroup.js +69 -74
- package/dist/components/radiogroup/RadioGroup.js.map +1 -1
- package/dist/components/rating/Rating.cjs +1 -1
- package/dist/components/rating/Rating.cjs.map +1 -1
- package/dist/components/rating/Rating.js +72 -33
- package/dist/components/rating/Rating.js.map +1 -1
- package/dist/components/resizable/Resizable.cjs +2 -0
- package/dist/components/resizable/Resizable.cjs.map +1 -0
- package/dist/components/resizable/Resizable.js +134 -0
- package/dist/components/resizable/Resizable.js.map +1 -0
- package/dist/components/select/Select.cjs +1 -1
- package/dist/components/select/Select.cjs.map +1 -1
- package/dist/components/select/Select.js +114 -113
- package/dist/components/select/Select.js.map +1 -1
- package/dist/components/skeleton/Skeleton.cjs +1 -1
- package/dist/components/skeleton/Skeleton.cjs.map +1 -1
- package/dist/components/skeleton/Skeleton.js +90 -67
- package/dist/components/skeleton/Skeleton.js.map +1 -1
- package/dist/components/slider/Slider.cjs +1 -1
- package/dist/components/slider/Slider.cjs.map +1 -1
- package/dist/components/slider/Slider.js +85 -82
- package/dist/components/slider/Slider.js.map +1 -1
- package/dist/components/spinner/Spinner.cjs +1 -1
- package/dist/components/spinner/Spinner.cjs.map +1 -1
- package/dist/components/spinner/Spinner.js +60 -17
- package/dist/components/spinner/Spinner.js.map +1 -1
- package/dist/components/stepper/Stepper.cjs +1 -5
- package/dist/components/stepper/Stepper.cjs.map +1 -1
- package/dist/components/stepper/Stepper.js +65 -39
- package/dist/components/stepper/Stepper.js.map +1 -1
- package/dist/components/switch/Switch.cjs +1 -1
- package/dist/components/switch/Switch.cjs.map +1 -1
- package/dist/components/switch/Switch.js +89 -62
- package/dist/components/switch/Switch.js.map +1 -1
- package/dist/components/table/Table.cjs +1 -1
- package/dist/components/table/Table.cjs.map +1 -1
- package/dist/components/table/Table.js +62 -35
- package/dist/components/table/Table.js.map +1 -1
- package/dist/components/tabs/Tabs.cjs +1 -1
- package/dist/components/tabs/Tabs.cjs.map +1 -1
- package/dist/components/tabs/Tabs.js +110 -50
- package/dist/components/tabs/Tabs.js.map +1 -1
- package/dist/components/textarea/Textarea.cjs +1 -1
- package/dist/components/textarea/Textarea.cjs.map +1 -1
- package/dist/components/textarea/Textarea.js +63 -58
- package/dist/components/textarea/Textarea.js.map +1 -1
- package/dist/components/timepicker/TimePicker.cjs +2 -0
- package/dist/components/timepicker/TimePicker.cjs.map +1 -0
- package/dist/components/timepicker/TimePicker.js +159 -0
- package/dist/components/timepicker/TimePicker.js.map +1 -0
- package/dist/components/timerangepicker/TimeRangePicker.cjs +2 -0
- package/dist/components/timerangepicker/TimeRangePicker.cjs.map +1 -0
- package/dist/components/timerangepicker/TimeRangePicker.js +208 -0
- package/dist/components/timerangepicker/TimeRangePicker.js.map +1 -0
- package/dist/components/toast/Toast.cjs +1 -1
- package/dist/components/toast/Toast.cjs.map +1 -1
- package/dist/components/toast/Toast.js +91 -38
- package/dist/components/toast/Toast.js.map +1 -1
- package/dist/components/tooltip/Tooltip.cjs +1 -1
- package/dist/components/tooltip/Tooltip.cjs.map +1 -1
- package/dist/components/tooltip/Tooltip.js +72 -56
- package/dist/components/tooltip/Tooltip.js.map +1 -1
- package/dist/components/treeview/TreeView.cjs +1 -1
- package/dist/components/treeview/TreeView.cjs.map +1 -1
- package/dist/components/treeview/TreeView.js +120 -90
- package/dist/components/treeview/TreeView.js.map +1 -1
- package/dist/components/virtuallist/VirtualList.cjs +1 -1
- package/dist/components/virtuallist/VirtualList.cjs.map +1 -1
- package/dist/components/virtuallist/VirtualList.js +52 -34
- package/dist/components/virtuallist/VirtualList.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.css +1 -0
- package/dist/index.js +120 -106
- package/dist/index.js.map +1 -1
- package/dist/package.json +49 -6
- package/dist/types/components/accordion/Accordion.d.ts +7 -3
- package/dist/types/components/accordion/Accordion.d.ts.map +1 -1
- package/dist/types/components/alert/Alert.d.ts +18 -5
- package/dist/types/components/alert/Alert.d.ts.map +1 -1
- package/dist/types/components/avatar/Avatar.d.ts +12 -8
- package/dist/types/components/avatar/Avatar.d.ts.map +1 -1
- package/dist/types/components/avatar/AvatarGroup.d.ts +11 -4
- package/dist/types/components/avatar/AvatarGroup.d.ts.map +1 -1
- package/dist/types/components/badge/Badge.d.ts +19 -11
- package/dist/types/components/badge/Badge.d.ts.map +1 -1
- package/dist/types/components/badge/BadgeGroup.d.ts +7 -4
- package/dist/types/components/badge/BadgeGroup.d.ts.map +1 -1
- package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts +14 -6
- package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts.map +1 -1
- package/dist/types/components/button/Button.d.ts +25 -10
- package/dist/types/components/button/Button.d.ts.map +1 -1
- package/dist/types/components/card/Card.d.ts +12 -21
- package/dist/types/components/card/Card.d.ts.map +1 -1
- package/dist/types/components/checkbox/Checkbox.d.ts +12 -7
- package/dist/types/components/checkbox/Checkbox.d.ts.map +1 -1
- package/dist/types/components/chip/Chip.d.ts +14 -11
- package/dist/types/components/chip/Chip.d.ts.map +1 -1
- package/dist/types/components/combobox/Combobox.d.ts +15 -4
- package/dist/types/components/combobox/Combobox.d.ts.map +1 -1
- package/dist/types/components/commandpalette/CommandPalette.d.ts +12 -3
- package/dist/types/components/commandpalette/CommandPalette.d.ts.map +1 -1
- package/dist/types/components/contextmenu/ContextMenu.d.ts +14 -6
- package/dist/types/components/contextmenu/ContextMenu.d.ts.map +1 -1
- package/dist/types/components/datagrid/DataGrid.d.ts +16 -4
- package/dist/types/components/datagrid/DataGrid.d.ts.map +1 -1
- package/dist/types/components/datepicker/DatePicker.d.ts +13 -1
- package/dist/types/components/datepicker/DatePicker.d.ts.map +1 -1
- package/dist/types/components/daterangepicker/DateRangePicker.d.ts +3 -1
- package/dist/types/components/daterangepicker/DateRangePicker.d.ts.map +1 -1
- package/dist/types/components/dialog/DialogProvider.d.ts +2 -0
- package/dist/types/components/dialog/DialogProvider.d.ts.map +1 -0
- package/dist/types/components/dialog/dialogStore.d.ts +42 -0
- package/dist/types/components/dialog/dialogStore.d.ts.map +1 -0
- package/dist/types/components/drawer/Drawer.d.ts +18 -4
- package/dist/types/components/drawer/Drawer.d.ts.map +1 -1
- package/dist/types/components/dropdown/Dropdown.d.ts +21 -16
- package/dist/types/components/dropdown/Dropdown.d.ts.map +1 -1
- package/dist/types/components/fileuploader/FileUploader.d.ts +22 -3
- package/dist/types/components/fileuploader/FileUploader.d.ts.map +1 -1
- package/dist/types/components/hovercard/HoverCard.d.ts +45 -5
- package/dist/types/components/hovercard/HoverCard.d.ts.map +1 -1
- package/dist/types/components/input/Input.d.ts +20 -10
- package/dist/types/components/input/Input.d.ts.map +1 -1
- package/dist/types/components/layout/Container.d.ts +8 -4
- package/dist/types/components/layout/Container.d.ts.map +1 -1
- package/dist/types/components/layout/Flex.d.ts +27 -10
- package/dist/types/components/layout/Flex.d.ts.map +1 -1
- package/dist/types/components/layout/Grid.d.ts +11 -5
- package/dist/types/components/layout/Grid.d.ts.map +1 -1
- package/dist/types/components/link/Link.d.ts +22 -0
- package/dist/types/components/link/Link.d.ts.map +1 -0
- package/dist/types/components/megamenu/MegaMenu.d.ts +8 -11
- package/dist/types/components/megamenu/MegaMenu.d.ts.map +1 -1
- package/dist/types/components/modal/Modal.d.ts +8 -7
- package/dist/types/components/modal/Modal.d.ts.map +1 -1
- package/dist/types/components/multiselect/MultiSelect.d.ts +33 -0
- package/dist/types/components/multiselect/MultiSelect.d.ts.map +1 -0
- package/dist/types/components/nuiprovider/NUIProvider.d.ts +29 -0
- package/dist/types/components/nuiprovider/NUIProvider.d.ts.map +1 -0
- package/dist/types/components/pagination/Pagination.d.ts +17 -3
- package/dist/types/components/pagination/Pagination.d.ts.map +1 -1
- package/dist/types/components/popover/Popover.d.ts +54 -16
- package/dist/types/components/popover/Popover.d.ts.map +1 -1
- package/dist/types/components/progress/Progress.d.ts +17 -7
- package/dist/types/components/progress/Progress.d.ts.map +1 -1
- package/dist/types/components/radiogroup/RadioGroup.d.ts +15 -10
- package/dist/types/components/radiogroup/RadioGroup.d.ts.map +1 -1
- package/dist/types/components/rating/Rating.d.ts +24 -10
- package/dist/types/components/rating/Rating.d.ts.map +1 -1
- package/dist/types/components/resizable/Resizable.d.ts +24 -0
- package/dist/types/components/resizable/Resizable.d.ts.map +1 -0
- package/dist/types/components/select/Select.d.ts +17 -8
- package/dist/types/components/select/Select.d.ts.map +1 -1
- package/dist/types/components/skeleton/Skeleton.d.ts +37 -36
- package/dist/types/components/skeleton/Skeleton.d.ts.map +1 -1
- package/dist/types/components/slider/Slider.d.ts +15 -4
- package/dist/types/components/slider/Slider.d.ts.map +1 -1
- package/dist/types/components/spinner/Spinner.d.ts +14 -4
- package/dist/types/components/spinner/Spinner.d.ts.map +1 -1
- package/dist/types/components/stepper/Stepper.d.ts +17 -3
- package/dist/types/components/stepper/Stepper.d.ts.map +1 -1
- package/dist/types/components/switch/Switch.d.ts +20 -5
- package/dist/types/components/switch/Switch.d.ts.map +1 -1
- package/dist/types/components/table/Table.d.ts +24 -4
- package/dist/types/components/table/Table.d.ts.map +1 -1
- package/dist/types/components/tabs/Tabs.d.ts +25 -12
- package/dist/types/components/tabs/Tabs.d.ts.map +1 -1
- package/dist/types/components/textarea/Textarea.d.ts +8 -5
- package/dist/types/components/textarea/Textarea.d.ts.map +1 -1
- package/dist/types/components/timepicker/TimePicker.d.ts +26 -0
- package/dist/types/components/timepicker/TimePicker.d.ts.map +1 -0
- package/dist/types/components/timerangepicker/TimeRangePicker.d.ts +32 -0
- package/dist/types/components/timerangepicker/TimeRangePicker.d.ts.map +1 -0
- package/dist/types/components/toast/Toast.d.ts +23 -7
- package/dist/types/components/toast/Toast.d.ts.map +1 -1
- package/dist/types/components/tooltip/Tooltip.d.ts +13 -2
- package/dist/types/components/tooltip/Tooltip.d.ts.map +1 -1
- package/dist/types/components/treeview/TreeView.d.ts +20 -6
- package/dist/types/components/treeview/TreeView.d.ts.map +1 -1
- package/dist/types/components/virtuallist/VirtualList.d.ts +12 -16
- package/dist/types/components/virtuallist/VirtualList.d.ts.map +1 -1
- package/dist/types/index.d.ts +8 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/utils/cn/cn.d.ts +19 -0
- package/dist/types/utils/cn/cn.d.ts.map +1 -0
- package/dist/types/utils/generateid/generateId.d.ts +7 -0
- package/dist/types/utils/generateid/generateId.d.ts.map +1 -1
- package/dist/types/utils/index.d.ts +2 -0
- package/dist/types/utils/index.d.ts.map +1 -1
- package/dist/types/utils/inertmanager/inertManager.d.ts +13 -0
- package/dist/types/utils/inertmanager/inertManager.d.ts.map +1 -1
- package/dist/types/utils/keyboardnav/keyboardNav.d.ts +17 -6
- package/dist/types/utils/keyboardnav/keyboardNav.d.ts.map +1 -1
- package/dist/types/utils/onclickoutside/onClickOutside.d.ts +9 -1
- package/dist/types/utils/onclickoutside/onClickOutside.d.ts.map +1 -1
- package/dist/types/utils/portal/portal.d.ts +14 -1
- package/dist/types/utils/portal/portal.d.ts.map +1 -1
- package/dist/types/utils/restorefocus/restoreFocus.d.ts +8 -4
- package/dist/types/utils/restorefocus/restoreFocus.d.ts.map +1 -1
- package/dist/types/utils/scrolllock/scrollLock.d.ts +10 -2
- package/dist/types/utils/scrolllock/scrollLock.d.ts.map +1 -1
- package/dist/types/utils/slot/slot.d.ts +12 -0
- package/dist/types/utils/slot/slot.d.ts.map +1 -0
- package/dist/types/utils/trapfocus/trapFocus.d.ts +6 -2
- package/dist/types/utils/trapfocus/trapFocus.d.ts.map +1 -1
- package/dist/utils/cn/cn.cjs +2 -0
- package/dist/utils/cn/cn.cjs.map +1 -0
- package/dist/utils/cn/cn.js +21 -0
- package/dist/utils/cn/cn.js.map +1 -0
- package/dist/utils/inertmanager/inertManager.cjs.map +1 -1
- package/dist/utils/inertmanager/inertManager.js.map +1 -1
- package/dist/utils/onclickoutside/onClickOutside.cjs +1 -1
- package/dist/utils/onclickoutside/onClickOutside.cjs.map +1 -1
- package/dist/utils/onclickoutside/onClickOutside.js +10 -6
- package/dist/utils/onclickoutside/onClickOutside.js.map +1 -1
- package/dist/utils/portal/portal.cjs.map +1 -1
- package/dist/utils/portal/portal.js.map +1 -1
- package/dist/utils/restorefocus/restoreFocus.cjs.map +1 -1
- package/dist/utils/restorefocus/restoreFocus.js.map +1 -1
- package/dist/utils/scrolllock/scrollLock.cjs.map +1 -1
- package/dist/utils/scrolllock/scrollLock.js +7 -0
- package/dist/utils/scrolllock/scrollLock.js.map +1 -1
- package/dist/utils/slot/slot.cjs +2 -0
- package/dist/utils/slot/slot.cjs.map +1 -0
- package/dist/utils/slot/slot.js +57 -0
- package/dist/utils/slot/slot.js.map +1 -0
- package/dist/utils/trapfocus/trapFocus.cjs.map +1 -1
- package/dist/utils/trapfocus/trapFocus.js.map +1 -1
- package/package.json +49 -6
- package/dist/components/layout/HStack.cjs +0 -2
- package/dist/components/layout/HStack.cjs.map +0 -1
- package/dist/components/layout/HStack.js +0 -9
- package/dist/components/layout/HStack.js.map +0 -1
- package/dist/components/layout/Stack.cjs +0 -2
- package/dist/components/layout/Stack.cjs.map +0 -1
- package/dist/components/layout/Stack.js +0 -9
- package/dist/components/layout/Stack.js.map +0 -1
- package/dist/styles/nui.css +0 -1
- package/dist/theme/NUIProvider.cjs +0 -2
- package/dist/theme/NUIProvider.cjs.map +0 -1
- package/dist/theme/NUIProvider.js +0 -34
- package/dist/theme/NUIProvider.js.map +0 -1
- package/dist/theme/useTheme.cjs +0 -2
- package/dist/theme/useTheme.cjs.map +0 -1
- package/dist/theme/useTheme.js +0 -9
- package/dist/theme/useTheme.js.map +0 -1
- package/dist/types/components/layout/HStack.d.ts +0 -8
- package/dist/types/components/layout/HStack.d.ts.map +0 -1
- package/dist/types/components/layout/Stack.d.ts +0 -8
- package/dist/types/components/layout/Stack.d.ts.map +0 -1
- package/dist/types/theme/NUIProvider.d.ts +0 -14
- package/dist/types/theme/NUIProvider.d.ts.map +0 -1
- package/dist/types/theme/useTheme.d.ts +0 -11
- package/dist/types/theme/useTheme.d.ts.map +0 -1
- package/dist/utils/generateid/generateId.cjs +0 -2
- package/dist/utils/generateid/generateId.cjs.map +0 -1
- package/dist/utils/generateid/generateId.js +0 -7
- package/dist/utils/generateid/generateId.js.map +0 -1
- package/dist/utils/keyboardnav/keyboardNav.cjs +0 -2
- package/dist/utils/keyboardnav/keyboardNav.cjs.map +0 -1
- package/dist/utils/keyboardnav/keyboardNav.js +0 -10
- package/dist/utils/keyboardnav/keyboardNav.js.map +0 -1
|
@@ -1,98 +1,128 @@
|
|
|
1
|
-
import { jsx as a, jsxs as
|
|
2
|
-
import { useState as
|
|
1
|
+
import { jsx as a, jsxs as w } from "react/jsx-runtime";
|
|
2
|
+
import T, { forwardRef as D, useState as L, useRef as $, useCallback as g } from "react";
|
|
3
3
|
/* empty css */
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
import { cn as u } from "../../utils/cn/cn.js";
|
|
5
|
+
const P = D(({
|
|
6
|
+
data: k,
|
|
7
|
+
selectedId: x,
|
|
8
|
+
defaultExpandedIds: A = [],
|
|
7
9
|
onSelect: h,
|
|
8
|
-
className:
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
className: E,
|
|
11
|
+
...N
|
|
12
|
+
}, y) => {
|
|
13
|
+
const [f, I] = L(new Set(A)), p = $(null), v = `nui-tree-${T.useId().replace(/:/g, "")}`, c = g((t, r) => {
|
|
14
|
+
r?.stopPropagation(), I((o) => {
|
|
15
|
+
const e = new Set(o);
|
|
16
|
+
return e.has(t) ? e.delete(t) : e.add(t), e;
|
|
14
17
|
});
|
|
15
|
-
},
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
18
|
+
}, []), C = g(
|
|
19
|
+
(t, r, o) => {
|
|
20
|
+
["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", "Home", "End", " ", "Enter"].includes(t.key) && t.preventDefault(), t.stopPropagation();
|
|
21
|
+
const e = t.currentTarget, d = f.has(r.id), s = !!r.children?.length, i = p.current ? Array.from(
|
|
22
|
+
p.current.querySelectorAll('[role="treeitem"]:not([aria-disabled="true"])')
|
|
23
|
+
) : [], l = i.indexOf(e);
|
|
24
|
+
switch (t.key) {
|
|
25
|
+
case "Enter":
|
|
26
|
+
case " ":
|
|
27
|
+
if (r.disabled) return;
|
|
28
|
+
s && c(r.id), h?.(r.id, r);
|
|
29
|
+
break;
|
|
30
|
+
case "ArrowRight":
|
|
31
|
+
s && !d ? c(r.id) : s && d && i[l + 1]?.focus();
|
|
32
|
+
break;
|
|
33
|
+
case "ArrowLeft":
|
|
34
|
+
s && d ? c(r.id) : o && i.find((R) => R.id.endsWith(`-${o.id}`))?.focus();
|
|
35
|
+
break;
|
|
36
|
+
case "ArrowDown":
|
|
37
|
+
i[l + 1]?.focus();
|
|
38
|
+
break;
|
|
39
|
+
case "ArrowUp":
|
|
40
|
+
i[l - 1]?.focus();
|
|
41
|
+
break;
|
|
42
|
+
case "Home":
|
|
43
|
+
i[0]?.focus();
|
|
44
|
+
break;
|
|
45
|
+
case "End":
|
|
46
|
+
i[i.length - 1]?.focus();
|
|
47
|
+
break;
|
|
45
48
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
49
|
+
},
|
|
50
|
+
[f, c, h]
|
|
51
|
+
), b = (t, r = 1, o) => /* @__PURE__ */ a(
|
|
52
|
+
"ul",
|
|
53
|
+
{
|
|
54
|
+
role: r === 1 ? "tree" : "group",
|
|
55
|
+
className: u("nui-tree", r > 1 && "nui-tree--nested"),
|
|
56
|
+
ref: r === 1 ? p : void 0,
|
|
57
|
+
children: t.map((e, d) => {
|
|
58
|
+
const s = f.has(e.id), m = x === e.id, i = !!e.children?.length, l = r === 1 && d === 0;
|
|
59
|
+
return /* @__PURE__ */ w(
|
|
60
|
+
"li",
|
|
61
|
+
{
|
|
62
|
+
id: `${v}-${e.id}`,
|
|
63
|
+
role: "treeitem",
|
|
64
|
+
"aria-expanded": i ? s : void 0,
|
|
65
|
+
"aria-selected": m,
|
|
66
|
+
"aria-disabled": e.disabled,
|
|
67
|
+
tabIndex: l ? 0 : -1,
|
|
68
|
+
className: u(
|
|
69
|
+
"nui-tree-item",
|
|
70
|
+
m && "nui-tree-item--selected",
|
|
71
|
+
e.disabled && "nui-tree-item--disabled"
|
|
72
|
+
),
|
|
73
|
+
onKeyDown: (n) => C(n, e, o),
|
|
74
|
+
onClick: (n) => {
|
|
75
|
+
n.stopPropagation(), !e.disabled && (n.currentTarget.focus(), i && c(e.id), h?.(e.id, e));
|
|
76
|
+
},
|
|
77
|
+
children: [
|
|
78
|
+
/* @__PURE__ */ w(
|
|
79
|
+
"div",
|
|
80
|
+
{
|
|
81
|
+
className: "nui-tree-item-content",
|
|
82
|
+
style: { paddingLeft: `${(r - 1) * 16}px` },
|
|
83
|
+
children: [
|
|
84
|
+
/* @__PURE__ */ a(
|
|
85
|
+
"span",
|
|
86
|
+
{
|
|
87
|
+
className: u("nui-tree-chevron", !i && "nui-tree-chevron--hidden"),
|
|
88
|
+
onClick: (n) => {
|
|
89
|
+
i && c(e.id, n);
|
|
90
|
+
},
|
|
91
|
+
children: /* @__PURE__ */ a(
|
|
92
|
+
"svg",
|
|
93
|
+
{
|
|
94
|
+
width: "14",
|
|
95
|
+
height: "14",
|
|
96
|
+
viewBox: "0 0 24 24",
|
|
97
|
+
fill: "none",
|
|
98
|
+
stroke: "currentColor",
|
|
99
|
+
strokeWidth: "2.5",
|
|
100
|
+
strokeLinecap: "round",
|
|
101
|
+
strokeLinejoin: "round",
|
|
102
|
+
className: u("nui-tree-chevron-icon", s && "nui-tree-chevron-icon--open"),
|
|
103
|
+
"aria-hidden": "true",
|
|
104
|
+
children: /* @__PURE__ */ a("polyline", { points: "9 18 15 12 9 6" })
|
|
105
|
+
}
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
),
|
|
109
|
+
e.icon && /* @__PURE__ */ a("span", { className: "nui-tree-icon", "aria-hidden": "true", children: e.icon }),
|
|
110
|
+
/* @__PURE__ */ a("span", { className: "nui-tree-label", children: e.label })
|
|
111
|
+
]
|
|
112
|
+
}
|
|
113
|
+
),
|
|
114
|
+
i && s && e.children && b(e.children, r + 1, e)
|
|
115
|
+
]
|
|
72
116
|
},
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
},
|
|
82
|
-
children: "▶"
|
|
83
|
-
}
|
|
84
|
-
) : /* @__PURE__ */ a("span", { className: "ui-tree-arrow empty", children: "•" }),
|
|
85
|
-
i.icon && /* @__PURE__ */ a("span", { className: "ui-tree-icon", children: i.icon }),
|
|
86
|
-
/* @__PURE__ */ a("span", { className: "ui-tree-label", children: i.label })
|
|
87
|
-
]
|
|
88
|
-
}
|
|
89
|
-
),
|
|
90
|
-
c && t && i.children && /* @__PURE__ */ a("div", { role: "group", children: i.children.map((l) => v(l, i, r + 1)) })
|
|
91
|
-
] }, i.id);
|
|
92
|
-
};
|
|
93
|
-
return /* @__PURE__ */ a("div", { className: `ui-treeview ${N}`, role: "tree", children: p.map((i) => v(i, void 0, 0)) });
|
|
94
|
-
}
|
|
117
|
+
e.id
|
|
118
|
+
);
|
|
119
|
+
})
|
|
120
|
+
}
|
|
121
|
+
);
|
|
122
|
+
return /* @__PURE__ */ a("div", { ref: y, className: u("nui-tree-wrapper", E), ...N, children: b(k) });
|
|
123
|
+
});
|
|
124
|
+
P.displayName = "TreeView";
|
|
95
125
|
export {
|
|
96
|
-
|
|
126
|
+
P as TreeView
|
|
97
127
|
};
|
|
98
128
|
//# sourceMappingURL=TreeView.js.map
|
|
@@ -1 +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":"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"}
|
|
1
|
+
{"version":3,"file":"TreeView.js","sources":["../../../src/components/treeview/TreeView.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState, useCallback, useRef, forwardRef } from 'react';\nimport { cn } from '../../utils';\nimport './TreeView.css';\n\n/* ============================================================\n * Types\n * ============================================================ */\n\nexport interface TreeNode {\n /** Unique identifier for the node */\n id: string;\n /** Text or element to display */\n label: React.ReactNode;\n /** Optional icon to display next to the label */\n icon?: React.ReactNode;\n /** Nested children nodes */\n children?: TreeNode[];\n /** Prevents interaction and applies muted styles */\n disabled?: boolean;\n}\n\nexport interface TreeViewProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n /** The hierarchical data structure to render */\n data: TreeNode[];\n /** The ID of the currently selected node (Controlled) */\n selectedId?: string;\n /** Array of node IDs to expand by default on initial render */\n defaultExpandedIds?: string[];\n /** Callback fired when a node is selected */\n onSelect?: (id: string, node: TreeNode) => void;\n}\n\n/* ============================================================\n * Component\n * ============================================================ */\n\n/**\n * TreeView Component\n * * A hierarchical list display with nested collapsible folders.\n * * Fully WAI-ARIA compliant with a smart roving tabindex for keyboard navigation.\n */\nexport const TreeView = forwardRef<HTMLDivElement, TreeViewProps>(({\n data,\n selectedId,\n defaultExpandedIds = [],\n onSelect,\n className,\n ...props\n}, ref) => {\n const [expandedIds, setExpandedIds] = useState<Set<string>>(new Set(defaultExpandedIds));\n const treeRef = useRef<HTMLUListElement>(null);\n \n // Generate a unique prefix so multiple TreeViews on the same page never clash IDs\n const baseId = React.useId();\n // Strip the colons that React adds to make it strictly valid for query selectors\n const treeIdPrefix = `nui-tree-${baseId.replace(/:/g, '')}`;\n\n const toggleExpand = useCallback((id: string, e?: React.MouseEvent) => {\n e?.stopPropagation();\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }, []);\n\n /* ----------------------------------------------------\n Keyboard Navigation (WAI-ARIA Standard)\n ---------------------------------------------------- */\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent, node: TreeNode, parentNode?: TreeNode) => {\n // 1. Instantly kill all default browser scrolling for arrow keys\n if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Home', 'End', ' ', 'Enter'].includes(e.key)) {\n e.preventDefault();\n }\n \n // 2. Stop parent folders from stealing the keypress\n e.stopPropagation();\n\n const target = e.currentTarget as HTMLLIElement;\n const isExpanded = expandedIds.has(node.id);\n const hasChildren = !!node.children?.length;\n\n // Get all currently visible nodes in the exact DOM order\n const getVisibleNodes = () => {\n if (!treeRef.current) return [];\n return Array.from(\n treeRef.current.querySelectorAll('[role=\"treeitem\"]:not([aria-disabled=\"true\"])')\n ) as HTMLLIElement[];\n };\n\n const nodes = getVisibleNodes();\n const currentIndex = nodes.indexOf(target);\n\n switch (e.key) {\n case 'Enter':\n case ' ':\n if (node.disabled) return;\n // Modern UX: Enter/Space should expand/collapse folders\n if (hasChildren) toggleExpand(node.id);\n onSelect?.(node.id, node);\n break;\n\n case 'ArrowRight':\n if (hasChildren && !isExpanded) {\n // Closed folder -> Open it\n toggleExpand(node.id);\n } else if (hasChildren && isExpanded) {\n // Open folder -> The very next visible node in the DOM is ALWAYS its first child!\n nodes[currentIndex + 1]?.focus();\n }\n break;\n\n case 'ArrowLeft':\n if (hasChildren && isExpanded) {\n // Open folder -> Close it\n toggleExpand(node.id);\n } else if (parentNode) {\n // Closed folder or File -> Safely find parent by checking the end of the ID\n const parentEl = nodes.find(n => n.id.endsWith(`-${parentNode.id}`));\n parentEl?.focus();\n }\n break;\n\n case 'ArrowDown':\n nodes[currentIndex + 1]?.focus();\n break;\n\n case 'ArrowUp':\n nodes[currentIndex - 1]?.focus();\n break;\n\n case 'Home':\n nodes[0]?.focus();\n break;\n\n case 'End':\n nodes[nodes.length - 1]?.focus();\n break;\n }\n },\n [expandedIds, toggleExpand, onSelect]\n );\n\n /* ----------------------------------------------------\n Recursive Render Function\n ---------------------------------------------------- */\n const renderTree = (nodes: TreeNode[], level = 1, parentNode?: TreeNode) => {\n return (\n <ul\n role={level === 1 ? 'tree' : 'group'}\n className={cn(\"nui-tree\", level > 1 && \"nui-tree--nested\")}\n ref={level === 1 ? treeRef : undefined}\n >\n {nodes.map((node, index) => {\n const isExpanded = expandedIds.has(node.id);\n const isSelected = selectedId === node.id;\n const hasChildren = !!node.children?.length;\n \n // Only the first item in the entire tree is tabbable by default (Roving Tabindex)\n const isTabbable = level === 1 && index === 0;\n\n return (\n <li\n key={node.id}\n id={`${treeIdPrefix}-${node.id}`} \n role=\"treeitem\"\n aria-expanded={hasChildren ? isExpanded : undefined}\n aria-selected={isSelected}\n aria-disabled={node.disabled}\n tabIndex={isTabbable ? 0 : -1}\n className={cn(\n \"nui-tree-item\",\n isSelected && \"nui-tree-item--selected\",\n node.disabled && \"nui-tree-item--disabled\"\n )}\n onKeyDown={(e) => handleKeyDown(e, node, parentNode)} \n onClick={(e) => {\n e.stopPropagation();\n if (node.disabled) return;\n \n (e.currentTarget as HTMLElement).focus();\n \n if (hasChildren) {\n toggleExpand(node.id);\n }\n onSelect?.(node.id, node);\n }}\n >\n <div \n className=\"nui-tree-item-content\"\n style={{ paddingLeft: `${(level - 1) * 16}px` }}\n >\n <span \n className={cn(\"nui-tree-chevron\", !hasChildren && \"nui-tree-chevron--hidden\")}\n onClick={(e) => {\n if (hasChildren) toggleExpand(node.id, e);\n }}\n >\n <svg \n width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"\n className={cn(\"nui-tree-chevron-icon\", isExpanded && \"nui-tree-chevron-icon--open\")}\n aria-hidden=\"true\"\n >\n <polyline points=\"9 18 15 12 9 6\"></polyline>\n </svg>\n </span>\n\n {node.icon && (\n <span className=\"nui-tree-icon\" aria-hidden=\"true\">{node.icon}</span>\n )}\n\n <span className=\"nui-tree-label\">{node.label}</span>\n </div>\n\n {hasChildren && isExpanded && node.children && (\n renderTree(node.children, level + 1, node) // Pass 'node' as the parent for the next level\n )}\n </li>\n );\n })}\n </ul>\n );\n };\n\n return (\n <div ref={ref} className={cn(\"nui-tree-wrapper\", className)} {...props}>\n {renderTree(data)}\n </div>\n );\n});\n\nTreeView.displayName = 'TreeView';"],"names":["TreeView","forwardRef","data","selectedId","defaultExpandedIds","onSelect","className","props","ref","expandedIds","setExpandedIds","useState","treeRef","useRef","treeIdPrefix","React","toggleExpand","useCallback","id","e","prev","next","handleKeyDown","node","parentNode","target","isExpanded","hasChildren","nodes","currentIndex","n","renderTree","level","jsx","cn","index","isSelected","isTabbable","jsxs"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),l=require("react");;/* empty css */const w=require("../../utils/cn/cn.cjs");function L({items:c,height:i,itemHeight:s=40,overscan:o=3,keyExtractor:u,renderItem:h,className:m,onScroll:d,...v},e){const[f,y]=l.useState(0),j=l.useRef(null),I=l.useCallback(t=>{j.current=t,typeof e=="function"?e(t):e&&(e.current=t)},[e]),R=l.useCallback(t=>{y(t.currentTarget.scrollTop),d?.(t)},[d]),p=c.length,b=p*s,r=Math.max(0,Math.floor(f/s)-o),M=Math.min(p-1,Math.floor((f+i)/s)+o),N=c.slice(r,M+1),S=r*s;return n.jsxs("div",{ref:I,className:w.cn("nui-virtual-list",m),style:{height:`${i}px`},onScroll:R,role:"list",...v,children:[n.jsx("div",{className:"nui-virtual-spacer",style:{height:`${b}px`}}),n.jsx("div",{className:"nui-virtual-window",style:{transform:`translateY(${S}px)`},children:N.map((t,T)=>{const a=r+T,q=u?u(t,a):a;return n.jsx("div",{role:"listitem",className:"nui-virtual-row",style:{height:`${s}px`},children:h(t,a)},q)})})]})}const x=l.forwardRef(L);x.displayName="VirtualList";exports.VirtualList=x;
|
|
2
2
|
//# sourceMappingURL=VirtualList.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VirtualList.cjs","sources":["../../../src/components/virtuallist/VirtualList.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"VirtualList.cjs","sources":["../../../src/components/virtuallist/VirtualList.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useRef, useState, useCallback, UIEvent, forwardRef } from 'react';\nimport { cn } from '../../utils';\nimport './VirtualList.css';\n\n/* ============================================================\n * Types\n * ============================================================ */\n\nexport interface VirtualListProps<T> extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Array of data items to render */\n items: T[];\n /** Height of the scrollable viewport in pixels */\n height: number;\n /** Fixed height for each row in pixels. Defaults to 40. */\n itemHeight?: number;\n /** Extra rows to render above and below the viewport to prevent white flashes during fast scrolling */\n overscan?: number;\n /** Extracts a unique React key for each item. Crucial for stable rendering during sorts/filters! */\n keyExtractor?: (item: T, index: number) => string | number;\n /** The render function for the row */\n renderItem: (item: T, index: number) => React.ReactNode;\n}\n\n/* ============================================================\n * Component\n * ============================================================ */\n\n/**\n * VirtualList Component\n * * High-performance scrolling for massive datasets.\n * * Uses GPU-accelerated transforms and strict mathematical windowing to only render visible DOM nodes.\n */\nfunction VirtualListInner<T>(\n {\n items,\n height,\n itemHeight = 40,\n overscan = 3,\n keyExtractor,\n renderItem,\n className,\n onScroll,\n ...props\n }: VirtualListProps<T>,\n ref: React.ForwardedRef<HTMLDivElement>\n) {\n const [scrollTop, setScrollTop] = useState(0);\n\n // Internal ref for scroll tracking, merged with forwarded ref\n const internalRef = useRef<HTMLDivElement>(null);\n const setRefs = useCallback(\n (node: HTMLDivElement | null) => {\n internalRef.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref]\n );\n\n /* ----------------------------------------------------\n Scroll Handling (React Synthetic Event)\n ---------------------------------------------------- */\n const handleScroll = useCallback(\n (e: UIEvent<HTMLDivElement>) => {\n // React's Synthetic events are perfectly batched in React 18+\n setScrollTop(e.currentTarget.scrollTop);\n // Preserve any consumer-provided onScroll handlers\n onScroll?.(e);\n },\n [onScroll]\n );\n\n /* ----------------------------------------------------\n Virtualization Math\n ---------------------------------------------------- */\n const totalItems = items.length;\n const totalHeight = totalItems * itemHeight;\n\n // Calculate exactly which indices are currently visible in the viewport\n const startIndex = Math.max(0, Math.floor(scrollTop / itemHeight) - overscan);\n const endIndex = Math.min(\n totalItems - 1,\n Math.floor((scrollTop + height) / itemHeight) + overscan\n );\n\n const visibleItems = items.slice(startIndex, endIndex + 1);\n\n // Calculate the exact pixel offset to push the visible window down\n const offsetY = startIndex * itemHeight;\n\n /* ----------------------------------------------------\n Render\n ---------------------------------------------------- */\n return (\n <div\n ref={setRefs}\n className={cn(\"nui-virtual-list\", className)}\n style={{ height: `${height}px` }}\n onScroll={handleScroll}\n role=\"list\"\n {...props}\n >\n {/* 1. The Spacer: Forces the container to be the exact scrollable height of 10k+ rows */}\n <div\n className=\"nui-virtual-spacer\"\n style={{ height: `${totalHeight}px` }}\n />\n\n {/* 2. The Window: Hardware accelerated sliding container */}\n <div\n className=\"nui-virtual-window\"\n style={{ transform: `translateY(${offsetY}px)` }}\n >\n {visibleItems.map((item, i) => {\n const actualIndex = startIndex + i;\n // Safely fall back to index if no keyExtractor is provided\n const itemKey = keyExtractor ? keyExtractor(item, actualIndex) : actualIndex;\n\n return (\n <div\n key={itemKey}\n role=\"listitem\"\n className=\"nui-virtual-row\"\n style={{ height: `${itemHeight}px` }}\n >\n {renderItem(item, actualIndex)}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\n// Type assertion required to allow forwardRef to support generics <T>\nexport const VirtualList = forwardRef(VirtualListInner) as <T>(\n props: VirtualListProps<T> & { ref?: React.ForwardedRef<HTMLDivElement> }\n) => React.ReactElement;\n\n(VirtualList as React.FC).displayName = 'VirtualList';"],"names":["VirtualListInner","items","height","itemHeight","overscan","keyExtractor","renderItem","className","onScroll","props","ref","scrollTop","setScrollTop","useState","internalRef","useRef","setRefs","useCallback","node","handleScroll","e","totalItems","totalHeight","startIndex","endIndex","visibleItems","offsetY","jsxs","cn","jsx","item","i","actualIndex","itemKey","VirtualList","forwardRef"],"mappings":"kNAkCA,SAASA,EACP,CACE,MAAAC,EACA,OAAAC,EACA,WAAAC,EAAa,GACb,SAAAC,EAAW,EACX,aAAAC,EACA,WAAAC,EACA,UAAAC,EACA,SAAAC,EACA,GAAGC,CACL,EACAC,EACA,CACA,KAAM,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAAS,CAAC,EAGtCC,EAAcC,EAAAA,OAAuB,IAAI,EACzCC,EAAUC,EAAAA,YACbC,GAAgC,CAC/BJ,EAAY,QAAUI,EAClB,OAAOR,GAAQ,WACjBA,EAAIQ,CAAI,EACCR,IACTA,EAAI,QAAUQ,EAElB,EACA,CAACR,CAAG,CAAA,EAMAS,EAAeF,EAAAA,YAClBG,GAA+B,CAE9BR,EAAaQ,EAAE,cAAc,SAAS,EAEtCZ,IAAWY,CAAC,CACd,EACA,CAACZ,CAAQ,CAAA,EAMLa,EAAapB,EAAM,OACnBqB,EAAcD,EAAalB,EAG3BoB,EAAa,KAAK,IAAI,EAAG,KAAK,MAAMZ,EAAYR,CAAU,EAAIC,CAAQ,EACtEoB,EAAW,KAAK,IACpBH,EAAa,EACb,KAAK,OAAOV,EAAYT,GAAUC,CAAU,EAAIC,CAAA,EAG5CqB,EAAexB,EAAM,MAAMsB,EAAYC,EAAW,CAAC,EAGnDE,EAAUH,EAAapB,EAK7B,OACEwB,EAAAA,KAAC,MAAA,CACC,IAAKX,EACL,UAAWY,EAAAA,GAAG,mBAAoBrB,CAAS,EAC3C,MAAO,CAAE,OAAQ,GAAGL,CAAM,IAAA,EAC1B,SAAUiB,EACV,KAAK,OACJ,GAAGV,EAGJ,SAAA,CAAAoB,EAAAA,IAAC,MAAA,CACC,UAAU,qBACV,MAAO,CAAE,OAAQ,GAAGP,CAAW,IAAA,CAAK,CAAA,EAItCO,EAAAA,IAAC,MAAA,CACC,UAAU,qBACV,MAAO,CAAE,UAAW,cAAcH,CAAO,KAAA,EAExC,SAAAD,EAAa,IAAI,CAACK,EAAMC,IAAM,CAC7B,MAAMC,EAAcT,EAAaQ,EAE3BE,EAAU5B,EAAeA,EAAayB,EAAME,CAAW,EAAIA,EAEjE,OACEH,EAAAA,IAAC,MAAA,CAEC,KAAK,WACL,UAAU,kBACV,MAAO,CAAE,OAAQ,GAAG1B,CAAU,IAAA,EAE7B,SAAAG,EAAWwB,EAAME,CAAW,CAAA,EALxBC,CAAA,CAQX,CAAC,CAAA,CAAA,CACH,CAAA,CAAA,CAGN,CAGO,MAAMC,EAAcC,EAAAA,WAAWnC,CAAgB,EAIrDkC,EAAyB,YAAc"}
|
|
@@ -1,49 +1,65 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import {
|
|
1
|
+
import { jsxs as S, jsx as o } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as V, useState as b, useRef as j, useCallback as m } from "react";
|
|
3
3
|
/* empty css */
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
4
|
+
import { cn as Y } from "../../utils/cn/cn.js";
|
|
5
|
+
function g({
|
|
6
|
+
items: a,
|
|
7
|
+
height: e,
|
|
8
|
+
itemHeight: s = 40,
|
|
9
|
+
overscan: i = 3,
|
|
10
|
+
keyExtractor: c,
|
|
11
|
+
renderItem: d,
|
|
12
|
+
className: h,
|
|
13
|
+
onScroll: u,
|
|
14
|
+
...x
|
|
15
|
+
}, l) {
|
|
16
|
+
const [p, v] = b(0), y = j(null), I = m(
|
|
17
|
+
(t) => {
|
|
18
|
+
y.current = t, typeof l == "function" ? l(t) : l && (l.current = t);
|
|
19
|
+
},
|
|
20
|
+
[l]
|
|
21
|
+
), N = m(
|
|
22
|
+
(t) => {
|
|
23
|
+
v(t.currentTarget.scrollTop), u?.(t);
|
|
24
|
+
},
|
|
25
|
+
[u]
|
|
26
|
+
), f = a.length, w = f * s, n = Math.max(0, Math.floor(p / s) - i), M = Math.min(
|
|
27
|
+
f - 1,
|
|
28
|
+
Math.floor((p + e) / s) + i
|
|
29
|
+
), R = a.slice(n, M + 1), T = n * s;
|
|
30
|
+
return /* @__PURE__ */ S(
|
|
19
31
|
"div",
|
|
20
32
|
{
|
|
21
|
-
ref:
|
|
22
|
-
className:
|
|
23
|
-
style: { height:
|
|
33
|
+
ref: I,
|
|
34
|
+
className: Y("nui-virtual-list", h),
|
|
35
|
+
style: { height: `${e}px` },
|
|
36
|
+
onScroll: N,
|
|
37
|
+
role: "list",
|
|
38
|
+
...x,
|
|
24
39
|
children: [
|
|
25
|
-
/* @__PURE__ */
|
|
40
|
+
/* @__PURE__ */ o(
|
|
26
41
|
"div",
|
|
27
42
|
{
|
|
28
|
-
className: "
|
|
29
|
-
style: { height:
|
|
43
|
+
className: "nui-virtual-spacer",
|
|
44
|
+
style: { height: `${w}px` }
|
|
30
45
|
}
|
|
31
46
|
),
|
|
32
|
-
/* @__PURE__ */
|
|
47
|
+
/* @__PURE__ */ o(
|
|
33
48
|
"div",
|
|
34
49
|
{
|
|
35
|
-
className: "
|
|
36
|
-
style: { transform: `translateY(${
|
|
37
|
-
children:
|
|
38
|
-
const
|
|
39
|
-
return /* @__PURE__ */
|
|
50
|
+
className: "nui-virtual-window",
|
|
51
|
+
style: { transform: `translateY(${T}px)` },
|
|
52
|
+
children: R.map((t, $) => {
|
|
53
|
+
const r = n + $, L = c ? c(t, r) : r;
|
|
54
|
+
return /* @__PURE__ */ o(
|
|
40
55
|
"div",
|
|
41
56
|
{
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
57
|
+
role: "listitem",
|
|
58
|
+
className: "nui-virtual-row",
|
|
59
|
+
style: { height: `${s}px` },
|
|
60
|
+
children: d(t, r)
|
|
45
61
|
},
|
|
46
|
-
|
|
62
|
+
L
|
|
47
63
|
);
|
|
48
64
|
})
|
|
49
65
|
}
|
|
@@ -52,7 +68,9 @@ function j({
|
|
|
52
68
|
}
|
|
53
69
|
);
|
|
54
70
|
}
|
|
71
|
+
const C = V(g);
|
|
72
|
+
C.displayName = "VirtualList";
|
|
55
73
|
export {
|
|
56
|
-
|
|
74
|
+
C as VirtualList
|
|
57
75
|
};
|
|
58
76
|
//# sourceMappingURL=VirtualList.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VirtualList.js","sources":["../../../src/components/virtuallist/VirtualList.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"VirtualList.js","sources":["../../../src/components/virtuallist/VirtualList.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useRef, useState, useCallback, UIEvent, forwardRef } from 'react';\nimport { cn } from '../../utils';\nimport './VirtualList.css';\n\n/* ============================================================\n * Types\n * ============================================================ */\n\nexport interface VirtualListProps<T> extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Array of data items to render */\n items: T[];\n /** Height of the scrollable viewport in pixels */\n height: number;\n /** Fixed height for each row in pixels. Defaults to 40. */\n itemHeight?: number;\n /** Extra rows to render above and below the viewport to prevent white flashes during fast scrolling */\n overscan?: number;\n /** Extracts a unique React key for each item. Crucial for stable rendering during sorts/filters! */\n keyExtractor?: (item: T, index: number) => string | number;\n /** The render function for the row */\n renderItem: (item: T, index: number) => React.ReactNode;\n}\n\n/* ============================================================\n * Component\n * ============================================================ */\n\n/**\n * VirtualList Component\n * * High-performance scrolling for massive datasets.\n * * Uses GPU-accelerated transforms and strict mathematical windowing to only render visible DOM nodes.\n */\nfunction VirtualListInner<T>(\n {\n items,\n height,\n itemHeight = 40,\n overscan = 3,\n keyExtractor,\n renderItem,\n className,\n onScroll,\n ...props\n }: VirtualListProps<T>,\n ref: React.ForwardedRef<HTMLDivElement>\n) {\n const [scrollTop, setScrollTop] = useState(0);\n\n // Internal ref for scroll tracking, merged with forwarded ref\n const internalRef = useRef<HTMLDivElement>(null);\n const setRefs = useCallback(\n (node: HTMLDivElement | null) => {\n internalRef.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref]\n );\n\n /* ----------------------------------------------------\n Scroll Handling (React Synthetic Event)\n ---------------------------------------------------- */\n const handleScroll = useCallback(\n (e: UIEvent<HTMLDivElement>) => {\n // React's Synthetic events are perfectly batched in React 18+\n setScrollTop(e.currentTarget.scrollTop);\n // Preserve any consumer-provided onScroll handlers\n onScroll?.(e);\n },\n [onScroll]\n );\n\n /* ----------------------------------------------------\n Virtualization Math\n ---------------------------------------------------- */\n const totalItems = items.length;\n const totalHeight = totalItems * itemHeight;\n\n // Calculate exactly which indices are currently visible in the viewport\n const startIndex = Math.max(0, Math.floor(scrollTop / itemHeight) - overscan);\n const endIndex = Math.min(\n totalItems - 1,\n Math.floor((scrollTop + height) / itemHeight) + overscan\n );\n\n const visibleItems = items.slice(startIndex, endIndex + 1);\n\n // Calculate the exact pixel offset to push the visible window down\n const offsetY = startIndex * itemHeight;\n\n /* ----------------------------------------------------\n Render\n ---------------------------------------------------- */\n return (\n <div\n ref={setRefs}\n className={cn(\"nui-virtual-list\", className)}\n style={{ height: `${height}px` }}\n onScroll={handleScroll}\n role=\"list\"\n {...props}\n >\n {/* 1. The Spacer: Forces the container to be the exact scrollable height of 10k+ rows */}\n <div\n className=\"nui-virtual-spacer\"\n style={{ height: `${totalHeight}px` }}\n />\n\n {/* 2. The Window: Hardware accelerated sliding container */}\n <div\n className=\"nui-virtual-window\"\n style={{ transform: `translateY(${offsetY}px)` }}\n >\n {visibleItems.map((item, i) => {\n const actualIndex = startIndex + i;\n // Safely fall back to index if no keyExtractor is provided\n const itemKey = keyExtractor ? keyExtractor(item, actualIndex) : actualIndex;\n\n return (\n <div\n key={itemKey}\n role=\"listitem\"\n className=\"nui-virtual-row\"\n style={{ height: `${itemHeight}px` }}\n >\n {renderItem(item, actualIndex)}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\n// Type assertion required to allow forwardRef to support generics <T>\nexport const VirtualList = forwardRef(VirtualListInner) as <T>(\n props: VirtualListProps<T> & { ref?: React.ForwardedRef<HTMLDivElement> }\n) => React.ReactElement;\n\n(VirtualList as React.FC).displayName = 'VirtualList';"],"names":["VirtualListInner","items","height","itemHeight","overscan","keyExtractor","renderItem","className","onScroll","props","ref","scrollTop","setScrollTop","useState","internalRef","useRef","setRefs","useCallback","node","handleScroll","e","totalItems","totalHeight","startIndex","endIndex","visibleItems","offsetY","jsxs","cn","jsx","item","i","actualIndex","itemKey","VirtualList","forwardRef"],"mappings":";;;;AAkCA,SAASA,EACP;AAAA,EACE,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,YAAAC,IAAa;AAAA,EACb,UAAAC,IAAW;AAAA,EACX,cAAAC;AAAA,EACA,YAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,GACAC,GACA;AACA,QAAM,CAACC,GAAWC,CAAY,IAAIC,EAAS,CAAC,GAGtCC,IAAcC,EAAuB,IAAI,GACzCC,IAAUC;AAAA,IACd,CAACC,MAAgC;AAC/B,MAAAJ,EAAY,UAAUI,GAClB,OAAOR,KAAQ,aACjBA,EAAIQ,CAAI,IACCR,MACTA,EAAI,UAAUQ;AAAA,IAElB;AAAA,IACA,CAACR,CAAG;AAAA,EAAA,GAMAS,IAAeF;AAAA,IACnB,CAACG,MAA+B;AAE9B,MAAAR,EAAaQ,EAAE,cAAc,SAAS,GAEtCZ,IAAWY,CAAC;AAAA,IACd;AAAA,IACA,CAACZ,CAAQ;AAAA,EAAA,GAMLa,IAAapB,EAAM,QACnBqB,IAAcD,IAAalB,GAG3BoB,IAAa,KAAK,IAAI,GAAG,KAAK,MAAMZ,IAAYR,CAAU,IAAIC,CAAQ,GACtEoB,IAAW,KAAK;AAAA,IACpBH,IAAa;AAAA,IACb,KAAK,OAAOV,IAAYT,KAAUC,CAAU,IAAIC;AAAA,EAAA,GAG5CqB,IAAexB,EAAM,MAAMsB,GAAYC,IAAW,CAAC,GAGnDE,IAAUH,IAAapB;AAK7B,SACE,gBAAAwB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKX;AAAA,MACL,WAAWY,EAAG,oBAAoBrB,CAAS;AAAA,MAC3C,OAAO,EAAE,QAAQ,GAAGL,CAAM,KAAA;AAAA,MAC1B,UAAUiB;AAAA,MACV,MAAK;AAAA,MACJ,GAAGV;AAAA,MAGJ,UAAA;AAAA,QAAA,gBAAAoB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,QAAQ,GAAGP,CAAW,KAAA;AAAA,UAAK;AAAA,QAAA;AAAA,QAItC,gBAAAO;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,WAAW,cAAcH,CAAO,MAAA;AAAA,YAExC,UAAAD,EAAa,IAAI,CAACK,GAAMC,MAAM;AAC7B,oBAAMC,IAAcT,IAAaQ,GAE3BE,IAAU5B,IAAeA,EAAayB,GAAME,CAAW,IAAIA;AAEjE,qBACE,gBAAAH;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,OAAO,EAAE,QAAQ,GAAG1B,CAAU,KAAA;AAAA,kBAE7B,UAAAG,EAAWwB,GAAME,CAAW;AAAA,gBAAA;AAAA,gBALxBC;AAAA,cAAA;AAAA,YAQX,CAAC;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAAA;AAGN;AAGO,MAAMC,IAAcC,EAAWnC,CAAgB;AAIrDkC,EAAyB,cAAc;"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});;/* empty css
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});;/* empty css */;/* empty css */;/* empty css */const i=require("./components/nuiprovider/NUIProvider.cjs"),a=require("./components/button/Button.cjs"),u=require("./components/modal/Modal.cjs"),c=require("./components/dropdown/Dropdown.cjs"),s=require("./components/input/Input.cjs"),d=require("./components/tabs/Tabs.cjs"),l=require("./components/tooltip/Tooltip.cjs"),n=require("./components/toast/Toast.cjs"),q=require("./components/accordion/Accordion.cjs"),p=require("./components/skeleton/Skeleton.cjs"),P=require("./components/slider/Slider.cjs"),g=require("./components/checkbox/Checkbox.cjs"),C=require("./components/radiogroup/RadioGroup.cjs"),v=require("./components/switch/Switch.cjs"),T=require("./components/datepicker/DatePicker.cjs"),S=require("./components/daterangepicker/DateRangePicker.cjs"),k=require("./components/drawer/Drawer.cjs"),b=require("./components/card/Card.cjs"),m=require("./components/alert/Alert.cjs"),R=require("./components/table/Table.cjs"),D=require("./components/badge/Badge.cjs"),M=require("./components/badge/BadgeGroup.cjs"),x=require("./components/avatar/Avatar.cjs"),G=require("./components/avatar/AvatarGroup.cjs"),w=require("./components/select/Select.cjs"),A=require("./components/combobox/Combobox.cjs"),B=require("./components/megamenu/MegaMenu.cjs"),h=require("./components/layout/Container.cjs"),H=require("./components/layout/Grid.cjs"),o=require("./components/layout/Flex.cjs"),F=require("./components/textarea/Textarea.cjs"),e=require("./components/popover/Popover.cjs"),I=require("./components/pagination/Pagination.cjs"),L=require("./components/breadcrumbs/Breadcrumbs.cjs"),U=require("./components/progress/Progress.cjs"),V=require("./components/spinner/Spinner.cjs"),z=require("./components/stepper/Stepper.cjs"),N=require("./components/chip/Chip.cjs"),y=require("./components/rating/Rating.cjs"),r=require("./components/hovercard/HoverCard.cjs"),E=require("./components/fileuploader/FileUploader.cjs"),f=require("./components/contextmenu/ContextMenu.cjs"),j=require("./components/commandpalette/CommandPalette.cjs"),O=require("./components/treeview/TreeView.cjs"),J=require("./components/datagrid/DataGrid.cjs"),K=require("./components/virtuallist/VirtualList.cjs"),Q=require("./components/timepicker/TimePicker.cjs"),W=require("./components/timerangepicker/TimeRangePicker.cjs"),X=require("./components/multiselect/MultiSelect.cjs"),Y=require("./components/resizable/Resizable.cjs"),Z=require("./components/link/Link.cjs"),t=require("./components/dialog/dialogStore.cjs"),_=require("./components/dialog/DialogProvider.cjs");exports.NUIProvider=i.NUIProvider;exports.useTheme=i.useTheme;exports.Button=a.Button;exports.Modal=u.Modal;exports.Dropdown=c.Dropdown;exports.Input=s.Input;exports.Tabs=d.Tabs;exports.Tooltip=l.Tooltip;exports.ToastProvider=n.ToastProvider;exports.useToast=n.useToast;exports.Accordion=q.Accordion;exports.Skeleton=p.Skeleton;exports.Slider=P.Slider;exports.Checkbox=g.Checkbox;exports.RadioGroup=C.RadioGroup;exports.Switch=v.Switch;exports.DatePicker=T.DatePicker;exports.DateRangePicker=S.DateRangePicker;exports.Drawer=k.Drawer;exports.Card=b.Card;exports.Alert=m.Alert;exports.Table=R.Table;exports.Badge=D.Badge;exports.BadgeGroup=M.BadgeGroup;exports.Avatar=x.Avatar;exports.AvatarGroup=G.AvatarGroup;exports.Select=w.Select;exports.Combobox=A.Combobox;exports.MegaMenu=B.MegaMenu;exports.Container=h.Container;exports.Grid=H.Grid;exports.Flex=o.Flex;exports.HStack=o.HStack;exports.Stack=o.Stack;exports.Textarea=F.Textarea;exports.Popover=e.Popover;exports.PopoverClose=e.PopoverClose;exports.PopoverContent=e.PopoverContent;exports.PopoverRoot=e.PopoverRoot;exports.PopoverTrigger=e.PopoverTrigger;exports.Pagination=I.Pagination;exports.Breadcrumbs=L.Breadcrumbs;exports.Progress=U.Progress;exports.Spinner=V.Spinner;exports.Stepper=z.Stepper;exports.Chip=N.Chip;exports.Rating=y.Rating;exports.HoverCard=r.HoverCard;exports.HoverCardContent=r.HoverCardContent;exports.HoverCardRoot=r.HoverCardRoot;exports.HoverCardTrigger=r.HoverCardTrigger;exports.FileUploader=E.FileUploader;exports.ContextMenu=f.ContextMenu;exports.CommandPalette=j.CommandPalette;exports.TreeView=O.TreeView;exports.DataGrid=J.DataGrid;exports.VirtualList=K.VirtualList;exports.TimePicker=Q.TimePicker;exports.TimeRangePicker=W.TimeRangePicker;exports.MultiSelect=X.MultiSelect;exports.Resizable=Y.Resizable;exports.Link=Z.Link;exports.dialogStore=t.dialogStore;exports.nui=t.nui;exports.toastEmitter=t.toastEmitter;exports.DialogProvider=_.DialogProvider;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|