@nofinite/nui 1.1.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @nofinite/nui might be problematic. Click here for more details.
- package/LICENSE +201 -201
- package/README.md +61 -48
- package/dist/CHANGELOG.md +8 -0
- package/dist/LICENSE +201 -0
- package/dist/README.md +48 -0
- 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/dist/components/accordion/Accordion.cjs +2 -0
- package/dist/dist/components/accordion/Accordion.cjs.map +1 -0
- package/dist/dist/components/accordion/Accordion.js +51 -0
- package/dist/dist/components/accordion/Accordion.js.map +1 -0
- package/dist/dist/components/alert/Alert.cjs +2 -0
- package/dist/dist/components/alert/Alert.cjs.map +1 -0
- package/dist/dist/components/alert/Alert.js +32 -0
- package/dist/dist/components/alert/Alert.js.map +1 -0
- package/dist/dist/components/avatar/Avatar.cjs +2 -0
- package/dist/dist/components/avatar/Avatar.cjs.map +1 -0
- package/dist/dist/components/avatar/Avatar.js +51 -0
- package/dist/dist/components/avatar/Avatar.js.map +1 -0
- package/dist/dist/components/avatar/AvatarGroup.cjs +2 -0
- package/dist/dist/components/avatar/AvatarGroup.cjs.map +1 -0
- package/dist/dist/components/avatar/AvatarGroup.js +32 -0
- package/dist/dist/components/avatar/AvatarGroup.js.map +1 -0
- package/dist/dist/components/badge/Badge.cjs +2 -0
- package/dist/dist/components/badge/Badge.cjs.map +1 -0
- package/dist/dist/components/badge/Badge.js +81 -0
- package/dist/dist/components/badge/Badge.js.map +1 -0
- package/dist/dist/components/badge/BadgeGroup.cjs +2 -0
- package/dist/dist/components/badge/BadgeGroup.cjs.map +1 -0
- package/dist/dist/components/badge/BadgeGroup.js +17 -0
- package/dist/dist/components/badge/BadgeGroup.js.map +1 -0
- package/dist/dist/components/breadcrumbs/Breadcrumbs.cjs +2 -0
- package/dist/dist/components/breadcrumbs/Breadcrumbs.cjs.map +1 -0
- package/dist/dist/components/breadcrumbs/Breadcrumbs.js +46 -0
- package/dist/dist/components/breadcrumbs/Breadcrumbs.js.map +1 -0
- package/dist/dist/components/button/Button.cjs +2 -0
- package/dist/dist/components/button/Button.cjs.map +1 -0
- package/dist/dist/components/button/Button.js +21 -0
- package/dist/dist/components/button/Button.js.map +1 -0
- package/dist/dist/components/card/Card.cjs +2 -0
- package/dist/dist/components/card/Card.cjs.map +1 -0
- package/dist/dist/components/card/Card.js +50 -0
- package/dist/dist/components/card/Card.js.map +1 -0
- package/dist/dist/components/checkbox/Checkbox.cjs +2 -0
- package/dist/dist/components/checkbox/Checkbox.cjs.map +1 -0
- package/dist/dist/components/checkbox/Checkbox.js +46 -0
- package/dist/dist/components/checkbox/Checkbox.js.map +1 -0
- package/dist/dist/components/chip/Chip.cjs +2 -0
- package/dist/dist/components/chip/Chip.cjs.map +1 -0
- package/dist/dist/components/chip/Chip.js +51 -0
- package/dist/dist/components/chip/Chip.js.map +1 -0
- package/dist/dist/components/combobox/Combobox.cjs +2 -0
- package/dist/dist/components/combobox/Combobox.cjs.map +1 -0
- package/dist/dist/components/combobox/Combobox.js +114 -0
- package/dist/dist/components/combobox/Combobox.js.map +1 -0
- package/dist/dist/components/commandpalette/CommandPalette.cjs +2 -0
- package/dist/dist/components/commandpalette/CommandPalette.cjs.map +1 -0
- package/dist/dist/components/commandpalette/CommandPalette.js +111 -0
- package/dist/dist/components/commandpalette/CommandPalette.js.map +1 -0
- package/dist/dist/components/contextmenu/ContextMenu.cjs +2 -0
- package/dist/dist/components/contextmenu/ContextMenu.cjs.map +1 -0
- package/dist/dist/components/contextmenu/ContextMenu.js +104 -0
- package/dist/dist/components/contextmenu/ContextMenu.js.map +1 -0
- package/dist/dist/components/datagrid/DataGrid.cjs +2 -0
- package/dist/dist/components/datagrid/DataGrid.cjs.map +1 -0
- package/dist/dist/components/datagrid/DataGrid.js +227 -0
- package/dist/dist/components/datagrid/DataGrid.js.map +1 -0
- package/dist/dist/components/datepicker/DatePicker.cjs +2 -0
- package/dist/dist/components/datepicker/DatePicker.cjs.map +1 -0
- package/dist/dist/components/datepicker/DatePicker.js +265 -0
- package/dist/dist/components/datepicker/DatePicker.js.map +1 -0
- package/dist/dist/components/daterangepicker/DateRangePicker.cjs +2 -0
- package/dist/dist/components/daterangepicker/DateRangePicker.cjs.map +1 -0
- package/dist/dist/components/daterangepicker/DateRangePicker.js +322 -0
- package/dist/dist/components/daterangepicker/DateRangePicker.js.map +1 -0
- package/dist/dist/components/drawer/Drawer.cjs +2 -0
- package/dist/dist/components/drawer/Drawer.cjs.map +1 -0
- package/dist/dist/components/drawer/Drawer.js +57 -0
- package/dist/dist/components/drawer/Drawer.js.map +1 -0
- package/dist/dist/components/dropdown/Dropdown.cjs +2 -0
- package/dist/dist/components/dropdown/Dropdown.cjs.map +1 -0
- package/dist/dist/components/dropdown/Dropdown.js +115 -0
- package/dist/dist/components/dropdown/Dropdown.js.map +1 -0
- package/dist/dist/components/fileuploader/FileUploader.cjs +2 -0
- package/dist/dist/components/fileuploader/FileUploader.cjs.map +1 -0
- package/dist/dist/components/fileuploader/FileUploader.js +83 -0
- package/dist/dist/components/fileuploader/FileUploader.js.map +1 -0
- package/dist/dist/components/hovercard/HoverCard.cjs +2 -0
- package/dist/dist/components/hovercard/HoverCard.cjs.map +1 -0
- package/dist/dist/components/hovercard/HoverCard.js +78 -0
- package/dist/dist/components/hovercard/HoverCard.js.map +1 -0
- package/dist/dist/components/input/Input.cjs +2 -0
- package/dist/dist/components/input/Input.cjs.map +1 -0
- package/dist/dist/components/input/Input.js +41 -0
- package/dist/dist/components/input/Input.js.map +1 -0
- package/dist/dist/components/layout/Container.cjs +2 -0
- package/dist/dist/components/layout/Container.cjs.map +1 -0
- package/dist/dist/components/layout/Container.js +33 -0
- package/dist/dist/components/layout/Container.js.map +1 -0
- package/dist/dist/components/layout/Flex.cjs +2 -0
- package/dist/dist/components/layout/Flex.cjs.map +1 -0
- package/dist/dist/components/layout/Flex.js +26 -0
- package/dist/dist/components/layout/Flex.js.map +1 -0
- package/dist/dist/components/layout/Grid.cjs +2 -0
- package/dist/dist/components/layout/Grid.cjs.map +1 -0
- package/dist/dist/components/layout/Grid.js +21 -0
- package/dist/dist/components/layout/Grid.js.map +1 -0
- package/dist/dist/components/layout/HStack.cjs.map +1 -0
- package/dist/dist/components/layout/HStack.js.map +1 -0
- package/dist/dist/components/layout/Stack.cjs.map +1 -0
- package/dist/dist/components/layout/Stack.js.map +1 -0
- package/dist/dist/components/megamenu/MegaMenu.cjs +2 -0
- package/dist/dist/components/megamenu/MegaMenu.cjs.map +1 -0
- package/dist/dist/components/megamenu/MegaMenu.js +43 -0
- package/dist/dist/components/megamenu/MegaMenu.js.map +1 -0
- package/dist/dist/components/modal/Modal.cjs +2 -0
- package/dist/dist/components/modal/Modal.cjs.map +1 -0
- package/dist/dist/components/modal/Modal.js +91 -0
- package/dist/dist/components/modal/Modal.js.map +1 -0
- package/dist/dist/components/pagination/Pagination.cjs +2 -0
- package/dist/dist/components/pagination/Pagination.cjs.map +1 -0
- package/dist/dist/components/pagination/Pagination.js +62 -0
- package/dist/dist/components/pagination/Pagination.js.map +1 -0
- package/dist/dist/components/popover/Popover.cjs +2 -0
- package/dist/dist/components/popover/Popover.cjs.map +1 -0
- package/dist/dist/components/popover/Popover.js +123 -0
- package/dist/dist/components/popover/Popover.js.map +1 -0
- package/dist/dist/components/progress/Progress.cjs +2 -0
- package/dist/dist/components/progress/Progress.cjs.map +1 -0
- package/dist/dist/components/progress/Progress.js +33 -0
- package/dist/dist/components/progress/Progress.js.map +1 -0
- package/dist/dist/components/radiogroup/RadioGroup.cjs +2 -0
- package/dist/dist/components/radiogroup/RadioGroup.cjs.map +1 -0
- package/dist/dist/components/radiogroup/RadioGroup.js +79 -0
- package/dist/dist/components/radiogroup/RadioGroup.js.map +1 -0
- package/dist/dist/components/rating/Rating.cjs +2 -0
- package/dist/dist/components/rating/Rating.cjs.map +1 -0
- package/dist/dist/components/rating/Rating.js +49 -0
- package/dist/dist/components/rating/Rating.js.map +1 -0
- package/dist/dist/components/skeleton/Skeleton.cjs +2 -0
- package/dist/dist/components/skeleton/Skeleton.cjs.map +1 -0
- package/dist/dist/components/skeleton/Skeleton.js +86 -0
- package/dist/dist/components/skeleton/Skeleton.js.map +1 -0
- package/dist/dist/components/slider/Slider.cjs +2 -0
- package/dist/dist/components/slider/Slider.cjs.map +1 -0
- package/dist/dist/components/slider/Slider.js +116 -0
- package/dist/dist/components/slider/Slider.js.map +1 -0
- package/dist/dist/components/spinner/Spinner.cjs +2 -0
- package/dist/dist/components/spinner/Spinner.cjs.map +1 -0
- package/dist/dist/components/spinner/Spinner.js +21 -0
- package/dist/dist/components/spinner/Spinner.js.map +1 -0
- package/dist/dist/components/stepper/Stepper.cjs +6 -0
- package/dist/dist/components/stepper/Stepper.cjs.map +1 -0
- package/dist/dist/components/stepper/Stepper.js +43 -0
- package/dist/dist/components/stepper/Stepper.js.map +1 -0
- package/dist/dist/components/switch/Switch.cjs +2 -0
- package/dist/dist/components/switch/Switch.cjs.map +1 -0
- package/dist/dist/components/switch/Switch.js +67 -0
- package/dist/dist/components/switch/Switch.js.map +1 -0
- package/dist/dist/components/table/Table.cjs +2 -0
- package/dist/dist/components/table/Table.cjs.map +1 -0
- package/dist/dist/components/table/Table.js +46 -0
- package/dist/dist/components/table/Table.js.map +1 -0
- package/dist/dist/components/tabs/Tabs.cjs +2 -0
- package/dist/dist/components/tabs/Tabs.cjs.map +1 -0
- package/dist/dist/components/tabs/Tabs.js +56 -0
- package/dist/dist/components/tabs/Tabs.js.map +1 -0
- package/dist/dist/components/textarea/Textarea.cjs +2 -0
- package/dist/dist/components/textarea/Textarea.cjs.map +1 -0
- package/dist/dist/components/textarea/Textarea.js +75 -0
- package/dist/dist/components/textarea/Textarea.js.map +1 -0
- package/dist/dist/components/toast/Toast.cjs +2 -0
- package/dist/dist/components/toast/Toast.cjs.map +1 -0
- package/dist/dist/components/toast/Toast.js +52 -0
- package/dist/dist/components/toast/Toast.js.map +1 -0
- package/dist/dist/components/tooltip/Tooltip.cjs +2 -0
- package/dist/dist/components/tooltip/Tooltip.cjs.map +1 -0
- package/dist/dist/components/tooltip/Tooltip.js +73 -0
- package/dist/dist/components/tooltip/Tooltip.js.map +1 -0
- package/dist/dist/components/treeview/TreeView.cjs +2 -0
- package/dist/dist/components/treeview/TreeView.cjs.map +1 -0
- package/dist/dist/components/treeview/TreeView.js +98 -0
- package/dist/dist/components/treeview/TreeView.js.map +1 -0
- package/dist/dist/components/virtuallist/VirtualList.cjs +2 -0
- package/dist/dist/components/virtuallist/VirtualList.cjs.map +1 -0
- package/dist/dist/components/virtuallist/VirtualList.js +58 -0
- package/dist/dist/components/virtuallist/VirtualList.js.map +1 -0
- package/dist/dist/index.cjs +2 -0
- package/dist/dist/index.cjs.map +1 -0
- package/dist/dist/index.js +109 -0
- package/dist/dist/index.js.map +1 -0
- package/dist/dist/styles/index.css +1 -0
- package/dist/dist/theme/NUIProvider.cjs.map +1 -0
- package/dist/dist/theme/NUIProvider.js.map +1 -0
- package/dist/dist/theme/useTheme.cjs.map +1 -0
- package/dist/dist/theme/useTheme.js.map +1 -0
- package/dist/dist/types/components/accordion/Accordion.d.ts +18 -0
- package/dist/dist/types/components/accordion/Accordion.d.ts.map +1 -0
- package/dist/dist/types/components/alert/Alert.d.ts +13 -0
- package/dist/dist/types/components/alert/Alert.d.ts.map +1 -0
- package/dist/dist/types/components/avatar/Avatar.d.ts +18 -0
- package/dist/dist/types/components/avatar/Avatar.d.ts.map +1 -0
- package/dist/dist/types/components/avatar/AvatarGroup.d.ts +10 -0
- package/dist/dist/types/components/avatar/AvatarGroup.d.ts.map +1 -0
- package/dist/dist/types/components/badge/Badge.d.ts +22 -0
- package/dist/dist/types/components/badge/Badge.d.ts.map +1 -0
- package/dist/dist/types/components/badge/BadgeGroup.d.ts +9 -0
- package/dist/dist/types/components/badge/BadgeGroup.d.ts.map +1 -0
- package/dist/dist/types/components/breadcrumbs/Breadcrumbs.d.ts +15 -0
- package/dist/dist/types/components/breadcrumbs/Breadcrumbs.d.ts.map +1 -0
- package/dist/dist/types/components/button/Button.d.ts +15 -0
- package/dist/dist/types/components/button/Button.d.ts.map +1 -0
- package/dist/dist/types/components/card/Card.d.ts +27 -0
- package/dist/dist/types/components/card/Card.d.ts.map +1 -0
- package/dist/dist/types/components/checkbox/Checkbox.d.ts +15 -0
- package/dist/dist/types/components/checkbox/Checkbox.d.ts.map +1 -0
- package/dist/dist/types/components/chip/Chip.d.ts +21 -0
- package/dist/dist/types/components/chip/Chip.d.ts.map +1 -0
- package/dist/dist/types/components/combobox/Combobox.d.ts +24 -0
- package/dist/dist/types/components/combobox/Combobox.d.ts.map +1 -0
- package/dist/dist/types/components/commandpalette/CommandPalette.d.ts +21 -0
- package/dist/dist/types/components/commandpalette/CommandPalette.d.ts.map +1 -0
- package/dist/dist/types/components/contextmenu/ContextMenu.d.ts +17 -0
- package/dist/dist/types/components/contextmenu/ContextMenu.d.ts.map +1 -0
- package/dist/dist/types/components/datagrid/DataGrid.d.ts +28 -0
- package/dist/dist/types/components/datagrid/DataGrid.d.ts.map +1 -0
- package/dist/dist/types/components/datepicker/DatePicker.d.ts +14 -0
- package/dist/dist/types/components/datepicker/DatePicker.d.ts.map +1 -0
- package/dist/dist/types/components/daterangepicker/DateRangePicker.d.ts +19 -0
- package/dist/dist/types/components/daterangepicker/DateRangePicker.d.ts.map +1 -0
- package/dist/dist/types/components/drawer/Drawer.d.ts +12 -0
- package/dist/dist/types/components/drawer/Drawer.d.ts.map +1 -0
- package/dist/dist/types/components/dropdown/Dropdown.d.ts +18 -0
- package/dist/dist/types/components/dropdown/Dropdown.d.ts.map +1 -0
- package/dist/dist/types/components/fileuploader/FileUploader.d.ts +9 -0
- package/dist/dist/types/components/fileuploader/FileUploader.d.ts.map +1 -0
- package/dist/dist/types/components/hovercard/HoverCard.d.ts +10 -0
- package/dist/dist/types/components/hovercard/HoverCard.d.ts.map +1 -0
- package/dist/dist/types/components/input/Input.d.ts +15 -0
- package/dist/dist/types/components/input/Input.d.ts.map +1 -0
- package/dist/dist/types/components/layout/Container.d.ts +8 -0
- package/dist/dist/types/components/layout/Container.d.ts.map +1 -0
- package/dist/dist/types/components/layout/Flex.d.ts +14 -0
- package/dist/dist/types/components/layout/Flex.d.ts.map +1 -0
- package/dist/dist/types/components/layout/Grid.d.ts +10 -0
- package/dist/dist/types/components/layout/Grid.d.ts.map +1 -0
- package/dist/dist/types/components/layout/HStack.d.ts.map +1 -0
- package/dist/dist/types/components/layout/Stack.d.ts.map +1 -0
- package/dist/dist/types/components/megamenu/MegaMenu.d.ts +12 -0
- package/dist/dist/types/components/megamenu/MegaMenu.d.ts.map +1 -0
- package/dist/dist/types/components/modal/Modal.d.ts +16 -0
- package/dist/dist/types/components/modal/Modal.d.ts.map +1 -0
- package/dist/dist/types/components/pagination/Pagination.d.ts +9 -0
- package/dist/dist/types/components/pagination/Pagination.d.ts.map +1 -0
- package/dist/dist/types/components/popover/Popover.d.ts +21 -0
- package/dist/dist/types/components/popover/Popover.d.ts.map +1 -0
- package/dist/dist/types/components/progress/Progress.d.ts +13 -0
- package/dist/dist/types/components/progress/Progress.d.ts.map +1 -0
- package/dist/dist/types/components/radiogroup/RadioGroup.d.ts +18 -0
- package/dist/dist/types/components/radiogroup/RadioGroup.d.ts.map +1 -0
- package/dist/dist/types/components/rating/Rating.d.ts +19 -0
- package/dist/dist/types/components/rating/Rating.d.ts.map +1 -0
- package/dist/dist/types/components/select/Select.d.ts +20 -0
- package/dist/dist/types/components/select/Select.d.ts.map +1 -0
- package/dist/dist/types/components/skeleton/Skeleton.d.ts +44 -0
- package/dist/dist/types/components/skeleton/Skeleton.d.ts.map +1 -0
- package/dist/dist/types/components/slider/Slider.d.ts +13 -0
- package/dist/dist/types/components/slider/Slider.d.ts.map +1 -0
- package/dist/dist/types/components/spinner/Spinner.d.ts +7 -0
- package/dist/dist/types/components/spinner/Spinner.d.ts.map +1 -0
- package/dist/dist/types/components/stepper/Stepper.d.ts +12 -0
- package/dist/dist/types/components/stepper/Stepper.d.ts.map +1 -0
- package/dist/dist/types/components/switch/Switch.d.ts +15 -0
- package/dist/dist/types/components/switch/Switch.d.ts.map +1 -0
- package/dist/dist/types/components/table/Table.d.ts +14 -0
- package/dist/dist/types/components/table/Table.d.ts.map +1 -0
- package/dist/dist/types/components/tabs/Tabs.d.ts +14 -0
- package/dist/dist/types/components/tabs/Tabs.d.ts.map +1 -0
- package/dist/dist/types/components/textarea/Textarea.d.ts +14 -0
- package/dist/dist/types/components/textarea/Textarea.d.ts.map +1 -0
- package/dist/dist/types/components/toast/Toast.d.ts +16 -0
- package/dist/dist/types/components/toast/Toast.d.ts.map +1 -0
- package/dist/dist/types/components/tooltip/Tooltip.d.ts +10 -0
- package/dist/dist/types/components/tooltip/Tooltip.d.ts.map +1 -0
- package/dist/dist/types/components/treeview/TreeView.d.ts +16 -0
- package/dist/dist/types/components/treeview/TreeView.d.ts.map +1 -0
- package/dist/dist/types/components/virtuallist/VirtualList.d.ts +23 -0
- package/dist/dist/types/components/virtuallist/VirtualList.d.ts.map +1 -0
- package/dist/dist/types/index.d.ts +50 -0
- package/dist/dist/types/index.d.ts.map +1 -0
- package/dist/dist/types/theme/NUIProvider.d.ts.map +1 -0
- package/dist/dist/types/theme/useTheme.d.ts.map +1 -0
- package/dist/dist/types/utils/generateid/generateId.d.ts +2 -0
- package/dist/dist/types/utils/generateid/generateId.d.ts.map +1 -0
- package/dist/dist/types/utils/index.d.ts +9 -0
- package/dist/dist/types/utils/index.d.ts.map +1 -0
- package/dist/dist/types/utils/inertmanager/inertManager.d.ts +13 -0
- package/dist/dist/types/utils/inertmanager/inertManager.d.ts.map +1 -0
- package/dist/dist/types/utils/keyboardnav/keyboardNav.d.ts +11 -0
- package/dist/dist/types/utils/keyboardnav/keyboardNav.d.ts.map +1 -0
- package/dist/dist/types/utils/onclickoutside/onClickOutside.d.ts +3 -0
- package/dist/dist/types/utils/onclickoutside/onClickOutside.d.ts.map +1 -0
- package/dist/dist/types/utils/portal/portal.d.ts +4 -0
- package/dist/dist/types/utils/portal/portal.d.ts.map +1 -0
- package/dist/dist/types/utils/restorefocus/restoreFocus.d.ts +8 -0
- package/dist/dist/types/utils/restorefocus/restoreFocus.d.ts.map +1 -0
- package/dist/dist/types/utils/scrolllock/scrollLock.d.ts +11 -0
- package/dist/dist/types/utils/scrolllock/scrollLock.d.ts.map +1 -0
- package/dist/dist/types/utils/trapfocus/trapFocus.d.ts +8 -0
- package/dist/dist/types/utils/trapfocus/trapFocus.d.ts.map +1 -0
- package/dist/dist/utils/generateid/generateId.cjs.map +1 -0
- package/dist/dist/utils/generateid/generateId.js.map +1 -0
- package/dist/dist/utils/inertmanager/inertManager.cjs +2 -0
- package/dist/dist/utils/inertmanager/inertManager.cjs.map +1 -0
- package/dist/dist/utils/inertmanager/inertManager.js +18 -0
- package/dist/dist/utils/inertmanager/inertManager.js.map +1 -0
- package/dist/dist/utils/keyboardnav/keyboardNav.cjs.map +1 -0
- package/dist/dist/utils/keyboardnav/keyboardNav.js.map +1 -0
- package/dist/dist/utils/onclickoutside/onClickOutside.cjs +2 -0
- package/dist/dist/utils/onclickoutside/onClickOutside.cjs.map +1 -0
- package/dist/dist/utils/onclickoutside/onClickOutside.js +11 -0
- package/dist/dist/utils/onclickoutside/onClickOutside.js.map +1 -0
- package/dist/dist/utils/portal/portal.cjs +2 -0
- package/dist/dist/utils/portal/portal.cjs.map +1 -0
- package/dist/dist/utils/portal/portal.js +8 -0
- package/dist/dist/utils/portal/portal.js.map +1 -0
- package/dist/dist/utils/restorefocus/restoreFocus.cjs +2 -0
- package/dist/dist/utils/restorefocus/restoreFocus.cjs.map +1 -0
- package/dist/dist/utils/restorefocus/restoreFocus.js +7 -0
- package/dist/dist/utils/restorefocus/restoreFocus.js.map +1 -0
- package/dist/dist/utils/scrolllock/scrollLock.cjs +2 -0
- package/dist/dist/utils/scrolllock/scrollLock.cjs.map +1 -0
- package/dist/dist/utils/scrolllock/scrollLock.js +12 -0
- package/dist/dist/utils/scrolllock/scrollLock.js.map +1 -0
- package/dist/dist/utils/trapfocus/trapFocus.cjs +3 -0
- package/dist/dist/utils/trapfocus/trapFocus.cjs.map +1 -0
- package/dist/dist/utils/trapfocus/trapFocus.js +14 -0
- package/dist/dist/utils/trapfocus/trapFocus.js.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +118 -107
- package/dist/index.js.map +1 -1
- package/dist/package.json +2 -2
- package/dist/styles/nui.css +1 -1
- 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 +2 -2
- package/dist/components/layout/HStack.cjs.map +0 -1
- package/dist/components/layout/HStack.js.map +0 -1
- package/dist/components/layout/Stack.cjs.map +0 -1
- package/dist/components/layout/Stack.js.map +0 -1
- package/dist/theme/NUIProvider.cjs.map +0 -1
- package/dist/theme/NUIProvider.js.map +0 -1
- package/dist/theme/useTheme.cjs.map +0 -1
- package/dist/theme/useTheme.js.map +0 -1
- package/dist/types/components/layout/HStack.d.ts.map +0 -1
- package/dist/types/components/layout/Stack.d.ts.map +0 -1
- package/dist/types/theme/NUIProvider.d.ts.map +0 -1
- package/dist/types/theme/useTheme.d.ts.map +0 -1
- package/dist/utils/generateid/generateId.cjs.map +0 -1
- package/dist/utils/generateid/generateId.js.map +0 -1
- package/dist/utils/keyboardnav/keyboardNav.cjs.map +0 -1
- package/dist/utils/keyboardnav/keyboardNav.js.map +0 -1
- /package/dist/{components → dist/components}/layout/HStack.cjs +0 -0
- /package/dist/{components → dist/components}/layout/HStack.js +0 -0
- /package/dist/{components → dist/components}/layout/Stack.cjs +0 -0
- /package/dist/{components → dist/components}/layout/Stack.js +0 -0
- /package/dist/{theme → dist/theme}/NUIProvider.cjs +0 -0
- /package/dist/{theme → dist/theme}/NUIProvider.js +0 -0
- /package/dist/{theme → dist/theme}/useTheme.cjs +0 -0
- /package/dist/{theme → dist/theme}/useTheme.js +0 -0
- /package/dist/{types → dist/types}/components/layout/HStack.d.ts +0 -0
- /package/dist/{types → dist/types}/components/layout/Stack.d.ts +0 -0
- /package/dist/{types → dist/types}/theme/NUIProvider.d.ts +0 -0
- /package/dist/{types → dist/types}/theme/useTheme.d.ts +0 -0
- /package/dist/{utils → dist/utils}/generateid/generateId.cjs +0 -0
- /package/dist/{utils → dist/utils}/generateid/generateId.js +0 -0
- /package/dist/{utils → dist/utils}/keyboardnav/keyboardNav.cjs +0 -0
- /package/dist/{utils → dist/utils}/keyboardnav/keyboardNav.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Chip.cjs","sources":["../../../../src/components/chip/Chip.tsx"],"sourcesContent":["/**\r\n * Chip.tsx — FINAL VERSION\r\n * -------------------------\r\n * Features:\r\n * - Removable (optional)\r\n * - Selectable (optional)\r\n * - Sizes: sm, md\r\n * - Icons (left/right)\r\n * - Theme-aware\r\n */\r\n\r\nimport React from 'react';\r\nimport './Chip.css';\r\n\r\nexport interface ChipProps {\r\n children: React.ReactNode;\r\n\r\n /** Removable chip — shows close button */\r\n removable?: boolean;\r\n\r\n /** Selected chip state */\r\n selected?: boolean;\r\n\r\n /** Left icon element */\r\n iconLeft?: React.ReactNode;\r\n\r\n /** Right icon element */\r\n iconRight?: React.ReactNode;\r\n\r\n /** Chip size */\r\n size?: 'sm' | 'md';\r\n\r\n /** Remove handler */\r\n onRemove?: () => void;\r\n\r\n /** Select handler */\r\n onSelect?: () => void;\r\n\r\n className?: string;\r\n}\r\n\r\nexport function Chip({\r\n children,\r\n removable = false,\r\n selected = false,\r\n iconLeft,\r\n iconRight,\r\n size = 'md',\r\n onRemove,\r\n onSelect,\r\n className = '',\r\n}: ChipProps) {\r\n return (\r\n <div\r\n className={[\r\n 'ui-chip',\r\n `ui-chip--${size}`,\r\n selected ? 'selected' : '',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"button\"\r\n tabIndex={0}\r\n onClick={onSelect}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') onSelect?.();\r\n }}\r\n >\r\n {iconLeft && <span className=\"ui-chip-icon-left\">{iconLeft}</span>}\r\n\r\n <span className=\"ui-chip-label\">{children}</span>\r\n\r\n {iconRight && <span className=\"ui-chip-icon-right\">{iconRight}</span>}\r\n\r\n {removable && (\r\n <button\r\n className=\"ui-chip-remove\"\r\n aria-label=\"Remove\"\r\n onClick={(e) => {\r\n e.stopPropagation(); // prevent select\r\n onRemove?.();\r\n }}\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["Chip","children","removable","selected","iconLeft","iconRight","size","onRemove","onSelect","className","jsxs","e","jsx"],"mappings":"+IAyCO,SAASA,EAAK,CACnB,SAAAC,EACA,UAAAC,EAAY,GACZ,SAAAC,EAAW,GACX,SAAAC,EACA,UAAAC,EACA,KAAAC,EAAO,KACP,SAAAC,EACA,SAAAC,EACA,UAAAC,EAAY,EACd,EAAc,CACZ,OACEC,EAAAA,KAAC,MAAA,CACC,UAAW,CACT,UACA,YAAYJ,CAAI,GAChBH,EAAW,WAAa,GACxBM,CAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,EACX,KAAK,SACL,SAAU,EACV,QAASD,EACT,UAAYG,GAAM,EACZA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,MAAKH,IAAA,CAC1C,EAEC,SAAA,CAAAJ,GAAYQ,EAAAA,IAAC,OAAA,CAAK,UAAU,oBAAqB,SAAAR,EAAS,EAE3DQ,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,SAAAX,CAAA,CAAS,EAEzCI,GAAaO,EAAAA,IAAC,OAAA,CAAK,UAAU,qBAAsB,SAAAP,EAAU,EAE7DH,GACCU,EAAAA,IAAC,SAAA,CACC,UAAU,iBACV,aAAW,SACX,QAAUD,GAAM,CACdA,EAAE,gBAAA,EACFJ,IAAA,CACF,EACD,SAAA,GAAA,CAAA,CAED,CAAA,CAAA,CAIR"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsxs as h, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
/* empty css */
|
|
3
|
+
function d({
|
|
4
|
+
children: s,
|
|
5
|
+
removable: o = !1,
|
|
6
|
+
selected: c = !1,
|
|
7
|
+
iconLeft: a,
|
|
8
|
+
iconRight: l,
|
|
9
|
+
size: r = "md",
|
|
10
|
+
onRemove: p,
|
|
11
|
+
onSelect: n,
|
|
12
|
+
className: t = ""
|
|
13
|
+
}) {
|
|
14
|
+
return /* @__PURE__ */ h(
|
|
15
|
+
"div",
|
|
16
|
+
{
|
|
17
|
+
className: [
|
|
18
|
+
"ui-chip",
|
|
19
|
+
`ui-chip--${r}`,
|
|
20
|
+
c ? "selected" : "",
|
|
21
|
+
t
|
|
22
|
+
].filter(Boolean).join(" "),
|
|
23
|
+
role: "button",
|
|
24
|
+
tabIndex: 0,
|
|
25
|
+
onClick: n,
|
|
26
|
+
onKeyDown: (i) => {
|
|
27
|
+
(i.key === "Enter" || i.key === " ") && n?.();
|
|
28
|
+
},
|
|
29
|
+
children: [
|
|
30
|
+
a && /* @__PURE__ */ e("span", { className: "ui-chip-icon-left", children: a }),
|
|
31
|
+
/* @__PURE__ */ e("span", { className: "ui-chip-label", children: s }),
|
|
32
|
+
l && /* @__PURE__ */ e("span", { className: "ui-chip-icon-right", children: l }),
|
|
33
|
+
o && /* @__PURE__ */ e(
|
|
34
|
+
"button",
|
|
35
|
+
{
|
|
36
|
+
className: "ui-chip-remove",
|
|
37
|
+
"aria-label": "Remove",
|
|
38
|
+
onClick: (i) => {
|
|
39
|
+
i.stopPropagation(), p?.();
|
|
40
|
+
},
|
|
41
|
+
children: "×"
|
|
42
|
+
}
|
|
43
|
+
)
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
export {
|
|
49
|
+
d as Chip
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=Chip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Chip.js","sources":["../../../../src/components/chip/Chip.tsx"],"sourcesContent":["/**\r\n * Chip.tsx — FINAL VERSION\r\n * -------------------------\r\n * Features:\r\n * - Removable (optional)\r\n * - Selectable (optional)\r\n * - Sizes: sm, md\r\n * - Icons (left/right)\r\n * - Theme-aware\r\n */\r\n\r\nimport React from 'react';\r\nimport './Chip.css';\r\n\r\nexport interface ChipProps {\r\n children: React.ReactNode;\r\n\r\n /** Removable chip — shows close button */\r\n removable?: boolean;\r\n\r\n /** Selected chip state */\r\n selected?: boolean;\r\n\r\n /** Left icon element */\r\n iconLeft?: React.ReactNode;\r\n\r\n /** Right icon element */\r\n iconRight?: React.ReactNode;\r\n\r\n /** Chip size */\r\n size?: 'sm' | 'md';\r\n\r\n /** Remove handler */\r\n onRemove?: () => void;\r\n\r\n /** Select handler */\r\n onSelect?: () => void;\r\n\r\n className?: string;\r\n}\r\n\r\nexport function Chip({\r\n children,\r\n removable = false,\r\n selected = false,\r\n iconLeft,\r\n iconRight,\r\n size = 'md',\r\n onRemove,\r\n onSelect,\r\n className = '',\r\n}: ChipProps) {\r\n return (\r\n <div\r\n className={[\r\n 'ui-chip',\r\n `ui-chip--${size}`,\r\n selected ? 'selected' : '',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"button\"\r\n tabIndex={0}\r\n onClick={onSelect}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') onSelect?.();\r\n }}\r\n >\r\n {iconLeft && <span className=\"ui-chip-icon-left\">{iconLeft}</span>}\r\n\r\n <span className=\"ui-chip-label\">{children}</span>\r\n\r\n {iconRight && <span className=\"ui-chip-icon-right\">{iconRight}</span>}\r\n\r\n {removable && (\r\n <button\r\n className=\"ui-chip-remove\"\r\n aria-label=\"Remove\"\r\n onClick={(e) => {\r\n e.stopPropagation(); // prevent select\r\n onRemove?.();\r\n }}\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["Chip","children","removable","selected","iconLeft","iconRight","size","onRemove","onSelect","className","jsxs","e","jsx"],"mappings":";;AAyCO,SAASA,EAAK;AAAA,EACnB,UAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,UAAAC,IAAW;AAAA,EACX,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC,IAAY;AACd,GAAc;AACZ,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,YAAYJ,CAAI;AAAA,QAChBH,IAAW,aAAa;AAAA,QACxBM;AAAA,MAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACX,MAAK;AAAA,MACL,UAAU;AAAA,MACV,SAASD;AAAA,MACT,WAAW,CAACG,MAAM;AAChB,SAAIA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,QAAKH,IAAA;AAAA,MAC1C;AAAA,MAEC,UAAA;AAAA,QAAAJ,KAAY,gBAAAQ,EAAC,QAAA,EAAK,WAAU,qBAAqB,UAAAR,GAAS;AAAA,QAE3D,gBAAAQ,EAAC,QAAA,EAAK,WAAU,iBAAiB,UAAAX,EAAA,CAAS;AAAA,QAEzCI,KAAa,gBAAAO,EAAC,QAAA,EAAK,WAAU,sBAAsB,UAAAP,GAAU;AAAA,QAE7DH,KACC,gBAAAU;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,cAAW;AAAA,YACX,SAAS,CAACD,MAAM;AACd,cAAAA,EAAE,gBAAA,GACFJ,IAAA;AAAA,YACF;AAAA,YACD,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),s=require("react");;/* empty css */const O=require("../../utils/generateid/generateId.cjs"),$=require("../../utils/onclickoutside/onClickOutside.cjs");function B({options:n,value:c,defaultValue:k,onChange:C,placeholder:S="Select...",disabled:r=!1,className:q="",emptyMessage:R="No results found",filter:j,leftIcon:f,rightIcon:m,renderOption:w,renderOptionIcon:N}){const x=c!==void 0,[d,u]=s.useState(()=>x&&c?n.find(o=>o.value===c)?.label??"":k?n.find(o=>o.value===k)?.label??"":""),[t,D]=s.useState(!1),[h,v]=s.useState(-1),g=s.useRef(null),y=s.useRef(O.generateId("combobox-list")).current,b=n.filter(e=>j?j(d,e):e.label.toLowerCase().includes(d.toLowerCase())),L=s.useCallback(e=>{C?.(e)},[C]),i=s.useCallback(()=>{r||D(!0)},[r]),l=s.useCallback(()=>{D(!1),v(-1)},[]);s.useEffect(()=>{if(t)return $.onClickOutside(g,l)},[t,l]),s.useEffect(()=>{if(x&&c!==void 0){const e=n.find(o=>o.value===c);u(e?.label||"")}},[x,c,n]);const E=e=>{if(!r)switch(e.key){case"ArrowDown":e.preventDefault(),t||i(),v(o=>Math.min(b.length-1,o+1));break;case"ArrowUp":e.preventDefault(),t||i(),v(o=>Math.max(0,o-1));break;case"Enter":if(t&&h>=0){const o=b[h];u(o.label),L(o.value),l()}break;case"Escape":t&&(e.preventDefault(),l());break}},M=e=>{u(e.label),L(e.value),l()};return a.jsxs("div",{ref:g,className:`ui-combobox ${q}`,children:[a.jsxs("div",{className:"ui-combobox-input-wrapper",children:[f&&a.jsx("span",{className:"ui-combobox-left-icon",children:f}),a.jsx("input",{className:["ui-combobox-input",f&&"has-left-icon",m&&"has-right-icon"].filter(Boolean).join(" "),role:"combobox","aria-expanded":t,"aria-controls":y,placeholder:S,disabled:r,value:d,onFocus:i,onClick:i,onChange:e=>{u(e.target.value),t||i()},onKeyDown:E}),m&&a.jsx("span",{className:"ui-combobox-right-icon",children:m})]}),t&&a.jsx("div",{id:y,role:"listbox",className:"ui-combobox-listbox",children:b.length===0?a.jsx("div",{className:"ui-combobox-empty",children:R}):b.map((e,o)=>{const p=o===h;return a.jsxs("div",{role:"option","aria-selected":p,className:`ui-combobox-option ${p?"active":""}`,onMouseDown:A=>A.preventDefault(),onClick:()=>M(e),children:[N&&a.jsx("span",{className:"ui-combobox-option-icon",children:N(e)}),w?w(e,p):e.label]},e.value)})})]})}exports.Combobox=B;
|
|
2
|
+
//# sourceMappingURL=Combobox.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Combobox.cjs","sources":["../../../../src/components/combobox/Combobox.tsx"],"sourcesContent":["/**\r\n * Combobox.tsx\r\n * Fully WCAG-compliant Combobox integrated with your existing utilities.\r\n */\r\n\r\n/**\r\n * Combobox.tsx\r\n * Now includes:\r\n * - leftIcon (input)\r\n * - rightIcon (input)\r\n * - renderOptionIcon (listbox)\r\n */\r\n/**\r\n * Combobox.tsx\r\n * Fully WCAG-Compliant Combobox with:\r\n * - Icons (input + option)\r\n * - Value→Label mapping fixed\r\n * - Keyboard navigation\r\n * - Click outside to close\r\n * - Controlled/uncontrolled\r\n */\r\n\r\nimport React, {\r\n useState,\r\n useEffect,\r\n useRef,\r\n useCallback,\r\n KeyboardEvent,\r\n} from 'react';\r\n\r\nimport './Combobox.css';\r\n\r\n// USING YOUR EXISTING UTILS\r\nimport { onClickOutside, generateId } from '../../utils/index';\r\n\r\nexport interface ComboboxOption {\r\n label: string;\r\n value: string;\r\n icon?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxProps {\r\n options: ComboboxOption[];\r\n\r\n value?: string;\r\n defaultValue?: string;\r\n onChange?: (value: string) => void;\r\n\r\n placeholder?: string;\r\n disabled?: boolean;\r\n className?: string;\r\n emptyMessage?: string;\r\n\r\n filter?: (input: string, option: ComboboxOption) => boolean;\r\n\r\n leftIcon?: React.ReactNode;\r\n rightIcon?: React.ReactNode;\r\n\r\n renderOption?: (option: ComboboxOption, active: boolean) => React.ReactNode;\r\n renderOptionIcon?: (option: ComboboxOption) => React.ReactNode;\r\n}\r\n\r\nexport function Combobox({\r\n options,\r\n value,\r\n defaultValue,\r\n onChange,\r\n placeholder = 'Select...',\r\n disabled = false,\r\n className = '',\r\n emptyMessage = 'No results found',\r\n filter,\r\n leftIcon,\r\n rightIcon,\r\n renderOption,\r\n renderOptionIcon,\r\n}: ComboboxProps) {\r\n const isControlled = value !== undefined;\r\n\r\n /**\r\n * displayLabel = what the user SEEES in input\r\n * value = actual selected value (sent to parent)\r\n */\r\n const [displayLabel, setDisplayLabel] = useState<string>(() => {\r\n if (isControlled && value) {\r\n const match = options.find((o) => o.value === value);\r\n return match?.label ?? '';\r\n }\r\n if (defaultValue) {\r\n const match = options.find((o) => o.value === defaultValue);\r\n return match?.label ?? '';\r\n }\r\n return '';\r\n });\r\n\r\n const [open, setOpen] = useState(false);\r\n const [activeIndex, setActiveIndex] = useState<number>(-1);\r\n\r\n const wrapperRef = useRef<HTMLDivElement | null>(null);\r\n const listboxId = useRef(generateId('combobox-list')).current;\r\n\r\n /** Filtered options */\r\n const filtered = options.filter((opt) =>\r\n filter\r\n ? filter(displayLabel, opt)\r\n : opt.label.toLowerCase().includes(displayLabel.toLowerCase())\r\n );\r\n\r\n /** Set parent value */\r\n const setValue = useCallback(\r\n (val: string) => {\r\n onChange?.(val);\r\n },\r\n [onChange]\r\n );\r\n\r\n const openList = useCallback(() => {\r\n if (!disabled) setOpen(true);\r\n }, [disabled]);\r\n\r\n const closeList = useCallback(() => {\r\n setOpen(false);\r\n setActiveIndex(-1);\r\n }, []);\r\n\r\n /** Click outside to close */\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(wrapperRef, closeList);\r\n }, [open, closeList]);\r\n\r\n /** Sync controlled (value → label) */\r\n useEffect(() => {\r\n if (isControlled && value !== undefined) {\r\n const found = options.find((o) => o.value === value);\r\n setDisplayLabel(found?.label || '');\r\n }\r\n }, [isControlled, value, options]);\r\n\r\n /** Keyboard behavior */\r\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\r\n if (disabled) return;\r\n\r\n switch (e.key) {\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n if (!open) openList();\r\n setActiveIndex((i) => Math.min(filtered.length - 1, i + 1));\r\n break;\r\n\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n if (!open) openList();\r\n setActiveIndex((i) => Math.max(0, i - 1));\r\n break;\r\n\r\n case 'Enter':\r\n if (open && activeIndex >= 0) {\r\n const opt = filtered[activeIndex];\r\n setDisplayLabel(opt.label);\r\n setValue(opt.value);\r\n closeList();\r\n }\r\n break;\r\n\r\n case 'Escape':\r\n if (open) {\r\n e.preventDefault();\r\n closeList();\r\n }\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n /** Option click */\r\n const onOptionClick = (opt: ComboboxOption) => {\r\n setDisplayLabel(opt.label);\r\n setValue(opt.value);\r\n closeList();\r\n };\r\n\r\n return (\r\n <div ref={wrapperRef} className={`ui-combobox ${className}`}>\r\n {/* Input + Icons */}\r\n <div className=\"ui-combobox-input-wrapper\">\r\n {leftIcon && <span className=\"ui-combobox-left-icon\">{leftIcon}</span>}\r\n\r\n <input\r\n className={[\r\n 'ui-combobox-input',\r\n leftIcon && 'has-left-icon',\r\n rightIcon && 'has-right-icon',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"combobox\"\r\n aria-expanded={open}\r\n aria-controls={listboxId}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n value={displayLabel}\r\n onFocus={openList}\r\n onClick={openList}\r\n onChange={(e) => {\r\n setDisplayLabel(e.target.value);\r\n if (!open) openList();\r\n }}\r\n onKeyDown={onKeyDown}\r\n />\r\n\r\n {rightIcon && (\r\n <span className=\"ui-combobox-right-icon\">{rightIcon}</span>\r\n )}\r\n </div>\r\n\r\n {open && (\r\n <div id={listboxId} role=\"listbox\" className=\"ui-combobox-listbox\">\r\n {filtered.length === 0 ? (\r\n <div className=\"ui-combobox-empty\">{emptyMessage}</div>\r\n ) : (\r\n filtered.map((opt, index) => {\r\n const active = index === activeIndex;\r\n\r\n return (\r\n <div\r\n key={opt.value}\r\n role=\"option\"\r\n aria-selected={active}\r\n className={`ui-combobox-option ${active ? 'active' : ''}`}\r\n onMouseDown={(e) => e.preventDefault()}\r\n onClick={() => onOptionClick(opt)}\r\n >\r\n {/* Option icon (if provided through renderOptionIcon) */}\r\n {renderOptionIcon && (\r\n <span className=\"ui-combobox-option-icon\">\r\n {renderOptionIcon(opt)}\r\n </span>\r\n )}\r\n\r\n {renderOption ? renderOption(opt, active) : opt.label}\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["Combobox","options","value","defaultValue","onChange","placeholder","disabled","className","emptyMessage","filter","leftIcon","rightIcon","renderOption","renderOptionIcon","isControlled","displayLabel","setDisplayLabel","useState","open","setOpen","activeIndex","setActiveIndex","wrapperRef","useRef","listboxId","generateId","filtered","opt","setValue","useCallback","val","openList","closeList","useEffect","onClickOutside","found","onKeyDown","i","onOptionClick","jsxs","jsx","index","active","e"],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { jsxs as v, jsx as i } from "react/jsx-runtime";
|
|
2
|
+
import { useState as k, useRef as M, useCallback as w, useEffect as R } from "react";
|
|
3
|
+
/* empty css */
|
|
4
|
+
import { generateId as U } from "../../utils/generateid/generateId.js";
|
|
5
|
+
import { onClickOutside as q } from "../../utils/onclickoutside/onClickOutside.js";
|
|
6
|
+
function Q({
|
|
7
|
+
options: n,
|
|
8
|
+
value: a,
|
|
9
|
+
defaultValue: N,
|
|
10
|
+
onChange: C,
|
|
11
|
+
placeholder: S = "Select...",
|
|
12
|
+
disabled: l = !1,
|
|
13
|
+
className: $ = "",
|
|
14
|
+
emptyMessage: B = "No results found",
|
|
15
|
+
filter: D,
|
|
16
|
+
leftIcon: b,
|
|
17
|
+
rightIcon: m,
|
|
18
|
+
renderOption: L,
|
|
19
|
+
renderOptionIcon: y
|
|
20
|
+
}) {
|
|
21
|
+
const f = a !== void 0, [d, r] = k(() => f && a ? n.find((o) => o.value === a)?.label ?? "" : N ? n.find((o) => o.value === N)?.label ?? "" : ""), [t, g] = k(!1), [p, x] = k(-1), j = M(null), A = M(U("combobox-list")).current, u = n.filter(
|
|
22
|
+
(e) => D ? D(d, e) : e.label.toLowerCase().includes(d.toLowerCase())
|
|
23
|
+
), E = w(
|
|
24
|
+
(e) => {
|
|
25
|
+
C?.(e);
|
|
26
|
+
},
|
|
27
|
+
[C]
|
|
28
|
+
), c = w(() => {
|
|
29
|
+
l || g(!0);
|
|
30
|
+
}, [l]), s = w(() => {
|
|
31
|
+
g(!1), x(-1);
|
|
32
|
+
}, []);
|
|
33
|
+
R(() => {
|
|
34
|
+
if (t)
|
|
35
|
+
return q(j, s);
|
|
36
|
+
}, [t, s]), R(() => {
|
|
37
|
+
if (f && a !== void 0) {
|
|
38
|
+
const e = n.find((o) => o.value === a);
|
|
39
|
+
r(e?.label || "");
|
|
40
|
+
}
|
|
41
|
+
}, [f, a, n]);
|
|
42
|
+
const F = (e) => {
|
|
43
|
+
if (!l)
|
|
44
|
+
switch (e.key) {
|
|
45
|
+
case "ArrowDown":
|
|
46
|
+
e.preventDefault(), t || c(), x((o) => Math.min(u.length - 1, o + 1));
|
|
47
|
+
break;
|
|
48
|
+
case "ArrowUp":
|
|
49
|
+
e.preventDefault(), t || c(), x((o) => Math.max(0, o - 1));
|
|
50
|
+
break;
|
|
51
|
+
case "Enter":
|
|
52
|
+
if (t && p >= 0) {
|
|
53
|
+
const o = u[p];
|
|
54
|
+
r(o.label), E(o.value), s();
|
|
55
|
+
}
|
|
56
|
+
break;
|
|
57
|
+
case "Escape":
|
|
58
|
+
t && (e.preventDefault(), s());
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}, K = (e) => {
|
|
62
|
+
r(e.label), E(e.value), s();
|
|
63
|
+
};
|
|
64
|
+
return /* @__PURE__ */ v("div", { ref: j, className: `ui-combobox ${$}`, children: [
|
|
65
|
+
/* @__PURE__ */ v("div", { className: "ui-combobox-input-wrapper", children: [
|
|
66
|
+
b && /* @__PURE__ */ i("span", { className: "ui-combobox-left-icon", children: b }),
|
|
67
|
+
/* @__PURE__ */ i(
|
|
68
|
+
"input",
|
|
69
|
+
{
|
|
70
|
+
className: [
|
|
71
|
+
"ui-combobox-input",
|
|
72
|
+
b && "has-left-icon",
|
|
73
|
+
m && "has-right-icon"
|
|
74
|
+
].filter(Boolean).join(" "),
|
|
75
|
+
role: "combobox",
|
|
76
|
+
"aria-expanded": t,
|
|
77
|
+
"aria-controls": A,
|
|
78
|
+
placeholder: S,
|
|
79
|
+
disabled: l,
|
|
80
|
+
value: d,
|
|
81
|
+
onFocus: c,
|
|
82
|
+
onClick: c,
|
|
83
|
+
onChange: (e) => {
|
|
84
|
+
r(e.target.value), t || c();
|
|
85
|
+
},
|
|
86
|
+
onKeyDown: F
|
|
87
|
+
}
|
|
88
|
+
),
|
|
89
|
+
m && /* @__PURE__ */ i("span", { className: "ui-combobox-right-icon", children: m })
|
|
90
|
+
] }),
|
|
91
|
+
t && /* @__PURE__ */ i("div", { id: A, role: "listbox", className: "ui-combobox-listbox", children: u.length === 0 ? /* @__PURE__ */ i("div", { className: "ui-combobox-empty", children: B }) : u.map((e, o) => {
|
|
92
|
+
const h = o === p;
|
|
93
|
+
return /* @__PURE__ */ v(
|
|
94
|
+
"div",
|
|
95
|
+
{
|
|
96
|
+
role: "option",
|
|
97
|
+
"aria-selected": h,
|
|
98
|
+
className: `ui-combobox-option ${h ? "active" : ""}`,
|
|
99
|
+
onMouseDown: (O) => O.preventDefault(),
|
|
100
|
+
onClick: () => K(e),
|
|
101
|
+
children: [
|
|
102
|
+
y && /* @__PURE__ */ i("span", { className: "ui-combobox-option-icon", children: y(e) }),
|
|
103
|
+
L ? L(e, h) : e.label
|
|
104
|
+
]
|
|
105
|
+
},
|
|
106
|
+
e.value
|
|
107
|
+
);
|
|
108
|
+
}) })
|
|
109
|
+
] });
|
|
110
|
+
}
|
|
111
|
+
export {
|
|
112
|
+
Q as Combobox
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=Combobox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Combobox.js","sources":["../../../../src/components/combobox/Combobox.tsx"],"sourcesContent":["/**\r\n * Combobox.tsx\r\n * Fully WCAG-compliant Combobox integrated with your existing utilities.\r\n */\r\n\r\n/**\r\n * Combobox.tsx\r\n * Now includes:\r\n * - leftIcon (input)\r\n * - rightIcon (input)\r\n * - renderOptionIcon (listbox)\r\n */\r\n/**\r\n * Combobox.tsx\r\n * Fully WCAG-Compliant Combobox with:\r\n * - Icons (input + option)\r\n * - Value→Label mapping fixed\r\n * - Keyboard navigation\r\n * - Click outside to close\r\n * - Controlled/uncontrolled\r\n */\r\n\r\nimport React, {\r\n useState,\r\n useEffect,\r\n useRef,\r\n useCallback,\r\n KeyboardEvent,\r\n} from 'react';\r\n\r\nimport './Combobox.css';\r\n\r\n// USING YOUR EXISTING UTILS\r\nimport { onClickOutside, generateId } from '../../utils/index';\r\n\r\nexport interface ComboboxOption {\r\n label: string;\r\n value: string;\r\n icon?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxProps {\r\n options: ComboboxOption[];\r\n\r\n value?: string;\r\n defaultValue?: string;\r\n onChange?: (value: string) => void;\r\n\r\n placeholder?: string;\r\n disabled?: boolean;\r\n className?: string;\r\n emptyMessage?: string;\r\n\r\n filter?: (input: string, option: ComboboxOption) => boolean;\r\n\r\n leftIcon?: React.ReactNode;\r\n rightIcon?: React.ReactNode;\r\n\r\n renderOption?: (option: ComboboxOption, active: boolean) => React.ReactNode;\r\n renderOptionIcon?: (option: ComboboxOption) => React.ReactNode;\r\n}\r\n\r\nexport function Combobox({\r\n options,\r\n value,\r\n defaultValue,\r\n onChange,\r\n placeholder = 'Select...',\r\n disabled = false,\r\n className = '',\r\n emptyMessage = 'No results found',\r\n filter,\r\n leftIcon,\r\n rightIcon,\r\n renderOption,\r\n renderOptionIcon,\r\n}: ComboboxProps) {\r\n const isControlled = value !== undefined;\r\n\r\n /**\r\n * displayLabel = what the user SEEES in input\r\n * value = actual selected value (sent to parent)\r\n */\r\n const [displayLabel, setDisplayLabel] = useState<string>(() => {\r\n if (isControlled && value) {\r\n const match = options.find((o) => o.value === value);\r\n return match?.label ?? '';\r\n }\r\n if (defaultValue) {\r\n const match = options.find((o) => o.value === defaultValue);\r\n return match?.label ?? '';\r\n }\r\n return '';\r\n });\r\n\r\n const [open, setOpen] = useState(false);\r\n const [activeIndex, setActiveIndex] = useState<number>(-1);\r\n\r\n const wrapperRef = useRef<HTMLDivElement | null>(null);\r\n const listboxId = useRef(generateId('combobox-list')).current;\r\n\r\n /** Filtered options */\r\n const filtered = options.filter((opt) =>\r\n filter\r\n ? filter(displayLabel, opt)\r\n : opt.label.toLowerCase().includes(displayLabel.toLowerCase())\r\n );\r\n\r\n /** Set parent value */\r\n const setValue = useCallback(\r\n (val: string) => {\r\n onChange?.(val);\r\n },\r\n [onChange]\r\n );\r\n\r\n const openList = useCallback(() => {\r\n if (!disabled) setOpen(true);\r\n }, [disabled]);\r\n\r\n const closeList = useCallback(() => {\r\n setOpen(false);\r\n setActiveIndex(-1);\r\n }, []);\r\n\r\n /** Click outside to close */\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(wrapperRef, closeList);\r\n }, [open, closeList]);\r\n\r\n /** Sync controlled (value → label) */\r\n useEffect(() => {\r\n if (isControlled && value !== undefined) {\r\n const found = options.find((o) => o.value === value);\r\n setDisplayLabel(found?.label || '');\r\n }\r\n }, [isControlled, value, options]);\r\n\r\n /** Keyboard behavior */\r\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\r\n if (disabled) return;\r\n\r\n switch (e.key) {\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n if (!open) openList();\r\n setActiveIndex((i) => Math.min(filtered.length - 1, i + 1));\r\n break;\r\n\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n if (!open) openList();\r\n setActiveIndex((i) => Math.max(0, i - 1));\r\n break;\r\n\r\n case 'Enter':\r\n if (open && activeIndex >= 0) {\r\n const opt = filtered[activeIndex];\r\n setDisplayLabel(opt.label);\r\n setValue(opt.value);\r\n closeList();\r\n }\r\n break;\r\n\r\n case 'Escape':\r\n if (open) {\r\n e.preventDefault();\r\n closeList();\r\n }\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n /** Option click */\r\n const onOptionClick = (opt: ComboboxOption) => {\r\n setDisplayLabel(opt.label);\r\n setValue(opt.value);\r\n closeList();\r\n };\r\n\r\n return (\r\n <div ref={wrapperRef} className={`ui-combobox ${className}`}>\r\n {/* Input + Icons */}\r\n <div className=\"ui-combobox-input-wrapper\">\r\n {leftIcon && <span className=\"ui-combobox-left-icon\">{leftIcon}</span>}\r\n\r\n <input\r\n className={[\r\n 'ui-combobox-input',\r\n leftIcon && 'has-left-icon',\r\n rightIcon && 'has-right-icon',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"combobox\"\r\n aria-expanded={open}\r\n aria-controls={listboxId}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n value={displayLabel}\r\n onFocus={openList}\r\n onClick={openList}\r\n onChange={(e) => {\r\n setDisplayLabel(e.target.value);\r\n if (!open) openList();\r\n }}\r\n onKeyDown={onKeyDown}\r\n />\r\n\r\n {rightIcon && (\r\n <span className=\"ui-combobox-right-icon\">{rightIcon}</span>\r\n )}\r\n </div>\r\n\r\n {open && (\r\n <div id={listboxId} role=\"listbox\" className=\"ui-combobox-listbox\">\r\n {filtered.length === 0 ? (\r\n <div className=\"ui-combobox-empty\">{emptyMessage}</div>\r\n ) : (\r\n filtered.map((opt, index) => {\r\n const active = index === activeIndex;\r\n\r\n return (\r\n <div\r\n key={opt.value}\r\n role=\"option\"\r\n aria-selected={active}\r\n className={`ui-combobox-option ${active ? 'active' : ''}`}\r\n onMouseDown={(e) => e.preventDefault()}\r\n onClick={() => onOptionClick(opt)}\r\n >\r\n {/* Option icon (if provided through renderOptionIcon) */}\r\n {renderOptionIcon && (\r\n <span className=\"ui-combobox-option-icon\">\r\n {renderOptionIcon(opt)}\r\n </span>\r\n )}\r\n\r\n {renderOption ? renderOption(opt, active) : opt.label}\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["Combobox","options","value","defaultValue","onChange","placeholder","disabled","className","emptyMessage","filter","leftIcon","rightIcon","renderOption","renderOptionIcon","isControlled","displayLabel","setDisplayLabel","useState","open","setOpen","activeIndex","setActiveIndex","wrapperRef","useRef","listboxId","generateId","filtered","opt","setValue","useCallback","val","openList","closeList","useEffect","onClickOutside","found","onKeyDown","i","onOptionClick","jsxs","jsx","index","active","e"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),c=require("react");;/* empty css */const w=require("../../utils/onclickoutside/onClickOutside.cjs"),E=require("../../utils/portal/portal.cjs");function g({sections:y,placeholder:j="Search commands…",className:N=""}){const[r,a]=c.useState(!1),[m,f]=c.useState(""),[o,v]=c.useState({section:0,index:0}),p=c.useRef(null),h=c.useRef(null);c.useEffect(()=>{const e=t=>{(navigator.platform.toLowerCase().includes("mac")?t.metaKey:t.ctrlKey)&&t.key.toLowerCase()==="k"&&(t.preventDefault(),a(u=>!u))};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[]),c.useEffect(()=>{if(!r)return;const e=t=>{t.key==="Escape"&&a(!1)};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[r]),c.useEffect(()=>{if(r)return w.onClickOutside(p,()=>a(!1))},[r]),c.useEffect(()=>{r&&(setTimeout(()=>h.current?.focus(),0),f(""))},[r]);const d=y.map(e=>({...e,items:e.items.filter(t=>t.label.toLowerCase().includes(m.toLowerCase()))})),l=d.flatMap((e,t)=>e.items.map((n,i)=>({section:t,index:i}))),x=e=>{if(l.length===0)return;let n=l.findIndex(i=>i.section===o.section&&i.index===o.index)+e;n<0&&(n=l.length-1),n>=l.length&&(n=0),v(l[n])},k=e=>{const t=e.key;if(t==="ArrowDown")e.preventDefault(),x(1);else if(t==="ArrowUp")e.preventDefault(),x(-1);else if(t==="Enter"){e.preventDefault();const i=d[o.section]?.items[o.index];i&&i.onSelect&&(i.onSelect(),a(!1))}};return r?s.jsxs(E.Portal,{children:[s.jsx("div",{className:"ui-cmd-overlay"}),s.jsxs("div",{ref:p,className:`ui-cmd ${N}`,role:"dialog","aria-modal":"true",onKeyDown:k,children:[s.jsx("input",{ref:h,className:"ui-cmd-input",placeholder:j,value:m,onChange:e=>f(e.target.value)}),s.jsx("div",{className:"ui-cmd-list",children:d.map((e,t)=>s.jsxs("div",{className:"ui-cmd-section",children:[e.title&&s.jsx("div",{className:"ui-cmd-section-title",children:e.title}),e.items.length===0?s.jsx("div",{className:"ui-cmd-empty",children:"No results"}):e.items.map((n,i)=>{const u=o.section===t&&o.index===i;return s.jsxs("div",{className:`ui-cmd-item ${u?"active":""}`,onMouseEnter:()=>v({section:t,index:i}),onClick:()=>{n.onSelect?.(),a(!1)},children:[n.icon&&s.jsx("span",{className:"ui-cmd-icon",children:n.icon}),s.jsxs("div",{className:"ui-cmd-meta",children:[s.jsx("div",{className:"ui-cmd-label",children:n.label}),n.description&&s.jsx("div",{className:"ui-cmd-description",children:n.description})]}),n.shortcut&&s.jsx("span",{className:"ui-cmd-shortcut",children:n.shortcut})]},n.id)})]},t))})]})]}):null}exports.CommandPalette=g;
|
|
2
|
+
//# sourceMappingURL=CommandPalette.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPalette.cjs","sources":["../../../../src/components/commandpalette/CommandPalette.tsx"],"sourcesContent":["/**\r\n * CommandPalette.tsx — FINAL VERSION\r\n * -----------------------------------\r\n * Full-featured Cmd+K command menu.\r\n * - Cmd+K / Ctrl+K global shortcut\r\n * - Search filter\r\n * - Keyboard navigation\r\n * - Portal + overlay\r\n * - Sections\r\n * - ARIA-compliant\r\n */\r\n\r\nimport {\r\n useEffect,\r\n useRef,\r\n useState,\r\n ReactNode,\r\n KeyboardEvent as ReactKeyboardEvent,\r\n} from 'react';\r\nimport './CommandPalette.css';\r\nimport { Portal, onClickOutside} from '../../utils/index';\r\n\r\nexport interface CommandItem {\r\n id: string;\r\n label: string;\r\n icon?: ReactNode;\r\n shortcut?: string;\r\n description?: string;\r\n onSelect?: () => void;\r\n}\r\n\r\nexport interface CommandSection {\r\n title?: string;\r\n items: CommandItem[];\r\n}\r\n\r\ninterface CommandPaletteProps {\r\n sections: CommandSection[];\r\n placeholder?: string;\r\n className?: string;\r\n}\r\n\r\nexport function CommandPalette({\r\n sections,\r\n placeholder = 'Search commands…',\r\n className = '',\r\n}: CommandPaletteProps) {\r\n const [open, setOpen] = useState(false);\r\n const [query, setQuery] = useState('');\r\n const [active, setActive] = useState<{ section: number; index: number }>({\r\n section: 0,\r\n index: 0,\r\n });\r\n\r\n const paletteRef = useRef<HTMLDivElement | null>(null);\r\n const inputRef = useRef<HTMLInputElement | null>(null);\r\n\r\n /** Global Cmd+K shortcut */\r\n useEffect(() => {\r\n const handler = (e: globalThis.KeyboardEvent) => {\r\n const isMac = navigator.platform.toLowerCase().includes('mac');\r\n const cmd = isMac ? e.metaKey : e.ctrlKey;\r\n\r\n if (cmd && e.key.toLowerCase() === 'k') {\r\n e.preventDefault();\r\n setOpen((o) => !o);\r\n }\r\n };\r\n\r\n document.addEventListener('keydown', handler as EventListener);\r\n return () =>\r\n document.removeEventListener('keydown', handler as EventListener);\r\n }, []);\r\n\r\n /** Close on ESC */\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const handler = (e: globalThis.KeyboardEvent) => {\r\n if (e.key === 'Escape') setOpen(false);\r\n };\r\n\r\n document.addEventListener('keydown', handler as EventListener);\r\n return () =>\r\n document.removeEventListener('keydown', handler as EventListener);\r\n }, [open]);\r\n\r\n /** Click outside to close */\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(paletteRef, () => setOpen(false));\r\n }, [open]);\r\n\r\n /** Autofocus search when opened */\r\n useEffect(() => {\r\n if (open) {\r\n setTimeout(() => inputRef.current?.focus(), 0);\r\n setQuery('');\r\n }\r\n }, [open]);\r\n\r\n /** Filtered list */\r\n const filteredSections = sections.map((sec) => ({\r\n ...sec,\r\n items: sec.items.filter((i) =>\r\n i.label.toLowerCase().includes(query.toLowerCase())\r\n ),\r\n }));\r\n\r\n /** Flatten for easier navigation */\r\n const flatList = filteredSections.flatMap((sec, sIdx) =>\r\n sec.items.map((_, iIdx) => ({ section: sIdx, index: iIdx }))\r\n );\r\n\r\n /** Handle keyboard navigation */\r\n const move = (dir: 1 | -1) => {\r\n if (flatList.length === 0) return;\r\n\r\n const currentIndex = flatList.findIndex(\r\n (x) => x.section === active.section && x.index === active.index\r\n );\r\n\r\n let next = currentIndex + dir;\r\n if (next < 0) next = flatList.length - 1;\r\n if (next >= flatList.length) next = 0;\r\n\r\n setActive(flatList[next]);\r\n };\r\n\r\n const handleKey = (e: ReactKeyboardEvent<HTMLDivElement>) => {\r\n const key = e.key;\r\n\r\n if (key === 'ArrowDown') {\r\n e.preventDefault();\r\n move(1);\r\n } else if (key === 'ArrowUp') {\r\n e.preventDefault();\r\n move(-1);\r\n } else if (key === 'Enter') {\r\n e.preventDefault();\r\n\r\n const sec = filteredSections[active.section];\r\n const item = sec?.items[active.index];\r\n\r\n if (item && item.onSelect) {\r\n item.onSelect();\r\n setOpen(false);\r\n }\r\n }\r\n };\r\n\r\n if (!open) return null;\r\n\r\n return (\r\n <Portal>\r\n <div className=\"ui-cmd-overlay\" />\r\n\r\n <div\r\n ref={paletteRef}\r\n className={`ui-cmd ${className}`}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n onKeyDown={handleKey}\r\n >\r\n {/* Search bar */}\r\n <input\r\n ref={inputRef}\r\n className=\"ui-cmd-input\"\r\n placeholder={placeholder}\r\n value={query}\r\n onChange={(e) => setQuery(e.target.value)}\r\n />\r\n\r\n <div className=\"ui-cmd-list\">\r\n {filteredSections.map((sec, sIdx) => (\r\n <div key={sIdx} className=\"ui-cmd-section\">\r\n {sec.title && (\r\n <div className=\"ui-cmd-section-title\">{sec.title}</div>\r\n )}\r\n\r\n {sec.items.length === 0 ? (\r\n <div className=\"ui-cmd-empty\">No results</div>\r\n ) : (\r\n sec.items.map((item, iIdx) => {\r\n const isActive =\r\n active.section === sIdx && active.index === iIdx;\r\n\r\n return (\r\n <div\r\n key={item.id}\r\n className={`ui-cmd-item ${isActive ? 'active' : ''}`}\r\n onMouseEnter={() =>\r\n setActive({ section: sIdx, index: iIdx })\r\n }\r\n onClick={() => {\r\n item.onSelect?.();\r\n setOpen(false);\r\n }}\r\n >\r\n {item.icon && (\r\n <span className=\"ui-cmd-icon\">{item.icon}</span>\r\n )}\r\n\r\n <div className=\"ui-cmd-meta\">\r\n <div className=\"ui-cmd-label\">{item.label}</div>\r\n {item.description && (\r\n <div className=\"ui-cmd-description\">\r\n {item.description}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {item.shortcut && (\r\n <span className=\"ui-cmd-shortcut\">{item.shortcut}</span>\r\n )}\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </Portal>\r\n );\r\n}\r\n"],"names":["CommandPalette","sections","placeholder","className","open","setOpen","useState","query","setQuery","active","setActive","paletteRef","useRef","inputRef","useEffect","handler","e","o","onClickOutside","filteredSections","sec","i","flatList","sIdx","_","iIdx","move","dir","next","x","handleKey","key","item","Portal","jsx","jsxs","isActive"],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { jsxs as l, jsx as c } from "react/jsx-runtime";
|
|
2
|
+
import { useState as f, useRef as k, useEffect as d } from "react";
|
|
3
|
+
/* empty css */
|
|
4
|
+
import { onClickOutside as E } from "../../utils/onclickoutside/onClickOutside.js";
|
|
5
|
+
import { Portal as D } from "../../utils/portal/portal.js";
|
|
6
|
+
function R({
|
|
7
|
+
sections: x,
|
|
8
|
+
placeholder: L = "Search commands…",
|
|
9
|
+
className: g = ""
|
|
10
|
+
}) {
|
|
11
|
+
const [s, r] = f(!1), [p, v] = f(""), [o, h] = f({
|
|
12
|
+
section: 0,
|
|
13
|
+
index: 0
|
|
14
|
+
}), y = k(null), N = k(null);
|
|
15
|
+
d(() => {
|
|
16
|
+
const e = (t) => {
|
|
17
|
+
(navigator.platform.toLowerCase().includes("mac") ? t.metaKey : t.ctrlKey) && t.key.toLowerCase() === "k" && (t.preventDefault(), r((u) => !u));
|
|
18
|
+
};
|
|
19
|
+
return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
|
|
20
|
+
}, []), d(() => {
|
|
21
|
+
if (!s) return;
|
|
22
|
+
const e = (t) => {
|
|
23
|
+
t.key === "Escape" && r(!1);
|
|
24
|
+
};
|
|
25
|
+
return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
|
|
26
|
+
}, [s]), d(() => {
|
|
27
|
+
if (s)
|
|
28
|
+
return E(y, () => r(!1));
|
|
29
|
+
}, [s]), d(() => {
|
|
30
|
+
s && (setTimeout(() => N.current?.focus(), 0), v(""));
|
|
31
|
+
}, [s]);
|
|
32
|
+
const m = x.map((e) => ({
|
|
33
|
+
...e,
|
|
34
|
+
items: e.items.filter(
|
|
35
|
+
(t) => t.label.toLowerCase().includes(p.toLowerCase())
|
|
36
|
+
)
|
|
37
|
+
})), a = m.flatMap(
|
|
38
|
+
(e, t) => e.items.map((n, i) => ({ section: t, index: i }))
|
|
39
|
+
), w = (e) => {
|
|
40
|
+
if (a.length === 0) return;
|
|
41
|
+
let n = a.findIndex(
|
|
42
|
+
(i) => i.section === o.section && i.index === o.index
|
|
43
|
+
) + e;
|
|
44
|
+
n < 0 && (n = a.length - 1), n >= a.length && (n = 0), h(a[n]);
|
|
45
|
+
}, C = (e) => {
|
|
46
|
+
const t = e.key;
|
|
47
|
+
if (t === "ArrowDown")
|
|
48
|
+
e.preventDefault(), w(1);
|
|
49
|
+
else if (t === "ArrowUp")
|
|
50
|
+
e.preventDefault(), w(-1);
|
|
51
|
+
else if (t === "Enter") {
|
|
52
|
+
e.preventDefault();
|
|
53
|
+
const i = m[o.section]?.items[o.index];
|
|
54
|
+
i && i.onSelect && (i.onSelect(), r(!1));
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
return s ? /* @__PURE__ */ l(D, { children: [
|
|
58
|
+
/* @__PURE__ */ c("div", { className: "ui-cmd-overlay" }),
|
|
59
|
+
/* @__PURE__ */ l(
|
|
60
|
+
"div",
|
|
61
|
+
{
|
|
62
|
+
ref: y,
|
|
63
|
+
className: `ui-cmd ${g}`,
|
|
64
|
+
role: "dialog",
|
|
65
|
+
"aria-modal": "true",
|
|
66
|
+
onKeyDown: C,
|
|
67
|
+
children: [
|
|
68
|
+
/* @__PURE__ */ c(
|
|
69
|
+
"input",
|
|
70
|
+
{
|
|
71
|
+
ref: N,
|
|
72
|
+
className: "ui-cmd-input",
|
|
73
|
+
placeholder: L,
|
|
74
|
+
value: p,
|
|
75
|
+
onChange: (e) => v(e.target.value)
|
|
76
|
+
}
|
|
77
|
+
),
|
|
78
|
+
/* @__PURE__ */ c("div", { className: "ui-cmd-list", children: m.map((e, t) => /* @__PURE__ */ l("div", { className: "ui-cmd-section", children: [
|
|
79
|
+
e.title && /* @__PURE__ */ c("div", { className: "ui-cmd-section-title", children: e.title }),
|
|
80
|
+
e.items.length === 0 ? /* @__PURE__ */ c("div", { className: "ui-cmd-empty", children: "No results" }) : e.items.map((n, i) => {
|
|
81
|
+
const u = o.section === t && o.index === i;
|
|
82
|
+
return /* @__PURE__ */ l(
|
|
83
|
+
"div",
|
|
84
|
+
{
|
|
85
|
+
className: `ui-cmd-item ${u ? "active" : ""}`,
|
|
86
|
+
onMouseEnter: () => h({ section: t, index: i }),
|
|
87
|
+
onClick: () => {
|
|
88
|
+
n.onSelect?.(), r(!1);
|
|
89
|
+
},
|
|
90
|
+
children: [
|
|
91
|
+
n.icon && /* @__PURE__ */ c("span", { className: "ui-cmd-icon", children: n.icon }),
|
|
92
|
+
/* @__PURE__ */ l("div", { className: "ui-cmd-meta", children: [
|
|
93
|
+
/* @__PURE__ */ c("div", { className: "ui-cmd-label", children: n.label }),
|
|
94
|
+
n.description && /* @__PURE__ */ c("div", { className: "ui-cmd-description", children: n.description })
|
|
95
|
+
] }),
|
|
96
|
+
n.shortcut && /* @__PURE__ */ c("span", { className: "ui-cmd-shortcut", children: n.shortcut })
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
n.id
|
|
100
|
+
);
|
|
101
|
+
})
|
|
102
|
+
] }, t)) })
|
|
103
|
+
]
|
|
104
|
+
}
|
|
105
|
+
)
|
|
106
|
+
] }) : null;
|
|
107
|
+
}
|
|
108
|
+
export {
|
|
109
|
+
R as CommandPalette
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=CommandPalette.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPalette.js","sources":["../../../../src/components/commandpalette/CommandPalette.tsx"],"sourcesContent":["/**\r\n * CommandPalette.tsx — FINAL VERSION\r\n * -----------------------------------\r\n * Full-featured Cmd+K command menu.\r\n * - Cmd+K / Ctrl+K global shortcut\r\n * - Search filter\r\n * - Keyboard navigation\r\n * - Portal + overlay\r\n * - Sections\r\n * - ARIA-compliant\r\n */\r\n\r\nimport {\r\n useEffect,\r\n useRef,\r\n useState,\r\n ReactNode,\r\n KeyboardEvent as ReactKeyboardEvent,\r\n} from 'react';\r\nimport './CommandPalette.css';\r\nimport { Portal, onClickOutside} from '../../utils/index';\r\n\r\nexport interface CommandItem {\r\n id: string;\r\n label: string;\r\n icon?: ReactNode;\r\n shortcut?: string;\r\n description?: string;\r\n onSelect?: () => void;\r\n}\r\n\r\nexport interface CommandSection {\r\n title?: string;\r\n items: CommandItem[];\r\n}\r\n\r\ninterface CommandPaletteProps {\r\n sections: CommandSection[];\r\n placeholder?: string;\r\n className?: string;\r\n}\r\n\r\nexport function CommandPalette({\r\n sections,\r\n placeholder = 'Search commands…',\r\n className = '',\r\n}: CommandPaletteProps) {\r\n const [open, setOpen] = useState(false);\r\n const [query, setQuery] = useState('');\r\n const [active, setActive] = useState<{ section: number; index: number }>({\r\n section: 0,\r\n index: 0,\r\n });\r\n\r\n const paletteRef = useRef<HTMLDivElement | null>(null);\r\n const inputRef = useRef<HTMLInputElement | null>(null);\r\n\r\n /** Global Cmd+K shortcut */\r\n useEffect(() => {\r\n const handler = (e: globalThis.KeyboardEvent) => {\r\n const isMac = navigator.platform.toLowerCase().includes('mac');\r\n const cmd = isMac ? e.metaKey : e.ctrlKey;\r\n\r\n if (cmd && e.key.toLowerCase() === 'k') {\r\n e.preventDefault();\r\n setOpen((o) => !o);\r\n }\r\n };\r\n\r\n document.addEventListener('keydown', handler as EventListener);\r\n return () =>\r\n document.removeEventListener('keydown', handler as EventListener);\r\n }, []);\r\n\r\n /** Close on ESC */\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const handler = (e: globalThis.KeyboardEvent) => {\r\n if (e.key === 'Escape') setOpen(false);\r\n };\r\n\r\n document.addEventListener('keydown', handler as EventListener);\r\n return () =>\r\n document.removeEventListener('keydown', handler as EventListener);\r\n }, [open]);\r\n\r\n /** Click outside to close */\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(paletteRef, () => setOpen(false));\r\n }, [open]);\r\n\r\n /** Autofocus search when opened */\r\n useEffect(() => {\r\n if (open) {\r\n setTimeout(() => inputRef.current?.focus(), 0);\r\n setQuery('');\r\n }\r\n }, [open]);\r\n\r\n /** Filtered list */\r\n const filteredSections = sections.map((sec) => ({\r\n ...sec,\r\n items: sec.items.filter((i) =>\r\n i.label.toLowerCase().includes(query.toLowerCase())\r\n ),\r\n }));\r\n\r\n /** Flatten for easier navigation */\r\n const flatList = filteredSections.flatMap((sec, sIdx) =>\r\n sec.items.map((_, iIdx) => ({ section: sIdx, index: iIdx }))\r\n );\r\n\r\n /** Handle keyboard navigation */\r\n const move = (dir: 1 | -1) => {\r\n if (flatList.length === 0) return;\r\n\r\n const currentIndex = flatList.findIndex(\r\n (x) => x.section === active.section && x.index === active.index\r\n );\r\n\r\n let next = currentIndex + dir;\r\n if (next < 0) next = flatList.length - 1;\r\n if (next >= flatList.length) next = 0;\r\n\r\n setActive(flatList[next]);\r\n };\r\n\r\n const handleKey = (e: ReactKeyboardEvent<HTMLDivElement>) => {\r\n const key = e.key;\r\n\r\n if (key === 'ArrowDown') {\r\n e.preventDefault();\r\n move(1);\r\n } else if (key === 'ArrowUp') {\r\n e.preventDefault();\r\n move(-1);\r\n } else if (key === 'Enter') {\r\n e.preventDefault();\r\n\r\n const sec = filteredSections[active.section];\r\n const item = sec?.items[active.index];\r\n\r\n if (item && item.onSelect) {\r\n item.onSelect();\r\n setOpen(false);\r\n }\r\n }\r\n };\r\n\r\n if (!open) return null;\r\n\r\n return (\r\n <Portal>\r\n <div className=\"ui-cmd-overlay\" />\r\n\r\n <div\r\n ref={paletteRef}\r\n className={`ui-cmd ${className}`}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n onKeyDown={handleKey}\r\n >\r\n {/* Search bar */}\r\n <input\r\n ref={inputRef}\r\n className=\"ui-cmd-input\"\r\n placeholder={placeholder}\r\n value={query}\r\n onChange={(e) => setQuery(e.target.value)}\r\n />\r\n\r\n <div className=\"ui-cmd-list\">\r\n {filteredSections.map((sec, sIdx) => (\r\n <div key={sIdx} className=\"ui-cmd-section\">\r\n {sec.title && (\r\n <div className=\"ui-cmd-section-title\">{sec.title}</div>\r\n )}\r\n\r\n {sec.items.length === 0 ? (\r\n <div className=\"ui-cmd-empty\">No results</div>\r\n ) : (\r\n sec.items.map((item, iIdx) => {\r\n const isActive =\r\n active.section === sIdx && active.index === iIdx;\r\n\r\n return (\r\n <div\r\n key={item.id}\r\n className={`ui-cmd-item ${isActive ? 'active' : ''}`}\r\n onMouseEnter={() =>\r\n setActive({ section: sIdx, index: iIdx })\r\n }\r\n onClick={() => {\r\n item.onSelect?.();\r\n setOpen(false);\r\n }}\r\n >\r\n {item.icon && (\r\n <span className=\"ui-cmd-icon\">{item.icon}</span>\r\n )}\r\n\r\n <div className=\"ui-cmd-meta\">\r\n <div className=\"ui-cmd-label\">{item.label}</div>\r\n {item.description && (\r\n <div className=\"ui-cmd-description\">\r\n {item.description}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {item.shortcut && (\r\n <span className=\"ui-cmd-shortcut\">{item.shortcut}</span>\r\n )}\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </Portal>\r\n );\r\n}\r\n"],"names":["CommandPalette","sections","placeholder","className","open","setOpen","useState","query","setQuery","active","setActive","paletteRef","useRef","inputRef","useEffect","handler","e","o","onClickOutside","filteredSections","sec","i","flatList","sIdx","_","iIdx","move","dir","next","x","handleKey","key","item","Portal","jsx","jsxs","isActive"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),o=require("react");;/* empty css */const E=require("../../utils/onclickoutside/onClickOutside.cjs"),g=require("../../utils/portal/portal.cjs");function w({trigger:x,items:r,className:v=""}){const[l,a]=o.useState(!1),[c,b]=o.useState(null),d=o.useRef(null),[u,i]=o.useState(0),h=e=>{e.preventDefault(),b({top:e.clientY,left:e.clientX}),a(!0),i(f())},f=()=>r.findIndex(e=>e.type!=="separator"&&!e.disabled),y=()=>{for(let e=r.length-1;e>=0;e--){const n=r[e];if(n.type!=="separator"&&!n.disabled)return e}return 0},p=e=>{let n=u;for(;;){n=n+e,n<0&&(n=r.length-1),n>=r.length&&(n=0);const t=r[n];if(t.type!=="separator"&&!t.disabled){i(n);break}}},j=e=>{const{key:n}=e;if(n==="ArrowDown")e.preventDefault(),p(1);else if(n==="ArrowUp")e.preventDefault(),p(-1);else if(n==="Home")e.preventDefault(),i(f());else if(n==="End")e.preventDefault(),i(y());else if(n==="Enter"||n===" "){e.preventDefault();const t=r[u];t&&!t.disabled&&t.onSelect&&(t.onSelect(),a(!1))}};return o.useEffect(()=>{if(!l)return;const e=n=>{n.key==="Escape"&&a(!1)};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[l]),o.useEffect(()=>{if(l)return E.onClickOutside(d,()=>a(!1))},[l]),s.jsxs("div",{className:"ui-contextmenu-wrapper",children:[s.jsx("div",{onContextMenu:h,children:x}),l&&c&&s.jsx(g.Portal,{children:s.jsx("div",{ref:d,className:`ui-contextmenu ${v}`,role:"menu",tabIndex:-1,style:{top:c.top,left:c.left,position:"fixed"},onKeyDown:j,children:r.map((e,n)=>{if(e.type==="separator")return s.jsx("div",{className:"ui-contextmenu-separator"},n);const t=n===u;return s.jsxs("div",{className:["ui-contextmenu-item",e.disabled?"disabled":"",e.danger?"danger":"",t?"active":""].filter(Boolean).join(" "),role:"menuitem",tabIndex:-1,"aria-disabled":e.disabled||void 0,onMouseEnter:()=>i(n),onClick:()=>{e.disabled||(e.onSelect?.(),a(!1))},children:[e.icon&&s.jsx("span",{className:"ui-contextmenu-icon",children:e.icon}),s.jsx("span",{children:e.label})]},n)})})})]})}exports.ContextMenu=w;
|
|
2
|
+
//# sourceMappingURL=ContextMenu.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextMenu.cjs","sources":["../../../../src/components/contextmenu/ContextMenu.tsx"],"sourcesContent":["/**\r\n * ContextMenu.tsx — FINAL VERSION\r\n * --------------------------------\r\n * Features:\r\n * - Right-click (contextmenu)\r\n * - Arrow key navigation\r\n * - Roving tabIndex\r\n * - ESC + click outside to close\r\n * - Portal rendering\r\n * - Separators + icons + danger items\r\n */\r\n/**\r\n * ContextMenu.tsx — FINAL CLEAN VERSION\r\n * --------------------------------------\r\n * Features:\r\n * - Right-click context menu\r\n * - Keyboard navigation (ArrowUp/Down, Home, End, Enter)\r\n * - ESC + click outside to close\r\n * - Roving active index\r\n * - Portal rendering\r\n * - Separators + icons + danger/disabled\r\n * - 100% TypeScript safe\r\n */\r\n\r\nimport React, {\r\n useEffect,\r\n useRef,\r\n useState,\r\n ReactNode,\r\n KeyboardEvent as ReactKeyboardEvent,\r\n} from 'react';\r\nimport './ContextMenu.css';\r\nimport { Portal, onClickOutside } from '../../utils/index';\r\n\r\nexport interface MenuItem {\r\n label?: string;\r\n icon?: ReactNode;\r\n onSelect?: () => void;\r\n danger?: boolean;\r\n disabled?: boolean;\r\n type?: 'item' | 'separator';\r\n}\r\n\r\ninterface ContextMenuProps {\r\n trigger: ReactNode;\r\n items: MenuItem[];\r\n className?: string;\r\n}\r\n\r\nexport function ContextMenu({\r\n trigger,\r\n items,\r\n className = '',\r\n}: ContextMenuProps) {\r\n const [open, setOpen] = useState(false);\r\n const [pos, setPos] = useState<{ top: number; left: number } | null>(null);\r\n\r\n const menuRef = useRef<HTMLDivElement | null>(null);\r\n\r\n // active index for keyboard navigation\r\n const [activeIndex, setActiveIndex] = useState<number>(0);\r\n\r\n const handleContext = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n setPos({ top: e.clientY, left: e.clientX });\r\n setOpen(true);\r\n setActiveIndex(getFirstEnabledIndex());\r\n };\r\n\r\n /** Returns index of first enabled, non-separator item */\r\n const getFirstEnabledIndex = () => {\r\n return items.findIndex((i) => i.type !== 'separator' && !i.disabled);\r\n };\r\n\r\n /** Returns index of last enabled, non-separator item */\r\n const getLastEnabledIndex = () => {\r\n for (let i = items.length - 1; i >= 0; i--) {\r\n const it = items[i];\r\n if (it.type !== 'separator' && !it.disabled) return i;\r\n }\r\n return 0;\r\n };\r\n\r\n /** Move selection up/down */\r\n const move = (direction: 1 | -1) => {\r\n let idx = activeIndex;\r\n\r\n while (true) {\r\n idx = idx + direction;\r\n\r\n if (idx < 0) idx = items.length - 1;\r\n if (idx >= items.length) idx = 0;\r\n\r\n const it = items[idx];\r\n if (it.type !== 'separator' && !it.disabled) {\r\n setActiveIndex(idx);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n /** Keyboard events inside menu */\r\n const handleKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>) => {\r\n const { key } = e;\r\n\r\n if (key === 'ArrowDown') {\r\n e.preventDefault();\r\n move(1);\r\n } else if (key === 'ArrowUp') {\r\n e.preventDefault();\r\n move(-1);\r\n } else if (key === 'Home') {\r\n e.preventDefault();\r\n setActiveIndex(getFirstEnabledIndex());\r\n } else if (key === 'End') {\r\n e.preventDefault();\r\n setActiveIndex(getLastEnabledIndex());\r\n } else if (key === 'Enter' || key === ' ') {\r\n e.preventDefault();\r\n const it = items[activeIndex];\r\n if (it && !it.disabled && it.onSelect) {\r\n it.onSelect();\r\n setOpen(false);\r\n }\r\n }\r\n };\r\n\r\n /** ESC close – FIXED TYPE (no TS errors) */\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const handler = (e: globalThis.KeyboardEvent) => {\r\n if (e.key === 'Escape') setOpen(false);\r\n };\r\n\r\n document.addEventListener('keydown', handler as EventListener);\r\n return () =>\r\n document.removeEventListener('keydown', handler as EventListener);\r\n }, [open]);\r\n\r\n /** Click outside to close */\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(menuRef, () => setOpen(false));\r\n }, [open]);\r\n\r\n return (\r\n <div className=\"ui-contextmenu-wrapper\">\r\n <div onContextMenu={handleContext}>{trigger}</div>\r\n\r\n {open && pos && (\r\n <Portal>\r\n <div\r\n ref={menuRef}\r\n className={`ui-contextmenu ${className}`}\r\n role=\"menu\"\r\n tabIndex={-1}\r\n style={{\r\n top: pos.top,\r\n left: pos.left,\r\n position: 'fixed',\r\n }}\r\n onKeyDown={handleKeyDown}\r\n >\r\n {items.map((item, idx) => {\r\n if (item.type === 'separator') {\r\n return <div key={idx} className=\"ui-contextmenu-separator\" />;\r\n }\r\n\r\n const isActive = idx === activeIndex;\r\n\r\n return (\r\n <div\r\n key={idx}\r\n className={[\r\n 'ui-contextmenu-item',\r\n item.disabled ? 'disabled' : '',\r\n item.danger ? 'danger' : '',\r\n isActive ? 'active' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"menuitem\"\r\n tabIndex={-1}\r\n aria-disabled={item.disabled || undefined}\r\n onMouseEnter={() => setActiveIndex(idx)}\r\n onClick={() => {\r\n if (!item.disabled) {\r\n item.onSelect?.();\r\n setOpen(false);\r\n }\r\n }}\r\n >\r\n {item.icon && (\r\n <span className=\"ui-contextmenu-icon\">{item.icon}</span>\r\n )}\r\n <span>{item.label}</span>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </Portal>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["ContextMenu","trigger","items","className","open","setOpen","useState","pos","setPos","menuRef","useRef","activeIndex","setActiveIndex","handleContext","getFirstEnabledIndex","i","getLastEnabledIndex","it","move","direction","idx","handleKeyDown","key","useEffect","handler","e","onClickOutside","jsxs","jsx","Portal","item","isActive"],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { jsxs as v, jsx as r } from "react/jsx-runtime";
|
|
2
|
+
import { useState as c, useRef as E, useEffect as x } from "react";
|
|
3
|
+
/* empty css */
|
|
4
|
+
import { onClickOutside as g } from "../../utils/onclickoutside/onClickOutside.js";
|
|
5
|
+
import { Portal as k } from "../../utils/portal/portal.js";
|
|
6
|
+
function j({
|
|
7
|
+
trigger: b,
|
|
8
|
+
items: o,
|
|
9
|
+
className: m = ""
|
|
10
|
+
}) {
|
|
11
|
+
const [l, a] = c(!1), [i, h] = c(null), f = E(null), [d, s] = c(0), y = (e) => {
|
|
12
|
+
e.preventDefault(), h({ top: e.clientY, left: e.clientX }), a(!0), s(u());
|
|
13
|
+
}, u = () => o.findIndex((e) => e.type !== "separator" && !e.disabled), w = () => {
|
|
14
|
+
for (let e = o.length - 1; e >= 0; e--) {
|
|
15
|
+
const n = o[e];
|
|
16
|
+
if (n.type !== "separator" && !n.disabled) return e;
|
|
17
|
+
}
|
|
18
|
+
return 0;
|
|
19
|
+
}, p = (e) => {
|
|
20
|
+
let n = d;
|
|
21
|
+
for (; ; ) {
|
|
22
|
+
n = n + e, n < 0 && (n = o.length - 1), n >= o.length && (n = 0);
|
|
23
|
+
const t = o[n];
|
|
24
|
+
if (t.type !== "separator" && !t.disabled) {
|
|
25
|
+
s(n);
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}, D = (e) => {
|
|
30
|
+
const { key: n } = e;
|
|
31
|
+
if (n === "ArrowDown")
|
|
32
|
+
e.preventDefault(), p(1);
|
|
33
|
+
else if (n === "ArrowUp")
|
|
34
|
+
e.preventDefault(), p(-1);
|
|
35
|
+
else if (n === "Home")
|
|
36
|
+
e.preventDefault(), s(u());
|
|
37
|
+
else if (n === "End")
|
|
38
|
+
e.preventDefault(), s(w());
|
|
39
|
+
else if (n === "Enter" || n === " ") {
|
|
40
|
+
e.preventDefault();
|
|
41
|
+
const t = o[d];
|
|
42
|
+
t && !t.disabled && t.onSelect && (t.onSelect(), a(!1));
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
return x(() => {
|
|
46
|
+
if (!l) return;
|
|
47
|
+
const e = (n) => {
|
|
48
|
+
n.key === "Escape" && a(!1);
|
|
49
|
+
};
|
|
50
|
+
return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
|
|
51
|
+
}, [l]), x(() => {
|
|
52
|
+
if (l)
|
|
53
|
+
return g(f, () => a(!1));
|
|
54
|
+
}, [l]), /* @__PURE__ */ v("div", { className: "ui-contextmenu-wrapper", children: [
|
|
55
|
+
/* @__PURE__ */ r("div", { onContextMenu: y, children: b }),
|
|
56
|
+
l && i && /* @__PURE__ */ r(k, { children: /* @__PURE__ */ r(
|
|
57
|
+
"div",
|
|
58
|
+
{
|
|
59
|
+
ref: f,
|
|
60
|
+
className: `ui-contextmenu ${m}`,
|
|
61
|
+
role: "menu",
|
|
62
|
+
tabIndex: -1,
|
|
63
|
+
style: {
|
|
64
|
+
top: i.top,
|
|
65
|
+
left: i.left,
|
|
66
|
+
position: "fixed"
|
|
67
|
+
},
|
|
68
|
+
onKeyDown: D,
|
|
69
|
+
children: o.map((e, n) => {
|
|
70
|
+
if (e.type === "separator")
|
|
71
|
+
return /* @__PURE__ */ r("div", { className: "ui-contextmenu-separator" }, n);
|
|
72
|
+
const t = n === d;
|
|
73
|
+
return /* @__PURE__ */ v(
|
|
74
|
+
"div",
|
|
75
|
+
{
|
|
76
|
+
className: [
|
|
77
|
+
"ui-contextmenu-item",
|
|
78
|
+
e.disabled ? "disabled" : "",
|
|
79
|
+
e.danger ? "danger" : "",
|
|
80
|
+
t ? "active" : ""
|
|
81
|
+
].filter(Boolean).join(" "),
|
|
82
|
+
role: "menuitem",
|
|
83
|
+
tabIndex: -1,
|
|
84
|
+
"aria-disabled": e.disabled || void 0,
|
|
85
|
+
onMouseEnter: () => s(n),
|
|
86
|
+
onClick: () => {
|
|
87
|
+
e.disabled || (e.onSelect?.(), a(!1));
|
|
88
|
+
},
|
|
89
|
+
children: [
|
|
90
|
+
e.icon && /* @__PURE__ */ r("span", { className: "ui-contextmenu-icon", children: e.icon }),
|
|
91
|
+
/* @__PURE__ */ r("span", { children: e.label })
|
|
92
|
+
]
|
|
93
|
+
},
|
|
94
|
+
n
|
|
95
|
+
);
|
|
96
|
+
})
|
|
97
|
+
}
|
|
98
|
+
) })
|
|
99
|
+
] });
|
|
100
|
+
}
|
|
101
|
+
export {
|
|
102
|
+
j as ContextMenu
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=ContextMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextMenu.js","sources":["../../../../src/components/contextmenu/ContextMenu.tsx"],"sourcesContent":["/**\r\n * ContextMenu.tsx — FINAL VERSION\r\n * --------------------------------\r\n * Features:\r\n * - Right-click (contextmenu)\r\n * - Arrow key navigation\r\n * - Roving tabIndex\r\n * - ESC + click outside to close\r\n * - Portal rendering\r\n * - Separators + icons + danger items\r\n */\r\n/**\r\n * ContextMenu.tsx — FINAL CLEAN VERSION\r\n * --------------------------------------\r\n * Features:\r\n * - Right-click context menu\r\n * - Keyboard navigation (ArrowUp/Down, Home, End, Enter)\r\n * - ESC + click outside to close\r\n * - Roving active index\r\n * - Portal rendering\r\n * - Separators + icons + danger/disabled\r\n * - 100% TypeScript safe\r\n */\r\n\r\nimport React, {\r\n useEffect,\r\n useRef,\r\n useState,\r\n ReactNode,\r\n KeyboardEvent as ReactKeyboardEvent,\r\n} from 'react';\r\nimport './ContextMenu.css';\r\nimport { Portal, onClickOutside } from '../../utils/index';\r\n\r\nexport interface MenuItem {\r\n label?: string;\r\n icon?: ReactNode;\r\n onSelect?: () => void;\r\n danger?: boolean;\r\n disabled?: boolean;\r\n type?: 'item' | 'separator';\r\n}\r\n\r\ninterface ContextMenuProps {\r\n trigger: ReactNode;\r\n items: MenuItem[];\r\n className?: string;\r\n}\r\n\r\nexport function ContextMenu({\r\n trigger,\r\n items,\r\n className = '',\r\n}: ContextMenuProps) {\r\n const [open, setOpen] = useState(false);\r\n const [pos, setPos] = useState<{ top: number; left: number } | null>(null);\r\n\r\n const menuRef = useRef<HTMLDivElement | null>(null);\r\n\r\n // active index for keyboard navigation\r\n const [activeIndex, setActiveIndex] = useState<number>(0);\r\n\r\n const handleContext = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n setPos({ top: e.clientY, left: e.clientX });\r\n setOpen(true);\r\n setActiveIndex(getFirstEnabledIndex());\r\n };\r\n\r\n /** Returns index of first enabled, non-separator item */\r\n const getFirstEnabledIndex = () => {\r\n return items.findIndex((i) => i.type !== 'separator' && !i.disabled);\r\n };\r\n\r\n /** Returns index of last enabled, non-separator item */\r\n const getLastEnabledIndex = () => {\r\n for (let i = items.length - 1; i >= 0; i--) {\r\n const it = items[i];\r\n if (it.type !== 'separator' && !it.disabled) return i;\r\n }\r\n return 0;\r\n };\r\n\r\n /** Move selection up/down */\r\n const move = (direction: 1 | -1) => {\r\n let idx = activeIndex;\r\n\r\n while (true) {\r\n idx = idx + direction;\r\n\r\n if (idx < 0) idx = items.length - 1;\r\n if (idx >= items.length) idx = 0;\r\n\r\n const it = items[idx];\r\n if (it.type !== 'separator' && !it.disabled) {\r\n setActiveIndex(idx);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n /** Keyboard events inside menu */\r\n const handleKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>) => {\r\n const { key } = e;\r\n\r\n if (key === 'ArrowDown') {\r\n e.preventDefault();\r\n move(1);\r\n } else if (key === 'ArrowUp') {\r\n e.preventDefault();\r\n move(-1);\r\n } else if (key === 'Home') {\r\n e.preventDefault();\r\n setActiveIndex(getFirstEnabledIndex());\r\n } else if (key === 'End') {\r\n e.preventDefault();\r\n setActiveIndex(getLastEnabledIndex());\r\n } else if (key === 'Enter' || key === ' ') {\r\n e.preventDefault();\r\n const it = items[activeIndex];\r\n if (it && !it.disabled && it.onSelect) {\r\n it.onSelect();\r\n setOpen(false);\r\n }\r\n }\r\n };\r\n\r\n /** ESC close – FIXED TYPE (no TS errors) */\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const handler = (e: globalThis.KeyboardEvent) => {\r\n if (e.key === 'Escape') setOpen(false);\r\n };\r\n\r\n document.addEventListener('keydown', handler as EventListener);\r\n return () =>\r\n document.removeEventListener('keydown', handler as EventListener);\r\n }, [open]);\r\n\r\n /** Click outside to close */\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(menuRef, () => setOpen(false));\r\n }, [open]);\r\n\r\n return (\r\n <div className=\"ui-contextmenu-wrapper\">\r\n <div onContextMenu={handleContext}>{trigger}</div>\r\n\r\n {open && pos && (\r\n <Portal>\r\n <div\r\n ref={menuRef}\r\n className={`ui-contextmenu ${className}`}\r\n role=\"menu\"\r\n tabIndex={-1}\r\n style={{\r\n top: pos.top,\r\n left: pos.left,\r\n position: 'fixed',\r\n }}\r\n onKeyDown={handleKeyDown}\r\n >\r\n {items.map((item, idx) => {\r\n if (item.type === 'separator') {\r\n return <div key={idx} className=\"ui-contextmenu-separator\" />;\r\n }\r\n\r\n const isActive = idx === activeIndex;\r\n\r\n return (\r\n <div\r\n key={idx}\r\n className={[\r\n 'ui-contextmenu-item',\r\n item.disabled ? 'disabled' : '',\r\n item.danger ? 'danger' : '',\r\n isActive ? 'active' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"menuitem\"\r\n tabIndex={-1}\r\n aria-disabled={item.disabled || undefined}\r\n onMouseEnter={() => setActiveIndex(idx)}\r\n onClick={() => {\r\n if (!item.disabled) {\r\n item.onSelect?.();\r\n setOpen(false);\r\n }\r\n }}\r\n >\r\n {item.icon && (\r\n <span className=\"ui-contextmenu-icon\">{item.icon}</span>\r\n )}\r\n <span>{item.label}</span>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </Portal>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["ContextMenu","trigger","items","className","open","setOpen","useState","pos","setPos","menuRef","useRef","activeIndex","setActiveIndex","handleContext","getFirstEnabledIndex","i","getLastEnabledIndex","it","move","direction","idx","handleKeyDown","key","useEffect","handler","e","onClickOutside","jsxs","jsx","Portal","item","isActive"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),u=require("react");;/* empty css */function O({columns:D,rows:g,page:w,pageSize:m=10,onPageChange:I,selectable:v=!1,selectedRowIds:y,onSelectionChange:b,onRowClick:M,renderRowActions:C,className:E="",disablePagination:x=!1}){const[c,T]=u.useState({key:null,dir:null}),[q,A]=u.useState(1),d=w??q,[B,P]=u.useState(new Set),p=y??B,h=u.useMemo(()=>x?1:Math.max(1,Math.ceil(g.length/m)),[g.length,m,x]),N=u.useMemo(()=>{if(!c.key||!c.dir)return[...g];const e=c.key,t=c.dir==="asc"?1:-1;return[...g].sort((s,a)=>{const i=s[e],r=a[e];return i===void 0&&r!==void 0?-1*t:r===void 0&&i!==void 0?1*t:typeof i=="number"&&typeof r=="number"?(i-r)*t:i instanceof Date&&r instanceof Date?(i.getTime()-r.getTime())*t:String(i??"").localeCompare(String(r??""))*t})},[g,c]),l=u.useMemo(()=>{if(x)return N;const e=(d-1)*m;return N.slice(e,e+m)},[N,d,m,x]),[k,o]=u.useState(null),j=(e,t)=>e.id??`row-${t}-${Math.random().toString(36).slice(2,7)}`,F=e=>{T(t=>t.key!==e?{key:e,dir:"asc"}:t.dir==="asc"?{key:e,dir:"desc"}:{key:null,dir:null})},f=e=>{const t=Math.max(1,Math.min(h,e));w===void 0&&A(t),I?.(t)},S=e=>{const t=s=>{const a=new Set(s);return a.has(e)?a.delete(e):a.add(e),a};if(y){const s=t(p);b?.(s)}else P(s=>{const a=t(s);return b?.(a),a})},G=()=>{const e=l.map((a,i)=>a.id??j(a,i)),t=e.every(a=>p.has(a)),s=a=>{const i=new Set(a);return t?e.forEach(r=>i.delete(r)):e.forEach(r=>i.add(r)),i};if(y){const a=s(p);b?.(a)}else P(a=>{const i=s(a);return b?.(i),i})},K=e=>{if(l.length!==0)switch(e.key){case"ArrowDown":e.preventDefault(),o(t=>t===null?0:Math.min(l.length-1,t+1));break;case"ArrowUp":e.preventDefault(),o(t=>t===null?0:Math.max(0,t-1));break;case"PageDown":e.preventDefault(),f(d+1),o(0);break;case"PageUp":e.preventDefault(),f(d-1),o(0);break;case"Home":e.preventDefault(),o(0);break;case"End":e.preventDefault(),o(l.length-1);break;case"Enter":if(e.preventDefault(),k!==null){const t=l[k],s=t.id??j(t,k);v&&S(s),M?.(t)}break}},$=!!C;return n.jsx("div",{className:`ui-datagrid ${E}`,onKeyDown:K,tabIndex:0,role:"grid","aria-rowcount":g.length,children:n.jsxs("div",{className:"ui-datagrid-table",children:[n.jsxs("div",{className:"ui-datagrid-header",role:"row",children:[v&&n.jsx("div",{className:"ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--select",children:n.jsx("input",{type:"checkbox","aria-label":"Select all on page",onChange:G,checked:l.length>0&&l.every((e,t)=>p.has(e.id??j(e,t)))})}),D.map(e=>{const t=c.key===e.key;return n.jsx("div",{className:`ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--${e.align??"left"}`,role:"columnheader",style:{width:e.width},"aria-sort":t?c.dir==="asc"?"ascending":"descending":"none",onClick:()=>e.sortable&&F(e.key),children:n.jsxs("div",{className:"ui-datagrid-header-content",children:[n.jsx("span",{children:e.title}),e.sortable&&n.jsx("span",{className:"ui-datagrid-sort-indicator",children:t?c.dir==="asc"?"▲":"▼":"⤓"})]})},e.key)}),$&&n.jsx("div",{className:"ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--actions"})]}),n.jsx("div",{className:"ui-datagrid-body",role:"rowgroup",children:l.length===0?n.jsx("div",{className:"ui-datagrid-empty",children:"No data"}):l.map((e,t)=>{const s=e.id??j(e,t),a=p.has(s),i=k===t;return n.jsxs("div",{className:["ui-datagrid-row",a?"selected":"",i?"focused":""].filter(Boolean).join(" "),role:"row",tabIndex:i?0:-1,"aria-selected":a||void 0,onClick:()=>{v&&S(s),M?.(e),o(t)},onFocus:()=>o(t),children:[v&&n.jsx("div",{className:"ui-datagrid-cell ui-datagrid-cell--select",children:n.jsx("input",{type:"checkbox",checked:a,onClick:r=>r.stopPropagation(),onChange:()=>S(s),"aria-label":`Select row ${String(s)}`})}),D.map(r=>n.jsx("div",{role:"gridcell",className:`ui-datagrid-cell ui-datagrid-cell--${r.align??"left"}`,style:{width:r.width},children:r.render?r.render(e):String(e[r.key]??"")},r.key)),$&&n.jsx("div",{className:"ui-datagrid-cell ui-datagrid-cell--actions",children:C?.(e)})]},String(s))})}),!x&&h>1&&n.jsxs("div",{className:"ui-datagrid-footer",children:[n.jsx("button",{className:"ui-datagrid-page-btn",onClick:()=>f(1),disabled:d===1,children:"«"}),n.jsx("button",{className:"ui-datagrid-page-btn",onClick:()=>f(d-1),disabled:d===1,children:"‹"}),n.jsxs("div",{className:"ui-datagrid-page-info",children:["Page ",d," of ",h]}),n.jsx("button",{className:"ui-datagrid-page-btn",onClick:()=>f(d+1),disabled:d===h,children:"›"}),n.jsx("button",{className:"ui-datagrid-page-btn",onClick:()=>f(h),disabled:d===h,children:"»"})]})]})})}exports.DataGrid=O;
|
|
2
|
+
//# sourceMappingURL=DataGrid.cjs.map
|