@nofinite/nui 1.1.1 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -48
- package/dist/components/accordion/Accordion.cjs +1 -1
- package/dist/components/accordion/Accordion.cjs.map +1 -1
- package/dist/components/accordion/Accordion.js +64 -43
- package/dist/components/accordion/Accordion.js.map +1 -1
- package/dist/components/alert/Alert.cjs +1 -1
- package/dist/components/alert/Alert.cjs.map +1 -1
- package/dist/components/alert/Alert.js +39 -25
- package/dist/components/alert/Alert.js.map +1 -1
- package/dist/components/avatar/Avatar.cjs +1 -1
- package/dist/components/avatar/Avatar.cjs.map +1 -1
- package/dist/components/avatar/Avatar.js +58 -44
- package/dist/components/avatar/Avatar.js.map +1 -1
- package/dist/components/avatar/AvatarGroup.cjs +1 -1
- package/dist/components/avatar/AvatarGroup.cjs.map +1 -1
- package/dist/components/avatar/AvatarGroup.js +34 -25
- package/dist/components/avatar/AvatarGroup.js.map +1 -1
- package/dist/components/badge/Badge.cjs +1 -1
- package/dist/components/badge/Badge.cjs.map +1 -1
- package/dist/components/badge/Badge.js +43 -68
- package/dist/components/badge/Badge.js.map +1 -1
- package/dist/components/badge/BadgeGroup.cjs +1 -1
- package/dist/components/badge/BadgeGroup.cjs.map +1 -1
- package/dist/components/badge/BadgeGroup.js +20 -10
- package/dist/components/badge/BadgeGroup.js.map +1 -1
- package/dist/components/breadcrumbs/Breadcrumbs.cjs +1 -1
- package/dist/components/breadcrumbs/Breadcrumbs.cjs.map +1 -1
- package/dist/components/breadcrumbs/Breadcrumbs.js +59 -39
- package/dist/components/breadcrumbs/Breadcrumbs.js.map +1 -1
- package/dist/components/button/Button.cjs +1 -1
- package/dist/components/button/Button.cjs.map +1 -1
- package/dist/components/button/Button.js +52 -17
- package/dist/components/button/Button.js.map +1 -1
- package/dist/components/card/Card.cjs +1 -1
- package/dist/components/card/Card.cjs.map +1 -1
- package/dist/components/card/Card.js +44 -41
- package/dist/components/card/Card.js.map +1 -1
- package/dist/components/checkbox/Checkbox.cjs +1 -1
- package/dist/components/checkbox/Checkbox.cjs.map +1 -1
- package/dist/components/checkbox/Checkbox.js +59 -40
- package/dist/components/checkbox/Checkbox.js.map +1 -1
- package/dist/components/chip/Chip.cjs +1 -1
- package/dist/components/chip/Chip.cjs.map +1 -1
- package/dist/components/chip/Chip.js +67 -47
- package/dist/components/chip/Chip.js.map +1 -1
- package/dist/components/combobox/Combobox.cjs +1 -1
- package/dist/components/combobox/Combobox.cjs.map +1 -1
- package/dist/components/combobox/Combobox.js +123 -108
- package/dist/components/combobox/Combobox.js.map +1 -1
- package/dist/components/commandpalette/CommandPalette.cjs +1 -1
- package/dist/components/commandpalette/CommandPalette.cjs.map +1 -1
- package/dist/components/commandpalette/CommandPalette.js +96 -73
- package/dist/components/commandpalette/CommandPalette.js.map +1 -1
- package/dist/components/contextmenu/ContextMenu.cjs +1 -1
- package/dist/components/contextmenu/ContextMenu.cjs.map +1 -1
- package/dist/components/contextmenu/ContextMenu.js +79 -58
- package/dist/components/contextmenu/ContextMenu.js.map +1 -1
- package/dist/components/datagrid/DataGrid.cjs +1 -1
- package/dist/components/datagrid/DataGrid.cjs.map +1 -1
- package/dist/components/datagrid/DataGrid.js +184 -202
- package/dist/components/datagrid/DataGrid.js.map +1 -1
- package/dist/components/datepicker/DatePicker.cjs +1 -1
- package/dist/components/datepicker/DatePicker.cjs.map +1 -1
- package/dist/components/datepicker/DatePicker.js +197 -164
- package/dist/components/datepicker/DatePicker.js.map +1 -1
- package/dist/components/daterangepicker/DateRangePicker.cjs +1 -1
- package/dist/components/daterangepicker/DateRangePicker.cjs.map +1 -1
- package/dist/components/daterangepicker/DateRangePicker.js +254 -213
- package/dist/components/daterangepicker/DateRangePicker.js.map +1 -1
- package/dist/components/dialog/DialogProvider.cjs +2 -0
- package/dist/components/dialog/DialogProvider.cjs.map +1 -0
- package/dist/components/dialog/DialogProvider.js +71 -0
- package/dist/components/dialog/DialogProvider.js.map +1 -0
- package/dist/components/dialog/dialogStore.cjs +2 -0
- package/dist/components/dialog/dialogStore.cjs.map +1 -0
- package/dist/components/dialog/dialogStore.js +60 -0
- package/dist/components/dialog/dialogStore.js.map +1 -0
- package/dist/components/drawer/Drawer.cjs +1 -1
- package/dist/components/drawer/Drawer.cjs.map +1 -1
- package/dist/components/drawer/Drawer.js +69 -47
- package/dist/components/drawer/Drawer.js.map +1 -1
- package/dist/components/dropdown/Dropdown.cjs +1 -1
- package/dist/components/dropdown/Dropdown.cjs.map +1 -1
- package/dist/components/dropdown/Dropdown.js +134 -108
- package/dist/components/dropdown/Dropdown.js.map +1 -1
- package/dist/components/fileuploader/FileUploader.cjs +1 -1
- package/dist/components/fileuploader/FileUploader.cjs.map +1 -1
- package/dist/components/fileuploader/FileUploader.js +96 -61
- package/dist/components/fileuploader/FileUploader.js.map +1 -1
- package/dist/components/hovercard/HoverCard.cjs +1 -1
- package/dist/components/hovercard/HoverCard.cjs.map +1 -1
- package/dist/components/hovercard/HoverCard.js +124 -69
- package/dist/components/hovercard/HoverCard.js.map +1 -1
- package/dist/components/input/Input.cjs +1 -1
- package/dist/components/input/Input.cjs.map +1 -1
- package/dist/components/input/Input.js +62 -37
- package/dist/components/input/Input.js.map +1 -1
- package/dist/components/layout/Container.cjs +1 -1
- package/dist/components/layout/Container.cjs.map +1 -1
- package/dist/components/layout/Container.js +21 -30
- package/dist/components/layout/Container.js.map +1 -1
- package/dist/components/layout/Flex.cjs +1 -1
- package/dist/components/layout/Flex.cjs.map +1 -1
- package/dist/components/layout/Flex.js +36 -19
- package/dist/components/layout/Flex.js.map +1 -1
- package/dist/components/layout/Grid.cjs +1 -1
- package/dist/components/layout/Grid.cjs.map +1 -1
- package/dist/components/layout/Grid.js +30 -18
- package/dist/components/layout/Grid.js.map +1 -1
- package/dist/components/link/Link.cjs +2 -0
- package/dist/components/link/Link.cjs.map +1 -0
- package/dist/components/link/Link.js +41 -0
- package/dist/components/link/Link.js.map +1 -0
- package/dist/components/megamenu/MegaMenu.cjs +1 -1
- package/dist/components/megamenu/MegaMenu.cjs.map +1 -1
- package/dist/components/megamenu/MegaMenu.js +107 -38
- package/dist/components/megamenu/MegaMenu.js.map +1 -1
- package/dist/components/modal/Modal.cjs +1 -1
- package/dist/components/modal/Modal.cjs.map +1 -1
- package/dist/components/modal/Modal.js +91 -83
- package/dist/components/modal/Modal.js.map +1 -1
- package/dist/components/multiselect/MultiSelect.cjs +2 -0
- package/dist/components/multiselect/MultiSelect.cjs.map +1 -0
- package/dist/components/multiselect/MultiSelect.js +176 -0
- package/dist/components/multiselect/MultiSelect.js.map +1 -0
- package/dist/components/nuiprovider/NUIProvider.cjs +2 -0
- package/dist/components/nuiprovider/NUIProvider.cjs.map +1 -0
- package/dist/components/nuiprovider/NUIProvider.js +36 -0
- package/dist/components/nuiprovider/NUIProvider.js.map +1 -0
- package/dist/components/pagination/Pagination.cjs +1 -1
- package/dist/components/pagination/Pagination.cjs.map +1 -1
- package/dist/components/pagination/Pagination.js +74 -41
- package/dist/components/pagination/Pagination.js.map +1 -1
- package/dist/components/popover/Popover.cjs +1 -1
- package/dist/components/popover/Popover.cjs.map +1 -1
- package/dist/components/popover/Popover.js +99 -100
- package/dist/components/popover/Popover.js.map +1 -1
- package/dist/components/progress/Progress.cjs +1 -1
- package/dist/components/progress/Progress.cjs.map +1 -1
- package/dist/components/progress/Progress.js +44 -22
- package/dist/components/progress/Progress.js.map +1 -1
- package/dist/components/radiogroup/RadioGroup.cjs +1 -1
- package/dist/components/radiogroup/RadioGroup.cjs.map +1 -1
- package/dist/components/radiogroup/RadioGroup.js +69 -74
- package/dist/components/radiogroup/RadioGroup.js.map +1 -1
- package/dist/components/rating/Rating.cjs +1 -1
- package/dist/components/rating/Rating.cjs.map +1 -1
- package/dist/components/rating/Rating.js +72 -33
- package/dist/components/rating/Rating.js.map +1 -1
- package/dist/components/resizable/Resizable.cjs +2 -0
- package/dist/components/resizable/Resizable.cjs.map +1 -0
- package/dist/components/resizable/Resizable.js +134 -0
- package/dist/components/resizable/Resizable.js.map +1 -0
- package/dist/components/select/Select.cjs +1 -1
- package/dist/components/select/Select.cjs.map +1 -1
- package/dist/components/select/Select.js +114 -113
- package/dist/components/select/Select.js.map +1 -1
- package/dist/components/skeleton/Skeleton.cjs +1 -1
- package/dist/components/skeleton/Skeleton.cjs.map +1 -1
- package/dist/components/skeleton/Skeleton.js +90 -67
- package/dist/components/skeleton/Skeleton.js.map +1 -1
- package/dist/components/slider/Slider.cjs +1 -1
- package/dist/components/slider/Slider.cjs.map +1 -1
- package/dist/components/slider/Slider.js +85 -82
- package/dist/components/slider/Slider.js.map +1 -1
- package/dist/components/spinner/Spinner.cjs +1 -1
- package/dist/components/spinner/Spinner.cjs.map +1 -1
- package/dist/components/spinner/Spinner.js +60 -17
- package/dist/components/spinner/Spinner.js.map +1 -1
- package/dist/components/stepper/Stepper.cjs +1 -5
- package/dist/components/stepper/Stepper.cjs.map +1 -1
- package/dist/components/stepper/Stepper.js +65 -39
- package/dist/components/stepper/Stepper.js.map +1 -1
- package/dist/components/switch/Switch.cjs +1 -1
- package/dist/components/switch/Switch.cjs.map +1 -1
- package/dist/components/switch/Switch.js +89 -62
- package/dist/components/switch/Switch.js.map +1 -1
- package/dist/components/table/Table.cjs +1 -1
- package/dist/components/table/Table.cjs.map +1 -1
- package/dist/components/table/Table.js +62 -35
- package/dist/components/table/Table.js.map +1 -1
- package/dist/components/tabs/Tabs.cjs +1 -1
- package/dist/components/tabs/Tabs.cjs.map +1 -1
- package/dist/components/tabs/Tabs.js +110 -50
- package/dist/components/tabs/Tabs.js.map +1 -1
- package/dist/components/textarea/Textarea.cjs +1 -1
- package/dist/components/textarea/Textarea.cjs.map +1 -1
- package/dist/components/textarea/Textarea.js +63 -58
- package/dist/components/textarea/Textarea.js.map +1 -1
- package/dist/components/timepicker/TimePicker.cjs +2 -0
- package/dist/components/timepicker/TimePicker.cjs.map +1 -0
- package/dist/components/timepicker/TimePicker.js +159 -0
- package/dist/components/timepicker/TimePicker.js.map +1 -0
- package/dist/components/timerangepicker/TimeRangePicker.cjs +2 -0
- package/dist/components/timerangepicker/TimeRangePicker.cjs.map +1 -0
- package/dist/components/timerangepicker/TimeRangePicker.js +208 -0
- package/dist/components/timerangepicker/TimeRangePicker.js.map +1 -0
- package/dist/components/toast/Toast.cjs +1 -1
- package/dist/components/toast/Toast.cjs.map +1 -1
- package/dist/components/toast/Toast.js +91 -38
- package/dist/components/toast/Toast.js.map +1 -1
- package/dist/components/tooltip/Tooltip.cjs +1 -1
- package/dist/components/tooltip/Tooltip.cjs.map +1 -1
- package/dist/components/tooltip/Tooltip.js +72 -56
- package/dist/components/tooltip/Tooltip.js.map +1 -1
- package/dist/components/treeview/TreeView.cjs +1 -1
- package/dist/components/treeview/TreeView.cjs.map +1 -1
- package/dist/components/treeview/TreeView.js +120 -90
- package/dist/components/treeview/TreeView.js.map +1 -1
- package/dist/components/virtuallist/VirtualList.cjs +1 -1
- package/dist/components/virtuallist/VirtualList.cjs.map +1 -1
- package/dist/components/virtuallist/VirtualList.js +52 -34
- package/dist/components/virtuallist/VirtualList.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.css +1 -0
- package/dist/index.js +118 -107
- package/dist/index.js.map +1 -1
- package/dist/package.json +49 -6
- package/dist/types/components/accordion/Accordion.d.ts +7 -3
- package/dist/types/components/accordion/Accordion.d.ts.map +1 -1
- package/dist/types/components/alert/Alert.d.ts +18 -5
- package/dist/types/components/alert/Alert.d.ts.map +1 -1
- package/dist/types/components/avatar/Avatar.d.ts +12 -8
- package/dist/types/components/avatar/Avatar.d.ts.map +1 -1
- package/dist/types/components/avatar/AvatarGroup.d.ts +11 -4
- package/dist/types/components/avatar/AvatarGroup.d.ts.map +1 -1
- package/dist/types/components/badge/Badge.d.ts +19 -11
- package/dist/types/components/badge/Badge.d.ts.map +1 -1
- package/dist/types/components/badge/BadgeGroup.d.ts +7 -4
- package/dist/types/components/badge/BadgeGroup.d.ts.map +1 -1
- package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts +14 -6
- package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts.map +1 -1
- package/dist/types/components/button/Button.d.ts +25 -10
- package/dist/types/components/button/Button.d.ts.map +1 -1
- package/dist/types/components/card/Card.d.ts +12 -21
- package/dist/types/components/card/Card.d.ts.map +1 -1
- package/dist/types/components/checkbox/Checkbox.d.ts +12 -7
- package/dist/types/components/checkbox/Checkbox.d.ts.map +1 -1
- package/dist/types/components/chip/Chip.d.ts +14 -11
- package/dist/types/components/chip/Chip.d.ts.map +1 -1
- package/dist/types/components/combobox/Combobox.d.ts +15 -4
- package/dist/types/components/combobox/Combobox.d.ts.map +1 -1
- package/dist/types/components/commandpalette/CommandPalette.d.ts +12 -3
- package/dist/types/components/commandpalette/CommandPalette.d.ts.map +1 -1
- package/dist/types/components/contextmenu/ContextMenu.d.ts +14 -6
- package/dist/types/components/contextmenu/ContextMenu.d.ts.map +1 -1
- package/dist/types/components/datagrid/DataGrid.d.ts +16 -4
- package/dist/types/components/datagrid/DataGrid.d.ts.map +1 -1
- package/dist/types/components/datepicker/DatePicker.d.ts +13 -1
- package/dist/types/components/datepicker/DatePicker.d.ts.map +1 -1
- package/dist/types/components/daterangepicker/DateRangePicker.d.ts +3 -1
- package/dist/types/components/daterangepicker/DateRangePicker.d.ts.map +1 -1
- package/dist/types/components/dialog/DialogProvider.d.ts +2 -0
- package/dist/types/components/dialog/DialogProvider.d.ts.map +1 -0
- package/dist/types/components/dialog/dialogStore.d.ts +42 -0
- package/dist/types/components/dialog/dialogStore.d.ts.map +1 -0
- package/dist/types/components/drawer/Drawer.d.ts +18 -4
- package/dist/types/components/drawer/Drawer.d.ts.map +1 -1
- package/dist/types/components/dropdown/Dropdown.d.ts +21 -16
- package/dist/types/components/dropdown/Dropdown.d.ts.map +1 -1
- package/dist/types/components/fileuploader/FileUploader.d.ts +22 -3
- package/dist/types/components/fileuploader/FileUploader.d.ts.map +1 -1
- package/dist/types/components/hovercard/HoverCard.d.ts +45 -5
- package/dist/types/components/hovercard/HoverCard.d.ts.map +1 -1
- package/dist/types/components/input/Input.d.ts +20 -10
- package/dist/types/components/input/Input.d.ts.map +1 -1
- package/dist/types/components/layout/Container.d.ts +8 -4
- package/dist/types/components/layout/Container.d.ts.map +1 -1
- package/dist/types/components/layout/Flex.d.ts +27 -10
- package/dist/types/components/layout/Flex.d.ts.map +1 -1
- package/dist/types/components/layout/Grid.d.ts +11 -5
- package/dist/types/components/layout/Grid.d.ts.map +1 -1
- package/dist/types/components/link/Link.d.ts +22 -0
- package/dist/types/components/link/Link.d.ts.map +1 -0
- package/dist/types/components/megamenu/MegaMenu.d.ts +8 -11
- package/dist/types/components/megamenu/MegaMenu.d.ts.map +1 -1
- package/dist/types/components/modal/Modal.d.ts +8 -7
- package/dist/types/components/modal/Modal.d.ts.map +1 -1
- package/dist/types/components/multiselect/MultiSelect.d.ts +33 -0
- package/dist/types/components/multiselect/MultiSelect.d.ts.map +1 -0
- package/dist/types/components/nuiprovider/NUIProvider.d.ts +29 -0
- package/dist/types/components/nuiprovider/NUIProvider.d.ts.map +1 -0
- package/dist/types/components/pagination/Pagination.d.ts +17 -3
- package/dist/types/components/pagination/Pagination.d.ts.map +1 -1
- package/dist/types/components/popover/Popover.d.ts +54 -16
- package/dist/types/components/popover/Popover.d.ts.map +1 -1
- package/dist/types/components/progress/Progress.d.ts +17 -7
- package/dist/types/components/progress/Progress.d.ts.map +1 -1
- package/dist/types/components/radiogroup/RadioGroup.d.ts +15 -10
- package/dist/types/components/radiogroup/RadioGroup.d.ts.map +1 -1
- package/dist/types/components/rating/Rating.d.ts +24 -10
- package/dist/types/components/rating/Rating.d.ts.map +1 -1
- package/dist/types/components/resizable/Resizable.d.ts +24 -0
- package/dist/types/components/resizable/Resizable.d.ts.map +1 -0
- package/dist/types/components/select/Select.d.ts +17 -8
- package/dist/types/components/select/Select.d.ts.map +1 -1
- package/dist/types/components/skeleton/Skeleton.d.ts +37 -36
- package/dist/types/components/skeleton/Skeleton.d.ts.map +1 -1
- package/dist/types/components/slider/Slider.d.ts +15 -4
- package/dist/types/components/slider/Slider.d.ts.map +1 -1
- package/dist/types/components/spinner/Spinner.d.ts +14 -4
- package/dist/types/components/spinner/Spinner.d.ts.map +1 -1
- package/dist/types/components/stepper/Stepper.d.ts +17 -3
- package/dist/types/components/stepper/Stepper.d.ts.map +1 -1
- package/dist/types/components/switch/Switch.d.ts +20 -5
- package/dist/types/components/switch/Switch.d.ts.map +1 -1
- package/dist/types/components/table/Table.d.ts +24 -4
- package/dist/types/components/table/Table.d.ts.map +1 -1
- package/dist/types/components/tabs/Tabs.d.ts +25 -12
- package/dist/types/components/tabs/Tabs.d.ts.map +1 -1
- package/dist/types/components/textarea/Textarea.d.ts +8 -5
- package/dist/types/components/textarea/Textarea.d.ts.map +1 -1
- package/dist/types/components/timepicker/TimePicker.d.ts +26 -0
- package/dist/types/components/timepicker/TimePicker.d.ts.map +1 -0
- package/dist/types/components/timerangepicker/TimeRangePicker.d.ts +32 -0
- package/dist/types/components/timerangepicker/TimeRangePicker.d.ts.map +1 -0
- package/dist/types/components/toast/Toast.d.ts +23 -7
- package/dist/types/components/toast/Toast.d.ts.map +1 -1
- package/dist/types/components/tooltip/Tooltip.d.ts +13 -2
- package/dist/types/components/tooltip/Tooltip.d.ts.map +1 -1
- package/dist/types/components/treeview/TreeView.d.ts +20 -6
- package/dist/types/components/treeview/TreeView.d.ts.map +1 -1
- package/dist/types/components/virtuallist/VirtualList.d.ts +12 -16
- package/dist/types/components/virtuallist/VirtualList.d.ts.map +1 -1
- package/dist/types/index.d.ts +8 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/utils/cn/cn.d.ts +19 -0
- package/dist/types/utils/cn/cn.d.ts.map +1 -0
- package/dist/types/utils/generateid/generateId.d.ts +7 -0
- package/dist/types/utils/generateid/generateId.d.ts.map +1 -1
- package/dist/types/utils/index.d.ts +2 -0
- package/dist/types/utils/index.d.ts.map +1 -1
- package/dist/types/utils/inertmanager/inertManager.d.ts +13 -0
- package/dist/types/utils/inertmanager/inertManager.d.ts.map +1 -1
- package/dist/types/utils/keyboardnav/keyboardNav.d.ts +17 -6
- package/dist/types/utils/keyboardnav/keyboardNav.d.ts.map +1 -1
- package/dist/types/utils/onclickoutside/onClickOutside.d.ts +9 -1
- package/dist/types/utils/onclickoutside/onClickOutside.d.ts.map +1 -1
- package/dist/types/utils/portal/portal.d.ts +14 -1
- package/dist/types/utils/portal/portal.d.ts.map +1 -1
- package/dist/types/utils/restorefocus/restoreFocus.d.ts +8 -4
- package/dist/types/utils/restorefocus/restoreFocus.d.ts.map +1 -1
- package/dist/types/utils/scrolllock/scrollLock.d.ts +10 -2
- package/dist/types/utils/scrolllock/scrollLock.d.ts.map +1 -1
- package/dist/types/utils/slot/slot.d.ts +12 -0
- package/dist/types/utils/slot/slot.d.ts.map +1 -0
- package/dist/types/utils/trapfocus/trapFocus.d.ts +6 -2
- package/dist/types/utils/trapfocus/trapFocus.d.ts.map +1 -1
- package/dist/utils/cn/cn.cjs +2 -0
- package/dist/utils/cn/cn.cjs.map +1 -0
- package/dist/utils/cn/cn.js +21 -0
- package/dist/utils/cn/cn.js.map +1 -0
- package/dist/utils/inertmanager/inertManager.cjs.map +1 -1
- package/dist/utils/inertmanager/inertManager.js.map +1 -1
- package/dist/utils/onclickoutside/onClickOutside.cjs +1 -1
- package/dist/utils/onclickoutside/onClickOutside.cjs.map +1 -1
- package/dist/utils/onclickoutside/onClickOutside.js +10 -6
- package/dist/utils/onclickoutside/onClickOutside.js.map +1 -1
- package/dist/utils/portal/portal.cjs.map +1 -1
- package/dist/utils/portal/portal.js.map +1 -1
- package/dist/utils/restorefocus/restoreFocus.cjs.map +1 -1
- package/dist/utils/restorefocus/restoreFocus.js.map +1 -1
- package/dist/utils/scrolllock/scrollLock.cjs.map +1 -1
- package/dist/utils/scrolllock/scrollLock.js +7 -0
- package/dist/utils/scrolllock/scrollLock.js.map +1 -1
- package/dist/utils/slot/slot.cjs +2 -0
- package/dist/utils/slot/slot.cjs.map +1 -0
- package/dist/utils/slot/slot.js +57 -0
- package/dist/utils/slot/slot.js.map +1 -0
- package/dist/utils/trapfocus/trapFocus.cjs.map +1 -1
- package/dist/utils/trapfocus/trapFocus.js.map +1 -1
- package/package.json +49 -6
- package/dist/components/layout/HStack.cjs +0 -2
- package/dist/components/layout/HStack.cjs.map +0 -1
- package/dist/components/layout/HStack.js +0 -9
- package/dist/components/layout/HStack.js.map +0 -1
- package/dist/components/layout/Stack.cjs +0 -2
- package/dist/components/layout/Stack.cjs.map +0 -1
- package/dist/components/layout/Stack.js +0 -9
- package/dist/components/layout/Stack.js.map +0 -1
- package/dist/styles/nui.css +0 -1
- package/dist/theme/NUIProvider.cjs +0 -2
- package/dist/theme/NUIProvider.cjs.map +0 -1
- package/dist/theme/NUIProvider.js +0 -34
- package/dist/theme/NUIProvider.js.map +0 -1
- package/dist/theme/useTheme.cjs +0 -2
- package/dist/theme/useTheme.cjs.map +0 -1
- package/dist/theme/useTheme.js +0 -9
- package/dist/theme/useTheme.js.map +0 -1
- package/dist/types/components/layout/HStack.d.ts +0 -8
- package/dist/types/components/layout/HStack.d.ts.map +0 -1
- package/dist/types/components/layout/Stack.d.ts +0 -8
- package/dist/types/components/layout/Stack.d.ts.map +0 -1
- package/dist/types/theme/NUIProvider.d.ts +0 -14
- package/dist/types/theme/NUIProvider.d.ts.map +0 -1
- package/dist/types/theme/useTheme.d.ts +0 -11
- package/dist/types/theme/useTheme.d.ts.map +0 -1
- package/dist/utils/generateid/generateId.cjs +0 -2
- package/dist/utils/generateid/generateId.cjs.map +0 -1
- package/dist/utils/generateid/generateId.js +0 -7
- package/dist/utils/generateid/generateId.js.map +0 -1
- package/dist/utils/keyboardnav/keyboardNav.cjs +0 -2
- package/dist/utils/keyboardnav/keyboardNav.cjs.map +0 -1
- package/dist/utils/keyboardnav/keyboardNav.js +0 -10
- package/dist/utils/keyboardnav/keyboardNav.js.map +0 -1
|
@@ -1,114 +1,129 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { useState as
|
|
1
|
+
import { jsxs as k, jsx as a } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as G, useId as H, useState as D, useRef as J, useCallback as h, useEffect as M } from "react";
|
|
3
3
|
/* empty css */
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
e.preventDefault(), t || c(), x((o) => Math.max(0, o - 1));
|
|
50
|
-
break;
|
|
51
|
-
case "Enter":
|
|
52
|
-
if (t && p >= 0) {
|
|
53
|
-
const o = u[p];
|
|
54
|
-
r(o.label), E(o.value), s();
|
|
55
|
-
}
|
|
56
|
-
break;
|
|
57
|
-
case "Escape":
|
|
58
|
-
t && (e.preventDefault(), s());
|
|
59
|
-
break;
|
|
4
|
+
import { cn as y } from "../../utils/cn/cn.js";
|
|
5
|
+
const O = G(
|
|
6
|
+
({
|
|
7
|
+
options: s,
|
|
8
|
+
value: t,
|
|
9
|
+
defaultValue: b,
|
|
10
|
+
onChange: j,
|
|
11
|
+
placeholder: F = "Select...",
|
|
12
|
+
disabled: m = !1,
|
|
13
|
+
className: I,
|
|
14
|
+
emptyMessage: K = "No results found",
|
|
15
|
+
filter: E,
|
|
16
|
+
leftIcon: w,
|
|
17
|
+
rightIcon: L,
|
|
18
|
+
renderOption: g,
|
|
19
|
+
renderOptionIcon: $,
|
|
20
|
+
...U
|
|
21
|
+
}, r) => {
|
|
22
|
+
const l = t !== void 0, d = `${H()}-listbox`, [f, p] = D(() => l && t ? s.find((e) => e.value === t)?.label ?? "" : b ? s.find((e) => e.value === b)?.label ?? "" : ""), [n, A] = D(!1), [i, v] = D(-1), N = J(null), q = h(
|
|
23
|
+
(e) => {
|
|
24
|
+
N.current = e, typeof r == "function" ? r(e) : r && (r.current = e);
|
|
25
|
+
},
|
|
26
|
+
[r]
|
|
27
|
+
), u = s.filter(
|
|
28
|
+
(e) => E ? E(f, e) : e.label.toLowerCase().includes(f.toLowerCase())
|
|
29
|
+
), c = h(() => {
|
|
30
|
+
m || A(!0);
|
|
31
|
+
}, [m]), x = h(() => {
|
|
32
|
+
A(!1), v(-1);
|
|
33
|
+
}, []), C = h(() => {
|
|
34
|
+
const e = l ? t : b, o = s.find((_) => _.value === e);
|
|
35
|
+
p(o?.label || "");
|
|
36
|
+
}, [l, t, b, s]);
|
|
37
|
+
M(() => {
|
|
38
|
+
if (!n) return;
|
|
39
|
+
const e = (o) => {
|
|
40
|
+
N.current && !N.current.contains(o.target) && (x(), C());
|
|
41
|
+
};
|
|
42
|
+
return document.addEventListener("mousedown", e), document.addEventListener("touchstart", e), () => {
|
|
43
|
+
document.removeEventListener("mousedown", e), document.removeEventListener("touchstart", e);
|
|
44
|
+
};
|
|
45
|
+
}, [n, x, C]), M(() => {
|
|
46
|
+
if (l && t !== void 0) {
|
|
47
|
+
const e = s.find((o) => o.value === t);
|
|
48
|
+
p(e?.label || "");
|
|
60
49
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
"aria-controls": A,
|
|
78
|
-
placeholder: S,
|
|
79
|
-
disabled: l,
|
|
80
|
-
value: d,
|
|
81
|
-
onFocus: c,
|
|
82
|
-
onClick: c,
|
|
83
|
-
onChange: (e) => {
|
|
84
|
-
r(e.target.value), t || c();
|
|
85
|
-
},
|
|
86
|
-
onKeyDown: F
|
|
50
|
+
}, [l, t, s]);
|
|
51
|
+
const z = (e) => {
|
|
52
|
+
if (!m)
|
|
53
|
+
switch (e.key) {
|
|
54
|
+
case "ArrowDown":
|
|
55
|
+
e.preventDefault(), n || c(), v((o) => Math.min(u.length - 1, o + 1));
|
|
56
|
+
break;
|
|
57
|
+
case "ArrowUp":
|
|
58
|
+
e.preventDefault(), n || c(), v((o) => Math.max(0, o - 1));
|
|
59
|
+
break;
|
|
60
|
+
case "Enter":
|
|
61
|
+
n && i >= 0 && u[i] ? (e.preventDefault(), R(u[i])) : n || c();
|
|
62
|
+
break;
|
|
63
|
+
case "Escape":
|
|
64
|
+
n && (e.preventDefault(), x(), C());
|
|
65
|
+
break;
|
|
87
66
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
67
|
+
}, R = (e) => {
|
|
68
|
+
p(e.label), j?.(e.value), x();
|
|
69
|
+
};
|
|
70
|
+
return /* @__PURE__ */ k("div", { ref: q, className: y("nui-combobox", I), ...U, children: [
|
|
71
|
+
/* @__PURE__ */ k("div", { className: "nui-combobox__wrapper", children: [
|
|
72
|
+
w && /* @__PURE__ */ a("span", { className: "nui-combobox__icon -left", children: w }),
|
|
73
|
+
/* @__PURE__ */ a(
|
|
74
|
+
"input",
|
|
75
|
+
{
|
|
76
|
+
className: y(
|
|
77
|
+
"nui-combobox__input",
|
|
78
|
+
!!w && "nui-combobox__input--has-left",
|
|
79
|
+
!!L && "nui-combobox__input--has-right"
|
|
80
|
+
),
|
|
81
|
+
role: "combobox",
|
|
82
|
+
"aria-expanded": n,
|
|
83
|
+
"aria-controls": d,
|
|
84
|
+
"aria-autocomplete": "list",
|
|
85
|
+
"aria-activedescendant": n && i >= 0 ? `${d}-option-${i}` : void 0,
|
|
86
|
+
placeholder: F,
|
|
87
|
+
disabled: m,
|
|
88
|
+
value: f,
|
|
89
|
+
onFocus: c,
|
|
90
|
+
onClick: c,
|
|
91
|
+
onChange: (e) => {
|
|
92
|
+
p(e.target.value), n || c(), v(-1);
|
|
93
|
+
},
|
|
94
|
+
onKeyDown: z
|
|
95
|
+
}
|
|
96
|
+
),
|
|
97
|
+
L && /* @__PURE__ */ a("span", { className: "nui-combobox__icon -right", children: L })
|
|
98
|
+
] }),
|
|
99
|
+
n && /* @__PURE__ */ a("div", { id: d, role: "listbox", className: "nui-combobox__listbox", children: u.length === 0 ? /* @__PURE__ */ a("div", { className: "nui-combobox__empty", children: K }) : u.map((e, o) => {
|
|
100
|
+
const _ = o === i, S = e.label === f;
|
|
101
|
+
return /* @__PURE__ */ k(
|
|
102
|
+
"div",
|
|
103
|
+
{
|
|
104
|
+
id: `${d}-option-${o}`,
|
|
105
|
+
role: "option",
|
|
106
|
+
"aria-selected": S,
|
|
107
|
+
className: y(
|
|
108
|
+
"nui-combobox__option",
|
|
109
|
+
_ && "nui-combobox__option--active",
|
|
110
|
+
S && "nui-combobox__option--selected"
|
|
111
|
+
),
|
|
112
|
+
onMouseDown: (B) => B.preventDefault(),
|
|
113
|
+
onClick: () => R(e),
|
|
114
|
+
children: [
|
|
115
|
+
$ && /* @__PURE__ */ a("span", { className: "nui-combobox__option-icon", children: $(e) }),
|
|
116
|
+
g ? g(e, _) : e.label
|
|
117
|
+
]
|
|
118
|
+
},
|
|
119
|
+
e.value
|
|
120
|
+
);
|
|
121
|
+
}) })
|
|
122
|
+
] });
|
|
123
|
+
}
|
|
124
|
+
);
|
|
125
|
+
O.displayName = "Combobox";
|
|
111
126
|
export {
|
|
112
|
-
|
|
127
|
+
O as Combobox
|
|
113
128
|
};
|
|
114
129
|
//# sourceMappingURL=Combobox.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Combobox.js","sources":["../../../src/components/combobox/Combobox.tsx"],"sourcesContent":["/**\r\n * Combobox.tsx\r\n * Fully WCAG-compliant Combobox integrated with your existing utilities.\r\n */\r\n\r\n/**\r\n * Combobox.tsx\r\n * Now includes:\r\n * - leftIcon (input)\r\n * - rightIcon (input)\r\n * - renderOptionIcon (listbox)\r\n */\r\n/**\r\n * Combobox.tsx\r\n * Fully WCAG-Compliant Combobox with:\r\n * - Icons (input + option)\r\n * - Value→Label mapping fixed\r\n * - Keyboard navigation\r\n * - Click outside to close\r\n * - Controlled/uncontrolled\r\n */\r\n\r\nimport React, {\r\n useState,\r\n useEffect,\r\n useRef,\r\n useCallback,\r\n KeyboardEvent,\r\n} from 'react';\r\n\r\nimport './Combobox.css';\r\n\r\n// USING YOUR EXISTING UTILS\r\nimport { onClickOutside, generateId } from '../../utils/index';\r\n\r\nexport interface ComboboxOption {\r\n label: string;\r\n value: string;\r\n icon?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxProps {\r\n options: ComboboxOption[];\r\n\r\n value?: string;\r\n defaultValue?: string;\r\n onChange?: (value: string) => void;\r\n\r\n placeholder?: string;\r\n disabled?: boolean;\r\n className?: string;\r\n emptyMessage?: string;\r\n\r\n filter?: (input: string, option: ComboboxOption) => boolean;\r\n\r\n leftIcon?: React.ReactNode;\r\n rightIcon?: React.ReactNode;\r\n\r\n renderOption?: (option: ComboboxOption, active: boolean) => React.ReactNode;\r\n renderOptionIcon?: (option: ComboboxOption) => React.ReactNode;\r\n}\r\n\r\nexport function Combobox({\r\n options,\r\n value,\r\n defaultValue,\r\n onChange,\r\n placeholder = 'Select...',\r\n disabled = false,\r\n className = '',\r\n emptyMessage = 'No results found',\r\n filter,\r\n leftIcon,\r\n rightIcon,\r\n renderOption,\r\n renderOptionIcon,\r\n}: ComboboxProps) {\r\n const isControlled = value !== undefined;\r\n\r\n /**\r\n * displayLabel = what the user SEEES in input\r\n * value = actual selected value (sent to parent)\r\n */\r\n const [displayLabel, setDisplayLabel] = useState<string>(() => {\r\n if (isControlled && value) {\r\n const match = options.find((o) => o.value === value);\r\n return match?.label ?? '';\r\n }\r\n if (defaultValue) {\r\n const match = options.find((o) => o.value === defaultValue);\r\n return match?.label ?? '';\r\n }\r\n return '';\r\n });\r\n\r\n const [open, setOpen] = useState(false);\r\n const [activeIndex, setActiveIndex] = useState<number>(-1);\r\n\r\n const wrapperRef = useRef<HTMLDivElement | null>(null);\r\n const listboxId = useRef(generateId('combobox-list')).current;\r\n\r\n /** Filtered options */\r\n const filtered = options.filter((opt) =>\r\n filter\r\n ? filter(displayLabel, opt)\r\n : opt.label.toLowerCase().includes(displayLabel.toLowerCase())\r\n );\r\n\r\n /** Set parent value */\r\n const setValue = useCallback(\r\n (val: string) => {\r\n onChange?.(val);\r\n },\r\n [onChange]\r\n );\r\n\r\n const openList = useCallback(() => {\r\n if (!disabled) setOpen(true);\r\n }, [disabled]);\r\n\r\n const closeList = useCallback(() => {\r\n setOpen(false);\r\n setActiveIndex(-1);\r\n }, []);\r\n\r\n /** Click outside to close */\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(wrapperRef, closeList);\r\n }, [open, closeList]);\r\n\r\n /** Sync controlled (value → label) */\r\n useEffect(() => {\r\n if (isControlled && value !== undefined) {\r\n const found = options.find((o) => o.value === value);\r\n setDisplayLabel(found?.label || '');\r\n }\r\n }, [isControlled, value, options]);\r\n\r\n /** Keyboard behavior */\r\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\r\n if (disabled) return;\r\n\r\n switch (e.key) {\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n if (!open) openList();\r\n setActiveIndex((i) => Math.min(filtered.length - 1, i + 1));\r\n break;\r\n\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n if (!open) openList();\r\n setActiveIndex((i) => Math.max(0, i - 1));\r\n break;\r\n\r\n case 'Enter':\r\n if (open && activeIndex >= 0) {\r\n const opt = filtered[activeIndex];\r\n setDisplayLabel(opt.label);\r\n setValue(opt.value);\r\n closeList();\r\n }\r\n break;\r\n\r\n case 'Escape':\r\n if (open) {\r\n e.preventDefault();\r\n closeList();\r\n }\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n /** Option click */\r\n const onOptionClick = (opt: ComboboxOption) => {\r\n setDisplayLabel(opt.label);\r\n setValue(opt.value);\r\n closeList();\r\n };\r\n\r\n return (\r\n <div ref={wrapperRef} className={`ui-combobox ${className}`}>\r\n {/* Input + Icons */}\r\n <div className=\"ui-combobox-input-wrapper\">\r\n {leftIcon && <span className=\"ui-combobox-left-icon\">{leftIcon}</span>}\r\n\r\n <input\r\n className={[\r\n 'ui-combobox-input',\r\n leftIcon && 'has-left-icon',\r\n rightIcon && 'has-right-icon',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"combobox\"\r\n aria-expanded={open}\r\n aria-controls={listboxId}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n value={displayLabel}\r\n onFocus={openList}\r\n onClick={openList}\r\n onChange={(e) => {\r\n setDisplayLabel(e.target.value);\r\n if (!open) openList();\r\n }}\r\n onKeyDown={onKeyDown}\r\n />\r\n\r\n {rightIcon && (\r\n <span className=\"ui-combobox-right-icon\">{rightIcon}</span>\r\n )}\r\n </div>\r\n\r\n {open && (\r\n <div id={listboxId} role=\"listbox\" className=\"ui-combobox-listbox\">\r\n {filtered.length === 0 ? (\r\n <div className=\"ui-combobox-empty\">{emptyMessage}</div>\r\n ) : (\r\n filtered.map((opt, index) => {\r\n const active = index === activeIndex;\r\n\r\n return (\r\n <div\r\n key={opt.value}\r\n role=\"option\"\r\n aria-selected={active}\r\n className={`ui-combobox-option ${active ? 'active' : ''}`}\r\n onMouseDown={(e) => e.preventDefault()}\r\n onClick={() => onOptionClick(opt)}\r\n >\r\n {/* Option icon (if provided through renderOptionIcon) */}\r\n {renderOptionIcon && (\r\n <span className=\"ui-combobox-option-icon\">\r\n {renderOptionIcon(opt)}\r\n </span>\r\n )}\r\n\r\n {renderOption ? renderOption(opt, active) : opt.label}\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["Combobox","options","value","defaultValue","onChange","placeholder","disabled","className","emptyMessage","filter","leftIcon","rightIcon","renderOption","renderOptionIcon","isControlled","displayLabel","setDisplayLabel","useState","open","setOpen","activeIndex","setActiveIndex","wrapperRef","useRef","listboxId","generateId","filtered","opt","setValue","useCallback","val","openList","closeList","useEffect","onClickOutside","found","onKeyDown","i","onOptionClick","jsxs","jsx","index","active","e"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Combobox.js","sources":["../../../src/components/combobox/Combobox.tsx"],"sourcesContent":["\"use client\";\n\nimport React, {\n useState,\n useEffect,\n useRef,\n useCallback,\n KeyboardEvent,\n useId,\n forwardRef,\n} from 'react';\nimport { cn } from '../../utils';\nimport './Combobox.css';\n\nexport interface ComboboxOption {\n label: string;\n value: string;\n icon?: React.ReactNode;\n}\n\nexport interface ComboboxProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n options: ComboboxOption[];\n /** Controlled value of the combobox */\n value?: string;\n /** Initial uncontrolled value */\n defaultValue?: string;\n /** Callback fired when an option is selected */\n onChange?: (value: string) => void;\n placeholder?: string;\n disabled?: boolean;\n /** Message displayed when filtering returns zero results */\n emptyMessage?: string;\n /** Custom filter function. Defaults to simple substring matching on the label. */\n filter?: (input: string, option: ComboboxOption) => boolean;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n /** Custom renderer for the entire option row */\n renderOption?: (option: ComboboxOption, active: boolean) => React.ReactNode;\n /** Custom renderer strictly for the option's icon */\n renderOptionIcon?: (option: ComboboxOption) => React.ReactNode;\n}\n\n/**\n * Combobox Component\n * * A text input that provides a dropdown list of options to help users enter data.\n * Architecture Note: Implements the WAI-ARIA Combobox pattern, supporting full keyboard \n * navigation (Arrow keys, Enter, Escape) and click-outside dismissal.\n */\nexport const Combobox = forwardRef<HTMLDivElement, ComboboxProps>(\n (\n {\n options,\n value,\n defaultValue,\n onChange,\n placeholder = 'Select...',\n disabled = false,\n className,\n emptyMessage = 'No results found',\n filter,\n leftIcon,\n rightIcon,\n renderOption,\n renderOptionIcon,\n ...props\n },\n ref\n ) => {\n const isControlled = value !== undefined;\n const baseId = useId();\n const listboxId = `${baseId}-listbox`;\n\n // * State Management\n // displayLabel tracks what the user is currently typing OR the label of the selected option.\n const [displayLabel, setDisplayLabel] = useState<string>(() => {\n if (isControlled && value) return options.find((o) => o.value === value)?.label ?? '';\n if (defaultValue) return options.find((o) => o.value === defaultValue)?.label ?? '';\n return '';\n });\n \n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number>(-1);\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n\n // Merge forwarded ref with our internal wrapper ref\n const setRefs = useCallback(\n (node: HTMLDivElement) => {\n wrapperRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref]\n );\n\n // Filter Options based on current input\n const filtered = options.filter((opt) =>\n filter\n ? filter(displayLabel, opt)\n : opt.label.toLowerCase().includes(displayLabel.toLowerCase())\n );\n\n const openList = useCallback(() => {\n if (!disabled) setOpen(true);\n }, [disabled]);\n\n const closeList = useCallback(() => {\n setOpen(false);\n setActiveIndex(-1);\n }, []);\n\n // * UX Architecture: Revert Label\n // If a user types \"App\", sees \"Apple\", but clicks away without selecting it,\n // we must revert the input field back to whatever value was previously confirmed,\n // rather than leaving \"App\" dangling in the input.\n const revertLabel = useCallback(() => {\n const currentValue = isControlled ? value : defaultValue;\n const match = options.find((o) => o.value === currentValue);\n setDisplayLabel(match?.label || '');\n }, [isControlled, value, defaultValue, options]);\n\n // Click outside to close\n useEffect(() => {\n if (!open) return;\n const handleClickOutside = (event: MouseEvent | TouchEvent) => {\n if (wrapperRef.current && !wrapperRef.current.contains(event.target as Node)) {\n closeList();\n revertLabel();\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('touchstart', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('touchstart', handleClickOutside);\n };\n }, [open, closeList, revertLabel]);\n\n // Sync controlled value changes from parent\n useEffect(() => {\n if (isControlled && value !== undefined) {\n const found = options.find((o) => o.value === value);\n setDisplayLabel(found?.label || '');\n }\n }, [isControlled, value, options]);\n\n // Keyboard Navigation\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!open) openList();\n setActiveIndex((i) => Math.min(filtered.length - 1, i + 1));\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (!open) openList();\n setActiveIndex((i) => Math.max(0, i - 1));\n break;\n case 'Enter':\n if (open && activeIndex >= 0 && filtered[activeIndex]) {\n e.preventDefault();\n handleSelect(filtered[activeIndex]);\n } else if (!open) {\n openList();\n }\n break;\n case 'Escape':\n if (open) {\n e.preventDefault();\n closeList();\n revertLabel();\n }\n break;\n }\n };\n\n // Selection Handler\n const handleSelect = (opt: ComboboxOption) => {\n setDisplayLabel(opt.label);\n onChange?.(opt.value);\n closeList();\n };\n\n return (\n <div ref={setRefs} className={cn('nui-combobox', className)} {...props}>\n {/* INPUT WRAPPER */}\n <div className=\"nui-combobox__wrapper\">\n {leftIcon && <span className=\"nui-combobox__icon -left\">{leftIcon}</span>}\n\n <input\n className={cn(\n 'nui-combobox__input',\n !!leftIcon && 'nui-combobox__input--has-left',\n !!rightIcon && 'nui-combobox__input--has-right'\n )}\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n open && activeIndex >= 0 ? `${listboxId}-option-${activeIndex}` : undefined\n }\n placeholder={placeholder}\n disabled={disabled}\n value={displayLabel}\n onFocus={openList}\n onClick={openList}\n onChange={(e) => {\n setDisplayLabel(e.target.value);\n if (!open) openList();\n setActiveIndex(-1); // Reset highlight when typing\n }}\n onKeyDown={onKeyDown}\n />\n\n {rightIcon && <span className=\"nui-combobox__icon -right\">{rightIcon}</span>}\n </div>\n\n {/* DROPDOWN LISTBOX */}\n {open && (\n <div id={listboxId} role=\"listbox\" className=\"nui-combobox__listbox\">\n {filtered.length === 0 ? (\n <div className=\"nui-combobox__empty\">{emptyMessage}</div>\n ) : (\n filtered.map((opt, index) => {\n const isActive = index === activeIndex;\n const isSelected = opt.label === displayLabel; \n\n return (\n <div\n key={opt.value}\n id={`${listboxId}-option-${index}`}\n role=\"option\"\n aria-selected={isSelected}\n className={cn(\n 'nui-combobox__option',\n isActive && 'nui-combobox__option--active',\n isSelected && 'nui-combobox__option--selected'\n )}\n // Prevent input blur when clicking an option\n onMouseDown={(e) => e.preventDefault()} \n onClick={() => handleSelect(opt)}\n >\n {renderOptionIcon && (\n <span className=\"nui-combobox__option-icon\">\n {renderOptionIcon(opt)}\n </span>\n )}\n\n {renderOption ? renderOption(opt, isActive) : opt.label}\n </div>\n );\n })\n )}\n </div>\n )}\n </div>\n );\n }\n);\n\nCombobox.displayName = 'Combobox';"],"names":["Combobox","forwardRef","options","value","defaultValue","onChange","placeholder","disabled","className","emptyMessage","filter","leftIcon","rightIcon","renderOption","renderOptionIcon","props","ref","isControlled","listboxId","useId","displayLabel","setDisplayLabel","useState","o","open","setOpen","activeIndex","setActiveIndex","wrapperRef","useRef","setRefs","useCallback","node","filtered","opt","openList","closeList","revertLabel","currentValue","match","useEffect","handleClickOutside","event","found","onKeyDown","i","handleSelect","jsxs","cn","jsx","index","isActive","isSelected","e"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),i=require("react");;/* empty css */const q=require("../../utils/onclickoutside/onClickOutside.cjs"),D=require("../../utils/portal/portal.cjs"),N=require("../../utils/cn/cn.cjs");function M({sections:w,placeholder:C="Search commands…",className:E,open:u,onOpenChange:p}){const[g,L]=i.useState(!1),r=u!==void 0?u:g,o=i.useCallback(e=>{u===void 0&&L(e),p?.(e)},[u,p]),[l,h]=i.useState(""),[a,m]=i.useState({section:0,index:0}),j=i.useRef(null),y=i.useRef(null),v=i.useRef(null),f=w.map(e=>({...e,items:e.items.filter(n=>n.label.toLowerCase().includes(l.toLowerCase())||n.description?.toLowerCase().includes(l.toLowerCase()))})).filter(e=>e.items.length>0),d=f.flatMap((e,n)=>e.items.map((s,c)=>({section:n,index:c})));i.useEffect(()=>{const e=n=>{(navigator.platform.toLowerCase().includes("mac")?n.metaKey:n.ctrlKey)&&n.key.toLowerCase()==="k"&&(n.preventDefault(),o(!r))};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[r,o]),i.useEffect(()=>{if(!r)return;const e=n=>{n.key==="Escape"&&o(!1)};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[r,o]),i.useEffect(()=>{if(r)return q.onClickOutside(j,()=>o(!1))},[r,o]),i.useEffect(()=>{r&&(h(""),m({section:0,index:0}),setTimeout(()=>y.current?.focus(),10))},[r]),i.useEffect(()=>{r&&v.current&&v.current.scrollIntoView({block:"nearest"})},[a,r,l]),i.useEffect(()=>{m({section:0,index:0})},[l]);const k=e=>{if(d.length===0)return;let s=d.findIndex(c=>c.section===a.section&&c.index===a.index)+e;s<0&&(s=d.length-1),s>=d.length&&(s=0),m(d[s])},S=e=>{const n=e.key;if(n==="ArrowDown")e.preventDefault(),k(1);else if(n==="ArrowUp")e.preventDefault(),k(-1);else if(n==="Enter"){e.preventDefault();const c=f[a.section]?.items[a.index];c&&c.onSelect&&(c.onSelect(),o(!1))}};return r?t.jsxs(D.Portal,{children:[t.jsx("div",{className:"nui-cmd-overlay"}),t.jsxs("div",{ref:j,className:N.cn("nui-cmd",E),role:"dialog","aria-modal":"true",onKeyDown:S,children:[t.jsxs("div",{className:"nui-cmd-header",children:[t.jsxs("svg",{className:"nui-cmd-search-icon",width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[t.jsx("circle",{cx:"11",cy:"11",r:"8"}),t.jsx("line",{x1:"21",y1:"21",x2:"16.65",y2:"16.65"})]}),t.jsx("input",{ref:y,className:"nui-cmd-input",placeholder:C,value:l,onChange:e=>h(e.target.value)}),l&&t.jsx("button",{className:"nui-cmd-clear",onClick:()=>h(""),children:"ESC"})]}),t.jsx("div",{className:"nui-cmd-list",role:"listbox",children:f.length===0?t.jsx("div",{className:"nui-cmd-empty",children:t.jsxs("span",{className:"nui-cmd-empty-text",children:['No results found for "',l,'"']})}):f.map((e,n)=>t.jsxs("div",{className:"nui-cmd-section",children:[e.title&&t.jsx("div",{className:"nui-cmd-section-title",children:e.title}),t.jsx("div",{className:"nui-cmd-section-items",children:e.items.map((s,c)=>{const x=a.section===n&&a.index===c;return t.jsxs("div",{ref:x?v:null,role:"option","aria-selected":x,className:N.cn("nui-cmd-item",x&&"active"),onMouseEnter:()=>m({section:n,index:c}),onClick:()=>{s.onSelect?.(),o(!1)},children:[s.icon&&t.jsx("div",{className:"nui-cmd-item-icon",children:s.icon}),t.jsxs("div",{className:"nui-cmd-item-meta",children:[t.jsx("div",{className:"nui-cmd-item-label",children:s.label}),s.description&&t.jsx("div",{className:"nui-cmd-item-description",children:s.description})]}),s.shortcut&&t.jsx("div",{className:"nui-cmd-item-shortcut",children:s.shortcut.split(" ").map((b,R)=>t.jsx("kbd",{children:b},R))})]},s.id)})})]},n))})]})]}):null}exports.CommandPalette=M;
|
|
2
2
|
//# sourceMappingURL=CommandPalette.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandPalette.cjs","sources":["../../../src/components/commandpalette/CommandPalette.tsx"],"sourcesContent":["/**\r\n * CommandPalette.tsx — FINAL VERSION\r\n * -----------------------------------\r\n * Full-featured Cmd+K command menu.\r\n * - Cmd+K / Ctrl+K global shortcut\r\n * - Search filter\r\n * - Keyboard navigation\r\n * - Portal + overlay\r\n * - Sections\r\n * - ARIA-compliant\r\n */\r\n\r\nimport {\r\n useEffect,\r\n useRef,\r\n useState,\r\n ReactNode,\r\n KeyboardEvent as ReactKeyboardEvent,\r\n} from 'react';\r\nimport './CommandPalette.css';\r\nimport { Portal, onClickOutside} from '../../utils/index';\r\n\r\nexport interface CommandItem {\r\n id: string;\r\n label: string;\r\n icon?: ReactNode;\r\n shortcut?: string;\r\n description?: string;\r\n onSelect?: () => void;\r\n}\r\n\r\nexport interface CommandSection {\r\n title?: string;\r\n items: CommandItem[];\r\n}\r\n\r\ninterface CommandPaletteProps {\r\n sections: CommandSection[];\r\n placeholder?: string;\r\n className?: string;\r\n}\r\n\r\nexport function CommandPalette({\r\n sections,\r\n placeholder = 'Search commands…',\r\n className = '',\r\n}: CommandPaletteProps) {\r\n const [open, setOpen] = useState(false);\r\n const [query, setQuery] = useState('');\r\n const [active, setActive] = useState<{ section: number; index: number }>({\r\n section: 0,\r\n index: 0,\r\n });\r\n\r\n const paletteRef = useRef<HTMLDivElement | null>(null);\r\n const inputRef = useRef<HTMLInputElement | null>(null);\r\n\r\n /** Global Cmd+K shortcut */\r\n useEffect(() => {\r\n const handler = (e: globalThis.KeyboardEvent) => {\r\n const isMac = navigator.platform.toLowerCase().includes('mac');\r\n const cmd = isMac ? e.metaKey : e.ctrlKey;\r\n\r\n if (cmd && e.key.toLowerCase() === 'k') {\r\n e.preventDefault();\r\n setOpen((o) => !o);\r\n }\r\n };\r\n\r\n document.addEventListener('keydown', handler as EventListener);\r\n return () =>\r\n document.removeEventListener('keydown', handler as EventListener);\r\n }, []);\r\n\r\n /** Close on ESC */\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const handler = (e: globalThis.KeyboardEvent) => {\r\n if (e.key === 'Escape') setOpen(false);\r\n };\r\n\r\n document.addEventListener('keydown', handler as EventListener);\r\n return () =>\r\n document.removeEventListener('keydown', handler as EventListener);\r\n }, [open]);\r\n\r\n /** Click outside to close */\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(paletteRef, () => setOpen(false));\r\n }, [open]);\r\n\r\n /** Autofocus search when opened */\r\n useEffect(() => {\r\n if (open) {\r\n setTimeout(() => inputRef.current?.focus(), 0);\r\n setQuery('');\r\n }\r\n }, [open]);\r\n\r\n /** Filtered list */\r\n const filteredSections = sections.map((sec) => ({\r\n ...sec,\r\n items: sec.items.filter((i) =>\r\n i.label.toLowerCase().includes(query.toLowerCase())\r\n ),\r\n }));\r\n\r\n /** Flatten for easier navigation */\r\n const flatList = filteredSections.flatMap((sec, sIdx) =>\r\n sec.items.map((_, iIdx) => ({ section: sIdx, index: iIdx }))\r\n );\r\n\r\n /** Handle keyboard navigation */\r\n const move = (dir: 1 | -1) => {\r\n if (flatList.length === 0) return;\r\n\r\n const currentIndex = flatList.findIndex(\r\n (x) => x.section === active.section && x.index === active.index\r\n );\r\n\r\n let next = currentIndex + dir;\r\n if (next < 0) next = flatList.length - 1;\r\n if (next >= flatList.length) next = 0;\r\n\r\n setActive(flatList[next]);\r\n };\r\n\r\n const handleKey = (e: ReactKeyboardEvent<HTMLDivElement>) => {\r\n const key = e.key;\r\n\r\n if (key === 'ArrowDown') {\r\n e.preventDefault();\r\n move(1);\r\n } else if (key === 'ArrowUp') {\r\n e.preventDefault();\r\n move(-1);\r\n } else if (key === 'Enter') {\r\n e.preventDefault();\r\n\r\n const sec = filteredSections[active.section];\r\n const item = sec?.items[active.index];\r\n\r\n if (item && item.onSelect) {\r\n item.onSelect();\r\n setOpen(false);\r\n }\r\n }\r\n };\r\n\r\n if (!open) return null;\r\n\r\n return (\r\n <Portal>\r\n <div className=\"ui-cmd-overlay\" />\r\n\r\n <div\r\n ref={paletteRef}\r\n className={`ui-cmd ${className}`}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n onKeyDown={handleKey}\r\n >\r\n {/* Search bar */}\r\n <input\r\n ref={inputRef}\r\n className=\"ui-cmd-input\"\r\n placeholder={placeholder}\r\n value={query}\r\n onChange={(e) => setQuery(e.target.value)}\r\n />\r\n\r\n <div className=\"ui-cmd-list\">\r\n {filteredSections.map((sec, sIdx) => (\r\n <div key={sIdx} className=\"ui-cmd-section\">\r\n {sec.title && (\r\n <div className=\"ui-cmd-section-title\">{sec.title}</div>\r\n )}\r\n\r\n {sec.items.length === 0 ? (\r\n <div className=\"ui-cmd-empty\">No results</div>\r\n ) : (\r\n sec.items.map((item, iIdx) => {\r\n const isActive =\r\n active.section === sIdx && active.index === iIdx;\r\n\r\n return (\r\n <div\r\n key={item.id}\r\n className={`ui-cmd-item ${isActive ? 'active' : ''}`}\r\n onMouseEnter={() =>\r\n setActive({ section: sIdx, index: iIdx })\r\n }\r\n onClick={() => {\r\n item.onSelect?.();\r\n setOpen(false);\r\n }}\r\n >\r\n {item.icon && (\r\n <span className=\"ui-cmd-icon\">{item.icon}</span>\r\n )}\r\n\r\n <div className=\"ui-cmd-meta\">\r\n <div className=\"ui-cmd-label\">{item.label}</div>\r\n {item.description && (\r\n <div className=\"ui-cmd-description\">\r\n {item.description}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {item.shortcut && (\r\n <span className=\"ui-cmd-shortcut\">{item.shortcut}</span>\r\n )}\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </Portal>\r\n );\r\n}\r\n"],"names":["CommandPalette","sections","placeholder","className","open","setOpen","useState","query","setQuery","active","setActive","paletteRef","useRef","inputRef","useEffect","handler","e","o","onClickOutside","filteredSections","sec","i","flatList","sIdx","_","iIdx","move","dir","next","x","handleKey","key","item","Portal","jsx","jsxs","isActive"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CommandPalette.cjs","sources":["../../../src/components/commandpalette/CommandPalette.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useEffect,\n useRef,\n useState,\n ReactNode,\n KeyboardEvent as ReactKeyboardEvent,\n useCallback,\n} from 'react';\nimport { Portal, onClickOutside, cn } from '../../utils';\nimport './CommandPalette.css';\n\n/* ============================================================\n * Types\n * ============================================================ */\n\nexport interface CommandItem {\n id: string;\n label: string;\n icon?: ReactNode;\n /** Displayed as a <kbd> hint, e.g., \"⌘ K\" */\n shortcut?: string;\n description?: string;\n onSelect?: () => void;\n}\n\nexport interface CommandSection {\n title?: string;\n items: CommandItem[];\n}\n\nexport interface CommandPaletteProps {\n sections: CommandSection[];\n placeholder?: string;\n className?: string;\n /** Forces the palette open/closed. If undefined, it operates purely via Cmd+K internally. */\n open?: boolean; \n onOpenChange?: (open: boolean) => void;\n}\n\n/* ============================================================\n * Component\n * ============================================================ */\n\n/**\n * CommandPalette Component\n * * A fast, composable, unstyled command menu for React.\n * Architecture Note: Manages a nested data structure (Sections > Items) but mathematically \n * flattens it for seamless O(1) keyboard navigation across section boundaries.\n */\nexport function CommandPalette({\n sections,\n placeholder = 'Search commands…',\n className,\n open: controlledOpen,\n onOpenChange,\n}: CommandPaletteProps) {\n const [internalOpen, setInternalOpen] = useState(false);\n const isOpen = controlledOpen !== undefined ? controlledOpen : internalOpen;\n\n const handleOpenChange = useCallback((newOpen: boolean) => {\n if (controlledOpen === undefined) setInternalOpen(newOpen);\n onOpenChange?.(newOpen);\n }, [controlledOpen, onOpenChange]);\n\n const [query, setQuery] = useState('');\n const [active, setActive] = useState<{ section: number; index: number }>({\n section: 0,\n index: 0,\n });\n\n const paletteRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const activeItemRef = useRef<HTMLDivElement | null>(null);\n\n /* ----------------------------------------------------\n Filtering & Flat Mapping\n ---------------------------------------------------- */\n // 1. Filter items based on query (checks both label and description)\n // 2. Filter out sections that end up completely empty\n const filteredSections = sections\n .map((sec) => ({\n ...sec,\n items: sec.items.filter(\n (i) =>\n i.label.toLowerCase().includes(query.toLowerCase()) ||\n i.description?.toLowerCase().includes(query.toLowerCase())\n ),\n }))\n .filter((sec) => sec.items.length > 0); \n\n // * Navigation Engine: \n // Creates a flat list of coordinates [{section: 0, index: 0}, {section: 0, index: 1}, {section: 1, index: 0}]\n // This allows the ArrowUp/ArrowDown keys to easily increment/decrement a single integer \n // and look up the exact multidimensional coordinate.\n const flatList = filteredSections.flatMap((sec, sIdx) =>\n sec.items.map((_, iIdx) => ({ section: sIdx, index: iIdx }))\n );\n\n /* ----------------------------------------------------\n Event Listeners & Effects\n ---------------------------------------------------- */\n // Global Cmd+K / Ctrl+K shortcut\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n const isMac = navigator.platform.toLowerCase().includes('mac');\n const cmd = isMac ? e.metaKey : e.ctrlKey;\n\n if (cmd && e.key.toLowerCase() === 'k') {\n e.preventDefault();\n handleOpenChange(!isOpen);\n }\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [isOpen, handleOpenChange]);\n\n // Close on ESC\n useEffect(() => {\n if (!isOpen) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') handleOpenChange(false);\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [isOpen, handleOpenChange]);\n\n // Click outside to close\n useEffect(() => {\n if (!isOpen) return;\n return onClickOutside(paletteRef, () => handleOpenChange(false));\n }, [isOpen, handleOpenChange]);\n\n // Reset state and autofocus when opened\n useEffect(() => {\n if (isOpen) {\n setQuery('');\n setActive({ section: 0, index: 0 });\n // Small timeout ensures the React Portal has mounted the DOM node before focusing\n setTimeout(() => inputRef.current?.focus(), 10);\n }\n }, [isOpen]);\n\n // Auto-scroll active item into view\n useEffect(() => {\n if (isOpen && activeItemRef.current) {\n activeItemRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [active, isOpen, query]);\n\n // Reset active index when user types (so it jumps back to top)\n useEffect(() => {\n setActive({ section: 0, index: 0 });\n }, [query]);\n\n /* ----------------------------------------------------\n Keyboard Navigation\n ---------------------------------------------------- */\n const move = (dir: 1 | -1) => {\n if (flatList.length === 0) return;\n\n const currentIndex = flatList.findIndex(\n (x) => x.section === active.section && x.index === active.index\n );\n\n let next = currentIndex + dir;\n // Wrap around logic\n if (next < 0) next = flatList.length - 1;\n if (next >= flatList.length) next = 0;\n\n setActive(flatList[next]);\n };\n\n const handleKey = (e: ReactKeyboardEvent<HTMLDivElement>) => {\n const key = e.key;\n\n if (key === 'ArrowDown') {\n e.preventDefault();\n move(1);\n } else if (key === 'ArrowUp') {\n e.preventDefault();\n move(-1);\n } else if (key === 'Enter') {\n e.preventDefault();\n const sec = filteredSections[active.section];\n const item = sec?.items[active.index];\n\n if (item && item.onSelect) {\n item.onSelect();\n handleOpenChange(false);\n }\n }\n };\n\n /* ----------------------------------------------------\n Render\n ---------------------------------------------------- */\n if (!isOpen) return null;\n\n return (\n <Portal>\n <div className=\"nui-cmd-overlay\" />\n\n <div\n ref={paletteRef}\n className={cn(\"nui-cmd\", className)}\n role=\"dialog\"\n aria-modal=\"true\"\n onKeyDown={handleKey}\n >\n {/* Search Header */}\n <div className=\"nui-cmd-header\">\n <svg className=\"nui-cmd-search-icon\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n </svg>\n <input\n ref={inputRef}\n className=\"nui-cmd-input\"\n placeholder={placeholder}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n />\n {query && (\n <button className=\"nui-cmd-clear\" onClick={() => setQuery('')}>\n ESC\n </button>\n )}\n </div>\n\n {/* Results List */}\n <div className=\"nui-cmd-list\" role=\"listbox\">\n {filteredSections.length === 0 ? (\n <div className=\"nui-cmd-empty\">\n <span className=\"nui-cmd-empty-text\">No results found for \"{query}\"</span>\n </div>\n ) : (\n filteredSections.map((sec, sIdx) => (\n <div key={sIdx} className=\"nui-cmd-section\">\n {sec.title && (\n <div className=\"nui-cmd-section-title\">{sec.title}</div>\n )}\n\n <div className=\"nui-cmd-section-items\">\n {sec.items.map((item, iIdx) => {\n const isActive = active.section === sIdx && active.index === iIdx;\n\n return (\n <div\n key={item.id}\n ref={isActive ? activeItemRef : null}\n role=\"option\"\n aria-selected={isActive}\n className={cn(\"nui-cmd-item\", isActive && \"active\")}\n onMouseEnter={() => setActive({ section: sIdx, index: iIdx })}\n onClick={() => {\n item.onSelect?.();\n handleOpenChange(false);\n }}\n >\n {item.icon && (\n <div className=\"nui-cmd-item-icon\">{item.icon}</div>\n )}\n\n <div className=\"nui-cmd-item-meta\">\n <div className=\"nui-cmd-item-label\">{item.label}</div>\n {item.description && (\n <div className=\"nui-cmd-item-description\">\n {item.description}\n </div>\n )}\n </div>\n\n {item.shortcut && (\n <div className=\"nui-cmd-item-shortcut\">\n {item.shortcut.split(' ').map((key, k) => (\n <kbd key={k}>{key}</kbd>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </Portal>\n );\n}"],"names":["CommandPalette","sections","placeholder","className","controlledOpen","onOpenChange","internalOpen","setInternalOpen","useState","isOpen","handleOpenChange","useCallback","newOpen","query","setQuery","active","setActive","paletteRef","useRef","inputRef","activeItemRef","filteredSections","sec","i","flatList","sIdx","_","iIdx","useEffect","handler","e","onClickOutside","move","dir","next","x","handleKey","key","item","Portal","jsx","jsxs","cn","isActive","k"],"mappings":"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"}
|
|
@@ -1,111 +1,134 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { useState as
|
|
1
|
+
import { jsxs as o, jsx as i } from "react/jsx-runtime";
|
|
2
|
+
import { useState as k, useCallback as j, useRef as N, useEffect as d } from "react";
|
|
3
3
|
/* empty css */
|
|
4
|
-
import { onClickOutside as
|
|
5
|
-
import { Portal as
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
import { onClickOutside as I } from "../../utils/onclickoutside/onClickOutside.js";
|
|
5
|
+
import { Portal as P } from "../../utils/portal/portal.js";
|
|
6
|
+
import { cn as g } from "../../utils/cn/cn.js";
|
|
7
|
+
function W({
|
|
8
|
+
sections: E,
|
|
9
|
+
placeholder: b = "Search commands…",
|
|
10
|
+
className: S,
|
|
11
|
+
open: u,
|
|
12
|
+
onOpenChange: x
|
|
10
13
|
}) {
|
|
11
|
-
const [
|
|
14
|
+
const [D, A] = k(!1), s = u !== void 0 ? u : D, r = j((e) => {
|
|
15
|
+
u === void 0 && A(e), x?.(e);
|
|
16
|
+
}, [u, x]), [l, v] = k(""), [a, f] = k({
|
|
12
17
|
section: 0,
|
|
13
18
|
index: 0
|
|
14
|
-
}),
|
|
19
|
+
}), w = N(null), C = N(null), p = N(null), h = E.map((e) => ({
|
|
20
|
+
...e,
|
|
21
|
+
items: e.items.filter(
|
|
22
|
+
(n) => n.label.toLowerCase().includes(l.toLowerCase()) || n.description?.toLowerCase().includes(l.toLowerCase())
|
|
23
|
+
)
|
|
24
|
+
})).filter((e) => e.items.length > 0), m = h.flatMap(
|
|
25
|
+
(e, n) => e.items.map((t, c) => ({ section: n, index: c }))
|
|
26
|
+
);
|
|
15
27
|
d(() => {
|
|
16
|
-
const e = (
|
|
17
|
-
(navigator.platform.toLowerCase().includes("mac") ?
|
|
28
|
+
const e = (n) => {
|
|
29
|
+
(navigator.platform.toLowerCase().includes("mac") ? n.metaKey : n.ctrlKey) && n.key.toLowerCase() === "k" && (n.preventDefault(), r(!s));
|
|
18
30
|
};
|
|
19
31
|
return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
|
|
20
|
-
}, []), d(() => {
|
|
32
|
+
}, [s, r]), d(() => {
|
|
21
33
|
if (!s) return;
|
|
22
|
-
const e = (
|
|
23
|
-
|
|
34
|
+
const e = (n) => {
|
|
35
|
+
n.key === "Escape" && r(!1);
|
|
24
36
|
};
|
|
25
37
|
return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
|
|
26
|
-
}, [s]), d(() => {
|
|
38
|
+
}, [s, r]), d(() => {
|
|
27
39
|
if (s)
|
|
28
|
-
return
|
|
40
|
+
return I(w, () => r(!1));
|
|
41
|
+
}, [s, r]), d(() => {
|
|
42
|
+
s && (v(""), f({ section: 0, index: 0 }), setTimeout(() => C.current?.focus(), 10));
|
|
29
43
|
}, [s]), d(() => {
|
|
30
|
-
s &&
|
|
31
|
-
}, [s])
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
(e, t) => e.items.map((n, i) => ({ section: t, index: i }))
|
|
39
|
-
), w = (e) => {
|
|
40
|
-
if (a.length === 0) return;
|
|
41
|
-
let n = a.findIndex(
|
|
42
|
-
(i) => i.section === o.section && i.index === o.index
|
|
44
|
+
s && p.current && p.current.scrollIntoView({ block: "nearest" });
|
|
45
|
+
}, [a, s, l]), d(() => {
|
|
46
|
+
f({ section: 0, index: 0 });
|
|
47
|
+
}, [l]);
|
|
48
|
+
const L = (e) => {
|
|
49
|
+
if (m.length === 0) return;
|
|
50
|
+
let t = m.findIndex(
|
|
51
|
+
(c) => c.section === a.section && c.index === a.index
|
|
43
52
|
) + e;
|
|
44
|
-
|
|
45
|
-
},
|
|
46
|
-
const
|
|
47
|
-
if (
|
|
48
|
-
e.preventDefault(),
|
|
49
|
-
else if (
|
|
50
|
-
e.preventDefault(),
|
|
51
|
-
else if (
|
|
53
|
+
t < 0 && (t = m.length - 1), t >= m.length && (t = 0), f(m[t]);
|
|
54
|
+
}, K = (e) => {
|
|
55
|
+
const n = e.key;
|
|
56
|
+
if (n === "ArrowDown")
|
|
57
|
+
e.preventDefault(), L(1);
|
|
58
|
+
else if (n === "ArrowUp")
|
|
59
|
+
e.preventDefault(), L(-1);
|
|
60
|
+
else if (n === "Enter") {
|
|
52
61
|
e.preventDefault();
|
|
53
|
-
const
|
|
54
|
-
|
|
62
|
+
const c = h[a.section]?.items[a.index];
|
|
63
|
+
c && c.onSelect && (c.onSelect(), r(!1));
|
|
55
64
|
}
|
|
56
65
|
};
|
|
57
|
-
return s ? /* @__PURE__ */
|
|
58
|
-
/* @__PURE__ */
|
|
59
|
-
/* @__PURE__ */
|
|
66
|
+
return s ? /* @__PURE__ */ o(P, { children: [
|
|
67
|
+
/* @__PURE__ */ i("div", { className: "nui-cmd-overlay" }),
|
|
68
|
+
/* @__PURE__ */ o(
|
|
60
69
|
"div",
|
|
61
70
|
{
|
|
62
|
-
ref:
|
|
63
|
-
className:
|
|
71
|
+
ref: w,
|
|
72
|
+
className: g("nui-cmd", S),
|
|
64
73
|
role: "dialog",
|
|
65
74
|
"aria-modal": "true",
|
|
66
|
-
onKeyDown:
|
|
75
|
+
onKeyDown: K,
|
|
67
76
|
children: [
|
|
68
|
-
/* @__PURE__ */
|
|
69
|
-
"
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
77
|
+
/* @__PURE__ */ o("div", { className: "nui-cmd-header", children: [
|
|
78
|
+
/* @__PURE__ */ o("svg", { className: "nui-cmd-search-icon", width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [
|
|
79
|
+
/* @__PURE__ */ i("circle", { cx: "11", cy: "11", r: "8" }),
|
|
80
|
+
/* @__PURE__ */ i("line", { x1: "21", y1: "21", x2: "16.65", y2: "16.65" })
|
|
81
|
+
] }),
|
|
82
|
+
/* @__PURE__ */ i(
|
|
83
|
+
"input",
|
|
84
|
+
{
|
|
85
|
+
ref: C,
|
|
86
|
+
className: "nui-cmd-input",
|
|
87
|
+
placeholder: b,
|
|
88
|
+
value: l,
|
|
89
|
+
onChange: (e) => v(e.target.value)
|
|
90
|
+
}
|
|
91
|
+
),
|
|
92
|
+
l && /* @__PURE__ */ i("button", { className: "nui-cmd-clear", onClick: () => v(""), children: "ESC" })
|
|
93
|
+
] }),
|
|
94
|
+
/* @__PURE__ */ i("div", { className: "nui-cmd-list", role: "listbox", children: h.length === 0 ? /* @__PURE__ */ i("div", { className: "nui-cmd-empty", children: /* @__PURE__ */ o("span", { className: "nui-cmd-empty-text", children: [
|
|
95
|
+
'No results found for "',
|
|
96
|
+
l,
|
|
97
|
+
'"'
|
|
98
|
+
] }) }) : h.map((e, n) => /* @__PURE__ */ o("div", { className: "nui-cmd-section", children: [
|
|
99
|
+
e.title && /* @__PURE__ */ i("div", { className: "nui-cmd-section-title", children: e.title }),
|
|
100
|
+
/* @__PURE__ */ i("div", { className: "nui-cmd-section-items", children: e.items.map((t, c) => {
|
|
101
|
+
const y = a.section === n && a.index === c;
|
|
102
|
+
return /* @__PURE__ */ o(
|
|
83
103
|
"div",
|
|
84
104
|
{
|
|
85
|
-
|
|
86
|
-
|
|
105
|
+
ref: y ? p : null,
|
|
106
|
+
role: "option",
|
|
107
|
+
"aria-selected": y,
|
|
108
|
+
className: g("nui-cmd-item", y && "active"),
|
|
109
|
+
onMouseEnter: () => f({ section: n, index: c }),
|
|
87
110
|
onClick: () => {
|
|
88
|
-
|
|
111
|
+
t.onSelect?.(), r(!1);
|
|
89
112
|
},
|
|
90
113
|
children: [
|
|
91
|
-
|
|
92
|
-
/* @__PURE__ */
|
|
93
|
-
/* @__PURE__ */
|
|
94
|
-
|
|
114
|
+
t.icon && /* @__PURE__ */ i("div", { className: "nui-cmd-item-icon", children: t.icon }),
|
|
115
|
+
/* @__PURE__ */ o("div", { className: "nui-cmd-item-meta", children: [
|
|
116
|
+
/* @__PURE__ */ i("div", { className: "nui-cmd-item-label", children: t.label }),
|
|
117
|
+
t.description && /* @__PURE__ */ i("div", { className: "nui-cmd-item-description", children: t.description })
|
|
95
118
|
] }),
|
|
96
|
-
|
|
119
|
+
t.shortcut && /* @__PURE__ */ i("div", { className: "nui-cmd-item-shortcut", children: t.shortcut.split(" ").map((M, R) => /* @__PURE__ */ i("kbd", { children: M }, R)) })
|
|
97
120
|
]
|
|
98
121
|
},
|
|
99
|
-
|
|
122
|
+
t.id
|
|
100
123
|
);
|
|
101
|
-
})
|
|
102
|
-
] },
|
|
124
|
+
}) })
|
|
125
|
+
] }, n)) })
|
|
103
126
|
]
|
|
104
127
|
}
|
|
105
128
|
)
|
|
106
129
|
] }) : null;
|
|
107
130
|
}
|
|
108
131
|
export {
|
|
109
|
-
|
|
132
|
+
W as CommandPalette
|
|
110
133
|
};
|
|
111
134
|
//# sourceMappingURL=CommandPalette.js.map
|