@nofinite/nui 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/accordion/Accordion.cjs +2 -0
- package/dist/components/accordion/Accordion.cjs.map +1 -0
- package/dist/components/accordion/Accordion.js +51 -0
- package/dist/components/accordion/Accordion.js.map +1 -0
- package/dist/components/alert/Alert.cjs +2 -0
- package/dist/components/alert/Alert.cjs.map +1 -0
- package/dist/components/alert/Alert.js +32 -0
- package/dist/components/alert/Alert.js.map +1 -0
- package/dist/components/avatar/Avatar.cjs +2 -0
- package/dist/components/avatar/Avatar.cjs.map +1 -0
- package/dist/components/avatar/Avatar.js +51 -0
- package/dist/components/avatar/Avatar.js.map +1 -0
- package/dist/components/avatar/AvatarGroup.cjs +2 -0
- package/dist/components/avatar/AvatarGroup.cjs.map +1 -0
- package/dist/components/avatar/AvatarGroup.js +32 -0
- package/dist/components/avatar/AvatarGroup.js.map +1 -0
- package/dist/components/badge/Badge.cjs +2 -0
- package/dist/components/badge/Badge.cjs.map +1 -0
- package/dist/components/badge/Badge.js +81 -0
- package/dist/components/badge/Badge.js.map +1 -0
- package/dist/components/badge/BadgeGroup.cjs +2 -0
- package/dist/components/badge/BadgeGroup.cjs.map +1 -0
- package/dist/components/badge/BadgeGroup.js +17 -0
- package/dist/components/badge/BadgeGroup.js.map +1 -0
- package/dist/components/breadcrumbs/Breadcrumbs.cjs +2 -0
- package/dist/components/breadcrumbs/Breadcrumbs.cjs.map +1 -0
- package/dist/components/breadcrumbs/Breadcrumbs.js +46 -0
- package/dist/components/breadcrumbs/Breadcrumbs.js.map +1 -0
- package/dist/components/button/Button.cjs +2 -0
- package/dist/components/button/Button.cjs.map +1 -0
- package/dist/components/button/Button.js +21 -0
- package/dist/components/button/Button.js.map +1 -0
- package/dist/components/card/Card.cjs +2 -0
- package/dist/components/card/Card.cjs.map +1 -0
- package/dist/components/card/Card.js +50 -0
- package/dist/components/card/Card.js.map +1 -0
- package/dist/components/checkbox/Checkbox.cjs +2 -0
- package/dist/components/checkbox/Checkbox.cjs.map +1 -0
- package/dist/components/checkbox/Checkbox.js +46 -0
- package/dist/components/checkbox/Checkbox.js.map +1 -0
- package/dist/components/chip/Chip.cjs +2 -0
- package/dist/components/chip/Chip.cjs.map +1 -0
- package/dist/components/chip/Chip.js +51 -0
- package/dist/components/chip/Chip.js.map +1 -0
- package/dist/components/combobox/Combobox.cjs +2 -0
- package/dist/components/combobox/Combobox.cjs.map +1 -0
- package/dist/components/combobox/Combobox.js +114 -0
- package/dist/components/combobox/Combobox.js.map +1 -0
- package/dist/components/commandpalette/CommandPalette.cjs +2 -0
- package/dist/components/commandpalette/CommandPalette.cjs.map +1 -0
- package/dist/components/commandpalette/CommandPalette.js +111 -0
- package/dist/components/commandpalette/CommandPalette.js.map +1 -0
- package/dist/components/contextmenu/ContextMenu.cjs +2 -0
- package/dist/components/contextmenu/ContextMenu.cjs.map +1 -0
- package/dist/components/contextmenu/ContextMenu.js +104 -0
- package/dist/components/contextmenu/ContextMenu.js.map +1 -0
- package/dist/components/datagrid/DataGrid.cjs +2 -0
- package/dist/components/datagrid/DataGrid.cjs.map +1 -0
- package/dist/components/datagrid/DataGrid.js +227 -0
- package/dist/components/datagrid/DataGrid.js.map +1 -0
- package/dist/components/datepicker/DatePicker.cjs +2 -0
- package/dist/components/datepicker/DatePicker.cjs.map +1 -0
- package/dist/components/datepicker/DatePicker.js +265 -0
- package/dist/components/datepicker/DatePicker.js.map +1 -0
- package/dist/components/daterangepicker/DateRangePicker.cjs +2 -0
- package/dist/components/daterangepicker/DateRangePicker.cjs.map +1 -0
- package/dist/components/daterangepicker/DateRangePicker.js +322 -0
- package/dist/components/daterangepicker/DateRangePicker.js.map +1 -0
- package/dist/components/drawer/Drawer.cjs +2 -0
- package/dist/components/drawer/Drawer.cjs.map +1 -0
- package/dist/components/drawer/Drawer.js +57 -0
- package/dist/components/drawer/Drawer.js.map +1 -0
- package/dist/components/dropdown/Dropdown.cjs +2 -0
- package/dist/components/dropdown/Dropdown.cjs.map +1 -0
- package/dist/components/dropdown/Dropdown.js +115 -0
- package/dist/components/dropdown/Dropdown.js.map +1 -0
- package/dist/components/fileuploader/FileUploader.cjs +2 -0
- package/dist/components/fileuploader/FileUploader.cjs.map +1 -0
- package/dist/components/fileuploader/FileUploader.js +83 -0
- package/dist/components/fileuploader/FileUploader.js.map +1 -0
- package/dist/components/hovercard/HoverCard.cjs +2 -0
- package/dist/components/hovercard/HoverCard.cjs.map +1 -0
- package/dist/components/hovercard/HoverCard.js +78 -0
- package/dist/components/hovercard/HoverCard.js.map +1 -0
- package/dist/components/input/Input.cjs +2 -0
- package/dist/components/input/Input.cjs.map +1 -0
- package/dist/components/input/Input.js +41 -0
- package/dist/components/input/Input.js.map +1 -0
- package/dist/components/layout/Container.cjs +2 -0
- package/dist/components/layout/Container.cjs.map +1 -0
- package/dist/components/layout/Container.js +33 -0
- package/dist/components/layout/Container.js.map +1 -0
- package/dist/components/layout/Flex.cjs +2 -0
- package/dist/components/layout/Flex.cjs.map +1 -0
- package/dist/components/layout/Flex.js +26 -0
- package/dist/components/layout/Flex.js.map +1 -0
- package/dist/components/layout/Grid.cjs +2 -0
- package/dist/components/layout/Grid.cjs.map +1 -0
- package/dist/components/layout/Grid.js +21 -0
- package/dist/components/layout/Grid.js.map +1 -0
- package/dist/components/layout/HStack.cjs +2 -0
- package/dist/components/layout/HStack.cjs.map +1 -0
- package/dist/components/layout/HStack.js +9 -0
- package/dist/components/layout/HStack.js.map +1 -0
- package/dist/components/layout/Stack.cjs +2 -0
- package/dist/components/layout/Stack.cjs.map +1 -0
- package/dist/components/layout/Stack.js +9 -0
- package/dist/components/layout/Stack.js.map +1 -0
- package/dist/components/megamenu/MegaMenu.cjs +2 -0
- package/dist/components/megamenu/MegaMenu.cjs.map +1 -0
- package/dist/components/megamenu/MegaMenu.js +43 -0
- package/dist/components/megamenu/MegaMenu.js.map +1 -0
- package/dist/components/modal/Modal.cjs +2 -0
- package/dist/components/modal/Modal.cjs.map +1 -0
- package/dist/components/modal/Modal.js +91 -0
- package/dist/components/modal/Modal.js.map +1 -0
- package/dist/components/pagination/Pagination.cjs +2 -0
- package/dist/components/pagination/Pagination.cjs.map +1 -0
- package/dist/components/pagination/Pagination.js +62 -0
- package/dist/components/pagination/Pagination.js.map +1 -0
- package/dist/components/popover/Popover.cjs +2 -0
- package/dist/components/popover/Popover.cjs.map +1 -0
- package/dist/components/popover/Popover.js +123 -0
- package/dist/components/popover/Popover.js.map +1 -0
- package/dist/components/progress/Progress.cjs +2 -0
- package/dist/components/progress/Progress.cjs.map +1 -0
- package/dist/components/progress/Progress.js +33 -0
- package/dist/components/progress/Progress.js.map +1 -0
- package/dist/components/radiogroup/RadioGroup.cjs +2 -0
- package/dist/components/radiogroup/RadioGroup.cjs.map +1 -0
- package/dist/components/radiogroup/RadioGroup.js +79 -0
- package/dist/components/radiogroup/RadioGroup.js.map +1 -0
- package/dist/components/rating/Rating.cjs +2 -0
- package/dist/components/rating/Rating.cjs.map +1 -0
- package/dist/components/rating/Rating.js +49 -0
- package/dist/components/rating/Rating.js.map +1 -0
- package/dist/components/skeleton/Skeleton.cjs +2 -0
- package/dist/components/skeleton/Skeleton.cjs.map +1 -0
- package/dist/components/skeleton/Skeleton.js +86 -0
- package/dist/components/skeleton/Skeleton.js.map +1 -0
- package/dist/components/slider/Slider.cjs +2 -0
- package/dist/components/slider/Slider.cjs.map +1 -0
- package/dist/components/slider/Slider.js +116 -0
- package/dist/components/slider/Slider.js.map +1 -0
- package/dist/components/spinner/Spinner.cjs +2 -0
- package/dist/components/spinner/Spinner.cjs.map +1 -0
- package/dist/components/spinner/Spinner.js +21 -0
- package/dist/components/spinner/Spinner.js.map +1 -0
- package/dist/components/stepper/Stepper.cjs +6 -0
- package/dist/components/stepper/Stepper.cjs.map +1 -0
- package/dist/components/stepper/Stepper.js +43 -0
- package/dist/components/stepper/Stepper.js.map +1 -0
- package/dist/components/switch/Switch.cjs +2 -0
- package/dist/components/switch/Switch.cjs.map +1 -0
- package/dist/components/switch/Switch.js +67 -0
- package/dist/components/switch/Switch.js.map +1 -0
- package/dist/components/table/Table.cjs +2 -0
- package/dist/components/table/Table.cjs.map +1 -0
- package/dist/components/table/Table.js +46 -0
- package/dist/components/table/Table.js.map +1 -0
- package/dist/components/tabs/Tabs.cjs +2 -0
- package/dist/components/tabs/Tabs.cjs.map +1 -0
- package/dist/components/tabs/Tabs.js +56 -0
- package/dist/components/tabs/Tabs.js.map +1 -0
- package/dist/components/textarea/Textarea.cjs +2 -0
- package/dist/components/textarea/Textarea.cjs.map +1 -0
- package/dist/components/textarea/Textarea.js +75 -0
- package/dist/components/textarea/Textarea.js.map +1 -0
- package/dist/components/toast/Toast.cjs +2 -0
- package/dist/components/toast/Toast.cjs.map +1 -0
- package/dist/components/toast/Toast.js +52 -0
- package/dist/components/toast/Toast.js.map +1 -0
- package/dist/components/tooltip/Tooltip.cjs +2 -0
- package/dist/components/tooltip/Tooltip.cjs.map +1 -0
- package/dist/components/tooltip/Tooltip.js +73 -0
- package/dist/components/tooltip/Tooltip.js.map +1 -0
- package/dist/components/treeview/TreeView.cjs +2 -0
- package/dist/components/treeview/TreeView.cjs.map +1 -0
- package/dist/components/treeview/TreeView.js +98 -0
- package/dist/components/treeview/TreeView.js.map +1 -0
- package/dist/components/virtuallist/VirtualList.cjs +2 -0
- package/dist/components/virtuallist/VirtualList.cjs.map +1 -0
- package/dist/components/virtuallist/VirtualList.js +58 -0
- package/dist/components/virtuallist/VirtualList.js.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/styles/index.css +1 -0
- package/dist/theme/NUIProvider.cjs +2 -0
- package/dist/theme/NUIProvider.cjs.map +1 -0
- package/dist/theme/NUIProvider.js +34 -0
- package/dist/theme/NUIProvider.js.map +1 -0
- package/dist/theme/useTheme.cjs +2 -0
- package/dist/theme/useTheme.cjs.map +1 -0
- package/dist/theme/useTheme.js +9 -0
- package/dist/theme/useTheme.js.map +1 -0
- package/dist/types/components/accordion/Accordion.d.ts +18 -0
- package/dist/types/components/accordion/Accordion.d.ts.map +1 -0
- package/dist/types/components/alert/Alert.d.ts +13 -0
- package/dist/types/components/alert/Alert.d.ts.map +1 -0
- package/dist/types/components/avatar/Avatar.d.ts +18 -0
- package/dist/types/components/avatar/Avatar.d.ts.map +1 -0
- package/dist/types/components/avatar/AvatarGroup.d.ts +10 -0
- package/dist/types/components/avatar/AvatarGroup.d.ts.map +1 -0
- package/dist/types/components/badge/Badge.d.ts +22 -0
- package/dist/types/components/badge/Badge.d.ts.map +1 -0
- package/dist/types/components/badge/BadgeGroup.d.ts +9 -0
- package/dist/types/components/badge/BadgeGroup.d.ts.map +1 -0
- package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts +15 -0
- package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts.map +1 -0
- package/dist/types/components/button/Button.d.ts +15 -0
- package/dist/types/components/button/Button.d.ts.map +1 -0
- package/dist/types/components/card/Card.d.ts +27 -0
- package/dist/types/components/card/Card.d.ts.map +1 -0
- package/dist/types/components/checkbox/Checkbox.d.ts +15 -0
- package/dist/types/components/checkbox/Checkbox.d.ts.map +1 -0
- package/dist/types/components/chip/Chip.d.ts +21 -0
- package/dist/types/components/chip/Chip.d.ts.map +1 -0
- package/dist/types/components/combobox/Combobox.d.ts +24 -0
- package/dist/types/components/combobox/Combobox.d.ts.map +1 -0
- package/dist/types/components/commandpalette/CommandPalette.d.ts +21 -0
- package/dist/types/components/commandpalette/CommandPalette.d.ts.map +1 -0
- package/dist/types/components/contextmenu/ContextMenu.d.ts +17 -0
- package/dist/types/components/contextmenu/ContextMenu.d.ts.map +1 -0
- package/dist/types/components/datagrid/DataGrid.d.ts +28 -0
- package/dist/types/components/datagrid/DataGrid.d.ts.map +1 -0
- package/dist/types/components/datepicker/DatePicker.d.ts +14 -0
- package/dist/types/components/datepicker/DatePicker.d.ts.map +1 -0
- package/dist/types/components/daterangepicker/DateRangePicker.d.ts +19 -0
- package/dist/types/components/daterangepicker/DateRangePicker.d.ts.map +1 -0
- package/dist/types/components/drawer/Drawer.d.ts +12 -0
- package/dist/types/components/drawer/Drawer.d.ts.map +1 -0
- package/dist/types/components/dropdown/Dropdown.d.ts +18 -0
- package/dist/types/components/dropdown/Dropdown.d.ts.map +1 -0
- package/dist/types/components/fileuploader/FileUploader.d.ts +9 -0
- package/dist/types/components/fileuploader/FileUploader.d.ts.map +1 -0
- package/dist/types/components/hovercard/HoverCard.d.ts +10 -0
- package/dist/types/components/hovercard/HoverCard.d.ts.map +1 -0
- package/dist/types/components/input/Input.d.ts +15 -0
- package/dist/types/components/input/Input.d.ts.map +1 -0
- package/dist/types/components/layout/Container.d.ts +8 -0
- package/dist/types/components/layout/Container.d.ts.map +1 -0
- package/dist/types/components/layout/Flex.d.ts +14 -0
- package/dist/types/components/layout/Flex.d.ts.map +1 -0
- package/dist/types/components/layout/Grid.d.ts +10 -0
- package/dist/types/components/layout/Grid.d.ts.map +1 -0
- package/dist/types/components/layout/HStack.d.ts +8 -0
- package/dist/types/components/layout/HStack.d.ts.map +1 -0
- package/dist/types/components/layout/Stack.d.ts +8 -0
- package/dist/types/components/layout/Stack.d.ts.map +1 -0
- package/dist/types/components/megamenu/MegaMenu.d.ts +12 -0
- package/dist/types/components/megamenu/MegaMenu.d.ts.map +1 -0
- package/dist/types/components/modal/Modal.d.ts +16 -0
- package/dist/types/components/modal/Modal.d.ts.map +1 -0
- package/dist/types/components/pagination/Pagination.d.ts +9 -0
- package/dist/types/components/pagination/Pagination.d.ts.map +1 -0
- package/dist/types/components/popover/Popover.d.ts +21 -0
- package/dist/types/components/popover/Popover.d.ts.map +1 -0
- package/dist/types/components/progress/Progress.d.ts +13 -0
- package/dist/types/components/progress/Progress.d.ts.map +1 -0
- package/dist/types/components/radiogroup/RadioGroup.d.ts +18 -0
- package/dist/types/components/radiogroup/RadioGroup.d.ts.map +1 -0
- package/dist/types/components/rating/Rating.d.ts +19 -0
- package/dist/types/components/rating/Rating.d.ts.map +1 -0
- package/dist/types/components/select/Select.d.ts +20 -0
- package/dist/types/components/select/Select.d.ts.map +1 -0
- package/dist/types/components/skeleton/Skeleton.d.ts +44 -0
- package/dist/types/components/skeleton/Skeleton.d.ts.map +1 -0
- package/dist/types/components/slider/Slider.d.ts +13 -0
- package/dist/types/components/slider/Slider.d.ts.map +1 -0
- package/dist/types/components/spinner/Spinner.d.ts +7 -0
- package/dist/types/components/spinner/Spinner.d.ts.map +1 -0
- package/dist/types/components/stepper/Stepper.d.ts +12 -0
- package/dist/types/components/stepper/Stepper.d.ts.map +1 -0
- package/dist/types/components/switch/Switch.d.ts +15 -0
- package/dist/types/components/switch/Switch.d.ts.map +1 -0
- package/dist/types/components/table/Table.d.ts +14 -0
- package/dist/types/components/table/Table.d.ts.map +1 -0
- package/dist/types/components/tabs/Tabs.d.ts +14 -0
- package/dist/types/components/tabs/Tabs.d.ts.map +1 -0
- package/dist/types/components/textarea/Textarea.d.ts +14 -0
- package/dist/types/components/textarea/Textarea.d.ts.map +1 -0
- package/dist/types/components/toast/Toast.d.ts +16 -0
- package/dist/types/components/toast/Toast.d.ts.map +1 -0
- package/dist/types/components/tooltip/Tooltip.d.ts +10 -0
- package/dist/types/components/tooltip/Tooltip.d.ts.map +1 -0
- package/dist/types/components/treeview/TreeView.d.ts +16 -0
- package/dist/types/components/treeview/TreeView.d.ts.map +1 -0
- package/dist/types/components/virtuallist/VirtualList.d.ts +23 -0
- package/dist/types/components/virtuallist/VirtualList.d.ts.map +1 -0
- package/dist/types/index.d.ts +50 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/theme/NUIProvider.d.ts +14 -0
- package/dist/types/theme/NUIProvider.d.ts.map +1 -0
- package/dist/types/theme/useTheme.d.ts +11 -0
- package/dist/types/theme/useTheme.d.ts.map +1 -0
- package/dist/types/utils/generateid/generateId.d.ts +2 -0
- package/dist/types/utils/generateid/generateId.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +9 -0
- package/dist/types/utils/index.d.ts.map +1 -0
- package/dist/types/utils/inertmanager/inertManager.d.ts +13 -0
- package/dist/types/utils/inertmanager/inertManager.d.ts.map +1 -0
- package/dist/types/utils/keyboardnav/keyboardNav.d.ts +11 -0
- package/dist/types/utils/keyboardnav/keyboardNav.d.ts.map +1 -0
- package/dist/types/utils/onclickoutside/onClickOutside.d.ts +3 -0
- package/dist/types/utils/onclickoutside/onClickOutside.d.ts.map +1 -0
- package/dist/types/utils/portal/portal.d.ts +4 -0
- package/dist/types/utils/portal/portal.d.ts.map +1 -0
- package/dist/types/utils/restorefocus/restoreFocus.d.ts +8 -0
- package/dist/types/utils/restorefocus/restoreFocus.d.ts.map +1 -0
- package/dist/types/utils/scrolllock/scrollLock.d.ts +11 -0
- package/dist/types/utils/scrolllock/scrollLock.d.ts.map +1 -0
- package/dist/types/utils/trapfocus/trapFocus.d.ts +8 -0
- package/dist/types/utils/trapfocus/trapFocus.d.ts.map +1 -0
- package/dist/utils/generateid/generateId.cjs +2 -0
- package/dist/utils/generateid/generateId.cjs.map +1 -0
- package/dist/utils/generateid/generateId.js +7 -0
- package/dist/utils/generateid/generateId.js.map +1 -0
- package/dist/utils/inertmanager/inertManager.cjs +2 -0
- package/dist/utils/inertmanager/inertManager.cjs.map +1 -0
- package/dist/utils/inertmanager/inertManager.js +18 -0
- package/dist/utils/inertmanager/inertManager.js.map +1 -0
- package/dist/utils/keyboardnav/keyboardNav.cjs +2 -0
- package/dist/utils/keyboardnav/keyboardNav.cjs.map +1 -0
- package/dist/utils/keyboardnav/keyboardNav.js +10 -0
- package/dist/utils/keyboardnav/keyboardNav.js.map +1 -0
- package/dist/utils/onclickoutside/onClickOutside.cjs +2 -0
- package/dist/utils/onclickoutside/onClickOutside.cjs.map +1 -0
- package/dist/utils/onclickoutside/onClickOutside.js +11 -0
- package/dist/utils/onclickoutside/onClickOutside.js.map +1 -0
- package/dist/utils/portal/portal.cjs +2 -0
- package/dist/utils/portal/portal.cjs.map +1 -0
- package/dist/utils/portal/portal.js +8 -0
- package/dist/utils/portal/portal.js.map +1 -0
- package/dist/utils/restorefocus/restoreFocus.cjs +2 -0
- package/dist/utils/restorefocus/restoreFocus.cjs.map +1 -0
- package/dist/utils/restorefocus/restoreFocus.js +7 -0
- package/dist/utils/restorefocus/restoreFocus.js.map +1 -0
- package/dist/utils/scrolllock/scrollLock.cjs +2 -0
- package/dist/utils/scrolllock/scrollLock.cjs.map +1 -0
- package/dist/utils/scrolllock/scrollLock.js +12 -0
- package/dist/utils/scrolllock/scrollLock.js.map +1 -0
- package/dist/utils/trapfocus/trapFocus.cjs +3 -0
- package/dist/utils/trapfocus/trapFocus.cjs.map +1 -0
- package/dist/utils/trapfocus/trapFocus.js +14 -0
- package/dist/utils/trapfocus/trapFocus.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsx as s } from "react/jsx-runtime";
|
|
2
|
+
import { useState as c } from "react";
|
|
3
|
+
/* empty css */
|
|
4
|
+
function A({
|
|
5
|
+
value: o,
|
|
6
|
+
max: i = 5,
|
|
7
|
+
onChange: d,
|
|
8
|
+
icon: u = "☆",
|
|
9
|
+
iconFilled: f = "★",
|
|
10
|
+
size: m = "md",
|
|
11
|
+
className: h = ""
|
|
12
|
+
}) {
|
|
13
|
+
const [g, p] = c(0), t = o ?? g, [x, a] = c(null), y = x ?? t, r = (e) => {
|
|
14
|
+
o === void 0 && p(e), d?.(e);
|
|
15
|
+
}, k = (e) => {
|
|
16
|
+
e.key === "ArrowRight" && r(Math.min((t ?? 0) + 1, i)), e.key === "ArrowLeft" && r(Math.max((t ?? 0) - 1, 1));
|
|
17
|
+
};
|
|
18
|
+
return /* @__PURE__ */ s(
|
|
19
|
+
"div",
|
|
20
|
+
{
|
|
21
|
+
className: `ui-rating ui-rating--${m} ${h}`,
|
|
22
|
+
role: "radiogroup",
|
|
23
|
+
tabIndex: 0,
|
|
24
|
+
onKeyDown: k,
|
|
25
|
+
"aria-label": "Rating",
|
|
26
|
+
children: Array.from({ length: i }, (e, M) => {
|
|
27
|
+
const n = M + 1, l = n <= y;
|
|
28
|
+
return /* @__PURE__ */ s(
|
|
29
|
+
"span",
|
|
30
|
+
{
|
|
31
|
+
role: "radio",
|
|
32
|
+
"aria-checked": t === n,
|
|
33
|
+
tabIndex: -1,
|
|
34
|
+
className: `ui-rating-item ${l ? "filled" : ""}`,
|
|
35
|
+
onMouseEnter: () => a(n),
|
|
36
|
+
onMouseLeave: () => a(null),
|
|
37
|
+
onClick: () => r(n),
|
|
38
|
+
children: l ? f : u
|
|
39
|
+
},
|
|
40
|
+
n
|
|
41
|
+
);
|
|
42
|
+
})
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
A as Rating
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=Rating.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Rating.js","sources":["../../../../src/components/rating/Rating.tsx"],"sourcesContent":["/**\r\n * Rating.tsx — FINAL VERSION\r\n * ---------------------------\r\n * Features:\r\n * - Click to select\r\n * - Hover preview\r\n * - Keyboard navigation\r\n * - Theme-aware\r\n * - Accessible\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport './Rating.css';\r\n\r\nexport interface RatingProps {\r\n /** Current value (1–max). If undefined → uncontrolled mode */\r\n value?: number;\r\n\r\n /** Max number of stars */\r\n max?: number;\r\n\r\n /** Change handler */\r\n onChange?: (value: number) => void;\r\n\r\n /** Custom icon */\r\n icon?: React.ReactNode;\r\n\r\n /** Custom filled icon */\r\n iconFilled?: React.ReactNode;\r\n\r\n /** Size */\r\n size?: 'sm' | 'md' | 'lg';\r\n\r\n /** Optional class */\r\n className?: string;\r\n}\r\n\r\nexport function Rating({\r\n value,\r\n max = 5,\r\n onChange,\r\n icon = '☆',\r\n iconFilled = '★',\r\n size = 'md',\r\n className = '',\r\n}: RatingProps) {\r\n // uncontrolled internal value\r\n const [internal, setInternal] = useState(0);\r\n const current = value ?? internal;\r\n\r\n const [hover, setHover] = useState<number | null>(null);\r\n\r\n const finalValue = hover ?? current;\r\n\r\n const handleSelect = (v: number) => {\r\n if (value === undefined) setInternal(v);\r\n onChange?.(v);\r\n };\r\n\r\n const handleKey = (e: React.KeyboardEvent<HTMLDivElement>) => {\r\n if (e.key === 'ArrowRight') handleSelect(Math.min((current ?? 0) + 1, max));\r\n if (e.key === 'ArrowLeft') handleSelect(Math.max((current ?? 0) - 1, 1));\r\n };\r\n\r\n return (\r\n <div\r\n className={`ui-rating ui-rating--${size} ${className}`}\r\n role=\"radiogroup\"\r\n tabIndex={0}\r\n onKeyDown={handleKey}\r\n aria-label=\"Rating\"\r\n >\r\n {Array.from({ length: max }, (_, i) => {\r\n const index = i + 1;\r\n const filled = index <= finalValue;\r\n\r\n return (\r\n <span\r\n key={index}\r\n role=\"radio\"\r\n aria-checked={current === index}\r\n tabIndex={-1}\r\n className={`ui-rating-item ${filled ? 'filled' : ''}`}\r\n onMouseEnter={() => setHover(index)}\r\n onMouseLeave={() => setHover(null)}\r\n onClick={() => handleSelect(index)}\r\n >\r\n {filled ? iconFilled : icon}\r\n </span>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n"],"names":["Rating","value","max","onChange","icon","iconFilled","size","className","internal","setInternal","useState","current","hover","setHover","finalValue","handleSelect","v","handleKey","jsx","_","i","index","filled"],"mappings":";;;AAqCO,SAASA,EAAO;AAAA,EACrB,OAAAC;AAAA,EACA,KAAAC,IAAM;AAAA,EACN,UAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,YAAAC,IAAa;AAAA,EACb,MAAAC,IAAO;AAAA,EACP,WAAAC,IAAY;AACd,GAAgB;AAEd,QAAM,CAACC,GAAUC,CAAW,IAAIC,EAAS,CAAC,GACpCC,IAAUV,KAASO,GAEnB,CAACI,GAAOC,CAAQ,IAAIH,EAAwB,IAAI,GAEhDI,IAAaF,KAASD,GAEtBI,IAAe,CAACC,MAAc;AAClC,IAAIf,MAAU,UAAWQ,EAAYO,CAAC,GACtCb,IAAWa,CAAC;AAAA,EACd,GAEMC,IAAY,CAAC,MAA2C;AAC5D,IAAI,EAAE,QAAQ,gBAAcF,EAAa,KAAK,KAAKJ,KAAW,KAAK,GAAGT,CAAG,CAAC,GACtE,EAAE,QAAQ,eAAaa,EAAa,KAAK,KAAKJ,KAAW,KAAK,GAAG,CAAC,CAAC;AAAA,EACzE;AAEA,SACE,gBAAAO;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,wBAAwBZ,CAAI,IAAIC,CAAS;AAAA,MACpD,MAAK;AAAA,MACL,UAAU;AAAA,MACV,WAAWU;AAAA,MACX,cAAW;AAAA,MAEV,UAAA,MAAM,KAAK,EAAE,QAAQf,KAAO,CAACiB,GAAGC,MAAM;AACrC,cAAMC,IAAQD,IAAI,GACZE,IAASD,KAASP;AAExB,eACE,gBAAAI;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,gBAAcP,MAAYU;AAAA,YAC1B,UAAU;AAAA,YACV,WAAW,kBAAkBC,IAAS,WAAW,EAAE;AAAA,YACnD,cAAc,MAAMT,EAASQ,CAAK;AAAA,YAClC,cAAc,MAAMR,EAAS,IAAI;AAAA,YACjC,SAAS,MAAME,EAAaM,CAAK;AAAA,YAEhC,cAAShB,IAAaD;AAAA,UAAA;AAAA,UATlBiB;AAAA,QAAA;AAAA,MAYX,CAAC;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r=require("react/jsx-runtime");;/* empty css */function c(e){if(e!==void 0)return typeof e=="number"?`${e}px`:e}function t({size:e="md",width:n,animated:a=!0,circle:o=!1,ariaHidden:i=!0,className:u="",style:d}){const l=["ui-skeleton",`ui-skeleton--${e}`,a&&"ui-skeleton--animated",o&&"ui-skeleton--circle",u].filter(Boolean).join(" ");return r.jsx("span",{className:l,style:{width:c(n),display:n?"block":void 0,...d},"aria-hidden":i,role:"presentation"})}function m({width:e="100%",size:n="md"}){return r.jsx(t,{width:e,size:n})}function s({lines:e=3,size:n="md"}){const a=Array.from({length:e});return r.jsx("div",{"aria-hidden":"true",children:a.map((o,i)=>r.jsx("div",{style:{marginBlockEnd:"8px"},children:r.jsx(t,{width:i===e-1?"75%":"100%",size:n})},i))})}function f({size:e=40}){return r.jsx(t,{circle:!0,width:e,animated:!0})}function x({width:e=100,height:n=36}){return r.jsx(t,{width:e,size:"md",animated:!0,style:{height:n,borderRadius:"var(--radius-md)"}})}function h(){return r.jsxs("div",{"aria-hidden":"true",children:[r.jsx(t,{width:"60%",size:"lg",style:{marginBottom:12}}),r.jsx(s,{lines:3}),r.jsx(t,{width:"40%",size:"md",style:{marginTop:16}})]})}t.Text=m;t.Paragraph=s;t.Avatar=f;t.Button=x;t.Card=h;exports.Skeleton=t;exports.default=t;
|
|
2
|
+
//# sourceMappingURL=Skeleton.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Skeleton.cjs","sources":["../../../../src/components/skeleton/Skeleton.tsx"],"sourcesContent":["/**\r\n * Skeleton.tsx\r\n * Lightweight, accessible skeleton (placeholder) component.\r\n *\r\n * Props:\r\n * - size: visual thickness (xs, sm, md, lg, xl)\r\n * - width: number | string (e.g. 200, \"50%\", \"100px\")\r\n * - animated: whether to show shimmer (respects prefers-reduced-motion)\r\n * - circle: renders as a circle (useful for avatars)\r\n * - className: pass-through for custom styling\r\n *\r\n * Accessibility:\r\n * - role=\"status\" with aria-busy on parent usage is recommended by developer.\r\n * - For individual skeletons that should be ignored by assistive tech set aria-hidden=true.\r\n */\r\n/**\r\n * Skeleton.tsx + Helper Components\r\n * --------------------------------\r\n * Adds:\r\n * - Skeleton.Text\r\n * - Skeleton.Paragraph\r\n * - Skeleton.Avatar\r\n * - Skeleton.Button\r\n * - Skeleton.Card\r\n */\r\n\r\nimport React from 'react';\r\nimport './Skeleton.css';\r\n\r\ntype Size = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\ninterface SkeletonProps {\r\n size?: Size;\r\n width?: number | string;\r\n animated?: boolean;\r\n circle?: boolean;\r\n ariaHidden?: boolean;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nfunction formatWidth(w?: number | string): string | undefined {\r\n if (w === undefined) return undefined;\r\n if (typeof w === 'number') return `${w}px`;\r\n return w;\r\n}\r\n\r\nexport function Skeleton({\r\n size = 'md',\r\n width,\r\n animated = true,\r\n circle = false,\r\n ariaHidden = true,\r\n className = '',\r\n style,\r\n}: SkeletonProps) {\r\n const classes = [\r\n 'ui-skeleton',\r\n `ui-skeleton--${size}`,\r\n animated && 'ui-skeleton--animated',\r\n circle && 'ui-skeleton--circle',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n return (\r\n <span\r\n className={classes}\r\n style={{\r\n width: formatWidth(width),\r\n display: width ? 'block' : undefined,\r\n ...style,\r\n }}\r\n aria-hidden={ariaHidden}\r\n role=\"presentation\"\r\n />\r\n );\r\n}\r\n\r\n/* -------------------------------------------------------\r\n * Helper Components\r\n * ------------------------------------------------------*/\r\n\r\n/**\r\n * Simple text line.\r\n * Default width: 100%\r\n */\r\nfunction Text({\r\n width = '100%',\r\n size = 'md',\r\n}: {\r\n width?: number | string;\r\n size?: Size;\r\n}) {\r\n return <Skeleton width={width} size={size} />;\r\n}\r\n\r\n/**\r\n * Paragraph: multiple lines of text skeleton\r\n * lines default = 3\r\n */\r\nfunction Paragraph({\r\n lines = 3,\r\n size = 'md',\r\n}: {\r\n lines?: number;\r\n size?: Size;\r\n}) {\r\n const arr = Array.from({ length: lines });\r\n\r\n return (\r\n <div aria-hidden=\"true\">\r\n {arr.map((_, i) => (\r\n <div key={i} style={{ marginBlockEnd: '8px' }}>\r\n <Skeleton width={i === lines - 1 ? '75%' : '100%'} size={size} />\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * Avatar placeholder, circle with dynamic size\r\n */\r\nfunction AvatarSkeleton({ size = 40 }: { size?: number }) {\r\n return <Skeleton circle width={size} animated />;\r\n}\r\n\r\n/**\r\n * Button skeleton (pill-like shape)\r\n */\r\nfunction ButtonSkeleton({\r\n width = 100,\r\n height = 36,\r\n}: {\r\n width?: number;\r\n height?: number;\r\n}) {\r\n return (\r\n <Skeleton\r\n width={width}\r\n size=\"md\"\r\n animated\r\n style={{\r\n height,\r\n borderRadius: 'var(--radius-md)',\r\n }}\r\n />\r\n );\r\n}\r\n\r\n/**\r\n * Card Skeleton: header + lines + footer bar\r\n */\r\nfunction CardSkeleton() {\r\n return (\r\n <div aria-hidden=\"true\">\r\n <Skeleton width=\"60%\" size=\"lg\" style={{ marginBottom: 12 }} />\r\n <Paragraph lines={3} />\r\n <Skeleton width=\"40%\" size=\"md\" style={{ marginTop: 16 }} />\r\n </div>\r\n );\r\n}\r\n\r\n/* Attach helpers */\r\nSkeleton.Text = Text;\r\nSkeleton.Paragraph = Paragraph;\r\nSkeleton.Avatar = AvatarSkeleton;\r\nSkeleton.Button = ButtonSkeleton;\r\nSkeleton.Card = CardSkeleton;\r\n\r\nexport default Skeleton;\r\n"],"names":["formatWidth","w","Skeleton","size","width","animated","circle","ariaHidden","className","style","classes","jsx","Text","Paragraph","lines","arr","_","AvatarSkeleton","ButtonSkeleton","height","CardSkeleton","jsxs"],"mappings":"+KAyCA,SAASA,EAAYC,EAAyC,CAC5D,GAAIA,IAAM,OACV,OAAI,OAAOA,GAAM,SAAiB,GAAGA,CAAC,KAC/BA,CACT,CAEO,SAASC,EAAS,CACvB,KAAAC,EAAO,KACP,MAAAC,EACA,SAAAC,EAAW,GACX,OAAAC,EAAS,GACT,WAAAC,EAAa,GACb,UAAAC,EAAY,GACZ,MAAAC,CACF,EAAkB,CAChB,MAAMC,EAAU,CACd,cACA,gBAAgBP,CAAI,GACpBE,GAAY,wBACZC,GAAU,sBACVE,CAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,EAEX,OACEG,EAAAA,IAAC,OAAA,CACC,UAAWD,EACX,MAAO,CACL,MAAOV,EAAYI,CAAK,EACxB,QAASA,EAAQ,QAAU,OAC3B,GAAGK,CAAA,EAEL,cAAaF,EACb,KAAK,cAAA,CAAA,CAGX,CAUA,SAASK,EAAK,CACZ,MAAAR,EAAQ,OACR,KAAAD,EAAO,IACT,EAGG,CACD,OAAOQ,EAAAA,IAACT,EAAA,CAAS,MAAAE,EAAc,KAAAD,CAAA,CAAY,CAC7C,CAMA,SAASU,EAAU,CACjB,MAAAC,EAAQ,EACR,KAAAX,EAAO,IACT,EAGG,CACD,MAAMY,EAAM,MAAM,KAAK,CAAE,OAAQD,EAAO,EAExC,OACEH,EAAAA,IAAC,MAAA,CAAI,cAAY,OACd,SAAAI,EAAI,IAAI,CAACC,EAAG,IACXL,EAAAA,IAAC,MAAA,CAAY,MAAO,CAAE,eAAgB,KAAA,EACpC,SAAAA,EAAAA,IAACT,EAAA,CAAS,MAAO,IAAMY,EAAQ,EAAI,MAAQ,OAAQ,KAAAX,CAAA,CAAY,CAAA,EADvD,CAEV,CACD,EACH,CAEJ,CAKA,SAASc,EAAe,CAAE,KAAAd,EAAO,IAAyB,CACxD,aAAQD,EAAA,CAAS,OAAM,GAAC,MAAOC,EAAM,SAAQ,GAAC,CAChD,CAKA,SAASe,EAAe,CACtB,MAAAd,EAAQ,IACR,OAAAe,EAAS,EACX,EAGG,CACD,OACER,EAAAA,IAACT,EAAA,CACC,MAAAE,EACA,KAAK,KACL,SAAQ,GACR,MAAO,CACL,OAAAe,EACA,aAAc,kBAAA,CAChB,CAAA,CAGN,CAKA,SAASC,GAAe,CACtB,OACEC,EAAAA,KAAC,MAAA,CAAI,cAAY,OACf,SAAA,CAAAV,EAAAA,IAACT,EAAA,CAAS,MAAM,MAAM,KAAK,KAAK,MAAO,CAAE,aAAc,EAAA,CAAG,CAAG,EAC7DS,EAAAA,IAACE,EAAA,CAAU,MAAO,CAAA,CAAG,EACrBF,EAAAA,IAACT,EAAA,CAAS,MAAM,MAAM,KAAK,KAAK,MAAO,CAAE,UAAW,GAAG,CAAG,CAAA,EAC5D,CAEJ,CAGAA,EAAS,KAAOU,EAChBV,EAAS,UAAYW,EACrBX,EAAS,OAASe,EAClBf,EAAS,OAASgB,EAClBhB,EAAS,KAAOkB"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { jsx as r, jsxs as m } from "react/jsx-runtime";
|
|
2
|
+
/* empty css */
|
|
3
|
+
function c(e) {
|
|
4
|
+
if (e !== void 0)
|
|
5
|
+
return typeof e == "number" ? `${e}px` : e;
|
|
6
|
+
}
|
|
7
|
+
function t({
|
|
8
|
+
size: e = "md",
|
|
9
|
+
width: n,
|
|
10
|
+
animated: a = !0,
|
|
11
|
+
circle: o = !1,
|
|
12
|
+
ariaHidden: i = !0,
|
|
13
|
+
className: u = "",
|
|
14
|
+
style: l
|
|
15
|
+
}) {
|
|
16
|
+
const s = [
|
|
17
|
+
"ui-skeleton",
|
|
18
|
+
`ui-skeleton--${e}`,
|
|
19
|
+
a && "ui-skeleton--animated",
|
|
20
|
+
o && "ui-skeleton--circle",
|
|
21
|
+
u
|
|
22
|
+
].filter(Boolean).join(" ");
|
|
23
|
+
return /* @__PURE__ */ r(
|
|
24
|
+
"span",
|
|
25
|
+
{
|
|
26
|
+
className: s,
|
|
27
|
+
style: {
|
|
28
|
+
width: c(n),
|
|
29
|
+
display: n ? "block" : void 0,
|
|
30
|
+
...l
|
|
31
|
+
},
|
|
32
|
+
"aria-hidden": i,
|
|
33
|
+
role: "presentation"
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
function f({
|
|
38
|
+
width: e = "100%",
|
|
39
|
+
size: n = "md"
|
|
40
|
+
}) {
|
|
41
|
+
return /* @__PURE__ */ r(t, { width: e, size: n });
|
|
42
|
+
}
|
|
43
|
+
function d({
|
|
44
|
+
lines: e = 3,
|
|
45
|
+
size: n = "md"
|
|
46
|
+
}) {
|
|
47
|
+
const a = Array.from({ length: e });
|
|
48
|
+
return /* @__PURE__ */ r("div", { "aria-hidden": "true", children: a.map((o, i) => /* @__PURE__ */ r("div", { style: { marginBlockEnd: "8px" }, children: /* @__PURE__ */ r(t, { width: i === e - 1 ? "75%" : "100%", size: n }) }, i)) });
|
|
49
|
+
}
|
|
50
|
+
function h({ size: e = 40 }) {
|
|
51
|
+
return /* @__PURE__ */ r(t, { circle: !0, width: e, animated: !0 });
|
|
52
|
+
}
|
|
53
|
+
function p({
|
|
54
|
+
width: e = 100,
|
|
55
|
+
height: n = 36
|
|
56
|
+
}) {
|
|
57
|
+
return /* @__PURE__ */ r(
|
|
58
|
+
t,
|
|
59
|
+
{
|
|
60
|
+
width: e,
|
|
61
|
+
size: "md",
|
|
62
|
+
animated: !0,
|
|
63
|
+
style: {
|
|
64
|
+
height: n,
|
|
65
|
+
borderRadius: "var(--radius-md)"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
function k() {
|
|
71
|
+
return /* @__PURE__ */ m("div", { "aria-hidden": "true", children: [
|
|
72
|
+
/* @__PURE__ */ r(t, { width: "60%", size: "lg", style: { marginBottom: 12 } }),
|
|
73
|
+
/* @__PURE__ */ r(d, { lines: 3 }),
|
|
74
|
+
/* @__PURE__ */ r(t, { width: "40%", size: "md", style: { marginTop: 16 } })
|
|
75
|
+
] });
|
|
76
|
+
}
|
|
77
|
+
t.Text = f;
|
|
78
|
+
t.Paragraph = d;
|
|
79
|
+
t.Avatar = h;
|
|
80
|
+
t.Button = p;
|
|
81
|
+
t.Card = k;
|
|
82
|
+
export {
|
|
83
|
+
t as Skeleton,
|
|
84
|
+
t as default
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=Skeleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Skeleton.js","sources":["../../../../src/components/skeleton/Skeleton.tsx"],"sourcesContent":["/**\r\n * Skeleton.tsx\r\n * Lightweight, accessible skeleton (placeholder) component.\r\n *\r\n * Props:\r\n * - size: visual thickness (xs, sm, md, lg, xl)\r\n * - width: number | string (e.g. 200, \"50%\", \"100px\")\r\n * - animated: whether to show shimmer (respects prefers-reduced-motion)\r\n * - circle: renders as a circle (useful for avatars)\r\n * - className: pass-through for custom styling\r\n *\r\n * Accessibility:\r\n * - role=\"status\" with aria-busy on parent usage is recommended by developer.\r\n * - For individual skeletons that should be ignored by assistive tech set aria-hidden=true.\r\n */\r\n/**\r\n * Skeleton.tsx + Helper Components\r\n * --------------------------------\r\n * Adds:\r\n * - Skeleton.Text\r\n * - Skeleton.Paragraph\r\n * - Skeleton.Avatar\r\n * - Skeleton.Button\r\n * - Skeleton.Card\r\n */\r\n\r\nimport React from 'react';\r\nimport './Skeleton.css';\r\n\r\ntype Size = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\ninterface SkeletonProps {\r\n size?: Size;\r\n width?: number | string;\r\n animated?: boolean;\r\n circle?: boolean;\r\n ariaHidden?: boolean;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nfunction formatWidth(w?: number | string): string | undefined {\r\n if (w === undefined) return undefined;\r\n if (typeof w === 'number') return `${w}px`;\r\n return w;\r\n}\r\n\r\nexport function Skeleton({\r\n size = 'md',\r\n width,\r\n animated = true,\r\n circle = false,\r\n ariaHidden = true,\r\n className = '',\r\n style,\r\n}: SkeletonProps) {\r\n const classes = [\r\n 'ui-skeleton',\r\n `ui-skeleton--${size}`,\r\n animated && 'ui-skeleton--animated',\r\n circle && 'ui-skeleton--circle',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n return (\r\n <span\r\n className={classes}\r\n style={{\r\n width: formatWidth(width),\r\n display: width ? 'block' : undefined,\r\n ...style,\r\n }}\r\n aria-hidden={ariaHidden}\r\n role=\"presentation\"\r\n />\r\n );\r\n}\r\n\r\n/* -------------------------------------------------------\r\n * Helper Components\r\n * ------------------------------------------------------*/\r\n\r\n/**\r\n * Simple text line.\r\n * Default width: 100%\r\n */\r\nfunction Text({\r\n width = '100%',\r\n size = 'md',\r\n}: {\r\n width?: number | string;\r\n size?: Size;\r\n}) {\r\n return <Skeleton width={width} size={size} />;\r\n}\r\n\r\n/**\r\n * Paragraph: multiple lines of text skeleton\r\n * lines default = 3\r\n */\r\nfunction Paragraph({\r\n lines = 3,\r\n size = 'md',\r\n}: {\r\n lines?: number;\r\n size?: Size;\r\n}) {\r\n const arr = Array.from({ length: lines });\r\n\r\n return (\r\n <div aria-hidden=\"true\">\r\n {arr.map((_, i) => (\r\n <div key={i} style={{ marginBlockEnd: '8px' }}>\r\n <Skeleton width={i === lines - 1 ? '75%' : '100%'} size={size} />\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * Avatar placeholder, circle with dynamic size\r\n */\r\nfunction AvatarSkeleton({ size = 40 }: { size?: number }) {\r\n return <Skeleton circle width={size} animated />;\r\n}\r\n\r\n/**\r\n * Button skeleton (pill-like shape)\r\n */\r\nfunction ButtonSkeleton({\r\n width = 100,\r\n height = 36,\r\n}: {\r\n width?: number;\r\n height?: number;\r\n}) {\r\n return (\r\n <Skeleton\r\n width={width}\r\n size=\"md\"\r\n animated\r\n style={{\r\n height,\r\n borderRadius: 'var(--radius-md)',\r\n }}\r\n />\r\n );\r\n}\r\n\r\n/**\r\n * Card Skeleton: header + lines + footer bar\r\n */\r\nfunction CardSkeleton() {\r\n return (\r\n <div aria-hidden=\"true\">\r\n <Skeleton width=\"60%\" size=\"lg\" style={{ marginBottom: 12 }} />\r\n <Paragraph lines={3} />\r\n <Skeleton width=\"40%\" size=\"md\" style={{ marginTop: 16 }} />\r\n </div>\r\n );\r\n}\r\n\r\n/* Attach helpers */\r\nSkeleton.Text = Text;\r\nSkeleton.Paragraph = Paragraph;\r\nSkeleton.Avatar = AvatarSkeleton;\r\nSkeleton.Button = ButtonSkeleton;\r\nSkeleton.Card = CardSkeleton;\r\n\r\nexport default Skeleton;\r\n"],"names":["formatWidth","w","Skeleton","size","width","animated","circle","ariaHidden","className","style","classes","jsx","Text","Paragraph","lines","arr","_","AvatarSkeleton","ButtonSkeleton","height","CardSkeleton","jsxs"],"mappings":";;AAyCA,SAASA,EAAYC,GAAyC;AAC5D,MAAIA,MAAM;AACV,WAAI,OAAOA,KAAM,WAAiB,GAAGA,CAAC,OAC/BA;AACT;AAEO,SAASC,EAAS;AAAA,EACvB,MAAAC,IAAO;AAAA,EACP,OAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,QAAAC,IAAS;AAAA,EACT,YAAAC,IAAa;AAAA,EACb,WAAAC,IAAY;AAAA,EACZ,OAAAC;AACF,GAAkB;AAChB,QAAMC,IAAU;AAAA,IACd;AAAA,IACA,gBAAgBP,CAAI;AAAA,IACpBE,KAAY;AAAA,IACZC,KAAU;AAAA,IACVE;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWD;AAAA,MACX,OAAO;AAAA,QACL,OAAOV,EAAYI,CAAK;AAAA,QACxB,SAASA,IAAQ,UAAU;AAAA,QAC3B,GAAGK;AAAA,MAAA;AAAA,MAEL,eAAaF;AAAA,MACb,MAAK;AAAA,IAAA;AAAA,EAAA;AAGX;AAUA,SAASK,EAAK;AAAA,EACZ,OAAAR,IAAQ;AAAA,EACR,MAAAD,IAAO;AACT,GAGG;AACD,SAAO,gBAAAQ,EAACT,GAAA,EAAS,OAAAE,GAAc,MAAAD,EAAA,CAAY;AAC7C;AAMA,SAASU,EAAU;AAAA,EACjB,OAAAC,IAAQ;AAAA,EACR,MAAAX,IAAO;AACT,GAGG;AACD,QAAMY,IAAM,MAAM,KAAK,EAAE,QAAQD,GAAO;AAExC,SACE,gBAAAH,EAAC,OAAA,EAAI,eAAY,QACd,UAAAI,EAAI,IAAI,CAACC,GAAG,MACX,gBAAAL,EAAC,OAAA,EAAY,OAAO,EAAE,gBAAgB,MAAA,GACpC,UAAA,gBAAAA,EAACT,GAAA,EAAS,OAAO,MAAMY,IAAQ,IAAI,QAAQ,QAAQ,MAAAX,EAAA,CAAY,EAAA,GADvD,CAEV,CACD,GACH;AAEJ;AAKA,SAASc,EAAe,EAAE,MAAAd,IAAO,MAAyB;AACxD,2BAAQD,GAAA,EAAS,QAAM,IAAC,OAAOC,GAAM,UAAQ,IAAC;AAChD;AAKA,SAASe,EAAe;AAAA,EACtB,OAAAd,IAAQ;AAAA,EACR,QAAAe,IAAS;AACX,GAGG;AACD,SACE,gBAAAR;AAAA,IAACT;AAAA,IAAA;AAAA,MACC,OAAAE;AAAA,MACA,MAAK;AAAA,MACL,UAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAAe;AAAA,QACA,cAAc;AAAA,MAAA;AAAA,IAChB;AAAA,EAAA;AAGN;AAKA,SAASC,IAAe;AACtB,SACE,gBAAAC,EAAC,OAAA,EAAI,eAAY,QACf,UAAA;AAAA,IAAA,gBAAAV,EAACT,GAAA,EAAS,OAAM,OAAM,MAAK,MAAK,OAAO,EAAE,cAAc,GAAA,EAAG,CAAG;AAAA,IAC7D,gBAAAS,EAACE,GAAA,EAAU,OAAO,EAAA,CAAG;AAAA,IACrB,gBAAAF,EAACT,GAAA,EAAS,OAAM,OAAM,MAAK,MAAK,OAAO,EAAE,WAAW,KAAG,CAAG;AAAA,EAAA,GAC5D;AAEJ;AAGAA,EAAS,OAAOU;AAChBV,EAAS,YAAYW;AACrBX,EAAS,SAASe;AAClBf,EAAS,SAASgB;AAClBhB,EAAS,OAAOkB;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("react/jsx-runtime"),o=require("react");;/* empty css */function R({min:n=0,max:a=100,step:c=1,value:g,defaultValue:m,onChange:b,disabled:s=!1,className:S=""}){const k=g!==void 0,[C,M]=o.useState(m??n),r=k?g:C,u=o.useCallback(t=>{const e=Math.min(a,Math.max(n,t)),d=Math.round(e/c)*c;k||M(d),b?.(d)},[k,a,n,c,b]),E=o.useRef(null),D=(r-n)/(a-n)*100,w=o.useCallback(t=>{const e=E.current;if(!e)return r;const d=e.getBoundingClientRect(),y=(t-d.left)/d.width;return n+y*(a-n)},[n,a,r]),[v,L]=o.useState(!1),f=o.useCallback(t=>{if(s)return;L(!0);const e="touches"in t?t.touches[0].clientX:t.clientX;u(w(e))},[s,w,u]),i=o.useCallback(t=>{if(!v||s)return;const e=t.touches?.[0]?.clientX??t.clientX;u(w(e))},[v,s,w,u]),l=o.useCallback(()=>{L(!1)},[]);o.useEffect(()=>{if(v)return window.addEventListener("mousemove",i),window.addEventListener("touchmove",i),window.addEventListener("mouseup",l),window.addEventListener("touchend",l),()=>{window.removeEventListener("mousemove",i),window.removeEventListener("touchmove",i),window.removeEventListener("mouseup",l),window.removeEventListener("touchend",l)}},[v,i,l]);const j=o.useCallback(t=>{if(s)return;let e=r;switch(t.key){case"ArrowRight":case"ArrowUp":e=r+c;break;case"ArrowLeft":case"ArrowDown":e=r-c;break;case"PageUp":e=r+c*10;break;case"PageDown":e=r-c*10;break;case"Home":e=n;break;case"End":e=a;break;default:return}t.preventDefault(),u(e)},[s,r,c,n,a,u]);return h.jsx("div",{className:`ui-slider ${s?"disabled":""} ${S}`,children:h.jsxs("div",{ref:E,className:"ui-slider-track",onMouseDown:f,onTouchStart:f,children:[h.jsx("div",{className:"ui-slider-fill",style:{width:`${D}%`}}),h.jsx("div",{className:"ui-slider-thumb",role:"slider",tabIndex:s?-1:0,"aria-valuemin":n,"aria-valuemax":a,"aria-valuenow":r,"aria-disabled":s||void 0,onKeyDown:j,onMouseDown:f,onTouchStart:f,style:{left:`${D}%`}})]})})}exports.Slider=R;
|
|
2
|
+
//# sourceMappingURL=Slider.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Slider.cjs","sources":["../../../../src/components/slider/Slider.tsx"],"sourcesContent":["/**\r\n * Slider.tsx\r\n * -----------\r\n * Fully accessible single-thumb slider.\r\n * WAI-ARIA compliant, supports pointer, touch, keyboard.\r\n */\r\n\r\nimport React, { useRef, useEffect, useState, useCallback } from 'react';\r\nimport './Slider.css';\r\n\r\ninterface SliderProps {\r\n min?: number;\r\n max?: number;\r\n step?: number;\r\n value?: number;\r\n defaultValue?: number;\r\n onChange?: (value: number) => void;\r\n disabled?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport function Slider({\r\n min = 0,\r\n max = 100,\r\n step = 1,\r\n value,\r\n defaultValue,\r\n onChange,\r\n disabled = false,\r\n className = '',\r\n}: SliderProps) {\r\n const isControlled = value !== undefined;\r\n\r\n const [internalValue, setInternalValue] = useState(defaultValue ?? min);\r\n\r\n const val = isControlled ? value : internalValue;\r\n\r\n /** Safe setter */\r\n const setVal = useCallback(\r\n (v: number) => {\r\n const clamped = Math.min(max, Math.max(min, v));\r\n const stepped = Math.round(clamped / step) * step;\r\n\r\n if (!isControlled) setInternalValue(stepped);\r\n onChange?.(stepped);\r\n },\r\n [isControlled, max, min, step, onChange]\r\n );\r\n\r\n const trackRef = useRef<HTMLDivElement | null>(null);\r\n\r\n /** Calculate percentage for UI */\r\n const percent = ((val - min) / (max - min)) * 100;\r\n\r\n /** Pixel → value conversion (FIXED: wrapped in useCallback) */\r\n const pixelToValue = useCallback(\r\n (clientX: number) => {\r\n const track = trackRef.current;\r\n if (!track) return val;\r\n\r\n const rect = track.getBoundingClientRect();\r\n const x = clientX - rect.left;\r\n const ratio = x / rect.width;\r\n const rawValue = min + ratio * (max - min);\r\n return rawValue;\r\n },\r\n [min, max, val]\r\n );\r\n\r\n /** Dragging state */\r\n const [dragging, setDragging] = useState(false);\r\n\r\n const startDrag = useCallback(\r\n (e: React.MouseEvent | React.TouchEvent) => {\r\n if (disabled) return;\r\n setDragging(true);\r\n\r\n const clientX = 'touches' in e ? e.touches[0].clientX : e.clientX;\r\n\r\n setVal(pixelToValue(clientX));\r\n },\r\n [disabled, pixelToValue, setVal]\r\n );\r\n\r\n const onMove = useCallback(\r\n (e: MouseEvent | TouchEvent) => {\r\n if (!dragging || disabled) return;\r\n\r\n const clientX =\r\n (e as TouchEvent).touches?.[0]?.clientX ?? (e as MouseEvent).clientX;\r\n\r\n setVal(pixelToValue(clientX));\r\n },\r\n [dragging, disabled, pixelToValue, setVal]\r\n );\r\n\r\n const endDrag = useCallback(() => {\r\n setDragging(false);\r\n }, []);\r\n\r\n /** Global listeners while dragging */\r\n useEffect(() => {\r\n if (!dragging) return;\r\n\r\n window.addEventListener('mousemove', onMove);\r\n window.addEventListener('touchmove', onMove);\r\n window.addEventListener('mouseup', endDrag);\r\n window.addEventListener('touchend', endDrag);\r\n\r\n return () => {\r\n window.removeEventListener('mousemove', onMove);\r\n window.removeEventListener('touchmove', onMove);\r\n window.removeEventListener('mouseup', endDrag);\r\n window.removeEventListener('touchend', endDrag);\r\n };\r\n }, [dragging, onMove, endDrag]);\r\n\r\n /** Keyboard handling */\r\n const onKeyDown = useCallback(\r\n (e: React.KeyboardEvent) => {\r\n if (disabled) return;\r\n\r\n let next = val;\r\n\r\n switch (e.key) {\r\n case 'ArrowRight':\r\n case 'ArrowUp':\r\n next = val + step;\r\n break;\r\n case 'ArrowLeft':\r\n case 'ArrowDown':\r\n next = val - step;\r\n break;\r\n case 'PageUp':\r\n next = val + step * 10;\r\n break;\r\n case 'PageDown':\r\n next = val - step * 10;\r\n break;\r\n case 'Home':\r\n next = min;\r\n break;\r\n case 'End':\r\n next = max;\r\n break;\r\n default:\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n setVal(next);\r\n },\r\n [disabled, val, step, min, max, setVal]\r\n );\r\n\r\n return (\r\n <div className={`ui-slider ${disabled ? 'disabled' : ''} ${className}`}>\r\n <div\r\n ref={trackRef}\r\n className=\"ui-slider-track\"\r\n onMouseDown={startDrag}\r\n onTouchStart={startDrag}\r\n >\r\n <div className=\"ui-slider-fill\" style={{ width: `${percent}%` }} />\r\n\r\n <div\r\n className=\"ui-slider-thumb\"\r\n role=\"slider\"\r\n tabIndex={disabled ? -1 : 0}\r\n aria-valuemin={min}\r\n aria-valuemax={max}\r\n aria-valuenow={val}\r\n aria-disabled={disabled || undefined}\r\n onKeyDown={onKeyDown}\r\n onMouseDown={startDrag}\r\n onTouchStart={startDrag}\r\n style={{ left: `${percent}%` }}\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["Slider","min","max","step","value","defaultValue","onChange","disabled","className","isControlled","internalValue","setInternalValue","useState","val","setVal","useCallback","v","clamped","stepped","trackRef","useRef","percent","pixelToValue","clientX","track","rect","ratio","dragging","setDragging","startDrag","e","onMove","endDrag","useEffect","onKeyDown","next","jsx","jsxs"],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { jsx as g, jsxs as R } from "react/jsx-runtime";
|
|
2
|
+
import { useState as p, useCallback as i, useRef as S, useEffect as $ } from "react";
|
|
3
|
+
/* empty css */
|
|
4
|
+
function I({
|
|
5
|
+
min: n = 0,
|
|
6
|
+
max: s = 100,
|
|
7
|
+
step: c = 1,
|
|
8
|
+
value: k,
|
|
9
|
+
defaultValue: M,
|
|
10
|
+
onChange: m,
|
|
11
|
+
disabled: o = !1,
|
|
12
|
+
className: V = ""
|
|
13
|
+
}) {
|
|
14
|
+
const h = k !== void 0, [X, y] = p(M ?? n), r = h ? k : X, a = i(
|
|
15
|
+
(t) => {
|
|
16
|
+
const e = Math.min(s, Math.max(n, t)), d = Math.round(e / c) * c;
|
|
17
|
+
h || y(d), m?.(d);
|
|
18
|
+
},
|
|
19
|
+
[h, s, n, c, m]
|
|
20
|
+
), E = S(null), D = (r - n) / (s - n) * 100, w = i(
|
|
21
|
+
(t) => {
|
|
22
|
+
const e = E.current;
|
|
23
|
+
if (!e) return r;
|
|
24
|
+
const d = e.getBoundingClientRect(), N = (t - d.left) / d.width;
|
|
25
|
+
return n + N * (s - n);
|
|
26
|
+
},
|
|
27
|
+
[n, s, r]
|
|
28
|
+
), [v, L] = p(!1), f = i(
|
|
29
|
+
(t) => {
|
|
30
|
+
if (o) return;
|
|
31
|
+
L(!0);
|
|
32
|
+
const e = "touches" in t ? t.touches[0].clientX : t.clientX;
|
|
33
|
+
a(w(e));
|
|
34
|
+
},
|
|
35
|
+
[o, w, a]
|
|
36
|
+
), u = i(
|
|
37
|
+
(t) => {
|
|
38
|
+
if (!v || o) return;
|
|
39
|
+
const e = t.touches?.[0]?.clientX ?? t.clientX;
|
|
40
|
+
a(w(e));
|
|
41
|
+
},
|
|
42
|
+
[v, o, w, a]
|
|
43
|
+
), l = i(() => {
|
|
44
|
+
L(!1);
|
|
45
|
+
}, []);
|
|
46
|
+
$(() => {
|
|
47
|
+
if (v)
|
|
48
|
+
return window.addEventListener("mousemove", u), window.addEventListener("touchmove", u), window.addEventListener("mouseup", l), window.addEventListener("touchend", l), () => {
|
|
49
|
+
window.removeEventListener("mousemove", u), window.removeEventListener("touchmove", u), window.removeEventListener("mouseup", l), window.removeEventListener("touchend", l);
|
|
50
|
+
};
|
|
51
|
+
}, [v, u, l]);
|
|
52
|
+
const A = i(
|
|
53
|
+
(t) => {
|
|
54
|
+
if (o) return;
|
|
55
|
+
let e = r;
|
|
56
|
+
switch (t.key) {
|
|
57
|
+
case "ArrowRight":
|
|
58
|
+
case "ArrowUp":
|
|
59
|
+
e = r + c;
|
|
60
|
+
break;
|
|
61
|
+
case "ArrowLeft":
|
|
62
|
+
case "ArrowDown":
|
|
63
|
+
e = r - c;
|
|
64
|
+
break;
|
|
65
|
+
case "PageUp":
|
|
66
|
+
e = r + c * 10;
|
|
67
|
+
break;
|
|
68
|
+
case "PageDown":
|
|
69
|
+
e = r - c * 10;
|
|
70
|
+
break;
|
|
71
|
+
case "Home":
|
|
72
|
+
e = n;
|
|
73
|
+
break;
|
|
74
|
+
case "End":
|
|
75
|
+
e = s;
|
|
76
|
+
break;
|
|
77
|
+
default:
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
t.preventDefault(), a(e);
|
|
81
|
+
},
|
|
82
|
+
[o, r, c, n, s, a]
|
|
83
|
+
);
|
|
84
|
+
return /* @__PURE__ */ g("div", { className: `ui-slider ${o ? "disabled" : ""} ${V}`, children: /* @__PURE__ */ R(
|
|
85
|
+
"div",
|
|
86
|
+
{
|
|
87
|
+
ref: E,
|
|
88
|
+
className: "ui-slider-track",
|
|
89
|
+
onMouseDown: f,
|
|
90
|
+
onTouchStart: f,
|
|
91
|
+
children: [
|
|
92
|
+
/* @__PURE__ */ g("div", { className: "ui-slider-fill", style: { width: `${D}%` } }),
|
|
93
|
+
/* @__PURE__ */ g(
|
|
94
|
+
"div",
|
|
95
|
+
{
|
|
96
|
+
className: "ui-slider-thumb",
|
|
97
|
+
role: "slider",
|
|
98
|
+
tabIndex: o ? -1 : 0,
|
|
99
|
+
"aria-valuemin": n,
|
|
100
|
+
"aria-valuemax": s,
|
|
101
|
+
"aria-valuenow": r,
|
|
102
|
+
"aria-disabled": o || void 0,
|
|
103
|
+
onKeyDown: A,
|
|
104
|
+
onMouseDown: f,
|
|
105
|
+
onTouchStart: f,
|
|
106
|
+
style: { left: `${D}%` }
|
|
107
|
+
}
|
|
108
|
+
)
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
) });
|
|
112
|
+
}
|
|
113
|
+
export {
|
|
114
|
+
I as Slider
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=Slider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Slider.js","sources":["../../../../src/components/slider/Slider.tsx"],"sourcesContent":["/**\r\n * Slider.tsx\r\n * -----------\r\n * Fully accessible single-thumb slider.\r\n * WAI-ARIA compliant, supports pointer, touch, keyboard.\r\n */\r\n\r\nimport React, { useRef, useEffect, useState, useCallback } from 'react';\r\nimport './Slider.css';\r\n\r\ninterface SliderProps {\r\n min?: number;\r\n max?: number;\r\n step?: number;\r\n value?: number;\r\n defaultValue?: number;\r\n onChange?: (value: number) => void;\r\n disabled?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport function Slider({\r\n min = 0,\r\n max = 100,\r\n step = 1,\r\n value,\r\n defaultValue,\r\n onChange,\r\n disabled = false,\r\n className = '',\r\n}: SliderProps) {\r\n const isControlled = value !== undefined;\r\n\r\n const [internalValue, setInternalValue] = useState(defaultValue ?? min);\r\n\r\n const val = isControlled ? value : internalValue;\r\n\r\n /** Safe setter */\r\n const setVal = useCallback(\r\n (v: number) => {\r\n const clamped = Math.min(max, Math.max(min, v));\r\n const stepped = Math.round(clamped / step) * step;\r\n\r\n if (!isControlled) setInternalValue(stepped);\r\n onChange?.(stepped);\r\n },\r\n [isControlled, max, min, step, onChange]\r\n );\r\n\r\n const trackRef = useRef<HTMLDivElement | null>(null);\r\n\r\n /** Calculate percentage for UI */\r\n const percent = ((val - min) / (max - min)) * 100;\r\n\r\n /** Pixel → value conversion (FIXED: wrapped in useCallback) */\r\n const pixelToValue = useCallback(\r\n (clientX: number) => {\r\n const track = trackRef.current;\r\n if (!track) return val;\r\n\r\n const rect = track.getBoundingClientRect();\r\n const x = clientX - rect.left;\r\n const ratio = x / rect.width;\r\n const rawValue = min + ratio * (max - min);\r\n return rawValue;\r\n },\r\n [min, max, val]\r\n );\r\n\r\n /** Dragging state */\r\n const [dragging, setDragging] = useState(false);\r\n\r\n const startDrag = useCallback(\r\n (e: React.MouseEvent | React.TouchEvent) => {\r\n if (disabled) return;\r\n setDragging(true);\r\n\r\n const clientX = 'touches' in e ? e.touches[0].clientX : e.clientX;\r\n\r\n setVal(pixelToValue(clientX));\r\n },\r\n [disabled, pixelToValue, setVal]\r\n );\r\n\r\n const onMove = useCallback(\r\n (e: MouseEvent | TouchEvent) => {\r\n if (!dragging || disabled) return;\r\n\r\n const clientX =\r\n (e as TouchEvent).touches?.[0]?.clientX ?? (e as MouseEvent).clientX;\r\n\r\n setVal(pixelToValue(clientX));\r\n },\r\n [dragging, disabled, pixelToValue, setVal]\r\n );\r\n\r\n const endDrag = useCallback(() => {\r\n setDragging(false);\r\n }, []);\r\n\r\n /** Global listeners while dragging */\r\n useEffect(() => {\r\n if (!dragging) return;\r\n\r\n window.addEventListener('mousemove', onMove);\r\n window.addEventListener('touchmove', onMove);\r\n window.addEventListener('mouseup', endDrag);\r\n window.addEventListener('touchend', endDrag);\r\n\r\n return () => {\r\n window.removeEventListener('mousemove', onMove);\r\n window.removeEventListener('touchmove', onMove);\r\n window.removeEventListener('mouseup', endDrag);\r\n window.removeEventListener('touchend', endDrag);\r\n };\r\n }, [dragging, onMove, endDrag]);\r\n\r\n /** Keyboard handling */\r\n const onKeyDown = useCallback(\r\n (e: React.KeyboardEvent) => {\r\n if (disabled) return;\r\n\r\n let next = val;\r\n\r\n switch (e.key) {\r\n case 'ArrowRight':\r\n case 'ArrowUp':\r\n next = val + step;\r\n break;\r\n case 'ArrowLeft':\r\n case 'ArrowDown':\r\n next = val - step;\r\n break;\r\n case 'PageUp':\r\n next = val + step * 10;\r\n break;\r\n case 'PageDown':\r\n next = val - step * 10;\r\n break;\r\n case 'Home':\r\n next = min;\r\n break;\r\n case 'End':\r\n next = max;\r\n break;\r\n default:\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n setVal(next);\r\n },\r\n [disabled, val, step, min, max, setVal]\r\n );\r\n\r\n return (\r\n <div className={`ui-slider ${disabled ? 'disabled' : ''} ${className}`}>\r\n <div\r\n ref={trackRef}\r\n className=\"ui-slider-track\"\r\n onMouseDown={startDrag}\r\n onTouchStart={startDrag}\r\n >\r\n <div className=\"ui-slider-fill\" style={{ width: `${percent}%` }} />\r\n\r\n <div\r\n className=\"ui-slider-thumb\"\r\n role=\"slider\"\r\n tabIndex={disabled ? -1 : 0}\r\n aria-valuemin={min}\r\n aria-valuemax={max}\r\n aria-valuenow={val}\r\n aria-disabled={disabled || undefined}\r\n onKeyDown={onKeyDown}\r\n onMouseDown={startDrag}\r\n onTouchStart={startDrag}\r\n style={{ left: `${percent}%` }}\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["Slider","min","max","step","value","defaultValue","onChange","disabled","className","isControlled","internalValue","setInternalValue","useState","val","setVal","useCallback","v","clamped","stepped","trackRef","useRef","percent","pixelToValue","clientX","track","rect","ratio","dragging","setDragging","startDrag","e","onMove","endDrag","useEffect","onKeyDown","next","jsx","jsxs"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime");;/* empty css */function s({size:i="md",className:n="",label:r="Loading"}){return e.jsx("div",{className:`ui-spinner ui-spinner--${i} ${n}`,role:"status","aria-label":r,children:e.jsx("div",{className:"ui-spinner-circle"})})}exports.Spinner=s;
|
|
2
|
+
//# sourceMappingURL=Spinner.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Spinner.cjs","sources":["../../../../src/components/spinner/Spinner.tsx"],"sourcesContent":["/**\r\n * Spinner.tsx — FINAL VERSION\r\n * ----------------------------\r\n * Accessible, theme-aware loading indicator.\r\n */\r\n\r\nimport './Spinner.css';\r\n\r\nexport interface SpinnerProps {\r\n size?: 'sm' | 'md' | 'lg';\r\n className?: string;\r\n label?: string; // screen reader text\r\n}\r\n\r\nexport function Spinner({\r\n size = 'md',\r\n className = '',\r\n label = 'Loading',\r\n}: SpinnerProps) {\r\n return (\r\n <div\r\n className={`ui-spinner ui-spinner--${size} ${className}`}\r\n role=\"status\"\r\n aria-label={label}\r\n >\r\n <div className=\"ui-spinner-circle\" />\r\n </div>\r\n );\r\n}\r\n"],"names":["Spinner","size","className","label","jsx"],"mappings":"kJAcO,SAASA,EAAQ,CACtB,KAAAC,EAAO,KACP,UAAAC,EAAY,GACZ,MAAAC,EAAQ,SACV,EAAiB,CACf,OACEC,EAAAA,IAAC,MAAA,CACC,UAAW,0BAA0BH,CAAI,IAAIC,CAAS,GACtD,KAAK,SACL,aAAYC,EAEZ,SAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,mBAAA,CAAoB,CAAA,CAAA,CAGzC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as i } from "react/jsx-runtime";
|
|
2
|
+
/* empty css */
|
|
3
|
+
function l({
|
|
4
|
+
size: r = "md",
|
|
5
|
+
className: n = "",
|
|
6
|
+
label: e = "Loading"
|
|
7
|
+
}) {
|
|
8
|
+
return /* @__PURE__ */ i(
|
|
9
|
+
"div",
|
|
10
|
+
{
|
|
11
|
+
className: `ui-spinner ui-spinner--${r} ${n}`,
|
|
12
|
+
role: "status",
|
|
13
|
+
"aria-label": e,
|
|
14
|
+
children: /* @__PURE__ */ i("div", { className: "ui-spinner-circle" })
|
|
15
|
+
}
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
l as Spinner
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=Spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Spinner.js","sources":["../../../../src/components/spinner/Spinner.tsx"],"sourcesContent":["/**\r\n * Spinner.tsx — FINAL VERSION\r\n * ----------------------------\r\n * Accessible, theme-aware loading indicator.\r\n */\r\n\r\nimport './Spinner.css';\r\n\r\nexport interface SpinnerProps {\r\n size?: 'sm' | 'md' | 'lg';\r\n className?: string;\r\n label?: string; // screen reader text\r\n}\r\n\r\nexport function Spinner({\r\n size = 'md',\r\n className = '',\r\n label = 'Loading',\r\n}: SpinnerProps) {\r\n return (\r\n <div\r\n className={`ui-spinner ui-spinner--${size} ${className}`}\r\n role=\"status\"\r\n aria-label={label}\r\n >\r\n <div className=\"ui-spinner-circle\" />\r\n </div>\r\n );\r\n}\r\n"],"names":["Spinner","size","className","label","jsx"],"mappings":";;AAcO,SAASA,EAAQ;AAAA,EACtB,MAAAC,IAAO;AAAA,EACP,WAAAC,IAAY;AAAA,EACZ,OAAAC,IAAQ;AACV,GAAiB;AACf,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,0BAA0BH,CAAI,IAAIC,CAAS;AAAA,MACtD,MAAK;AAAA,MACL,cAAYC;AAAA,MAEZ,UAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,oBAAA,CAAoB;AAAA,IAAA;AAAA,EAAA;AAGzC;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime");;/* empty css */function u({steps:r,active:l,onChange:c,className:p=""}){const n=t=>typeof t=="string"?t:t.label;return e.jsx("nav",{className:`ui-stepper ${p}`,"aria-label":"Progress Steps",children:e.jsx("ol",{className:"ui-stepper-list",children:r.map((t,s)=>{const i=s===l,a=s<l;return e.jsxs("li",{className:`
|
|
2
|
+
ui-stepper-item
|
|
3
|
+
${i?"active":""}
|
|
4
|
+
${a?"completed":""}
|
|
5
|
+
`,children:[e.jsxs("button",{className:"ui-stepper-button","aria-current":i?"step":void 0,onClick:()=>c?.(s),children:[e.jsx("div",{className:"ui-stepper-circle",children:a?"✓":s+1}),e.jsx("span",{className:"ui-stepper-label",children:n(t)})]}),s!==r.length-1&&e.jsx("div",{className:"ui-stepper-line"})]},s)})})})}exports.Stepper=u;
|
|
6
|
+
//# sourceMappingURL=Stepper.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stepper.cjs","sources":["../../../../src/components/stepper/Stepper.tsx"],"sourcesContent":["/**\r\n * Stepper.tsx — FINAL VERSION\r\n * ----------------------------\r\n * Features:\r\n * - Linear step navigation\r\n * - Clickable steps\r\n * - Keyboard navigation\r\n * - ARIA labels\r\n * - Full theme support\r\n * - Minimal, clean API\r\n */\r\n\r\nimport React from 'react';\r\nimport './Stepper.css';\r\n\r\nexport interface StepItem {\r\n label: React.ReactNode;\r\n}\r\n\r\nexport interface StepperProps {\r\n steps: (string | StepItem)[];\r\n active: number; // 0-based active index\r\n onChange?: (index: number) => void;\r\n className?: string;\r\n}\r\n\r\nexport function Stepper({\r\n steps,\r\n active,\r\n onChange,\r\n className = '',\r\n}: StepperProps) {\r\n const getLabel = (s: string | StepItem) =>\r\n typeof s === 'string' ? s : s.label;\r\n\r\n return (\r\n <nav className={`ui-stepper ${className}`} aria-label=\"Progress Steps\">\r\n <ol className=\"ui-stepper-list\">\r\n {steps.map((step, index) => {\r\n const isActive = index === active;\r\n const isCompleted = index < active;\r\n\r\n return (\r\n <li\r\n key={index}\r\n className={`\r\n ui-stepper-item \r\n ${isActive ? 'active' : ''} \r\n ${isCompleted ? 'completed' : ''}\r\n `}\r\n >\r\n <button\r\n className=\"ui-stepper-button\"\r\n aria-current={isActive ? 'step' : undefined}\r\n onClick={() => onChange?.(index)}\r\n >\r\n <div className=\"ui-stepper-circle\">\r\n {isCompleted ? '✓' : index + 1}\r\n </div>\r\n\r\n <span className=\"ui-stepper-label\">{getLabel(step)}</span>\r\n </button>\r\n\r\n {/* Connector Line */}\r\n {index !== steps.length - 1 && (\r\n <div className=\"ui-stepper-line\" />\r\n )}\r\n </li>\r\n );\r\n })}\r\n </ol>\r\n </nav>\r\n );\r\n}\r\n"],"names":["Stepper","steps","active","onChange","className","getLabel","s","jsx","step","index","isActive","isCompleted","jsxs"],"mappings":"kJA0BO,SAASA,EAAQ,CACtB,MAAAC,EACA,OAAAC,EACA,SAAAC,EACA,UAAAC,EAAY,EACd,EAAiB,CACf,MAAMC,EAAYC,GAChB,OAAOA,GAAM,SAAWA,EAAIA,EAAE,MAEhC,aACG,MAAA,CAAI,UAAW,cAAcF,CAAS,GAAI,aAAW,iBACpD,SAAAG,EAAAA,IAAC,KAAA,CAAG,UAAU,kBACX,SAAAN,EAAM,IAAI,CAACO,EAAMC,IAAU,CAC1B,MAAMC,EAAWD,IAAUP,EACrBS,EAAcF,EAAQP,EAE5B,OACEU,EAAAA,KAAC,KAAA,CAEC,UAAW;AAAA;AAAA,kBAEPF,EAAW,SAAW,EAAE;AAAA,kBACxBC,EAAc,YAAc,EAAE;AAAA,gBAGlC,SAAA,CAAAC,EAAAA,KAAC,SAAA,CACC,UAAU,oBACV,eAAcF,EAAW,OAAS,OAClC,QAAS,IAAMP,IAAWM,CAAK,EAE/B,SAAA,CAAAF,MAAC,OAAI,UAAU,oBACZ,SAAAI,EAAc,IAAMF,EAAQ,EAC/B,QAEC,OAAA,CAAK,UAAU,mBAAoB,SAAAJ,EAASG,CAAI,CAAA,CAAE,CAAA,CAAA,CAAA,EAIpDC,IAAUR,EAAM,OAAS,GACxBM,EAAAA,IAAC,MAAA,CAAI,UAAU,iBAAA,CAAkB,CAAA,CAAA,EArB9BE,CAAA,CAyBX,CAAC,EACH,EACF,CAEJ"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsx as t, jsxs as p } from "react/jsx-runtime";
|
|
2
|
+
/* empty css */
|
|
3
|
+
function h({
|
|
4
|
+
steps: r,
|
|
5
|
+
active: l,
|
|
6
|
+
onChange: c,
|
|
7
|
+
className: n = ""
|
|
8
|
+
}) {
|
|
9
|
+
const o = (s) => typeof s == "string" ? s : s.label;
|
|
10
|
+
return /* @__PURE__ */ t("nav", { className: `ui-stepper ${n}`, "aria-label": "Progress Steps", children: /* @__PURE__ */ t("ol", { className: "ui-stepper-list", children: r.map((s, e) => {
|
|
11
|
+
const i = e === l, a = e < l;
|
|
12
|
+
return /* @__PURE__ */ p(
|
|
13
|
+
"li",
|
|
14
|
+
{
|
|
15
|
+
className: `
|
|
16
|
+
ui-stepper-item
|
|
17
|
+
${i ? "active" : ""}
|
|
18
|
+
${a ? "completed" : ""}
|
|
19
|
+
`,
|
|
20
|
+
children: [
|
|
21
|
+
/* @__PURE__ */ p(
|
|
22
|
+
"button",
|
|
23
|
+
{
|
|
24
|
+
className: "ui-stepper-button",
|
|
25
|
+
"aria-current": i ? "step" : void 0,
|
|
26
|
+
onClick: () => c?.(e),
|
|
27
|
+
children: [
|
|
28
|
+
/* @__PURE__ */ t("div", { className: "ui-stepper-circle", children: a ? "✓" : e + 1 }),
|
|
29
|
+
/* @__PURE__ */ t("span", { className: "ui-stepper-label", children: o(s) })
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
),
|
|
33
|
+
e !== r.length - 1 && /* @__PURE__ */ t("div", { className: "ui-stepper-line" })
|
|
34
|
+
]
|
|
35
|
+
},
|
|
36
|
+
e
|
|
37
|
+
);
|
|
38
|
+
}) }) });
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
h as Stepper
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=Stepper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stepper.js","sources":["../../../../src/components/stepper/Stepper.tsx"],"sourcesContent":["/**\r\n * Stepper.tsx — FINAL VERSION\r\n * ----------------------------\r\n * Features:\r\n * - Linear step navigation\r\n * - Clickable steps\r\n * - Keyboard navigation\r\n * - ARIA labels\r\n * - Full theme support\r\n * - Minimal, clean API\r\n */\r\n\r\nimport React from 'react';\r\nimport './Stepper.css';\r\n\r\nexport interface StepItem {\r\n label: React.ReactNode;\r\n}\r\n\r\nexport interface StepperProps {\r\n steps: (string | StepItem)[];\r\n active: number; // 0-based active index\r\n onChange?: (index: number) => void;\r\n className?: string;\r\n}\r\n\r\nexport function Stepper({\r\n steps,\r\n active,\r\n onChange,\r\n className = '',\r\n}: StepperProps) {\r\n const getLabel = (s: string | StepItem) =>\r\n typeof s === 'string' ? s : s.label;\r\n\r\n return (\r\n <nav className={`ui-stepper ${className}`} aria-label=\"Progress Steps\">\r\n <ol className=\"ui-stepper-list\">\r\n {steps.map((step, index) => {\r\n const isActive = index === active;\r\n const isCompleted = index < active;\r\n\r\n return (\r\n <li\r\n key={index}\r\n className={`\r\n ui-stepper-item \r\n ${isActive ? 'active' : ''} \r\n ${isCompleted ? 'completed' : ''}\r\n `}\r\n >\r\n <button\r\n className=\"ui-stepper-button\"\r\n aria-current={isActive ? 'step' : undefined}\r\n onClick={() => onChange?.(index)}\r\n >\r\n <div className=\"ui-stepper-circle\">\r\n {isCompleted ? '✓' : index + 1}\r\n </div>\r\n\r\n <span className=\"ui-stepper-label\">{getLabel(step)}</span>\r\n </button>\r\n\r\n {/* Connector Line */}\r\n {index !== steps.length - 1 && (\r\n <div className=\"ui-stepper-line\" />\r\n )}\r\n </li>\r\n );\r\n })}\r\n </ol>\r\n </nav>\r\n );\r\n}\r\n"],"names":["Stepper","steps","active","onChange","className","getLabel","jsx","step","index","isActive","isCompleted","jsxs"],"mappings":";;AA0BO,SAASA,EAAQ;AAAA,EACtB,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC,IAAY;AACd,GAAiB;AACf,QAAMC,IAAW,CAAC,MAChB,OAAO,KAAM,WAAW,IAAI,EAAE;AAEhC,2BACG,OAAA,EAAI,WAAW,cAAcD,CAAS,IAAI,cAAW,kBACpD,UAAA,gBAAAE,EAAC,MAAA,EAAG,WAAU,mBACX,UAAAL,EAAM,IAAI,CAACM,GAAMC,MAAU;AAC1B,UAAMC,IAAWD,MAAUN,GACrBQ,IAAcF,IAAQN;AAE5B,WACE,gBAAAS;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAW;AAAA;AAAA,kBAEPF,IAAW,WAAW,EAAE;AAAA,kBACxBC,IAAc,cAAc,EAAE;AAAA;AAAA,QAGlC,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,gBAAcF,IAAW,SAAS;AAAA,cAClC,SAAS,MAAMN,IAAWK,CAAK;AAAA,cAE/B,UAAA;AAAA,gBAAA,gBAAAF,EAAC,SAAI,WAAU,qBACZ,UAAAI,IAAc,MAAMF,IAAQ,GAC/B;AAAA,kCAEC,QAAA,EAAK,WAAU,oBAAoB,UAAAH,EAASE,CAAI,EAAA,CAAE;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAIpDC,MAAUP,EAAM,SAAS,KACxB,gBAAAK,EAAC,OAAA,EAAI,WAAU,kBAAA,CAAkB;AAAA,QAAA;AAAA,MAAA;AAAA,MArB9BE;AAAA,IAAA;AAAA,EAyBX,CAAC,GACH,GACF;AAEJ;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),c=require("react");;/* empty css */function I({checked:a,defaultChecked:x,onChange:o,disabled:e=!1,label:l,id:m,name:f,value:p,className:y=""}){const s=a!==void 0,[j,d]=c.useState(x??!1),t=s?a:j,i=c.useRef(null),S=c.useId(),h=m??S;c.useEffect(()=>{const n=i.current;if(!n)return;const v=u=>{if(!e&&(u.key===" "||u.key==="Spacebar")){u.preventDefault();const w=!t;s||d(w),o?.(w)}};return n.addEventListener("keydown",v),()=>{n.removeEventListener("keydown",v)}},[t,e,s,o]);const b=()=>{if(e)return;const n=!t;s||d(n),o?.(n),i.current&&i.current.focus()},k=p??(t?"on":"off");return r.jsxs("label",{className:`ui-switch-root ${y}`,htmlFor:h,"aria-disabled":e||void 0,children:[f&&r.jsx("input",{type:"hidden",name:f,value:t?k:""}),r.jsx("button",{id:h,ref:i,type:"button",role:"switch","aria-checked":t,"aria-disabled":e||void 0,className:"ui-switch-control","data-state":t?"on":"off",onClick:b,tabIndex:e?-1:0,children:r.jsx("span",{className:"ui-switch-thumb","aria-hidden":"true"})}),l&&r.jsx("span",{className:"ui-switch-label",children:l})]})}exports.Switch=I;
|
|
2
|
+
//# sourceMappingURL=Switch.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Switch.cjs","sources":["../../../../src/components/switch/Switch.tsx"],"sourcesContent":["/**\r\n * Switch.tsx\r\n * ----------\r\n * Accessible Toggle / Switch component.\r\n *\r\n * Features:\r\n * - role=\"switch\" semantics\r\n * - aria-checked driven\r\n * - keyboard (Space toggles)\r\n * - controlled + uncontrolled\r\n * - disabled support\r\n * - label support\r\n * - no external deps\r\n */\r\n/**\r\n * Switch.tsx (Lint-Clean Version)\r\n * Fully accessible toggle switch.\r\n */\r\n\r\nimport React, { useEffect, useRef } from 'react';\r\nimport './Switch.css';\r\n\r\ninterface SwitchProps {\r\n checked?: boolean;\r\n defaultChecked?: boolean;\r\n onChange?: (checked: boolean) => void;\r\n\r\n disabled?: boolean;\r\n label?: React.ReactNode;\r\n id?: string;\r\n name?: string;\r\n value?: string;\r\n className?: string;\r\n}\r\n\r\nexport function Switch({\r\n checked,\r\n defaultChecked,\r\n onChange,\r\n disabled = false,\r\n label,\r\n id,\r\n name,\r\n value,\r\n className = '',\r\n}: SwitchProps) {\r\n const isControlled = checked !== undefined;\r\n\r\n const [internal, setInternal] = React.useState(defaultChecked ?? false);\r\n const current = isControlled ? checked : internal;\r\n\r\n const controlRef = useRef<HTMLButtonElement | null>(null);\r\n\r\n /**\r\n * FIX → Always call useId at top level.\r\n */\r\n const internalId = React.useId();\r\n const finalId = id ?? internalId;\r\n\r\n /**\r\n * Spacebar toggling (keyboard)\r\n */\r\n useEffect(() => {\r\n const el = controlRef.current;\r\n if (!el) return;\r\n\r\n const handler = (e: KeyboardEvent) => {\r\n if (disabled) return;\r\n\r\n if (e.key === ' ' || e.key === 'Spacebar') {\r\n e.preventDefault();\r\n const next = !current;\r\n\r\n if (!isControlled) setInternal(next);\r\n onChange?.(next);\r\n }\r\n };\r\n\r\n el.addEventListener('keydown', handler);\r\n return () => {\r\n el.removeEventListener('keydown', handler);\r\n };\r\n }, [current, disabled, isControlled, onChange]);\r\n\r\n /**\r\n * Toggle function — no non-null assertions.\r\n */\r\n const toggle = () => {\r\n if (disabled) return;\r\n const next = !current;\r\n\r\n if (!isControlled) setInternal(next);\r\n onChange?.(next);\r\n\r\n // Restore focus safely\r\n if (controlRef.current) {\r\n controlRef.current.focus();\r\n }\r\n };\r\n\r\n // Hidden input for form\r\n const hiddenValue = value ?? (current ? 'on' : 'off');\r\n\r\n return (\r\n <label\r\n className={`ui-switch-root ${className}`}\r\n htmlFor={finalId}\r\n aria-disabled={disabled || undefined}\r\n >\r\n {name && (\r\n <input type=\"hidden\" name={name} value={current ? hiddenValue : ''} />\r\n )}\r\n\r\n <button\r\n id={finalId}\r\n ref={controlRef}\r\n type=\"button\"\r\n role=\"switch\"\r\n aria-checked={current}\r\n aria-disabled={disabled || undefined}\r\n className=\"ui-switch-control\"\r\n data-state={current ? 'on' : 'off'}\r\n onClick={toggle}\r\n tabIndex={disabled ? -1 : 0}\r\n >\r\n <span className=\"ui-switch-thumb\" aria-hidden=\"true\" />\r\n </button>\r\n\r\n {label && <span className=\"ui-switch-label\">{label}</span>}\r\n </label>\r\n );\r\n}\r\n"],"names":["Switch","checked","defaultChecked","onChange","disabled","label","id","name","value","className","isControlled","internal","setInternal","React","current","controlRef","useRef","internalId","finalId","useEffect","el","handler","e","next","toggle","hiddenValue","jsxs","jsx"],"mappings":"oKAmCO,SAASA,EAAO,CACrB,QAAAC,EACA,eAAAC,EACA,SAAAC,EACA,SAAAC,EAAW,GACX,MAAAC,EACA,GAAAC,EACA,KAAAC,EACA,MAAAC,EACA,UAAAC,EAAY,EACd,EAAgB,CACd,MAAMC,EAAeT,IAAY,OAE3B,CAACU,EAAUC,CAAW,EAAIC,EAAM,SAASX,GAAkB,EAAK,EAChEY,EAAUJ,EAAeT,EAAUU,EAEnCI,EAAaC,EAAAA,OAAiC,IAAI,EAKlDC,EAAaJ,EAAM,MAAA,EACnBK,EAAUZ,GAAMW,EAKtBE,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAKL,EAAW,QACtB,GAAI,CAACK,EAAI,OAET,MAAMC,EAAWC,GAAqB,CACpC,GAAI,CAAAlB,IAEAkB,EAAE,MAAQ,KAAOA,EAAE,MAAQ,YAAY,CACzCA,EAAE,eAAA,EACF,MAAMC,EAAO,CAACT,EAETJ,GAAcE,EAAYW,CAAI,EACnCpB,IAAWoB,CAAI,CACjB,CACF,EAEA,OAAAH,EAAG,iBAAiB,UAAWC,CAAO,EAC/B,IAAM,CACXD,EAAG,oBAAoB,UAAWC,CAAO,CAC3C,CACF,EAAG,CAACP,EAASV,EAAUM,EAAcP,CAAQ,CAAC,EAK9C,MAAMqB,EAAS,IAAM,CACnB,GAAIpB,EAAU,OACd,MAAMmB,EAAO,CAACT,EAETJ,GAAcE,EAAYW,CAAI,EACnCpB,IAAWoB,CAAI,EAGXR,EAAW,SACbA,EAAW,QAAQ,MAAA,CAEvB,EAGMU,EAAcjB,IAAUM,EAAU,KAAO,OAE/C,OACEY,EAAAA,KAAC,QAAA,CACC,UAAW,kBAAkBjB,CAAS,GACtC,QAASS,EACT,gBAAed,GAAY,OAE1B,SAAA,CAAAG,GACCoB,EAAAA,IAAC,SAAM,KAAK,SAAS,KAAApB,EAAY,MAAOO,EAAUW,EAAc,EAAA,CAAI,EAGtEE,EAAAA,IAAC,SAAA,CACC,GAAIT,EACJ,IAAKH,EACL,KAAK,SACL,KAAK,SACL,eAAcD,EACd,gBAAeV,GAAY,OAC3B,UAAU,oBACV,aAAYU,EAAU,KAAO,MAC7B,QAASU,EACT,SAAUpB,EAAW,GAAK,EAE1B,SAAAuB,EAAAA,IAAC,OAAA,CAAK,UAAU,kBAAkB,cAAY,MAAA,CAAO,CAAA,CAAA,EAGtDtB,GAASsB,EAAAA,IAAC,OAAA,CAAK,UAAU,kBAAmB,SAAAtB,CAAA,CAAM,CAAA,CAAA,CAAA,CAGzD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { jsxs as E, jsx as i } from "react/jsx-runtime";
|
|
2
|
+
import p, { useRef as R, useEffect as S } from "react";
|
|
3
|
+
/* empty css */
|
|
4
|
+
function F({
|
|
5
|
+
checked: a,
|
|
6
|
+
defaultChecked: v,
|
|
7
|
+
onChange: s,
|
|
8
|
+
disabled: e = !1,
|
|
9
|
+
label: u,
|
|
10
|
+
id: w,
|
|
11
|
+
name: l,
|
|
12
|
+
value: x,
|
|
13
|
+
className: y = ""
|
|
14
|
+
}) {
|
|
15
|
+
const r = a !== void 0, [k, f] = p.useState(v ?? !1), t = r ? a : k, o = R(null), I = p.useId(), d = w ?? I;
|
|
16
|
+
S(() => {
|
|
17
|
+
const n = o.current;
|
|
18
|
+
if (!n) return;
|
|
19
|
+
const h = (c) => {
|
|
20
|
+
if (!e && (c.key === " " || c.key === "Spacebar")) {
|
|
21
|
+
c.preventDefault();
|
|
22
|
+
const m = !t;
|
|
23
|
+
r || f(m), s?.(m);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
return n.addEventListener("keydown", h), () => {
|
|
27
|
+
n.removeEventListener("keydown", h);
|
|
28
|
+
};
|
|
29
|
+
}, [t, e, r, s]);
|
|
30
|
+
const N = () => {
|
|
31
|
+
if (e) return;
|
|
32
|
+
const n = !t;
|
|
33
|
+
r || f(n), s?.(n), o.current && o.current.focus();
|
|
34
|
+
}, b = x ?? (t ? "on" : "off");
|
|
35
|
+
return /* @__PURE__ */ E(
|
|
36
|
+
"label",
|
|
37
|
+
{
|
|
38
|
+
className: `ui-switch-root ${y}`,
|
|
39
|
+
htmlFor: d,
|
|
40
|
+
"aria-disabled": e || void 0,
|
|
41
|
+
children: [
|
|
42
|
+
l && /* @__PURE__ */ i("input", { type: "hidden", name: l, value: t ? b : "" }),
|
|
43
|
+
/* @__PURE__ */ i(
|
|
44
|
+
"button",
|
|
45
|
+
{
|
|
46
|
+
id: d,
|
|
47
|
+
ref: o,
|
|
48
|
+
type: "button",
|
|
49
|
+
role: "switch",
|
|
50
|
+
"aria-checked": t,
|
|
51
|
+
"aria-disabled": e || void 0,
|
|
52
|
+
className: "ui-switch-control",
|
|
53
|
+
"data-state": t ? "on" : "off",
|
|
54
|
+
onClick: N,
|
|
55
|
+
tabIndex: e ? -1 : 0,
|
|
56
|
+
children: /* @__PURE__ */ i("span", { className: "ui-switch-thumb", "aria-hidden": "true" })
|
|
57
|
+
}
|
|
58
|
+
),
|
|
59
|
+
u && /* @__PURE__ */ i("span", { className: "ui-switch-label", children: u })
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
export {
|
|
65
|
+
F as Switch
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=Switch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Switch.js","sources":["../../../../src/components/switch/Switch.tsx"],"sourcesContent":["/**\r\n * Switch.tsx\r\n * ----------\r\n * Accessible Toggle / Switch component.\r\n *\r\n * Features:\r\n * - role=\"switch\" semantics\r\n * - aria-checked driven\r\n * - keyboard (Space toggles)\r\n * - controlled + uncontrolled\r\n * - disabled support\r\n * - label support\r\n * - no external deps\r\n */\r\n/**\r\n * Switch.tsx (Lint-Clean Version)\r\n * Fully accessible toggle switch.\r\n */\r\n\r\nimport React, { useEffect, useRef } from 'react';\r\nimport './Switch.css';\r\n\r\ninterface SwitchProps {\r\n checked?: boolean;\r\n defaultChecked?: boolean;\r\n onChange?: (checked: boolean) => void;\r\n\r\n disabled?: boolean;\r\n label?: React.ReactNode;\r\n id?: string;\r\n name?: string;\r\n value?: string;\r\n className?: string;\r\n}\r\n\r\nexport function Switch({\r\n checked,\r\n defaultChecked,\r\n onChange,\r\n disabled = false,\r\n label,\r\n id,\r\n name,\r\n value,\r\n className = '',\r\n}: SwitchProps) {\r\n const isControlled = checked !== undefined;\r\n\r\n const [internal, setInternal] = React.useState(defaultChecked ?? false);\r\n const current = isControlled ? checked : internal;\r\n\r\n const controlRef = useRef<HTMLButtonElement | null>(null);\r\n\r\n /**\r\n * FIX → Always call useId at top level.\r\n */\r\n const internalId = React.useId();\r\n const finalId = id ?? internalId;\r\n\r\n /**\r\n * Spacebar toggling (keyboard)\r\n */\r\n useEffect(() => {\r\n const el = controlRef.current;\r\n if (!el) return;\r\n\r\n const handler = (e: KeyboardEvent) => {\r\n if (disabled) return;\r\n\r\n if (e.key === ' ' || e.key === 'Spacebar') {\r\n e.preventDefault();\r\n const next = !current;\r\n\r\n if (!isControlled) setInternal(next);\r\n onChange?.(next);\r\n }\r\n };\r\n\r\n el.addEventListener('keydown', handler);\r\n return () => {\r\n el.removeEventListener('keydown', handler);\r\n };\r\n }, [current, disabled, isControlled, onChange]);\r\n\r\n /**\r\n * Toggle function — no non-null assertions.\r\n */\r\n const toggle = () => {\r\n if (disabled) return;\r\n const next = !current;\r\n\r\n if (!isControlled) setInternal(next);\r\n onChange?.(next);\r\n\r\n // Restore focus safely\r\n if (controlRef.current) {\r\n controlRef.current.focus();\r\n }\r\n };\r\n\r\n // Hidden input for form\r\n const hiddenValue = value ?? (current ? 'on' : 'off');\r\n\r\n return (\r\n <label\r\n className={`ui-switch-root ${className}`}\r\n htmlFor={finalId}\r\n aria-disabled={disabled || undefined}\r\n >\r\n {name && (\r\n <input type=\"hidden\" name={name} value={current ? hiddenValue : ''} />\r\n )}\r\n\r\n <button\r\n id={finalId}\r\n ref={controlRef}\r\n type=\"button\"\r\n role=\"switch\"\r\n aria-checked={current}\r\n aria-disabled={disabled || undefined}\r\n className=\"ui-switch-control\"\r\n data-state={current ? 'on' : 'off'}\r\n onClick={toggle}\r\n tabIndex={disabled ? -1 : 0}\r\n >\r\n <span className=\"ui-switch-thumb\" aria-hidden=\"true\" />\r\n </button>\r\n\r\n {label && <span className=\"ui-switch-label\">{label}</span>}\r\n </label>\r\n );\r\n}\r\n"],"names":["Switch","checked","defaultChecked","onChange","disabled","label","id","name","value","className","isControlled","internal","setInternal","React","current","controlRef","useRef","internalId","finalId","useEffect","el","handler","e","next","toggle","hiddenValue","jsxs","jsx"],"mappings":";;;AAmCO,SAASA,EAAO;AAAA,EACrB,SAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,OAAAC;AAAA,EACA,IAAAC;AAAA,EACA,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC,IAAY;AACd,GAAgB;AACd,QAAMC,IAAeT,MAAY,QAE3B,CAACU,GAAUC,CAAW,IAAIC,EAAM,SAASX,KAAkB,EAAK,GAChEY,IAAUJ,IAAeT,IAAUU,GAEnCI,IAAaC,EAAiC,IAAI,GAKlDC,IAAaJ,EAAM,MAAA,GACnBK,IAAUZ,KAAMW;AAKtB,EAAAE,EAAU,MAAM;AACd,UAAMC,IAAKL,EAAW;AACtB,QAAI,CAACK,EAAI;AAET,UAAMC,IAAU,CAACC,MAAqB;AACpC,UAAI,CAAAlB,MAEAkB,EAAE,QAAQ,OAAOA,EAAE,QAAQ,aAAY;AACzC,QAAAA,EAAE,eAAA;AACF,cAAMC,IAAO,CAACT;AAEd,QAAKJ,KAAcE,EAAYW,CAAI,GACnCpB,IAAWoB,CAAI;AAAA,MACjB;AAAA,IACF;AAEA,WAAAH,EAAG,iBAAiB,WAAWC,CAAO,GAC/B,MAAM;AACX,MAAAD,EAAG,oBAAoB,WAAWC,CAAO;AAAA,IAC3C;AAAA,EACF,GAAG,CAACP,GAASV,GAAUM,GAAcP,CAAQ,CAAC;AAK9C,QAAMqB,IAAS,MAAM;AACnB,QAAIpB,EAAU;AACd,UAAMmB,IAAO,CAACT;AAEd,IAAKJ,KAAcE,EAAYW,CAAI,GACnCpB,IAAWoB,CAAI,GAGXR,EAAW,WACbA,EAAW,QAAQ,MAAA;AAAA,EAEvB,GAGMU,IAAcjB,MAAUM,IAAU,OAAO;AAE/C,SACE,gBAAAY;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,kBAAkBjB,CAAS;AAAA,MACtC,SAASS;AAAA,MACT,iBAAed,KAAY;AAAA,MAE1B,UAAA;AAAA,QAAAG,KACC,gBAAAoB,EAAC,WAAM,MAAK,UAAS,MAAApB,GAAY,OAAOO,IAAUW,IAAc,GAAA,CAAI;AAAA,QAGtE,gBAAAE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAIT;AAAA,YACJ,KAAKH;AAAA,YACL,MAAK;AAAA,YACL,MAAK;AAAA,YACL,gBAAcD;AAAA,YACd,iBAAeV,KAAY;AAAA,YAC3B,WAAU;AAAA,YACV,cAAYU,IAAU,OAAO;AAAA,YAC7B,SAASU;AAAA,YACT,UAAUpB,IAAW,KAAK;AAAA,YAE1B,UAAA,gBAAAuB,EAAC,QAAA,EAAK,WAAU,mBAAkB,eAAY,OAAA,CAAO;AAAA,UAAA;AAAA,QAAA;AAAA,QAGtDtB,KAAS,gBAAAsB,EAAC,QAAA,EAAK,WAAU,mBAAmB,UAAAtB,EAAA,CAAM;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGzD;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),d=require("react");;/* empty css */function k({columns:i,data:a,emptyText:u="No data available",className:b=""}){const[n,y]=d.useState(null),c=d.useMemo(()=>n?[...a].sort((r,s)=>{const l=r[n.key],o=s[n.key];return l<o?n.direction==="asc"?-1:1:l>o?n.direction==="asc"?1:-1:0}):a,[a,n]),h=e=>{e.sortable&&y(r=>!r||r.key!==e.key?{key:e.key,direction:"asc"}:r.direction==="asc"?{key:e.key,direction:"desc"}:null)},j=e=>{if(!e.sortable)return null;const r=n?.key===e.key,s=n?.direction??"asc";return t.jsx("span",{className:`ui-table-sort-indicator ${r?"active":""}`,"aria-hidden":"true",children:r?s==="asc"?"▲":"▼":"↕"})};return t.jsx("div",{className:"ui-table-container",children:t.jsxs("table",{className:`ui-table ${b}`,children:[t.jsx("thead",{children:t.jsx("tr",{children:i.map(e=>t.jsx("th",{scope:"col",children:e.sortable?t.jsxs("button",{type:"button",className:"ui-table-sort-button",onClick:()=>h(e),children:[e.label,j(e)]}):e.label},String(e.key)))})}),t.jsx("tbody",{children:c.length===0?t.jsx("tr",{children:t.jsx("td",{className:"ui-table-empty",colSpan:i.length,children:u})}):c.map((e,r)=>t.jsx("tr",{className:"ui-table-row",children:i.map(s=>t.jsx("td",{children:String(e[s.key])},String(s.key)))},r))})]})})}exports.Table=k;
|
|
2
|
+
//# sourceMappingURL=Table.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Table.cjs","sources":["../../../../src/components/table/Table.tsx"],"sourcesContent":["/**\r\n * Table.tsx\r\n * ----------\r\n * Accessible, sortable, theme-aware table.\r\n */\r\n\r\nimport { useState, useMemo } from 'react';\r\nimport './Table.css';\r\n\r\nexport interface TableColumn<T> {\r\n key: keyof T;\r\n label: string;\r\n sortable?: boolean;\r\n}\r\n\r\ninterface TableProps<T> {\r\n columns: TableColumn<T>[];\r\n data: T[];\r\n emptyText?: string;\r\n className?: string;\r\n}\r\n\r\ntype SortState<T> = {\r\n key: keyof T;\r\n direction: 'asc' | 'desc';\r\n} | null;\r\n\r\nexport function Table<T extends Record<string, any>>({\r\n columns,\r\n data,\r\n emptyText = 'No data available',\r\n className = '',\r\n}: TableProps<T>) {\r\n const [sort, setSort] = useState<SortState<T>>(null);\r\n\r\n const sortedData = useMemo(() => {\r\n if (!sort) return data;\r\n\r\n const sorted = [...data].sort((a, b) => {\r\n const aVal = a[sort.key];\r\n const bVal = b[sort.key];\r\n\r\n if (aVal < bVal) return sort.direction === 'asc' ? -1 : 1;\r\n if (aVal > bVal) return sort.direction === 'asc' ? 1 : -1;\r\n return 0;\r\n });\r\n\r\n return sorted;\r\n }, [data, sort]);\r\n\r\n const toggleSort = (col: TableColumn<T>) => {\r\n if (!col.sortable) return;\r\n\r\n setSort((prev) => {\r\n if (!prev || prev.key !== col.key) {\r\n return { key: col.key, direction: 'asc' };\r\n }\r\n if (prev.direction === 'asc') {\r\n return { key: col.key, direction: 'desc' };\r\n }\r\n return null; // reset\r\n });\r\n };\r\n\r\n const renderSortIcon = (col: TableColumn<T>) => {\r\n if (!col.sortable) return null;\r\n\r\n const isActive = sort?.key === col.key;\r\n const dir = sort?.direction ?? 'asc';\r\n\r\n return (\r\n <span\r\n className={`ui-table-sort-indicator ${isActive ? 'active' : ''}`}\r\n aria-hidden=\"true\"\r\n >\r\n {isActive ? (dir === 'asc' ? '▲' : '▼') : '↕'}\r\n </span>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"ui-table-container\">\r\n <table className={`ui-table ${className}`}>\r\n <thead>\r\n <tr>\r\n {columns.map((col) => (\r\n <th key={String(col.key)} scope=\"col\">\r\n {col.sortable ? (\r\n <button\r\n type=\"button\"\r\n className=\"ui-table-sort-button\"\r\n onClick={() => toggleSort(col)}\r\n >\r\n {col.label}\r\n {renderSortIcon(col)}\r\n </button>\r\n ) : (\r\n col.label\r\n )}\r\n </th>\r\n ))}\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n {sortedData.length === 0 ? (\r\n <tr>\r\n <td className=\"ui-table-empty\" colSpan={columns.length}>\r\n {emptyText}\r\n </td>\r\n </tr>\r\n ) : (\r\n sortedData.map((row, i) => (\r\n <tr key={i} className=\"ui-table-row\">\r\n {columns.map((col) => (\r\n <td key={String(col.key)}>{String(row[col.key])}</td>\r\n ))}\r\n </tr>\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n}\r\n"],"names":["Table","columns","data","emptyText","className","sort","setSort","useState","sortedData","useMemo","a","b","aVal","bVal","toggleSort","col","prev","renderSortIcon","isActive","dir","jsx","jsxs","row","i"],"mappings":"mKA2BO,SAASA,EAAqC,CACnD,QAAAC,EACA,KAAAC,EACA,UAAAC,EAAY,oBACZ,UAAAC,EAAY,EACd,EAAkB,CAChB,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAuB,IAAI,EAE7CC,EAAaC,EAAAA,QAAQ,IACpBJ,EAEU,CAAC,GAAGH,CAAI,EAAE,KAAK,CAACQ,EAAGC,IAAM,CACtC,MAAMC,EAAOF,EAAEL,EAAK,GAAG,EACjBQ,EAAOF,EAAEN,EAAK,GAAG,EAEvB,OAAIO,EAAOC,EAAaR,EAAK,YAAc,MAAQ,GAAK,EACpDO,EAAOC,EAAaR,EAAK,YAAc,MAAQ,EAAI,GAChD,CACT,CAAC,EATiBH,EAYjB,CAACA,EAAMG,CAAI,CAAC,EAETS,EAAcC,GAAwB,CACrCA,EAAI,UAETT,EAASU,GACH,CAACA,GAAQA,EAAK,MAAQD,EAAI,IACrB,CAAE,IAAKA,EAAI,IAAK,UAAW,KAAA,EAEhCC,EAAK,YAAc,MACd,CAAE,IAAKD,EAAI,IAAK,UAAW,MAAA,EAE7B,IACR,CACH,EAEME,EAAkBF,GAAwB,CAC9C,GAAI,CAACA,EAAI,SAAU,OAAO,KAE1B,MAAMG,EAAWb,GAAM,MAAQU,EAAI,IAC7BI,EAAMd,GAAM,WAAa,MAE/B,OACEe,EAAAA,IAAC,OAAA,CACC,UAAW,2BAA2BF,EAAW,SAAW,EAAE,GAC9D,cAAY,OAEX,SAAAA,EAAYC,IAAQ,MAAQ,IAAM,IAAO,GAAA,CAAA,CAGhD,EAEA,OACEC,EAAAA,IAAC,OAAI,UAAU,qBACb,gBAAC,QAAA,CAAM,UAAW,YAAYhB,CAAS,GACrC,SAAA,CAAAgB,MAAC,QAAA,CACC,SAAAA,EAAAA,IAAC,KAAA,CACE,SAAAnB,EAAQ,IAAKc,GACZK,EAAAA,IAAC,KAAA,CAAyB,MAAM,MAC7B,SAAAL,EAAI,SACHM,EAAAA,KAAC,SAAA,CACC,KAAK,SACL,UAAU,uBACV,QAAS,IAAMP,EAAWC,CAAG,EAE5B,SAAA,CAAAA,EAAI,MACJE,EAAeF,CAAG,CAAA,CAAA,CAAA,EAGrBA,EAAI,KAAA,EAXC,OAAOA,EAAI,GAAG,CAavB,CACD,CAAA,CACH,EACF,EAEAK,EAAAA,IAAC,SACE,SAAAZ,EAAW,SAAW,EACrBY,EAAAA,IAAC,KAAA,CACC,eAAC,KAAA,CAAG,UAAU,iBAAiB,QAASnB,EAAQ,OAC7C,SAAAE,CAAA,CACH,EACF,EAEAK,EAAW,IAAI,CAACc,EAAKC,IACnBH,EAAAA,IAAC,MAAW,UAAU,eACnB,WAAQ,IAAKL,GACZK,EAAAA,IAAC,KAAA,CAA0B,gBAAOE,EAAIP,EAAI,GAAG,CAAC,CAAA,EAArC,OAAOA,EAAI,GAAG,CAAyB,CACjD,GAHMQ,CAIT,CACD,CAAA,CAEL,CAAA,CAAA,CACF,CAAA,CACF,CAEJ"}
|