@nofinite/nui 1.1.0 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/accordion/Accordion.cjs.map +1 -0
- package/dist/components/accordion/Accordion.js.map +1 -0
- package/dist/components/alert/Alert.cjs.map +1 -0
- package/dist/components/alert/Alert.js.map +1 -0
- package/dist/components/avatar/Avatar.cjs.map +1 -0
- package/dist/components/avatar/Avatar.js.map +1 -0
- package/dist/components/avatar/AvatarGroup.cjs.map +1 -0
- package/dist/components/avatar/AvatarGroup.js.map +1 -0
- package/dist/components/badge/Badge.cjs.map +1 -0
- package/dist/components/badge/Badge.js.map +1 -0
- package/dist/components/badge/BadgeGroup.cjs.map +1 -0
- package/dist/components/badge/BadgeGroup.js.map +1 -0
- package/dist/components/breadcrumbs/Breadcrumbs.cjs.map +1 -0
- package/dist/components/breadcrumbs/Breadcrumbs.js.map +1 -0
- package/dist/components/button/Button.cjs.map +1 -0
- package/dist/components/button/Button.js.map +1 -0
- package/dist/components/card/Card.cjs.map +1 -0
- package/dist/components/card/Card.js.map +1 -0
- package/dist/components/checkbox/Checkbox.cjs.map +1 -0
- package/dist/components/checkbox/Checkbox.js.map +1 -0
- package/dist/components/chip/Chip.cjs.map +1 -0
- package/dist/components/chip/Chip.js.map +1 -0
- package/dist/components/combobox/Combobox.cjs.map +1 -0
- package/dist/components/combobox/Combobox.js.map +1 -0
- package/dist/components/commandpalette/CommandPalette.cjs.map +1 -0
- package/dist/components/commandpalette/CommandPalette.js.map +1 -0
- package/dist/components/contextmenu/ContextMenu.cjs.map +1 -0
- package/dist/components/contextmenu/ContextMenu.js.map +1 -0
- package/dist/components/datagrid/DataGrid.cjs.map +1 -0
- package/dist/components/datagrid/DataGrid.js.map +1 -0
- package/dist/components/datepicker/DatePicker.cjs.map +1 -0
- package/dist/components/datepicker/DatePicker.js.map +1 -0
- package/dist/components/daterangepicker/DateRangePicker.cjs.map +1 -0
- package/dist/components/daterangepicker/DateRangePicker.js.map +1 -0
- package/dist/components/drawer/Drawer.cjs.map +1 -0
- package/dist/components/drawer/Drawer.js.map +1 -0
- package/dist/components/dropdown/Dropdown.cjs.map +1 -0
- package/dist/components/dropdown/Dropdown.js.map +1 -0
- package/dist/components/fileuploader/FileUploader.cjs.map +1 -0
- package/dist/components/fileuploader/FileUploader.js.map +1 -0
- package/dist/components/hovercard/HoverCard.cjs.map +1 -0
- package/dist/components/hovercard/HoverCard.js.map +1 -0
- package/dist/components/input/Input.cjs.map +1 -0
- package/dist/components/input/Input.js.map +1 -0
- package/dist/components/layout/Container.cjs.map +1 -0
- package/dist/components/layout/Container.js.map +1 -0
- package/dist/components/layout/Flex.cjs.map +1 -0
- package/dist/components/layout/Flex.js.map +1 -0
- package/dist/components/layout/Grid.cjs.map +1 -0
- package/dist/components/layout/Grid.js.map +1 -0
- package/dist/components/layout/HStack.cjs.map +1 -0
- package/dist/components/layout/HStack.js.map +1 -0
- package/dist/components/layout/Stack.cjs.map +1 -0
- package/dist/components/layout/Stack.js.map +1 -0
- package/dist/components/megamenu/MegaMenu.cjs.map +1 -0
- package/dist/components/megamenu/MegaMenu.js.map +1 -0
- package/dist/components/modal/Modal.cjs.map +1 -0
- package/dist/components/modal/Modal.js.map +1 -0
- package/dist/components/pagination/Pagination.cjs.map +1 -0
- package/dist/components/pagination/Pagination.js.map +1 -0
- package/dist/components/popover/Popover.cjs.map +1 -0
- package/dist/components/popover/Popover.js.map +1 -0
- package/dist/components/progress/Progress.cjs.map +1 -0
- package/dist/components/progress/Progress.js.map +1 -0
- package/dist/components/radiogroup/RadioGroup.cjs.map +1 -0
- package/dist/components/radiogroup/RadioGroup.js.map +1 -0
- package/dist/components/rating/Rating.cjs.map +1 -0
- package/dist/components/rating/Rating.js.map +1 -0
- package/dist/components/select/Select.cjs.map +1 -0
- package/dist/components/select/Select.js.map +1 -0
- package/dist/components/skeleton/Skeleton.cjs.map +1 -0
- package/dist/components/skeleton/Skeleton.js.map +1 -0
- package/dist/components/slider/Slider.cjs.map +1 -0
- package/dist/components/slider/Slider.js.map +1 -0
- package/dist/components/spinner/Spinner.cjs.map +1 -0
- package/dist/components/spinner/Spinner.js.map +1 -0
- package/dist/components/stepper/Stepper.cjs.map +1 -0
- package/dist/components/stepper/Stepper.js.map +1 -0
- package/dist/components/switch/Switch.cjs.map +1 -0
- package/dist/components/switch/Switch.js.map +1 -0
- package/dist/components/table/Table.cjs.map +1 -0
- package/dist/components/table/Table.js.map +1 -0
- package/dist/components/tabs/Tabs.cjs.map +1 -0
- package/dist/components/tabs/Tabs.js.map +1 -0
- package/dist/components/textarea/Textarea.cjs.map +1 -0
- package/dist/components/textarea/Textarea.js.map +1 -0
- package/dist/components/toast/Toast.cjs.map +1 -0
- package/dist/components/toast/Toast.js.map +1 -0
- package/dist/components/tooltip/Tooltip.cjs.map +1 -0
- package/dist/components/tooltip/Tooltip.js.map +1 -0
- package/dist/components/treeview/TreeView.cjs.map +1 -0
- package/dist/components/treeview/TreeView.js.map +1 -0
- package/dist/components/virtuallist/VirtualList.cjs.map +1 -0
- package/dist/components/virtuallist/VirtualList.js.map +1 -0
- package/dist/package.json +2 -2
- package/dist/theme/NUIProvider.cjs.map +1 -0
- package/dist/theme/NUIProvider.js.map +1 -0
- package/dist/theme/useTheme.cjs.map +1 -0
- package/dist/theme/useTheme.js.map +1 -0
- package/dist/types/components/accordion/Accordion.d.ts.map +1 -0
- package/dist/types/components/alert/Alert.d.ts.map +1 -0
- package/dist/types/components/avatar/Avatar.d.ts.map +1 -0
- package/dist/types/components/avatar/AvatarGroup.d.ts.map +1 -0
- package/dist/types/components/badge/Badge.d.ts.map +1 -0
- package/dist/types/components/badge/BadgeGroup.d.ts.map +1 -0
- package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts.map +1 -0
- package/dist/types/components/button/Button.d.ts.map +1 -0
- package/dist/types/components/card/Card.d.ts.map +1 -0
- package/dist/types/components/checkbox/Checkbox.d.ts.map +1 -0
- package/dist/types/components/chip/Chip.d.ts.map +1 -0
- package/dist/types/components/combobox/Combobox.d.ts.map +1 -0
- package/dist/types/components/commandpalette/CommandPalette.d.ts.map +1 -0
- package/dist/types/components/contextmenu/ContextMenu.d.ts.map +1 -0
- package/dist/types/components/datagrid/DataGrid.d.ts.map +1 -0
- package/dist/types/components/datepicker/DatePicker.d.ts.map +1 -0
- package/dist/types/components/daterangepicker/DateRangePicker.d.ts.map +1 -0
- package/dist/types/components/drawer/Drawer.d.ts.map +1 -0
- package/dist/types/components/dropdown/Dropdown.d.ts.map +1 -0
- package/dist/types/components/fileuploader/FileUploader.d.ts.map +1 -0
- package/dist/types/components/hovercard/HoverCard.d.ts.map +1 -0
- package/dist/types/components/input/Input.d.ts.map +1 -0
- package/dist/types/components/layout/Container.d.ts.map +1 -0
- package/dist/types/components/layout/Flex.d.ts.map +1 -0
- package/dist/types/components/layout/Grid.d.ts.map +1 -0
- package/dist/types/components/layout/HStack.d.ts.map +1 -0
- package/dist/types/components/layout/Stack.d.ts.map +1 -0
- package/dist/types/components/megamenu/MegaMenu.d.ts.map +1 -0
- package/dist/types/components/modal/Modal.d.ts.map +1 -0
- package/dist/types/components/pagination/Pagination.d.ts.map +1 -0
- package/dist/types/components/popover/Popover.d.ts.map +1 -0
- package/dist/types/components/progress/Progress.d.ts.map +1 -0
- package/dist/types/components/radiogroup/RadioGroup.d.ts.map +1 -0
- package/dist/types/components/rating/Rating.d.ts.map +1 -0
- package/dist/types/components/select/Select.d.ts.map +1 -0
- package/dist/types/components/skeleton/Skeleton.d.ts.map +1 -0
- package/dist/types/components/slider/Slider.d.ts.map +1 -0
- package/dist/types/components/spinner/Spinner.d.ts.map +1 -0
- package/dist/types/components/stepper/Stepper.d.ts.map +1 -0
- package/dist/types/components/switch/Switch.d.ts.map +1 -0
- package/dist/types/components/table/Table.d.ts.map +1 -0
- package/dist/types/components/tabs/Tabs.d.ts.map +1 -0
- package/dist/types/components/textarea/Textarea.d.ts.map +1 -0
- package/dist/types/components/toast/Toast.d.ts.map +1 -0
- package/dist/types/components/tooltip/Tooltip.d.ts.map +1 -0
- package/dist/types/components/treeview/TreeView.d.ts.map +1 -0
- package/dist/types/components/virtuallist/VirtualList.d.ts.map +1 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/theme/NUIProvider.d.ts.map +1 -0
- package/dist/types/theme/useTheme.d.ts.map +1 -0
- package/dist/types/utils/generateid/generateId.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts.map +1 -0
- package/dist/types/utils/inertmanager/inertManager.d.ts.map +1 -0
- package/dist/types/utils/keyboardnav/keyboardNav.d.ts.map +1 -0
- package/dist/types/utils/onclickoutside/onClickOutside.d.ts.map +1 -0
- package/dist/types/utils/portal/portal.d.ts.map +1 -0
- package/dist/types/utils/restorefocus/restoreFocus.d.ts.map +1 -0
- package/dist/types/utils/scrolllock/scrollLock.d.ts.map +1 -0
- package/dist/types/utils/trapfocus/trapFocus.d.ts.map +1 -0
- package/dist/utils/generateid/generateId.cjs.map +1 -0
- package/dist/utils/generateid/generateId.js.map +1 -0
- package/dist/utils/inertmanager/inertManager.cjs.map +1 -0
- package/dist/utils/inertmanager/inertManager.js.map +1 -0
- package/dist/utils/keyboardnav/keyboardNav.cjs.map +1 -0
- package/dist/utils/keyboardnav/keyboardNav.js.map +1 -0
- package/dist/utils/onclickoutside/onClickOutside.cjs.map +1 -0
- package/dist/utils/onclickoutside/onClickOutside.js.map +1 -0
- package/dist/utils/portal/portal.cjs.map +1 -0
- package/dist/utils/portal/portal.js.map +1 -0
- package/dist/utils/restorefocus/restoreFocus.cjs.map +1 -0
- package/dist/utils/restorefocus/restoreFocus.js.map +1 -0
- package/dist/utils/scrolllock/scrollLock.cjs.map +1 -0
- package/dist/utils/scrolllock/scrollLock.js.map +1 -0
- package/dist/utils/trapfocus/trapFocus.cjs.map +1 -0
- package/dist/utils/trapfocus/trapFocus.js.map +1 -0
- package/package.json +33 -33
- package/dist/CHANGELOG.md +0 -19
- package/dist/LICENSE +0 -201
- package/dist/README.md +0 -48
- package/dist/dist/components/accordion/Accordion.cjs.map +0 -1
- package/dist/dist/components/accordion/Accordion.js.map +0 -1
- package/dist/dist/components/alert/Alert.cjs.map +0 -1
- package/dist/dist/components/alert/Alert.js.map +0 -1
- package/dist/dist/components/avatar/Avatar.cjs.map +0 -1
- package/dist/dist/components/avatar/Avatar.js.map +0 -1
- package/dist/dist/components/avatar/AvatarGroup.cjs.map +0 -1
- package/dist/dist/components/avatar/AvatarGroup.js.map +0 -1
- package/dist/dist/components/badge/Badge.cjs.map +0 -1
- package/dist/dist/components/badge/Badge.js.map +0 -1
- package/dist/dist/components/badge/BadgeGroup.cjs.map +0 -1
- package/dist/dist/components/badge/BadgeGroup.js.map +0 -1
- package/dist/dist/components/breadcrumbs/Breadcrumbs.cjs.map +0 -1
- package/dist/dist/components/breadcrumbs/Breadcrumbs.js.map +0 -1
- package/dist/dist/components/button/Button.cjs.map +0 -1
- package/dist/dist/components/button/Button.js.map +0 -1
- package/dist/dist/components/card/Card.cjs.map +0 -1
- package/dist/dist/components/card/Card.js.map +0 -1
- package/dist/dist/components/checkbox/Checkbox.cjs.map +0 -1
- package/dist/dist/components/checkbox/Checkbox.js.map +0 -1
- package/dist/dist/components/chip/Chip.cjs.map +0 -1
- package/dist/dist/components/chip/Chip.js.map +0 -1
- package/dist/dist/components/combobox/Combobox.cjs.map +0 -1
- package/dist/dist/components/combobox/Combobox.js.map +0 -1
- package/dist/dist/components/commandpalette/CommandPalette.cjs.map +0 -1
- package/dist/dist/components/commandpalette/CommandPalette.js.map +0 -1
- package/dist/dist/components/contextmenu/ContextMenu.cjs.map +0 -1
- package/dist/dist/components/contextmenu/ContextMenu.js.map +0 -1
- package/dist/dist/components/datagrid/DataGrid.cjs.map +0 -1
- package/dist/dist/components/datagrid/DataGrid.js.map +0 -1
- package/dist/dist/components/datepicker/DatePicker.cjs.map +0 -1
- package/dist/dist/components/datepicker/DatePicker.js.map +0 -1
- package/dist/dist/components/daterangepicker/DateRangePicker.cjs.map +0 -1
- package/dist/dist/components/daterangepicker/DateRangePicker.js.map +0 -1
- package/dist/dist/components/drawer/Drawer.cjs.map +0 -1
- package/dist/dist/components/drawer/Drawer.js.map +0 -1
- package/dist/dist/components/dropdown/Dropdown.cjs.map +0 -1
- package/dist/dist/components/dropdown/Dropdown.js.map +0 -1
- package/dist/dist/components/fileuploader/FileUploader.cjs.map +0 -1
- package/dist/dist/components/fileuploader/FileUploader.js.map +0 -1
- package/dist/dist/components/hovercard/HoverCard.cjs.map +0 -1
- package/dist/dist/components/hovercard/HoverCard.js.map +0 -1
- package/dist/dist/components/input/Input.cjs.map +0 -1
- package/dist/dist/components/input/Input.js.map +0 -1
- package/dist/dist/components/layout/Container.cjs.map +0 -1
- package/dist/dist/components/layout/Container.js.map +0 -1
- package/dist/dist/components/layout/Flex.cjs.map +0 -1
- package/dist/dist/components/layout/Flex.js.map +0 -1
- package/dist/dist/components/layout/Grid.cjs.map +0 -1
- package/dist/dist/components/layout/Grid.js.map +0 -1
- package/dist/dist/components/layout/HStack.cjs.map +0 -1
- package/dist/dist/components/layout/HStack.js.map +0 -1
- package/dist/dist/components/layout/Stack.cjs.map +0 -1
- package/dist/dist/components/layout/Stack.js.map +0 -1
- package/dist/dist/components/megamenu/MegaMenu.cjs.map +0 -1
- package/dist/dist/components/megamenu/MegaMenu.js.map +0 -1
- package/dist/dist/components/modal/Modal.cjs.map +0 -1
- package/dist/dist/components/modal/Modal.js.map +0 -1
- package/dist/dist/components/pagination/Pagination.cjs.map +0 -1
- package/dist/dist/components/pagination/Pagination.js.map +0 -1
- package/dist/dist/components/popover/Popover.cjs.map +0 -1
- package/dist/dist/components/popover/Popover.js.map +0 -1
- package/dist/dist/components/progress/Progress.cjs.map +0 -1
- package/dist/dist/components/progress/Progress.js.map +0 -1
- package/dist/dist/components/radiogroup/RadioGroup.cjs.map +0 -1
- package/dist/dist/components/radiogroup/RadioGroup.js.map +0 -1
- package/dist/dist/components/rating/Rating.cjs.map +0 -1
- package/dist/dist/components/rating/Rating.js.map +0 -1
- package/dist/dist/components/select/Select.cjs.map +0 -1
- package/dist/dist/components/select/Select.js.map +0 -1
- package/dist/dist/components/skeleton/Skeleton.cjs.map +0 -1
- package/dist/dist/components/skeleton/Skeleton.js.map +0 -1
- package/dist/dist/components/slider/Slider.cjs.map +0 -1
- package/dist/dist/components/slider/Slider.js.map +0 -1
- package/dist/dist/components/spinner/Spinner.cjs.map +0 -1
- package/dist/dist/components/spinner/Spinner.js.map +0 -1
- package/dist/dist/components/stepper/Stepper.cjs.map +0 -1
- package/dist/dist/components/stepper/Stepper.js.map +0 -1
- package/dist/dist/components/switch/Switch.cjs.map +0 -1
- package/dist/dist/components/switch/Switch.js.map +0 -1
- package/dist/dist/components/table/Table.cjs.map +0 -1
- package/dist/dist/components/table/Table.js.map +0 -1
- package/dist/dist/components/tabs/Tabs.cjs.map +0 -1
- package/dist/dist/components/tabs/Tabs.js.map +0 -1
- package/dist/dist/components/textarea/Textarea.cjs.map +0 -1
- package/dist/dist/components/textarea/Textarea.js.map +0 -1
- package/dist/dist/components/toast/Toast.cjs.map +0 -1
- package/dist/dist/components/toast/Toast.js.map +0 -1
- package/dist/dist/components/tooltip/Tooltip.cjs.map +0 -1
- package/dist/dist/components/tooltip/Tooltip.js.map +0 -1
- package/dist/dist/components/treeview/TreeView.cjs.map +0 -1
- package/dist/dist/components/treeview/TreeView.js.map +0 -1
- package/dist/dist/components/virtuallist/VirtualList.cjs.map +0 -1
- package/dist/dist/components/virtuallist/VirtualList.js.map +0 -1
- package/dist/dist/theme/NUIProvider.cjs.map +0 -1
- package/dist/dist/theme/NUIProvider.js.map +0 -1
- package/dist/dist/theme/useTheme.cjs.map +0 -1
- package/dist/dist/theme/useTheme.js.map +0 -1
- package/dist/dist/types/components/accordion/Accordion.d.ts.map +0 -1
- package/dist/dist/types/components/alert/Alert.d.ts.map +0 -1
- package/dist/dist/types/components/avatar/Avatar.d.ts.map +0 -1
- package/dist/dist/types/components/avatar/AvatarGroup.d.ts.map +0 -1
- package/dist/dist/types/components/badge/Badge.d.ts.map +0 -1
- package/dist/dist/types/components/badge/BadgeGroup.d.ts.map +0 -1
- package/dist/dist/types/components/breadcrumbs/Breadcrumbs.d.ts.map +0 -1
- package/dist/dist/types/components/button/Button.d.ts.map +0 -1
- package/dist/dist/types/components/card/Card.d.ts.map +0 -1
- package/dist/dist/types/components/checkbox/Checkbox.d.ts.map +0 -1
- package/dist/dist/types/components/chip/Chip.d.ts.map +0 -1
- package/dist/dist/types/components/combobox/Combobox.d.ts.map +0 -1
- package/dist/dist/types/components/commandpalette/CommandPalette.d.ts.map +0 -1
- package/dist/dist/types/components/contextmenu/ContextMenu.d.ts.map +0 -1
- package/dist/dist/types/components/datagrid/DataGrid.d.ts.map +0 -1
- package/dist/dist/types/components/datepicker/DatePicker.d.ts.map +0 -1
- package/dist/dist/types/components/daterangepicker/DateRangePicker.d.ts.map +0 -1
- package/dist/dist/types/components/drawer/Drawer.d.ts.map +0 -1
- package/dist/dist/types/components/dropdown/Dropdown.d.ts.map +0 -1
- package/dist/dist/types/components/fileuploader/FileUploader.d.ts.map +0 -1
- package/dist/dist/types/components/hovercard/HoverCard.d.ts.map +0 -1
- package/dist/dist/types/components/input/Input.d.ts.map +0 -1
- package/dist/dist/types/components/layout/Container.d.ts.map +0 -1
- package/dist/dist/types/components/layout/Flex.d.ts.map +0 -1
- package/dist/dist/types/components/layout/Grid.d.ts.map +0 -1
- package/dist/dist/types/components/layout/HStack.d.ts.map +0 -1
- package/dist/dist/types/components/layout/Stack.d.ts.map +0 -1
- package/dist/dist/types/components/megamenu/MegaMenu.d.ts.map +0 -1
- package/dist/dist/types/components/modal/Modal.d.ts.map +0 -1
- package/dist/dist/types/components/pagination/Pagination.d.ts.map +0 -1
- package/dist/dist/types/components/popover/Popover.d.ts.map +0 -1
- package/dist/dist/types/components/progress/Progress.d.ts.map +0 -1
- package/dist/dist/types/components/radiogroup/RadioGroup.d.ts.map +0 -1
- package/dist/dist/types/components/rating/Rating.d.ts.map +0 -1
- package/dist/dist/types/components/select/Select.d.ts.map +0 -1
- package/dist/dist/types/components/skeleton/Skeleton.d.ts.map +0 -1
- package/dist/dist/types/components/slider/Slider.d.ts.map +0 -1
- package/dist/dist/types/components/spinner/Spinner.d.ts.map +0 -1
- package/dist/dist/types/components/stepper/Stepper.d.ts.map +0 -1
- package/dist/dist/types/components/switch/Switch.d.ts.map +0 -1
- package/dist/dist/types/components/table/Table.d.ts.map +0 -1
- package/dist/dist/types/components/tabs/Tabs.d.ts.map +0 -1
- package/dist/dist/types/components/textarea/Textarea.d.ts.map +0 -1
- package/dist/dist/types/components/toast/Toast.d.ts.map +0 -1
- package/dist/dist/types/components/tooltip/Tooltip.d.ts.map +0 -1
- package/dist/dist/types/components/treeview/TreeView.d.ts.map +0 -1
- package/dist/dist/types/components/virtuallist/VirtualList.d.ts.map +0 -1
- package/dist/dist/types/index.d.ts.map +0 -1
- package/dist/dist/types/theme/NUIProvider.d.ts.map +0 -1
- package/dist/dist/types/theme/useTheme.d.ts.map +0 -1
- package/dist/dist/types/utils/generateid/generateId.d.ts.map +0 -1
- package/dist/dist/types/utils/index.d.ts.map +0 -1
- package/dist/dist/types/utils/inertmanager/inertManager.d.ts.map +0 -1
- package/dist/dist/types/utils/keyboardnav/keyboardNav.d.ts.map +0 -1
- package/dist/dist/types/utils/onclickoutside/onClickOutside.d.ts.map +0 -1
- package/dist/dist/types/utils/portal/portal.d.ts.map +0 -1
- package/dist/dist/types/utils/restorefocus/restoreFocus.d.ts.map +0 -1
- package/dist/dist/types/utils/scrolllock/scrollLock.d.ts.map +0 -1
- package/dist/dist/types/utils/trapfocus/trapFocus.d.ts.map +0 -1
- package/dist/dist/utils/generateid/generateId.cjs.map +0 -1
- package/dist/dist/utils/generateid/generateId.js.map +0 -1
- package/dist/dist/utils/inertmanager/inertManager.cjs.map +0 -1
- package/dist/dist/utils/inertmanager/inertManager.js.map +0 -1
- package/dist/dist/utils/keyboardnav/keyboardNav.cjs.map +0 -1
- package/dist/dist/utils/keyboardnav/keyboardNav.js.map +0 -1
- package/dist/dist/utils/onclickoutside/onClickOutside.cjs.map +0 -1
- package/dist/dist/utils/onclickoutside/onClickOutside.js.map +0 -1
- package/dist/dist/utils/portal/portal.cjs.map +0 -1
- package/dist/dist/utils/portal/portal.js.map +0 -1
- package/dist/dist/utils/restorefocus/restoreFocus.cjs.map +0 -1
- package/dist/dist/utils/restorefocus/restoreFocus.js.map +0 -1
- package/dist/dist/utils/scrolllock/scrollLock.cjs.map +0 -1
- package/dist/dist/utils/scrolllock/scrollLock.js.map +0 -1
- package/dist/dist/utils/trapfocus/trapFocus.cjs.map +0 -1
- package/dist/dist/utils/trapfocus/trapFocus.js.map +0 -1
- /package/dist/{dist/components → components}/accordion/Accordion.cjs +0 -0
- /package/dist/{dist/components → components}/accordion/Accordion.js +0 -0
- /package/dist/{dist/components → components}/alert/Alert.cjs +0 -0
- /package/dist/{dist/components → components}/alert/Alert.js +0 -0
- /package/dist/{dist/components → components}/avatar/Avatar.cjs +0 -0
- /package/dist/{dist/components → components}/avatar/Avatar.js +0 -0
- /package/dist/{dist/components → components}/avatar/AvatarGroup.cjs +0 -0
- /package/dist/{dist/components → components}/avatar/AvatarGroup.js +0 -0
- /package/dist/{dist/components → components}/badge/Badge.cjs +0 -0
- /package/dist/{dist/components → components}/badge/Badge.js +0 -0
- /package/dist/{dist/components → components}/badge/BadgeGroup.cjs +0 -0
- /package/dist/{dist/components → components}/badge/BadgeGroup.js +0 -0
- /package/dist/{dist/components → components}/breadcrumbs/Breadcrumbs.cjs +0 -0
- /package/dist/{dist/components → components}/breadcrumbs/Breadcrumbs.js +0 -0
- /package/dist/{dist/components → components}/button/Button.cjs +0 -0
- /package/dist/{dist/components → components}/button/Button.js +0 -0
- /package/dist/{dist/components → components}/card/Card.cjs +0 -0
- /package/dist/{dist/components → components}/card/Card.js +0 -0
- /package/dist/{dist/components → components}/checkbox/Checkbox.cjs +0 -0
- /package/dist/{dist/components → components}/checkbox/Checkbox.js +0 -0
- /package/dist/{dist/components → components}/chip/Chip.cjs +0 -0
- /package/dist/{dist/components → components}/chip/Chip.js +0 -0
- /package/dist/{dist/components → components}/combobox/Combobox.cjs +0 -0
- /package/dist/{dist/components → components}/combobox/Combobox.js +0 -0
- /package/dist/{dist/components → components}/commandpalette/CommandPalette.cjs +0 -0
- /package/dist/{dist/components → components}/commandpalette/CommandPalette.js +0 -0
- /package/dist/{dist/components → components}/contextmenu/ContextMenu.cjs +0 -0
- /package/dist/{dist/components → components}/contextmenu/ContextMenu.js +0 -0
- /package/dist/{dist/components → components}/datagrid/DataGrid.cjs +0 -0
- /package/dist/{dist/components → components}/datagrid/DataGrid.js +0 -0
- /package/dist/{dist/components → components}/datepicker/DatePicker.cjs +0 -0
- /package/dist/{dist/components → components}/datepicker/DatePicker.js +0 -0
- /package/dist/{dist/components → components}/daterangepicker/DateRangePicker.cjs +0 -0
- /package/dist/{dist/components → components}/daterangepicker/DateRangePicker.js +0 -0
- /package/dist/{dist/components → components}/drawer/Drawer.cjs +0 -0
- /package/dist/{dist/components → components}/drawer/Drawer.js +0 -0
- /package/dist/{dist/components → components}/dropdown/Dropdown.cjs +0 -0
- /package/dist/{dist/components → components}/dropdown/Dropdown.js +0 -0
- /package/dist/{dist/components → components}/fileuploader/FileUploader.cjs +0 -0
- /package/dist/{dist/components → components}/fileuploader/FileUploader.js +0 -0
- /package/dist/{dist/components → components}/hovercard/HoverCard.cjs +0 -0
- /package/dist/{dist/components → components}/hovercard/HoverCard.js +0 -0
- /package/dist/{dist/components → components}/input/Input.cjs +0 -0
- /package/dist/{dist/components → components}/input/Input.js +0 -0
- /package/dist/{dist/components → components}/layout/Container.cjs +0 -0
- /package/dist/{dist/components → components}/layout/Container.js +0 -0
- /package/dist/{dist/components → components}/layout/Flex.cjs +0 -0
- /package/dist/{dist/components → components}/layout/Flex.js +0 -0
- /package/dist/{dist/components → components}/layout/Grid.cjs +0 -0
- /package/dist/{dist/components → components}/layout/Grid.js +0 -0
- /package/dist/{dist/components → components}/layout/HStack.cjs +0 -0
- /package/dist/{dist/components → components}/layout/HStack.js +0 -0
- /package/dist/{dist/components → components}/layout/Stack.cjs +0 -0
- /package/dist/{dist/components → components}/layout/Stack.js +0 -0
- /package/dist/{dist/components → components}/megamenu/MegaMenu.cjs +0 -0
- /package/dist/{dist/components → components}/megamenu/MegaMenu.js +0 -0
- /package/dist/{dist/components → components}/modal/Modal.cjs +0 -0
- /package/dist/{dist/components → components}/modal/Modal.js +0 -0
- /package/dist/{dist/components → components}/pagination/Pagination.cjs +0 -0
- /package/dist/{dist/components → components}/pagination/Pagination.js +0 -0
- /package/dist/{dist/components → components}/popover/Popover.cjs +0 -0
- /package/dist/{dist/components → components}/popover/Popover.js +0 -0
- /package/dist/{dist/components → components}/progress/Progress.cjs +0 -0
- /package/dist/{dist/components → components}/progress/Progress.js +0 -0
- /package/dist/{dist/components → components}/radiogroup/RadioGroup.cjs +0 -0
- /package/dist/{dist/components → components}/radiogroup/RadioGroup.js +0 -0
- /package/dist/{dist/components → components}/rating/Rating.cjs +0 -0
- /package/dist/{dist/components → components}/rating/Rating.js +0 -0
- /package/dist/{dist/components → components}/select/Select.cjs +0 -0
- /package/dist/{dist/components → components}/select/Select.js +0 -0
- /package/dist/{dist/components → components}/skeleton/Skeleton.cjs +0 -0
- /package/dist/{dist/components → components}/skeleton/Skeleton.js +0 -0
- /package/dist/{dist/components → components}/slider/Slider.cjs +0 -0
- /package/dist/{dist/components → components}/slider/Slider.js +0 -0
- /package/dist/{dist/components → components}/spinner/Spinner.cjs +0 -0
- /package/dist/{dist/components → components}/spinner/Spinner.js +0 -0
- /package/dist/{dist/components → components}/stepper/Stepper.cjs +0 -0
- /package/dist/{dist/components → components}/stepper/Stepper.js +0 -0
- /package/dist/{dist/components → components}/switch/Switch.cjs +0 -0
- /package/dist/{dist/components → components}/switch/Switch.js +0 -0
- /package/dist/{dist/components → components}/table/Table.cjs +0 -0
- /package/dist/{dist/components → components}/table/Table.js +0 -0
- /package/dist/{dist/components → components}/tabs/Tabs.cjs +0 -0
- /package/dist/{dist/components → components}/tabs/Tabs.js +0 -0
- /package/dist/{dist/components → components}/textarea/Textarea.cjs +0 -0
- /package/dist/{dist/components → components}/textarea/Textarea.js +0 -0
- /package/dist/{dist/components → components}/toast/Toast.cjs +0 -0
- /package/dist/{dist/components → components}/toast/Toast.js +0 -0
- /package/dist/{dist/components → components}/tooltip/Tooltip.cjs +0 -0
- /package/dist/{dist/components → components}/tooltip/Tooltip.js +0 -0
- /package/dist/{dist/components → components}/treeview/TreeView.cjs +0 -0
- /package/dist/{dist/components → components}/treeview/TreeView.js +0 -0
- /package/dist/{dist/components → components}/virtuallist/VirtualList.cjs +0 -0
- /package/dist/{dist/components → components}/virtuallist/VirtualList.js +0 -0
- /package/dist/{dist/index.cjs → index.cjs} +0 -0
- /package/dist/{dist/index.cjs.map → index.cjs.map} +0 -0
- /package/dist/{dist/index.js → index.js} +0 -0
- /package/dist/{dist/index.js.map → index.js.map} +0 -0
- /package/dist/{dist/styles/index.css → styles/nui.css} +0 -0
- /package/dist/{dist/theme → theme}/NUIProvider.cjs +0 -0
- /package/dist/{dist/theme → theme}/NUIProvider.js +0 -0
- /package/dist/{dist/theme → theme}/useTheme.cjs +0 -0
- /package/dist/{dist/theme → theme}/useTheme.js +0 -0
- /package/dist/{dist/types → types}/components/accordion/Accordion.d.ts +0 -0
- /package/dist/{dist/types → types}/components/alert/Alert.d.ts +0 -0
- /package/dist/{dist/types → types}/components/avatar/Avatar.d.ts +0 -0
- /package/dist/{dist/types → types}/components/avatar/AvatarGroup.d.ts +0 -0
- /package/dist/{dist/types → types}/components/badge/Badge.d.ts +0 -0
- /package/dist/{dist/types → types}/components/badge/BadgeGroup.d.ts +0 -0
- /package/dist/{dist/types → types}/components/breadcrumbs/Breadcrumbs.d.ts +0 -0
- /package/dist/{dist/types → types}/components/button/Button.d.ts +0 -0
- /package/dist/{dist/types → types}/components/card/Card.d.ts +0 -0
- /package/dist/{dist/types → types}/components/checkbox/Checkbox.d.ts +0 -0
- /package/dist/{dist/types → types}/components/chip/Chip.d.ts +0 -0
- /package/dist/{dist/types → types}/components/combobox/Combobox.d.ts +0 -0
- /package/dist/{dist/types → types}/components/commandpalette/CommandPalette.d.ts +0 -0
- /package/dist/{dist/types → types}/components/contextmenu/ContextMenu.d.ts +0 -0
- /package/dist/{dist/types → types}/components/datagrid/DataGrid.d.ts +0 -0
- /package/dist/{dist/types → types}/components/datepicker/DatePicker.d.ts +0 -0
- /package/dist/{dist/types → types}/components/daterangepicker/DateRangePicker.d.ts +0 -0
- /package/dist/{dist/types → types}/components/drawer/Drawer.d.ts +0 -0
- /package/dist/{dist/types → types}/components/dropdown/Dropdown.d.ts +0 -0
- /package/dist/{dist/types → types}/components/fileuploader/FileUploader.d.ts +0 -0
- /package/dist/{dist/types → types}/components/hovercard/HoverCard.d.ts +0 -0
- /package/dist/{dist/types → types}/components/input/Input.d.ts +0 -0
- /package/dist/{dist/types → types}/components/layout/Container.d.ts +0 -0
- /package/dist/{dist/types → types}/components/layout/Flex.d.ts +0 -0
- /package/dist/{dist/types → types}/components/layout/Grid.d.ts +0 -0
- /package/dist/{dist/types → types}/components/layout/HStack.d.ts +0 -0
- /package/dist/{dist/types → types}/components/layout/Stack.d.ts +0 -0
- /package/dist/{dist/types → types}/components/megamenu/MegaMenu.d.ts +0 -0
- /package/dist/{dist/types → types}/components/modal/Modal.d.ts +0 -0
- /package/dist/{dist/types → types}/components/pagination/Pagination.d.ts +0 -0
- /package/dist/{dist/types → types}/components/popover/Popover.d.ts +0 -0
- /package/dist/{dist/types → types}/components/progress/Progress.d.ts +0 -0
- /package/dist/{dist/types → types}/components/radiogroup/RadioGroup.d.ts +0 -0
- /package/dist/{dist/types → types}/components/rating/Rating.d.ts +0 -0
- /package/dist/{dist/types → types}/components/select/Select.d.ts +0 -0
- /package/dist/{dist/types → types}/components/skeleton/Skeleton.d.ts +0 -0
- /package/dist/{dist/types → types}/components/slider/Slider.d.ts +0 -0
- /package/dist/{dist/types → types}/components/spinner/Spinner.d.ts +0 -0
- /package/dist/{dist/types → types}/components/stepper/Stepper.d.ts +0 -0
- /package/dist/{dist/types → types}/components/switch/Switch.d.ts +0 -0
- /package/dist/{dist/types → types}/components/table/Table.d.ts +0 -0
- /package/dist/{dist/types → types}/components/tabs/Tabs.d.ts +0 -0
- /package/dist/{dist/types → types}/components/textarea/Textarea.d.ts +0 -0
- /package/dist/{dist/types → types}/components/toast/Toast.d.ts +0 -0
- /package/dist/{dist/types → types}/components/tooltip/Tooltip.d.ts +0 -0
- /package/dist/{dist/types → types}/components/treeview/TreeView.d.ts +0 -0
- /package/dist/{dist/types → types}/components/virtuallist/VirtualList.d.ts +0 -0
- /package/dist/{dist/types → types}/index.d.ts +0 -0
- /package/dist/{dist/types → types}/theme/NUIProvider.d.ts +0 -0
- /package/dist/{dist/types → types}/theme/useTheme.d.ts +0 -0
- /package/dist/{dist/types → types}/utils/generateid/generateId.d.ts +0 -0
- /package/dist/{dist/types → types}/utils/index.d.ts +0 -0
- /package/dist/{dist/types → types}/utils/inertmanager/inertManager.d.ts +0 -0
- /package/dist/{dist/types → types}/utils/keyboardnav/keyboardNav.d.ts +0 -0
- /package/dist/{dist/types → types}/utils/onclickoutside/onClickOutside.d.ts +0 -0
- /package/dist/{dist/types → types}/utils/portal/portal.d.ts +0 -0
- /package/dist/{dist/types → types}/utils/restorefocus/restoreFocus.d.ts +0 -0
- /package/dist/{dist/types → types}/utils/scrolllock/scrollLock.d.ts +0 -0
- /package/dist/{dist/types → types}/utils/trapfocus/trapFocus.d.ts +0 -0
- /package/dist/{dist/utils → utils}/generateid/generateId.cjs +0 -0
- /package/dist/{dist/utils → utils}/generateid/generateId.js +0 -0
- /package/dist/{dist/utils → utils}/inertmanager/inertManager.cjs +0 -0
- /package/dist/{dist/utils → utils}/inertmanager/inertManager.js +0 -0
- /package/dist/{dist/utils → utils}/keyboardnav/keyboardNav.cjs +0 -0
- /package/dist/{dist/utils → utils}/keyboardnav/keyboardNav.js +0 -0
- /package/dist/{dist/utils → utils}/onclickoutside/onClickOutside.cjs +0 -0
- /package/dist/{dist/utils → utils}/onclickoutside/onClickOutside.js +0 -0
- /package/dist/{dist/utils → utils}/portal/portal.cjs +0 -0
- /package/dist/{dist/utils → utils}/portal/portal.js +0 -0
- /package/dist/{dist/utils → utils}/restorefocus/restoreFocus.cjs +0 -0
- /package/dist/{dist/utils → utils}/restorefocus/restoreFocus.js +0 -0
- /package/dist/{dist/utils → utils}/scrolllock/scrollLock.cjs +0 -0
- /package/dist/{dist/utils → utils}/scrolllock/scrollLock.js +0 -0
- /package/dist/{dist/utils → utils}/trapfocus/trapFocus.cjs +0 -0
- /package/dist/{dist/utils → utils}/trapfocus/trapFocus.js +0 -0
|
@@ -1 +0,0 @@
|
|
|
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":";;;;;AA8DO,SAASA,EAAS;AAAA,EACvB,SAAAC;AAAA,EACA,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,UAAAC,IAAW;AAAA,EACX,WAAAC,IAAY;AAAA,EACZ,cAAAC,IAAe;AAAA,EACf,QAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,cAAAC;AAAA,EACA,kBAAAC;AACF,GAAkB;AAChB,QAAMC,IAAeZ,MAAU,QAMzB,CAACa,GAAcC,CAAe,IAAIC,EAAiB,MACnDH,KAAgBZ,IACJD,EAAQ,KAAK,CAAC,MAAM,EAAE,UAAUC,CAAK,GACrC,SAAS,KAErBC,IACYF,EAAQ,KAAK,CAAC,MAAM,EAAE,UAAUE,CAAY,GAC5C,SAAS,KAElB,EACR,GAEK,CAACe,GAAMC,CAAO,IAAIF,EAAS,EAAK,GAChC,CAACG,GAAaC,CAAc,IAAIJ,EAAiB,EAAE,GAEnDK,IAAaC,EAA8B,IAAI,GAC/CC,IAAYD,EAAOE,EAAW,eAAe,CAAC,EAAE,SAGhDC,IAAWzB,EAAQ;AAAA,IAAO,CAAC0B,MAC/BlB,IACIA,EAAOM,GAAcY,CAAG,IACxBA,EAAI,MAAM,YAAA,EAAc,SAASZ,EAAa,aAAa;AAAA,EAAA,GAI3Da,IAAWC;AAAA,IACf,CAACC,MAAgB;AACf,MAAA1B,IAAW0B,CAAG;AAAA,IAChB;AAAA,IACA,CAAC1B,CAAQ;AAAA,EAAA,GAGL2B,IAAWF,EAAY,MAAM;AACjC,IAAKvB,KAAUa,EAAQ,EAAI;AAAA,EAC7B,GAAG,CAACb,CAAQ,CAAC,GAEP0B,IAAYH,EAAY,MAAM;AAClC,IAAAV,EAAQ,EAAK,GACbE,EAAe,EAAE;AAAA,EACnB,GAAG,CAAA,CAAE;AAGL,EAAAY,EAAU,MAAM;AACd,QAAKf;AACL,aAAOgB,EAAeZ,GAAYU,CAAS;AAAA,EAC7C,GAAG,CAACd,GAAMc,CAAS,CAAC,GAGpBC,EAAU,MAAM;AACd,QAAInB,KAAgBZ,MAAU,QAAW;AACvC,YAAMiC,IAAQlC,EAAQ,KAAK,CAAC,MAAM,EAAE,UAAUC,CAAK;AACnD,MAAAc,EAAgBmB,GAAO,SAAS,EAAE;AAAA,IACpC;AAAA,EACF,GAAG,CAACrB,GAAcZ,GAAOD,CAAO,CAAC;AAGjC,QAAMmC,IAAY,CAAC,MAAuC;AACxD,QAAI,CAAA9B;AAEJ,cAAQ,EAAE,KAAA;AAAA,QACR,KAAK;AACH,YAAE,eAAA,GACGY,KAAMa,EAAA,GACXV,EAAe,CAACgB,MAAM,KAAK,IAAIX,EAAS,SAAS,GAAGW,IAAI,CAAC,CAAC;AAC1D;AAAA,QAEF,KAAK;AACH,YAAE,eAAA,GACGnB,KAAMa,EAAA,GACXV,EAAe,CAACgB,MAAM,KAAK,IAAI,GAAGA,IAAI,CAAC,CAAC;AACxC;AAAA,QAEF,KAAK;AACH,cAAInB,KAAQE,KAAe,GAAG;AAC5B,kBAAMO,IAAMD,EAASN,CAAW;AAChC,YAAAJ,EAAgBW,EAAI,KAAK,GACzBC,EAASD,EAAI,KAAK,GAClBK,EAAA;AAAA,UACF;AACA;AAAA,QAEF,KAAK;AACH,UAAId,MACF,EAAE,eAAA,GACFc,EAAA;AAEF;AAAA,MAGA;AAAA,EAEN,GAGMM,IAAgB,CAACX,MAAwB;AAC7C,IAAAX,EAAgBW,EAAI,KAAK,GACzBC,EAASD,EAAI,KAAK,GAClBK,EAAA;AAAA,EACF;AAEA,2BACG,OAAA,EAAI,KAAKV,GAAY,WAAW,eAAef,CAAS,IAEvD,UAAA;AAAA,IAAA,gBAAAgC,EAAC,OAAA,EAAI,WAAU,6BACZ,UAAA;AAAA,MAAA7B,KAAY,gBAAA8B,EAAC,QAAA,EAAK,WAAU,yBAAyB,UAAA9B,GAAS;AAAA,MAE/D,gBAAA8B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA9B,KAAY;AAAA,YACZC,KAAa;AAAA,UAAA,EAEZ,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,UACX,MAAK;AAAA,UACL,iBAAeO;AAAA,UACf,iBAAeM;AAAA,UACf,aAAAnB;AAAA,UACA,UAAAC;AAAA,UACA,OAAOS;AAAA,UACP,SAASgB;AAAA,UACT,SAASA;AAAA,UACT,UAAU,CAAC,MAAM;AACf,YAAAf,EAAgB,EAAE,OAAO,KAAK,GACzBE,KAAMa,EAAA;AAAA,UACb;AAAA,UACA,WAAAK;AAAA,QAAA;AAAA,MAAA;AAAA,MAGDzB,KACC,gBAAA6B,EAAC,QAAA,EAAK,WAAU,0BAA0B,UAAA7B,EAAA,CAAU;AAAA,IAAA,GAExD;AAAA,IAECO,uBACE,OAAA,EAAI,IAAIM,GAAW,MAAK,WAAU,WAAU,uBAC1C,UAAAE,EAAS,WAAW,IACnB,gBAAAc,EAAC,OAAA,EAAI,WAAU,qBAAqB,UAAAhC,EAAA,CAAa,IAEjDkB,EAAS,IAAI,CAACC,GAAKc,MAAU;AAC3B,YAAMC,IAASD,MAAUrB;AAEzB,aACE,gBAAAmB;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,MAAK;AAAA,UACL,iBAAeG;AAAA,UACf,WAAW,sBAAsBA,IAAS,WAAW,EAAE;AAAA,UACvD,aAAa,CAACC,MAAMA,EAAE,eAAA;AAAA,UACtB,SAAS,MAAML,EAAcX,CAAG;AAAA,UAG/B,UAAA;AAAA,YAAAd,uBACE,QAAA,EAAK,WAAU,2BACb,UAAAA,EAAiBc,CAAG,GACvB;AAAA,YAGDf,IAAeA,EAAae,GAAKe,CAAM,IAAIf,EAAI;AAAA,UAAA;AAAA,QAAA;AAAA,QAd3CA,EAAI;AAAA,MAAA;AAAA,IAiBf,CAAC,EAAA,CAEL;AAAA,EAAA,GAEJ;AAEJ;"}
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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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"}
|
|
@@ -1 +0,0 @@
|
|
|
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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"}
|
|
@@ -1 +0,0 @@
|
|
|
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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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DataGrid.cjs","sources":["../../../../src/components/datagrid/DataGrid.tsx"],"sourcesContent":["/**\r\n * DataGrid.tsx\r\n * -------------\r\n * Vercel-style DataGrid for NUI\r\n *\r\n * Features:\r\n * - Sortable columns\r\n * - Sticky header\r\n * - Optional row selection (checkbox)\r\n * - Row actions slot\r\n * - Pagination (client-side)\r\n * - Keyboard navigation & focus\r\n * - Accessible (aria-sort, aria-selected, table/grid roles)\r\n */\r\n\r\nimport React, { useMemo, useState } from 'react';\r\nimport './DataGrid.css';\r\n\r\nexport type DataRow = Record<string, unknown> & {\r\n id?: string | number;\r\n};\r\n\r\nexport type DataGridColumn<T extends DataRow = DataRow> = {\r\n key: keyof T & string;\r\n title: React.ReactNode;\r\n sortable?: boolean;\r\n width?: number | string;\r\n align?: 'left' | 'center' | 'right';\r\n render?: (row: T) => React.ReactNode;\r\n};\r\n\r\nexport interface DataGridProps<T extends DataRow = DataRow> {\r\n columns: DataGridColumn<T>[];\r\n rows: T[];\r\n\r\n page?: number;\r\n pageSize?: number;\r\n onPageChange?: (page: number) => void;\r\n\r\n selectable?: boolean;\r\n selectedRowIds?: Set<string | number>;\r\n onSelectionChange?: (ids: Set<string | number>) => void;\r\n\r\n onRowClick?: (row: T) => void;\r\n renderRowActions?: (row: T) => React.ReactNode;\r\n\r\n className?: string;\r\n disablePagination?: boolean;\r\n}\r\n\r\ntype SortState = { key: string | null; dir: 'asc' | 'desc' | null };\r\n\r\nexport function DataGrid<T extends DataRow = DataRow>({\r\n columns,\r\n rows,\r\n page: controlledPage,\r\n pageSize = 10,\r\n onPageChange,\r\n\r\n selectable = false,\r\n selectedRowIds,\r\n onSelectionChange,\r\n\r\n onRowClick,\r\n renderRowActions,\r\n className = '',\r\n disablePagination = false,\r\n}: DataGridProps<T>) {\r\n const [sort, setSort] = useState<SortState>({ key: null, dir: null });\r\n const [internalPage, setInternalPage] = useState(1);\r\n const currentPage = controlledPage ?? internalPage;\r\n\r\n const [internalSelection, setInternalSelection] = useState<\r\n Set<string | number>\r\n >(new Set());\r\n\r\n const selection = selectedRowIds ?? internalSelection;\r\n\r\n const totalPages = useMemo(() => {\r\n if (disablePagination) return 1;\r\n return Math.max(1, Math.ceil(rows.length / pageSize));\r\n }, [rows.length, pageSize, disablePagination]);\r\n\r\n const sortedRows = useMemo(() => {\r\n if (!sort.key || !sort.dir) return [...rows];\r\n\r\n const key = sort.key as keyof T;\r\n const dir = sort.dir === 'asc' ? 1 : -1;\r\n\r\n return [...rows].sort((a, b) => {\r\n const va = a[key];\r\n const vb = b[key];\r\n\r\n if (va === undefined && vb !== undefined) return -1 * dir;\r\n if (vb === undefined && va !== undefined) return 1 * dir;\r\n\r\n if (typeof va === 'number' && typeof vb === 'number') {\r\n return (va - vb) * dir;\r\n }\r\n\r\n if (va instanceof Date && vb instanceof Date) {\r\n return (va.getTime() - vb.getTime()) * dir;\r\n }\r\n\r\n return String(va ?? '').localeCompare(String(vb ?? '')) * dir;\r\n });\r\n }, [rows, sort]);\r\n\r\n const paginatedRows = useMemo(() => {\r\n if (disablePagination) return sortedRows;\r\n const start = (currentPage - 1) * pageSize;\r\n return sortedRows.slice(start, start + pageSize);\r\n }, [sortedRows, currentPage, pageSize, disablePagination]);\r\n\r\n const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\r\n\r\n const rowId = (r: T, idx: number) =>\r\n r.id ?? `row-${idx}-${Math.random().toString(36).slice(2, 7)}`;\r\n\r\n const toggleSort = (key: string) => {\r\n setSort((prev) => {\r\n if (prev.key !== key) return { key, dir: 'asc' };\r\n if (prev.dir === 'asc') return { key, dir: 'desc' };\r\n return { key: null, dir: null };\r\n });\r\n };\r\n\r\n const setPage = (page: number) => {\r\n const next = Math.max(1, Math.min(totalPages, page));\r\n if (controlledPage === undefined) setInternalPage(next);\r\n onPageChange?.(next);\r\n };\r\n\r\n const toggleSelectRow = (id: string | number) => {\r\n const update = (set: Set<string | number>) => {\r\n const next = new Set(set);\r\n if (next.has(id)) next.delete(id);\r\n else next.add(id);\r\n return next;\r\n };\r\n\r\n if (selectedRowIds) {\r\n const next = update(selection);\r\n onSelectionChange?.(next);\r\n } else {\r\n setInternalSelection((prev) => {\r\n const next = update(prev);\r\n onSelectionChange?.(next);\r\n return next;\r\n });\r\n }\r\n };\r\n\r\n const selectAllOnPage = () => {\r\n const ids = paginatedRows.map((r, i) => r.id ?? rowId(r, i));\r\n const allSelected = ids.every((id) => selection.has(id));\r\n\r\n const update = (set: Set<string | number>) => {\r\n const next = new Set(set);\r\n if (allSelected) ids.forEach((id) => next.delete(id));\r\n else ids.forEach((id) => next.add(id));\r\n return next;\r\n };\r\n\r\n if (selectedRowIds) {\r\n const next = update(selection);\r\n onSelectionChange?.(next);\r\n } else {\r\n setInternalSelection((prev) => {\r\n const next = update(prev);\r\n onSelectionChange?.(next);\r\n return next;\r\n });\r\n }\r\n };\r\n\r\n const onKeyDownTable = (e: React.KeyboardEvent<HTMLDivElement>): void => {\r\n if (paginatedRows.length === 0) return;\r\n\r\n switch (e.key) {\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n setFocusedIndex((prev) =>\r\n prev === null ? 0 : Math.min(paginatedRows.length - 1, prev + 1)\r\n );\r\n break;\r\n\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n setFocusedIndex((prev) => (prev === null ? 0 : Math.max(0, prev - 1)));\r\n break;\r\n\r\n case 'PageDown':\r\n e.preventDefault();\r\n setPage(currentPage + 1);\r\n setFocusedIndex(0);\r\n break;\r\n\r\n case 'PageUp':\r\n e.preventDefault();\r\n setPage(currentPage - 1);\r\n setFocusedIndex(0);\r\n break;\r\n\r\n case 'Home':\r\n e.preventDefault();\r\n setFocusedIndex(0);\r\n break;\r\n\r\n case 'End':\r\n e.preventDefault();\r\n setFocusedIndex(paginatedRows.length - 1);\r\n break;\r\n\r\n case 'Enter':\r\n e.preventDefault();\r\n if (focusedIndex !== null) {\r\n const row = paginatedRows[focusedIndex];\r\n const id = row.id ?? rowId(row, focusedIndex);\r\n if (selectable) toggleSelectRow(id);\r\n onRowClick?.(row);\r\n }\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n const showActions = Boolean(renderRowActions);\r\n\r\n return (\r\n <div\r\n className={`ui-datagrid ${className}`}\r\n onKeyDown={onKeyDownTable}\r\n tabIndex={0}\r\n role=\"grid\"\r\n aria-rowcount={rows.length}\r\n >\r\n <div className=\"ui-datagrid-table\">\r\n {/* HEADER */}\r\n <div className=\"ui-datagrid-header\" role=\"row\">\r\n {selectable && (\r\n <div className=\"ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--select\">\r\n <input\r\n type=\"checkbox\"\r\n aria-label=\"Select all on page\"\r\n onChange={selectAllOnPage}\r\n checked={\r\n paginatedRows.length > 0 &&\r\n paginatedRows.every((r, i) =>\r\n selection.has(r.id ?? rowId(r, i))\r\n )\r\n }\r\n />\r\n </div>\r\n )}\r\n\r\n {columns.map((col) => {\r\n const isSorted = sort.key === col.key;\r\n return (\r\n <div\r\n key={col.key}\r\n className={`ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--${\r\n col.align ?? 'left'\r\n }`}\r\n role=\"columnheader\"\r\n style={{ width: col.width }}\r\n aria-sort={\r\n isSorted\r\n ? sort.dir === 'asc'\r\n ? 'ascending'\r\n : 'descending'\r\n : 'none'\r\n }\r\n onClick={() => col.sortable && toggleSort(col.key)}\r\n >\r\n <div className=\"ui-datagrid-header-content\">\r\n <span>{col.title}</span>\r\n {col.sortable && (\r\n <span className=\"ui-datagrid-sort-indicator\">\r\n {isSorted ? (sort.dir === 'asc' ? '▲' : '▼') : '⤓'}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n\r\n {showActions && (\r\n <div className=\"ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--actions\" />\r\n )}\r\n </div>\r\n\r\n {/* BODY */}\r\n <div className=\"ui-datagrid-body\" role=\"rowgroup\">\r\n {paginatedRows.length === 0 ? (\r\n <div className=\"ui-datagrid-empty\">No data</div>\r\n ) : (\r\n paginatedRows.map((row, idx) => {\r\n const rid = row.id ?? rowId(row, idx);\r\n const isSelected = selection.has(rid);\r\n const focused = focusedIndex === idx;\r\n\r\n return (\r\n <div\r\n key={String(rid)}\r\n className={[\r\n 'ui-datagrid-row',\r\n isSelected ? 'selected' : '',\r\n focused ? 'focused' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"row\"\r\n tabIndex={focused ? 0 : -1}\r\n aria-selected={isSelected || undefined}\r\n onClick={() => {\r\n if (selectable) toggleSelectRow(rid);\r\n onRowClick?.(row);\r\n setFocusedIndex(idx);\r\n }}\r\n onFocus={() => setFocusedIndex(idx)}\r\n >\r\n {selectable && (\r\n <div className=\"ui-datagrid-cell ui-datagrid-cell--select\">\r\n <input\r\n type=\"checkbox\"\r\n checked={isSelected}\r\n onClick={(e) => e.stopPropagation()}\r\n onChange={() => toggleSelectRow(rid)}\r\n aria-label={`Select row ${String(rid)}`}\r\n />\r\n </div>\r\n )}\r\n\r\n {columns.map((col) => (\r\n <div\r\n key={col.key}\r\n role=\"gridcell\"\r\n className={`ui-datagrid-cell ui-datagrid-cell--${\r\n col.align ?? 'left'\r\n }`}\r\n style={{ width: col.width }}\r\n >\r\n {col.render\r\n ? col.render(row)\r\n : String(row[col.key] ?? '')}\r\n </div>\r\n ))}\r\n\r\n {showActions && (\r\n <div className=\"ui-datagrid-cell ui-datagrid-cell--actions\">\r\n {renderRowActions?.(row)}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n\r\n {/* PAGINATION */}\r\n {!disablePagination && totalPages > 1 && (\r\n <div className=\"ui-datagrid-footer\">\r\n <button\r\n className=\"ui-datagrid-page-btn\"\r\n onClick={() => setPage(1)}\r\n disabled={currentPage === 1}\r\n >\r\n «\r\n </button>\r\n\r\n <button\r\n className=\"ui-datagrid-page-btn\"\r\n onClick={() => setPage(currentPage - 1)}\r\n disabled={currentPage === 1}\r\n >\r\n ‹\r\n </button>\r\n\r\n <div className=\"ui-datagrid-page-info\">\r\n Page {currentPage} of {totalPages}\r\n </div>\r\n\r\n <button\r\n className=\"ui-datagrid-page-btn\"\r\n onClick={() => setPage(currentPage + 1)}\r\n disabled={currentPage === totalPages}\r\n >\r\n ›\r\n </button>\r\n\r\n <button\r\n className=\"ui-datagrid-page-btn\"\r\n onClick={() => setPage(totalPages)}\r\n disabled={currentPage === totalPages}\r\n >\r\n »\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["DataGrid","columns","rows","controlledPage","pageSize","onPageChange","selectable","selectedRowIds","onSelectionChange","onRowClick","renderRowActions","className","disablePagination","sort","setSort","useState","internalPage","setInternalPage","currentPage","internalSelection","setInternalSelection","selection","totalPages","useMemo","sortedRows","key","dir","a","b","va","vb","paginatedRows","start","focusedIndex","setFocusedIndex","rowId","r","idx","toggleSort","prev","setPage","page","next","toggleSelectRow","id","update","set","selectAllOnPage","ids","allSelected","onKeyDownTable","row","showActions","jsx","jsxs","i","col","isSorted","rid","isSelected","focused","e"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DataGrid.js","sources":["../../../../src/components/datagrid/DataGrid.tsx"],"sourcesContent":["/**\r\n * DataGrid.tsx\r\n * -------------\r\n * Vercel-style DataGrid for NUI\r\n *\r\n * Features:\r\n * - Sortable columns\r\n * - Sticky header\r\n * - Optional row selection (checkbox)\r\n * - Row actions slot\r\n * - Pagination (client-side)\r\n * - Keyboard navigation & focus\r\n * - Accessible (aria-sort, aria-selected, table/grid roles)\r\n */\r\n\r\nimport React, { useMemo, useState } from 'react';\r\nimport './DataGrid.css';\r\n\r\nexport type DataRow = Record<string, unknown> & {\r\n id?: string | number;\r\n};\r\n\r\nexport type DataGridColumn<T extends DataRow = DataRow> = {\r\n key: keyof T & string;\r\n title: React.ReactNode;\r\n sortable?: boolean;\r\n width?: number | string;\r\n align?: 'left' | 'center' | 'right';\r\n render?: (row: T) => React.ReactNode;\r\n};\r\n\r\nexport interface DataGridProps<T extends DataRow = DataRow> {\r\n columns: DataGridColumn<T>[];\r\n rows: T[];\r\n\r\n page?: number;\r\n pageSize?: number;\r\n onPageChange?: (page: number) => void;\r\n\r\n selectable?: boolean;\r\n selectedRowIds?: Set<string | number>;\r\n onSelectionChange?: (ids: Set<string | number>) => void;\r\n\r\n onRowClick?: (row: T) => void;\r\n renderRowActions?: (row: T) => React.ReactNode;\r\n\r\n className?: string;\r\n disablePagination?: boolean;\r\n}\r\n\r\ntype SortState = { key: string | null; dir: 'asc' | 'desc' | null };\r\n\r\nexport function DataGrid<T extends DataRow = DataRow>({\r\n columns,\r\n rows,\r\n page: controlledPage,\r\n pageSize = 10,\r\n onPageChange,\r\n\r\n selectable = false,\r\n selectedRowIds,\r\n onSelectionChange,\r\n\r\n onRowClick,\r\n renderRowActions,\r\n className = '',\r\n disablePagination = false,\r\n}: DataGridProps<T>) {\r\n const [sort, setSort] = useState<SortState>({ key: null, dir: null });\r\n const [internalPage, setInternalPage] = useState(1);\r\n const currentPage = controlledPage ?? internalPage;\r\n\r\n const [internalSelection, setInternalSelection] = useState<\r\n Set<string | number>\r\n >(new Set());\r\n\r\n const selection = selectedRowIds ?? internalSelection;\r\n\r\n const totalPages = useMemo(() => {\r\n if (disablePagination) return 1;\r\n return Math.max(1, Math.ceil(rows.length / pageSize));\r\n }, [rows.length, pageSize, disablePagination]);\r\n\r\n const sortedRows = useMemo(() => {\r\n if (!sort.key || !sort.dir) return [...rows];\r\n\r\n const key = sort.key as keyof T;\r\n const dir = sort.dir === 'asc' ? 1 : -1;\r\n\r\n return [...rows].sort((a, b) => {\r\n const va = a[key];\r\n const vb = b[key];\r\n\r\n if (va === undefined && vb !== undefined) return -1 * dir;\r\n if (vb === undefined && va !== undefined) return 1 * dir;\r\n\r\n if (typeof va === 'number' && typeof vb === 'number') {\r\n return (va - vb) * dir;\r\n }\r\n\r\n if (va instanceof Date && vb instanceof Date) {\r\n return (va.getTime() - vb.getTime()) * dir;\r\n }\r\n\r\n return String(va ?? '').localeCompare(String(vb ?? '')) * dir;\r\n });\r\n }, [rows, sort]);\r\n\r\n const paginatedRows = useMemo(() => {\r\n if (disablePagination) return sortedRows;\r\n const start = (currentPage - 1) * pageSize;\r\n return sortedRows.slice(start, start + pageSize);\r\n }, [sortedRows, currentPage, pageSize, disablePagination]);\r\n\r\n const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\r\n\r\n const rowId = (r: T, idx: number) =>\r\n r.id ?? `row-${idx}-${Math.random().toString(36).slice(2, 7)}`;\r\n\r\n const toggleSort = (key: string) => {\r\n setSort((prev) => {\r\n if (prev.key !== key) return { key, dir: 'asc' };\r\n if (prev.dir === 'asc') return { key, dir: 'desc' };\r\n return { key: null, dir: null };\r\n });\r\n };\r\n\r\n const setPage = (page: number) => {\r\n const next = Math.max(1, Math.min(totalPages, page));\r\n if (controlledPage === undefined) setInternalPage(next);\r\n onPageChange?.(next);\r\n };\r\n\r\n const toggleSelectRow = (id: string | number) => {\r\n const update = (set: Set<string | number>) => {\r\n const next = new Set(set);\r\n if (next.has(id)) next.delete(id);\r\n else next.add(id);\r\n return next;\r\n };\r\n\r\n if (selectedRowIds) {\r\n const next = update(selection);\r\n onSelectionChange?.(next);\r\n } else {\r\n setInternalSelection((prev) => {\r\n const next = update(prev);\r\n onSelectionChange?.(next);\r\n return next;\r\n });\r\n }\r\n };\r\n\r\n const selectAllOnPage = () => {\r\n const ids = paginatedRows.map((r, i) => r.id ?? rowId(r, i));\r\n const allSelected = ids.every((id) => selection.has(id));\r\n\r\n const update = (set: Set<string | number>) => {\r\n const next = new Set(set);\r\n if (allSelected) ids.forEach((id) => next.delete(id));\r\n else ids.forEach((id) => next.add(id));\r\n return next;\r\n };\r\n\r\n if (selectedRowIds) {\r\n const next = update(selection);\r\n onSelectionChange?.(next);\r\n } else {\r\n setInternalSelection((prev) => {\r\n const next = update(prev);\r\n onSelectionChange?.(next);\r\n return next;\r\n });\r\n }\r\n };\r\n\r\n const onKeyDownTable = (e: React.KeyboardEvent<HTMLDivElement>): void => {\r\n if (paginatedRows.length === 0) return;\r\n\r\n switch (e.key) {\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n setFocusedIndex((prev) =>\r\n prev === null ? 0 : Math.min(paginatedRows.length - 1, prev + 1)\r\n );\r\n break;\r\n\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n setFocusedIndex((prev) => (prev === null ? 0 : Math.max(0, prev - 1)));\r\n break;\r\n\r\n case 'PageDown':\r\n e.preventDefault();\r\n setPage(currentPage + 1);\r\n setFocusedIndex(0);\r\n break;\r\n\r\n case 'PageUp':\r\n e.preventDefault();\r\n setPage(currentPage - 1);\r\n setFocusedIndex(0);\r\n break;\r\n\r\n case 'Home':\r\n e.preventDefault();\r\n setFocusedIndex(0);\r\n break;\r\n\r\n case 'End':\r\n e.preventDefault();\r\n setFocusedIndex(paginatedRows.length - 1);\r\n break;\r\n\r\n case 'Enter':\r\n e.preventDefault();\r\n if (focusedIndex !== null) {\r\n const row = paginatedRows[focusedIndex];\r\n const id = row.id ?? rowId(row, focusedIndex);\r\n if (selectable) toggleSelectRow(id);\r\n onRowClick?.(row);\r\n }\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n const showActions = Boolean(renderRowActions);\r\n\r\n return (\r\n <div\r\n className={`ui-datagrid ${className}`}\r\n onKeyDown={onKeyDownTable}\r\n tabIndex={0}\r\n role=\"grid\"\r\n aria-rowcount={rows.length}\r\n >\r\n <div className=\"ui-datagrid-table\">\r\n {/* HEADER */}\r\n <div className=\"ui-datagrid-header\" role=\"row\">\r\n {selectable && (\r\n <div className=\"ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--select\">\r\n <input\r\n type=\"checkbox\"\r\n aria-label=\"Select all on page\"\r\n onChange={selectAllOnPage}\r\n checked={\r\n paginatedRows.length > 0 &&\r\n paginatedRows.every((r, i) =>\r\n selection.has(r.id ?? rowId(r, i))\r\n )\r\n }\r\n />\r\n </div>\r\n )}\r\n\r\n {columns.map((col) => {\r\n const isSorted = sort.key === col.key;\r\n return (\r\n <div\r\n key={col.key}\r\n className={`ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--${\r\n col.align ?? 'left'\r\n }`}\r\n role=\"columnheader\"\r\n style={{ width: col.width }}\r\n aria-sort={\r\n isSorted\r\n ? sort.dir === 'asc'\r\n ? 'ascending'\r\n : 'descending'\r\n : 'none'\r\n }\r\n onClick={() => col.sortable && toggleSort(col.key)}\r\n >\r\n <div className=\"ui-datagrid-header-content\">\r\n <span>{col.title}</span>\r\n {col.sortable && (\r\n <span className=\"ui-datagrid-sort-indicator\">\r\n {isSorted ? (sort.dir === 'asc' ? '▲' : '▼') : '⤓'}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n\r\n {showActions && (\r\n <div className=\"ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--actions\" />\r\n )}\r\n </div>\r\n\r\n {/* BODY */}\r\n <div className=\"ui-datagrid-body\" role=\"rowgroup\">\r\n {paginatedRows.length === 0 ? (\r\n <div className=\"ui-datagrid-empty\">No data</div>\r\n ) : (\r\n paginatedRows.map((row, idx) => {\r\n const rid = row.id ?? rowId(row, idx);\r\n const isSelected = selection.has(rid);\r\n const focused = focusedIndex === idx;\r\n\r\n return (\r\n <div\r\n key={String(rid)}\r\n className={[\r\n 'ui-datagrid-row',\r\n isSelected ? 'selected' : '',\r\n focused ? 'focused' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"row\"\r\n tabIndex={focused ? 0 : -1}\r\n aria-selected={isSelected || undefined}\r\n onClick={() => {\r\n if (selectable) toggleSelectRow(rid);\r\n onRowClick?.(row);\r\n setFocusedIndex(idx);\r\n }}\r\n onFocus={() => setFocusedIndex(idx)}\r\n >\r\n {selectable && (\r\n <div className=\"ui-datagrid-cell ui-datagrid-cell--select\">\r\n <input\r\n type=\"checkbox\"\r\n checked={isSelected}\r\n onClick={(e) => e.stopPropagation()}\r\n onChange={() => toggleSelectRow(rid)}\r\n aria-label={`Select row ${String(rid)}`}\r\n />\r\n </div>\r\n )}\r\n\r\n {columns.map((col) => (\r\n <div\r\n key={col.key}\r\n role=\"gridcell\"\r\n className={`ui-datagrid-cell ui-datagrid-cell--${\r\n col.align ?? 'left'\r\n }`}\r\n style={{ width: col.width }}\r\n >\r\n {col.render\r\n ? col.render(row)\r\n : String(row[col.key] ?? '')}\r\n </div>\r\n ))}\r\n\r\n {showActions && (\r\n <div className=\"ui-datagrid-cell ui-datagrid-cell--actions\">\r\n {renderRowActions?.(row)}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n\r\n {/* PAGINATION */}\r\n {!disablePagination && totalPages > 1 && (\r\n <div className=\"ui-datagrid-footer\">\r\n <button\r\n className=\"ui-datagrid-page-btn\"\r\n onClick={() => setPage(1)}\r\n disabled={currentPage === 1}\r\n >\r\n «\r\n </button>\r\n\r\n <button\r\n className=\"ui-datagrid-page-btn\"\r\n onClick={() => setPage(currentPage - 1)}\r\n disabled={currentPage === 1}\r\n >\r\n ‹\r\n </button>\r\n\r\n <div className=\"ui-datagrid-page-info\">\r\n Page {currentPage} of {totalPages}\r\n </div>\r\n\r\n <button\r\n className=\"ui-datagrid-page-btn\"\r\n onClick={() => setPage(currentPage + 1)}\r\n disabled={currentPage === totalPages}\r\n >\r\n ›\r\n </button>\r\n\r\n <button\r\n className=\"ui-datagrid-page-btn\"\r\n onClick={() => setPage(totalPages)}\r\n disabled={currentPage === totalPages}\r\n >\r\n »\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["DataGrid","columns","rows","controlledPage","pageSize","onPageChange","selectable","selectedRowIds","onSelectionChange","onRowClick","renderRowActions","className","disablePagination","sort","setSort","useState","internalPage","setInternalPage","currentPage","internalSelection","setInternalSelection","selection","totalPages","useMemo","sortedRows","key","dir","a","b","va","vb","paginatedRows","start","focusedIndex","setFocusedIndex","rowId","r","idx","toggleSort","prev","setPage","page","next","toggleSelectRow","id","update","set","selectAllOnPage","ids","i","allSelected","onKeyDownTable","row","showActions","jsx","jsxs","col","isSorted","rid","isSelected","focused","e"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker.cjs","sources":["../../../../src/components/datepicker/DatePicker.tsx"],"sourcesContent":["// DatePicker.tsx\r\n// Final Version — Minimal, Elegant, Inline Year + Month Selector\r\n// Calendar hides during year/month selection. No dependencies. Zero warnings.\r\n\r\nimport { useState, useRef, useEffect, KeyboardEvent, useMemo } from 'react';\r\nimport './DatePicker.css';\r\nimport { Portal, onClickOutside, restoreFocus } from '../../utils/index';\r\n\r\n/* ------------------------------------------\r\n Helpers\r\n------------------------------------------- */\r\n\r\nconst pad = (n: number) => (n < 10 ? `0${n}` : `${n}`);\r\nconst toISO = (d: Date) =>\r\n `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\r\n\r\nfunction fromISO(s?: string | null): Date | null {\r\n if (!s) return null;\r\n const [y, m, d] = s.split('-').map(Number);\r\n const dt = new Date(y, m - 1, d);\r\n return Number.isNaN(dt.getTime()) ? null : dt;\r\n}\r\n\r\nconst startOfMonth = (d: Date) => new Date(d.getFullYear(), d.getMonth(), 1);\r\nconst addMonths = (d: Date, n: number) =>\r\n new Date(d.getFullYear(), d.getMonth() + n, 1);\r\nconst daysInMonth = (d: Date) =>\r\n new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();\r\n\r\n/* ------------------------------------------\r\n Component Props\r\n------------------------------------------- */\r\n\r\nexport interface DatePickerProps {\r\n value?: string; // YYYY-MM-DD\r\n defaultValue?: string;\r\n onChange?: (v: string) => void;\r\n minDate?: string;\r\n maxDate?: string;\r\n placeholder?: string;\r\n name?: string;\r\n locale?: string;\r\n id?: string;\r\n className?: string;\r\n}\r\n\r\n/* ------------------------------------------\r\n Component\r\n------------------------------------------- */\r\n\r\nexport function DatePicker({\r\n value,\r\n defaultValue,\r\n onChange,\r\n minDate,\r\n maxDate,\r\n placeholder = 'Select date',\r\n name,\r\n locale = 'en-US',\r\n id,\r\n className = '',\r\n}: DatePickerProps) {\r\n const controlled = value !== undefined;\r\n const [internal, setInternal] = useState<string | undefined>(defaultValue);\r\n const selected = controlled ? value : internal;\r\n const selectedDate = fromISO(selected) ?? new Date();\r\n\r\n const [visible, setVisible] = useState<Date>(startOfMonth(selectedDate));\r\n const [open, setOpen] = useState(false);\r\n const [showYMM, setShowYMM] = useState(false);\r\n\r\n const triggerRef = useRef<HTMLButtonElement | null>(null);\r\n const popRef = useRef<HTMLDivElement | null>(null);\r\n const gridDayRefs = useRef<Record<string, HTMLButtonElement | null>>({});\r\n\r\n /* ------------------------------------------\r\n Min/Max handling\r\n ------------------------------------------- */\r\n\r\n const minDt = fromISO(minDate) ?? undefined;\r\n const maxDt = fromISO(maxDate) ?? undefined;\r\n\r\n const isDisabledDate = (d: Date): boolean => {\r\n if (minDt && d < minDt) return true;\r\n if (maxDt && d > maxDt) return true;\r\n return false;\r\n };\r\n\r\n /* ------------------------------------------\r\n Click outside\r\n ------------------------------------------- */\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(popRef, () => {\r\n setOpen(false);\r\n setShowYMM(false);\r\n });\r\n }, [open]);\r\n\r\n /* ------------------------------------------\r\n Restore focus when closing\r\n ------------------------------------------- */\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const t = triggerRef.current;\r\n return () => {\r\n restoreFocus(t ?? null);\r\n setShowYMM(false);\r\n };\r\n }, [open]);\r\n\r\n /* ------------------------------------------\r\n Positioning\r\n ------------------------------------------- */\r\n\r\n const [pos, setPos] = useState<{ top: number; left: number } | null>(null);\r\n\r\n useEffect(() => {\r\n if (!open || !triggerRef.current) return;\r\n const r = triggerRef.current.getBoundingClientRect();\r\n setPos({ top: r.bottom + 8, left: r.left });\r\n }, [open, visible]);\r\n\r\n /* ------------------------------------------\r\n Calendar Grid\r\n ------------------------------------------- */\r\n const grid = useMemo(() => {\r\n const first = startOfMonth(visible);\r\n const startDow = first.getDay();\r\n const totalDays = daysInMonth(visible);\r\n\r\n const cells: (number | null)[] = [];\r\n\r\n for (let i = 0; i < startDow; i++) cells.push(null);\r\n for (let d = 1; d <= totalDays; d++) cells.push(d);\r\n while (cells.length % 7 !== 0) cells.push(null);\r\n\r\n return cells;\r\n }, [visible]);\r\n\r\n const weekdays = useMemo(\r\n () =>\r\n Array.from({ length: 7 }).map((_, i) =>\r\n new Date(2020, 5, 7 + i).toLocaleDateString(locale, {\r\n weekday: 'short',\r\n })\r\n ),\r\n [locale]\r\n );\r\n\r\n /* ------------------------------------------\r\n Year & Month Overlay Grids\r\n ------------------------------------------- */\r\n\r\n const visibleYear = visible.getFullYear();\r\n const YEAR_SPAN = 100;\r\n const yearStart = visibleYear - YEAR_SPAN;\r\n\r\n const years = useMemo(\r\n () =>\r\n Array.from({ length: YEAR_SPAN * 2 + 1 }).map((_, i) => yearStart + i),\r\n [yearStart]\r\n );\r\n\r\n const months = useMemo(\r\n () =>\r\n Array.from({ length: 12 }).map((_, i) =>\r\n new Date(2020, i, 1).toLocaleDateString(locale, { month: 'short' })\r\n ),\r\n [locale]\r\n );\r\n\r\n const isMonthDisabled = (year: number, month: number): boolean => {\r\n const start = new Date(year, month, 1);\r\n const end = new Date(year, month, daysInMonth(start));\r\n if (minDt && end < minDt) return true;\r\n if (maxDt && start > maxDt) return true;\r\n return false;\r\n };\r\n\r\n /* ------------------------------------------\r\n Commit selections\r\n ------------------------------------------- */\r\n\r\n const commitDay = (d: number) => {\r\n const dt = new Date(visible.getFullYear(), visible.getMonth(), d);\r\n if (isDisabledDate(dt)) return;\r\n\r\n const iso = toISO(dt);\r\n if (!controlled) setInternal(iso);\r\n onChange?.(iso);\r\n\r\n setOpen(false);\r\n setShowYMM(false);\r\n };\r\n\r\n const commitMonth = (month: number) => {\r\n setVisible(new Date(visible.getFullYear(), month, 1));\r\n setShowYMM(false); // close overlay\r\n };\r\n\r\n const commitYear = (year: number) => {\r\n setVisible(new Date(year, visible.getMonth(), 1));\r\n // leave overlay open for month selection\r\n };\r\n\r\n /* ------------------------------------------\r\n Keyboard navigation for days\r\n ------------------------------------------- */\r\n\r\n const focusDayByIndex = (idx: number) => {\r\n if (idx < 0 || idx >= grid.length) return;\r\n const day = grid[idx];\r\n if (!day) return;\r\n const key = `${visible.getFullYear()}-${visible.getMonth()}-${day}`;\r\n gridDayRefs.current[key]?.focus();\r\n };\r\n\r\n const onDayKey = (e: KeyboardEvent<HTMLButtonElement>, day: number) => {\r\n const idx = grid.findIndex((c) => c === day);\r\n if (idx === -1) return;\r\n\r\n const cols = 7;\r\n let nextIdx: number | null = null;\r\n\r\n switch (e.key) {\r\n case 'ArrowRight':\r\n nextIdx = idx + 1;\r\n break;\r\n case 'ArrowLeft':\r\n nextIdx = idx - 1;\r\n break;\r\n case 'ArrowDown':\r\n nextIdx = idx + cols;\r\n break;\r\n case 'ArrowUp':\r\n nextIdx = idx - cols;\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n e.preventDefault();\r\n commitDay(day);\r\n return;\r\n case 'PageUp':\r\n setVisible((v) => addMonths(v, -1));\r\n return;\r\n case 'PageDown':\r\n setVisible((v) => addMonths(v, 1));\r\n return;\r\n case 'Escape':\r\n setOpen(false);\r\n return;\r\n default:\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n\r\n if (nextIdx === null) return;\r\n if (nextIdx < 0 || nextIdx >= grid.length) return;\r\n\r\n if (grid[nextIdx] != null) focusDayByIndex(nextIdx);\r\n };\r\n\r\n /* ------------------------------------------\r\n Labels\r\n ------------------------------------------- */\r\n\r\n const headerMonthLabel = visible.toLocaleDateString(locale, {\r\n month: 'long',\r\n });\r\n const headerYearLabel = visible.getFullYear();\r\n\r\n /* ------------------------------------------\r\n Render\r\n ------------------------------------------- */\r\n\r\n return (\r\n <div className={`ui-datepicker minimal ${className}`}>\r\n {name && <input type=\"hidden\" name={name} value={selected ?? ''} />}\r\n\r\n <button\r\n id={id}\r\n ref={triggerRef}\r\n type=\"button\"\r\n className=\"ui-datepicker-input\"\r\n aria-haspopup=\"dialog\"\r\n aria-expanded={open}\r\n onClick={() => {\r\n setOpen((s) => !s);\r\n setShowYMM(false);\r\n }}\r\n >\r\n {selected ?? placeholder}\r\n </button>\r\n\r\n {open && pos && (\r\n <Portal>\r\n <div\r\n ref={popRef}\r\n className=\"ui-datepicker-popover\"\r\n style={{\r\n position: 'fixed',\r\n top: pos.top,\r\n left: pos.left,\r\n }}\r\n >\r\n <div className=\"ui-datepicker-panel minimal\">\r\n {/* Header */}\r\n <div className=\"ui-header-row\">\r\n <button\r\n className=\"ui-arrow\"\r\n aria-label=\"Previous month\"\r\n onClick={() => setVisible((v) => addMonths(v, -1))}\r\n >\r\n ‹\r\n </button>\r\n\r\n <button\r\n className=\"ui-header-center\"\r\n onClick={() => setShowYMM((s) => !s)}\r\n aria-expanded={showYMM}\r\n >\r\n {headerMonthLabel} {headerYearLabel}\r\n </button>\r\n\r\n <button\r\n className=\"ui-arrow\"\r\n aria-label=\"Next month\"\r\n onClick={() => setVisible((v) => addMonths(v, 1))}\r\n >\r\n ›\r\n </button>\r\n </div>\r\n\r\n {/* Year + Month Selector */}\r\n {showYMM && (\r\n <div className=\"ui-ym-panel\">\r\n <div className=\"ui-year-grid\">\r\n {years.map((y) => {\r\n const sel = y === visible.getFullYear();\r\n return (\r\n <button\r\n key={y}\r\n className={`ui-year-item ${sel ? 'selected' : ''}`}\r\n onClick={() => commitYear(y)}\r\n >\r\n {y}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n\r\n <div className=\"ui-month-grid\">\r\n {months.map((label, i) => {\r\n const disabled = isMonthDisabled(\r\n visible.getFullYear(),\r\n i\r\n );\r\n const sel = i === visible.getMonth();\r\n\r\n return (\r\n <button\r\n key={i}\r\n className={`ui-month-item ${\r\n disabled ? 'disabled' : ''\r\n } ${sel ? 'selected' : ''}`}\r\n disabled={disabled ? true : undefined}\r\n onClick={() => !disabled && commitMonth(i)}\r\n >\r\n {label}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Calendar ONLY when overlay hidden */}\r\n {!showYMM && (\r\n <div\r\n className=\"ui-calendar minimal\"\r\n role=\"grid\"\r\n aria-label={`${headerMonthLabel} ${headerYearLabel}`}\r\n >\r\n <div className=\"ui-weekdays\">\r\n {weekdays.map((w, i) => (\r\n <div key={i} className=\"ui-weekday\">\r\n {w}\r\n </div>\r\n ))}\r\n </div>\r\n\r\n <div className=\"ui-days-grid\">\r\n {grid.map((cell, idx) => {\r\n if (cell === null)\r\n return <div key={idx} className=\"ui-day-empty\" />;\r\n\r\n const dt = new Date(\r\n visible.getFullYear(),\r\n visible.getMonth(),\r\n cell\r\n );\r\n const iso = toISO(dt);\r\n const disabled = isDisabledDate(dt);\r\n const sel = selected === iso;\r\n const key = `${visible.getFullYear()}-${visible.getMonth()}-${cell}`;\r\n\r\n return (\r\n <button\r\n key={key}\r\n ref={(el) => {\r\n gridDayRefs.current[key] = el;\r\n }}\r\n className={`ui-day ${sel ? 'selected' : ''}`}\r\n aria-selected={sel || undefined}\r\n onClick={() => !disabled && commitDay(cell)}\r\n onKeyDown={(e) => onDayKey(e, cell)}\r\n disabled={disabled ? true : undefined}\r\n >\r\n {cell}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"ui-footer\">\r\n <button\r\n onClick={() => {\r\n setOpen(false);\r\n setShowYMM(false);\r\n }}\r\n >\r\n Close\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </Portal>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["pad","toISO","d","fromISO","s","y","m","dt","startOfMonth","addMonths","n","daysInMonth","DatePicker","value","defaultValue","onChange","minDate","maxDate","placeholder","name","locale","id","className","controlled","internal","setInternal","useState","selected","selectedDate","visible","setVisible","open","setOpen","showYMM","setShowYMM","triggerRef","useRef","popRef","gridDayRefs","minDt","maxDt","isDisabledDate","useEffect","onClickOutside","t","restoreFocus","pos","setPos","r","grid","useMemo","startDow","totalDays","cells","i","weekdays","_","visibleYear","YEAR_SPAN","yearStart","years","months","isMonthDisabled","year","month","start","end","commitDay","iso","commitMonth","commitYear","focusDayByIndex","idx","day","key","onDayKey","c","cols","nextIdx","v","headerMonthLabel","headerYearLabel","jsxs","jsx","Portal","sel","label","disabled","w","cell","el","e"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker.js","sources":["../../../../src/components/datepicker/DatePicker.tsx"],"sourcesContent":["// DatePicker.tsx\r\n// Final Version — Minimal, Elegant, Inline Year + Month Selector\r\n// Calendar hides during year/month selection. No dependencies. Zero warnings.\r\n\r\nimport { useState, useRef, useEffect, KeyboardEvent, useMemo } from 'react';\r\nimport './DatePicker.css';\r\nimport { Portal, onClickOutside, restoreFocus } from '../../utils/index';\r\n\r\n/* ------------------------------------------\r\n Helpers\r\n------------------------------------------- */\r\n\r\nconst pad = (n: number) => (n < 10 ? `0${n}` : `${n}`);\r\nconst toISO = (d: Date) =>\r\n `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\r\n\r\nfunction fromISO(s?: string | null): Date | null {\r\n if (!s) return null;\r\n const [y, m, d] = s.split('-').map(Number);\r\n const dt = new Date(y, m - 1, d);\r\n return Number.isNaN(dt.getTime()) ? null : dt;\r\n}\r\n\r\nconst startOfMonth = (d: Date) => new Date(d.getFullYear(), d.getMonth(), 1);\r\nconst addMonths = (d: Date, n: number) =>\r\n new Date(d.getFullYear(), d.getMonth() + n, 1);\r\nconst daysInMonth = (d: Date) =>\r\n new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();\r\n\r\n/* ------------------------------------------\r\n Component Props\r\n------------------------------------------- */\r\n\r\nexport interface DatePickerProps {\r\n value?: string; // YYYY-MM-DD\r\n defaultValue?: string;\r\n onChange?: (v: string) => void;\r\n minDate?: string;\r\n maxDate?: string;\r\n placeholder?: string;\r\n name?: string;\r\n locale?: string;\r\n id?: string;\r\n className?: string;\r\n}\r\n\r\n/* ------------------------------------------\r\n Component\r\n------------------------------------------- */\r\n\r\nexport function DatePicker({\r\n value,\r\n defaultValue,\r\n onChange,\r\n minDate,\r\n maxDate,\r\n placeholder = 'Select date',\r\n name,\r\n locale = 'en-US',\r\n id,\r\n className = '',\r\n}: DatePickerProps) {\r\n const controlled = value !== undefined;\r\n const [internal, setInternal] = useState<string | undefined>(defaultValue);\r\n const selected = controlled ? value : internal;\r\n const selectedDate = fromISO(selected) ?? new Date();\r\n\r\n const [visible, setVisible] = useState<Date>(startOfMonth(selectedDate));\r\n const [open, setOpen] = useState(false);\r\n const [showYMM, setShowYMM] = useState(false);\r\n\r\n const triggerRef = useRef<HTMLButtonElement | null>(null);\r\n const popRef = useRef<HTMLDivElement | null>(null);\r\n const gridDayRefs = useRef<Record<string, HTMLButtonElement | null>>({});\r\n\r\n /* ------------------------------------------\r\n Min/Max handling\r\n ------------------------------------------- */\r\n\r\n const minDt = fromISO(minDate) ?? undefined;\r\n const maxDt = fromISO(maxDate) ?? undefined;\r\n\r\n const isDisabledDate = (d: Date): boolean => {\r\n if (minDt && d < minDt) return true;\r\n if (maxDt && d > maxDt) return true;\r\n return false;\r\n };\r\n\r\n /* ------------------------------------------\r\n Click outside\r\n ------------------------------------------- */\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(popRef, () => {\r\n setOpen(false);\r\n setShowYMM(false);\r\n });\r\n }, [open]);\r\n\r\n /* ------------------------------------------\r\n Restore focus when closing\r\n ------------------------------------------- */\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const t = triggerRef.current;\r\n return () => {\r\n restoreFocus(t ?? null);\r\n setShowYMM(false);\r\n };\r\n }, [open]);\r\n\r\n /* ------------------------------------------\r\n Positioning\r\n ------------------------------------------- */\r\n\r\n const [pos, setPos] = useState<{ top: number; left: number } | null>(null);\r\n\r\n useEffect(() => {\r\n if (!open || !triggerRef.current) return;\r\n const r = triggerRef.current.getBoundingClientRect();\r\n setPos({ top: r.bottom + 8, left: r.left });\r\n }, [open, visible]);\r\n\r\n /* ------------------------------------------\r\n Calendar Grid\r\n ------------------------------------------- */\r\n const grid = useMemo(() => {\r\n const first = startOfMonth(visible);\r\n const startDow = first.getDay();\r\n const totalDays = daysInMonth(visible);\r\n\r\n const cells: (number | null)[] = [];\r\n\r\n for (let i = 0; i < startDow; i++) cells.push(null);\r\n for (let d = 1; d <= totalDays; d++) cells.push(d);\r\n while (cells.length % 7 !== 0) cells.push(null);\r\n\r\n return cells;\r\n }, [visible]);\r\n\r\n const weekdays = useMemo(\r\n () =>\r\n Array.from({ length: 7 }).map((_, i) =>\r\n new Date(2020, 5, 7 + i).toLocaleDateString(locale, {\r\n weekday: 'short',\r\n })\r\n ),\r\n [locale]\r\n );\r\n\r\n /* ------------------------------------------\r\n Year & Month Overlay Grids\r\n ------------------------------------------- */\r\n\r\n const visibleYear = visible.getFullYear();\r\n const YEAR_SPAN = 100;\r\n const yearStart = visibleYear - YEAR_SPAN;\r\n\r\n const years = useMemo(\r\n () =>\r\n Array.from({ length: YEAR_SPAN * 2 + 1 }).map((_, i) => yearStart + i),\r\n [yearStart]\r\n );\r\n\r\n const months = useMemo(\r\n () =>\r\n Array.from({ length: 12 }).map((_, i) =>\r\n new Date(2020, i, 1).toLocaleDateString(locale, { month: 'short' })\r\n ),\r\n [locale]\r\n );\r\n\r\n const isMonthDisabled = (year: number, month: number): boolean => {\r\n const start = new Date(year, month, 1);\r\n const end = new Date(year, month, daysInMonth(start));\r\n if (minDt && end < minDt) return true;\r\n if (maxDt && start > maxDt) return true;\r\n return false;\r\n };\r\n\r\n /* ------------------------------------------\r\n Commit selections\r\n ------------------------------------------- */\r\n\r\n const commitDay = (d: number) => {\r\n const dt = new Date(visible.getFullYear(), visible.getMonth(), d);\r\n if (isDisabledDate(dt)) return;\r\n\r\n const iso = toISO(dt);\r\n if (!controlled) setInternal(iso);\r\n onChange?.(iso);\r\n\r\n setOpen(false);\r\n setShowYMM(false);\r\n };\r\n\r\n const commitMonth = (month: number) => {\r\n setVisible(new Date(visible.getFullYear(), month, 1));\r\n setShowYMM(false); // close overlay\r\n };\r\n\r\n const commitYear = (year: number) => {\r\n setVisible(new Date(year, visible.getMonth(), 1));\r\n // leave overlay open for month selection\r\n };\r\n\r\n /* ------------------------------------------\r\n Keyboard navigation for days\r\n ------------------------------------------- */\r\n\r\n const focusDayByIndex = (idx: number) => {\r\n if (idx < 0 || idx >= grid.length) return;\r\n const day = grid[idx];\r\n if (!day) return;\r\n const key = `${visible.getFullYear()}-${visible.getMonth()}-${day}`;\r\n gridDayRefs.current[key]?.focus();\r\n };\r\n\r\n const onDayKey = (e: KeyboardEvent<HTMLButtonElement>, day: number) => {\r\n const idx = grid.findIndex((c) => c === day);\r\n if (idx === -1) return;\r\n\r\n const cols = 7;\r\n let nextIdx: number | null = null;\r\n\r\n switch (e.key) {\r\n case 'ArrowRight':\r\n nextIdx = idx + 1;\r\n break;\r\n case 'ArrowLeft':\r\n nextIdx = idx - 1;\r\n break;\r\n case 'ArrowDown':\r\n nextIdx = idx + cols;\r\n break;\r\n case 'ArrowUp':\r\n nextIdx = idx - cols;\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n e.preventDefault();\r\n commitDay(day);\r\n return;\r\n case 'PageUp':\r\n setVisible((v) => addMonths(v, -1));\r\n return;\r\n case 'PageDown':\r\n setVisible((v) => addMonths(v, 1));\r\n return;\r\n case 'Escape':\r\n setOpen(false);\r\n return;\r\n default:\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n\r\n if (nextIdx === null) return;\r\n if (nextIdx < 0 || nextIdx >= grid.length) return;\r\n\r\n if (grid[nextIdx] != null) focusDayByIndex(nextIdx);\r\n };\r\n\r\n /* ------------------------------------------\r\n Labels\r\n ------------------------------------------- */\r\n\r\n const headerMonthLabel = visible.toLocaleDateString(locale, {\r\n month: 'long',\r\n });\r\n const headerYearLabel = visible.getFullYear();\r\n\r\n /* ------------------------------------------\r\n Render\r\n ------------------------------------------- */\r\n\r\n return (\r\n <div className={`ui-datepicker minimal ${className}`}>\r\n {name && <input type=\"hidden\" name={name} value={selected ?? ''} />}\r\n\r\n <button\r\n id={id}\r\n ref={triggerRef}\r\n type=\"button\"\r\n className=\"ui-datepicker-input\"\r\n aria-haspopup=\"dialog\"\r\n aria-expanded={open}\r\n onClick={() => {\r\n setOpen((s) => !s);\r\n setShowYMM(false);\r\n }}\r\n >\r\n {selected ?? placeholder}\r\n </button>\r\n\r\n {open && pos && (\r\n <Portal>\r\n <div\r\n ref={popRef}\r\n className=\"ui-datepicker-popover\"\r\n style={{\r\n position: 'fixed',\r\n top: pos.top,\r\n left: pos.left,\r\n }}\r\n >\r\n <div className=\"ui-datepicker-panel minimal\">\r\n {/* Header */}\r\n <div className=\"ui-header-row\">\r\n <button\r\n className=\"ui-arrow\"\r\n aria-label=\"Previous month\"\r\n onClick={() => setVisible((v) => addMonths(v, -1))}\r\n >\r\n ‹\r\n </button>\r\n\r\n <button\r\n className=\"ui-header-center\"\r\n onClick={() => setShowYMM((s) => !s)}\r\n aria-expanded={showYMM}\r\n >\r\n {headerMonthLabel} {headerYearLabel}\r\n </button>\r\n\r\n <button\r\n className=\"ui-arrow\"\r\n aria-label=\"Next month\"\r\n onClick={() => setVisible((v) => addMonths(v, 1))}\r\n >\r\n ›\r\n </button>\r\n </div>\r\n\r\n {/* Year + Month Selector */}\r\n {showYMM && (\r\n <div className=\"ui-ym-panel\">\r\n <div className=\"ui-year-grid\">\r\n {years.map((y) => {\r\n const sel = y === visible.getFullYear();\r\n return (\r\n <button\r\n key={y}\r\n className={`ui-year-item ${sel ? 'selected' : ''}`}\r\n onClick={() => commitYear(y)}\r\n >\r\n {y}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n\r\n <div className=\"ui-month-grid\">\r\n {months.map((label, i) => {\r\n const disabled = isMonthDisabled(\r\n visible.getFullYear(),\r\n i\r\n );\r\n const sel = i === visible.getMonth();\r\n\r\n return (\r\n <button\r\n key={i}\r\n className={`ui-month-item ${\r\n disabled ? 'disabled' : ''\r\n } ${sel ? 'selected' : ''}`}\r\n disabled={disabled ? true : undefined}\r\n onClick={() => !disabled && commitMonth(i)}\r\n >\r\n {label}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Calendar ONLY when overlay hidden */}\r\n {!showYMM && (\r\n <div\r\n className=\"ui-calendar minimal\"\r\n role=\"grid\"\r\n aria-label={`${headerMonthLabel} ${headerYearLabel}`}\r\n >\r\n <div className=\"ui-weekdays\">\r\n {weekdays.map((w, i) => (\r\n <div key={i} className=\"ui-weekday\">\r\n {w}\r\n </div>\r\n ))}\r\n </div>\r\n\r\n <div className=\"ui-days-grid\">\r\n {grid.map((cell, idx) => {\r\n if (cell === null)\r\n return <div key={idx} className=\"ui-day-empty\" />;\r\n\r\n const dt = new Date(\r\n visible.getFullYear(),\r\n visible.getMonth(),\r\n cell\r\n );\r\n const iso = toISO(dt);\r\n const disabled = isDisabledDate(dt);\r\n const sel = selected === iso;\r\n const key = `${visible.getFullYear()}-${visible.getMonth()}-${cell}`;\r\n\r\n return (\r\n <button\r\n key={key}\r\n ref={(el) => {\r\n gridDayRefs.current[key] = el;\r\n }}\r\n className={`ui-day ${sel ? 'selected' : ''}`}\r\n aria-selected={sel || undefined}\r\n onClick={() => !disabled && commitDay(cell)}\r\n onKeyDown={(e) => onDayKey(e, cell)}\r\n disabled={disabled ? true : undefined}\r\n >\r\n {cell}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"ui-footer\">\r\n <button\r\n onClick={() => {\r\n setOpen(false);\r\n setShowYMM(false);\r\n }}\r\n >\r\n Close\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </Portal>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["pad","toISO","d","fromISO","s","y","m","dt","startOfMonth","addMonths","n","daysInMonth","DatePicker","value","defaultValue","onChange","minDate","maxDate","placeholder","name","locale","id","className","controlled","internal","setInternal","useState","selected","selectedDate","visible","setVisible","open","setOpen","showYMM","setShowYMM","triggerRef","useRef","popRef","gridDayRefs","minDt","maxDt","isDisabledDate","useEffect","onClickOutside","t","restoreFocus","pos","setPos","r","grid","useMemo","startDow","totalDays","cells","i","weekdays","_","visibleYear","YEAR_SPAN","yearStart","years","months","isMonthDisabled","year","month","start","end","commitDay","iso","commitMonth","commitYear","focusDayByIndex","idx","day","key","onDayKey","cols","nextIdx","v","headerMonthLabel","headerYearLabel","jsxs","jsx","Portal","sel","label","disabled","w","cell","el","e"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DateRangePicker.cjs","sources":["../../../../src/components/daterangepicker/DateRangePicker.tsx"],"sourcesContent":["// DateRangePicker.tsx\r\n// Fully compliant, theme-aware, drag-select range picker\r\n// Matches your DatePicker UX exactly.\r\n\r\n// DateRangePicker.tsx — Final, Clean, Fully-Compliant Version\r\n\r\nimport {\r\n useState,\r\n useRef,\r\n useEffect,\r\n useMemo,\r\n useCallback,\r\n KeyboardEvent,\r\n} from 'react';\r\nimport './DateRangePicker.css';\r\nimport { Portal, onClickOutside, restoreFocus } from '../../utils/index';\r\n\r\n/* ----------------------------------------------------\r\n Helpers\r\n---------------------------------------------------- */\r\n\r\nconst pad = (n: number) => (n < 10 ? `0${n}` : `${n}`);\r\nconst toISO = (d: Date) =>\r\n `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\r\n\r\nfunction fromISO(s?: string | null): Date | null {\r\n if (!s) return null;\r\n const [y, m, d] = s.split('-').map(Number);\r\n const dt = new Date(y, m - 1, d);\r\n return Number.isNaN(dt.getTime()) ? null : dt;\r\n}\r\n\r\nconst asDate = (v: Date | null | undefined): Date | null => (v ? v : null);\r\n\r\nconst startOfMonth = (d: Date) => new Date(d.getFullYear(), d.getMonth(), 1);\r\nconst addMonths = (d: Date, n: number) =>\r\n new Date(d.getFullYear(), d.getMonth() + n, 1);\r\nconst daysInMonth = (d: Date) =>\r\n new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();\r\n\r\n/* ----------------------------------------------------\r\n Types\r\n---------------------------------------------------- */\r\n\r\nexport interface DateRange {\r\n from?: string;\r\n to?: string;\r\n}\r\n\r\nexport interface DateRangePickerProps {\r\n value?: DateRange;\r\n defaultValue?: DateRange;\r\n onChange?: (r: DateRange) => void;\r\n\r\n minDate?: string;\r\n maxDate?: string;\r\n\r\n placeholder?: string;\r\n locale?: string;\r\n\r\n id?: string;\r\n className?: string;\r\n\r\n nameFrom?: string;\r\n nameTo?: string;\r\n}\r\n\r\n/* ----------------------------------------------------\r\n Component\r\n---------------------------------------------------- */\r\n\r\nexport function DateRangePicker({\r\n value,\r\n defaultValue,\r\n onChange,\r\n minDate,\r\n maxDate,\r\n placeholder = 'Pick range',\r\n locale = 'en-US',\r\n id,\r\n className = '',\r\n nameFrom,\r\n nameTo,\r\n}: DateRangePickerProps) {\r\n const controlled = value !== undefined;\r\n const [internal, setInternal] = useState<DateRange | undefined>(defaultValue);\r\n const range: DateRange = controlled ? value || {} : internal || {};\r\n\r\n const fromDate = fromISO(range.from);\r\n const toDate = fromISO(range.to);\r\n\r\n const today = new Date();\r\n const initialVisible = startOfMonth(fromDate ?? toDate ?? today);\r\n\r\n const [visible, setVisible] = useState<Date>(initialVisible);\r\n const [open, setOpen] = useState(false);\r\n const [showYMM, setShowYMM] = useState(false);\r\n\r\n const [activePart, setActivePart] = useState<'from' | 'to'>('from');\r\n\r\n const triggerRef = useRef<HTMLButtonElement | null>(null);\r\n const popRef = useRef<HTMLDivElement | null>(null);\r\n const dayRefs = useRef<Record<string, HTMLButtonElement | null>>({});\r\n\r\n /* ----------------------------------------------------\r\n Min/max\r\n ---------------------------------------------------- */\r\n\r\n const minDt = fromISO(minDate);\r\n const maxDt = fromISO(maxDate);\r\n\r\n const isDisabled = (d: Date) => {\r\n if (minDt && d < minDt) return true;\r\n if (maxDt && d > maxDt) return true;\r\n return false;\r\n };\r\n\r\n /* ----------------------------------------------------\r\n Drag select\r\n ---------------------------------------------------- */\r\n\r\n const [dragStart, setDragStart] = useState<Date | null>(null);\r\n const [dragEnd, setDragEnd] = useState<Date | null>(null);\r\n const [isDragging, setIsDragging] = useState(false);\r\n\r\n const inDragRange = (d: Date) => {\r\n if (!isDragging || !dragStart || !dragEnd) return false;\r\n const t = d.getTime();\r\n const a = dragStart.getTime();\r\n const b = dragEnd.getTime();\r\n return t >= Math.min(a, b) && t <= Math.max(a, b);\r\n };\r\n\r\n /* ----------------------------------------------------\r\n Click outside to close\r\n ---------------------------------------------------- */\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(popRef, () => {\r\n setOpen(false);\r\n setShowYMM(false);\r\n });\r\n }, [open]);\r\n\r\n /* ----------------------------------------------------\r\n Restore focus\r\n ---------------------------------------------------- */\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const t = triggerRef.current;\r\n return () => restoreFocus(t);\r\n }, [open]);\r\n\r\n /* ----------------------------------------------------\r\n Popover position\r\n ---------------------------------------------------- */\r\n\r\n const [pos, setPos] = useState<{ top: number; left: number } | null>(null);\r\n\r\n useEffect(() => {\r\n if (!open || !triggerRef.current) return;\r\n const r = triggerRef.current.getBoundingClientRect();\r\n setPos({ top: r.bottom + 8, left: r.left });\r\n }, [open, visible]);\r\n\r\n /* ----------------------------------------------------\r\n Grid computation\r\n ---------------------------------------------------- */\r\n\r\n const grid = useMemo(() => {\r\n const first = startOfMonth(visible);\r\n const startDow = first.getDay();\r\n const total = daysInMonth(visible);\r\n\r\n const g: (number | null)[] = [];\r\n for (let i = 0; i < startDow; i++) g.push(null);\r\n for (let d = 1; d <= total; d++) g.push(d);\r\n while (g.length % 7 !== 0) g.push(null);\r\n return g;\r\n }, [visible]);\r\n\r\n const weekdays = useMemo(\r\n () =>\r\n Array.from({ length: 7 }).map((_, i) =>\r\n new Date(2020, 5, 7 + i).toLocaleDateString(locale, {\r\n weekday: 'short',\r\n })\r\n ),\r\n [locale]\r\n );\r\n\r\n /* ----------------------------------------------------\r\n Month/year panel\r\n ---------------------------------------------------- */\r\n\r\n const visibleYear = visible.getFullYear();\r\n const YEAR_SPAN = 100;\r\n const yearStart = visibleYear - YEAR_SPAN;\r\n\r\n const years = useMemo(\r\n () =>\r\n Array.from({ length: YEAR_SPAN * 2 + 1 }).map((_, i) => yearStart + i),\r\n [yearStart]\r\n );\r\n\r\n const months = useMemo(\r\n () =>\r\n Array.from({ length: 12 }).map((_, i) =>\r\n new Date(2020, i, 1).toLocaleDateString(locale, { month: 'short' })\r\n ),\r\n [locale]\r\n );\r\n\r\n const isMonthDisabled = (y: number, m: number) => {\r\n const s = new Date(y, m, 1);\r\n const e = new Date(y, m, daysInMonth(s));\r\n if (minDt && e < minDt) return true;\r\n if (maxDt && s > maxDt) return true;\r\n return false;\r\n };\r\n\r\n /* ----------------------------------------------------\r\n Normalize + commit range\r\n ---------------------------------------------------- */\r\n\r\n const normalizeRange = (a: Date | null, b: Date | null) => {\r\n if (!a && !b) return { from: undefined, to: undefined };\r\n if (!a) return { from: undefined, to: b ? toISO(b) : undefined };\r\n if (!b) return { from: toISO(a), to: undefined };\r\n\r\n const ta = a.getTime();\r\n const tb = b.getTime();\r\n\r\n return ta <= tb\r\n ? { from: toISO(a), to: toISO(b) }\r\n : { from: toISO(b), to: toISO(a) };\r\n };\r\n\r\n const commitRange = useCallback(\r\n (a: Date | null, b: Date | null) => {\r\n const out = normalizeRange(a, b);\r\n if (!controlled) setInternal(out);\r\n onChange?.(out);\r\n },\r\n [onChange, controlled]\r\n );\r\n\r\n /* ----------------------------------------------------\r\n Clicking days\r\n ---------------------------------------------------- */\r\n\r\n const pickDay = (d: number) => {\r\n const dt = new Date(visible.getFullYear(), visible.getMonth(), d);\r\n if (isDisabled(dt)) return;\r\n\r\n let s = fromDate;\r\n let e = toDate;\r\n\r\n if (activePart === 'from') {\r\n s = dt;\r\n if (e && dt > e) e = null;\r\n } else {\r\n e = dt;\r\n if (s && dt < s) {\r\n s = dt;\r\n e = null;\r\n }\r\n }\r\n\r\n commitRange(asDate(s), asDate(e));\r\n\r\n if (s && e) {\r\n setOpen(false);\r\n setShowYMM(false);\r\n }\r\n };\r\n\r\n /* ----------------------------------------------------\r\n Drag end (global)\r\n ---------------------------------------------------- */\r\n\r\n useEffect(() => {\r\n const stopDrag = () => {\r\n if (!isDragging) return;\r\n\r\n setIsDragging(false);\r\n\r\n if (dragStart && dragEnd) {\r\n const a = dragStart;\r\n const b = dragEnd;\r\n const s = a <= b ? a : b;\r\n const e = a <= b ? b : a;\r\n\r\n commitRange(s, e);\r\n setOpen(false);\r\n setShowYMM(false);\r\n }\r\n\r\n setDragStart(null);\r\n setDragEnd(null);\r\n };\r\n\r\n window.addEventListener('mouseup', stopDrag);\r\n return () => window.removeEventListener('mouseup', stopDrag);\r\n }, [isDragging, dragStart, dragEnd, commitRange]);\r\n\r\n /* ----------------------------------------------------\r\n Range flags\r\n ---------------------------------------------------- */\r\n\r\n const inRange = (dt: Date) => {\r\n if (!fromDate || !toDate) return false;\r\n return dt > fromDate && dt < toDate;\r\n };\r\n\r\n const isStart = (dt: Date) => fromDate && dt.getTime() === fromDate.getTime();\r\n const isEnd = (dt: Date) => toDate && dt.getTime() === toDate.getTime();\r\n\r\n /* ----------------------------------------------------\r\n Keyboard nav\r\n ---------------------------------------------------- */\r\n\r\n const focusDay = (idx: number) => {\r\n if (idx < 0 || idx >= grid.length) return;\r\n const d = grid[idx];\r\n if (!d) return;\r\n const key = `${visible.getFullYear()}-${visible.getMonth()}-${d}`;\r\n dayRefs.current[key]?.focus();\r\n };\r\n\r\n const onDayKey = (e: KeyboardEvent<HTMLButtonElement>, day: number) => {\r\n const idx = grid.findIndex((c) => c === day);\r\n if (idx === -1) return;\r\n\r\n const cols = 7;\r\n let nextIdx: number | null = null;\r\n\r\n switch (e.key) {\r\n case 'ArrowRight':\r\n nextIdx = idx + 1;\r\n break;\r\n case 'ArrowLeft':\r\n nextIdx = idx - 1;\r\n break;\r\n case 'ArrowDown':\r\n nextIdx = idx + cols;\r\n break;\r\n case 'ArrowUp':\r\n nextIdx = idx - cols;\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n e.preventDefault();\r\n pickDay(day);\r\n return;\r\n case 'PageUp':\r\n setVisible((v) => addMonths(v, -1));\r\n return;\r\n case 'PageDown':\r\n setVisible((v) => addMonths(v, 1));\r\n return;\r\n case 'Escape':\r\n setOpen(false);\r\n return;\r\n default:\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n if (nextIdx != null && grid[nextIdx] != null) focusDay(nextIdx);\r\n };\r\n\r\n /* ----------------------------------------------------\r\n Trigger label\r\n ---------------------------------------------------- */\r\n\r\n const label = (): string => {\r\n if (!range.from && !range.to) return placeholder;\r\n if (range.from && !range.to) return `${range.from} → `;\r\n if (!range.from && range.to) return ` → ${range.to}`;\r\n return `${range.from} → ${range.to}`;\r\n };\r\n\r\n /* ----------------------------------------------------\r\n Render\r\n ---------------------------------------------------- */\r\n\r\n return (\r\n <div className={`ui-daterange-picker ${className}`}>\r\n {nameFrom && (\r\n <input type=\"hidden\" name={nameFrom} value={range.from ?? ''} />\r\n )}\r\n {nameTo && <input type=\"hidden\" name={nameTo} value={range.to ?? ''} />}\r\n\r\n <button\r\n id={id}\r\n ref={triggerRef}\r\n type=\"button\"\r\n className=\"drp-trigger\"\r\n aria-haspopup=\"dialog\"\r\n aria-expanded={open}\r\n onClick={() => {\r\n setOpen((s) => !s);\r\n setShowYMM(false);\r\n }}\r\n >\r\n {label()}\r\n </button>\r\n\r\n <div className=\"drp-actions\">\r\n <button\r\n className={`drp-part ${activePart === 'from' ? 'active' : ''}`}\r\n onClick={() => setActivePart('from')}\r\n >\r\n From\r\n </button>\r\n\r\n <button\r\n className={`drp-part ${activePart === 'to' ? 'active' : ''}`}\r\n onClick={() => setActivePart('to')}\r\n >\r\n To\r\n </button>\r\n </div>\r\n\r\n {open && pos && (\r\n <Portal>\r\n <div\r\n ref={popRef}\r\n className=\"drp-popover\"\r\n style={{ position: 'fixed', top: pos.top, left: pos.left }}\r\n >\r\n <div className=\"drp-panel\">\r\n {/* HEADER */}\r\n <div className=\"drp-header\">\r\n <button\r\n className=\"drp-arrow\"\r\n onClick={() => setVisible((v) => addMonths(v, -1))}\r\n >\r\n ‹\r\n </button>\r\n\r\n <button\r\n className=\"drp-title\"\r\n onClick={() => setShowYMM((s) => !s)}\r\n >\r\n {visible.toLocaleDateString(locale, {\r\n month: 'long',\r\n })}{' '}\r\n {visible.getFullYear()}\r\n </button>\r\n\r\n <button\r\n className=\"drp-arrow\"\r\n onClick={() => setVisible((v) => addMonths(v, 1))}\r\n >\r\n ›\r\n </button>\r\n </div>\r\n\r\n {/* YEAR + MONTH PANEL */}\r\n {showYMM && (\r\n <div className=\"drp-ym\">\r\n <div className=\"drp-year-grid\">\r\n {years.map((y) => (\r\n <button\r\n key={y}\r\n className={`drp-year ${\r\n y === visible.getFullYear() ? 'selected' : ''\r\n }`}\r\n onClick={() =>\r\n setVisible(\r\n startOfMonth(new Date(y, visible.getMonth(), 1))\r\n )\r\n }\r\n >\r\n {y}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n <div className=\"drp-month-grid\">\r\n {months.map((ml, i) => {\r\n const disabled = isMonthDisabled(\r\n visible.getFullYear(),\r\n i\r\n );\r\n return (\r\n <button\r\n key={i}\r\n className={`drp-month ${disabled ? 'disabled' : ''} ${\r\n i === visible.getMonth() ? 'selected' : ''\r\n }`}\r\n disabled={disabled ? true : undefined}\r\n onClick={() =>\r\n !disabled &&\r\n setVisible(\r\n startOfMonth(\r\n new Date(visible.getFullYear(), i, 1)\r\n )\r\n )\r\n }\r\n >\r\n {ml}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* CALENDAR */}\r\n {!showYMM && (\r\n <div className=\"drp-calendar\">\r\n <div className=\"drp-weekdays\">\r\n {weekdays.map((w, i) => (\r\n <div key={i} className=\"drp-weekday\">\r\n {w}\r\n </div>\r\n ))}\r\n </div>\r\n\r\n <div className=\"drp-days\">\r\n {grid.map((cell, idx) => {\r\n if (cell === null)\r\n return <div key={idx} className=\"drp-day-empty\" />;\r\n\r\n const dt = new Date(\r\n visible.getFullYear(),\r\n visible.getMonth(),\r\n cell\r\n );\r\n const disabled = isDisabled(dt);\r\n\r\n const start = isStart(dt);\r\n const end = isEnd(dt);\r\n const between = inRange(dt);\r\n const drag = inDragRange(dt);\r\n\r\n const key = `${visible.getFullYear()}-${visible.getMonth()}-${cell}`;\r\n\r\n return (\r\n <button\r\n key={key}\r\n ref={(el) => {\r\n dayRefs.current[key] = el;\r\n }}\r\n disabled={disabled ? true : undefined}\r\n className={[\r\n 'drp-day',\r\n start ? 'start' : '',\r\n end ? 'end' : '',\r\n between ? 'between' : '',\r\n drag ? 'dragging' : '',\r\n disabled ? 'disabled' : '',\r\n ].join(' ')}\r\n onClick={() => !disabled && pickDay(cell)}\r\n onKeyDown={(e) => onDayKey(e, cell)}\r\n onMouseDown={(e) => {\r\n if (disabled) return;\r\n e.preventDefault();\r\n setDragStart(dt);\r\n setDragEnd(dt);\r\n setIsDragging(true);\r\n }}\r\n onMouseEnter={() => {\r\n if (!isDragging || disabled) return;\r\n setDragEnd(dt);\r\n }}\r\n >\r\n {cell}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* FOOTER */}\r\n <div className=\"drp-footer\">\r\n <button\r\n className=\"drp-clear\"\r\n onClick={() => {\r\n const empty = { from: undefined, to: undefined };\r\n if (!controlled) setInternal(empty);\r\n onChange?.(empty);\r\n setOpen(false);\r\n setShowYMM(false);\r\n }}\r\n >\r\n Clear\r\n </button>\r\n\r\n <button\r\n className=\"drp-close\"\r\n onClick={() => {\r\n setOpen(false);\r\n setShowYMM(false);\r\n }}\r\n >\r\n Close\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </Portal>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["pad","n","toISO","d","fromISO","s","y","m","dt","asDate","v","startOfMonth","addMonths","daysInMonth","DateRangePicker","value","defaultValue","onChange","minDate","maxDate","placeholder","locale","id","className","nameFrom","nameTo","controlled","internal","setInternal","useState","range","fromDate","toDate","initialVisible","visible","setVisible","open","setOpen","showYMM","setShowYMM","activePart","setActivePart","triggerRef","useRef","popRef","dayRefs","minDt","maxDt","isDisabled","dragStart","setDragStart","dragEnd","setDragEnd","isDragging","setIsDragging","inDragRange","a","b","useEffect","onClickOutside","t","restoreFocus","pos","setPos","r","grid","useMemo","startDow","total","g","i","weekdays","_","visibleYear","YEAR_SPAN","yearStart","years","months","isMonthDisabled","e","normalizeRange","ta","tb","commitRange","useCallback","out","pickDay","stopDrag","inRange","isStart","isEnd","focusDay","idx","key","onDayKey","day","c","cols","nextIdx","label","jsxs","jsx","Portal","ml","disabled","w","cell","start","end","between","drag","el","empty"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DateRangePicker.js","sources":["../../../../src/components/daterangepicker/DateRangePicker.tsx"],"sourcesContent":["// DateRangePicker.tsx\r\n// Fully compliant, theme-aware, drag-select range picker\r\n// Matches your DatePicker UX exactly.\r\n\r\n// DateRangePicker.tsx — Final, Clean, Fully-Compliant Version\r\n\r\nimport {\r\n useState,\r\n useRef,\r\n useEffect,\r\n useMemo,\r\n useCallback,\r\n KeyboardEvent,\r\n} from 'react';\r\nimport './DateRangePicker.css';\r\nimport { Portal, onClickOutside, restoreFocus } from '../../utils/index';\r\n\r\n/* ----------------------------------------------------\r\n Helpers\r\n---------------------------------------------------- */\r\n\r\nconst pad = (n: number) => (n < 10 ? `0${n}` : `${n}`);\r\nconst toISO = (d: Date) =>\r\n `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\r\n\r\nfunction fromISO(s?: string | null): Date | null {\r\n if (!s) return null;\r\n const [y, m, d] = s.split('-').map(Number);\r\n const dt = new Date(y, m - 1, d);\r\n return Number.isNaN(dt.getTime()) ? null : dt;\r\n}\r\n\r\nconst asDate = (v: Date | null | undefined): Date | null => (v ? v : null);\r\n\r\nconst startOfMonth = (d: Date) => new Date(d.getFullYear(), d.getMonth(), 1);\r\nconst addMonths = (d: Date, n: number) =>\r\n new Date(d.getFullYear(), d.getMonth() + n, 1);\r\nconst daysInMonth = (d: Date) =>\r\n new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();\r\n\r\n/* ----------------------------------------------------\r\n Types\r\n---------------------------------------------------- */\r\n\r\nexport interface DateRange {\r\n from?: string;\r\n to?: string;\r\n}\r\n\r\nexport interface DateRangePickerProps {\r\n value?: DateRange;\r\n defaultValue?: DateRange;\r\n onChange?: (r: DateRange) => void;\r\n\r\n minDate?: string;\r\n maxDate?: string;\r\n\r\n placeholder?: string;\r\n locale?: string;\r\n\r\n id?: string;\r\n className?: string;\r\n\r\n nameFrom?: string;\r\n nameTo?: string;\r\n}\r\n\r\n/* ----------------------------------------------------\r\n Component\r\n---------------------------------------------------- */\r\n\r\nexport function DateRangePicker({\r\n value,\r\n defaultValue,\r\n onChange,\r\n minDate,\r\n maxDate,\r\n placeholder = 'Pick range',\r\n locale = 'en-US',\r\n id,\r\n className = '',\r\n nameFrom,\r\n nameTo,\r\n}: DateRangePickerProps) {\r\n const controlled = value !== undefined;\r\n const [internal, setInternal] = useState<DateRange | undefined>(defaultValue);\r\n const range: DateRange = controlled ? value || {} : internal || {};\r\n\r\n const fromDate = fromISO(range.from);\r\n const toDate = fromISO(range.to);\r\n\r\n const today = new Date();\r\n const initialVisible = startOfMonth(fromDate ?? toDate ?? today);\r\n\r\n const [visible, setVisible] = useState<Date>(initialVisible);\r\n const [open, setOpen] = useState(false);\r\n const [showYMM, setShowYMM] = useState(false);\r\n\r\n const [activePart, setActivePart] = useState<'from' | 'to'>('from');\r\n\r\n const triggerRef = useRef<HTMLButtonElement | null>(null);\r\n const popRef = useRef<HTMLDivElement | null>(null);\r\n const dayRefs = useRef<Record<string, HTMLButtonElement | null>>({});\r\n\r\n /* ----------------------------------------------------\r\n Min/max\r\n ---------------------------------------------------- */\r\n\r\n const minDt = fromISO(minDate);\r\n const maxDt = fromISO(maxDate);\r\n\r\n const isDisabled = (d: Date) => {\r\n if (minDt && d < minDt) return true;\r\n if (maxDt && d > maxDt) return true;\r\n return false;\r\n };\r\n\r\n /* ----------------------------------------------------\r\n Drag select\r\n ---------------------------------------------------- */\r\n\r\n const [dragStart, setDragStart] = useState<Date | null>(null);\r\n const [dragEnd, setDragEnd] = useState<Date | null>(null);\r\n const [isDragging, setIsDragging] = useState(false);\r\n\r\n const inDragRange = (d: Date) => {\r\n if (!isDragging || !dragStart || !dragEnd) return false;\r\n const t = d.getTime();\r\n const a = dragStart.getTime();\r\n const b = dragEnd.getTime();\r\n return t >= Math.min(a, b) && t <= Math.max(a, b);\r\n };\r\n\r\n /* ----------------------------------------------------\r\n Click outside to close\r\n ---------------------------------------------------- */\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(popRef, () => {\r\n setOpen(false);\r\n setShowYMM(false);\r\n });\r\n }, [open]);\r\n\r\n /* ----------------------------------------------------\r\n Restore focus\r\n ---------------------------------------------------- */\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const t = triggerRef.current;\r\n return () => restoreFocus(t);\r\n }, [open]);\r\n\r\n /* ----------------------------------------------------\r\n Popover position\r\n ---------------------------------------------------- */\r\n\r\n const [pos, setPos] = useState<{ top: number; left: number } | null>(null);\r\n\r\n useEffect(() => {\r\n if (!open || !triggerRef.current) return;\r\n const r = triggerRef.current.getBoundingClientRect();\r\n setPos({ top: r.bottom + 8, left: r.left });\r\n }, [open, visible]);\r\n\r\n /* ----------------------------------------------------\r\n Grid computation\r\n ---------------------------------------------------- */\r\n\r\n const grid = useMemo(() => {\r\n const first = startOfMonth(visible);\r\n const startDow = first.getDay();\r\n const total = daysInMonth(visible);\r\n\r\n const g: (number | null)[] = [];\r\n for (let i = 0; i < startDow; i++) g.push(null);\r\n for (let d = 1; d <= total; d++) g.push(d);\r\n while (g.length % 7 !== 0) g.push(null);\r\n return g;\r\n }, [visible]);\r\n\r\n const weekdays = useMemo(\r\n () =>\r\n Array.from({ length: 7 }).map((_, i) =>\r\n new Date(2020, 5, 7 + i).toLocaleDateString(locale, {\r\n weekday: 'short',\r\n })\r\n ),\r\n [locale]\r\n );\r\n\r\n /* ----------------------------------------------------\r\n Month/year panel\r\n ---------------------------------------------------- */\r\n\r\n const visibleYear = visible.getFullYear();\r\n const YEAR_SPAN = 100;\r\n const yearStart = visibleYear - YEAR_SPAN;\r\n\r\n const years = useMemo(\r\n () =>\r\n Array.from({ length: YEAR_SPAN * 2 + 1 }).map((_, i) => yearStart + i),\r\n [yearStart]\r\n );\r\n\r\n const months = useMemo(\r\n () =>\r\n Array.from({ length: 12 }).map((_, i) =>\r\n new Date(2020, i, 1).toLocaleDateString(locale, { month: 'short' })\r\n ),\r\n [locale]\r\n );\r\n\r\n const isMonthDisabled = (y: number, m: number) => {\r\n const s = new Date(y, m, 1);\r\n const e = new Date(y, m, daysInMonth(s));\r\n if (minDt && e < minDt) return true;\r\n if (maxDt && s > maxDt) return true;\r\n return false;\r\n };\r\n\r\n /* ----------------------------------------------------\r\n Normalize + commit range\r\n ---------------------------------------------------- */\r\n\r\n const normalizeRange = (a: Date | null, b: Date | null) => {\r\n if (!a && !b) return { from: undefined, to: undefined };\r\n if (!a) return { from: undefined, to: b ? toISO(b) : undefined };\r\n if (!b) return { from: toISO(a), to: undefined };\r\n\r\n const ta = a.getTime();\r\n const tb = b.getTime();\r\n\r\n return ta <= tb\r\n ? { from: toISO(a), to: toISO(b) }\r\n : { from: toISO(b), to: toISO(a) };\r\n };\r\n\r\n const commitRange = useCallback(\r\n (a: Date | null, b: Date | null) => {\r\n const out = normalizeRange(a, b);\r\n if (!controlled) setInternal(out);\r\n onChange?.(out);\r\n },\r\n [onChange, controlled]\r\n );\r\n\r\n /* ----------------------------------------------------\r\n Clicking days\r\n ---------------------------------------------------- */\r\n\r\n const pickDay = (d: number) => {\r\n const dt = new Date(visible.getFullYear(), visible.getMonth(), d);\r\n if (isDisabled(dt)) return;\r\n\r\n let s = fromDate;\r\n let e = toDate;\r\n\r\n if (activePart === 'from') {\r\n s = dt;\r\n if (e && dt > e) e = null;\r\n } else {\r\n e = dt;\r\n if (s && dt < s) {\r\n s = dt;\r\n e = null;\r\n }\r\n }\r\n\r\n commitRange(asDate(s), asDate(e));\r\n\r\n if (s && e) {\r\n setOpen(false);\r\n setShowYMM(false);\r\n }\r\n };\r\n\r\n /* ----------------------------------------------------\r\n Drag end (global)\r\n ---------------------------------------------------- */\r\n\r\n useEffect(() => {\r\n const stopDrag = () => {\r\n if (!isDragging) return;\r\n\r\n setIsDragging(false);\r\n\r\n if (dragStart && dragEnd) {\r\n const a = dragStart;\r\n const b = dragEnd;\r\n const s = a <= b ? a : b;\r\n const e = a <= b ? b : a;\r\n\r\n commitRange(s, e);\r\n setOpen(false);\r\n setShowYMM(false);\r\n }\r\n\r\n setDragStart(null);\r\n setDragEnd(null);\r\n };\r\n\r\n window.addEventListener('mouseup', stopDrag);\r\n return () => window.removeEventListener('mouseup', stopDrag);\r\n }, [isDragging, dragStart, dragEnd, commitRange]);\r\n\r\n /* ----------------------------------------------------\r\n Range flags\r\n ---------------------------------------------------- */\r\n\r\n const inRange = (dt: Date) => {\r\n if (!fromDate || !toDate) return false;\r\n return dt > fromDate && dt < toDate;\r\n };\r\n\r\n const isStart = (dt: Date) => fromDate && dt.getTime() === fromDate.getTime();\r\n const isEnd = (dt: Date) => toDate && dt.getTime() === toDate.getTime();\r\n\r\n /* ----------------------------------------------------\r\n Keyboard nav\r\n ---------------------------------------------------- */\r\n\r\n const focusDay = (idx: number) => {\r\n if (idx < 0 || idx >= grid.length) return;\r\n const d = grid[idx];\r\n if (!d) return;\r\n const key = `${visible.getFullYear()}-${visible.getMonth()}-${d}`;\r\n dayRefs.current[key]?.focus();\r\n };\r\n\r\n const onDayKey = (e: KeyboardEvent<HTMLButtonElement>, day: number) => {\r\n const idx = grid.findIndex((c) => c === day);\r\n if (idx === -1) return;\r\n\r\n const cols = 7;\r\n let nextIdx: number | null = null;\r\n\r\n switch (e.key) {\r\n case 'ArrowRight':\r\n nextIdx = idx + 1;\r\n break;\r\n case 'ArrowLeft':\r\n nextIdx = idx - 1;\r\n break;\r\n case 'ArrowDown':\r\n nextIdx = idx + cols;\r\n break;\r\n case 'ArrowUp':\r\n nextIdx = idx - cols;\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n e.preventDefault();\r\n pickDay(day);\r\n return;\r\n case 'PageUp':\r\n setVisible((v) => addMonths(v, -1));\r\n return;\r\n case 'PageDown':\r\n setVisible((v) => addMonths(v, 1));\r\n return;\r\n case 'Escape':\r\n setOpen(false);\r\n return;\r\n default:\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n if (nextIdx != null && grid[nextIdx] != null) focusDay(nextIdx);\r\n };\r\n\r\n /* ----------------------------------------------------\r\n Trigger label\r\n ---------------------------------------------------- */\r\n\r\n const label = (): string => {\r\n if (!range.from && !range.to) return placeholder;\r\n if (range.from && !range.to) return `${range.from} → `;\r\n if (!range.from && range.to) return ` → ${range.to}`;\r\n return `${range.from} → ${range.to}`;\r\n };\r\n\r\n /* ----------------------------------------------------\r\n Render\r\n ---------------------------------------------------- */\r\n\r\n return (\r\n <div className={`ui-daterange-picker ${className}`}>\r\n {nameFrom && (\r\n <input type=\"hidden\" name={nameFrom} value={range.from ?? ''} />\r\n )}\r\n {nameTo && <input type=\"hidden\" name={nameTo} value={range.to ?? ''} />}\r\n\r\n <button\r\n id={id}\r\n ref={triggerRef}\r\n type=\"button\"\r\n className=\"drp-trigger\"\r\n aria-haspopup=\"dialog\"\r\n aria-expanded={open}\r\n onClick={() => {\r\n setOpen((s) => !s);\r\n setShowYMM(false);\r\n }}\r\n >\r\n {label()}\r\n </button>\r\n\r\n <div className=\"drp-actions\">\r\n <button\r\n className={`drp-part ${activePart === 'from' ? 'active' : ''}`}\r\n onClick={() => setActivePart('from')}\r\n >\r\n From\r\n </button>\r\n\r\n <button\r\n className={`drp-part ${activePart === 'to' ? 'active' : ''}`}\r\n onClick={() => setActivePart('to')}\r\n >\r\n To\r\n </button>\r\n </div>\r\n\r\n {open && pos && (\r\n <Portal>\r\n <div\r\n ref={popRef}\r\n className=\"drp-popover\"\r\n style={{ position: 'fixed', top: pos.top, left: pos.left }}\r\n >\r\n <div className=\"drp-panel\">\r\n {/* HEADER */}\r\n <div className=\"drp-header\">\r\n <button\r\n className=\"drp-arrow\"\r\n onClick={() => setVisible((v) => addMonths(v, -1))}\r\n >\r\n ‹\r\n </button>\r\n\r\n <button\r\n className=\"drp-title\"\r\n onClick={() => setShowYMM((s) => !s)}\r\n >\r\n {visible.toLocaleDateString(locale, {\r\n month: 'long',\r\n })}{' '}\r\n {visible.getFullYear()}\r\n </button>\r\n\r\n <button\r\n className=\"drp-arrow\"\r\n onClick={() => setVisible((v) => addMonths(v, 1))}\r\n >\r\n ›\r\n </button>\r\n </div>\r\n\r\n {/* YEAR + MONTH PANEL */}\r\n {showYMM && (\r\n <div className=\"drp-ym\">\r\n <div className=\"drp-year-grid\">\r\n {years.map((y) => (\r\n <button\r\n key={y}\r\n className={`drp-year ${\r\n y === visible.getFullYear() ? 'selected' : ''\r\n }`}\r\n onClick={() =>\r\n setVisible(\r\n startOfMonth(new Date(y, visible.getMonth(), 1))\r\n )\r\n }\r\n >\r\n {y}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n <div className=\"drp-month-grid\">\r\n {months.map((ml, i) => {\r\n const disabled = isMonthDisabled(\r\n visible.getFullYear(),\r\n i\r\n );\r\n return (\r\n <button\r\n key={i}\r\n className={`drp-month ${disabled ? 'disabled' : ''} ${\r\n i === visible.getMonth() ? 'selected' : ''\r\n }`}\r\n disabled={disabled ? true : undefined}\r\n onClick={() =>\r\n !disabled &&\r\n setVisible(\r\n startOfMonth(\r\n new Date(visible.getFullYear(), i, 1)\r\n )\r\n )\r\n }\r\n >\r\n {ml}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* CALENDAR */}\r\n {!showYMM && (\r\n <div className=\"drp-calendar\">\r\n <div className=\"drp-weekdays\">\r\n {weekdays.map((w, i) => (\r\n <div key={i} className=\"drp-weekday\">\r\n {w}\r\n </div>\r\n ))}\r\n </div>\r\n\r\n <div className=\"drp-days\">\r\n {grid.map((cell, idx) => {\r\n if (cell === null)\r\n return <div key={idx} className=\"drp-day-empty\" />;\r\n\r\n const dt = new Date(\r\n visible.getFullYear(),\r\n visible.getMonth(),\r\n cell\r\n );\r\n const disabled = isDisabled(dt);\r\n\r\n const start = isStart(dt);\r\n const end = isEnd(dt);\r\n const between = inRange(dt);\r\n const drag = inDragRange(dt);\r\n\r\n const key = `${visible.getFullYear()}-${visible.getMonth()}-${cell}`;\r\n\r\n return (\r\n <button\r\n key={key}\r\n ref={(el) => {\r\n dayRefs.current[key] = el;\r\n }}\r\n disabled={disabled ? true : undefined}\r\n className={[\r\n 'drp-day',\r\n start ? 'start' : '',\r\n end ? 'end' : '',\r\n between ? 'between' : '',\r\n drag ? 'dragging' : '',\r\n disabled ? 'disabled' : '',\r\n ].join(' ')}\r\n onClick={() => !disabled && pickDay(cell)}\r\n onKeyDown={(e) => onDayKey(e, cell)}\r\n onMouseDown={(e) => {\r\n if (disabled) return;\r\n e.preventDefault();\r\n setDragStart(dt);\r\n setDragEnd(dt);\r\n setIsDragging(true);\r\n }}\r\n onMouseEnter={() => {\r\n if (!isDragging || disabled) return;\r\n setDragEnd(dt);\r\n }}\r\n >\r\n {cell}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* FOOTER */}\r\n <div className=\"drp-footer\">\r\n <button\r\n className=\"drp-clear\"\r\n onClick={() => {\r\n const empty = { from: undefined, to: undefined };\r\n if (!controlled) setInternal(empty);\r\n onChange?.(empty);\r\n setOpen(false);\r\n setShowYMM(false);\r\n }}\r\n >\r\n Clear\r\n </button>\r\n\r\n <button\r\n className=\"drp-close\"\r\n onClick={() => {\r\n setOpen(false);\r\n setShowYMM(false);\r\n }}\r\n >\r\n Close\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </Portal>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["pad","n","toISO","d","fromISO","s","y","m","dt","asDate","v","startOfMonth","addMonths","daysInMonth","DateRangePicker","value","defaultValue","onChange","minDate","maxDate","placeholder","locale","id","className","nameFrom","nameTo","controlled","internal","setInternal","useState","range","fromDate","toDate","initialVisible","visible","setVisible","open","setOpen","showYMM","setShowYMM","activePart","setActivePart","triggerRef","useRef","popRef","dayRefs","minDt","maxDt","isDisabled","dragStart","setDragStart","dragEnd","setDragEnd","isDragging","setIsDragging","inDragRange","a","b","useEffect","onClickOutside","t","restoreFocus","pos","setPos","r","grid","useMemo","startDow","total","g","i","weekdays","_","visibleYear","YEAR_SPAN","yearStart","years","months","isMonthDisabled","e","normalizeRange","ta","tb","commitRange","useCallback","out","pickDay","stopDrag","inRange","isStart","isEnd","focusDay","idx","key","onDayKey","day","c","cols","nextIdx","label","jsxs","jsx","Portal","ml","disabled","w","cell","start","end","between","drag","el","empty"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Drawer.cjs","sources":["../../../../src/components/drawer/Drawer.tsx"],"sourcesContent":["/**\r\n * Drawer.tsx\r\n * ----------\r\n * WCAG-compliant drawer component.\r\n * - Focus trap\r\n * - Scroll lock\r\n * - Click outside\r\n * - Esc to close\r\n * - Portal\r\n */\r\n\r\n/**\r\n * Drawer.tsx — Headless Drawer (no default UI)\r\n * User controls close button & styles fully.\r\n */\r\n\r\nimport React, { useRef, useEffect, useCallback } from 'react';\r\nimport './Drawer.css';\r\n\r\nimport { Portal, onClickOutside, trapFocus, restoreFocus, scrollLock, applyInertToSiblings,\r\n removeInertFromSiblings } from '../../utils/index';\r\n\r\nexport interface DrawerProps {\r\n open: boolean;\r\n onClose: () => void;\r\n position?: 'left' | 'right' | 'bottom' | 'top';\r\n className?: string;\r\n children?: React.ReactNode;\r\n\r\n disableEsc?: boolean;\r\n disableClickOutside?: boolean;\r\n}\r\n\r\nexport function Drawer({\r\n open,\r\n onClose,\r\n position = 'right',\r\n className = '',\r\n children,\r\n disableEsc = false,\r\n disableClickOutside = false,\r\n}: DrawerProps) {\r\n const overlayRef = useRef<HTMLDivElement | null>(null);\r\n const drawerRef = useRef<HTMLDivElement | null>(null);\r\n const previouslyFocused = useRef<HTMLElement | null>(null);\r\n\r\n const handleClose = useCallback(() => {\r\n onClose();\r\n }, [onClose]);\r\n\r\n // ESC key\r\n useEffect(() => {\r\n if (!open || disableEsc) return;\r\n\r\n const onKey = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') {\r\n e.preventDefault();\r\n handleClose();\r\n }\r\n };\r\n\r\n document.addEventListener('keydown', onKey);\r\n return () => document.removeEventListener('keydown', onKey);\r\n }, [open, disableEsc, handleClose]);\r\n\r\n // Open/close lifecycle\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n previouslyFocused.current = document.activeElement as HTMLElement;\r\n\r\n scrollLock.lock();\r\n\r\n const inertTargets = overlayRef.current\r\n ? applyInertToSiblings(overlayRef.current)\r\n : [];\r\n\r\n const trapCleanup = drawerRef.current\r\n ? trapFocus(drawerRef.current)\r\n : undefined;\r\n\r\n // Click outside\r\n let cleanupOutside: (() => void) | undefined;\r\n if (!disableClickOutside && drawerRef.current) {\r\n cleanupOutside = onClickOutside(drawerRef, handleClose);\r\n }\r\n\r\n return () => {\r\n cleanupOutside?.();\r\n trapCleanup?.();\r\n scrollLock.unlock();\r\n removeInertFromSiblings(inertTargets);\r\n restoreFocus(previouslyFocused.current);\r\n };\r\n }, [open, disableClickOutside, handleClose]);\r\n\r\n if (!open) return null;\r\n\r\n return (\r\n <Portal>\r\n <div\r\n ref={overlayRef}\r\n className={`ui-drawer-overlay ${open ? 'open' : ''}`}\r\n >\r\n <div\r\n ref={drawerRef}\r\n className={`ui-drawer ${position} ${open ? 'open' : ''} ${className}`}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n </Portal>\r\n );\r\n}\r\n"],"names":["Drawer","open","onClose","position","className","children","disableEsc","disableClickOutside","overlayRef","useRef","drawerRef","previouslyFocused","handleClose","useCallback","useEffect","onKey","e","scrollLock","inertTargets","applyInertToSiblings","trapCleanup","trapFocus","cleanupOutside","onClickOutside","removeInertFromSiblings","restoreFocus","Portal","jsx"],"mappings":"keAiCO,SAASA,EAAO,CACrB,KAAAC,EACA,QAAAC,EACA,SAAAC,EAAW,QACX,UAAAC,EAAY,GACZ,SAAAC,EACA,WAAAC,EAAa,GACb,oBAAAC,EAAsB,EACxB,EAAgB,CACd,MAAMC,EAAaC,EAAAA,OAA8B,IAAI,EAC/CC,EAAYD,EAAAA,OAA8B,IAAI,EAC9CE,EAAoBF,EAAAA,OAA2B,IAAI,EAEnDG,EAAcC,EAAAA,YAAY,IAAM,CACpCX,EAAA,CACF,EAAG,CAACA,CAAO,CAAC,EAgDZ,OA7CAY,EAAAA,UAAU,IAAM,CACd,GAAI,CAACb,GAAQK,EAAY,OAEzB,MAAMS,EAASC,GAAqB,CAC9BA,EAAE,MAAQ,WACZA,EAAE,eAAA,EACFJ,EAAA,EAEJ,EAEA,gBAAS,iBAAiB,UAAWG,CAAK,EACnC,IAAM,SAAS,oBAAoB,UAAWA,CAAK,CAC5D,EAAG,CAACd,EAAMK,EAAYM,CAAW,CAAC,EAGlCE,EAAAA,UAAU,IAAM,CACd,GAAI,CAACb,EAAM,OAEXU,EAAkB,QAAU,SAAS,cAErCM,EAAAA,WAAW,KAAA,EAEX,MAAMC,EAAeV,EAAW,QAC5BW,EAAAA,qBAAqBX,EAAW,OAAO,EACvC,CAAA,EAEEY,EAAcV,EAAU,QAC1BW,EAAAA,UAAUX,EAAU,OAAO,EAC3B,OAGJ,IAAIY,EACJ,MAAI,CAACf,GAAuBG,EAAU,UACpCY,EAAiBC,EAAAA,eAAeb,EAAWE,CAAW,GAGjD,IAAM,CACXU,IAAA,EACAF,IAAA,EACAH,EAAAA,WAAW,OAAA,EACXO,EAAAA,wBAAwBN,CAAY,EACpCO,EAAAA,aAAad,EAAkB,OAAO,CACxC,CACF,EAAG,CAACV,EAAMM,EAAqBK,CAAW,CAAC,EAEtCX,QAGFyB,EAAAA,OAAA,CACC,SAAAC,EAAAA,IAAC,MAAA,CACC,IAAKnB,EACL,UAAW,qBAAqBP,EAAO,OAAS,EAAE,GAElD,SAAA0B,EAAAA,IAAC,MAAA,CACC,IAAKjB,EACL,UAAW,aAAaP,CAAQ,IAAIF,EAAO,OAAS,EAAE,IAAIG,CAAS,GACnE,KAAK,SACL,aAAW,OAEV,SAAAC,CAAA,CAAA,CACH,CAAA,EAEJ,EAjBgB,IAmBpB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Drawer.js","sources":["../../../../src/components/drawer/Drawer.tsx"],"sourcesContent":["/**\r\n * Drawer.tsx\r\n * ----------\r\n * WCAG-compliant drawer component.\r\n * - Focus trap\r\n * - Scroll lock\r\n * - Click outside\r\n * - Esc to close\r\n * - Portal\r\n */\r\n\r\n/**\r\n * Drawer.tsx — Headless Drawer (no default UI)\r\n * User controls close button & styles fully.\r\n */\r\n\r\nimport React, { useRef, useEffect, useCallback } from 'react';\r\nimport './Drawer.css';\r\n\r\nimport { Portal, onClickOutside, trapFocus, restoreFocus, scrollLock, applyInertToSiblings,\r\n removeInertFromSiblings } from '../../utils/index';\r\n\r\nexport interface DrawerProps {\r\n open: boolean;\r\n onClose: () => void;\r\n position?: 'left' | 'right' | 'bottom' | 'top';\r\n className?: string;\r\n children?: React.ReactNode;\r\n\r\n disableEsc?: boolean;\r\n disableClickOutside?: boolean;\r\n}\r\n\r\nexport function Drawer({\r\n open,\r\n onClose,\r\n position = 'right',\r\n className = '',\r\n children,\r\n disableEsc = false,\r\n disableClickOutside = false,\r\n}: DrawerProps) {\r\n const overlayRef = useRef<HTMLDivElement | null>(null);\r\n const drawerRef = useRef<HTMLDivElement | null>(null);\r\n const previouslyFocused = useRef<HTMLElement | null>(null);\r\n\r\n const handleClose = useCallback(() => {\r\n onClose();\r\n }, [onClose]);\r\n\r\n // ESC key\r\n useEffect(() => {\r\n if (!open || disableEsc) return;\r\n\r\n const onKey = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') {\r\n e.preventDefault();\r\n handleClose();\r\n }\r\n };\r\n\r\n document.addEventListener('keydown', onKey);\r\n return () => document.removeEventListener('keydown', onKey);\r\n }, [open, disableEsc, handleClose]);\r\n\r\n // Open/close lifecycle\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n previouslyFocused.current = document.activeElement as HTMLElement;\r\n\r\n scrollLock.lock();\r\n\r\n const inertTargets = overlayRef.current\r\n ? applyInertToSiblings(overlayRef.current)\r\n : [];\r\n\r\n const trapCleanup = drawerRef.current\r\n ? trapFocus(drawerRef.current)\r\n : undefined;\r\n\r\n // Click outside\r\n let cleanupOutside: (() => void) | undefined;\r\n if (!disableClickOutside && drawerRef.current) {\r\n cleanupOutside = onClickOutside(drawerRef, handleClose);\r\n }\r\n\r\n return () => {\r\n cleanupOutside?.();\r\n trapCleanup?.();\r\n scrollLock.unlock();\r\n removeInertFromSiblings(inertTargets);\r\n restoreFocus(previouslyFocused.current);\r\n };\r\n }, [open, disableClickOutside, handleClose]);\r\n\r\n if (!open) return null;\r\n\r\n return (\r\n <Portal>\r\n <div\r\n ref={overlayRef}\r\n className={`ui-drawer-overlay ${open ? 'open' : ''}`}\r\n >\r\n <div\r\n ref={drawerRef}\r\n className={`ui-drawer ${position} ${open ? 'open' : ''} ${className}`}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n </Portal>\r\n );\r\n}\r\n"],"names":["Drawer","open","onClose","position","className","children","disableEsc","disableClickOutside","overlayRef","useRef","drawerRef","previouslyFocused","handleClose","useCallback","useEffect","onKey","e","scrollLock","inertTargets","applyInertToSiblings","trapCleanup","trapFocus","cleanupOutside","onClickOutside","removeInertFromSiblings","restoreFocus","Portal","jsx"],"mappings":";;;;;;;;;AAiCO,SAASA,EAAO;AAAA,EACrB,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,WAAAC,IAAY;AAAA,EACZ,UAAAC;AAAA,EACA,YAAAC,IAAa;AAAA,EACb,qBAAAC,IAAsB;AACxB,GAAgB;AACd,QAAMC,IAAaC,EAA8B,IAAI,GAC/CC,IAAYD,EAA8B,IAAI,GAC9CE,IAAoBF,EAA2B,IAAI,GAEnDG,IAAcC,EAAY,MAAM;AACpC,IAAAX,EAAA;AAAA,EACF,GAAG,CAACA,CAAO,CAAC;AAgDZ,SA7CAY,EAAU,MAAM;AACd,QAAI,CAACb,KAAQK,EAAY;AAEzB,UAAMS,IAAQ,CAACC,MAAqB;AAClC,MAAIA,EAAE,QAAQ,aACZA,EAAE,eAAA,GACFJ,EAAA;AAAA,IAEJ;AAEA,oBAAS,iBAAiB,WAAWG,CAAK,GACnC,MAAM,SAAS,oBAAoB,WAAWA,CAAK;AAAA,EAC5D,GAAG,CAACd,GAAMK,GAAYM,CAAW,CAAC,GAGlCE,EAAU,MAAM;AACd,QAAI,CAACb,EAAM;AAEX,IAAAU,EAAkB,UAAU,SAAS,eAErCM,EAAW,KAAA;AAEX,UAAMC,IAAeV,EAAW,UAC5BW,EAAqBX,EAAW,OAAO,IACvC,CAAA,GAEEY,IAAcV,EAAU,UAC1BW,EAAUX,EAAU,OAAO,IAC3B;AAGJ,QAAIY;AACJ,WAAI,CAACf,KAAuBG,EAAU,YACpCY,IAAiBC,EAAeb,GAAWE,CAAW,IAGjD,MAAM;AACX,MAAAU,IAAA,GACAF,IAAA,GACAH,EAAW,OAAA,GACXO,EAAwBN,CAAY,GACpCO,EAAad,EAAkB,OAAO;AAAA,IACxC;AAAA,EACF,GAAG,CAACV,GAAMM,GAAqBK,CAAW,CAAC,GAEtCX,sBAGFyB,GAAA,EACC,UAAA,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKnB;AAAA,MACL,WAAW,qBAAqBP,IAAO,SAAS,EAAE;AAAA,MAElD,UAAA,gBAAA0B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAKjB;AAAA,UACL,WAAW,aAAaP,CAAQ,IAAIF,IAAO,SAAS,EAAE,IAAIG,CAAS;AAAA,UACnE,MAAK;AAAA,UACL,cAAW;AAAA,UAEV,UAAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IACH;AAAA,EAAA,GAEJ,IAjBgB;AAmBpB;"}
|