@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
|
@@ -0,0 +1 @@
|
|
|
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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"}
|
|
@@ -0,0 +1 @@
|
|
|
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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"}
|
|
@@ -0,0 +1 @@
|
|
|
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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"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"Dropdown.js","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 @@
|
|
|
1
|
+
{"version":3,"file":"FileUploader.cjs","sources":["../../../src/components/fileuploader/FileUploader.tsx"],"sourcesContent":["/**\r\n * FileUploader.tsx — FINAL VERSION\r\n * --------------------------------\r\n * Features:\r\n * - Drag & drop\r\n * - Click to upload\r\n * - Keyboard activate\r\n * - File list preview\r\n * - Remove file\r\n * - Accept filters\r\n * - Multiple uploads\r\n */\r\n\r\nimport { useRef, useState, useCallback, DragEvent, ChangeEvent } from 'react';\r\nimport './FileUploader.css';\r\n\r\nexport interface FileUploaderProps {\r\n multiple?: boolean;\r\n accept?: string;\r\n onChange?: (files: File[]) => void;\r\n className?: string;\r\n placeholder?: string;\r\n}\r\n\r\nexport function FileUploader({\r\n multiple = false,\r\n accept,\r\n onChange,\r\n className = '',\r\n placeholder = 'Drag files here or click to upload',\r\n}: FileUploaderProps) {\r\n const inputRef = useRef<HTMLInputElement | null>(null);\r\n const [files, setFiles] = useState<File[]>([]);\r\n const [dragOver, setDragOver] = useState(false);\r\n\r\n const updateFiles = useCallback(\r\n (newFiles: File[]) => {\r\n setFiles(newFiles);\r\n onChange?.(newFiles);\r\n },\r\n [onChange]\r\n );\r\n\r\n const handleDrop = (e: DragEvent) => {\r\n e.preventDefault();\r\n setDragOver(false);\r\n\r\n const dropped = Array.from(e.dataTransfer.files);\r\n\r\n if (!multiple) {\r\n updateFiles([dropped[0]]);\r\n return;\r\n }\r\n\r\n updateFiles([...files, ...dropped]);\r\n };\r\n\r\n const handleSelect = (e: ChangeEvent<HTMLInputElement>) => {\r\n const selected = e.target.files ? Array.from(e.target.files) : [];\r\n if (!multiple) {\r\n updateFiles([selected[0]]);\r\n return;\r\n }\r\n updateFiles([...files, ...selected]);\r\n };\r\n\r\n const removeFile = (index: number) => {\r\n const newList = files.filter((_, i) => i !== index);\r\n updateFiles(newList);\r\n };\r\n\r\n return (\r\n <div className={`ui-fileupload ${className}`}>\r\n {/* DROP ZONE */}\r\n <div\r\n className={`ui-fileupload-dropzone ${dragOver ? 'dragover' : ''}`}\r\n tabIndex={0}\r\n role=\"button\"\r\n aria-label=\"Upload files\"\r\n onClick={() => inputRef.current?.click()}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') inputRef.current?.click();\r\n }}\r\n onDragOver={(e) => {\r\n e.preventDefault();\r\n setDragOver(true);\r\n }}\r\n onDragLeave={() => setDragOver(false)}\r\n onDrop={handleDrop}\r\n >\r\n <span>{placeholder}</span>\r\n </div>\r\n\r\n {/* HIDDEN INPUT */}\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n accept={accept}\r\n multiple={multiple}\r\n style={{ display: 'none' }}\r\n onChange={handleSelect}\r\n />\r\n\r\n {/* FILE LIST */}\r\n {files.length > 0 && (\r\n <ul className=\"ui-fileupload-list\">\r\n {files.map((file, i) => (\r\n <li key={i} className=\"ui-fileupload-item\">\r\n <span className=\"ui-fileupload-filename\">{file.name}</span>\r\n <button\r\n className=\"ui-fileupload-remove\"\r\n aria-label=\"Remove file\"\r\n onClick={() => removeFile(i)}\r\n >\r\n ×\r\n </button>\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["FileUploader","multiple","accept","onChange","className","placeholder","inputRef","useRef","files","setFiles","useState","dragOver","setDragOver","updateFiles","useCallback","newFiles","handleDrop","dropped","handleSelect","selected","removeFile","index","newList","_","i","jsxs","jsx","file"],"mappings":"0KAwBO,SAASA,EAAa,CAC3B,SAAAC,EAAW,GACX,OAAAC,EACA,SAAAC,EACA,UAAAC,EAAY,GACZ,YAAAC,EAAc,oCAChB,EAAsB,CACpB,MAAMC,EAAWC,EAAAA,OAAgC,IAAI,EAC/C,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAiB,CAAA,CAAE,EACvC,CAACC,EAAUC,CAAW,EAAIF,EAAAA,SAAS,EAAK,EAExCG,EAAcC,EAAAA,YACjBC,GAAqB,CACpBN,EAASM,CAAQ,EACjBZ,IAAWY,CAAQ,CACrB,EACA,CAACZ,CAAQ,CAAA,EAGLa,EAAc,GAAiB,CACnC,EAAE,eAAA,EACFJ,EAAY,EAAK,EAEjB,MAAMK,EAAU,MAAM,KAAK,EAAE,aAAa,KAAK,EAE/C,GAAI,CAAChB,EAAU,CACbY,EAAY,CAACI,EAAQ,CAAC,CAAC,CAAC,EACxB,MACF,CAEAJ,EAAY,CAAC,GAAGL,EAAO,GAAGS,CAAO,CAAC,CACpC,EAEMC,EAAgB,GAAqC,CACzD,MAAMC,EAAW,EAAE,OAAO,MAAQ,MAAM,KAAK,EAAE,OAAO,KAAK,EAAI,CAAA,EAC/D,GAAI,CAAClB,EAAU,CACbY,EAAY,CAACM,EAAS,CAAC,CAAC,CAAC,EACzB,MACF,CACAN,EAAY,CAAC,GAAGL,EAAO,GAAGW,CAAQ,CAAC,CACrC,EAEMC,EAAcC,GAAkB,CACpC,MAAMC,EAAUd,EAAM,OAAO,CAACe,EAAGC,IAAMA,IAAMH,CAAK,EAClDR,EAAYS,CAAO,CACrB,EAEA,OACEG,EAAAA,KAAC,MAAA,CAAI,UAAW,iBAAiBrB,CAAS,GAExC,SAAA,CAAAsB,EAAAA,IAAC,MAAA,CACC,UAAW,0BAA0Bf,EAAW,WAAa,EAAE,GAC/D,SAAU,EACV,KAAK,SACL,aAAW,eACX,QAAS,IAAML,EAAS,SAAS,MAAA,EACjC,UAAY,GAAM,EACZ,EAAE,MAAQ,SAAW,EAAE,MAAQ,MAAKA,EAAS,SAAS,MAAA,CAC5D,EACA,WAAa,GAAM,CACjB,EAAE,eAAA,EACFM,EAAY,EAAI,CAClB,EACA,YAAa,IAAMA,EAAY,EAAK,EACpC,OAAQI,EAER,SAAAU,EAAAA,IAAC,QAAM,SAAArB,CAAA,CAAY,CAAA,CAAA,EAIrBqB,EAAAA,IAAC,QAAA,CACC,IAAKpB,EACL,KAAK,OACL,OAAAJ,EACA,SAAAD,EACA,MAAO,CAAE,QAAS,MAAA,EAClB,SAAUiB,CAAA,CAAA,EAIXV,EAAM,OAAS,GACdkB,EAAAA,IAAC,MAAG,UAAU,qBACX,SAAAlB,EAAM,IAAI,CAACmB,EAAMH,IAChBC,EAAAA,KAAC,KAAA,CAAW,UAAU,qBACpB,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,yBAA0B,SAAAC,EAAK,KAAK,EACpDD,EAAAA,IAAC,SAAA,CACC,UAAU,uBACV,aAAW,cACX,QAAS,IAAMN,EAAWI,CAAC,EAC5B,SAAA,GAAA,CAAA,CAED,CAAA,EAROA,CAST,CACD,CAAA,CACH,CAAA,EAEJ,CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileUploader.js","sources":["../../../src/components/fileuploader/FileUploader.tsx"],"sourcesContent":["/**\r\n * FileUploader.tsx — FINAL VERSION\r\n * --------------------------------\r\n * Features:\r\n * - Drag & drop\r\n * - Click to upload\r\n * - Keyboard activate\r\n * - File list preview\r\n * - Remove file\r\n * - Accept filters\r\n * - Multiple uploads\r\n */\r\n\r\nimport { useRef, useState, useCallback, DragEvent, ChangeEvent } from 'react';\r\nimport './FileUploader.css';\r\n\r\nexport interface FileUploaderProps {\r\n multiple?: boolean;\r\n accept?: string;\r\n onChange?: (files: File[]) => void;\r\n className?: string;\r\n placeholder?: string;\r\n}\r\n\r\nexport function FileUploader({\r\n multiple = false,\r\n accept,\r\n onChange,\r\n className = '',\r\n placeholder = 'Drag files here or click to upload',\r\n}: FileUploaderProps) {\r\n const inputRef = useRef<HTMLInputElement | null>(null);\r\n const [files, setFiles] = useState<File[]>([]);\r\n const [dragOver, setDragOver] = useState(false);\r\n\r\n const updateFiles = useCallback(\r\n (newFiles: File[]) => {\r\n setFiles(newFiles);\r\n onChange?.(newFiles);\r\n },\r\n [onChange]\r\n );\r\n\r\n const handleDrop = (e: DragEvent) => {\r\n e.preventDefault();\r\n setDragOver(false);\r\n\r\n const dropped = Array.from(e.dataTransfer.files);\r\n\r\n if (!multiple) {\r\n updateFiles([dropped[0]]);\r\n return;\r\n }\r\n\r\n updateFiles([...files, ...dropped]);\r\n };\r\n\r\n const handleSelect = (e: ChangeEvent<HTMLInputElement>) => {\r\n const selected = e.target.files ? Array.from(e.target.files) : [];\r\n if (!multiple) {\r\n updateFiles([selected[0]]);\r\n return;\r\n }\r\n updateFiles([...files, ...selected]);\r\n };\r\n\r\n const removeFile = (index: number) => {\r\n const newList = files.filter((_, i) => i !== index);\r\n updateFiles(newList);\r\n };\r\n\r\n return (\r\n <div className={`ui-fileupload ${className}`}>\r\n {/* DROP ZONE */}\r\n <div\r\n className={`ui-fileupload-dropzone ${dragOver ? 'dragover' : ''}`}\r\n tabIndex={0}\r\n role=\"button\"\r\n aria-label=\"Upload files\"\r\n onClick={() => inputRef.current?.click()}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') inputRef.current?.click();\r\n }}\r\n onDragOver={(e) => {\r\n e.preventDefault();\r\n setDragOver(true);\r\n }}\r\n onDragLeave={() => setDragOver(false)}\r\n onDrop={handleDrop}\r\n >\r\n <span>{placeholder}</span>\r\n </div>\r\n\r\n {/* HIDDEN INPUT */}\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n accept={accept}\r\n multiple={multiple}\r\n style={{ display: 'none' }}\r\n onChange={handleSelect}\r\n />\r\n\r\n {/* FILE LIST */}\r\n {files.length > 0 && (\r\n <ul className=\"ui-fileupload-list\">\r\n {files.map((file, i) => (\r\n <li key={i} className=\"ui-fileupload-item\">\r\n <span className=\"ui-fileupload-filename\">{file.name}</span>\r\n <button\r\n className=\"ui-fileupload-remove\"\r\n aria-label=\"Remove file\"\r\n onClick={() => removeFile(i)}\r\n >\r\n ×\r\n </button>\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["FileUploader","multiple","accept","onChange","className","placeholder","inputRef","useRef","files","setFiles","useState","dragOver","setDragOver","updateFiles","useCallback","newFiles","handleDrop","dropped","handleSelect","selected","removeFile","index","newList","_","i","jsxs","jsx","file"],"mappings":";;;AAwBO,SAASA,EAAa;AAAA,EAC3B,UAAAC,IAAW;AAAA,EACX,QAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,aAAAC,IAAc;AAChB,GAAsB;AACpB,QAAMC,IAAWC,EAAgC,IAAI,GAC/C,CAACC,GAAOC,CAAQ,IAAIC,EAAiB,CAAA,CAAE,GACvC,CAACC,GAAUC,CAAW,IAAIF,EAAS,EAAK,GAExCG,IAAcC;AAAA,IAClB,CAACC,MAAqB;AACpB,MAAAN,EAASM,CAAQ,GACjBZ,IAAWY,CAAQ;AAAA,IACrB;AAAA,IACA,CAACZ,CAAQ;AAAA,EAAA,GAGLa,IAAa,CAAC,MAAiB;AACnC,MAAE,eAAA,GACFJ,EAAY,EAAK;AAEjB,UAAMK,IAAU,MAAM,KAAK,EAAE,aAAa,KAAK;AAE/C,QAAI,CAAChB,GAAU;AACb,MAAAY,EAAY,CAACI,EAAQ,CAAC,CAAC,CAAC;AACxB;AAAA,IACF;AAEA,IAAAJ,EAAY,CAAC,GAAGL,GAAO,GAAGS,CAAO,CAAC;AAAA,EACpC,GAEMC,IAAe,CAAC,MAAqC;AACzD,UAAMC,IAAW,EAAE,OAAO,QAAQ,MAAM,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;AAC/D,QAAI,CAAClB,GAAU;AACb,MAAAY,EAAY,CAACM,EAAS,CAAC,CAAC,CAAC;AACzB;AAAA,IACF;AACA,IAAAN,EAAY,CAAC,GAAGL,GAAO,GAAGW,CAAQ,CAAC;AAAA,EACrC,GAEMC,IAAa,CAACC,MAAkB;AACpC,UAAMC,IAAUd,EAAM,OAAO,CAACe,GAAGC,MAAMA,MAAMH,CAAK;AAClD,IAAAR,EAAYS,CAAO;AAAA,EACrB;AAEA,SACE,gBAAAG,EAAC,OAAA,EAAI,WAAW,iBAAiBrB,CAAS,IAExC,UAAA;AAAA,IAAA,gBAAAsB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,0BAA0Bf,IAAW,aAAa,EAAE;AAAA,QAC/D,UAAU;AAAA,QACV,MAAK;AAAA,QACL,cAAW;AAAA,QACX,SAAS,MAAML,EAAS,SAAS,MAAA;AAAA,QACjC,WAAW,CAAC,MAAM;AAChB,WAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,QAAKA,EAAS,SAAS,MAAA;AAAA,QAC5D;AAAA,QACA,YAAY,CAAC,MAAM;AACjB,YAAE,eAAA,GACFM,EAAY,EAAI;AAAA,QAClB;AAAA,QACA,aAAa,MAAMA,EAAY,EAAK;AAAA,QACpC,QAAQI;AAAA,QAER,UAAA,gBAAAU,EAAC,UAAM,UAAArB,EAAA,CAAY;AAAA,MAAA;AAAA,IAAA;AAAA,IAIrB,gBAAAqB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKpB;AAAA,QACL,MAAK;AAAA,QACL,QAAAJ;AAAA,QACA,UAAAD;AAAA,QACA,OAAO,EAAE,SAAS,OAAA;AAAA,QAClB,UAAUiB;AAAA,MAAA;AAAA,IAAA;AAAA,IAIXV,EAAM,SAAS,KACd,gBAAAkB,EAAC,QAAG,WAAU,sBACX,UAAAlB,EAAM,IAAI,CAACmB,GAAMH,MAChB,gBAAAC,EAAC,MAAA,EAAW,WAAU,sBACpB,UAAA;AAAA,MAAA,gBAAAC,EAAC,QAAA,EAAK,WAAU,0BAA0B,UAAAC,EAAK,MAAK;AAAA,MACpD,gBAAAD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,cAAW;AAAA,UACX,SAAS,MAAMN,EAAWI,CAAC;AAAA,UAC5B,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,EAAA,GAROA,CAST,CACD,EAAA,CACH;AAAA,EAAA,GAEJ;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HoverCard.cjs","sources":["../../../src/components/hovercard/HoverCard.tsx"],"sourcesContent":["/**\r\n * HoverCard.tsx — FINAL VERSION\r\n * --------------------------------\r\n * Features:\r\n * - Open on hover / focus\r\n * - Close on leave / blur\r\n * - Delay open & close\r\n * - ESC to dismiss\r\n * - Outside dismiss\r\n * - Auto position (simple version)\r\n * - Portal rendering\r\n */\r\n\r\nimport { useState, useRef, useEffect, ReactNode, useCallback } from 'react';\r\nimport './HoverCard.css';\r\nimport { Portal, onClickOutside } from '../../utils/index';\r\n\r\nexport interface HoverCardProps {\r\n trigger: ReactNode;\r\n children: ReactNode;\r\n openDelay?: number;\r\n closeDelay?: number;\r\n className?: string;\r\n}\r\n\r\nexport function HoverCard({\r\n trigger,\r\n children,\r\n openDelay = 120,\r\n closeDelay = 140,\r\n className = '',\r\n}: HoverCardProps) {\r\n const [open, setOpen] = useState(false);\r\n\r\n const triggerRef = useRef<HTMLDivElement | null>(null);\r\n const cardRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const openTimer = useRef<NodeJS.Timeout | null>(null);\r\n const closeTimer = useRef<NodeJS.Timeout | null>(null);\r\n\r\n const clearTimers = () => {\r\n if (openTimer.current) clearTimeout(openTimer.current);\r\n if (closeTimer.current) clearTimeout(closeTimer.current);\r\n };\r\n\r\n const scheduleOpen = () => {\r\n clearTimers();\r\n openTimer.current = setTimeout(() => setOpen(true), openDelay);\r\n };\r\n\r\n const scheduleClose = () => {\r\n clearTimers();\r\n closeTimer.current = setTimeout(() => setOpen(false), closeDelay);\r\n };\r\n\r\n // ESC key dismiss\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') setOpen(false);\r\n };\r\n document.addEventListener('keydown', handler);\r\n return () => document.removeEventListener('keydown', handler);\r\n }, [open]);\r\n\r\n // click outside\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(cardRef, () => setOpen(false));\r\n }, [open]);\r\n\r\n // compute position\r\n const [pos, setPos] = useState<{ top: number; left: number } | null>(null);\r\n\r\n const updatePosition = useCallback(() => {\r\n const triggerEl = triggerRef.current;\r\n if (!triggerEl) return;\r\n\r\n const rect = triggerEl.getBoundingClientRect();\r\n setPos({\r\n top: rect.bottom + 8, // spacing\r\n left: rect.left,\r\n });\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n updatePosition();\r\n window.addEventListener('resize', updatePosition);\r\n window.addEventListener('scroll', updatePosition, true);\r\n return () => {\r\n window.removeEventListener('resize', updatePosition);\r\n window.removeEventListener('scroll', updatePosition, true);\r\n };\r\n }, [open, updatePosition]);\r\n\r\n return (\r\n <div className=\"ui-hovercard-root\">\r\n {/* TRIGGER */}\r\n <div\r\n ref={triggerRef}\r\n className=\"ui-hovercard-trigger\"\r\n onMouseEnter={scheduleOpen}\r\n onMouseLeave={scheduleClose}\r\n onFocus={scheduleOpen}\r\n onBlur={scheduleClose}\r\n >\r\n {trigger}\r\n </div>\r\n\r\n {/* CARD */}\r\n {open && pos && (\r\n <Portal>\r\n <div\r\n ref={cardRef}\r\n className={`ui-hovercard ${className}`}\r\n style={{ top: pos.top, left: pos.left }}\r\n role=\"dialog\"\r\n aria-hidden={!open}\r\n onMouseEnter={() => {\r\n clearTimers();\r\n setOpen(true);\r\n }}\r\n onMouseLeave={scheduleClose}\r\n >\r\n {children}\r\n </div>\r\n </Portal>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["HoverCard","trigger","children","openDelay","closeDelay","className","open","setOpen","useState","triggerRef","useRef","cardRef","openTimer","closeTimer","clearTimers","scheduleOpen","scheduleClose","useEffect","handler","e","onClickOutside","pos","setPos","updatePosition","useCallback","triggerEl","rect","jsxs","jsx","Portal"],"mappings":"mRAyBO,SAASA,EAAU,CACxB,QAAAC,EACA,SAAAC,EACA,UAAAC,EAAY,IACZ,WAAAC,EAAa,IACb,UAAAC,EAAY,EACd,EAAmB,CACjB,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAS,EAAK,EAEhCC,EAAaC,EAAAA,OAA8B,IAAI,EAC/CC,EAAUD,EAAAA,OAA8B,IAAI,EAE5CE,EAAYF,EAAAA,OAA8B,IAAI,EAC9CG,EAAaH,EAAAA,OAA8B,IAAI,EAE/CI,EAAc,IAAM,CACpBF,EAAU,SAAS,aAAaA,EAAU,OAAO,EACjDC,EAAW,SAAS,aAAaA,EAAW,OAAO,CACzD,EAEME,EAAe,IAAM,CACzBD,EAAA,EACAF,EAAU,QAAU,WAAW,IAAML,EAAQ,EAAI,EAAGJ,CAAS,CAC/D,EAEMa,EAAgB,IAAM,CAC1BF,EAAA,EACAD,EAAW,QAAU,WAAW,IAAMN,EAAQ,EAAK,EAAGH,CAAU,CAClE,EAGAa,EAAAA,UAAU,IAAM,CACd,GAAI,CAACX,EAAM,OACX,MAAMY,EAAWC,GAAqB,CAChCA,EAAE,MAAQ,UAAUZ,EAAQ,EAAK,CACvC,EACA,gBAAS,iBAAiB,UAAWW,CAAO,EACrC,IAAM,SAAS,oBAAoB,UAAWA,CAAO,CAC9D,EAAG,CAACZ,CAAI,CAAC,EAGTW,EAAAA,UAAU,IAAM,CACd,GAAKX,EACL,OAAOc,EAAAA,eAAeT,EAAS,IAAMJ,EAAQ,EAAK,CAAC,CACrD,EAAG,CAACD,CAAI,CAAC,EAGT,KAAM,CAACe,EAAKC,CAAM,EAAId,EAAAA,SAA+C,IAAI,EAEnEe,EAAiBC,EAAAA,YAAY,IAAM,CACvC,MAAMC,EAAYhB,EAAW,QAC7B,GAAI,CAACgB,EAAW,OAEhB,MAAMC,EAAOD,EAAU,sBAAA,EACvBH,EAAO,CACL,IAAKI,EAAK,OAAS,EACnB,KAAMA,EAAK,IAAA,CACZ,CACH,EAAG,CAAA,CAAE,EAELT,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAKX,EACL,OAAAiB,EAAA,EACA,OAAO,iBAAiB,SAAUA,CAAc,EAChD,OAAO,iBAAiB,SAAUA,EAAgB,EAAI,EAC/C,IAAM,CACX,OAAO,oBAAoB,SAAUA,CAAc,EACnD,OAAO,oBAAoB,SAAUA,EAAgB,EAAI,CAC3D,CACF,EAAG,CAACjB,EAAMiB,CAAc,CAAC,EAGvBI,EAAAA,KAAC,MAAA,CAAI,UAAU,oBAEb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CACC,IAAKnB,EACL,UAAU,uBACV,aAAcM,EACd,aAAcC,EACd,QAASD,EACT,OAAQC,EAEP,SAAAf,CAAA,CAAA,EAIFK,GAAQe,GACPO,EAAAA,IAACC,EAAAA,OAAA,CACC,SAAAD,EAAAA,IAAC,MAAA,CACC,IAAKjB,EACL,UAAW,gBAAgBN,CAAS,GACpC,MAAO,CAAE,IAAKgB,EAAI,IAAK,KAAMA,EAAI,IAAA,EACjC,KAAK,SACL,cAAa,CAACf,EACd,aAAc,IAAM,CAClBQ,EAAA,EACAP,EAAQ,EAAI,CACd,EACA,aAAcS,EAEb,SAAAd,CAAA,CAAA,CACH,CACF,CAAA,EAEJ,CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HoverCard.js","sources":["../../../src/components/hovercard/HoverCard.tsx"],"sourcesContent":["/**\r\n * HoverCard.tsx — FINAL VERSION\r\n * --------------------------------\r\n * Features:\r\n * - Open on hover / focus\r\n * - Close on leave / blur\r\n * - Delay open & close\r\n * - ESC to dismiss\r\n * - Outside dismiss\r\n * - Auto position (simple version)\r\n * - Portal rendering\r\n */\r\n\r\nimport { useState, useRef, useEffect, ReactNode, useCallback } from 'react';\r\nimport './HoverCard.css';\r\nimport { Portal, onClickOutside } from '../../utils/index';\r\n\r\nexport interface HoverCardProps {\r\n trigger: ReactNode;\r\n children: ReactNode;\r\n openDelay?: number;\r\n closeDelay?: number;\r\n className?: string;\r\n}\r\n\r\nexport function HoverCard({\r\n trigger,\r\n children,\r\n openDelay = 120,\r\n closeDelay = 140,\r\n className = '',\r\n}: HoverCardProps) {\r\n const [open, setOpen] = useState(false);\r\n\r\n const triggerRef = useRef<HTMLDivElement | null>(null);\r\n const cardRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const openTimer = useRef<NodeJS.Timeout | null>(null);\r\n const closeTimer = useRef<NodeJS.Timeout | null>(null);\r\n\r\n const clearTimers = () => {\r\n if (openTimer.current) clearTimeout(openTimer.current);\r\n if (closeTimer.current) clearTimeout(closeTimer.current);\r\n };\r\n\r\n const scheduleOpen = () => {\r\n clearTimers();\r\n openTimer.current = setTimeout(() => setOpen(true), openDelay);\r\n };\r\n\r\n const scheduleClose = () => {\r\n clearTimers();\r\n closeTimer.current = setTimeout(() => setOpen(false), closeDelay);\r\n };\r\n\r\n // ESC key dismiss\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') setOpen(false);\r\n };\r\n document.addEventListener('keydown', handler);\r\n return () => document.removeEventListener('keydown', handler);\r\n }, [open]);\r\n\r\n // click outside\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(cardRef, () => setOpen(false));\r\n }, [open]);\r\n\r\n // compute position\r\n const [pos, setPos] = useState<{ top: number; left: number } | null>(null);\r\n\r\n const updatePosition = useCallback(() => {\r\n const triggerEl = triggerRef.current;\r\n if (!triggerEl) return;\r\n\r\n const rect = triggerEl.getBoundingClientRect();\r\n setPos({\r\n top: rect.bottom + 8, // spacing\r\n left: rect.left,\r\n });\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n updatePosition();\r\n window.addEventListener('resize', updatePosition);\r\n window.addEventListener('scroll', updatePosition, true);\r\n return () => {\r\n window.removeEventListener('resize', updatePosition);\r\n window.removeEventListener('scroll', updatePosition, true);\r\n };\r\n }, [open, updatePosition]);\r\n\r\n return (\r\n <div className=\"ui-hovercard-root\">\r\n {/* TRIGGER */}\r\n <div\r\n ref={triggerRef}\r\n className=\"ui-hovercard-trigger\"\r\n onMouseEnter={scheduleOpen}\r\n onMouseLeave={scheduleClose}\r\n onFocus={scheduleOpen}\r\n onBlur={scheduleClose}\r\n >\r\n {trigger}\r\n </div>\r\n\r\n {/* CARD */}\r\n {open && pos && (\r\n <Portal>\r\n <div\r\n ref={cardRef}\r\n className={`ui-hovercard ${className}`}\r\n style={{ top: pos.top, left: pos.left }}\r\n role=\"dialog\"\r\n aria-hidden={!open}\r\n onMouseEnter={() => {\r\n clearTimers();\r\n setOpen(true);\r\n }}\r\n onMouseLeave={scheduleClose}\r\n >\r\n {children}\r\n </div>\r\n </Portal>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["HoverCard","trigger","children","openDelay","closeDelay","className","open","setOpen","useState","triggerRef","useRef","cardRef","openTimer","closeTimer","clearTimers","scheduleOpen","scheduleClose","useEffect","handler","e","onClickOutside","pos","setPos","updatePosition","useCallback","triggerEl","rect","jsxs","jsx","Portal"],"mappings":";;;;;AAyBO,SAASA,EAAU;AAAA,EACxB,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,YAAAC,IAAa;AAAA,EACb,WAAAC,IAAY;AACd,GAAmB;AACjB,QAAM,CAACC,GAAMC,CAAO,IAAIC,EAAS,EAAK,GAEhCC,IAAaC,EAA8B,IAAI,GAC/CC,IAAUD,EAA8B,IAAI,GAE5CE,IAAYF,EAA8B,IAAI,GAC9CG,IAAaH,EAA8B,IAAI,GAE/CI,IAAc,MAAM;AACxB,IAAIF,EAAU,WAAS,aAAaA,EAAU,OAAO,GACjDC,EAAW,WAAS,aAAaA,EAAW,OAAO;AAAA,EACzD,GAEME,IAAe,MAAM;AACzB,IAAAD,EAAA,GACAF,EAAU,UAAU,WAAW,MAAML,EAAQ,EAAI,GAAGJ,CAAS;AAAA,EAC/D,GAEMa,IAAgB,MAAM;AAC1B,IAAAF,EAAA,GACAD,EAAW,UAAU,WAAW,MAAMN,EAAQ,EAAK,GAAGH,CAAU;AAAA,EAClE;AAGA,EAAAa,EAAU,MAAM;AACd,QAAI,CAACX,EAAM;AACX,UAAMY,IAAU,CAACC,MAAqB;AACpC,MAAIA,EAAE,QAAQ,YAAUZ,EAAQ,EAAK;AAAA,IACvC;AACA,oBAAS,iBAAiB,WAAWW,CAAO,GACrC,MAAM,SAAS,oBAAoB,WAAWA,CAAO;AAAA,EAC9D,GAAG,CAACZ,CAAI,CAAC,GAGTW,EAAU,MAAM;AACd,QAAKX;AACL,aAAOc,EAAeT,GAAS,MAAMJ,EAAQ,EAAK,CAAC;AAAA,EACrD,GAAG,CAACD,CAAI,CAAC;AAGT,QAAM,CAACe,GAAKC,CAAM,IAAId,EAA+C,IAAI,GAEnEe,IAAiBC,EAAY,MAAM;AACvC,UAAMC,IAAYhB,EAAW;AAC7B,QAAI,CAACgB,EAAW;AAEhB,UAAMC,IAAOD,EAAU,sBAAA;AACvB,IAAAH,EAAO;AAAA,MACL,KAAKI,EAAK,SAAS;AAAA;AAAA,MACnB,MAAMA,EAAK;AAAA,IAAA,CACZ;AAAA,EACH,GAAG,CAAA,CAAE;AAEL,SAAAT,EAAU,MAAM;AACd,QAAKX;AACL,aAAAiB,EAAA,GACA,OAAO,iBAAiB,UAAUA,CAAc,GAChD,OAAO,iBAAiB,UAAUA,GAAgB,EAAI,GAC/C,MAAM;AACX,eAAO,oBAAoB,UAAUA,CAAc,GACnD,OAAO,oBAAoB,UAAUA,GAAgB,EAAI;AAAA,MAC3D;AAAA,EACF,GAAG,CAACjB,GAAMiB,CAAc,CAAC,GAGvB,gBAAAI,EAAC,OAAA,EAAI,WAAU,qBAEb,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKnB;AAAA,QACL,WAAU;AAAA,QACV,cAAcM;AAAA,QACd,cAAcC;AAAA,QACd,SAASD;AAAA,QACT,QAAQC;AAAA,QAEP,UAAAf;AAAA,MAAA;AAAA,IAAA;AAAA,IAIFK,KAAQe,KACP,gBAAAO,EAACC,GAAA,EACC,UAAA,gBAAAD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKjB;AAAA,QACL,WAAW,gBAAgBN,CAAS;AAAA,QACpC,OAAO,EAAE,KAAKgB,EAAI,KAAK,MAAMA,EAAI,KAAA;AAAA,QACjC,MAAK;AAAA,QACL,eAAa,CAACf;AAAA,QACd,cAAc,MAAM;AAClB,UAAAQ,EAAA,GACAP,EAAQ,EAAI;AAAA,QACd;AAAA,QACA,cAAcS;AAAA,QAEb,UAAAd;AAAA,MAAA;AAAA,IAAA,EACH,CACF;AAAA,EAAA,GAEJ;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Input.cjs","sources":["../../../src/components/input/Input.tsx"],"sourcesContent":["/**\r\n * Input.tsx\r\n * ---------\r\n * Single-component fully accessible input field.\r\n * Includes:\r\n * - label\r\n * - description\r\n * - error message\r\n * - size variants\r\n * - required + disabled states\r\n * - WCAG-compliant focus handling\r\n */\r\n\r\nimport React from 'react';\r\nimport './Input.css';\r\n\r\nexport interface InputProps\r\n extends React.InputHTMLAttributes<HTMLInputElement> {\r\n /** Label for the input */\r\n label?: string;\r\n\r\n /** Helper text */\r\n description?: string;\r\n\r\n /** Error message */\r\n error?: string;\r\n\r\n /** Size variant (avoid HTML size conflict) */\r\n inputSize?: 'sm' | 'md' | 'lg';\r\n\r\n /** Custom wrapper class */\r\n className?: string;\r\n}\r\n\r\nexport function Input({\r\n label,\r\n description,\r\n error,\r\n inputSize = 'md',\r\n className = '',\r\n id,\r\n ...props\r\n}: InputProps) {\r\n // Always call hook\r\n const reactId = React.useId();\r\n\r\n // Final ID (prop overrides auto)\r\n const inputId = id ?? reactId;\r\n\r\n const describedBy = error\r\n ? `${inputId}-error`\r\n : description\r\n ? `${inputId}-description`\r\n : undefined;\r\n\r\n return (\r\n <div className={`ui-input-wrapper ${className}`}>\r\n {label && (\r\n <label htmlFor={inputId} className=\"ui-input-label\">\r\n {label}\r\n {props.required && ' *'}\r\n </label>\r\n )}\r\n\r\n <input\r\n id={inputId}\r\n className={[\r\n 'ui-input',\r\n inputSize === 'sm' && 'ui-input--sm',\r\n inputSize === 'lg' && 'ui-input--lg',\r\n error && 'ui-input--error',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n aria-invalid={!!error}\r\n aria-describedby={describedBy}\r\n {...props}\r\n />\r\n\r\n {/* Description (only when not error) */}\r\n {description && !error && (\r\n <div id={`${inputId}-description`} className=\"ui-input-description\">\r\n {description}\r\n </div>\r\n )}\r\n\r\n {/* Error message */}\r\n {error && (\r\n <div id={`${inputId}-error`} className=\"ui-input-error\">\r\n {error}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["Input","label","description","error","inputSize","className","id","props","reactId","React","inputId","describedBy","jsxs","jsx"],"mappings":"mKAkCO,SAASA,EAAM,CACpB,MAAAC,EACA,YAAAC,EACA,MAAAC,EACA,UAAAC,EAAY,KACZ,UAAAC,EAAY,GACZ,GAAAC,EACA,GAAGC,CACL,EAAe,CAEb,MAAMC,EAAUC,EAAM,MAAA,EAGhBC,EAAUJ,GAAME,EAEhBG,EAAcR,EAChB,GAAGO,CAAO,SACVR,EACA,GAAGQ,CAAO,eACV,OAEJ,OACEE,EAAAA,KAAC,MAAA,CAAI,UAAW,oBAAoBP,CAAS,GAC1C,SAAA,CAAAJ,GACCW,EAAAA,KAAC,QAAA,CAAM,QAASF,EAAS,UAAU,iBAChC,SAAA,CAAAT,EACAM,EAAM,UAAY,IAAA,EACrB,EAGFM,EAAAA,IAAC,QAAA,CACC,GAAIH,EACJ,UAAW,CACT,WACAN,IAAc,MAAQ,eACtBA,IAAc,MAAQ,eACtBD,GAAS,iBAAA,EAER,OAAO,OAAO,EACd,KAAK,GAAG,EACX,eAAc,CAAC,CAACA,EAChB,mBAAkBQ,EACjB,GAAGJ,CAAA,CAAA,EAILL,GAAe,CAACC,GACfU,EAAAA,IAAC,MAAA,CAAI,GAAI,GAAGH,CAAO,eAAgB,UAAU,uBAC1C,SAAAR,CAAA,CACH,EAIDC,SACE,MAAA,CAAI,GAAI,GAAGO,CAAO,SAAU,UAAU,iBACpC,SAAAP,CAAA,CACH,CAAA,EAEJ,CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Input.js","sources":["../../../src/components/input/Input.tsx"],"sourcesContent":["/**\r\n * Input.tsx\r\n * ---------\r\n * Single-component fully accessible input field.\r\n * Includes:\r\n * - label\r\n * - description\r\n * - error message\r\n * - size variants\r\n * - required + disabled states\r\n * - WCAG-compliant focus handling\r\n */\r\n\r\nimport React from 'react';\r\nimport './Input.css';\r\n\r\nexport interface InputProps\r\n extends React.InputHTMLAttributes<HTMLInputElement> {\r\n /** Label for the input */\r\n label?: string;\r\n\r\n /** Helper text */\r\n description?: string;\r\n\r\n /** Error message */\r\n error?: string;\r\n\r\n /** Size variant (avoid HTML size conflict) */\r\n inputSize?: 'sm' | 'md' | 'lg';\r\n\r\n /** Custom wrapper class */\r\n className?: string;\r\n}\r\n\r\nexport function Input({\r\n label,\r\n description,\r\n error,\r\n inputSize = 'md',\r\n className = '',\r\n id,\r\n ...props\r\n}: InputProps) {\r\n // Always call hook\r\n const reactId = React.useId();\r\n\r\n // Final ID (prop overrides auto)\r\n const inputId = id ?? reactId;\r\n\r\n const describedBy = error\r\n ? `${inputId}-error`\r\n : description\r\n ? `${inputId}-description`\r\n : undefined;\r\n\r\n return (\r\n <div className={`ui-input-wrapper ${className}`}>\r\n {label && (\r\n <label htmlFor={inputId} className=\"ui-input-label\">\r\n {label}\r\n {props.required && ' *'}\r\n </label>\r\n )}\r\n\r\n <input\r\n id={inputId}\r\n className={[\r\n 'ui-input',\r\n inputSize === 'sm' && 'ui-input--sm',\r\n inputSize === 'lg' && 'ui-input--lg',\r\n error && 'ui-input--error',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n aria-invalid={!!error}\r\n aria-describedby={describedBy}\r\n {...props}\r\n />\r\n\r\n {/* Description (only when not error) */}\r\n {description && !error && (\r\n <div id={`${inputId}-description`} className=\"ui-input-description\">\r\n {description}\r\n </div>\r\n )}\r\n\r\n {/* Error message */}\r\n {error && (\r\n <div id={`${inputId}-error`} className=\"ui-input-error\">\r\n {error}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["Input","label","description","error","inputSize","className","id","props","reactId","React","inputId","describedBy","jsxs","jsx"],"mappings":";;;AAkCO,SAASA,EAAM;AAAA,EACpB,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,WAAAC,IAAY;AAAA,EACZ,IAAAC;AAAA,EACA,GAAGC;AACL,GAAe;AAEb,QAAMC,IAAUC,EAAM,MAAA,GAGhBC,IAAUJ,KAAME,GAEhBG,IAAcR,IAChB,GAAGO,CAAO,WACVR,IACA,GAAGQ,CAAO,iBACV;AAEJ,SACE,gBAAAE,EAAC,OAAA,EAAI,WAAW,oBAAoBP,CAAS,IAC1C,UAAA;AAAA,IAAAJ,KACC,gBAAAW,EAAC,SAAA,EAAM,SAASF,GAAS,WAAU,kBAChC,UAAA;AAAA,MAAAT;AAAA,MACAM,EAAM,YAAY;AAAA,IAAA,GACrB;AAAA,IAGF,gBAAAM;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,IAAIH;AAAA,QACJ,WAAW;AAAA,UACT;AAAA,UACAN,MAAc,QAAQ;AAAA,UACtBA,MAAc,QAAQ;AAAA,UACtBD,KAAS;AAAA,QAAA,EAER,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACX,gBAAc,CAAC,CAACA;AAAA,QAChB,oBAAkBQ;AAAA,QACjB,GAAGJ;AAAA,MAAA;AAAA,IAAA;AAAA,IAILL,KAAe,CAACC,KACf,gBAAAU,EAAC,OAAA,EAAI,IAAI,GAAGH,CAAO,gBAAgB,WAAU,wBAC1C,UAAAR,EAAA,CACH;AAAA,IAIDC,uBACE,OAAA,EAAI,IAAI,GAAGO,CAAO,UAAU,WAAU,kBACpC,UAAAP,EAAA,CACH;AAAA,EAAA,GAEJ;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Container.cjs","sources":["../../../src/components/layout/Container.tsx"],"sourcesContent":["import React from 'react';\r\n\r\ninterface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\r\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\r\n children?: React.ReactNode;\r\n}\r\n\r\nconst sizes: Record<Required<ContainerProps>['size'], string> = {\r\n sm: '640px',\r\n md: '768px',\r\n lg: '1024px',\r\n xl: '1280px',\r\n full: '100%',\r\n};\r\n\r\nexport function Container({\r\n size = 'lg',\r\n style,\r\n children,\r\n ...rest\r\n}: ContainerProps) {\r\n return (\r\n <div\r\n style={{\r\n width: '100%',\r\n maxWidth: sizes[size],\r\n margin: '0 auto',\r\n padding: '0 16px',\r\n ...style,\r\n }}\r\n {...rest}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n"],"names":["sizes","Container","size","style","children","rest","jsx"],"mappings":"qHAOMA,EAA0D,CAC9D,GAAI,QACJ,GAAI,QACJ,GAAI,SACJ,GAAI,SACJ,KAAM,MACR,EAEO,SAASC,EAAU,CACxB,KAAAC,EAAO,KACP,MAAAC,EACA,SAAAC,EACA,GAAGC,CACL,EAAmB,CACjB,OACEC,EAAAA,IAAC,MAAA,CACC,MAAO,CACL,MAAO,OACP,SAAUN,EAAME,CAAI,EACpB,OAAQ,SACR,QAAS,SACT,GAAGC,CAAA,EAEJ,GAAGE,EAEH,SAAAD,CAAA,CAAA,CAGP"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Container.js","sources":["../../../src/components/layout/Container.tsx"],"sourcesContent":["import React from 'react';\r\n\r\ninterface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\r\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\r\n children?: React.ReactNode;\r\n}\r\n\r\nconst sizes: Record<Required<ContainerProps>['size'], string> = {\r\n sm: '640px',\r\n md: '768px',\r\n lg: '1024px',\r\n xl: '1280px',\r\n full: '100%',\r\n};\r\n\r\nexport function Container({\r\n size = 'lg',\r\n style,\r\n children,\r\n ...rest\r\n}: ContainerProps) {\r\n return (\r\n <div\r\n style={{\r\n width: '100%',\r\n maxWidth: sizes[size],\r\n margin: '0 auto',\r\n padding: '0 16px',\r\n ...style,\r\n }}\r\n {...rest}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n"],"names":["sizes","Container","size","style","children","rest","jsx"],"mappings":";AAOA,MAAMA,IAA0D;AAAA,EAC9D,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,MAAM;AACR;AAEO,SAASC,EAAU;AAAA,EACxB,MAAAC,IAAO;AAAA,EACP,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,GAAmB;AACjB,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,UAAUN,EAAME,CAAI;AAAA,QACpB,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,GAAGC;AAAA,MAAA;AAAA,MAEJ,GAAGE;AAAA,MAEH,UAAAD;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Flex.cjs","sources":["../../../src/components/layout/Flex.tsx"],"sourcesContent":["import React from 'react';\r\n\r\ntype Justify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';\r\n\r\ntype Align = 'start' | 'center' | 'end' | 'stretch';\r\n\r\ninterface FlexProps extends React.HTMLAttributes<HTMLDivElement> {\r\n direction?: 'row' | 'column';\r\n align?: Align;\r\n justify?: Justify;\r\n wrap?: 'wrap' | 'nowrap';\r\n gap?: number | string;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport function Flex({\r\n direction = 'row',\r\n align = 'stretch',\r\n justify = 'start',\r\n wrap = 'nowrap',\r\n gap = 0,\r\n style,\r\n children,\r\n ...rest\r\n}: FlexProps) {\r\n const justifyContent =\r\n justify === 'between'\r\n ? 'space-between'\r\n : justify === 'around'\r\n ? 'space-around'\r\n : justify === 'evenly'\r\n ? 'space-evenly'\r\n : justify;\r\n\r\n const styles: React.CSSProperties = {\r\n display: 'flex',\r\n flexDirection: direction,\r\n alignItems: align,\r\n justifyContent,\r\n flexWrap: wrap,\r\n gap,\r\n ...style,\r\n };\r\n\r\n return (\r\n <div style={styles} {...rest}>\r\n {children}\r\n </div>\r\n );\r\n}\r\n"],"names":["Flex","direction","align","justify","wrap","gap","style","children","rest","styles"],"mappings":"qHAeO,SAASA,EAAK,CACnB,UAAAC,EAAY,MACZ,MAAAC,EAAQ,UACR,QAAAC,EAAU,QACV,KAAAC,EAAO,SACP,IAAAC,EAAM,EACN,MAAAC,EACA,SAAAC,EACA,GAAGC,CACL,EAAc,CAUZ,MAAMC,EAA8B,CAClC,QAAS,OACT,cAAeR,EACf,WAAYC,EACZ,eAZAC,IAAY,UACR,gBACAA,IAAY,SACZ,eACAA,IAAY,SACZ,eACAA,EAOJ,SAAUC,EACV,IAAAC,EACA,GAAGC,CAAA,EAGL,aACG,MAAA,CAAI,MAAOG,EAAS,GAAGD,EACrB,SAAAD,EACH,CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Flex.js","sources":["../../../src/components/layout/Flex.tsx"],"sourcesContent":["import React from 'react';\r\n\r\ntype Justify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';\r\n\r\ntype Align = 'start' | 'center' | 'end' | 'stretch';\r\n\r\ninterface FlexProps extends React.HTMLAttributes<HTMLDivElement> {\r\n direction?: 'row' | 'column';\r\n align?: Align;\r\n justify?: Justify;\r\n wrap?: 'wrap' | 'nowrap';\r\n gap?: number | string;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport function Flex({\r\n direction = 'row',\r\n align = 'stretch',\r\n justify = 'start',\r\n wrap = 'nowrap',\r\n gap = 0,\r\n style,\r\n children,\r\n ...rest\r\n}: FlexProps) {\r\n const justifyContent =\r\n justify === 'between'\r\n ? 'space-between'\r\n : justify === 'around'\r\n ? 'space-around'\r\n : justify === 'evenly'\r\n ? 'space-evenly'\r\n : justify;\r\n\r\n const styles: React.CSSProperties = {\r\n display: 'flex',\r\n flexDirection: direction,\r\n alignItems: align,\r\n justifyContent,\r\n flexWrap: wrap,\r\n gap,\r\n ...style,\r\n };\r\n\r\n return (\r\n <div style={styles} {...rest}>\r\n {children}\r\n </div>\r\n );\r\n}\r\n"],"names":["Flex","direction","align","justify","wrap","gap","style","children","rest","styles"],"mappings":";AAeO,SAASA,EAAK;AAAA,EACnB,WAAAC,IAAY;AAAA,EACZ,OAAAC,IAAQ;AAAA,EACR,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,KAAAC,IAAM;AAAA,EACN,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,GAAc;AAUZ,QAAMC,IAA8B;AAAA,IAClC,SAAS;AAAA,IACT,eAAeR;AAAA,IACf,YAAYC;AAAA,IACZ,gBAZAC,MAAY,YACR,kBACAA,MAAY,WACZ,iBACAA,MAAY,WACZ,iBACAA;AAAA,IAOJ,UAAUC;AAAA,IACV,KAAAC;AAAA,IACA,GAAGC;AAAA,EAAA;AAGL,2BACG,OAAA,EAAI,OAAOG,GAAS,GAAGD,GACrB,UAAAD,GACH;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Grid.cjs","sources":["../../../src/components/layout/Grid.tsx"],"sourcesContent":["import React from 'react';\r\n\r\ninterface GridProps extends React.HTMLAttributes<HTMLDivElement> {\r\n columns?: number | string; // number = fixed count; \"auto-fit\" = responsive\r\n gap?: number | string;\r\n minColWidth?: string; // used when columns = \"auto-fit\"\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport function Grid({\r\n columns = 'auto-fit',\r\n gap = 16,\r\n minColWidth = '200px',\r\n style,\r\n children,\r\n ...rest\r\n}: GridProps) {\r\n const template =\r\n typeof columns === 'number'\r\n ? `repeat(${columns}, 1fr)`\r\n : `repeat(${columns}, minmax(${minColWidth}, 1fr))`;\r\n\r\n const styles: React.CSSProperties = {\r\n display: 'grid',\r\n gap,\r\n gridTemplateColumns: template,\r\n ...style,\r\n };\r\n\r\n return (\r\n <div style={styles} {...rest}>\r\n {children}\r\n </div>\r\n );\r\n}\r\n"],"names":["Grid","columns","gap","minColWidth","style","children","rest","template","styles"],"mappings":"qHASO,SAASA,EAAK,CACnB,QAAAC,EAAU,WACV,IAAAC,EAAM,GACN,YAAAC,EAAc,QACd,MAAAC,EACA,SAAAC,EACA,GAAGC,CACL,EAAc,CACZ,MAAMC,EACJ,OAAON,GAAY,SACf,UAAUA,CAAO,SACjB,UAAUA,CAAO,YAAYE,CAAW,UAExCK,EAA8B,CAClC,QAAS,OACT,IAAAN,EACA,oBAAqBK,EACrB,GAAGH,CAAA,EAGL,aACG,MAAA,CAAI,MAAOI,EAAS,GAAGF,EACrB,SAAAD,EACH,CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Grid.js","sources":["../../../src/components/layout/Grid.tsx"],"sourcesContent":["import React from 'react';\r\n\r\ninterface GridProps extends React.HTMLAttributes<HTMLDivElement> {\r\n columns?: number | string; // number = fixed count; \"auto-fit\" = responsive\r\n gap?: number | string;\r\n minColWidth?: string; // used when columns = \"auto-fit\"\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport function Grid({\r\n columns = 'auto-fit',\r\n gap = 16,\r\n minColWidth = '200px',\r\n style,\r\n children,\r\n ...rest\r\n}: GridProps) {\r\n const template =\r\n typeof columns === 'number'\r\n ? `repeat(${columns}, 1fr)`\r\n : `repeat(${columns}, minmax(${minColWidth}, 1fr))`;\r\n\r\n const styles: React.CSSProperties = {\r\n display: 'grid',\r\n gap,\r\n gridTemplateColumns: template,\r\n ...style,\r\n };\r\n\r\n return (\r\n <div style={styles} {...rest}>\r\n {children}\r\n </div>\r\n );\r\n}\r\n"],"names":["Grid","columns","gap","minColWidth","style","children","rest","template","styles"],"mappings":";AASO,SAASA,EAAK;AAAA,EACnB,SAAAC,IAAU;AAAA,EACV,KAAAC,IAAM;AAAA,EACN,aAAAC,IAAc;AAAA,EACd,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,GAAc;AACZ,QAAMC,IACJ,OAAON,KAAY,WACf,UAAUA,CAAO,WACjB,UAAUA,CAAO,YAAYE,CAAW,WAExCK,IAA8B;AAAA,IAClC,SAAS;AAAA,IACT,KAAAN;AAAA,IACA,qBAAqBK;AAAA,IACrB,GAAGH;AAAA,EAAA;AAGL,2BACG,OAAA,EAAI,OAAOI,GAAS,GAAGF,GACrB,UAAAD,GACH;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HStack.cjs","sources":["../../../src/components/layout/HStack.tsx"],"sourcesContent":["import React from 'react';\r\nimport { Flex } from './Flex';\r\n\r\ninterface HStackProps extends React.HTMLAttributes<HTMLDivElement> {\r\n gap?: number | string;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport function HStack({ gap = 8, children, ...rest }: HStackProps) {\r\n return (\r\n <Flex direction=\"row\" gap={gap} {...rest}>\r\n {children}\r\n </Flex>\r\n );\r\n}\r\n"],"names":["HStack","gap","children","rest","Flex"],"mappings":"6IAQO,SAASA,EAAO,CAAE,IAAAC,EAAM,EAAG,SAAAC,EAAU,GAAGC,GAAqB,CAClE,aACGC,EAAAA,KAAA,CAAK,UAAU,MAAM,IAAAH,EAAW,GAAGE,EACjC,SAAAD,EACH,CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HStack.js","sources":["../../../src/components/layout/HStack.tsx"],"sourcesContent":["import React from 'react';\r\nimport { Flex } from './Flex';\r\n\r\ninterface HStackProps extends React.HTMLAttributes<HTMLDivElement> {\r\n gap?: number | string;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport function HStack({ gap = 8, children, ...rest }: HStackProps) {\r\n return (\r\n <Flex direction=\"row\" gap={gap} {...rest}>\r\n {children}\r\n </Flex>\r\n );\r\n}\r\n"],"names":["HStack","gap","children","rest","Flex"],"mappings":";;AAQO,SAASA,EAAO,EAAE,KAAAC,IAAM,GAAG,UAAAC,GAAU,GAAGC,KAAqB;AAClE,2BACGC,GAAA,EAAK,WAAU,OAAM,KAAAH,GAAW,GAAGE,GACjC,UAAAD,GACH;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stack.cjs","sources":["../../../src/components/layout/Stack.tsx"],"sourcesContent":["import React from 'react';\r\nimport { Flex } from './Flex';\r\n\r\ninterface StackProps extends React.HTMLAttributes<HTMLDivElement> {\r\n gap?: number | string;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport function Stack({ gap = 8, children, ...rest }: StackProps) {\r\n return (\r\n <Flex direction=\"column\" gap={gap} {...rest}>\r\n {children}\r\n </Flex>\r\n );\r\n}\r\n"],"names":["Stack","gap","children","rest","Flex"],"mappings":"6IAQO,SAASA,EAAM,CAAE,IAAAC,EAAM,EAAG,SAAAC,EAAU,GAAGC,GAAoB,CAChE,aACGC,EAAAA,KAAA,CAAK,UAAU,SAAS,IAAAH,EAAW,GAAGE,EACpC,SAAAD,EACH,CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stack.js","sources":["../../../src/components/layout/Stack.tsx"],"sourcesContent":["import React from 'react';\r\nimport { Flex } from './Flex';\r\n\r\ninterface StackProps extends React.HTMLAttributes<HTMLDivElement> {\r\n gap?: number | string;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport function Stack({ gap = 8, children, ...rest }: StackProps) {\r\n return (\r\n <Flex direction=\"column\" gap={gap} {...rest}>\r\n {children}\r\n </Flex>\r\n );\r\n}\r\n"],"names":["Stack","gap","children","rest","Flex"],"mappings":";;AAQO,SAASA,EAAM,EAAE,KAAAC,IAAM,GAAG,UAAAC,GAAU,GAAGC,KAAoB;AAChE,2BACGC,GAAA,EAAK,WAAU,UAAS,KAAAH,GAAW,GAAGE,GACpC,UAAAD,GACH;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MegaMenu.cjs","sources":["../../../src/components/megamenu/MegaMenu.tsx"],"sourcesContent":["/**\r\n * MegaMenu.tsx\r\n * ------------\r\n * Accessible mega-menu dropdown for Navbar.\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react';\r\nimport './MegaMenu.css';\r\n\r\nexport interface MegaMenuItem {\r\n title: string;\r\n description?: string;\r\n href: string;\r\n}\r\n\r\ninterface MegaMenuProps {\r\n label: string;\r\n items: MegaMenuItem[];\r\n}\r\n\r\nexport function MegaMenu({ label, items }: MegaMenuProps) {\r\n const [open, setOpen] = useState(false);\r\n const panelRef = useRef<HTMLDivElement | null>(null);\r\n const triggerRef = useRef<HTMLButtonElement | null>(null);\r\n\r\n // Close on outside click\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n if (\r\n panelRef.current &&\r\n !panelRef.current.contains(e.target as Node) &&\r\n triggerRef.current &&\r\n !triggerRef.current.contains(e.target as Node)\r\n ) {\r\n setOpen(false);\r\n }\r\n };\r\n document.addEventListener('mousedown', handler);\r\n return () => document.removeEventListener('mousedown', handler);\r\n }, [open]);\r\n\r\n return (\r\n <div className=\"ui-megamenu\">\r\n <button\r\n ref={triggerRef}\r\n className=\"ui-megamenu-trigger\"\r\n aria-expanded={open}\r\n onClick={() => setOpen((o) => !o)}\r\n >\r\n {label} ▾\r\n </button>\r\n\r\n <div\r\n ref={panelRef}\r\n className={`ui-megamenu-panel ${open ? 'ui-megamenu-panel--open' : ''}`}\r\n role=\"menu\"\r\n >\r\n <div className=\"ui-megamenu-grid\">\r\n {items.map((it) => (\r\n <a href={it.href} key={it.href} className=\"ui-megamenu-item\">\r\n <span className=\"ui-megamenu-item-title\">{it.title}</span>\r\n {it.description && (\r\n <span className=\"ui-megamenu-item-desc\">{it.description}</span>\r\n )}\r\n </a>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["MegaMenu","label","items","open","setOpen","useState","panelRef","useRef","triggerRef","useEffect","handler","e","jsxs","o","jsx","it"],"mappings":"sKAoBO,SAASA,EAAS,CAAE,MAAAC,EAAO,MAAAC,GAAwB,CACxD,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAS,EAAK,EAChCC,EAAWC,EAAAA,OAA8B,IAAI,EAC7CC,EAAaD,EAAAA,OAAiC,IAAI,EAGxDE,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,CAACN,EAAM,OACX,MAAMO,EAAWC,GAAkB,CAE/BL,EAAS,SACT,CAACA,EAAS,QAAQ,SAASK,EAAE,MAAc,GAC3CH,EAAW,SACX,CAACA,EAAW,QAAQ,SAASG,EAAE,MAAc,GAE7CP,EAAQ,EAAK,CAEjB,EACA,gBAAS,iBAAiB,YAAaM,CAAO,EACvC,IAAM,SAAS,oBAAoB,YAAaA,CAAO,CAChE,EAAG,CAACP,CAAI,CAAC,EAGPS,EAAAA,KAAC,MAAA,CAAI,UAAU,cACb,SAAA,CAAAA,EAAAA,KAAC,SAAA,CACC,IAAKJ,EACL,UAAU,sBACV,gBAAeL,EACf,QAAS,IAAMC,EAASS,GAAM,CAACA,CAAC,EAE/B,SAAA,CAAAZ,EAAM,IAAA,CAAA,CAAA,EAGTa,EAAAA,IAAC,MAAA,CACC,IAAKR,EACL,UAAW,qBAAqBH,EAAO,0BAA4B,EAAE,GACrE,KAAK,OAEL,SAAAW,EAAAA,IAAC,MAAA,CAAI,UAAU,mBACZ,WAAM,IAAKC,GACVH,OAAC,IAAA,CAAE,KAAMG,EAAG,KAAoB,UAAU,mBACxC,SAAA,CAAAD,EAAAA,IAAC,OAAA,CAAK,UAAU,yBAA0B,SAAAC,EAAG,MAAM,EAClDA,EAAG,aACFD,EAAAA,IAAC,QAAK,UAAU,wBAAyB,WAAG,WAAA,CAAY,CAAA,GAHrCC,EAAG,IAK1B,CACD,CAAA,CACH,CAAA,CAAA,CACF,EACF,CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MegaMenu.js","sources":["../../../src/components/megamenu/MegaMenu.tsx"],"sourcesContent":["/**\r\n * MegaMenu.tsx\r\n * ------------\r\n * Accessible mega-menu dropdown for Navbar.\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react';\r\nimport './MegaMenu.css';\r\n\r\nexport interface MegaMenuItem {\r\n title: string;\r\n description?: string;\r\n href: string;\r\n}\r\n\r\ninterface MegaMenuProps {\r\n label: string;\r\n items: MegaMenuItem[];\r\n}\r\n\r\nexport function MegaMenu({ label, items }: MegaMenuProps) {\r\n const [open, setOpen] = useState(false);\r\n const panelRef = useRef<HTMLDivElement | null>(null);\r\n const triggerRef = useRef<HTMLButtonElement | null>(null);\r\n\r\n // Close on outside click\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n if (\r\n panelRef.current &&\r\n !panelRef.current.contains(e.target as Node) &&\r\n triggerRef.current &&\r\n !triggerRef.current.contains(e.target as Node)\r\n ) {\r\n setOpen(false);\r\n }\r\n };\r\n document.addEventListener('mousedown', handler);\r\n return () => document.removeEventListener('mousedown', handler);\r\n }, [open]);\r\n\r\n return (\r\n <div className=\"ui-megamenu\">\r\n <button\r\n ref={triggerRef}\r\n className=\"ui-megamenu-trigger\"\r\n aria-expanded={open}\r\n onClick={() => setOpen((o) => !o)}\r\n >\r\n {label} ▾\r\n </button>\r\n\r\n <div\r\n ref={panelRef}\r\n className={`ui-megamenu-panel ${open ? 'ui-megamenu-panel--open' : ''}`}\r\n role=\"menu\"\r\n >\r\n <div className=\"ui-megamenu-grid\">\r\n {items.map((it) => (\r\n <a href={it.href} key={it.href} className=\"ui-megamenu-item\">\r\n <span className=\"ui-megamenu-item-title\">{it.title}</span>\r\n {it.description && (\r\n <span className=\"ui-megamenu-item-desc\">{it.description}</span>\r\n )}\r\n </a>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["MegaMenu","label","items","open","setOpen","useState","panelRef","useRef","triggerRef","useEffect","handler","e","jsxs","o","jsx","it"],"mappings":";;;AAoBO,SAASA,EAAS,EAAE,OAAAC,GAAO,OAAAC,KAAwB;AACxD,QAAM,CAACC,GAAMC,CAAO,IAAIC,EAAS,EAAK,GAChCC,IAAWC,EAA8B,IAAI,GAC7CC,IAAaD,EAAiC,IAAI;AAGxD,SAAAE,EAAU,MAAM;AACd,QAAI,CAACN,EAAM;AACX,UAAMO,IAAU,CAACC,MAAkB;AACjC,MACEL,EAAS,WACT,CAACA,EAAS,QAAQ,SAASK,EAAE,MAAc,KAC3CH,EAAW,WACX,CAACA,EAAW,QAAQ,SAASG,EAAE,MAAc,KAE7CP,EAAQ,EAAK;AAAA,IAEjB;AACA,oBAAS,iBAAiB,aAAaM,CAAO,GACvC,MAAM,SAAS,oBAAoB,aAAaA,CAAO;AAAA,EAChE,GAAG,CAACP,CAAI,CAAC,GAGP,gBAAAS,EAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,IAAA,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKJ;AAAA,QACL,WAAU;AAAA,QACV,iBAAeL;AAAA,QACf,SAAS,MAAMC,EAAQ,CAACS,MAAM,CAACA,CAAC;AAAA,QAE/B,UAAA;AAAA,UAAAZ;AAAA,UAAM;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGT,gBAAAa;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKR;AAAA,QACL,WAAW,qBAAqBH,IAAO,4BAA4B,EAAE;AAAA,QACrE,MAAK;AAAA,QAEL,UAAA,gBAAAW,EAAC,OAAA,EAAI,WAAU,oBACZ,YAAM,IAAI,CAACC,MACV,gBAAAH,EAAC,KAAA,EAAE,MAAMG,EAAG,MAAoB,WAAU,oBACxC,UAAA;AAAA,UAAA,gBAAAD,EAAC,QAAA,EAAK,WAAU,0BAA0B,UAAAC,EAAG,OAAM;AAAA,UAClDA,EAAG,eACF,gBAAAD,EAAC,UAAK,WAAU,yBAAyB,YAAG,YAAA,CAAY;AAAA,QAAA,KAHrCC,EAAG,IAK1B,CACD,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Modal.cjs","sources":["../../../src/components/modal/Modal.tsx"],"sourcesContent":["/**\r\n * Modal.tsx\r\n * ----------\r\n * Fully accessible, WCAG-compliant modal/dialog component.\r\n *\r\n * Features:\r\n * - Role-based WAI-ARIA dialog semantics\r\n * - aria-modal, aria-labelledby, aria-describedby\r\n * - Portal rendering into <body>\r\n * - ESC-to-close (optional)\r\n * - Click-outside-to-close (optional)\r\n * - Focus trap (Tab / Shift+Tab)\r\n * - Focus restore on close\r\n * - Scroll locking on open\r\n * - INERT background content (full compliance)\r\n * - prefers-reduced-motion support\r\n * - initial focus element support\r\n *\r\n * Zero dependencies — all logic is pure React.\r\n */\r\n\r\n/**\r\n * Modal.tsx (Lint Clean Version)\r\n * ------------------------------\r\n * All ESLint issues fixed:\r\n * - No missing dependencies\r\n * - No inline re-created functions\r\n * - No non-null assertions\r\n * - No unused values\r\n */\r\n\r\nimport React, { useEffect, useRef, useCallback } from 'react';\r\nimport './Modal.css';\r\n\r\nimport { trapFocus, onClickOutside, restoreFocus, scrollLock, Portal, applyInertToSiblings,\r\n removeInertFromSiblings } from '../../utils/index';\r\n\r\nexport interface ModalProps {\r\n open: boolean;\r\n onClose: () => void;\r\n\r\n title?: string;\r\n description?: string;\r\n\r\n labelledById?: string;\r\n describedById?: string;\r\n\r\n disableClickOutside?: boolean;\r\n disableEsc?: boolean;\r\n\r\n initialFocusRef?: React.RefObject<HTMLElement>;\r\n\r\n className?: string;\r\n children?: React.ReactNode;\r\n}\r\n\r\nlet idCounter = 0;\r\nconst nextId = (prefix: string) => {\r\n idCounter += 1;\r\n return `${prefix}-${idCounter}`;\r\n};\r\n\r\nexport function Modal({\r\n open,\r\n onClose,\r\n title,\r\n description,\r\n labelledById,\r\n describedById,\r\n disableClickOutside = false,\r\n disableEsc = false,\r\n initialFocusRef,\r\n className = '',\r\n children,\r\n}: ModalProps) {\r\n const overlayRef = useRef<HTMLDivElement | null>(null);\r\n const dialogRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const previouslyFocusedElementRef = useRef<HTMLElement | null>(null);\r\n\r\n // Stable IDs (do NOT regenerate each render)\r\n const internalTitleId = useRef(\r\n labelledById || (title ? nextId('modal-title') : undefined)\r\n );\r\n\r\n const internalDescId = useRef(\r\n describedById || (description ? nextId('modal-desc') : undefined)\r\n );\r\n\r\n const titleId = internalTitleId.current;\r\n const descId = internalDescId.current;\r\n\r\n /**\r\n * Make onClose stable using useCallback\r\n */\r\n const handleClose = useCallback(() => {\r\n onClose();\r\n }, [onClose]);\r\n\r\n /**\r\n * ESC close handling\r\n */\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 /**\r\n * Main open/close lifecycle\r\n */\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n // Save previously focused element\r\n previouslyFocusedElementRef.current = document.activeElement as HTMLElement;\r\n\r\n // Lock scroll\r\n scrollLock.lock();\r\n\r\n // Make background inert\r\n const inertTargets = overlayRef.current\r\n ? applyInertToSiblings(overlayRef.current)\r\n : [];\r\n\r\n // Initial focus\r\n if (\r\n initialFocusRef?.current &&\r\n dialogRef.current?.contains(initialFocusRef.current)\r\n ) {\r\n initialFocusRef.current.focus();\r\n }\r\n\r\n // Focus trap\r\n const trapCleanup = dialogRef.current\r\n ? trapFocus(dialogRef.current)\r\n : undefined;\r\n\r\n // Click outside\r\n let clickOutsideCleanup: (() => void) | undefined;\r\n if (!disableClickOutside && dialogRef.current) {\r\n clickOutsideCleanup = onClickOutside(dialogRef, handleClose);\r\n }\r\n\r\n return () => {\r\n clickOutsideCleanup?.();\r\n trapCleanup?.();\r\n scrollLock.unlock();\r\n removeInertFromSiblings(inertTargets);\r\n restoreFocus(previouslyFocusedElementRef.current);\r\n };\r\n }, [open, disableClickOutside, handleClose, initialFocusRef]);\r\n\r\n if (!open) return null;\r\n\r\n return (\r\n <Portal>\r\n <div ref={overlayRef} className=\"ui-modal-overlay\" aria-hidden=\"false\">\r\n <div\r\n ref={dialogRef}\r\n className={`ui-modal-container ${className}`}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby={titleId}\r\n aria-describedby={descId}\r\n tabIndex={-1}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {title && (\r\n <div id={titleId} className=\"ui-modal-title\">\r\n {title}\r\n </div>\r\n )}\r\n\r\n {description && (\r\n <div id={descId} className=\"ui-modal-description\">\r\n {description}\r\n </div>\r\n )}\r\n\r\n <div className=\"ui-modal-content\">{children}</div>\r\n\r\n <button\r\n type=\"button\"\r\n aria-label=\"Close dialog\"\r\n className=\"ui-modal-close\"\r\n onClick={handleClose}\r\n >\r\n ×\r\n </button>\r\n </div>\r\n\r\n {!disableClickOutside && (\r\n <button\r\n aria-hidden=\"true\"\r\n className=\"ui-modal-overlay-catcher\"\r\n onClick={handleClose}\r\n tabIndex={-1}\r\n />\r\n )}\r\n </div>\r\n </Portal>\r\n );\r\n}\r\n"],"names":["idCounter","nextId","prefix","Modal","open","onClose","title","description","labelledById","describedById","disableClickOutside","disableEsc","initialFocusRef","className","children","overlayRef","useRef","dialogRef","previouslyFocusedElementRef","internalTitleId","internalDescId","titleId","descId","handleClose","useCallback","useEffect","onKey","e","scrollLock","inertTargets","applyInertToSiblings","trapCleanup","trapFocus","clickOutsideCleanup","onClickOutside","removeInertFromSiblings","restoreFocus","jsx","Portal","jsxs"],"mappings":"ieAwDA,IAAIA,EAAY,EAChB,MAAMC,EAAUC,IACdF,GAAa,EACN,GAAGE,CAAM,IAAIF,CAAS,IAGxB,SAASG,EAAM,CACpB,KAAAC,EACA,QAAAC,EACA,MAAAC,EACA,YAAAC,EACA,aAAAC,EACA,cAAAC,EACA,oBAAAC,EAAsB,GACtB,WAAAC,EAAa,GACb,gBAAAC,EACA,UAAAC,EAAY,GACZ,SAAAC,CACF,EAAe,CACb,MAAMC,EAAaC,EAAAA,OAA8B,IAAI,EAC/CC,EAAYD,EAAAA,OAA8B,IAAI,EAE9CE,EAA8BF,EAAAA,OAA2B,IAAI,EAG7DG,EAAkBH,EAAAA,OACtBR,IAAiBF,EAAQL,EAAO,aAAa,EAAI,OAAA,EAG7CmB,EAAiBJ,EAAAA,OACrBP,IAAkBF,EAAcN,EAAO,YAAY,EAAI,OAAA,EAGnDoB,EAAUF,EAAgB,QAC1BG,EAASF,EAAe,QAKxBG,EAAcC,EAAAA,YAAY,IAAM,CACpCnB,EAAA,CACF,EAAG,CAACA,CAAO,CAAC,EAgEZ,OA3DAoB,EAAAA,UAAU,IAAM,CACd,GAAI,CAACrB,GAAQO,EAAY,OAEzB,MAAMe,EAASC,GAAqB,CAC9BA,EAAE,MAAQ,WACZA,EAAE,eAAA,EACFJ,EAAA,EAEJ,EAEA,gBAAS,iBAAiB,UAAWG,CAAK,EACnC,IAAM,SAAS,oBAAoB,UAAWA,CAAK,CAC5D,EAAG,CAACtB,EAAMO,EAAYY,CAAW,CAAC,EAKlCE,EAAAA,UAAU,IAAM,CACd,GAAI,CAACrB,EAAM,OAGXc,EAA4B,QAAU,SAAS,cAG/CU,EAAAA,WAAW,KAAA,EAGX,MAAMC,EAAed,EAAW,QAC5Be,EAAAA,qBAAqBf,EAAW,OAAO,EACvC,CAAA,EAIFH,GAAiB,SACjBK,EAAU,SAAS,SAASL,EAAgB,OAAO,GAEnDA,EAAgB,QAAQ,MAAA,EAI1B,MAAMmB,EAAcd,EAAU,QAC1Be,EAAAA,UAAUf,EAAU,OAAO,EAC3B,OAGJ,IAAIgB,EACJ,MAAI,CAACvB,GAAuBO,EAAU,UACpCgB,EAAsBC,EAAAA,eAAejB,EAAWM,CAAW,GAGtD,IAAM,CACXU,IAAA,EACAF,IAAA,EACAH,EAAAA,WAAW,OAAA,EACXO,EAAAA,wBAAwBN,CAAY,EACpCO,EAAAA,aAAalB,EAA4B,OAAO,CAClD,CACF,EAAG,CAACd,EAAMM,EAAqBa,EAAaX,CAAe,CAAC,EAEvDR,EAGHiC,EAAAA,IAACC,EAAAA,QACC,SAAAC,EAAAA,KAAC,MAAA,CAAI,IAAKxB,EAAY,UAAU,mBAAmB,cAAY,QAC7D,SAAA,CAAAwB,EAAAA,KAAC,MAAA,CACC,IAAKtB,EACL,UAAW,sBAAsBJ,CAAS,GAC1C,KAAK,SACL,aAAW,OACX,kBAAiBQ,EACjB,mBAAkBC,EAClB,SAAU,GACV,QAAUK,GAAMA,EAAE,gBAAA,EAEjB,SAAA,CAAArB,SACE,MAAA,CAAI,GAAIe,EAAS,UAAU,iBACzB,SAAAf,EACH,EAGDC,GACC8B,EAAAA,IAAC,MAAA,CAAI,GAAIf,EAAQ,UAAU,uBACxB,SAAAf,EACH,EAGF8B,EAAAA,IAAC,MAAA,CAAI,UAAU,mBAAoB,SAAAvB,CAAA,CAAS,EAE5CuB,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,aAAW,eACX,UAAU,iBACV,QAASd,EACV,SAAA,GAAA,CAAA,CAED,CAAA,CAAA,EAGD,CAACb,GACA2B,EAAAA,IAAC,SAAA,CACC,cAAY,OACZ,UAAU,2BACV,QAASd,EACT,SAAU,EAAA,CAAA,CACZ,CAAA,CAEJ,CAAA,CACF,EAhDgB,IAkDpB"}
|