@nofinite/nui 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/accordion/Accordion.cjs +2 -0
- package/dist/components/accordion/Accordion.cjs.map +1 -0
- package/dist/components/accordion/Accordion.js +51 -0
- package/dist/components/accordion/Accordion.js.map +1 -0
- package/dist/components/alert/Alert.cjs +2 -0
- package/dist/components/alert/Alert.cjs.map +1 -0
- package/dist/components/alert/Alert.js +32 -0
- package/dist/components/alert/Alert.js.map +1 -0
- package/dist/components/avatar/Avatar.cjs +2 -0
- package/dist/components/avatar/Avatar.cjs.map +1 -0
- package/dist/components/avatar/Avatar.js +51 -0
- package/dist/components/avatar/Avatar.js.map +1 -0
- package/dist/components/avatar/AvatarGroup.cjs +2 -0
- package/dist/components/avatar/AvatarGroup.cjs.map +1 -0
- package/dist/components/avatar/AvatarGroup.js +32 -0
- package/dist/components/avatar/AvatarGroup.js.map +1 -0
- package/dist/components/badge/Badge.cjs +2 -0
- package/dist/components/badge/Badge.cjs.map +1 -0
- package/dist/components/badge/Badge.js +81 -0
- package/dist/components/badge/Badge.js.map +1 -0
- package/dist/components/badge/BadgeGroup.cjs +2 -0
- package/dist/components/badge/BadgeGroup.cjs.map +1 -0
- package/dist/components/badge/BadgeGroup.js +17 -0
- package/dist/components/badge/BadgeGroup.js.map +1 -0
- package/dist/components/breadcrumbs/Breadcrumbs.cjs +2 -0
- package/dist/components/breadcrumbs/Breadcrumbs.cjs.map +1 -0
- package/dist/components/breadcrumbs/Breadcrumbs.js +46 -0
- package/dist/components/breadcrumbs/Breadcrumbs.js.map +1 -0
- package/dist/components/button/Button.cjs +2 -0
- package/dist/components/button/Button.cjs.map +1 -0
- package/dist/components/button/Button.js +21 -0
- package/dist/components/button/Button.js.map +1 -0
- package/dist/components/card/Card.cjs +2 -0
- package/dist/components/card/Card.cjs.map +1 -0
- package/dist/components/card/Card.js +50 -0
- package/dist/components/card/Card.js.map +1 -0
- package/dist/components/checkbox/Checkbox.cjs +2 -0
- package/dist/components/checkbox/Checkbox.cjs.map +1 -0
- package/dist/components/checkbox/Checkbox.js +46 -0
- package/dist/components/checkbox/Checkbox.js.map +1 -0
- package/dist/components/chip/Chip.cjs +2 -0
- package/dist/components/chip/Chip.cjs.map +1 -0
- package/dist/components/chip/Chip.js +51 -0
- package/dist/components/chip/Chip.js.map +1 -0
- package/dist/components/combobox/Combobox.cjs +2 -0
- package/dist/components/combobox/Combobox.cjs.map +1 -0
- package/dist/components/combobox/Combobox.js +114 -0
- package/dist/components/combobox/Combobox.js.map +1 -0
- package/dist/components/commandpalette/CommandPalette.cjs +2 -0
- package/dist/components/commandpalette/CommandPalette.cjs.map +1 -0
- package/dist/components/commandpalette/CommandPalette.js +111 -0
- package/dist/components/commandpalette/CommandPalette.js.map +1 -0
- package/dist/components/contextmenu/ContextMenu.cjs +2 -0
- package/dist/components/contextmenu/ContextMenu.cjs.map +1 -0
- package/dist/components/contextmenu/ContextMenu.js +104 -0
- package/dist/components/contextmenu/ContextMenu.js.map +1 -0
- package/dist/components/datagrid/DataGrid.cjs +2 -0
- package/dist/components/datagrid/DataGrid.cjs.map +1 -0
- package/dist/components/datagrid/DataGrid.js +227 -0
- package/dist/components/datagrid/DataGrid.js.map +1 -0
- package/dist/components/datepicker/DatePicker.cjs +2 -0
- package/dist/components/datepicker/DatePicker.cjs.map +1 -0
- package/dist/components/datepicker/DatePicker.js +265 -0
- package/dist/components/datepicker/DatePicker.js.map +1 -0
- package/dist/components/daterangepicker/DateRangePicker.cjs +2 -0
- package/dist/components/daterangepicker/DateRangePicker.cjs.map +1 -0
- package/dist/components/daterangepicker/DateRangePicker.js +322 -0
- package/dist/components/daterangepicker/DateRangePicker.js.map +1 -0
- package/dist/components/drawer/Drawer.cjs +2 -0
- package/dist/components/drawer/Drawer.cjs.map +1 -0
- package/dist/components/drawer/Drawer.js +57 -0
- package/dist/components/drawer/Drawer.js.map +1 -0
- package/dist/components/dropdown/Dropdown.cjs +2 -0
- package/dist/components/dropdown/Dropdown.cjs.map +1 -0
- package/dist/components/dropdown/Dropdown.js +115 -0
- package/dist/components/dropdown/Dropdown.js.map +1 -0
- package/dist/components/fileuploader/FileUploader.cjs +2 -0
- package/dist/components/fileuploader/FileUploader.cjs.map +1 -0
- package/dist/components/fileuploader/FileUploader.js +83 -0
- package/dist/components/fileuploader/FileUploader.js.map +1 -0
- package/dist/components/hovercard/HoverCard.cjs +2 -0
- package/dist/components/hovercard/HoverCard.cjs.map +1 -0
- package/dist/components/hovercard/HoverCard.js +78 -0
- package/dist/components/hovercard/HoverCard.js.map +1 -0
- package/dist/components/input/Input.cjs +2 -0
- package/dist/components/input/Input.cjs.map +1 -0
- package/dist/components/input/Input.js +41 -0
- package/dist/components/input/Input.js.map +1 -0
- package/dist/components/layout/Container.cjs +2 -0
- package/dist/components/layout/Container.cjs.map +1 -0
- package/dist/components/layout/Container.js +33 -0
- package/dist/components/layout/Container.js.map +1 -0
- package/dist/components/layout/Flex.cjs +2 -0
- package/dist/components/layout/Flex.cjs.map +1 -0
- package/dist/components/layout/Flex.js +26 -0
- package/dist/components/layout/Flex.js.map +1 -0
- package/dist/components/layout/Grid.cjs +2 -0
- package/dist/components/layout/Grid.cjs.map +1 -0
- package/dist/components/layout/Grid.js +21 -0
- package/dist/components/layout/Grid.js.map +1 -0
- package/dist/components/layout/HStack.cjs +2 -0
- package/dist/components/layout/HStack.cjs.map +1 -0
- package/dist/components/layout/HStack.js +9 -0
- package/dist/components/layout/HStack.js.map +1 -0
- package/dist/components/layout/Stack.cjs +2 -0
- package/dist/components/layout/Stack.cjs.map +1 -0
- package/dist/components/layout/Stack.js +9 -0
- package/dist/components/layout/Stack.js.map +1 -0
- package/dist/components/megamenu/MegaMenu.cjs +2 -0
- package/dist/components/megamenu/MegaMenu.cjs.map +1 -0
- package/dist/components/megamenu/MegaMenu.js +43 -0
- package/dist/components/megamenu/MegaMenu.js.map +1 -0
- package/dist/components/modal/Modal.cjs +2 -0
- package/dist/components/modal/Modal.cjs.map +1 -0
- package/dist/components/modal/Modal.js +91 -0
- package/dist/components/modal/Modal.js.map +1 -0
- package/dist/components/pagination/Pagination.cjs +2 -0
- package/dist/components/pagination/Pagination.cjs.map +1 -0
- package/dist/components/pagination/Pagination.js +62 -0
- package/dist/components/pagination/Pagination.js.map +1 -0
- package/dist/components/popover/Popover.cjs +2 -0
- package/dist/components/popover/Popover.cjs.map +1 -0
- package/dist/components/popover/Popover.js +123 -0
- package/dist/components/popover/Popover.js.map +1 -0
- package/dist/components/progress/Progress.cjs +2 -0
- package/dist/components/progress/Progress.cjs.map +1 -0
- package/dist/components/progress/Progress.js +33 -0
- package/dist/components/progress/Progress.js.map +1 -0
- package/dist/components/radiogroup/RadioGroup.cjs +2 -0
- package/dist/components/radiogroup/RadioGroup.cjs.map +1 -0
- package/dist/components/radiogroup/RadioGroup.js +79 -0
- package/dist/components/radiogroup/RadioGroup.js.map +1 -0
- package/dist/components/rating/Rating.cjs +2 -0
- package/dist/components/rating/Rating.cjs.map +1 -0
- package/dist/components/rating/Rating.js +49 -0
- package/dist/components/rating/Rating.js.map +1 -0
- package/dist/components/skeleton/Skeleton.cjs +2 -0
- package/dist/components/skeleton/Skeleton.cjs.map +1 -0
- package/dist/components/skeleton/Skeleton.js +86 -0
- package/dist/components/skeleton/Skeleton.js.map +1 -0
- package/dist/components/slider/Slider.cjs +2 -0
- package/dist/components/slider/Slider.cjs.map +1 -0
- package/dist/components/slider/Slider.js +116 -0
- package/dist/components/slider/Slider.js.map +1 -0
- package/dist/components/spinner/Spinner.cjs +2 -0
- package/dist/components/spinner/Spinner.cjs.map +1 -0
- package/dist/components/spinner/Spinner.js +21 -0
- package/dist/components/spinner/Spinner.js.map +1 -0
- package/dist/components/stepper/Stepper.cjs +6 -0
- package/dist/components/stepper/Stepper.cjs.map +1 -0
- package/dist/components/stepper/Stepper.js +43 -0
- package/dist/components/stepper/Stepper.js.map +1 -0
- package/dist/components/switch/Switch.cjs +2 -0
- package/dist/components/switch/Switch.cjs.map +1 -0
- package/dist/components/switch/Switch.js +67 -0
- package/dist/components/switch/Switch.js.map +1 -0
- package/dist/components/table/Table.cjs +2 -0
- package/dist/components/table/Table.cjs.map +1 -0
- package/dist/components/table/Table.js +46 -0
- package/dist/components/table/Table.js.map +1 -0
- package/dist/components/tabs/Tabs.cjs +2 -0
- package/dist/components/tabs/Tabs.cjs.map +1 -0
- package/dist/components/tabs/Tabs.js +56 -0
- package/dist/components/tabs/Tabs.js.map +1 -0
- package/dist/components/textarea/Textarea.cjs +2 -0
- package/dist/components/textarea/Textarea.cjs.map +1 -0
- package/dist/components/textarea/Textarea.js +75 -0
- package/dist/components/textarea/Textarea.js.map +1 -0
- package/dist/components/toast/Toast.cjs +2 -0
- package/dist/components/toast/Toast.cjs.map +1 -0
- package/dist/components/toast/Toast.js +52 -0
- package/dist/components/toast/Toast.js.map +1 -0
- package/dist/components/tooltip/Tooltip.cjs +2 -0
- package/dist/components/tooltip/Tooltip.cjs.map +1 -0
- package/dist/components/tooltip/Tooltip.js +73 -0
- package/dist/components/tooltip/Tooltip.js.map +1 -0
- package/dist/components/treeview/TreeView.cjs +2 -0
- package/dist/components/treeview/TreeView.cjs.map +1 -0
- package/dist/components/treeview/TreeView.js +98 -0
- package/dist/components/treeview/TreeView.js.map +1 -0
- package/dist/components/virtuallist/VirtualList.cjs +2 -0
- package/dist/components/virtuallist/VirtualList.cjs.map +1 -0
- package/dist/components/virtuallist/VirtualList.js +58 -0
- package/dist/components/virtuallist/VirtualList.js.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/styles/index.css +1 -0
- package/dist/theme/NUIProvider.cjs +2 -0
- package/dist/theme/NUIProvider.cjs.map +1 -0
- package/dist/theme/NUIProvider.js +34 -0
- package/dist/theme/NUIProvider.js.map +1 -0
- package/dist/theme/useTheme.cjs +2 -0
- package/dist/theme/useTheme.cjs.map +1 -0
- package/dist/theme/useTheme.js +9 -0
- package/dist/theme/useTheme.js.map +1 -0
- package/dist/types/components/accordion/Accordion.d.ts +18 -0
- package/dist/types/components/accordion/Accordion.d.ts.map +1 -0
- package/dist/types/components/alert/Alert.d.ts +13 -0
- package/dist/types/components/alert/Alert.d.ts.map +1 -0
- package/dist/types/components/avatar/Avatar.d.ts +18 -0
- package/dist/types/components/avatar/Avatar.d.ts.map +1 -0
- package/dist/types/components/avatar/AvatarGroup.d.ts +10 -0
- package/dist/types/components/avatar/AvatarGroup.d.ts.map +1 -0
- package/dist/types/components/badge/Badge.d.ts +22 -0
- package/dist/types/components/badge/Badge.d.ts.map +1 -0
- package/dist/types/components/badge/BadgeGroup.d.ts +9 -0
- package/dist/types/components/badge/BadgeGroup.d.ts.map +1 -0
- package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts +15 -0
- package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts.map +1 -0
- package/dist/types/components/button/Button.d.ts +15 -0
- package/dist/types/components/button/Button.d.ts.map +1 -0
- package/dist/types/components/card/Card.d.ts +27 -0
- package/dist/types/components/card/Card.d.ts.map +1 -0
- package/dist/types/components/checkbox/Checkbox.d.ts +15 -0
- package/dist/types/components/checkbox/Checkbox.d.ts.map +1 -0
- package/dist/types/components/chip/Chip.d.ts +21 -0
- package/dist/types/components/chip/Chip.d.ts.map +1 -0
- package/dist/types/components/combobox/Combobox.d.ts +24 -0
- package/dist/types/components/combobox/Combobox.d.ts.map +1 -0
- package/dist/types/components/commandpalette/CommandPalette.d.ts +21 -0
- package/dist/types/components/commandpalette/CommandPalette.d.ts.map +1 -0
- package/dist/types/components/contextmenu/ContextMenu.d.ts +17 -0
- package/dist/types/components/contextmenu/ContextMenu.d.ts.map +1 -0
- package/dist/types/components/datagrid/DataGrid.d.ts +28 -0
- package/dist/types/components/datagrid/DataGrid.d.ts.map +1 -0
- package/dist/types/components/datepicker/DatePicker.d.ts +14 -0
- package/dist/types/components/datepicker/DatePicker.d.ts.map +1 -0
- package/dist/types/components/daterangepicker/DateRangePicker.d.ts +19 -0
- package/dist/types/components/daterangepicker/DateRangePicker.d.ts.map +1 -0
- package/dist/types/components/drawer/Drawer.d.ts +12 -0
- package/dist/types/components/drawer/Drawer.d.ts.map +1 -0
- package/dist/types/components/dropdown/Dropdown.d.ts +18 -0
- package/dist/types/components/dropdown/Dropdown.d.ts.map +1 -0
- package/dist/types/components/fileuploader/FileUploader.d.ts +9 -0
- package/dist/types/components/fileuploader/FileUploader.d.ts.map +1 -0
- package/dist/types/components/hovercard/HoverCard.d.ts +10 -0
- package/dist/types/components/hovercard/HoverCard.d.ts.map +1 -0
- package/dist/types/components/input/Input.d.ts +15 -0
- package/dist/types/components/input/Input.d.ts.map +1 -0
- package/dist/types/components/layout/Container.d.ts +8 -0
- package/dist/types/components/layout/Container.d.ts.map +1 -0
- package/dist/types/components/layout/Flex.d.ts +14 -0
- package/dist/types/components/layout/Flex.d.ts.map +1 -0
- package/dist/types/components/layout/Grid.d.ts +10 -0
- package/dist/types/components/layout/Grid.d.ts.map +1 -0
- package/dist/types/components/layout/HStack.d.ts +8 -0
- package/dist/types/components/layout/HStack.d.ts.map +1 -0
- package/dist/types/components/layout/Stack.d.ts +8 -0
- package/dist/types/components/layout/Stack.d.ts.map +1 -0
- package/dist/types/components/megamenu/MegaMenu.d.ts +12 -0
- package/dist/types/components/megamenu/MegaMenu.d.ts.map +1 -0
- package/dist/types/components/modal/Modal.d.ts +16 -0
- package/dist/types/components/modal/Modal.d.ts.map +1 -0
- package/dist/types/components/pagination/Pagination.d.ts +9 -0
- package/dist/types/components/pagination/Pagination.d.ts.map +1 -0
- package/dist/types/components/popover/Popover.d.ts +21 -0
- package/dist/types/components/popover/Popover.d.ts.map +1 -0
- package/dist/types/components/progress/Progress.d.ts +13 -0
- package/dist/types/components/progress/Progress.d.ts.map +1 -0
- package/dist/types/components/radiogroup/RadioGroup.d.ts +18 -0
- package/dist/types/components/radiogroup/RadioGroup.d.ts.map +1 -0
- package/dist/types/components/rating/Rating.d.ts +19 -0
- package/dist/types/components/rating/Rating.d.ts.map +1 -0
- package/dist/types/components/select/Select.d.ts +20 -0
- package/dist/types/components/select/Select.d.ts.map +1 -0
- package/dist/types/components/skeleton/Skeleton.d.ts +44 -0
- package/dist/types/components/skeleton/Skeleton.d.ts.map +1 -0
- package/dist/types/components/slider/Slider.d.ts +13 -0
- package/dist/types/components/slider/Slider.d.ts.map +1 -0
- package/dist/types/components/spinner/Spinner.d.ts +7 -0
- package/dist/types/components/spinner/Spinner.d.ts.map +1 -0
- package/dist/types/components/stepper/Stepper.d.ts +12 -0
- package/dist/types/components/stepper/Stepper.d.ts.map +1 -0
- package/dist/types/components/switch/Switch.d.ts +15 -0
- package/dist/types/components/switch/Switch.d.ts.map +1 -0
- package/dist/types/components/table/Table.d.ts +14 -0
- package/dist/types/components/table/Table.d.ts.map +1 -0
- package/dist/types/components/tabs/Tabs.d.ts +14 -0
- package/dist/types/components/tabs/Tabs.d.ts.map +1 -0
- package/dist/types/components/textarea/Textarea.d.ts +14 -0
- package/dist/types/components/textarea/Textarea.d.ts.map +1 -0
- package/dist/types/components/toast/Toast.d.ts +16 -0
- package/dist/types/components/toast/Toast.d.ts.map +1 -0
- package/dist/types/components/tooltip/Tooltip.d.ts +10 -0
- package/dist/types/components/tooltip/Tooltip.d.ts.map +1 -0
- package/dist/types/components/treeview/TreeView.d.ts +16 -0
- package/dist/types/components/treeview/TreeView.d.ts.map +1 -0
- package/dist/types/components/virtuallist/VirtualList.d.ts +23 -0
- package/dist/types/components/virtuallist/VirtualList.d.ts.map +1 -0
- package/dist/types/index.d.ts +50 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/theme/NUIProvider.d.ts +14 -0
- package/dist/types/theme/NUIProvider.d.ts.map +1 -0
- package/dist/types/theme/useTheme.d.ts +11 -0
- package/dist/types/theme/useTheme.d.ts.map +1 -0
- package/dist/types/utils/generateid/generateId.d.ts +2 -0
- package/dist/types/utils/generateid/generateId.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +9 -0
- package/dist/types/utils/index.d.ts.map +1 -0
- package/dist/types/utils/inertmanager/inertManager.d.ts +13 -0
- package/dist/types/utils/inertmanager/inertManager.d.ts.map +1 -0
- package/dist/types/utils/keyboardnav/keyboardNav.d.ts +11 -0
- package/dist/types/utils/keyboardnav/keyboardNav.d.ts.map +1 -0
- package/dist/types/utils/onclickoutside/onClickOutside.d.ts +3 -0
- package/dist/types/utils/onclickoutside/onClickOutside.d.ts.map +1 -0
- package/dist/types/utils/portal/portal.d.ts +4 -0
- package/dist/types/utils/portal/portal.d.ts.map +1 -0
- package/dist/types/utils/restorefocus/restoreFocus.d.ts +8 -0
- package/dist/types/utils/restorefocus/restoreFocus.d.ts.map +1 -0
- package/dist/types/utils/scrolllock/scrollLock.d.ts +11 -0
- package/dist/types/utils/scrolllock/scrollLock.d.ts.map +1 -0
- package/dist/types/utils/trapfocus/trapFocus.d.ts +8 -0
- package/dist/types/utils/trapfocus/trapFocus.d.ts.map +1 -0
- package/dist/utils/generateid/generateId.cjs +2 -0
- package/dist/utils/generateid/generateId.cjs.map +1 -0
- package/dist/utils/generateid/generateId.js +7 -0
- package/dist/utils/generateid/generateId.js.map +1 -0
- package/dist/utils/inertmanager/inertManager.cjs +2 -0
- package/dist/utils/inertmanager/inertManager.cjs.map +1 -0
- package/dist/utils/inertmanager/inertManager.js +18 -0
- package/dist/utils/inertmanager/inertManager.js.map +1 -0
- package/dist/utils/keyboardnav/keyboardNav.cjs +2 -0
- package/dist/utils/keyboardnav/keyboardNav.cjs.map +1 -0
- package/dist/utils/keyboardnav/keyboardNav.js +10 -0
- package/dist/utils/keyboardnav/keyboardNav.js.map +1 -0
- package/dist/utils/onclickoutside/onClickOutside.cjs +2 -0
- package/dist/utils/onclickoutside/onClickOutside.cjs.map +1 -0
- package/dist/utils/onclickoutside/onClickOutside.js +11 -0
- package/dist/utils/onclickoutside/onClickOutside.js.map +1 -0
- package/dist/utils/portal/portal.cjs +2 -0
- package/dist/utils/portal/portal.cjs.map +1 -0
- package/dist/utils/portal/portal.js +8 -0
- package/dist/utils/portal/portal.js.map +1 -0
- package/dist/utils/restorefocus/restoreFocus.cjs +2 -0
- package/dist/utils/restorefocus/restoreFocus.cjs.map +1 -0
- package/dist/utils/restorefocus/restoreFocus.js +7 -0
- package/dist/utils/restorefocus/restoreFocus.js.map +1 -0
- package/dist/utils/scrolllock/scrollLock.cjs +2 -0
- package/dist/utils/scrolllock/scrollLock.cjs.map +1 -0
- package/dist/utils/scrolllock/scrollLock.js +12 -0
- package/dist/utils/scrolllock/scrollLock.js.map +1 -0
- package/dist/utils/trapfocus/trapFocus.cjs +3 -0
- package/dist/utils/trapfocus/trapFocus.cjs.map +1 -0
- package/dist/utils/trapfocus/trapFocus.js +14 -0
- package/dist/utils/trapfocus/trapFocus.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
import { jsxs as u, jsx as a } from "react/jsx-runtime";
|
|
2
|
+
import { useState as c, useRef as K, useEffect as E, useMemo as T, useCallback as Ce } from "react";
|
|
3
|
+
/* empty css */
|
|
4
|
+
import { onClickOutside as Fe } from "../../utils/onclickoutside/onClickOutside.js";
|
|
5
|
+
import { restoreFocus as Se } from "../../utils/restorefocus/restoreFocus.js";
|
|
6
|
+
import { Portal as Re } from "../../utils/portal/portal.js";
|
|
7
|
+
const re = (o) => o < 10 ? `0${o}` : `${o}`, w = (o) => `${o.getFullYear()}-${re(o.getMonth() + 1)}-${re(o.getDate())}`;
|
|
8
|
+
function x(o) {
|
|
9
|
+
if (!o) return null;
|
|
10
|
+
const [v, b, L] = o.split("-").map(Number), Y = new Date(v, b - 1, L);
|
|
11
|
+
return Number.isNaN(Y.getTime()) ? null : Y;
|
|
12
|
+
}
|
|
13
|
+
const oe = (o) => o || null, P = (o) => new Date(o.getFullYear(), o.getMonth(), 1), I = (o, v) => new Date(o.getFullYear(), o.getMonth() + v, 1), se = (o) => new Date(o.getFullYear(), o.getMonth() + 1, 0).getDate();
|
|
14
|
+
function Oe({
|
|
15
|
+
value: o,
|
|
16
|
+
defaultValue: v,
|
|
17
|
+
onChange: b,
|
|
18
|
+
minDate: L,
|
|
19
|
+
maxDate: Y,
|
|
20
|
+
placeholder: ae = "Pick range",
|
|
21
|
+
locale: y = "en-US",
|
|
22
|
+
id: le,
|
|
23
|
+
className: ie = "",
|
|
24
|
+
nameFrom: V,
|
|
25
|
+
nameTo: z
|
|
26
|
+
}) {
|
|
27
|
+
const C = o !== void 0, [ce, B] = c(v), i = C ? o || {} : ce || {}, p = x(i.from), h = x(i.to), de = P(p ?? h ?? /* @__PURE__ */ new Date()), [s, D] = c(de), [d, f] = c(!1), [q, m] = c(!1), [O, G] = c("from"), F = K(null), H = K(null), J = K({}), S = x(L), R = x(Y), Q = (e) => !!(S && e < S || R && e > R), [N, W] = c(null), [k, _] = c(null), [A, X] = c(!1), ue = (e) => {
|
|
28
|
+
if (!A || !N || !k) return !1;
|
|
29
|
+
const t = e.getTime(), n = N.getTime(), r = k.getTime();
|
|
30
|
+
return t >= Math.min(n, r) && t <= Math.max(n, r);
|
|
31
|
+
};
|
|
32
|
+
E(() => {
|
|
33
|
+
if (d)
|
|
34
|
+
return Fe(H, () => {
|
|
35
|
+
f(!1), m(!1);
|
|
36
|
+
});
|
|
37
|
+
}, [d]), E(() => {
|
|
38
|
+
if (!d) return;
|
|
39
|
+
const e = F.current;
|
|
40
|
+
return () => Se(e);
|
|
41
|
+
}, [d]);
|
|
42
|
+
const [j, fe] = c(null);
|
|
43
|
+
E(() => {
|
|
44
|
+
if (!d || !F.current) return;
|
|
45
|
+
const e = F.current.getBoundingClientRect();
|
|
46
|
+
fe({ top: e.bottom + 8, left: e.left });
|
|
47
|
+
}, [d, s]);
|
|
48
|
+
const M = T(() => {
|
|
49
|
+
const t = P(s).getDay(), n = se(s), r = [];
|
|
50
|
+
for (let l = 0; l < t; l++) r.push(null);
|
|
51
|
+
for (let l = 1; l <= n; l++) r.push(l);
|
|
52
|
+
for (; r.length % 7 !== 0; ) r.push(null);
|
|
53
|
+
return r;
|
|
54
|
+
}, [s]), me = T(
|
|
55
|
+
() => Array.from({ length: 7 }).map(
|
|
56
|
+
(e, t) => new Date(2020, 5, 7 + t).toLocaleDateString(y, {
|
|
57
|
+
weekday: "short"
|
|
58
|
+
})
|
|
59
|
+
),
|
|
60
|
+
[y]
|
|
61
|
+
), ge = s.getFullYear(), Z = 100, ee = ge - Z, pe = T(
|
|
62
|
+
() => Array.from({ length: Z * 2 + 1 }).map((e, t) => ee + t),
|
|
63
|
+
[ee]
|
|
64
|
+
), he = T(
|
|
65
|
+
() => Array.from({ length: 12 }).map(
|
|
66
|
+
(e, t) => new Date(2020, t, 1).toLocaleDateString(y, { month: "short" })
|
|
67
|
+
),
|
|
68
|
+
[y]
|
|
69
|
+
), De = (e, t) => {
|
|
70
|
+
const n = new Date(e, t, 1), r = new Date(e, t, se(n));
|
|
71
|
+
return !!(S && r < S || R && n > R);
|
|
72
|
+
}, we = (e, t) => {
|
|
73
|
+
if (!e && !t) return { from: void 0, to: void 0 };
|
|
74
|
+
if (!e) return { from: void 0, to: t ? w(t) : void 0 };
|
|
75
|
+
if (!t) return { from: w(e), to: void 0 };
|
|
76
|
+
const n = e.getTime(), r = t.getTime();
|
|
77
|
+
return n <= r ? { from: w(e), to: w(t) } : { from: w(t), to: w(e) };
|
|
78
|
+
}, U = Ce(
|
|
79
|
+
(e, t) => {
|
|
80
|
+
const n = we(e, t);
|
|
81
|
+
C || B(n), b?.(n);
|
|
82
|
+
},
|
|
83
|
+
[b, C]
|
|
84
|
+
), te = (e) => {
|
|
85
|
+
const t = new Date(s.getFullYear(), s.getMonth(), e);
|
|
86
|
+
if (Q(t)) return;
|
|
87
|
+
let n = p, r = h;
|
|
88
|
+
O === "from" ? (n = t, r && t > r && (r = null)) : (r = t, n && t < n && (n = t, r = null)), U(oe(n), oe(r)), n && r && (f(!1), m(!1));
|
|
89
|
+
};
|
|
90
|
+
E(() => {
|
|
91
|
+
const e = () => {
|
|
92
|
+
if (A) {
|
|
93
|
+
if (X(!1), N && k) {
|
|
94
|
+
const t = N, n = k, r = t <= n ? t : n, l = t <= n ? n : t;
|
|
95
|
+
U(r, l), f(!1), m(!1);
|
|
96
|
+
}
|
|
97
|
+
W(null), _(null);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
return window.addEventListener("mouseup", e), () => window.removeEventListener("mouseup", e);
|
|
101
|
+
}, [A, N, k, U]);
|
|
102
|
+
const ve = (e) => !p || !h ? !1 : e > p && e < h, be = (e) => p && e.getTime() === p.getTime(), ye = (e) => h && e.getTime() === h.getTime(), Ne = (e) => {
|
|
103
|
+
if (e < 0 || e >= M.length) return;
|
|
104
|
+
const t = M[e];
|
|
105
|
+
if (!t) return;
|
|
106
|
+
const n = `${s.getFullYear()}-${s.getMonth()}-${t}`;
|
|
107
|
+
J.current[n]?.focus();
|
|
108
|
+
}, ke = (e, t) => {
|
|
109
|
+
const n = M.findIndex((g) => g === t);
|
|
110
|
+
if (n === -1) return;
|
|
111
|
+
const r = 7;
|
|
112
|
+
let l = null;
|
|
113
|
+
switch (e.key) {
|
|
114
|
+
case "ArrowRight":
|
|
115
|
+
l = n + 1;
|
|
116
|
+
break;
|
|
117
|
+
case "ArrowLeft":
|
|
118
|
+
l = n - 1;
|
|
119
|
+
break;
|
|
120
|
+
case "ArrowDown":
|
|
121
|
+
l = n + r;
|
|
122
|
+
break;
|
|
123
|
+
case "ArrowUp":
|
|
124
|
+
l = n - r;
|
|
125
|
+
break;
|
|
126
|
+
case "Enter":
|
|
127
|
+
case " ":
|
|
128
|
+
e.preventDefault(), te(t);
|
|
129
|
+
return;
|
|
130
|
+
case "PageUp":
|
|
131
|
+
D((g) => I(g, -1));
|
|
132
|
+
return;
|
|
133
|
+
case "PageDown":
|
|
134
|
+
D((g) => I(g, 1));
|
|
135
|
+
return;
|
|
136
|
+
case "Escape":
|
|
137
|
+
f(!1);
|
|
138
|
+
return;
|
|
139
|
+
default:
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
e.preventDefault(), l != null && M[l] != null && Ne(l);
|
|
143
|
+
}, Me = () => !i.from && !i.to ? ae : i.from && !i.to ? `${i.from} → ` : !i.from && i.to ? ` → ${i.to}` : `${i.from} → ${i.to}`;
|
|
144
|
+
return /* @__PURE__ */ u("div", { className: `ui-daterange-picker ${ie}`, children: [
|
|
145
|
+
V && /* @__PURE__ */ a("input", { type: "hidden", name: V, value: i.from ?? "" }),
|
|
146
|
+
z && /* @__PURE__ */ a("input", { type: "hidden", name: z, value: i.to ?? "" }),
|
|
147
|
+
/* @__PURE__ */ a(
|
|
148
|
+
"button",
|
|
149
|
+
{
|
|
150
|
+
id: le,
|
|
151
|
+
ref: F,
|
|
152
|
+
type: "button",
|
|
153
|
+
className: "drp-trigger",
|
|
154
|
+
"aria-haspopup": "dialog",
|
|
155
|
+
"aria-expanded": d,
|
|
156
|
+
onClick: () => {
|
|
157
|
+
f((e) => !e), m(!1);
|
|
158
|
+
},
|
|
159
|
+
children: Me()
|
|
160
|
+
}
|
|
161
|
+
),
|
|
162
|
+
/* @__PURE__ */ u("div", { className: "drp-actions", children: [
|
|
163
|
+
/* @__PURE__ */ a(
|
|
164
|
+
"button",
|
|
165
|
+
{
|
|
166
|
+
className: `drp-part ${O === "from" ? "active" : ""}`,
|
|
167
|
+
onClick: () => G("from"),
|
|
168
|
+
children: "From"
|
|
169
|
+
}
|
|
170
|
+
),
|
|
171
|
+
/* @__PURE__ */ a(
|
|
172
|
+
"button",
|
|
173
|
+
{
|
|
174
|
+
className: `drp-part ${O === "to" ? "active" : ""}`,
|
|
175
|
+
onClick: () => G("to"),
|
|
176
|
+
children: "To"
|
|
177
|
+
}
|
|
178
|
+
)
|
|
179
|
+
] }),
|
|
180
|
+
d && j && /* @__PURE__ */ a(Re, { children: /* @__PURE__ */ a(
|
|
181
|
+
"div",
|
|
182
|
+
{
|
|
183
|
+
ref: H,
|
|
184
|
+
className: "drp-popover",
|
|
185
|
+
style: { position: "fixed", top: j.top, left: j.left },
|
|
186
|
+
children: /* @__PURE__ */ u("div", { className: "drp-panel", children: [
|
|
187
|
+
/* @__PURE__ */ u("div", { className: "drp-header", children: [
|
|
188
|
+
/* @__PURE__ */ a(
|
|
189
|
+
"button",
|
|
190
|
+
{
|
|
191
|
+
className: "drp-arrow",
|
|
192
|
+
onClick: () => D((e) => I(e, -1)),
|
|
193
|
+
children: "‹"
|
|
194
|
+
}
|
|
195
|
+
),
|
|
196
|
+
/* @__PURE__ */ u(
|
|
197
|
+
"button",
|
|
198
|
+
{
|
|
199
|
+
className: "drp-title",
|
|
200
|
+
onClick: () => m((e) => !e),
|
|
201
|
+
children: [
|
|
202
|
+
s.toLocaleDateString(y, {
|
|
203
|
+
month: "long"
|
|
204
|
+
}),
|
|
205
|
+
" ",
|
|
206
|
+
s.getFullYear()
|
|
207
|
+
]
|
|
208
|
+
}
|
|
209
|
+
),
|
|
210
|
+
/* @__PURE__ */ a(
|
|
211
|
+
"button",
|
|
212
|
+
{
|
|
213
|
+
className: "drp-arrow",
|
|
214
|
+
onClick: () => D((e) => I(e, 1)),
|
|
215
|
+
children: "›"
|
|
216
|
+
}
|
|
217
|
+
)
|
|
218
|
+
] }),
|
|
219
|
+
q && /* @__PURE__ */ u("div", { className: "drp-ym", children: [
|
|
220
|
+
/* @__PURE__ */ a("div", { className: "drp-year-grid", children: pe.map((e) => /* @__PURE__ */ a(
|
|
221
|
+
"button",
|
|
222
|
+
{
|
|
223
|
+
className: `drp-year ${e === s.getFullYear() ? "selected" : ""}`,
|
|
224
|
+
onClick: () => D(
|
|
225
|
+
P(new Date(e, s.getMonth(), 1))
|
|
226
|
+
),
|
|
227
|
+
children: e
|
|
228
|
+
},
|
|
229
|
+
e
|
|
230
|
+
)) }),
|
|
231
|
+
/* @__PURE__ */ a("div", { className: "drp-month-grid", children: he.map((e, t) => {
|
|
232
|
+
const n = De(
|
|
233
|
+
s.getFullYear(),
|
|
234
|
+
t
|
|
235
|
+
);
|
|
236
|
+
return /* @__PURE__ */ a(
|
|
237
|
+
"button",
|
|
238
|
+
{
|
|
239
|
+
className: `drp-month ${n ? "disabled" : ""} ${t === s.getMonth() ? "selected" : ""}`,
|
|
240
|
+
disabled: n ? !0 : void 0,
|
|
241
|
+
onClick: () => !n && D(
|
|
242
|
+
P(
|
|
243
|
+
new Date(s.getFullYear(), t, 1)
|
|
244
|
+
)
|
|
245
|
+
),
|
|
246
|
+
children: e
|
|
247
|
+
},
|
|
248
|
+
t
|
|
249
|
+
);
|
|
250
|
+
}) })
|
|
251
|
+
] }),
|
|
252
|
+
!q && /* @__PURE__ */ u("div", { className: "drp-calendar", children: [
|
|
253
|
+
/* @__PURE__ */ a("div", { className: "drp-weekdays", children: me.map((e, t) => /* @__PURE__ */ a("div", { className: "drp-weekday", children: e }, t)) }),
|
|
254
|
+
/* @__PURE__ */ a("div", { className: "drp-days", children: M.map((e, t) => {
|
|
255
|
+
if (e === null)
|
|
256
|
+
return /* @__PURE__ */ a("div", { className: "drp-day-empty" }, t);
|
|
257
|
+
const n = new Date(
|
|
258
|
+
s.getFullYear(),
|
|
259
|
+
s.getMonth(),
|
|
260
|
+
e
|
|
261
|
+
), r = Q(n), l = be(n), g = ye(n), $e = ve(n), Ye = ue(n), ne = `${s.getFullYear()}-${s.getMonth()}-${e}`;
|
|
262
|
+
return /* @__PURE__ */ a(
|
|
263
|
+
"button",
|
|
264
|
+
{
|
|
265
|
+
ref: ($) => {
|
|
266
|
+
J.current[ne] = $;
|
|
267
|
+
},
|
|
268
|
+
disabled: r ? !0 : void 0,
|
|
269
|
+
className: [
|
|
270
|
+
"drp-day",
|
|
271
|
+
l ? "start" : "",
|
|
272
|
+
g ? "end" : "",
|
|
273
|
+
$e ? "between" : "",
|
|
274
|
+
Ye ? "dragging" : "",
|
|
275
|
+
r ? "disabled" : ""
|
|
276
|
+
].join(" "),
|
|
277
|
+
onClick: () => !r && te(e),
|
|
278
|
+
onKeyDown: ($) => ke($, e),
|
|
279
|
+
onMouseDown: ($) => {
|
|
280
|
+
r || ($.preventDefault(), W(n), _(n), X(!0));
|
|
281
|
+
},
|
|
282
|
+
onMouseEnter: () => {
|
|
283
|
+
!A || r || _(n);
|
|
284
|
+
},
|
|
285
|
+
children: e
|
|
286
|
+
},
|
|
287
|
+
ne
|
|
288
|
+
);
|
|
289
|
+
}) })
|
|
290
|
+
] }),
|
|
291
|
+
/* @__PURE__ */ u("div", { className: "drp-footer", children: [
|
|
292
|
+
/* @__PURE__ */ a(
|
|
293
|
+
"button",
|
|
294
|
+
{
|
|
295
|
+
className: "drp-clear",
|
|
296
|
+
onClick: () => {
|
|
297
|
+
const e = { from: void 0, to: void 0 };
|
|
298
|
+
C || B(e), b?.(e), f(!1), m(!1);
|
|
299
|
+
},
|
|
300
|
+
children: "Clear"
|
|
301
|
+
}
|
|
302
|
+
),
|
|
303
|
+
/* @__PURE__ */ a(
|
|
304
|
+
"button",
|
|
305
|
+
{
|
|
306
|
+
className: "drp-close",
|
|
307
|
+
onClick: () => {
|
|
308
|
+
f(!1), m(!1);
|
|
309
|
+
},
|
|
310
|
+
children: "Close"
|
|
311
|
+
}
|
|
312
|
+
)
|
|
313
|
+
] })
|
|
314
|
+
] })
|
|
315
|
+
}
|
|
316
|
+
) })
|
|
317
|
+
] });
|
|
318
|
+
}
|
|
319
|
+
export {
|
|
320
|
+
Oe as DateRangePicker
|
|
321
|
+
};
|
|
322
|
+
//# sourceMappingURL=DateRangePicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),r=require("react");;/* empty css */const v=require("../../utils/scrolllock/scrollLock.cjs"),m=require("../../utils/inertmanager/inertManager.cjs"),g=require("../../utils/trapfocus/trapFocus.cjs"),p=require("../../utils/onclickoutside/onClickOutside.cjs"),w=require("../../utils/restorefocus/restoreFocus.cjs"),R=require("../../utils/portal/portal.cjs");function F({open:e,onClose:l,position:k="right",className:y="",children:q,disableEsc:i=!1,disableClickOutside:a=!1}){const o=r.useRef(null),t=r.useRef(null),d=r.useRef(null),n=r.useCallback(()=>{l()},[l]);return r.useEffect(()=>{if(!e||i)return;const u=c=>{c.key==="Escape"&&(c.preventDefault(),n())};return document.addEventListener("keydown",u),()=>document.removeEventListener("keydown",u)},[e,i,n]),r.useEffect(()=>{if(!e)return;d.current=document.activeElement,v.scrollLock.lock();const u=o.current?m.applyInertToSiblings(o.current):[],c=t.current?g.trapFocus(t.current):void 0;let f;return!a&&t.current&&(f=p.onClickOutside(t,n)),()=>{f?.(),c?.(),v.scrollLock.unlock(),m.removeInertFromSiblings(u),w.restoreFocus(d.current)}},[e,a,n]),e?s.jsx(R.Portal,{children:s.jsx("div",{ref:o,className:`ui-drawer-overlay ${e?"open":""}`,children:s.jsx("div",{ref:t,className:`ui-drawer ${k} ${e?"open":""} ${y}`,role:"dialog","aria-modal":"true",children:q})})}):null}exports.Drawer=F;
|
|
2
|
+
//# sourceMappingURL=Drawer.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { jsx as l } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as c, useCallback as w, useEffect as d } from "react";
|
|
3
|
+
/* empty css */
|
|
4
|
+
import { scrollLock as p } from "../../utils/scrolllock/scrollLock.js";
|
|
5
|
+
import { applyInertToSiblings as g, removeInertFromSiblings as h } from "../../utils/inertmanager/inertManager.js";
|
|
6
|
+
import { trapFocus as E } from "../../utils/trapfocus/trapFocus.js";
|
|
7
|
+
import { onClickOutside as F } from "../../utils/onclickoutside/onClickOutside.js";
|
|
8
|
+
import { restoreFocus as $ } from "../../utils/restorefocus/restoreFocus.js";
|
|
9
|
+
import { Portal as L } from "../../utils/portal/portal.js";
|
|
10
|
+
function j({
|
|
11
|
+
open: r,
|
|
12
|
+
onClose: i,
|
|
13
|
+
position: v = "right",
|
|
14
|
+
className: y = "",
|
|
15
|
+
children: k,
|
|
16
|
+
disableEsc: a = !1,
|
|
17
|
+
disableClickOutside: m = !1
|
|
18
|
+
}) {
|
|
19
|
+
const u = c(null), e = c(null), s = c(null), t = w(() => {
|
|
20
|
+
i();
|
|
21
|
+
}, [i]);
|
|
22
|
+
return d(() => {
|
|
23
|
+
if (!r || a) return;
|
|
24
|
+
const o = (n) => {
|
|
25
|
+
n.key === "Escape" && (n.preventDefault(), t());
|
|
26
|
+
};
|
|
27
|
+
return document.addEventListener("keydown", o), () => document.removeEventListener("keydown", o);
|
|
28
|
+
}, [r, a, t]), d(() => {
|
|
29
|
+
if (!r) return;
|
|
30
|
+
s.current = document.activeElement, p.lock();
|
|
31
|
+
const o = u.current ? g(u.current) : [], n = e.current ? E(e.current) : void 0;
|
|
32
|
+
let f;
|
|
33
|
+
return !m && e.current && (f = F(e, t)), () => {
|
|
34
|
+
f?.(), n?.(), p.unlock(), h(o), $(s.current);
|
|
35
|
+
};
|
|
36
|
+
}, [r, m, t]), r ? /* @__PURE__ */ l(L, { children: /* @__PURE__ */ l(
|
|
37
|
+
"div",
|
|
38
|
+
{
|
|
39
|
+
ref: u,
|
|
40
|
+
className: `ui-drawer-overlay ${r ? "open" : ""}`,
|
|
41
|
+
children: /* @__PURE__ */ l(
|
|
42
|
+
"div",
|
|
43
|
+
{
|
|
44
|
+
ref: e,
|
|
45
|
+
className: `ui-drawer ${v} ${r ? "open" : ""} ${y}`,
|
|
46
|
+
role: "dialog",
|
|
47
|
+
"aria-modal": "true",
|
|
48
|
+
children: k
|
|
49
|
+
}
|
|
50
|
+
)
|
|
51
|
+
}
|
|
52
|
+
) }) : null;
|
|
53
|
+
}
|
|
54
|
+
export {
|
|
55
|
+
j as Drawer
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=Drawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react/jsx-runtime"),t=require("react");;/* empty css */const p=require("../../utils/keyboardnav/keyboardNav.cjs"),m=require("../../utils/restorefocus/restoreFocus.cjs"),w=require("../../utils/onclickoutside/onClickOutside.cjs"),v=require("../../utils/portal/portal.cjs"),f=t.createContext(null);function a(){const s=t.useContext(f);if(!s)throw new Error("Dropdown components must be inside <Dropdown>");return s}function g({children:s}){const[i,e]=t.useState(!1),r=t.useRef(null),o=t.useRef(null),n=t.useRef([]),u=d=>{n.current.push(d)};return t.useEffect(()=>{i||m.restoreFocus(r.current)},[i]),c.jsx(f.Provider,{value:{open:i,setOpen:e,triggerRef:r,menuRef:o,registerItem:u,items:n},children:c.jsx("div",{className:"ui-dropdown",children:s})})}function x({children:s,className:i=""}){const{open:e,setOpen:r,triggerRef:o}=a();return c.jsx("button",{ref:o,className:`ui-dropdown-trigger ${i}`,"aria-haspopup":"menu","aria-expanded":e,onClick:()=>r(n=>!n),children:s})}function k({className:s="",children:i}){const{open:e,setOpen:r,menuRef:o,items:n}=a();return t.useEffect(()=>{if(e)return w.onClickOutside(o,()=>r(!1))},[e,o,r]),t.useEffect(()=>{if(!e)return;const u=d=>{d.key==="Escape"&&r(!1)};return document.addEventListener("keydown",u),()=>document.removeEventListener("keydown",u)},[e,r]),t.useEffect(()=>{if(!e)return;const u=o.current;if(!u)return;const d=p.createKeyboardNavigation({items:n.current,onSelect:l=>n.current[l]?.click()});return u.addEventListener("keydown",d),n.current[0]?.focus(),()=>u.removeEventListener("keydown",d)},[e,o,n]),e?c.jsx(v.Portal,{children:c.jsx("div",{className:"ui-dropdown-menu-wrapper",children:c.jsx("div",{ref:o,className:`ui-dropdown-menu ${s}`,role:"menu",children:i})})}):null}function D({children:s,onSelect:i,className:e=""}){const{registerItem:r,setOpen:o}=a(),n=t.useRef(null);t.useEffect(()=>{n.current&&r(n.current)},[r]);const u=()=>{i?.(),o(!1)};return c.jsx("div",{ref:n,className:`ui-dropdown-item ${e}`,role:"menuitem",tabIndex:-1,onClick:u,children:s})}exports.Dropdown=g;exports.DropdownItem=D;exports.DropdownMenu=k;exports.DropdownTrigger=x;
|
|
2
|
+
//# sourceMappingURL=Dropdown.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dropdown.cjs","sources":["../../../../src/components/dropdown/Dropdown.tsx"],"sourcesContent":["/**\r\n * Dropdown.tsx (Fixed Version — No TS Errors)\r\n * -------------------------------------------\r\n * Accessible dropdown menu:\r\n * - Arrow key navigation\r\n * - Roving tabindex\r\n * - ESC and click outside to close\r\n * - Focus restore\r\n * - Portal rendering\r\n * - Fully typed with no TS or ESLint errors\r\n */\r\n\r\nimport React, {\r\n createContext,\r\n useState,\r\n useContext,\r\n useRef,\r\n useEffect,\r\n ReactNode,\r\n} from 'react';\r\n\r\nimport './Dropdown.css';\r\n\r\nimport { Portal, onClickOutside, restoreFocus, createKeyboardNavigation } from '../../utils/index';\r\n\r\n/* ============================================================\r\n * Context Types\r\n * ============================================================ */\r\n\r\ninterface DropdownContextProps {\r\n open: boolean;\r\n setOpen: React.Dispatch<React.SetStateAction<boolean>>;\r\n triggerRef: React.RefObject<HTMLButtonElement | null>;\r\n menuRef: React.RefObject<HTMLDivElement | null>;\r\n registerItem: (el: HTMLElement) => void;\r\n items: React.RefObject<HTMLElement[]>;\r\n}\r\n\r\nconst DropdownContext = createContext<DropdownContextProps | null>(null);\r\n\r\nfunction useDropdown() {\r\n const ctx = useContext(DropdownContext);\r\n if (!ctx) throw new Error('Dropdown components must be inside <Dropdown>');\r\n return ctx;\r\n}\r\n\r\n/* ============================================================\r\n * Dropdown root\r\n * ============================================================ */\r\n\r\nexport function Dropdown({ children }: { children: ReactNode }) {\r\n const [open, setOpen] = useState(false);\r\n\r\n const triggerRef = useRef<HTMLButtonElement>(null);\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n const items = useRef<HTMLElement[]>([]);\r\n\r\n const registerItem = (el: HTMLElement) => {\r\n items.current.push(el);\r\n };\r\n\r\n // Restore focus to trigger when closing\r\n useEffect(() => {\r\n if (!open) restoreFocus(triggerRef.current);\r\n }, [open]);\r\n\r\n return (\r\n <DropdownContext.Provider\r\n value={{\r\n open,\r\n setOpen,\r\n triggerRef,\r\n menuRef,\r\n registerItem,\r\n items,\r\n }}\r\n >\r\n <div className=\"ui-dropdown\">{children}</div>\r\n </DropdownContext.Provider>\r\n );\r\n}\r\n\r\n/* ============================================================\r\n * Trigger\r\n * ============================================================ */\r\n\r\nexport function DropdownTrigger({\r\n children,\r\n className = '',\r\n}: {\r\n children: ReactNode;\r\n className?: string;\r\n}) {\r\n const { open, setOpen, triggerRef } = useDropdown();\r\n\r\n return (\r\n <button\r\n ref={triggerRef}\r\n className={`ui-dropdown-trigger ${className}`}\r\n aria-haspopup=\"menu\"\r\n aria-expanded={open}\r\n onClick={() => setOpen((prev) => !prev)}\r\n >\r\n {children}\r\n </button>\r\n );\r\n}\r\n\r\n/* ============================================================\r\n * Menu\r\n * ============================================================ */\r\n\r\nexport function DropdownMenu({\r\n className = '',\r\n children,\r\n}: {\r\n className?: string;\r\n children: ReactNode;\r\n}) {\r\n const { open, setOpen, menuRef, items } = useDropdown();\r\n\r\n // Click outside\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(menuRef, () => setOpen(false));\r\n }, [open, menuRef, setOpen]);\r\n\r\n // ESC\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const handler = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') setOpen(false);\r\n };\r\n\r\n document.addEventListener('keydown', handler);\r\n return () => document.removeEventListener('keydown', handler);\r\n }, [open, setOpen]);\r\n\r\n // Keyboard navigation\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const menu = menuRef.current;\r\n if (!menu) return;\r\n\r\n const nav = createKeyboardNavigation({\r\n items: items.current,\r\n onSelect: (i) => items.current[i]?.click(),\r\n });\r\n\r\n menu.addEventListener('keydown', nav);\r\n items.current[0]?.focus();\r\n\r\n return () => menu.removeEventListener('keydown', nav);\r\n }, [open, menuRef, items]);\r\n\r\n if (!open) return null;\r\n\r\n return (\r\n <Portal>\r\n <div className=\"ui-dropdown-menu-wrapper\">\r\n <div\r\n ref={menuRef}\r\n className={`ui-dropdown-menu ${className}`}\r\n role=\"menu\"\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n </Portal>\r\n );\r\n}\r\n\r\n/* ============================================================\r\n * Menu Item\r\n * ============================================================ */\r\n\r\nexport function DropdownItem({\r\n children,\r\n onSelect,\r\n className = '',\r\n}: {\r\n children: ReactNode;\r\n onSelect?: () => void;\r\n className?: string;\r\n}) {\r\n const { registerItem, setOpen } = useDropdown();\r\n const itemRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (itemRef.current) registerItem(itemRef.current);\r\n }, [registerItem]);\r\n\r\n const handleClick = () => {\r\n onSelect?.();\r\n setOpen(false);\r\n };\r\n\r\n return (\r\n <div\r\n ref={itemRef}\r\n className={`ui-dropdown-item ${className}`}\r\n role=\"menuitem\"\r\n tabIndex={-1}\r\n onClick={handleClick}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n"],"names":["DropdownContext","createContext","useDropdown","ctx","useContext","Dropdown","children","open","setOpen","useState","triggerRef","useRef","menuRef","items","registerItem","el","useEffect","restoreFocus","jsx","DropdownTrigger","className","prev","DropdownMenu","onClickOutside","handler","e","menu","nav","createKeyboardNavigation","i","Portal","DropdownItem","onSelect","itemRef","handleClick"],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { jsx as s } from "react/jsx-runtime";
|
|
2
|
+
import { useState as l, useRef as m, useEffect as d, createContext as w, useContext as v } from "react";
|
|
3
|
+
/* empty css */
|
|
4
|
+
import { createKeyboardNavigation as g } from "../../utils/keyboardnav/keyboardNav.js";
|
|
5
|
+
import { restoreFocus as k } from "../../utils/restorefocus/restoreFocus.js";
|
|
6
|
+
import { onClickOutside as h } from "../../utils/onclickoutside/onClickOutside.js";
|
|
7
|
+
import { Portal as x } from "../../utils/portal/portal.js";
|
|
8
|
+
const a = w(null);
|
|
9
|
+
function p() {
|
|
10
|
+
const o = v(a);
|
|
11
|
+
if (!o) throw new Error("Dropdown components must be inside <Dropdown>");
|
|
12
|
+
return o;
|
|
13
|
+
}
|
|
14
|
+
function b({ children: o }) {
|
|
15
|
+
const [u, e] = l(!1), r = m(null), t = m(null), n = m([]), i = (c) => {
|
|
16
|
+
n.current.push(c);
|
|
17
|
+
};
|
|
18
|
+
return d(() => {
|
|
19
|
+
u || k(r.current);
|
|
20
|
+
}, [u]), /* @__PURE__ */ s(
|
|
21
|
+
a.Provider,
|
|
22
|
+
{
|
|
23
|
+
value: {
|
|
24
|
+
open: u,
|
|
25
|
+
setOpen: e,
|
|
26
|
+
triggerRef: r,
|
|
27
|
+
menuRef: t,
|
|
28
|
+
registerItem: i,
|
|
29
|
+
items: n
|
|
30
|
+
},
|
|
31
|
+
children: /* @__PURE__ */ s("div", { className: "ui-dropdown", children: o })
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
function I({
|
|
36
|
+
children: o,
|
|
37
|
+
className: u = ""
|
|
38
|
+
}) {
|
|
39
|
+
const { open: e, setOpen: r, triggerRef: t } = p();
|
|
40
|
+
return /* @__PURE__ */ s(
|
|
41
|
+
"button",
|
|
42
|
+
{
|
|
43
|
+
ref: t,
|
|
44
|
+
className: `ui-dropdown-trigger ${u}`,
|
|
45
|
+
"aria-haspopup": "menu",
|
|
46
|
+
"aria-expanded": e,
|
|
47
|
+
onClick: () => r((n) => !n),
|
|
48
|
+
children: o
|
|
49
|
+
}
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
function L({
|
|
53
|
+
className: o = "",
|
|
54
|
+
children: u
|
|
55
|
+
}) {
|
|
56
|
+
const { open: e, setOpen: r, menuRef: t, items: n } = p();
|
|
57
|
+
return d(() => {
|
|
58
|
+
if (e)
|
|
59
|
+
return h(t, () => r(!1));
|
|
60
|
+
}, [e, t, r]), d(() => {
|
|
61
|
+
if (!e) return;
|
|
62
|
+
const i = (c) => {
|
|
63
|
+
c.key === "Escape" && r(!1);
|
|
64
|
+
};
|
|
65
|
+
return document.addEventListener("keydown", i), () => document.removeEventListener("keydown", i);
|
|
66
|
+
}, [e, r]), d(() => {
|
|
67
|
+
if (!e) return;
|
|
68
|
+
const i = t.current;
|
|
69
|
+
if (!i) return;
|
|
70
|
+
const c = g({
|
|
71
|
+
items: n.current,
|
|
72
|
+
onSelect: (f) => n.current[f]?.click()
|
|
73
|
+
});
|
|
74
|
+
return i.addEventListener("keydown", c), n.current[0]?.focus(), () => i.removeEventListener("keydown", c);
|
|
75
|
+
}, [e, t, n]), e ? /* @__PURE__ */ s(x, { children: /* @__PURE__ */ s("div", { className: "ui-dropdown-menu-wrapper", children: /* @__PURE__ */ s(
|
|
76
|
+
"div",
|
|
77
|
+
{
|
|
78
|
+
ref: t,
|
|
79
|
+
className: `ui-dropdown-menu ${o}`,
|
|
80
|
+
role: "menu",
|
|
81
|
+
children: u
|
|
82
|
+
}
|
|
83
|
+
) }) }) : null;
|
|
84
|
+
}
|
|
85
|
+
function $({
|
|
86
|
+
children: o,
|
|
87
|
+
onSelect: u,
|
|
88
|
+
className: e = ""
|
|
89
|
+
}) {
|
|
90
|
+
const { registerItem: r, setOpen: t } = p(), n = m(null);
|
|
91
|
+
d(() => {
|
|
92
|
+
n.current && r(n.current);
|
|
93
|
+
}, [r]);
|
|
94
|
+
const i = () => {
|
|
95
|
+
u?.(), t(!1);
|
|
96
|
+
};
|
|
97
|
+
return /* @__PURE__ */ s(
|
|
98
|
+
"div",
|
|
99
|
+
{
|
|
100
|
+
ref: n,
|
|
101
|
+
className: `ui-dropdown-item ${e}`,
|
|
102
|
+
role: "menuitem",
|
|
103
|
+
tabIndex: -1,
|
|
104
|
+
onClick: i,
|
|
105
|
+
children: o
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
export {
|
|
110
|
+
b as Dropdown,
|
|
111
|
+
$ as DropdownItem,
|
|
112
|
+
L as DropdownMenu,
|
|
113
|
+
I as DropdownTrigger
|
|
114
|
+
};
|
|
115
|
+
//# sourceMappingURL=Dropdown.js.map
|