@nofinite/nui 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +1 -1
- 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":"Accordion.cjs","sources":["../../../src/components/accordion/Accordion.tsx"],"sourcesContent":["/**\r\n * Accordion.tsx\r\n * ---------------\r\n * Fully accessible WAI-ARIA accordion.\r\n * Single-component API.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\n\r\nimport './Accordion.css';\r\n\r\nexport interface AccordionItem {\r\n id: string;\r\n title: string;\r\n content: React.ReactNode;\r\n}\r\n\r\ninterface AccordionProps {\r\n /** List of accordion sections */\r\n items: AccordionItem[];\r\n\r\n /** Default opened item ID (optional) */\r\n defaultOpenId?: string;\r\n\r\n /** Allow multiple open panels? Default: false */\r\n multiple?: boolean;\r\n\r\n className?: string;\r\n}\r\n\r\nexport function Accordion({\r\n items,\r\n defaultOpenId,\r\n multiple = false,\r\n className = '',\r\n}: AccordionProps) {\r\n const [openIds, setOpenIds] = useState<string[]>(\r\n defaultOpenId ? [defaultOpenId] : []\r\n );\r\n\r\n const isOpen = (id: string) => openIds.includes(id);\r\n\r\n const toggle = (id: string) => {\r\n setOpenIds((prev) => {\r\n if (multiple) {\r\n return isOpen(id) ? prev.filter((x) => x !== id) : [...prev, id];\r\n } else {\r\n return isOpen(id) ? [] : [id];\r\n }\r\n });\r\n };\r\n\r\n return (\r\n <div className={`ui-accordion ${className}`}>\r\n {items.map((item) => {\r\n const open = isOpen(item.id);\r\n\r\n return (\r\n <div key={item.id} className=\"ui-accordion-item\">\r\n {/* HEADER BUTTON */}\r\n <button\r\n className=\"ui-accordion-header\"\r\n aria-expanded={open}\r\n aria-controls={`panel-${item.id}`}\r\n id={`accordion-${item.id}`}\r\n onClick={() => toggle(item.id)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n toggle(item.id);\r\n }\r\n }}\r\n >\r\n {item.title}\r\n <span>{open ? '–' : '+'}</span>\r\n </button>\r\n\r\n {/* PANEL */}\r\n <div\r\n id={`panel-${item.id}`}\r\n role=\"region\"\r\n aria-labelledby={`accordion-${item.id}`}\r\n className={`ui-accordion-panel ${\r\n open ? 'ui-accordion-panel--open' : ''\r\n }`}\r\n >\r\n {open && (\r\n <div style={{ padding: '8px 0', color: 'var(--color-text)' }}>\r\n {item.content}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n"],"names":["Accordion","items","defaultOpenId","multiple","className","openIds","setOpenIds","useState","isOpen","id","toggle","prev","x","jsx","item","open","jsxs","e"],"mappings":"uKA8BO,SAASA,EAAU,CACxB,MAAAC,EACA,cAAAC,EACA,SAAAC,EAAW,GACX,UAAAC,EAAY,EACd,EAAmB,CACjB,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAC5BL,EAAgB,CAACA,CAAa,EAAI,CAAA,CAAC,EAG/BM,EAAUC,GAAeJ,EAAQ,SAASI,CAAE,EAE5CC,EAAUD,GAAe,CAC7BH,EAAYK,GACNR,EACKK,EAAOC,CAAE,EAAIE,EAAK,OAAQC,GAAMA,IAAMH,CAAE,EAAI,CAAC,GAAGE,EAAMF,CAAE,EAExDD,EAAOC,CAAE,EAAI,CAAA,EAAK,CAACA,CAAE,CAE/B,CACH,EAEA,OACEI,MAAC,OAAI,UAAW,gBAAgBT,CAAS,GACtC,SAAAH,EAAM,IAAKa,GAAS,CACnB,MAAMC,EAAOP,EAAOM,EAAK,EAAE,EAE3B,OACEE,EAAAA,KAAC,MAAA,CAAkB,UAAU,oBAE3B,SAAA,CAAAA,EAAAA,KAAC,SAAA,CACC,UAAU,sBACV,gBAAeD,EACf,gBAAe,SAASD,EAAK,EAAE,GAC/B,GAAI,aAAaA,EAAK,EAAE,GACxB,QAAS,IAAMJ,EAAOI,EAAK,EAAE,EAC7B,UAAYG,GAAM,EACZA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,OACjCA,EAAE,eAAA,EACFP,EAAOI,EAAK,EAAE,EAElB,EAEC,SAAA,CAAAA,EAAK,MACND,EAAAA,IAAC,OAAA,CAAM,SAAAE,EAAO,IAAM,GAAA,CAAI,CAAA,CAAA,CAAA,EAI1BF,EAAAA,IAAC,MAAA,CACC,GAAI,SAASC,EAAK,EAAE,GACpB,KAAK,SACL,kBAAiB,aAAaA,EAAK,EAAE,GACrC,UAAW,sBACTC,EAAO,2BAA6B,EACtC,GAEC,SAAAA,GACCF,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,QAAS,QAAS,MAAO,mBAAA,EACpC,SAAAC,EAAK,OAAA,CACR,CAAA,CAAA,CAEJ,CAAA,EAjCQA,EAAK,EAkCf,CAEJ,CAAC,CAAA,CACH,CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Accordion.js","sources":["../../../src/components/accordion/Accordion.tsx"],"sourcesContent":["/**\r\n * Accordion.tsx\r\n * ---------------\r\n * Fully accessible WAI-ARIA accordion.\r\n * Single-component API.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\n\r\nimport './Accordion.css';\r\n\r\nexport interface AccordionItem {\r\n id: string;\r\n title: string;\r\n content: React.ReactNode;\r\n}\r\n\r\ninterface AccordionProps {\r\n /** List of accordion sections */\r\n items: AccordionItem[];\r\n\r\n /** Default opened item ID (optional) */\r\n defaultOpenId?: string;\r\n\r\n /** Allow multiple open panels? Default: false */\r\n multiple?: boolean;\r\n\r\n className?: string;\r\n}\r\n\r\nexport function Accordion({\r\n items,\r\n defaultOpenId,\r\n multiple = false,\r\n className = '',\r\n}: AccordionProps) {\r\n const [openIds, setOpenIds] = useState<string[]>(\r\n defaultOpenId ? [defaultOpenId] : []\r\n );\r\n\r\n const isOpen = (id: string) => openIds.includes(id);\r\n\r\n const toggle = (id: string) => {\r\n setOpenIds((prev) => {\r\n if (multiple) {\r\n return isOpen(id) ? prev.filter((x) => x !== id) : [...prev, id];\r\n } else {\r\n return isOpen(id) ? [] : [id];\r\n }\r\n });\r\n };\r\n\r\n return (\r\n <div className={`ui-accordion ${className}`}>\r\n {items.map((item) => {\r\n const open = isOpen(item.id);\r\n\r\n return (\r\n <div key={item.id} className=\"ui-accordion-item\">\r\n {/* HEADER BUTTON */}\r\n <button\r\n className=\"ui-accordion-header\"\r\n aria-expanded={open}\r\n aria-controls={`panel-${item.id}`}\r\n id={`accordion-${item.id}`}\r\n onClick={() => toggle(item.id)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n toggle(item.id);\r\n }\r\n }}\r\n >\r\n {item.title}\r\n <span>{open ? '–' : '+'}</span>\r\n </button>\r\n\r\n {/* PANEL */}\r\n <div\r\n id={`panel-${item.id}`}\r\n role=\"region\"\r\n aria-labelledby={`accordion-${item.id}`}\r\n className={`ui-accordion-panel ${\r\n open ? 'ui-accordion-panel--open' : ''\r\n }`}\r\n >\r\n {open && (\r\n <div style={{ padding: '8px 0', color: 'var(--color-text)' }}>\r\n {item.content}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n"],"names":["Accordion","items","defaultOpenId","multiple","className","openIds","setOpenIds","useState","isOpen","id","toggle","prev","x","jsx","item","open","jsxs","e"],"mappings":";;;AA8BO,SAASA,EAAU;AAAA,EACxB,OAAAC;AAAA,EACA,eAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,WAAAC,IAAY;AACd,GAAmB;AACjB,QAAM,CAACC,GAASC,CAAU,IAAIC;AAAA,IAC5BL,IAAgB,CAACA,CAAa,IAAI,CAAA;AAAA,EAAC,GAG/BM,IAAS,CAACC,MAAeJ,EAAQ,SAASI,CAAE,GAE5CC,IAAS,CAACD,MAAe;AAC7B,IAAAH,EAAW,CAACK,MACNR,IACKK,EAAOC,CAAE,IAAIE,EAAK,OAAO,CAACC,MAAMA,MAAMH,CAAE,IAAI,CAAC,GAAGE,GAAMF,CAAE,IAExDD,EAAOC,CAAE,IAAI,CAAA,IAAK,CAACA,CAAE,CAE/B;AAAA,EACH;AAEA,SACE,gBAAAI,EAAC,SAAI,WAAW,gBAAgBT,CAAS,IACtC,UAAAH,EAAM,IAAI,CAACa,MAAS;AACnB,UAAMC,IAAOP,EAAOM,EAAK,EAAE;AAE3B,WACE,gBAAAE,EAAC,OAAA,EAAkB,WAAU,qBAE3B,UAAA;AAAA,MAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,iBAAeD;AAAA,UACf,iBAAe,SAASD,EAAK,EAAE;AAAA,UAC/B,IAAI,aAAaA,EAAK,EAAE;AAAA,UACxB,SAAS,MAAMJ,EAAOI,EAAK,EAAE;AAAA,UAC7B,WAAW,CAACG,MAAM;AAChB,aAAIA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SACjCA,EAAE,eAAA,GACFP,EAAOI,EAAK,EAAE;AAAA,UAElB;AAAA,UAEC,UAAA;AAAA,YAAAA,EAAK;AAAA,YACN,gBAAAD,EAAC,QAAA,EAAM,UAAAE,IAAO,MAAM,IAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAI1B,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,IAAI,SAASC,EAAK,EAAE;AAAA,UACpB,MAAK;AAAA,UACL,mBAAiB,aAAaA,EAAK,EAAE;AAAA,UACrC,WAAW,sBACTC,IAAO,6BAA6B,EACtC;AAAA,UAEC,UAAAA,KACC,gBAAAF,EAAC,OAAA,EAAI,OAAO,EAAE,SAAS,SAAS,OAAO,oBAAA,GACpC,UAAAC,EAAK,QAAA,CACR;AAAA,QAAA;AAAA,MAAA;AAAA,IAEJ,EAAA,GAjCQA,EAAK,EAkCf;AAAA,EAEJ,CAAC,EAAA,CACH;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Alert.cjs","sources":["../../../src/components/alert/Alert.tsx"],"sourcesContent":["/**\r\n * Alert.tsx\r\n * ----------\r\n * WCAG-compliant alert component.\r\n *\r\n * - Uses correct roles:\r\n * type=\"error\"/\"warning\" → role=\"alert\" (urgent)\r\n * type=\"info\"/\"success\" → role=\"status\" (non-urgent)\r\n *\r\n * - Supports:\r\n * - title\r\n * - closable\r\n * - variants\r\n * - icons (optional)\r\n */\r\n\r\nimport React from 'react';\r\nimport './Alert.css';\r\n\r\ntype AlertType = 'info' | 'success' | 'warning' | 'error';\r\n\r\ninterface AlertProps {\r\n type?: AlertType;\r\n title?: string;\r\n children?: React.ReactNode;\r\n closable?: boolean;\r\n onClose?: () => void;\r\n className?: string;\r\n}\r\n\r\nexport function Alert({\r\n type = 'info',\r\n title,\r\n children,\r\n closable = false,\r\n onClose,\r\n className = '',\r\n}: AlertProps) {\r\n // WCAG rule:\r\n // - errors & warnings = role=\"alert\"\r\n // - info & success = role=\"status\"\r\n const role = type === 'error' || type === 'warning' ? 'alert' : 'status';\r\n\r\n return (\r\n <div className={`ui-alert ui-alert--${type} ${className}`} role={role}>\r\n <div className=\"ui-alert-content\">\r\n {title && <div className=\"ui-alert-title\">{title}</div>}\r\n {children}\r\n </div>\r\n\r\n {closable && (\r\n <button\r\n type=\"button\"\r\n className=\"ui-alert-close\"\r\n aria-label=\"Close alert\"\r\n onClick={onClose}\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["Alert","type","title","children","closable","onClose","className","role","jsxs","jsx"],"mappings":"gJA8BO,SAASA,EAAM,CACpB,KAAAC,EAAO,OACP,MAAAC,EACA,SAAAC,EACA,SAAAC,EAAW,GACX,QAAAC,EACA,UAAAC,EAAY,EACd,EAAe,CAIb,MAAMC,EAAON,IAAS,SAAWA,IAAS,UAAY,QAAU,SAEhE,OACEO,OAAC,OAAI,UAAW,sBAAsBP,CAAI,IAAIK,CAAS,GAAI,KAAAC,EACzD,SAAA,CAAAC,EAAAA,KAAC,MAAA,CAAI,UAAU,mBACZ,SAAA,CAAAN,GAASO,EAAAA,IAAC,MAAA,CAAI,UAAU,iBAAkB,SAAAP,EAAM,EAChDC,CAAA,EACH,EAECC,GACCK,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,iBACV,aAAW,cACX,QAASJ,EACV,SAAA,GAAA,CAAA,CAED,EAEJ,CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Alert.js","sources":["../../../src/components/alert/Alert.tsx"],"sourcesContent":["/**\r\n * Alert.tsx\r\n * ----------\r\n * WCAG-compliant alert component.\r\n *\r\n * - Uses correct roles:\r\n * type=\"error\"/\"warning\" → role=\"alert\" (urgent)\r\n * type=\"info\"/\"success\" → role=\"status\" (non-urgent)\r\n *\r\n * - Supports:\r\n * - title\r\n * - closable\r\n * - variants\r\n * - icons (optional)\r\n */\r\n\r\nimport React from 'react';\r\nimport './Alert.css';\r\n\r\ntype AlertType = 'info' | 'success' | 'warning' | 'error';\r\n\r\ninterface AlertProps {\r\n type?: AlertType;\r\n title?: string;\r\n children?: React.ReactNode;\r\n closable?: boolean;\r\n onClose?: () => void;\r\n className?: string;\r\n}\r\n\r\nexport function Alert({\r\n type = 'info',\r\n title,\r\n children,\r\n closable = false,\r\n onClose,\r\n className = '',\r\n}: AlertProps) {\r\n // WCAG rule:\r\n // - errors & warnings = role=\"alert\"\r\n // - info & success = role=\"status\"\r\n const role = type === 'error' || type === 'warning' ? 'alert' : 'status';\r\n\r\n return (\r\n <div className={`ui-alert ui-alert--${type} ${className}`} role={role}>\r\n <div className=\"ui-alert-content\">\r\n {title && <div className=\"ui-alert-title\">{title}</div>}\r\n {children}\r\n </div>\r\n\r\n {closable && (\r\n <button\r\n type=\"button\"\r\n className=\"ui-alert-close\"\r\n aria-label=\"Close alert\"\r\n onClick={onClose}\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["Alert","type","title","children","closable","onClose","className","role","jsxs","jsx"],"mappings":";;AA8BO,SAASA,EAAM;AAAA,EACpB,MAAAC,IAAO;AAAA,EACP,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,SAAAC;AAAA,EACA,WAAAC,IAAY;AACd,GAAe;AAIb,QAAMC,IAAON,MAAS,WAAWA,MAAS,YAAY,UAAU;AAEhE,SACE,gBAAAO,EAAC,SAAI,WAAW,sBAAsBP,CAAI,IAAIK,CAAS,IAAI,MAAAC,GACzD,UAAA;AAAA,IAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,oBACZ,UAAA;AAAA,MAAAN,KAAS,gBAAAO,EAAC,OAAA,EAAI,WAAU,kBAAkB,UAAAP,GAAM;AAAA,MAChDC;AAAA,IAAA,GACH;AAAA,IAECC,KACC,gBAAAK;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,cAAW;AAAA,QACX,SAASJ;AAAA,QACV,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,GAEJ;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Avatar.cjs","sources":["../../../src/components/avatar/Avatar.tsx"],"sourcesContent":["/**\r\n * Avatar.tsx\r\n * Enterprise-grade Avatar component.\r\n */\r\nimport React, { useState } from 'react';\r\nimport './Avatar.css';\r\n\r\ntype AvatarSize = 'sm' | 'md' | 'lg' | 'xl';\r\ntype AvatarShape = 'circle' | 'rounded' | 'square';\r\ntype Status = 'online' | 'offline' | 'busy' | undefined;\r\n\r\ninterface AvatarProps {\r\n src?: string;\r\n alt?: string;\r\n name?: string; // For initials fallback\r\n size?: AvatarSize;\r\n shape?: AvatarShape;\r\n status?: Status;\r\n loading?: boolean; // skeleton\r\n className?: string;\r\n fallbackIcon?: React.ReactNode;\r\n}\r\n\r\nfunction getInitials(name?: string): string {\r\n if (!name) return '';\r\n const parts = name.trim().split(' ');\r\n if (parts.length === 1) return parts[0].charAt(0).toUpperCase();\r\n return (parts[0][0] + parts[1][0]).toUpperCase();\r\n}\r\n\r\nexport function Avatar({\r\n src,\r\n alt,\r\n name,\r\n size = 'md',\r\n shape = 'circle',\r\n status,\r\n loading = false,\r\n className = '',\r\n fallbackIcon,\r\n}: AvatarProps) {\r\n const [errored, setErrored] = useState(false);\r\n const initials = getInitials(name);\r\n\r\n const classes = [\r\n 'ui-avatar',\r\n `ui-avatar--${size}`,\r\n `ui-avatar--${shape}`,\r\n loading && 'ui-avatar-loading',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const showImage = src && !errored && !loading;\r\n\r\n return (\r\n <div className={classes} aria-label={alt || name}>\r\n {showImage ? (\r\n <img\r\n src={src}\r\n alt={alt || name || 'avatar'}\r\n onError={() => setErrored(true)}\r\n />\r\n ) : initials ? (\r\n <span>{initials}</span>\r\n ) : fallbackIcon ? (\r\n <span>{fallbackIcon}</span>\r\n ) : (\r\n <span>?</span>\r\n )}\r\n\r\n {status && (\r\n <span\r\n className={[\r\n 'ui-avatar-status',\r\n status && `ui-avatar-status--${status}`,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n aria-label={status}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["getInitials","name","parts","Avatar","src","alt","size","shape","status","loading","className","fallbackIcon","errored","setErrored","useState","initials","classes","showImage","jsx"],"mappings":"oKAuBA,SAASA,EAAYC,EAAuB,CAC1C,GAAI,CAACA,EAAM,MAAO,GAClB,MAAMC,EAAQD,EAAK,KAAA,EAAO,MAAM,GAAG,EACnC,OAAIC,EAAM,SAAW,EAAUA,EAAM,CAAC,EAAE,OAAO,CAAC,EAAE,YAAA,GAC1CA,EAAM,CAAC,EAAE,CAAC,EAAIA,EAAM,CAAC,EAAE,CAAC,GAAG,YAAA,CACrC,CAEO,SAASC,EAAO,CACrB,IAAAC,EACA,IAAAC,EACA,KAAAJ,EACA,KAAAK,EAAO,KACP,MAAAC,EAAQ,SACR,OAAAC,EACA,QAAAC,EAAU,GACV,UAAAC,EAAY,GACZ,aAAAC,CACF,EAAgB,CACd,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAK,EACtCC,EAAWf,EAAYC,CAAI,EAE3Be,EAAU,CACd,YACA,cAAcV,CAAI,GAClB,cAAcC,CAAK,GACnBE,GAAW,oBACXC,CAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,EAELO,EAAYb,GAAO,CAACQ,GAAW,CAACH,EAEtC,cACG,MAAA,CAAI,UAAWO,EAAS,aAAYX,GAAOJ,EACzC,SAAA,CAAAgB,EACCC,EAAAA,IAAC,MAAA,CACC,IAAAd,EACA,IAAKC,GAAOJ,GAAQ,SACpB,QAAS,IAAMY,EAAW,EAAI,CAAA,CAAA,EAE9BE,EACFG,EAAAA,IAAC,OAAA,CAAM,SAAAH,CAAA,CAAS,EACdJ,EACFO,EAAAA,IAAC,OAAA,CAAM,SAAAP,CAAA,CAAa,EAEpBO,EAAAA,IAAC,QAAK,SAAA,IAAC,EAGRV,GACCU,EAAAA,IAAC,OAAA,CACC,UAAW,CACT,mBACAV,GAAU,qBAAqBA,CAAM,EAAA,EAEpC,OAAO,OAAO,EACd,KAAK,GAAG,EACX,aAAYA,CAAA,CAAA,CACd,EAEJ,CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Avatar.js","sources":["../../../src/components/avatar/Avatar.tsx"],"sourcesContent":["/**\r\n * Avatar.tsx\r\n * Enterprise-grade Avatar component.\r\n */\r\nimport React, { useState } from 'react';\r\nimport './Avatar.css';\r\n\r\ntype AvatarSize = 'sm' | 'md' | 'lg' | 'xl';\r\ntype AvatarShape = 'circle' | 'rounded' | 'square';\r\ntype Status = 'online' | 'offline' | 'busy' | undefined;\r\n\r\ninterface AvatarProps {\r\n src?: string;\r\n alt?: string;\r\n name?: string; // For initials fallback\r\n size?: AvatarSize;\r\n shape?: AvatarShape;\r\n status?: Status;\r\n loading?: boolean; // skeleton\r\n className?: string;\r\n fallbackIcon?: React.ReactNode;\r\n}\r\n\r\nfunction getInitials(name?: string): string {\r\n if (!name) return '';\r\n const parts = name.trim().split(' ');\r\n if (parts.length === 1) return parts[0].charAt(0).toUpperCase();\r\n return (parts[0][0] + parts[1][0]).toUpperCase();\r\n}\r\n\r\nexport function Avatar({\r\n src,\r\n alt,\r\n name,\r\n size = 'md',\r\n shape = 'circle',\r\n status,\r\n loading = false,\r\n className = '',\r\n fallbackIcon,\r\n}: AvatarProps) {\r\n const [errored, setErrored] = useState(false);\r\n const initials = getInitials(name);\r\n\r\n const classes = [\r\n 'ui-avatar',\r\n `ui-avatar--${size}`,\r\n `ui-avatar--${shape}`,\r\n loading && 'ui-avatar-loading',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const showImage = src && !errored && !loading;\r\n\r\n return (\r\n <div className={classes} aria-label={alt || name}>\r\n {showImage ? (\r\n <img\r\n src={src}\r\n alt={alt || name || 'avatar'}\r\n onError={() => setErrored(true)}\r\n />\r\n ) : initials ? (\r\n <span>{initials}</span>\r\n ) : fallbackIcon ? (\r\n <span>{fallbackIcon}</span>\r\n ) : (\r\n <span>?</span>\r\n )}\r\n\r\n {status && (\r\n <span\r\n className={[\r\n 'ui-avatar-status',\r\n status && `ui-avatar-status--${status}`,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n aria-label={status}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["getInitials","name","parts","Avatar","src","alt","size","shape","status","loading","className","fallbackIcon","errored","setErrored","useState","initials","classes","jsx"],"mappings":";;;AAuBA,SAASA,EAAYC,GAAuB;AAC1C,MAAI,CAACA,EAAM,QAAO;AAClB,QAAMC,IAAQD,EAAK,KAAA,EAAO,MAAM,GAAG;AACnC,SAAIC,EAAM,WAAW,IAAUA,EAAM,CAAC,EAAE,OAAO,CAAC,EAAE,YAAA,KAC1CA,EAAM,CAAC,EAAE,CAAC,IAAIA,EAAM,CAAC,EAAE,CAAC,GAAG,YAAA;AACrC;AAEO,SAASC,EAAO;AAAA,EACrB,KAAAC;AAAA,EACA,KAAAC;AAAA,EACA,MAAAJ;AAAA,EACA,MAAAK,IAAO;AAAA,EACP,OAAAC,IAAQ;AAAA,EACR,QAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,WAAAC,IAAY;AAAA,EACZ,cAAAC;AACF,GAAgB;AACd,QAAM,CAACC,GAASC,CAAU,IAAIC,EAAS,EAAK,GACtCC,IAAWf,EAAYC,CAAI,GAE3Be,IAAU;AAAA,IACd;AAAA,IACA,cAAcV,CAAI;AAAA,IAClB,cAAcC,CAAK;AAAA,IACnBE,KAAW;AAAA,IACXC;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAIX,2BACG,OAAA,EAAI,WAAWM,GAAS,cAAYX,KAAOJ,GACzC,UAAA;AAAA,IAJaG,KAAO,CAACQ,KAAW,CAACH,IAKhC,gBAAAQ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAb;AAAA,QACA,KAAKC,KAAOJ,KAAQ;AAAA,QACpB,SAAS,MAAMY,EAAW,EAAI;AAAA,MAAA;AAAA,IAAA,IAE9BE,IACF,gBAAAE,EAAC,QAAA,EAAM,UAAAF,EAAA,CAAS,IACdJ,IACF,gBAAAM,EAAC,QAAA,EAAM,UAAAN,EAAA,CAAa,IAEpB,gBAAAM,EAAC,UAAK,UAAA,KAAC;AAAA,IAGRT,KACC,gBAAAS;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACAT,KAAU,qBAAqBA,CAAM;AAAA,QAAA,EAEpC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACX,cAAYA;AAAA,MAAA;AAAA,IAAA;AAAA,EACd,GAEJ;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AvatarGroup.cjs","sources":["../../../src/components/avatar/AvatarGroup.tsx"],"sourcesContent":["/**\r\n * AvatarGroup.tsx\r\n * Displays overlapping avatars, with overflow like +3\r\n */\r\nimport React from 'react';\r\nimport './Avatar.css';\r\n\r\ninterface AvatarGroupProps {\r\n children: React.ReactNode[];\r\n max?: number;\r\n size?: 'sm' | 'md' | 'lg' | 'xl';\r\n className?: string;\r\n}\r\n\r\nexport function AvatarGroup({\r\n children,\r\n max = 3,\r\n size = 'md',\r\n className = '',\r\n}: AvatarGroupProps) {\r\n const items = React.Children.toArray(children);\r\n const visible = items.slice(0, max);\r\n const extra = items.length - max;\r\n\r\n return (\r\n <div className={['ui-avatar-group', className].join(' ')}>\r\n {visible.map((child, i) => (\r\n <React.Fragment key={i}>{child}</React.Fragment>\r\n ))}\r\n\r\n {extra > 0 && (\r\n <div\r\n className={[\r\n 'ui-avatar',\r\n `ui-avatar--${size}`,\r\n 'ui-avatar-group-overflow',\r\n ].join(' ')}\r\n >\r\n +{extra}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["AvatarGroup","children","max","size","className","items","React","visible","extra","jsxs","child","i","jsx"],"mappings":"oKAcO,SAASA,EAAY,CAC1B,SAAAC,EACA,IAAAC,EAAM,EACN,KAAAC,EAAO,KACP,UAAAC,EAAY,EACd,EAAqB,CACnB,MAAMC,EAAQC,EAAM,SAAS,QAAQL,CAAQ,EACvCM,EAAUF,EAAM,MAAM,EAAGH,CAAG,EAC5BM,EAAQH,EAAM,OAASH,EAE7B,OACEO,OAAC,OAAI,UAAW,CAAC,kBAAmBL,CAAS,EAAE,KAAK,GAAG,EACpD,SAAA,CAAAG,EAAQ,IAAI,CAACG,EAAOC,IACnBC,EAAAA,IAACN,EAAM,SAAN,CAAwB,SAAAI,CAAA,EAAJC,CAAU,CAChC,EAEAH,EAAQ,GACPC,EAAAA,KAAC,MAAA,CACC,UAAW,CACT,YACA,cAAcN,CAAI,GAClB,0BAAA,EACA,KAAK,GAAG,EACX,SAAA,CAAA,IACGK,CAAA,CAAA,CAAA,CACJ,EAEJ,CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AvatarGroup.js","sources":["../../../src/components/avatar/AvatarGroup.tsx"],"sourcesContent":["/**\r\n * AvatarGroup.tsx\r\n * Displays overlapping avatars, with overflow like +3\r\n */\r\nimport React from 'react';\r\nimport './Avatar.css';\r\n\r\ninterface AvatarGroupProps {\r\n children: React.ReactNode[];\r\n max?: number;\r\n size?: 'sm' | 'md' | 'lg' | 'xl';\r\n className?: string;\r\n}\r\n\r\nexport function AvatarGroup({\r\n children,\r\n max = 3,\r\n size = 'md',\r\n className = '',\r\n}: AvatarGroupProps) {\r\n const items = React.Children.toArray(children);\r\n const visible = items.slice(0, max);\r\n const extra = items.length - max;\r\n\r\n return (\r\n <div className={['ui-avatar-group', className].join(' ')}>\r\n {visible.map((child, i) => (\r\n <React.Fragment key={i}>{child}</React.Fragment>\r\n ))}\r\n\r\n {extra > 0 && (\r\n <div\r\n className={[\r\n 'ui-avatar',\r\n `ui-avatar--${size}`,\r\n 'ui-avatar-group-overflow',\r\n ].join(' ')}\r\n >\r\n +{extra}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["AvatarGroup","children","max","size","className","items","React","visible","extra","jsxs","child","i","jsx"],"mappings":";;;AAcO,SAASA,EAAY;AAAA,EAC1B,UAAAC;AAAA,EACA,KAAAC,IAAM;AAAA,EACN,MAAAC,IAAO;AAAA,EACP,WAAAC,IAAY;AACd,GAAqB;AACnB,QAAMC,IAAQC,EAAM,SAAS,QAAQL,CAAQ,GACvCM,IAAUF,EAAM,MAAM,GAAGH,CAAG,GAC5BM,IAAQH,EAAM,SAASH;AAE7B,SACE,gBAAAO,EAAC,SAAI,WAAW,CAAC,mBAAmBL,CAAS,EAAE,KAAK,GAAG,GACpD,UAAA;AAAA,IAAAG,EAAQ,IAAI,CAACG,GAAOC,MACnB,gBAAAC,EAACN,EAAM,UAAN,EAAwB,UAAAI,EAAA,GAAJC,CAAU,CAChC;AAAA,IAEAH,IAAQ,KACP,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,cAAcN,CAAI;AAAA,UAClB;AAAA,QAAA,EACA,KAAK,GAAG;AAAA,QACX,UAAA;AAAA,UAAA;AAAA,UACGK;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACJ,GAEJ;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Badge.cjs","sources":["../../../src/components/badge/Badge.tsx"],"sourcesContent":["/**\r\n * Badge.tsx\r\n * ---------\r\n * Simple accessible badge component.\r\n *\r\n * Renders:\r\n * - <span> (default non-interactive)\r\n * - <a href=\"...\"> when `href` provided\r\n * - <button> when `onClick` provided\r\n *\r\n * Accessibility:\r\n * - If numeric content is provided, the component will add an accessible label\r\n * (e.g. \"5 new notifications\") if `ariaLabel` prop is omitted — this helps\r\n * screen reader users understand the meaning of the number.\r\n *\r\n * Usage:\r\n * <Badge>Beta</Badge>\r\n * <Badge variant=\"primary\" size=\"sm\">New</Badge>\r\n * <Badge onClick={() => {}} pill>5</Badge>\r\n */\r\n\r\nimport React from 'react';\r\nimport './Badge.css';\r\n\r\ntype Variant = 'default' | 'primary' | 'success' | 'warning' | 'danger';\r\ntype Size = 'sm' | 'md' | 'lg';\r\n\r\ninterface BadgeProps {\r\n children?: React.ReactNode;\r\n\r\n // count overflow\r\n count?: number;\r\n max?: number;\r\n\r\n variant?: Variant;\r\n size?: Size;\r\n pill?: boolean;\r\n dot?: boolean;\r\n\r\n href?: string;\r\n onClick?: () => void;\r\n\r\n ariaLabel?: string;\r\n className?: string;\r\n title?: string;\r\n\r\n iconLeft?: React.ReactNode;\r\n iconRight?: React.ReactNode;\r\n}\r\n\r\n/**\r\n * Helper: detect if something is number-like\r\n * (string numeric or number)\r\n */\r\nfunction isNumberLike(val: unknown): val is number | string {\r\n if (typeof val === 'number') return true;\r\n if (\r\n typeof val === 'string' &&\r\n val.trim() !== '' &&\r\n !Number.isNaN(Number(val))\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport function Badge({\r\n children,\r\n count,\r\n max,\r\n variant = 'default',\r\n size = 'md',\r\n pill = false,\r\n dot = false,\r\n href,\r\n onClick,\r\n ariaLabel,\r\n className = '',\r\n title,\r\n iconLeft,\r\n iconRight,\r\n}: BadgeProps) {\r\n /**\r\n * Compute display logic (overflow 99+)\r\n * SAFE: no \"!\" used\r\n */\r\n let displayValue: React.ReactNode = children;\r\n\r\n if (isNumberLike(count)) {\r\n if (\r\n isNumberLike(max) &&\r\n typeof max === 'number' &&\r\n typeof count === 'number' &&\r\n count > max\r\n ) {\r\n displayValue = `${max}+`;\r\n } else {\r\n displayValue = count;\r\n }\r\n }\r\n\r\n /**\r\n * Compute aria-label\r\n */\r\n let computedAria: string | undefined = ariaLabel;\r\n\r\n if (!computedAria && isNumberLike(count)) {\r\n computedAria =\r\n typeof count === 'number' ? `${count} notifications` : undefined;\r\n }\r\n\r\n const classes = [\r\n 'ui-badge',\r\n `ui-badge--${variant}`,\r\n `ui-badge--${size}`,\r\n pill && 'ui-badge--pill',\r\n dot && 'ui-badge--dot',\r\n (href || onClick) && 'ui-badge--interactive',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n /**\r\n * Dot badge (no content)\r\n */\r\n if (dot) {\r\n return (\r\n <span\r\n className={classes}\r\n aria-label={computedAria}\r\n aria-hidden={computedAria ? undefined : true}\r\n title={title}\r\n />\r\n );\r\n }\r\n\r\n const content = (\r\n <span\r\n className=\"ui-badge-content\"\r\n aria-hidden={computedAria ? true : undefined}\r\n >\r\n {iconLeft && <span className=\"ui-badge__icon\">{iconLeft}</span>}\r\n {displayValue}\r\n {iconRight && <span className=\"ui-badge__icon\">{iconRight}</span>}\r\n </span>\r\n );\r\n\r\n /**\r\n * Anchor support\r\n */\r\n if (href) {\r\n return (\r\n <a\r\n href={href}\r\n className={classes}\r\n aria-label={computedAria}\r\n title={title}\r\n >\r\n {content}\r\n </a>\r\n );\r\n }\r\n\r\n /**\r\n * Button support\r\n */\r\n if (onClick) {\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={onClick}\r\n className={classes}\r\n aria-label={computedAria}\r\n title={title}\r\n >\r\n {content}\r\n </button>\r\n );\r\n }\r\n\r\n /**\r\n * Default <span>\r\n */\r\n return (\r\n <span className={classes} aria-label={computedAria} title={title}>\r\n {content}\r\n </span>\r\n );\r\n}\r\n"],"names":["isNumberLike","val","Badge","children","count","max","variant","size","pill","dot","href","onClick","ariaLabel","className","title","iconLeft","iconRight","displayValue","computedAria","classes","jsx","content","jsxs"],"mappings":"gJAsDA,SAASA,EAAaC,EAAsC,CAE1D,OADI,OAAOA,GAAQ,UAEjB,OAAOA,GAAQ,UACfA,EAAI,KAAA,IAAW,IACf,CAAC,OAAO,MAAM,OAAOA,CAAG,CAAC,CAK7B,CAEO,SAASC,EAAM,CACpB,SAAAC,EACA,MAAAC,EACA,IAAAC,EACA,QAAAC,EAAU,UACV,KAAAC,EAAO,KACP,KAAAC,EAAO,GACP,IAAAC,EAAM,GACN,KAAAC,EACA,QAAAC,EACA,UAAAC,EACA,UAAAC,EAAY,GACZ,MAAAC,EACA,SAAAC,EACA,UAAAC,CACF,EAAe,CAKb,IAAIC,EAAgCd,EAEhCH,EAAaI,CAAK,IAElBJ,EAAaK,CAAG,GAChB,OAAOA,GAAQ,UACf,OAAOD,GAAU,UACjBA,EAAQC,EAERY,EAAe,GAAGZ,CAAG,IAErBY,EAAeb,GAOnB,IAAIc,EAAmCN,EAEnC,CAACM,GAAgBlB,EAAaI,CAAK,IACrCc,EACE,OAAOd,GAAU,SAAW,GAAGA,CAAK,iBAAmB,QAG3D,MAAMe,EAAU,CACd,WACA,aAAab,CAAO,GACpB,aAAaC,CAAI,GACjBC,GAAQ,iBACRC,GAAO,iBACNC,GAAQC,IAAY,wBACrBE,CAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,EAKX,GAAIJ,EACF,OACEW,EAAAA,IAAC,OAAA,CACC,UAAWD,EACX,aAAYD,EACZ,cAAaA,EAAe,OAAY,GACxC,MAAAJ,CAAA,CAAA,EAKN,MAAMO,EACJC,EAAAA,KAAC,OAAA,CACC,UAAU,mBACV,cAAaJ,EAAe,GAAO,OAElC,SAAA,CAAAH,GAAYK,EAAAA,IAAC,OAAA,CAAK,UAAU,iBAAkB,SAAAL,EAAS,EACvDE,EACAD,GAAaI,EAAAA,IAAC,OAAA,CAAK,UAAU,iBAAkB,SAAAJ,CAAA,CAAU,CAAA,CAAA,CAAA,EAO9D,OAAIN,EAEAU,EAAAA,IAAC,IAAA,CACC,KAAAV,EACA,UAAWS,EACX,aAAYD,EACZ,MAAAJ,EAEC,SAAAO,CAAA,CAAA,EAQHV,EAEAS,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,QAAAT,EACA,UAAWQ,EACX,aAAYD,EACZ,MAAAJ,EAEC,SAAAO,CAAA,CAAA,QASJ,OAAA,CAAK,UAAWF,EAAS,aAAYD,EAAc,MAAAJ,EACjD,SAAAO,EACH,CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Badge.js","sources":["../../../src/components/badge/Badge.tsx"],"sourcesContent":["/**\r\n * Badge.tsx\r\n * ---------\r\n * Simple accessible badge component.\r\n *\r\n * Renders:\r\n * - <span> (default non-interactive)\r\n * - <a href=\"...\"> when `href` provided\r\n * - <button> when `onClick` provided\r\n *\r\n * Accessibility:\r\n * - If numeric content is provided, the component will add an accessible label\r\n * (e.g. \"5 new notifications\") if `ariaLabel` prop is omitted — this helps\r\n * screen reader users understand the meaning of the number.\r\n *\r\n * Usage:\r\n * <Badge>Beta</Badge>\r\n * <Badge variant=\"primary\" size=\"sm\">New</Badge>\r\n * <Badge onClick={() => {}} pill>5</Badge>\r\n */\r\n\r\nimport React from 'react';\r\nimport './Badge.css';\r\n\r\ntype Variant = 'default' | 'primary' | 'success' | 'warning' | 'danger';\r\ntype Size = 'sm' | 'md' | 'lg';\r\n\r\ninterface BadgeProps {\r\n children?: React.ReactNode;\r\n\r\n // count overflow\r\n count?: number;\r\n max?: number;\r\n\r\n variant?: Variant;\r\n size?: Size;\r\n pill?: boolean;\r\n dot?: boolean;\r\n\r\n href?: string;\r\n onClick?: () => void;\r\n\r\n ariaLabel?: string;\r\n className?: string;\r\n title?: string;\r\n\r\n iconLeft?: React.ReactNode;\r\n iconRight?: React.ReactNode;\r\n}\r\n\r\n/**\r\n * Helper: detect if something is number-like\r\n * (string numeric or number)\r\n */\r\nfunction isNumberLike(val: unknown): val is number | string {\r\n if (typeof val === 'number') return true;\r\n if (\r\n typeof val === 'string' &&\r\n val.trim() !== '' &&\r\n !Number.isNaN(Number(val))\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport function Badge({\r\n children,\r\n count,\r\n max,\r\n variant = 'default',\r\n size = 'md',\r\n pill = false,\r\n dot = false,\r\n href,\r\n onClick,\r\n ariaLabel,\r\n className = '',\r\n title,\r\n iconLeft,\r\n iconRight,\r\n}: BadgeProps) {\r\n /**\r\n * Compute display logic (overflow 99+)\r\n * SAFE: no \"!\" used\r\n */\r\n let displayValue: React.ReactNode = children;\r\n\r\n if (isNumberLike(count)) {\r\n if (\r\n isNumberLike(max) &&\r\n typeof max === 'number' &&\r\n typeof count === 'number' &&\r\n count > max\r\n ) {\r\n displayValue = `${max}+`;\r\n } else {\r\n displayValue = count;\r\n }\r\n }\r\n\r\n /**\r\n * Compute aria-label\r\n */\r\n let computedAria: string | undefined = ariaLabel;\r\n\r\n if (!computedAria && isNumberLike(count)) {\r\n computedAria =\r\n typeof count === 'number' ? `${count} notifications` : undefined;\r\n }\r\n\r\n const classes = [\r\n 'ui-badge',\r\n `ui-badge--${variant}`,\r\n `ui-badge--${size}`,\r\n pill && 'ui-badge--pill',\r\n dot && 'ui-badge--dot',\r\n (href || onClick) && 'ui-badge--interactive',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n /**\r\n * Dot badge (no content)\r\n */\r\n if (dot) {\r\n return (\r\n <span\r\n className={classes}\r\n aria-label={computedAria}\r\n aria-hidden={computedAria ? undefined : true}\r\n title={title}\r\n />\r\n );\r\n }\r\n\r\n const content = (\r\n <span\r\n className=\"ui-badge-content\"\r\n aria-hidden={computedAria ? true : undefined}\r\n >\r\n {iconLeft && <span className=\"ui-badge__icon\">{iconLeft}</span>}\r\n {displayValue}\r\n {iconRight && <span className=\"ui-badge__icon\">{iconRight}</span>}\r\n </span>\r\n );\r\n\r\n /**\r\n * Anchor support\r\n */\r\n if (href) {\r\n return (\r\n <a\r\n href={href}\r\n className={classes}\r\n aria-label={computedAria}\r\n title={title}\r\n >\r\n {content}\r\n </a>\r\n );\r\n }\r\n\r\n /**\r\n * Button support\r\n */\r\n if (onClick) {\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={onClick}\r\n className={classes}\r\n aria-label={computedAria}\r\n title={title}\r\n >\r\n {content}\r\n </button>\r\n );\r\n }\r\n\r\n /**\r\n * Default <span>\r\n */\r\n return (\r\n <span className={classes} aria-label={computedAria} title={title}>\r\n {content}\r\n </span>\r\n );\r\n}\r\n"],"names":["isNumberLike","val","Badge","children","count","max","variant","size","pill","dot","href","onClick","ariaLabel","className","title","iconLeft","iconRight","displayValue","computedAria","classes","jsx","content","jsxs"],"mappings":";;AAsDA,SAASA,EAAaC,GAAsC;AAE1D,SADI,OAAOA,KAAQ,YAEjB,OAAOA,KAAQ,YACfA,EAAI,KAAA,MAAW,MACf,CAAC,OAAO,MAAM,OAAOA,CAAG,CAAC;AAK7B;AAEO,SAASC,EAAM;AAAA,EACpB,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,KAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,MAAAC,IAAO;AAAA,EACP,KAAAC,IAAM;AAAA,EACN,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AACF,GAAe;AAKb,MAAIC,IAAgCd;AAEpC,EAAIH,EAAaI,CAAK,MAElBJ,EAAaK,CAAG,KAChB,OAAOA,KAAQ,YACf,OAAOD,KAAU,YACjBA,IAAQC,IAERY,IAAe,GAAGZ,CAAG,MAErBY,IAAeb;AAOnB,MAAIc,IAAmCN;AAEvC,EAAI,CAACM,KAAgBlB,EAAaI,CAAK,MACrCc,IACE,OAAOd,KAAU,WAAW,GAAGA,CAAK,mBAAmB;AAG3D,QAAMe,IAAU;AAAA,IACd;AAAA,IACA,aAAab,CAAO;AAAA,IACpB,aAAaC,CAAI;AAAA,IACjBC,KAAQ;AAAA,IACRC,KAAO;AAAA,KACNC,KAAQC,MAAY;AAAA,IACrBE;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAKX,MAAIJ;AACF,WACE,gBAAAW;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWD;AAAA,QACX,cAAYD;AAAA,QACZ,eAAaA,IAAe,SAAY;AAAA,QACxC,OAAAJ;AAAA,MAAA;AAAA,IAAA;AAKN,QAAMO,IACJ,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAaJ,IAAe,KAAO;AAAA,MAElC,UAAA;AAAA,QAAAH,KAAY,gBAAAK,EAAC,QAAA,EAAK,WAAU,kBAAkB,UAAAL,GAAS;AAAA,QACvDE;AAAA,QACAD,KAAa,gBAAAI,EAAC,QAAA,EAAK,WAAU,kBAAkB,UAAAJ,EAAA,CAAU;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAO9D,SAAIN,IAEA,gBAAAU;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAAV;AAAA,MACA,WAAWS;AAAA,MACX,cAAYD;AAAA,MACZ,OAAAJ;AAAA,MAEC,UAAAO;AAAA,IAAA;AAAA,EAAA,IAQHV,IAEA,gBAAAS;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAAT;AAAA,MACA,WAAWQ;AAAA,MACX,cAAYD;AAAA,MACZ,OAAAJ;AAAA,MAEC,UAAAO;AAAA,IAAA;AAAA,EAAA,sBASJ,QAAA,EAAK,WAAWF,GAAS,cAAYD,GAAc,OAAAJ,GACjD,UAAAO,GACH;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BadgeGroup.cjs","sources":["../../../src/components/badge/BadgeGroup.tsx"],"sourcesContent":["/**\r\n * BadgeGroup.tsx\r\n * Stacks badges horizontally with overflow (e.g. +3).\r\n */\r\n\r\nimport React from 'react';\r\nimport { Badge } from './Badge';\r\n\r\ninterface BadgeGroupProps {\r\n items: React.ReactNode[];\r\n max?: number; // visible badges\r\n className?: string;\r\n}\r\n\r\nexport function BadgeGroup({\r\n items,\r\n max = 3,\r\n className = '',\r\n}: BadgeGroupProps) {\r\n const visible = items.slice(0, max);\r\n const extra = items.length - max;\r\n\r\n return (\r\n <div className={['ui-badge-group', className].join(' ')}>\r\n {visible.map((item, i) => (\r\n <span key={i}>{item}</span>\r\n ))}\r\n\r\n {extra > 0 && <Badge pill variant=\"default\">{`+${extra}`}</Badge>}\r\n </div>\r\n );\r\n}\r\n"],"names":["BadgeGroup","items","max","className","visible","extra","jsxs","item","i","jsx","Badge"],"mappings":"8IAcO,SAASA,EAAW,CACzB,MAAAC,EACA,IAAAC,EAAM,EACN,UAAAC,EAAY,EACd,EAAoB,CAClB,MAAMC,EAAUH,EAAM,MAAM,EAAGC,CAAG,EAC5BG,EAAQJ,EAAM,OAASC,EAE7B,OACEI,OAAC,OAAI,UAAW,CAAC,iBAAkBH,CAAS,EAAE,KAAK,GAAG,EACnD,SAAA,CAAAC,EAAQ,IAAI,CAACG,EAAMC,UACjB,OAAA,CAAc,SAAAD,CAAA,EAAJC,CAAS,CACrB,EAEAH,EAAQ,GAAKI,EAAAA,IAACC,EAAAA,MAAA,CAAM,KAAI,GAAC,QAAQ,UAAW,SAAA,IAAIL,CAAK,EAAA,CAAG,CAAA,EAC3D,CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BadgeGroup.js","sources":["../../../src/components/badge/BadgeGroup.tsx"],"sourcesContent":["/**\r\n * BadgeGroup.tsx\r\n * Stacks badges horizontally with overflow (e.g. +3).\r\n */\r\n\r\nimport React from 'react';\r\nimport { Badge } from './Badge';\r\n\r\ninterface BadgeGroupProps {\r\n items: React.ReactNode[];\r\n max?: number; // visible badges\r\n className?: string;\r\n}\r\n\r\nexport function BadgeGroup({\r\n items,\r\n max = 3,\r\n className = '',\r\n}: BadgeGroupProps) {\r\n const visible = items.slice(0, max);\r\n const extra = items.length - max;\r\n\r\n return (\r\n <div className={['ui-badge-group', className].join(' ')}>\r\n {visible.map((item, i) => (\r\n <span key={i}>{item}</span>\r\n ))}\r\n\r\n {extra > 0 && <Badge pill variant=\"default\">{`+${extra}`}</Badge>}\r\n </div>\r\n );\r\n}\r\n"],"names":["BadgeGroup","items","max","className","visible","extra","jsxs","item","i","jsx","Badge"],"mappings":";;AAcO,SAASA,EAAW;AAAA,EACzB,OAAAC;AAAA,EACA,KAAAC,IAAM;AAAA,EACN,WAAAC,IAAY;AACd,GAAoB;AAClB,QAAMC,IAAUH,EAAM,MAAM,GAAGC,CAAG,GAC5BG,IAAQJ,EAAM,SAASC;AAE7B,SACE,gBAAAI,EAAC,SAAI,WAAW,CAAC,kBAAkBH,CAAS,EAAE,KAAK,GAAG,GACnD,UAAA;AAAA,IAAAC,EAAQ,IAAI,CAACG,GAAMC,wBACjB,QAAA,EAAc,UAAAD,EAAA,GAAJC,CAAS,CACrB;AAAA,IAEAH,IAAQ,KAAK,gBAAAI,EAACC,GAAA,EAAM,MAAI,IAAC,SAAQ,WAAW,UAAA,IAAIL,CAAK,GAAA,CAAG;AAAA,EAAA,GAC3D;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Breadcrumbs.cjs","sources":["../../../src/components/breadcrumbs/Breadcrumbs.tsx"],"sourcesContent":["/**\r\n * Breadcrumbs.tsx — FINAL VERSION\r\n * --------------------------------\r\n * 100% matching your UI component architecture.\r\n *\r\n * Features:\r\n * - WAI-ARIA navigation\r\n * - Auto-collapse when too many items (optional)\r\n * - Custom separator support\r\n * - Keyboard accessible\r\n * - Ellipsis is non-interactive\r\n */\r\n\r\nimport React from 'react';\r\nimport './Breadcrumbs.css';\r\n\r\nexport interface Crumb {\r\n label: React.ReactNode;\r\n href?: string;\r\n onClick?: () => void;\r\n}\r\n\r\nexport interface BreadcrumbsProps {\r\n items: Crumb[];\r\n maxItems?: number; // collapse long breadcrumbs\r\n separator?: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function Breadcrumbs({\r\n items,\r\n maxItems = 6, // default collapse threshold\r\n separator = '›',\r\n className = '',\r\n}: BreadcrumbsProps) {\r\n if (!items.length) return null;\r\n\r\n let finalItems: (Crumb | '...')[] = [...items];\r\n\r\n /* -------------------------------------------------------\r\n * Collapse logic\r\n * ------------------------------------------------------*/\r\n if (items.length > maxItems) {\r\n const start = items.slice(0, 2);\r\n const end = items.slice(-2);\r\n finalItems = [...start, '...', ...end];\r\n }\r\n\r\n return (\r\n <nav className={`ui-breadcrumbs ${className}`} aria-label=\"Breadcrumb\">\r\n <ol className=\"ui-breadcrumbs-list\">\r\n {finalItems.map((item, index) => {\r\n const isLast = index === finalItems.length - 1;\r\n\r\n // ellipsis\r\n if (item === '...') {\r\n return (\r\n <li key={`ellipsis-${index}`} className=\"ui-breadcrumb-ellipsis\">\r\n …\r\n </li>\r\n );\r\n }\r\n\r\n const { label, href, onClick } = item;\r\n\r\n return (\r\n <li key={`crumb-${index}`} className=\"ui-breadcrumb-item\">\r\n {href || onClick ? (\r\n <a\r\n href={href}\r\n onClick={onClick}\r\n className=\"ui-breadcrumb-link\"\r\n aria-current={isLast ? 'page' : undefined}\r\n >\r\n {label}\r\n </a>\r\n ) : (\r\n <span\r\n className={`ui-breadcrumb-link ${isLast ? 'active' : ''}`}\r\n aria-current={isLast ? 'page' : undefined}\r\n >\r\n {label}\r\n </span>\r\n )}\r\n\r\n {!isLast && (\r\n <span className=\"ui-breadcrumb-separator\">{separator}</span>\r\n )}\r\n </li>\r\n );\r\n })}\r\n </ol>\r\n </nav>\r\n );\r\n}\r\n"],"names":["Breadcrumbs","items","maxItems","separator","className","finalItems","start","end","jsx","item","index","isLast","label","href","onClick","jsxs"],"mappings":"sJA6BO,SAASA,EAAY,CAC1B,MAAAC,EACA,SAAAC,EAAW,EACX,UAAAC,EAAY,IACZ,UAAAC,EAAY,EACd,EAAqB,CACnB,GAAI,CAACH,EAAM,OAAQ,OAAO,KAE1B,IAAII,EAAgC,CAAC,GAAGJ,CAAK,EAK7C,GAAIA,EAAM,OAASC,EAAU,CAC3B,MAAMI,EAAQL,EAAM,MAAM,EAAG,CAAC,EACxBM,EAAMN,EAAM,MAAM,EAAE,EAC1BI,EAAa,CAAC,GAAGC,EAAO,MAAO,GAAGC,CAAG,CACvC,CAEA,aACG,MAAA,CAAI,UAAW,kBAAkBH,CAAS,GAAI,aAAW,aACxD,SAAAI,EAAAA,IAAC,KAAA,CAAG,UAAU,sBACX,SAAAH,EAAW,IAAI,CAACI,EAAMC,IAAU,CAC/B,MAAMC,EAASD,IAAUL,EAAW,OAAS,EAG7C,GAAII,IAAS,MACX,aACG,KAAA,CAA6B,UAAU,yBAAyB,SAAA,KAAxD,YAAYC,CAAK,EAE1B,EAIJ,KAAM,CAAE,MAAAE,EAAO,KAAAC,EAAM,QAAAC,CAAA,EAAYL,EAEjC,OACEM,EAAAA,KAAC,KAAA,CAA0B,UAAU,qBAClC,SAAA,CAAAF,GAAQC,EACPN,EAAAA,IAAC,IAAA,CACC,KAAAK,EACA,QAAAC,EACA,UAAU,qBACV,eAAcH,EAAS,OAAS,OAE/B,SAAAC,CAAA,CAAA,EAGHJ,EAAAA,IAAC,OAAA,CACC,UAAW,sBAAsBG,EAAS,SAAW,EAAE,GACvD,eAAcA,EAAS,OAAS,OAE/B,SAAAC,CAAA,CAAA,EAIJ,CAACD,GACAH,EAAAA,IAAC,OAAA,CAAK,UAAU,0BAA2B,SAAAL,CAAA,CAAU,CAAA,CAAA,EApBhD,SAASO,CAAK,EAsBvB,CAEJ,CAAC,EACH,EACF,CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Breadcrumbs.js","sources":["../../../src/components/breadcrumbs/Breadcrumbs.tsx"],"sourcesContent":["/**\r\n * Breadcrumbs.tsx — FINAL VERSION\r\n * --------------------------------\r\n * 100% matching your UI component architecture.\r\n *\r\n * Features:\r\n * - WAI-ARIA navigation\r\n * - Auto-collapse when too many items (optional)\r\n * - Custom separator support\r\n * - Keyboard accessible\r\n * - Ellipsis is non-interactive\r\n */\r\n\r\nimport React from 'react';\r\nimport './Breadcrumbs.css';\r\n\r\nexport interface Crumb {\r\n label: React.ReactNode;\r\n href?: string;\r\n onClick?: () => void;\r\n}\r\n\r\nexport interface BreadcrumbsProps {\r\n items: Crumb[];\r\n maxItems?: number; // collapse long breadcrumbs\r\n separator?: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function Breadcrumbs({\r\n items,\r\n maxItems = 6, // default collapse threshold\r\n separator = '›',\r\n className = '',\r\n}: BreadcrumbsProps) {\r\n if (!items.length) return null;\r\n\r\n let finalItems: (Crumb | '...')[] = [...items];\r\n\r\n /* -------------------------------------------------------\r\n * Collapse logic\r\n * ------------------------------------------------------*/\r\n if (items.length > maxItems) {\r\n const start = items.slice(0, 2);\r\n const end = items.slice(-2);\r\n finalItems = [...start, '...', ...end];\r\n }\r\n\r\n return (\r\n <nav className={`ui-breadcrumbs ${className}`} aria-label=\"Breadcrumb\">\r\n <ol className=\"ui-breadcrumbs-list\">\r\n {finalItems.map((item, index) => {\r\n const isLast = index === finalItems.length - 1;\r\n\r\n // ellipsis\r\n if (item === '...') {\r\n return (\r\n <li key={`ellipsis-${index}`} className=\"ui-breadcrumb-ellipsis\">\r\n …\r\n </li>\r\n );\r\n }\r\n\r\n const { label, href, onClick } = item;\r\n\r\n return (\r\n <li key={`crumb-${index}`} className=\"ui-breadcrumb-item\">\r\n {href || onClick ? (\r\n <a\r\n href={href}\r\n onClick={onClick}\r\n className=\"ui-breadcrumb-link\"\r\n aria-current={isLast ? 'page' : undefined}\r\n >\r\n {label}\r\n </a>\r\n ) : (\r\n <span\r\n className={`ui-breadcrumb-link ${isLast ? 'active' : ''}`}\r\n aria-current={isLast ? 'page' : undefined}\r\n >\r\n {label}\r\n </span>\r\n )}\r\n\r\n {!isLast && (\r\n <span className=\"ui-breadcrumb-separator\">{separator}</span>\r\n )}\r\n </li>\r\n );\r\n })}\r\n </ol>\r\n </nav>\r\n );\r\n}\r\n"],"names":["Breadcrumbs","items","maxItems","separator","className","finalItems","start","end","jsx","item","index","isLast","label","href","onClick","jsxs"],"mappings":";;AA6BO,SAASA,EAAY;AAAA,EAC1B,OAAAC;AAAA,EACA,UAAAC,IAAW;AAAA;AAAA,EACX,WAAAC,IAAY;AAAA,EACZ,WAAAC,IAAY;AACd,GAAqB;AACnB,MAAI,CAACH,EAAM,OAAQ,QAAO;AAE1B,MAAII,IAAgC,CAAC,GAAGJ,CAAK;AAK7C,MAAIA,EAAM,SAASC,GAAU;AAC3B,UAAMI,IAAQL,EAAM,MAAM,GAAG,CAAC,GACxBM,IAAMN,EAAM,MAAM,EAAE;AAC1B,IAAAI,IAAa,CAAC,GAAGC,GAAO,OAAO,GAAGC,CAAG;AAAA,EACvC;AAEA,2BACG,OAAA,EAAI,WAAW,kBAAkBH,CAAS,IAAI,cAAW,cACxD,UAAA,gBAAAI,EAAC,MAAA,EAAG,WAAU,uBACX,UAAAH,EAAW,IAAI,CAACI,GAAMC,MAAU;AAC/B,UAAMC,IAASD,MAAUL,EAAW,SAAS;AAG7C,QAAII,MAAS;AACX,+BACG,MAAA,EAA6B,WAAU,0BAAyB,UAAA,OAAxD,YAAYC,CAAK,EAE1B;AAIJ,UAAM,EAAE,OAAAE,GAAO,MAAAC,GAAM,SAAAC,EAAA,IAAYL;AAEjC,WACE,gBAAAM,EAAC,MAAA,EAA0B,WAAU,sBAClC,UAAA;AAAA,MAAAF,KAAQC,IACP,gBAAAN;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAAK;AAAA,UACA,SAAAC;AAAA,UACA,WAAU;AAAA,UACV,gBAAcH,IAAS,SAAS;AAAA,UAE/B,UAAAC;AAAA,QAAA;AAAA,MAAA,IAGH,gBAAAJ;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,sBAAsBG,IAAS,WAAW,EAAE;AAAA,UACvD,gBAAcA,IAAS,SAAS;AAAA,UAE/B,UAAAC;AAAA,QAAA;AAAA,MAAA;AAAA,MAIJ,CAACD,KACA,gBAAAH,EAAC,QAAA,EAAK,WAAU,2BAA2B,UAAAL,EAAA,CAAU;AAAA,IAAA,EAAA,GApBhD,SAASO,CAAK,EAsBvB;AAAA,EAEJ,CAAC,GACH,GACF;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Button.cjs","sources":["../../../src/components/button/Button.tsx"],"sourcesContent":["/**\r\n * Button Component\r\n * ----------------\r\n * - Fully accessible\r\n * - Supports variants and sizes\r\n * - Theme-driven styling (light/dark/custom)\r\n * - No external dependencies\r\n * - Compatible with tree-shaking\r\n */\r\n\r\nimport React from 'react';\r\nimport './Button.css';\r\n\r\nexport interface ButtonProps\r\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n /**\r\n * Visual appearance of the button.\r\n * \"default\" = subtle background\r\n * \"primary\" = strong emphasis (blue)\r\n */\r\n variant?: 'default' | 'primary';\r\n\r\n /**\r\n * Adjusts padding & font-size.\r\n */\r\n size?: 'sm' | 'md' | 'lg';\r\n}\r\n\r\nexport function Button({\r\n variant = 'default',\r\n size = 'md',\r\n className = '',\r\n ...props\r\n}: ButtonProps) {\r\n const classes = [\r\n 'ui-btn',\r\n variant === 'primary' && 'ui-btn--primary',\r\n size === 'sm' && 'ui-btn--sm',\r\n size === 'lg' && 'ui-btn--lg',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n return <button className={classes} {...props} />;\r\n}\r\n"],"names":["Button","variant","size","className","props","classes","jsx"],"mappings":"iJA4BO,SAASA,EAAO,CACrB,QAAAC,EAAU,UACV,KAAAC,EAAO,KACP,UAAAC,EAAY,GACZ,GAAGC,CACL,EAAgB,CACd,MAAMC,EAAU,CACd,SACAJ,IAAY,WAAa,kBACzBC,IAAS,MAAQ,aACjBA,IAAS,MAAQ,aACjBC,CAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,EAEX,OAAOG,EAAAA,IAAC,SAAA,CAAO,UAAWD,EAAU,GAAGD,EAAO,CAChD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Button.js","sources":["../../../src/components/button/Button.tsx"],"sourcesContent":["/**\r\n * Button Component\r\n * ----------------\r\n * - Fully accessible\r\n * - Supports variants and sizes\r\n * - Theme-driven styling (light/dark/custom)\r\n * - No external dependencies\r\n * - Compatible with tree-shaking\r\n */\r\n\r\nimport React from 'react';\r\nimport './Button.css';\r\n\r\nexport interface ButtonProps\r\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n /**\r\n * Visual appearance of the button.\r\n * \"default\" = subtle background\r\n * \"primary\" = strong emphasis (blue)\r\n */\r\n variant?: 'default' | 'primary';\r\n\r\n /**\r\n * Adjusts padding & font-size.\r\n */\r\n size?: 'sm' | 'md' | 'lg';\r\n}\r\n\r\nexport function Button({\r\n variant = 'default',\r\n size = 'md',\r\n className = '',\r\n ...props\r\n}: ButtonProps) {\r\n const classes = [\r\n 'ui-btn',\r\n variant === 'primary' && 'ui-btn--primary',\r\n size === 'sm' && 'ui-btn--sm',\r\n size === 'lg' && 'ui-btn--lg',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n return <button className={classes} {...props} />;\r\n}\r\n"],"names":["Button","variant","size","className","props","classes","jsx"],"mappings":";;AA4BO,SAASA,EAAO;AAAA,EACrB,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,GAAgB;AACd,QAAMC,IAAU;AAAA,IACd;AAAA,IACAJ,MAAY,aAAa;AAAA,IACzBC,MAAS,QAAQ;AAAA,IACjBA,MAAS,QAAQ;AAAA,IACjBC;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SAAO,gBAAAG,EAAC,UAAA,EAAO,WAAWD,GAAU,GAAGD,GAAO;AAChD;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Card.cjs","sources":["../../../src/components/card/Card.tsx"],"sourcesContent":["/**\r\n * Card.tsx\r\n * ----------\r\n * Theme-aware, flexible Card component.\r\n * Supports header/body/footer & clickable states.\r\n */\r\n\r\nimport React from 'react';\r\nimport './Card.css';\r\n\r\ninterface CardProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n clickable?: boolean;\r\n hover?: boolean;\r\n onClick?: () => void;\r\n}\r\n\r\nfunction CardRoot({\r\n children,\r\n className = '',\r\n clickable = false,\r\n hover = false,\r\n onClick,\r\n}: CardProps) {\r\n return (\r\n <div\r\n className={[\r\n 'ui-card',\r\n clickable ? 'ui-card--clickable' : '',\r\n hover ? 'ui-card--hover' : '',\r\n className,\r\n ].join(' ')}\r\n role={clickable ? 'button' : undefined}\r\n tabIndex={clickable ? 0 : undefined}\r\n onClick={clickable ? onClick : undefined}\r\n onKeyDown={(e) => {\r\n if (!clickable) return;\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n onClick?.();\r\n }\r\n }}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nfunction Header({ children }: { children: React.ReactNode }) {\r\n return <div className=\"ui-card-header\">{children}</div>;\r\n}\r\n\r\nfunction Body({ children }: { children: React.ReactNode }) {\r\n return <div className=\"ui-card-body\">{children}</div>;\r\n}\r\n\r\nfunction Footer({ children }: { children: React.ReactNode }) {\r\n return <div className=\"ui-card-footer\">{children}</div>;\r\n}\r\n\r\nfunction Divider() {\r\n return <div className=\"ui-card-divider\" />;\r\n}\r\n\r\nexport const Card = Object.assign(CardRoot, {\r\n Header,\r\n Body,\r\n Footer,\r\n Divider,\r\n});\r\n"],"names":["CardRoot","children","className","clickable","hover","onClick","jsx","e","Header","Body","Footer","Divider","Card"],"mappings":"+IAkBA,SAASA,EAAS,CAChB,SAAAC,EACA,UAAAC,EAAY,GACZ,UAAAC,EAAY,GACZ,MAAAC,EAAQ,GACR,QAAAC,CACF,EAAc,CACZ,OACEC,EAAAA,IAAC,MAAA,CACC,UAAW,CACT,UACAH,EAAY,qBAAuB,GACnCC,EAAQ,iBAAmB,GAC3BF,CAAA,EACA,KAAK,GAAG,EACV,KAAMC,EAAY,SAAW,OAC7B,SAAUA,EAAY,EAAI,OAC1B,QAASA,EAAYE,EAAU,OAC/B,UAAYE,GAAM,CACXJ,IACDI,EAAE,MAAQ,SAAWA,EAAE,MAAQ,OACjCA,EAAE,eAAA,EACFF,IAAA,EAEJ,EAEC,SAAAJ,CAAA,CAAA,CAGP,CAEA,SAASO,EAAO,CAAE,SAAAP,GAA2C,CAC3D,OAAOK,EAAAA,IAAC,MAAA,CAAI,UAAU,iBAAkB,SAAAL,CAAA,CAAS,CACnD,CAEA,SAASQ,EAAK,CAAE,SAAAR,GAA2C,CACzD,OAAOK,EAAAA,IAAC,MAAA,CAAI,UAAU,eAAgB,SAAAL,CAAA,CAAS,CACjD,CAEA,SAASS,EAAO,CAAE,SAAAT,GAA2C,CAC3D,OAAOK,EAAAA,IAAC,MAAA,CAAI,UAAU,iBAAkB,SAAAL,CAAA,CAAS,CACnD,CAEA,SAASU,GAAU,CACjB,OAAOL,EAAAA,IAAC,MAAA,CAAI,UAAU,iBAAA,CAAkB,CAC1C,CAEO,MAAMM,EAAO,OAAO,OAAOZ,EAAU,CAC1C,OAAAQ,EACA,KAAAC,EACA,OAAAC,EACA,QAAAC,CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Card.js","sources":["../../../src/components/card/Card.tsx"],"sourcesContent":["/**\r\n * Card.tsx\r\n * ----------\r\n * Theme-aware, flexible Card component.\r\n * Supports header/body/footer & clickable states.\r\n */\r\n\r\nimport React from 'react';\r\nimport './Card.css';\r\n\r\ninterface CardProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n clickable?: boolean;\r\n hover?: boolean;\r\n onClick?: () => void;\r\n}\r\n\r\nfunction CardRoot({\r\n children,\r\n className = '',\r\n clickable = false,\r\n hover = false,\r\n onClick,\r\n}: CardProps) {\r\n return (\r\n <div\r\n className={[\r\n 'ui-card',\r\n clickable ? 'ui-card--clickable' : '',\r\n hover ? 'ui-card--hover' : '',\r\n className,\r\n ].join(' ')}\r\n role={clickable ? 'button' : undefined}\r\n tabIndex={clickable ? 0 : undefined}\r\n onClick={clickable ? onClick : undefined}\r\n onKeyDown={(e) => {\r\n if (!clickable) return;\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n onClick?.();\r\n }\r\n }}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nfunction Header({ children }: { children: React.ReactNode }) {\r\n return <div className=\"ui-card-header\">{children}</div>;\r\n}\r\n\r\nfunction Body({ children }: { children: React.ReactNode }) {\r\n return <div className=\"ui-card-body\">{children}</div>;\r\n}\r\n\r\nfunction Footer({ children }: { children: React.ReactNode }) {\r\n return <div className=\"ui-card-footer\">{children}</div>;\r\n}\r\n\r\nfunction Divider() {\r\n return <div className=\"ui-card-divider\" />;\r\n}\r\n\r\nexport const Card = Object.assign(CardRoot, {\r\n Header,\r\n Body,\r\n Footer,\r\n Divider,\r\n});\r\n"],"names":["CardRoot","children","className","clickable","hover","onClick","jsx","e","Header","Body","Footer","Divider","Card"],"mappings":";;AAkBA,SAASA,EAAS;AAAA,EAChB,UAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,WAAAC,IAAY;AAAA,EACZ,OAAAC,IAAQ;AAAA,EACR,SAAAC;AACF,GAAc;AACZ,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACAH,IAAY,uBAAuB;AAAA,QACnCC,IAAQ,mBAAmB;AAAA,QAC3BF;AAAA,MAAA,EACA,KAAK,GAAG;AAAA,MACV,MAAMC,IAAY,WAAW;AAAA,MAC7B,UAAUA,IAAY,IAAI;AAAA,MAC1B,SAASA,IAAYE,IAAU;AAAA,MAC/B,WAAW,CAACE,MAAM;AAChB,QAAKJ,MACDI,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SACjCA,EAAE,eAAA,GACFF,IAAA;AAAA,MAEJ;AAAA,MAEC,UAAAJ;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAASO,EAAO,EAAE,UAAAP,KAA2C;AAC3D,SAAO,gBAAAK,EAAC,OAAA,EAAI,WAAU,kBAAkB,UAAAL,EAAA,CAAS;AACnD;AAEA,SAASQ,EAAK,EAAE,UAAAR,KAA2C;AACzD,SAAO,gBAAAK,EAAC,OAAA,EAAI,WAAU,gBAAgB,UAAAL,EAAA,CAAS;AACjD;AAEA,SAASS,EAAO,EAAE,UAAAT,KAA2C;AAC3D,SAAO,gBAAAK,EAAC,OAAA,EAAI,WAAU,kBAAkB,UAAAL,EAAA,CAAS;AACnD;AAEA,SAASU,IAAU;AACjB,SAAO,gBAAAL,EAAC,OAAA,EAAI,WAAU,kBAAA,CAAkB;AAC1C;AAEO,MAAMM,IAAO,OAAO,OAAOZ,GAAU;AAAA,EAC1C,QAAAQ;AAAA,EACA,MAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC;AACF,CAAC;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkbox.cjs","sources":["../../../src/components/checkbox/Checkbox.tsx"],"sourcesContent":["/**\r\n * Checkbox.tsx\r\n * --------------\r\n * Fully accessible checkbox with 3 states:\r\n * - checked\r\n * - unchecked\r\n * - indeterminate (optional)\r\n */\r\n\r\nimport React, { useEffect, useRef } from 'react';\r\nimport './Checkbox.css';\r\n\r\ninterface CheckboxProps {\r\n checked?: boolean; // controlled\r\n defaultChecked?: boolean; // uncontrolled\r\n indeterminate?: boolean; // optional\r\n onChange?: (checked: boolean) => void;\r\n\r\n label?: React.ReactNode;\r\n disabled?: boolean;\r\n name?: string;\r\n value?: string;\r\n className?: string;\r\n}\r\n\r\nexport function Checkbox({\r\n checked,\r\n defaultChecked,\r\n indeterminate = false,\r\n onChange,\r\n label,\r\n disabled = false,\r\n name,\r\n value,\r\n className = '',\r\n}: CheckboxProps) {\r\n const inputRef = useRef<HTMLInputElement | null>(null);\r\n\r\n const isControlled = checked !== undefined;\r\n const [internal, setInternal] = React.useState(defaultChecked ?? false);\r\n\r\n const currentChecked = isControlled ? checked : internal;\r\n\r\n // Apply indeterminate visual state\r\n useEffect(() => {\r\n if (inputRef.current) {\r\n inputRef.current.indeterminate = indeterminate;\r\n }\r\n }, [indeterminate]);\r\n\r\n const toggle = () => {\r\n if (disabled) return;\r\n const newVal = !currentChecked;\r\n if (!isControlled) setInternal(newVal);\r\n onChange?.(newVal);\r\n };\r\n\r\n return (\r\n <label className={`ui-checkbox-root ${className}`}>\r\n <input\r\n ref={inputRef}\r\n type=\"checkbox\"\r\n className=\"ui-checkbox-input\"\r\n name={name}\r\n value={value}\r\n disabled={disabled}\r\n checked={currentChecked}\r\n onChange={toggle}\r\n data-state={\r\n indeterminate\r\n ? 'indeterminate'\r\n : currentChecked\r\n ? 'checked'\r\n : 'unchecked'\r\n }\r\n />\r\n\r\n {/* Visual checkmark */}\r\n <span className=\"ui-checkbox-check\" aria-hidden=\"true\">\r\n {indeterminate ? '–' : currentChecked ? '✓' : ''}\r\n </span>\r\n\r\n {label && <span className=\"ui-checkbox-label\">{label}</span>}\r\n </label>\r\n );\r\n}\r\n"],"names":["Checkbox","checked","defaultChecked","indeterminate","onChange","label","disabled","name","value","className","inputRef","useRef","isControlled","internal","setInternal","React","currentChecked","useEffect","toggle","newVal","jsxs","jsx"],"mappings":"sKAyBO,SAASA,EAAS,CACvB,QAAAC,EACA,eAAAC,EACA,cAAAC,EAAgB,GAChB,SAAAC,EACA,MAAAC,EACA,SAAAC,EAAW,GACX,KAAAC,EACA,MAAAC,EACA,UAAAC,EAAY,EACd,EAAkB,CAChB,MAAMC,EAAWC,EAAAA,OAAgC,IAAI,EAE/CC,EAAeX,IAAY,OAC3B,CAACY,EAAUC,CAAW,EAAIC,EAAM,SAASb,GAAkB,EAAK,EAEhEc,EAAiBJ,EAAeX,EAAUY,EAGhDI,EAAAA,UAAU,IAAM,CACVP,EAAS,UACXA,EAAS,QAAQ,cAAgBP,EAErC,EAAG,CAACA,CAAa,CAAC,EAElB,MAAMe,EAAS,IAAM,CACnB,GAAIZ,EAAU,OACd,MAAMa,EAAS,CAACH,EACXJ,GAAcE,EAAYK,CAAM,EACrCf,IAAWe,CAAM,CACnB,EAEA,OACEC,EAAAA,KAAC,QAAA,CAAM,UAAW,oBAAoBX,CAAS,GAC7C,SAAA,CAAAY,EAAAA,IAAC,QAAA,CACC,IAAKX,EACL,KAAK,WACL,UAAU,oBACV,KAAAH,EACA,MAAAC,EACA,SAAAF,EACA,QAASU,EACT,SAAUE,EACV,aACEf,EACI,gBACAa,EACA,UACA,WAAA,CAAA,EAKRK,EAAAA,IAAC,OAAA,CAAK,UAAU,oBAAoB,cAAY,OAC7C,SAAAlB,EAAgB,IAAMa,EAAiB,IAAM,EAAA,CAChD,EAECX,GAASgB,EAAAA,IAAC,OAAA,CAAK,UAAU,oBAAqB,SAAAhB,CAAA,CAAM,CAAA,EACvD,CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkbox.js","sources":["../../../src/components/checkbox/Checkbox.tsx"],"sourcesContent":["/**\r\n * Checkbox.tsx\r\n * --------------\r\n * Fully accessible checkbox with 3 states:\r\n * - checked\r\n * - unchecked\r\n * - indeterminate (optional)\r\n */\r\n\r\nimport React, { useEffect, useRef } from 'react';\r\nimport './Checkbox.css';\r\n\r\ninterface CheckboxProps {\r\n checked?: boolean; // controlled\r\n defaultChecked?: boolean; // uncontrolled\r\n indeterminate?: boolean; // optional\r\n onChange?: (checked: boolean) => void;\r\n\r\n label?: React.ReactNode;\r\n disabled?: boolean;\r\n name?: string;\r\n value?: string;\r\n className?: string;\r\n}\r\n\r\nexport function Checkbox({\r\n checked,\r\n defaultChecked,\r\n indeterminate = false,\r\n onChange,\r\n label,\r\n disabled = false,\r\n name,\r\n value,\r\n className = '',\r\n}: CheckboxProps) {\r\n const inputRef = useRef<HTMLInputElement | null>(null);\r\n\r\n const isControlled = checked !== undefined;\r\n const [internal, setInternal] = React.useState(defaultChecked ?? false);\r\n\r\n const currentChecked = isControlled ? checked : internal;\r\n\r\n // Apply indeterminate visual state\r\n useEffect(() => {\r\n if (inputRef.current) {\r\n inputRef.current.indeterminate = indeterminate;\r\n }\r\n }, [indeterminate]);\r\n\r\n const toggle = () => {\r\n if (disabled) return;\r\n const newVal = !currentChecked;\r\n if (!isControlled) setInternal(newVal);\r\n onChange?.(newVal);\r\n };\r\n\r\n return (\r\n <label className={`ui-checkbox-root ${className}`}>\r\n <input\r\n ref={inputRef}\r\n type=\"checkbox\"\r\n className=\"ui-checkbox-input\"\r\n name={name}\r\n value={value}\r\n disabled={disabled}\r\n checked={currentChecked}\r\n onChange={toggle}\r\n data-state={\r\n indeterminate\r\n ? 'indeterminate'\r\n : currentChecked\r\n ? 'checked'\r\n : 'unchecked'\r\n }\r\n />\r\n\r\n {/* Visual checkmark */}\r\n <span className=\"ui-checkbox-check\" aria-hidden=\"true\">\r\n {indeterminate ? '–' : currentChecked ? '✓' : ''}\r\n </span>\r\n\r\n {label && <span className=\"ui-checkbox-label\">{label}</span>}\r\n </label>\r\n );\r\n}\r\n"],"names":["Checkbox","checked","defaultChecked","indeterminate","onChange","label","disabled","name","value","className","inputRef","useRef","isControlled","internal","setInternal","React","currentChecked","useEffect","toggle","newVal","jsxs","jsx"],"mappings":";;;AAyBO,SAASA,EAAS;AAAA,EACvB,SAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,eAAAC,IAAgB;AAAA,EAChB,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC,IAAY;AACd,GAAkB;AAChB,QAAMC,IAAWC,EAAgC,IAAI,GAE/CC,IAAeX,MAAY,QAC3B,CAACY,GAAUC,CAAW,IAAIC,EAAM,SAASb,KAAkB,EAAK,GAEhEc,IAAiBJ,IAAeX,IAAUY;AAGhD,EAAAI,EAAU,MAAM;AACd,IAAIP,EAAS,YACXA,EAAS,QAAQ,gBAAgBP;AAAA,EAErC,GAAG,CAACA,CAAa,CAAC;AAElB,QAAMe,IAAS,MAAM;AACnB,QAAIZ,EAAU;AACd,UAAMa,IAAS,CAACH;AAChB,IAAKJ,KAAcE,EAAYK,CAAM,GACrCf,IAAWe,CAAM;AAAA,EACnB;AAEA,SACE,gBAAAC,EAAC,SAAA,EAAM,WAAW,oBAAoBX,CAAS,IAC7C,UAAA;AAAA,IAAA,gBAAAY;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKX;AAAA,QACL,MAAK;AAAA,QACL,WAAU;AAAA,QACV,MAAAH;AAAA,QACA,OAAAC;AAAA,QACA,UAAAF;AAAA,QACA,SAASU;AAAA,QACT,UAAUE;AAAA,QACV,cACEf,IACI,kBACAa,IACA,YACA;AAAA,MAAA;AAAA,IAAA;AAAA,IAKR,gBAAAK,EAAC,QAAA,EAAK,WAAU,qBAAoB,eAAY,QAC7C,UAAAlB,IAAgB,MAAMa,IAAiB,MAAM,GAAA,CAChD;AAAA,IAECX,KAAS,gBAAAgB,EAAC,QAAA,EAAK,WAAU,qBAAqB,UAAAhB,EAAA,CAAM;AAAA,EAAA,GACvD;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Chip.cjs","sources":["../../../src/components/chip/Chip.tsx"],"sourcesContent":["/**\r\n * Chip.tsx — FINAL VERSION\r\n * -------------------------\r\n * Features:\r\n * - Removable (optional)\r\n * - Selectable (optional)\r\n * - Sizes: sm, md\r\n * - Icons (left/right)\r\n * - Theme-aware\r\n */\r\n\r\nimport React from 'react';\r\nimport './Chip.css';\r\n\r\nexport interface ChipProps {\r\n children: React.ReactNode;\r\n\r\n /** Removable chip — shows close button */\r\n removable?: boolean;\r\n\r\n /** Selected chip state */\r\n selected?: boolean;\r\n\r\n /** Left icon element */\r\n iconLeft?: React.ReactNode;\r\n\r\n /** Right icon element */\r\n iconRight?: React.ReactNode;\r\n\r\n /** Chip size */\r\n size?: 'sm' | 'md';\r\n\r\n /** Remove handler */\r\n onRemove?: () => void;\r\n\r\n /** Select handler */\r\n onSelect?: () => void;\r\n\r\n className?: string;\r\n}\r\n\r\nexport function Chip({\r\n children,\r\n removable = false,\r\n selected = false,\r\n iconLeft,\r\n iconRight,\r\n size = 'md',\r\n onRemove,\r\n onSelect,\r\n className = '',\r\n}: ChipProps) {\r\n return (\r\n <div\r\n className={[\r\n 'ui-chip',\r\n `ui-chip--${size}`,\r\n selected ? 'selected' : '',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"button\"\r\n tabIndex={0}\r\n onClick={onSelect}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') onSelect?.();\r\n }}\r\n >\r\n {iconLeft && <span className=\"ui-chip-icon-left\">{iconLeft}</span>}\r\n\r\n <span className=\"ui-chip-label\">{children}</span>\r\n\r\n {iconRight && <span className=\"ui-chip-icon-right\">{iconRight}</span>}\r\n\r\n {removable && (\r\n <button\r\n className=\"ui-chip-remove\"\r\n aria-label=\"Remove\"\r\n onClick={(e) => {\r\n e.stopPropagation(); // prevent select\r\n onRemove?.();\r\n }}\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["Chip","children","removable","selected","iconLeft","iconRight","size","onRemove","onSelect","className","jsxs","e","jsx"],"mappings":"+IAyCO,SAASA,EAAK,CACnB,SAAAC,EACA,UAAAC,EAAY,GACZ,SAAAC,EAAW,GACX,SAAAC,EACA,UAAAC,EACA,KAAAC,EAAO,KACP,SAAAC,EACA,SAAAC,EACA,UAAAC,EAAY,EACd,EAAc,CACZ,OACEC,EAAAA,KAAC,MAAA,CACC,UAAW,CACT,UACA,YAAYJ,CAAI,GAChBH,EAAW,WAAa,GACxBM,CAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,EACX,KAAK,SACL,SAAU,EACV,QAASD,EACT,UAAYG,GAAM,EACZA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,MAAKH,IAAA,CAC1C,EAEC,SAAA,CAAAJ,GAAYQ,EAAAA,IAAC,OAAA,CAAK,UAAU,oBAAqB,SAAAR,EAAS,EAE3DQ,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,SAAAX,CAAA,CAAS,EAEzCI,GAAaO,EAAAA,IAAC,OAAA,CAAK,UAAU,qBAAsB,SAAAP,EAAU,EAE7DH,GACCU,EAAAA,IAAC,SAAA,CACC,UAAU,iBACV,aAAW,SACX,QAAUD,GAAM,CACdA,EAAE,gBAAA,EACFJ,IAAA,CACF,EACD,SAAA,GAAA,CAAA,CAED,CAAA,CAAA,CAIR"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Chip.js","sources":["../../../src/components/chip/Chip.tsx"],"sourcesContent":["/**\r\n * Chip.tsx — FINAL VERSION\r\n * -------------------------\r\n * Features:\r\n * - Removable (optional)\r\n * - Selectable (optional)\r\n * - Sizes: sm, md\r\n * - Icons (left/right)\r\n * - Theme-aware\r\n */\r\n\r\nimport React from 'react';\r\nimport './Chip.css';\r\n\r\nexport interface ChipProps {\r\n children: React.ReactNode;\r\n\r\n /** Removable chip — shows close button */\r\n removable?: boolean;\r\n\r\n /** Selected chip state */\r\n selected?: boolean;\r\n\r\n /** Left icon element */\r\n iconLeft?: React.ReactNode;\r\n\r\n /** Right icon element */\r\n iconRight?: React.ReactNode;\r\n\r\n /** Chip size */\r\n size?: 'sm' | 'md';\r\n\r\n /** Remove handler */\r\n onRemove?: () => void;\r\n\r\n /** Select handler */\r\n onSelect?: () => void;\r\n\r\n className?: string;\r\n}\r\n\r\nexport function Chip({\r\n children,\r\n removable = false,\r\n selected = false,\r\n iconLeft,\r\n iconRight,\r\n size = 'md',\r\n onRemove,\r\n onSelect,\r\n className = '',\r\n}: ChipProps) {\r\n return (\r\n <div\r\n className={[\r\n 'ui-chip',\r\n `ui-chip--${size}`,\r\n selected ? 'selected' : '',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"button\"\r\n tabIndex={0}\r\n onClick={onSelect}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') onSelect?.();\r\n }}\r\n >\r\n {iconLeft && <span className=\"ui-chip-icon-left\">{iconLeft}</span>}\r\n\r\n <span className=\"ui-chip-label\">{children}</span>\r\n\r\n {iconRight && <span className=\"ui-chip-icon-right\">{iconRight}</span>}\r\n\r\n {removable && (\r\n <button\r\n className=\"ui-chip-remove\"\r\n aria-label=\"Remove\"\r\n onClick={(e) => {\r\n e.stopPropagation(); // prevent select\r\n onRemove?.();\r\n }}\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["Chip","children","removable","selected","iconLeft","iconRight","size","onRemove","onSelect","className","jsxs","e","jsx"],"mappings":";;AAyCO,SAASA,EAAK;AAAA,EACnB,UAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,UAAAC,IAAW;AAAA,EACX,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC,IAAY;AACd,GAAc;AACZ,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,YAAYJ,CAAI;AAAA,QAChBH,IAAW,aAAa;AAAA,QACxBM;AAAA,MAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACX,MAAK;AAAA,MACL,UAAU;AAAA,MACV,SAASD;AAAA,MACT,WAAW,CAACG,MAAM;AAChB,SAAIA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,QAAKH,IAAA;AAAA,MAC1C;AAAA,MAEC,UAAA;AAAA,QAAAJ,KAAY,gBAAAQ,EAAC,QAAA,EAAK,WAAU,qBAAqB,UAAAR,GAAS;AAAA,QAE3D,gBAAAQ,EAAC,QAAA,EAAK,WAAU,iBAAiB,UAAAX,EAAA,CAAS;AAAA,QAEzCI,KAAa,gBAAAO,EAAC,QAAA,EAAK,WAAU,sBAAsB,UAAAP,GAAU;AAAA,QAE7DH,KACC,gBAAAU;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,cAAW;AAAA,YACX,SAAS,CAACD,MAAM;AACd,cAAAA,EAAE,gBAAA,GACFJ,IAAA;AAAA,YACF;AAAA,YACD,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Combobox.cjs","sources":["../../../src/components/combobox/Combobox.tsx"],"sourcesContent":["/**\r\n * Combobox.tsx\r\n * Fully WCAG-compliant Combobox integrated with your existing utilities.\r\n */\r\n\r\n/**\r\n * Combobox.tsx\r\n * Now includes:\r\n * - leftIcon (input)\r\n * - rightIcon (input)\r\n * - renderOptionIcon (listbox)\r\n */\r\n/**\r\n * Combobox.tsx\r\n * Fully WCAG-Compliant Combobox with:\r\n * - Icons (input + option)\r\n * - Value→Label mapping fixed\r\n * - Keyboard navigation\r\n * - Click outside to close\r\n * - Controlled/uncontrolled\r\n */\r\n\r\nimport React, {\r\n useState,\r\n useEffect,\r\n useRef,\r\n useCallback,\r\n KeyboardEvent,\r\n} from 'react';\r\n\r\nimport './Combobox.css';\r\n\r\n// USING YOUR EXISTING UTILS\r\nimport { onClickOutside, generateId } from '../../utils/index';\r\n\r\nexport interface ComboboxOption {\r\n label: string;\r\n value: string;\r\n icon?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxProps {\r\n options: ComboboxOption[];\r\n\r\n value?: string;\r\n defaultValue?: string;\r\n onChange?: (value: string) => void;\r\n\r\n placeholder?: string;\r\n disabled?: boolean;\r\n className?: string;\r\n emptyMessage?: string;\r\n\r\n filter?: (input: string, option: ComboboxOption) => boolean;\r\n\r\n leftIcon?: React.ReactNode;\r\n rightIcon?: React.ReactNode;\r\n\r\n renderOption?: (option: ComboboxOption, active: boolean) => React.ReactNode;\r\n renderOptionIcon?: (option: ComboboxOption) => React.ReactNode;\r\n}\r\n\r\nexport function Combobox({\r\n options,\r\n value,\r\n defaultValue,\r\n onChange,\r\n placeholder = 'Select...',\r\n disabled = false,\r\n className = '',\r\n emptyMessage = 'No results found',\r\n filter,\r\n leftIcon,\r\n rightIcon,\r\n renderOption,\r\n renderOptionIcon,\r\n}: ComboboxProps) {\r\n const isControlled = value !== undefined;\r\n\r\n /**\r\n * displayLabel = what the user SEEES in input\r\n * value = actual selected value (sent to parent)\r\n */\r\n const [displayLabel, setDisplayLabel] = useState<string>(() => {\r\n if (isControlled && value) {\r\n const match = options.find((o) => o.value === value);\r\n return match?.label ?? '';\r\n }\r\n if (defaultValue) {\r\n const match = options.find((o) => o.value === defaultValue);\r\n return match?.label ?? '';\r\n }\r\n return '';\r\n });\r\n\r\n const [open, setOpen] = useState(false);\r\n const [activeIndex, setActiveIndex] = useState<number>(-1);\r\n\r\n const wrapperRef = useRef<HTMLDivElement | null>(null);\r\n const listboxId = useRef(generateId('combobox-list')).current;\r\n\r\n /** Filtered options */\r\n const filtered = options.filter((opt) =>\r\n filter\r\n ? filter(displayLabel, opt)\r\n : opt.label.toLowerCase().includes(displayLabel.toLowerCase())\r\n );\r\n\r\n /** Set parent value */\r\n const setValue = useCallback(\r\n (val: string) => {\r\n onChange?.(val);\r\n },\r\n [onChange]\r\n );\r\n\r\n const openList = useCallback(() => {\r\n if (!disabled) setOpen(true);\r\n }, [disabled]);\r\n\r\n const closeList = useCallback(() => {\r\n setOpen(false);\r\n setActiveIndex(-1);\r\n }, []);\r\n\r\n /** Click outside to close */\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(wrapperRef, closeList);\r\n }, [open, closeList]);\r\n\r\n /** Sync controlled (value → label) */\r\n useEffect(() => {\r\n if (isControlled && value !== undefined) {\r\n const found = options.find((o) => o.value === value);\r\n setDisplayLabel(found?.label || '');\r\n }\r\n }, [isControlled, value, options]);\r\n\r\n /** Keyboard behavior */\r\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\r\n if (disabled) return;\r\n\r\n switch (e.key) {\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n if (!open) openList();\r\n setActiveIndex((i) => Math.min(filtered.length - 1, i + 1));\r\n break;\r\n\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n if (!open) openList();\r\n setActiveIndex((i) => Math.max(0, i - 1));\r\n break;\r\n\r\n case 'Enter':\r\n if (open && activeIndex >= 0) {\r\n const opt = filtered[activeIndex];\r\n setDisplayLabel(opt.label);\r\n setValue(opt.value);\r\n closeList();\r\n }\r\n break;\r\n\r\n case 'Escape':\r\n if (open) {\r\n e.preventDefault();\r\n closeList();\r\n }\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n /** Option click */\r\n const onOptionClick = (opt: ComboboxOption) => {\r\n setDisplayLabel(opt.label);\r\n setValue(opt.value);\r\n closeList();\r\n };\r\n\r\n return (\r\n <div ref={wrapperRef} className={`ui-combobox ${className}`}>\r\n {/* Input + Icons */}\r\n <div className=\"ui-combobox-input-wrapper\">\r\n {leftIcon && <span className=\"ui-combobox-left-icon\">{leftIcon}</span>}\r\n\r\n <input\r\n className={[\r\n 'ui-combobox-input',\r\n leftIcon && 'has-left-icon',\r\n rightIcon && 'has-right-icon',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"combobox\"\r\n aria-expanded={open}\r\n aria-controls={listboxId}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n value={displayLabel}\r\n onFocus={openList}\r\n onClick={openList}\r\n onChange={(e) => {\r\n setDisplayLabel(e.target.value);\r\n if (!open) openList();\r\n }}\r\n onKeyDown={onKeyDown}\r\n />\r\n\r\n {rightIcon && (\r\n <span className=\"ui-combobox-right-icon\">{rightIcon}</span>\r\n )}\r\n </div>\r\n\r\n {open && (\r\n <div id={listboxId} role=\"listbox\" className=\"ui-combobox-listbox\">\r\n {filtered.length === 0 ? (\r\n <div className=\"ui-combobox-empty\">{emptyMessage}</div>\r\n ) : (\r\n filtered.map((opt, index) => {\r\n const active = index === activeIndex;\r\n\r\n return (\r\n <div\r\n key={opt.value}\r\n role=\"option\"\r\n aria-selected={active}\r\n className={`ui-combobox-option ${active ? 'active' : ''}`}\r\n onMouseDown={(e) => e.preventDefault()}\r\n onClick={() => onOptionClick(opt)}\r\n >\r\n {/* Option icon (if provided through renderOptionIcon) */}\r\n {renderOptionIcon && (\r\n <span className=\"ui-combobox-option-icon\">\r\n {renderOptionIcon(opt)}\r\n </span>\r\n )}\r\n\r\n {renderOption ? renderOption(opt, active) : opt.label}\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["Combobox","options","value","defaultValue","onChange","placeholder","disabled","className","emptyMessage","filter","leftIcon","rightIcon","renderOption","renderOptionIcon","isControlled","displayLabel","setDisplayLabel","useState","open","setOpen","activeIndex","setActiveIndex","wrapperRef","useRef","listboxId","generateId","filtered","opt","setValue","useCallback","val","openList","closeList","useEffect","onClickOutside","found","onKeyDown","i","onOptionClick","jsxs","jsx","index","active","e"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Combobox.js","sources":["../../../src/components/combobox/Combobox.tsx"],"sourcesContent":["/**\r\n * Combobox.tsx\r\n * Fully WCAG-compliant Combobox integrated with your existing utilities.\r\n */\r\n\r\n/**\r\n * Combobox.tsx\r\n * Now includes:\r\n * - leftIcon (input)\r\n * - rightIcon (input)\r\n * - renderOptionIcon (listbox)\r\n */\r\n/**\r\n * Combobox.tsx\r\n * Fully WCAG-Compliant Combobox with:\r\n * - Icons (input + option)\r\n * - Value→Label mapping fixed\r\n * - Keyboard navigation\r\n * - Click outside to close\r\n * - Controlled/uncontrolled\r\n */\r\n\r\nimport React, {\r\n useState,\r\n useEffect,\r\n useRef,\r\n useCallback,\r\n KeyboardEvent,\r\n} from 'react';\r\n\r\nimport './Combobox.css';\r\n\r\n// USING YOUR EXISTING UTILS\r\nimport { onClickOutside, generateId } from '../../utils/index';\r\n\r\nexport interface ComboboxOption {\r\n label: string;\r\n value: string;\r\n icon?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxProps {\r\n options: ComboboxOption[];\r\n\r\n value?: string;\r\n defaultValue?: string;\r\n onChange?: (value: string) => void;\r\n\r\n placeholder?: string;\r\n disabled?: boolean;\r\n className?: string;\r\n emptyMessage?: string;\r\n\r\n filter?: (input: string, option: ComboboxOption) => boolean;\r\n\r\n leftIcon?: React.ReactNode;\r\n rightIcon?: React.ReactNode;\r\n\r\n renderOption?: (option: ComboboxOption, active: boolean) => React.ReactNode;\r\n renderOptionIcon?: (option: ComboboxOption) => React.ReactNode;\r\n}\r\n\r\nexport function Combobox({\r\n options,\r\n value,\r\n defaultValue,\r\n onChange,\r\n placeholder = 'Select...',\r\n disabled = false,\r\n className = '',\r\n emptyMessage = 'No results found',\r\n filter,\r\n leftIcon,\r\n rightIcon,\r\n renderOption,\r\n renderOptionIcon,\r\n}: ComboboxProps) {\r\n const isControlled = value !== undefined;\r\n\r\n /**\r\n * displayLabel = what the user SEEES in input\r\n * value = actual selected value (sent to parent)\r\n */\r\n const [displayLabel, setDisplayLabel] = useState<string>(() => {\r\n if (isControlled && value) {\r\n const match = options.find((o) => o.value === value);\r\n return match?.label ?? '';\r\n }\r\n if (defaultValue) {\r\n const match = options.find((o) => o.value === defaultValue);\r\n return match?.label ?? '';\r\n }\r\n return '';\r\n });\r\n\r\n const [open, setOpen] = useState(false);\r\n const [activeIndex, setActiveIndex] = useState<number>(-1);\r\n\r\n const wrapperRef = useRef<HTMLDivElement | null>(null);\r\n const listboxId = useRef(generateId('combobox-list')).current;\r\n\r\n /** Filtered options */\r\n const filtered = options.filter((opt) =>\r\n filter\r\n ? filter(displayLabel, opt)\r\n : opt.label.toLowerCase().includes(displayLabel.toLowerCase())\r\n );\r\n\r\n /** Set parent value */\r\n const setValue = useCallback(\r\n (val: string) => {\r\n onChange?.(val);\r\n },\r\n [onChange]\r\n );\r\n\r\n const openList = useCallback(() => {\r\n if (!disabled) setOpen(true);\r\n }, [disabled]);\r\n\r\n const closeList = useCallback(() => {\r\n setOpen(false);\r\n setActiveIndex(-1);\r\n }, []);\r\n\r\n /** Click outside to close */\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(wrapperRef, closeList);\r\n }, [open, closeList]);\r\n\r\n /** Sync controlled (value → label) */\r\n useEffect(() => {\r\n if (isControlled && value !== undefined) {\r\n const found = options.find((o) => o.value === value);\r\n setDisplayLabel(found?.label || '');\r\n }\r\n }, [isControlled, value, options]);\r\n\r\n /** Keyboard behavior */\r\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\r\n if (disabled) return;\r\n\r\n switch (e.key) {\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n if (!open) openList();\r\n setActiveIndex((i) => Math.min(filtered.length - 1, i + 1));\r\n break;\r\n\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n if (!open) openList();\r\n setActiveIndex((i) => Math.max(0, i - 1));\r\n break;\r\n\r\n case 'Enter':\r\n if (open && activeIndex >= 0) {\r\n const opt = filtered[activeIndex];\r\n setDisplayLabel(opt.label);\r\n setValue(opt.value);\r\n closeList();\r\n }\r\n break;\r\n\r\n case 'Escape':\r\n if (open) {\r\n e.preventDefault();\r\n closeList();\r\n }\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n /** Option click */\r\n const onOptionClick = (opt: ComboboxOption) => {\r\n setDisplayLabel(opt.label);\r\n setValue(opt.value);\r\n closeList();\r\n };\r\n\r\n return (\r\n <div ref={wrapperRef} className={`ui-combobox ${className}`}>\r\n {/* Input + Icons */}\r\n <div className=\"ui-combobox-input-wrapper\">\r\n {leftIcon && <span className=\"ui-combobox-left-icon\">{leftIcon}</span>}\r\n\r\n <input\r\n className={[\r\n 'ui-combobox-input',\r\n leftIcon && 'has-left-icon',\r\n rightIcon && 'has-right-icon',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"combobox\"\r\n aria-expanded={open}\r\n aria-controls={listboxId}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n value={displayLabel}\r\n onFocus={openList}\r\n onClick={openList}\r\n onChange={(e) => {\r\n setDisplayLabel(e.target.value);\r\n if (!open) openList();\r\n }}\r\n onKeyDown={onKeyDown}\r\n />\r\n\r\n {rightIcon && (\r\n <span className=\"ui-combobox-right-icon\">{rightIcon}</span>\r\n )}\r\n </div>\r\n\r\n {open && (\r\n <div id={listboxId} role=\"listbox\" className=\"ui-combobox-listbox\">\r\n {filtered.length === 0 ? (\r\n <div className=\"ui-combobox-empty\">{emptyMessage}</div>\r\n ) : (\r\n filtered.map((opt, index) => {\r\n const active = index === activeIndex;\r\n\r\n return (\r\n <div\r\n key={opt.value}\r\n role=\"option\"\r\n aria-selected={active}\r\n className={`ui-combobox-option ${active ? 'active' : ''}`}\r\n onMouseDown={(e) => e.preventDefault()}\r\n onClick={() => onOptionClick(opt)}\r\n >\r\n {/* Option icon (if provided through renderOptionIcon) */}\r\n {renderOptionIcon && (\r\n <span className=\"ui-combobox-option-icon\">\r\n {renderOptionIcon(opt)}\r\n </span>\r\n )}\r\n\r\n {renderOption ? renderOption(opt, active) : opt.label}\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["Combobox","options","value","defaultValue","onChange","placeholder","disabled","className","emptyMessage","filter","leftIcon","rightIcon","renderOption","renderOptionIcon","isControlled","displayLabel","setDisplayLabel","useState","open","setOpen","activeIndex","setActiveIndex","wrapperRef","useRef","listboxId","generateId","filtered","opt","setValue","useCallback","val","openList","closeList","useEffect","onClickOutside","found","onKeyDown","i","onOptionClick","jsxs","jsx","index","active","e"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPalette.cjs","sources":["../../../src/components/commandpalette/CommandPalette.tsx"],"sourcesContent":["/**\r\n * CommandPalette.tsx — FINAL VERSION\r\n * -----------------------------------\r\n * Full-featured Cmd+K command menu.\r\n * - Cmd+K / Ctrl+K global shortcut\r\n * - Search filter\r\n * - Keyboard navigation\r\n * - Portal + overlay\r\n * - Sections\r\n * - ARIA-compliant\r\n */\r\n\r\nimport {\r\n useEffect,\r\n useRef,\r\n useState,\r\n ReactNode,\r\n KeyboardEvent as ReactKeyboardEvent,\r\n} from 'react';\r\nimport './CommandPalette.css';\r\nimport { Portal, onClickOutside} from '../../utils/index';\r\n\r\nexport interface CommandItem {\r\n id: string;\r\n label: string;\r\n icon?: ReactNode;\r\n shortcut?: string;\r\n description?: string;\r\n onSelect?: () => void;\r\n}\r\n\r\nexport interface CommandSection {\r\n title?: string;\r\n items: CommandItem[];\r\n}\r\n\r\ninterface CommandPaletteProps {\r\n sections: CommandSection[];\r\n placeholder?: string;\r\n className?: string;\r\n}\r\n\r\nexport function CommandPalette({\r\n sections,\r\n placeholder = 'Search commands…',\r\n className = '',\r\n}: CommandPaletteProps) {\r\n const [open, setOpen] = useState(false);\r\n const [query, setQuery] = useState('');\r\n const [active, setActive] = useState<{ section: number; index: number }>({\r\n section: 0,\r\n index: 0,\r\n });\r\n\r\n const paletteRef = useRef<HTMLDivElement | null>(null);\r\n const inputRef = useRef<HTMLInputElement | null>(null);\r\n\r\n /** Global Cmd+K shortcut */\r\n useEffect(() => {\r\n const handler = (e: globalThis.KeyboardEvent) => {\r\n const isMac = navigator.platform.toLowerCase().includes('mac');\r\n const cmd = isMac ? e.metaKey : e.ctrlKey;\r\n\r\n if (cmd && e.key.toLowerCase() === 'k') {\r\n e.preventDefault();\r\n setOpen((o) => !o);\r\n }\r\n };\r\n\r\n document.addEventListener('keydown', handler as EventListener);\r\n return () =>\r\n document.removeEventListener('keydown', handler as EventListener);\r\n }, []);\r\n\r\n /** Close on ESC */\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const handler = (e: globalThis.KeyboardEvent) => {\r\n if (e.key === 'Escape') setOpen(false);\r\n };\r\n\r\n document.addEventListener('keydown', handler as EventListener);\r\n return () =>\r\n document.removeEventListener('keydown', handler as EventListener);\r\n }, [open]);\r\n\r\n /** Click outside to close */\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(paletteRef, () => setOpen(false));\r\n }, [open]);\r\n\r\n /** Autofocus search when opened */\r\n useEffect(() => {\r\n if (open) {\r\n setTimeout(() => inputRef.current?.focus(), 0);\r\n setQuery('');\r\n }\r\n }, [open]);\r\n\r\n /** Filtered list */\r\n const filteredSections = sections.map((sec) => ({\r\n ...sec,\r\n items: sec.items.filter((i) =>\r\n i.label.toLowerCase().includes(query.toLowerCase())\r\n ),\r\n }));\r\n\r\n /** Flatten for easier navigation */\r\n const flatList = filteredSections.flatMap((sec, sIdx) =>\r\n sec.items.map((_, iIdx) => ({ section: sIdx, index: iIdx }))\r\n );\r\n\r\n /** Handle keyboard navigation */\r\n const move = (dir: 1 | -1) => {\r\n if (flatList.length === 0) return;\r\n\r\n const currentIndex = flatList.findIndex(\r\n (x) => x.section === active.section && x.index === active.index\r\n );\r\n\r\n let next = currentIndex + dir;\r\n if (next < 0) next = flatList.length - 1;\r\n if (next >= flatList.length) next = 0;\r\n\r\n setActive(flatList[next]);\r\n };\r\n\r\n const handleKey = (e: ReactKeyboardEvent<HTMLDivElement>) => {\r\n const key = e.key;\r\n\r\n if (key === 'ArrowDown') {\r\n e.preventDefault();\r\n move(1);\r\n } else if (key === 'ArrowUp') {\r\n e.preventDefault();\r\n move(-1);\r\n } else if (key === 'Enter') {\r\n e.preventDefault();\r\n\r\n const sec = filteredSections[active.section];\r\n const item = sec?.items[active.index];\r\n\r\n if (item && item.onSelect) {\r\n item.onSelect();\r\n setOpen(false);\r\n }\r\n }\r\n };\r\n\r\n if (!open) return null;\r\n\r\n return (\r\n <Portal>\r\n <div className=\"ui-cmd-overlay\" />\r\n\r\n <div\r\n ref={paletteRef}\r\n className={`ui-cmd ${className}`}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n onKeyDown={handleKey}\r\n >\r\n {/* Search bar */}\r\n <input\r\n ref={inputRef}\r\n className=\"ui-cmd-input\"\r\n placeholder={placeholder}\r\n value={query}\r\n onChange={(e) => setQuery(e.target.value)}\r\n />\r\n\r\n <div className=\"ui-cmd-list\">\r\n {filteredSections.map((sec, sIdx) => (\r\n <div key={sIdx} className=\"ui-cmd-section\">\r\n {sec.title && (\r\n <div className=\"ui-cmd-section-title\">{sec.title}</div>\r\n )}\r\n\r\n {sec.items.length === 0 ? (\r\n <div className=\"ui-cmd-empty\">No results</div>\r\n ) : (\r\n sec.items.map((item, iIdx) => {\r\n const isActive =\r\n active.section === sIdx && active.index === iIdx;\r\n\r\n return (\r\n <div\r\n key={item.id}\r\n className={`ui-cmd-item ${isActive ? 'active' : ''}`}\r\n onMouseEnter={() =>\r\n setActive({ section: sIdx, index: iIdx })\r\n }\r\n onClick={() => {\r\n item.onSelect?.();\r\n setOpen(false);\r\n }}\r\n >\r\n {item.icon && (\r\n <span className=\"ui-cmd-icon\">{item.icon}</span>\r\n )}\r\n\r\n <div className=\"ui-cmd-meta\">\r\n <div className=\"ui-cmd-label\">{item.label}</div>\r\n {item.description && (\r\n <div className=\"ui-cmd-description\">\r\n {item.description}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {item.shortcut && (\r\n <span className=\"ui-cmd-shortcut\">{item.shortcut}</span>\r\n )}\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </Portal>\r\n );\r\n}\r\n"],"names":["CommandPalette","sections","placeholder","className","open","setOpen","useState","query","setQuery","active","setActive","paletteRef","useRef","inputRef","useEffect","handler","e","o","onClickOutside","filteredSections","sec","i","flatList","sIdx","_","iIdx","move","dir","next","x","handleKey","key","item","Portal","jsx","jsxs","isActive"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPalette.js","sources":["../../../src/components/commandpalette/CommandPalette.tsx"],"sourcesContent":["/**\r\n * CommandPalette.tsx — FINAL VERSION\r\n * -----------------------------------\r\n * Full-featured Cmd+K command menu.\r\n * - Cmd+K / Ctrl+K global shortcut\r\n * - Search filter\r\n * - Keyboard navigation\r\n * - Portal + overlay\r\n * - Sections\r\n * - ARIA-compliant\r\n */\r\n\r\nimport {\r\n useEffect,\r\n useRef,\r\n useState,\r\n ReactNode,\r\n KeyboardEvent as ReactKeyboardEvent,\r\n} from 'react';\r\nimport './CommandPalette.css';\r\nimport { Portal, onClickOutside} from '../../utils/index';\r\n\r\nexport interface CommandItem {\r\n id: string;\r\n label: string;\r\n icon?: ReactNode;\r\n shortcut?: string;\r\n description?: string;\r\n onSelect?: () => void;\r\n}\r\n\r\nexport interface CommandSection {\r\n title?: string;\r\n items: CommandItem[];\r\n}\r\n\r\ninterface CommandPaletteProps {\r\n sections: CommandSection[];\r\n placeholder?: string;\r\n className?: string;\r\n}\r\n\r\nexport function CommandPalette({\r\n sections,\r\n placeholder = 'Search commands…',\r\n className = '',\r\n}: CommandPaletteProps) {\r\n const [open, setOpen] = useState(false);\r\n const [query, setQuery] = useState('');\r\n const [active, setActive] = useState<{ section: number; index: number }>({\r\n section: 0,\r\n index: 0,\r\n });\r\n\r\n const paletteRef = useRef<HTMLDivElement | null>(null);\r\n const inputRef = useRef<HTMLInputElement | null>(null);\r\n\r\n /** Global Cmd+K shortcut */\r\n useEffect(() => {\r\n const handler = (e: globalThis.KeyboardEvent) => {\r\n const isMac = navigator.platform.toLowerCase().includes('mac');\r\n const cmd = isMac ? e.metaKey : e.ctrlKey;\r\n\r\n if (cmd && e.key.toLowerCase() === 'k') {\r\n e.preventDefault();\r\n setOpen((o) => !o);\r\n }\r\n };\r\n\r\n document.addEventListener('keydown', handler as EventListener);\r\n return () =>\r\n document.removeEventListener('keydown', handler as EventListener);\r\n }, []);\r\n\r\n /** Close on ESC */\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const handler = (e: globalThis.KeyboardEvent) => {\r\n if (e.key === 'Escape') setOpen(false);\r\n };\r\n\r\n document.addEventListener('keydown', handler as EventListener);\r\n return () =>\r\n document.removeEventListener('keydown', handler as EventListener);\r\n }, [open]);\r\n\r\n /** Click outside to close */\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(paletteRef, () => setOpen(false));\r\n }, [open]);\r\n\r\n /** Autofocus search when opened */\r\n useEffect(() => {\r\n if (open) {\r\n setTimeout(() => inputRef.current?.focus(), 0);\r\n setQuery('');\r\n }\r\n }, [open]);\r\n\r\n /** Filtered list */\r\n const filteredSections = sections.map((sec) => ({\r\n ...sec,\r\n items: sec.items.filter((i) =>\r\n i.label.toLowerCase().includes(query.toLowerCase())\r\n ),\r\n }));\r\n\r\n /** Flatten for easier navigation */\r\n const flatList = filteredSections.flatMap((sec, sIdx) =>\r\n sec.items.map((_, iIdx) => ({ section: sIdx, index: iIdx }))\r\n );\r\n\r\n /** Handle keyboard navigation */\r\n const move = (dir: 1 | -1) => {\r\n if (flatList.length === 0) return;\r\n\r\n const currentIndex = flatList.findIndex(\r\n (x) => x.section === active.section && x.index === active.index\r\n );\r\n\r\n let next = currentIndex + dir;\r\n if (next < 0) next = flatList.length - 1;\r\n if (next >= flatList.length) next = 0;\r\n\r\n setActive(flatList[next]);\r\n };\r\n\r\n const handleKey = (e: ReactKeyboardEvent<HTMLDivElement>) => {\r\n const key = e.key;\r\n\r\n if (key === 'ArrowDown') {\r\n e.preventDefault();\r\n move(1);\r\n } else if (key === 'ArrowUp') {\r\n e.preventDefault();\r\n move(-1);\r\n } else if (key === 'Enter') {\r\n e.preventDefault();\r\n\r\n const sec = filteredSections[active.section];\r\n const item = sec?.items[active.index];\r\n\r\n if (item && item.onSelect) {\r\n item.onSelect();\r\n setOpen(false);\r\n }\r\n }\r\n };\r\n\r\n if (!open) return null;\r\n\r\n return (\r\n <Portal>\r\n <div className=\"ui-cmd-overlay\" />\r\n\r\n <div\r\n ref={paletteRef}\r\n className={`ui-cmd ${className}`}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n onKeyDown={handleKey}\r\n >\r\n {/* Search bar */}\r\n <input\r\n ref={inputRef}\r\n className=\"ui-cmd-input\"\r\n placeholder={placeholder}\r\n value={query}\r\n onChange={(e) => setQuery(e.target.value)}\r\n />\r\n\r\n <div className=\"ui-cmd-list\">\r\n {filteredSections.map((sec, sIdx) => (\r\n <div key={sIdx} className=\"ui-cmd-section\">\r\n {sec.title && (\r\n <div className=\"ui-cmd-section-title\">{sec.title}</div>\r\n )}\r\n\r\n {sec.items.length === 0 ? (\r\n <div className=\"ui-cmd-empty\">No results</div>\r\n ) : (\r\n sec.items.map((item, iIdx) => {\r\n const isActive =\r\n active.section === sIdx && active.index === iIdx;\r\n\r\n return (\r\n <div\r\n key={item.id}\r\n className={`ui-cmd-item ${isActive ? 'active' : ''}`}\r\n onMouseEnter={() =>\r\n setActive({ section: sIdx, index: iIdx })\r\n }\r\n onClick={() => {\r\n item.onSelect?.();\r\n setOpen(false);\r\n }}\r\n >\r\n {item.icon && (\r\n <span className=\"ui-cmd-icon\">{item.icon}</span>\r\n )}\r\n\r\n <div className=\"ui-cmd-meta\">\r\n <div className=\"ui-cmd-label\">{item.label}</div>\r\n {item.description && (\r\n <div className=\"ui-cmd-description\">\r\n {item.description}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {item.shortcut && (\r\n <span className=\"ui-cmd-shortcut\">{item.shortcut}</span>\r\n )}\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </Portal>\r\n );\r\n}\r\n"],"names":["CommandPalette","sections","placeholder","className","open","setOpen","useState","query","setQuery","active","setActive","paletteRef","useRef","inputRef","useEffect","handler","e","o","onClickOutside","filteredSections","sec","i","flatList","sIdx","_","iIdx","move","dir","next","x","handleKey","key","item","Portal","jsx","jsxs","isActive"],"mappings":";;;;;AA0CO,SAASA,EAAe;AAAA,EAC7B,UAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,WAAAC,IAAY;AACd,GAAwB;AACtB,QAAM,CAACC,GAAMC,CAAO,IAAIC,EAAS,EAAK,GAChC,CAACC,GAAOC,CAAQ,IAAIF,EAAS,EAAE,GAC/B,CAACG,GAAQC,CAAS,IAAIJ,EAA6C;AAAA,IACvE,SAAS;AAAA,IACT,OAAO;AAAA,EAAA,CACR,GAEKK,IAAaC,EAA8B,IAAI,GAC/CC,IAAWD,EAAgC,IAAI;AAGrD,EAAAE,EAAU,MAAM;AACd,UAAMC,IAAU,CAACC,MAAgC;AAI/C,OAHc,UAAU,SAAS,YAAA,EAAc,SAAS,KAAK,IACzCA,EAAE,UAAUA,EAAE,YAEvBA,EAAE,IAAI,YAAA,MAAkB,QACjCA,EAAE,eAAA,GACFX,EAAQ,CAACY,MAAM,CAACA,CAAC;AAAA,IAErB;AAEA,oBAAS,iBAAiB,WAAWF,CAAwB,GACtD,MACL,SAAS,oBAAoB,WAAWA,CAAwB;AAAA,EACpE,GAAG,CAAA,CAAE,GAGLD,EAAU,MAAM;AACd,QAAI,CAACV,EAAM;AAEX,UAAMW,IAAU,CAACC,MAAgC;AAC/C,MAAIA,EAAE,QAAQ,YAAUX,EAAQ,EAAK;AAAA,IACvC;AAEA,oBAAS,iBAAiB,WAAWU,CAAwB,GACtD,MACL,SAAS,oBAAoB,WAAWA,CAAwB;AAAA,EACpE,GAAG,CAACX,CAAI,CAAC,GAGTU,EAAU,MAAM;AACd,QAAKV;AACL,aAAOc,EAAeP,GAAY,MAAMN,EAAQ,EAAK,CAAC;AAAA,EACxD,GAAG,CAACD,CAAI,CAAC,GAGTU,EAAU,MAAM;AACd,IAAIV,MACF,WAAW,MAAMS,EAAS,SAAS,MAAA,GAAS,CAAC,GAC7CL,EAAS,EAAE;AAAA,EAEf,GAAG,CAACJ,CAAI,CAAC;AAGT,QAAMe,IAAmBlB,EAAS,IAAI,CAACmB,OAAS;AAAA,IAC9C,GAAGA;AAAA,IACH,OAAOA,EAAI,MAAM;AAAA,MAAO,CAACC,MACvBA,EAAE,MAAM,cAAc,SAASd,EAAM,YAAA,CAAa;AAAA,IAAA;AAAA,EACpD,EACA,GAGIe,IAAWH,EAAiB;AAAA,IAAQ,CAACC,GAAKG,MAC9CH,EAAI,MAAM,IAAI,CAACI,GAAGC,OAAU,EAAE,SAASF,GAAM,OAAOE,IAAO;AAAA,EAAA,GAIvDC,IAAO,CAACC,MAAgB;AAC5B,QAAIL,EAAS,WAAW,EAAG;AAM3B,QAAIM,IAJiBN,EAAS;AAAA,MAC5B,CAACO,MAAMA,EAAE,YAAYpB,EAAO,WAAWoB,EAAE,UAAUpB,EAAO;AAAA,IAAA,IAGlCkB;AAC1B,IAAIC,IAAO,MAAGA,IAAON,EAAS,SAAS,IACnCM,KAAQN,EAAS,WAAQM,IAAO,IAEpClB,EAAUY,EAASM,CAAI,CAAC;AAAA,EAC1B,GAEME,IAAY,CAAC,MAA0C;AAC3D,UAAMC,IAAM,EAAE;AAEd,QAAIA,MAAQ;AACV,QAAE,eAAA,GACFL,EAAK,CAAC;AAAA,aACGK,MAAQ;AACjB,QAAE,eAAA,GACFL,EAAK,EAAE;AAAA,aACEK,MAAQ,SAAS;AAC1B,QAAE,eAAA;AAGF,YAAMC,IADMb,EAAiBV,EAAO,OAAO,GACzB,MAAMA,EAAO,KAAK;AAEpC,MAAIuB,KAAQA,EAAK,aACfA,EAAK,SAAA,GACL3B,EAAQ,EAAK;AAAA,IAEjB;AAAA,EACF;AAEA,SAAKD,sBAGF6B,GAAA,EACC,UAAA;AAAA,IAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,iBAAA,CAAiB;AAAA,IAEhC,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKxB;AAAA,QACL,WAAW,UAAUR,CAAS;AAAA,QAC9B,MAAK;AAAA,QACL,cAAW;AAAA,QACX,WAAW2B;AAAA,QAGX,UAAA;AAAA,UAAA,gBAAAI;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAKrB;AAAA,cACL,WAAU;AAAA,cACV,aAAAX;AAAA,cACA,OAAOK;AAAA,cACP,UAAU,CAAC,MAAMC,EAAS,EAAE,OAAO,KAAK;AAAA,YAAA;AAAA,UAAA;AAAA,UAG1C,gBAAA0B,EAAC,OAAA,EAAI,WAAU,eACZ,UAAAf,EAAiB,IAAI,CAACC,GAAKG,MAC1B,gBAAAY,EAAC,OAAA,EAAe,WAAU,kBACvB,UAAA;AAAA,YAAAf,EAAI,SACH,gBAAAc,EAAC,OAAA,EAAI,WAAU,wBAAwB,YAAI,OAAM;AAAA,YAGlDd,EAAI,MAAM,WAAW,sBACnB,OAAA,EAAI,WAAU,gBAAe,UAAA,aAAA,CAAU,IAExCA,EAAI,MAAM,IAAI,CAACY,GAAMP,MAAS;AAC5B,oBAAMW,IACJ3B,EAAO,YAAYc,KAAQd,EAAO,UAAUgB;AAE9C,qBACE,gBAAAU;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,WAAW,eAAeC,IAAW,WAAW,EAAE;AAAA,kBAClD,cAAc,MACZ1B,EAAU,EAAE,SAASa,GAAM,OAAOE,GAAM;AAAA,kBAE1C,SAAS,MAAM;AACb,oBAAAO,EAAK,WAAA,GACL3B,EAAQ,EAAK;AAAA,kBACf;AAAA,kBAEC,UAAA;AAAA,oBAAA2B,EAAK,QACJ,gBAAAE,EAAC,QAAA,EAAK,WAAU,eAAe,YAAK,MAAK;AAAA,oBAG3C,gBAAAC,EAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,sBAAA,gBAAAD,EAAC,OAAA,EAAI,WAAU,gBAAgB,UAAAF,EAAK,OAAM;AAAA,sBACzCA,EAAK,eACJ,gBAAAE,EAAC,SAAI,WAAU,sBACZ,YAAK,YAAA,CACR;AAAA,oBAAA,GAEJ;AAAA,oBAECF,EAAK,YACJ,gBAAAE,EAAC,UAAK,WAAU,mBAAmB,YAAK,SAAA,CAAS;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAxB9CF,EAAK;AAAA,cAAA;AAAA,YA4BhB,CAAC;AAAA,UAAA,EAAA,GA1CKT,CA4CV,CACD,EAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF,IAxEgB;AA0EpB;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextMenu.cjs","sources":["../../../src/components/contextmenu/ContextMenu.tsx"],"sourcesContent":["/**\r\n * ContextMenu.tsx — FINAL VERSION\r\n * --------------------------------\r\n * Features:\r\n * - Right-click (contextmenu)\r\n * - Arrow key navigation\r\n * - Roving tabIndex\r\n * - ESC + click outside to close\r\n * - Portal rendering\r\n * - Separators + icons + danger items\r\n */\r\n/**\r\n * ContextMenu.tsx — FINAL CLEAN VERSION\r\n * --------------------------------------\r\n * Features:\r\n * - Right-click context menu\r\n * - Keyboard navigation (ArrowUp/Down, Home, End, Enter)\r\n * - ESC + click outside to close\r\n * - Roving active index\r\n * - Portal rendering\r\n * - Separators + icons + danger/disabled\r\n * - 100% TypeScript safe\r\n */\r\n\r\nimport React, {\r\n useEffect,\r\n useRef,\r\n useState,\r\n ReactNode,\r\n KeyboardEvent as ReactKeyboardEvent,\r\n} from 'react';\r\nimport './ContextMenu.css';\r\nimport { Portal, onClickOutside } from '../../utils/index';\r\n\r\nexport interface MenuItem {\r\n label?: string;\r\n icon?: ReactNode;\r\n onSelect?: () => void;\r\n danger?: boolean;\r\n disabled?: boolean;\r\n type?: 'item' | 'separator';\r\n}\r\n\r\ninterface ContextMenuProps {\r\n trigger: ReactNode;\r\n items: MenuItem[];\r\n className?: string;\r\n}\r\n\r\nexport function ContextMenu({\r\n trigger,\r\n items,\r\n className = '',\r\n}: ContextMenuProps) {\r\n const [open, setOpen] = useState(false);\r\n const [pos, setPos] = useState<{ top: number; left: number } | null>(null);\r\n\r\n const menuRef = useRef<HTMLDivElement | null>(null);\r\n\r\n // active index for keyboard navigation\r\n const [activeIndex, setActiveIndex] = useState<number>(0);\r\n\r\n const handleContext = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n setPos({ top: e.clientY, left: e.clientX });\r\n setOpen(true);\r\n setActiveIndex(getFirstEnabledIndex());\r\n };\r\n\r\n /** Returns index of first enabled, non-separator item */\r\n const getFirstEnabledIndex = () => {\r\n return items.findIndex((i) => i.type !== 'separator' && !i.disabled);\r\n };\r\n\r\n /** Returns index of last enabled, non-separator item */\r\n const getLastEnabledIndex = () => {\r\n for (let i = items.length - 1; i >= 0; i--) {\r\n const it = items[i];\r\n if (it.type !== 'separator' && !it.disabled) return i;\r\n }\r\n return 0;\r\n };\r\n\r\n /** Move selection up/down */\r\n const move = (direction: 1 | -1) => {\r\n let idx = activeIndex;\r\n\r\n while (true) {\r\n idx = idx + direction;\r\n\r\n if (idx < 0) idx = items.length - 1;\r\n if (idx >= items.length) idx = 0;\r\n\r\n const it = items[idx];\r\n if (it.type !== 'separator' && !it.disabled) {\r\n setActiveIndex(idx);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n /** Keyboard events inside menu */\r\n const handleKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>) => {\r\n const { key } = e;\r\n\r\n if (key === 'ArrowDown') {\r\n e.preventDefault();\r\n move(1);\r\n } else if (key === 'ArrowUp') {\r\n e.preventDefault();\r\n move(-1);\r\n } else if (key === 'Home') {\r\n e.preventDefault();\r\n setActiveIndex(getFirstEnabledIndex());\r\n } else if (key === 'End') {\r\n e.preventDefault();\r\n setActiveIndex(getLastEnabledIndex());\r\n } else if (key === 'Enter' || key === ' ') {\r\n e.preventDefault();\r\n const it = items[activeIndex];\r\n if (it && !it.disabled && it.onSelect) {\r\n it.onSelect();\r\n setOpen(false);\r\n }\r\n }\r\n };\r\n\r\n /** ESC close – FIXED TYPE (no TS errors) */\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const handler = (e: globalThis.KeyboardEvent) => {\r\n if (e.key === 'Escape') setOpen(false);\r\n };\r\n\r\n document.addEventListener('keydown', handler as EventListener);\r\n return () =>\r\n document.removeEventListener('keydown', handler as EventListener);\r\n }, [open]);\r\n\r\n /** Click outside to close */\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(menuRef, () => setOpen(false));\r\n }, [open]);\r\n\r\n return (\r\n <div className=\"ui-contextmenu-wrapper\">\r\n <div onContextMenu={handleContext}>{trigger}</div>\r\n\r\n {open && pos && (\r\n <Portal>\r\n <div\r\n ref={menuRef}\r\n className={`ui-contextmenu ${className}`}\r\n role=\"menu\"\r\n tabIndex={-1}\r\n style={{\r\n top: pos.top,\r\n left: pos.left,\r\n position: 'fixed',\r\n }}\r\n onKeyDown={handleKeyDown}\r\n >\r\n {items.map((item, idx) => {\r\n if (item.type === 'separator') {\r\n return <div key={idx} className=\"ui-contextmenu-separator\" />;\r\n }\r\n\r\n const isActive = idx === activeIndex;\r\n\r\n return (\r\n <div\r\n key={idx}\r\n className={[\r\n 'ui-contextmenu-item',\r\n item.disabled ? 'disabled' : '',\r\n item.danger ? 'danger' : '',\r\n isActive ? 'active' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"menuitem\"\r\n tabIndex={-1}\r\n aria-disabled={item.disabled || undefined}\r\n onMouseEnter={() => setActiveIndex(idx)}\r\n onClick={() => {\r\n if (!item.disabled) {\r\n item.onSelect?.();\r\n setOpen(false);\r\n }\r\n }}\r\n >\r\n {item.icon && (\r\n <span className=\"ui-contextmenu-icon\">{item.icon}</span>\r\n )}\r\n <span>{item.label}</span>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </Portal>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["ContextMenu","trigger","items","className","open","setOpen","useState","pos","setPos","menuRef","useRef","activeIndex","setActiveIndex","handleContext","getFirstEnabledIndex","i","getLastEnabledIndex","it","move","direction","idx","handleKeyDown","key","useEffect","handler","e","onClickOutside","jsxs","jsx","Portal","item","isActive"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextMenu.js","sources":["../../../src/components/contextmenu/ContextMenu.tsx"],"sourcesContent":["/**\r\n * ContextMenu.tsx — FINAL VERSION\r\n * --------------------------------\r\n * Features:\r\n * - Right-click (contextmenu)\r\n * - Arrow key navigation\r\n * - Roving tabIndex\r\n * - ESC + click outside to close\r\n * - Portal rendering\r\n * - Separators + icons + danger items\r\n */\r\n/**\r\n * ContextMenu.tsx — FINAL CLEAN VERSION\r\n * --------------------------------------\r\n * Features:\r\n * - Right-click context menu\r\n * - Keyboard navigation (ArrowUp/Down, Home, End, Enter)\r\n * - ESC + click outside to close\r\n * - Roving active index\r\n * - Portal rendering\r\n * - Separators + icons + danger/disabled\r\n * - 100% TypeScript safe\r\n */\r\n\r\nimport React, {\r\n useEffect,\r\n useRef,\r\n useState,\r\n ReactNode,\r\n KeyboardEvent as ReactKeyboardEvent,\r\n} from 'react';\r\nimport './ContextMenu.css';\r\nimport { Portal, onClickOutside } from '../../utils/index';\r\n\r\nexport interface MenuItem {\r\n label?: string;\r\n icon?: ReactNode;\r\n onSelect?: () => void;\r\n danger?: boolean;\r\n disabled?: boolean;\r\n type?: 'item' | 'separator';\r\n}\r\n\r\ninterface ContextMenuProps {\r\n trigger: ReactNode;\r\n items: MenuItem[];\r\n className?: string;\r\n}\r\n\r\nexport function ContextMenu({\r\n trigger,\r\n items,\r\n className = '',\r\n}: ContextMenuProps) {\r\n const [open, setOpen] = useState(false);\r\n const [pos, setPos] = useState<{ top: number; left: number } | null>(null);\r\n\r\n const menuRef = useRef<HTMLDivElement | null>(null);\r\n\r\n // active index for keyboard navigation\r\n const [activeIndex, setActiveIndex] = useState<number>(0);\r\n\r\n const handleContext = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n setPos({ top: e.clientY, left: e.clientX });\r\n setOpen(true);\r\n setActiveIndex(getFirstEnabledIndex());\r\n };\r\n\r\n /** Returns index of first enabled, non-separator item */\r\n const getFirstEnabledIndex = () => {\r\n return items.findIndex((i) => i.type !== 'separator' && !i.disabled);\r\n };\r\n\r\n /** Returns index of last enabled, non-separator item */\r\n const getLastEnabledIndex = () => {\r\n for (let i = items.length - 1; i >= 0; i--) {\r\n const it = items[i];\r\n if (it.type !== 'separator' && !it.disabled) return i;\r\n }\r\n return 0;\r\n };\r\n\r\n /** Move selection up/down */\r\n const move = (direction: 1 | -1) => {\r\n let idx = activeIndex;\r\n\r\n while (true) {\r\n idx = idx + direction;\r\n\r\n if (idx < 0) idx = items.length - 1;\r\n if (idx >= items.length) idx = 0;\r\n\r\n const it = items[idx];\r\n if (it.type !== 'separator' && !it.disabled) {\r\n setActiveIndex(idx);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n /** Keyboard events inside menu */\r\n const handleKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>) => {\r\n const { key } = e;\r\n\r\n if (key === 'ArrowDown') {\r\n e.preventDefault();\r\n move(1);\r\n } else if (key === 'ArrowUp') {\r\n e.preventDefault();\r\n move(-1);\r\n } else if (key === 'Home') {\r\n e.preventDefault();\r\n setActiveIndex(getFirstEnabledIndex());\r\n } else if (key === 'End') {\r\n e.preventDefault();\r\n setActiveIndex(getLastEnabledIndex());\r\n } else if (key === 'Enter' || key === ' ') {\r\n e.preventDefault();\r\n const it = items[activeIndex];\r\n if (it && !it.disabled && it.onSelect) {\r\n it.onSelect();\r\n setOpen(false);\r\n }\r\n }\r\n };\r\n\r\n /** ESC close – FIXED TYPE (no TS errors) */\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const handler = (e: globalThis.KeyboardEvent) => {\r\n if (e.key === 'Escape') setOpen(false);\r\n };\r\n\r\n document.addEventListener('keydown', handler as EventListener);\r\n return () =>\r\n document.removeEventListener('keydown', handler as EventListener);\r\n }, [open]);\r\n\r\n /** Click outside to close */\r\n useEffect(() => {\r\n if (!open) return;\r\n return onClickOutside(menuRef, () => setOpen(false));\r\n }, [open]);\r\n\r\n return (\r\n <div className=\"ui-contextmenu-wrapper\">\r\n <div onContextMenu={handleContext}>{trigger}</div>\r\n\r\n {open && pos && (\r\n <Portal>\r\n <div\r\n ref={menuRef}\r\n className={`ui-contextmenu ${className}`}\r\n role=\"menu\"\r\n tabIndex={-1}\r\n style={{\r\n top: pos.top,\r\n left: pos.left,\r\n position: 'fixed',\r\n }}\r\n onKeyDown={handleKeyDown}\r\n >\r\n {items.map((item, idx) => {\r\n if (item.type === 'separator') {\r\n return <div key={idx} className=\"ui-contextmenu-separator\" />;\r\n }\r\n\r\n const isActive = idx === activeIndex;\r\n\r\n return (\r\n <div\r\n key={idx}\r\n className={[\r\n 'ui-contextmenu-item',\r\n item.disabled ? 'disabled' : '',\r\n item.danger ? 'danger' : '',\r\n isActive ? 'active' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"menuitem\"\r\n tabIndex={-1}\r\n aria-disabled={item.disabled || undefined}\r\n onMouseEnter={() => setActiveIndex(idx)}\r\n onClick={() => {\r\n if (!item.disabled) {\r\n item.onSelect?.();\r\n setOpen(false);\r\n }\r\n }}\r\n >\r\n {item.icon && (\r\n <span className=\"ui-contextmenu-icon\">{item.icon}</span>\r\n )}\r\n <span>{item.label}</span>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </Portal>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["ContextMenu","trigger","items","className","open","setOpen","useState","pos","setPos","menuRef","useRef","activeIndex","setActiveIndex","handleContext","getFirstEnabledIndex","i","getLastEnabledIndex","it","move","direction","idx","handleKeyDown","key","useEffect","handler","e","onClickOutside","jsxs","jsx","Portal","item","isActive"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataGrid.cjs","sources":["../../../src/components/datagrid/DataGrid.tsx"],"sourcesContent":["/**\r\n * DataGrid.tsx\r\n * -------------\r\n * Vercel-style DataGrid for NUI\r\n *\r\n * Features:\r\n * - Sortable columns\r\n * - Sticky header\r\n * - Optional row selection (checkbox)\r\n * - Row actions slot\r\n * - Pagination (client-side)\r\n * - Keyboard navigation & focus\r\n * - Accessible (aria-sort, aria-selected, table/grid roles)\r\n */\r\n\r\nimport React, { useMemo, useState } from 'react';\r\nimport './DataGrid.css';\r\n\r\nexport type DataRow = Record<string, unknown> & {\r\n id?: string | number;\r\n};\r\n\r\nexport type DataGridColumn<T extends DataRow = DataRow> = {\r\n key: keyof T & string;\r\n title: React.ReactNode;\r\n sortable?: boolean;\r\n width?: number | string;\r\n align?: 'left' | 'center' | 'right';\r\n render?: (row: T) => React.ReactNode;\r\n};\r\n\r\nexport interface DataGridProps<T extends DataRow = DataRow> {\r\n columns: DataGridColumn<T>[];\r\n rows: T[];\r\n\r\n page?: number;\r\n pageSize?: number;\r\n onPageChange?: (page: number) => void;\r\n\r\n selectable?: boolean;\r\n selectedRowIds?: Set<string | number>;\r\n onSelectionChange?: (ids: Set<string | number>) => void;\r\n\r\n onRowClick?: (row: T) => void;\r\n renderRowActions?: (row: T) => React.ReactNode;\r\n\r\n className?: string;\r\n disablePagination?: boolean;\r\n}\r\n\r\ntype SortState = { key: string | null; dir: 'asc' | 'desc' | null };\r\n\r\nexport function DataGrid<T extends DataRow = DataRow>({\r\n columns,\r\n rows,\r\n page: controlledPage,\r\n pageSize = 10,\r\n onPageChange,\r\n\r\n selectable = false,\r\n selectedRowIds,\r\n onSelectionChange,\r\n\r\n onRowClick,\r\n renderRowActions,\r\n className = '',\r\n disablePagination = false,\r\n}: DataGridProps<T>) {\r\n const [sort, setSort] = useState<SortState>({ key: null, dir: null });\r\n const [internalPage, setInternalPage] = useState(1);\r\n const currentPage = controlledPage ?? internalPage;\r\n\r\n const [internalSelection, setInternalSelection] = useState<\r\n Set<string | number>\r\n >(new Set());\r\n\r\n const selection = selectedRowIds ?? internalSelection;\r\n\r\n const totalPages = useMemo(() => {\r\n if (disablePagination) return 1;\r\n return Math.max(1, Math.ceil(rows.length / pageSize));\r\n }, [rows.length, pageSize, disablePagination]);\r\n\r\n const sortedRows = useMemo(() => {\r\n if (!sort.key || !sort.dir) return [...rows];\r\n\r\n const key = sort.key as keyof T;\r\n const dir = sort.dir === 'asc' ? 1 : -1;\r\n\r\n return [...rows].sort((a, b) => {\r\n const va = a[key];\r\n const vb = b[key];\r\n\r\n if (va === undefined && vb !== undefined) return -1 * dir;\r\n if (vb === undefined && va !== undefined) return 1 * dir;\r\n\r\n if (typeof va === 'number' && typeof vb === 'number') {\r\n return (va - vb) * dir;\r\n }\r\n\r\n if (va instanceof Date && vb instanceof Date) {\r\n return (va.getTime() - vb.getTime()) * dir;\r\n }\r\n\r\n return String(va ?? '').localeCompare(String(vb ?? '')) * dir;\r\n });\r\n }, [rows, sort]);\r\n\r\n const paginatedRows = useMemo(() => {\r\n if (disablePagination) return sortedRows;\r\n const start = (currentPage - 1) * pageSize;\r\n return sortedRows.slice(start, start + pageSize);\r\n }, [sortedRows, currentPage, pageSize, disablePagination]);\r\n\r\n const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\r\n\r\n const rowId = (r: T, idx: number) =>\r\n r.id ?? `row-${idx}-${Math.random().toString(36).slice(2, 7)}`;\r\n\r\n const toggleSort = (key: string) => {\r\n setSort((prev) => {\r\n if (prev.key !== key) return { key, dir: 'asc' };\r\n if (prev.dir === 'asc') return { key, dir: 'desc' };\r\n return { key: null, dir: null };\r\n });\r\n };\r\n\r\n const setPage = (page: number) => {\r\n const next = Math.max(1, Math.min(totalPages, page));\r\n if (controlledPage === undefined) setInternalPage(next);\r\n onPageChange?.(next);\r\n };\r\n\r\n const toggleSelectRow = (id: string | number) => {\r\n const update = (set: Set<string | number>) => {\r\n const next = new Set(set);\r\n if (next.has(id)) next.delete(id);\r\n else next.add(id);\r\n return next;\r\n };\r\n\r\n if (selectedRowIds) {\r\n const next = update(selection);\r\n onSelectionChange?.(next);\r\n } else {\r\n setInternalSelection((prev) => {\r\n const next = update(prev);\r\n onSelectionChange?.(next);\r\n return next;\r\n });\r\n }\r\n };\r\n\r\n const selectAllOnPage = () => {\r\n const ids = paginatedRows.map((r, i) => r.id ?? rowId(r, i));\r\n const allSelected = ids.every((id) => selection.has(id));\r\n\r\n const update = (set: Set<string | number>) => {\r\n const next = new Set(set);\r\n if (allSelected) ids.forEach((id) => next.delete(id));\r\n else ids.forEach((id) => next.add(id));\r\n return next;\r\n };\r\n\r\n if (selectedRowIds) {\r\n const next = update(selection);\r\n onSelectionChange?.(next);\r\n } else {\r\n setInternalSelection((prev) => {\r\n const next = update(prev);\r\n onSelectionChange?.(next);\r\n return next;\r\n });\r\n }\r\n };\r\n\r\n const onKeyDownTable = (e: React.KeyboardEvent<HTMLDivElement>): void => {\r\n if (paginatedRows.length === 0) return;\r\n\r\n switch (e.key) {\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n setFocusedIndex((prev) =>\r\n prev === null ? 0 : Math.min(paginatedRows.length - 1, prev + 1)\r\n );\r\n break;\r\n\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n setFocusedIndex((prev) => (prev === null ? 0 : Math.max(0, prev - 1)));\r\n break;\r\n\r\n case 'PageDown':\r\n e.preventDefault();\r\n setPage(currentPage + 1);\r\n setFocusedIndex(0);\r\n break;\r\n\r\n case 'PageUp':\r\n e.preventDefault();\r\n setPage(currentPage - 1);\r\n setFocusedIndex(0);\r\n break;\r\n\r\n case 'Home':\r\n e.preventDefault();\r\n setFocusedIndex(0);\r\n break;\r\n\r\n case 'End':\r\n e.preventDefault();\r\n setFocusedIndex(paginatedRows.length - 1);\r\n break;\r\n\r\n case 'Enter':\r\n e.preventDefault();\r\n if (focusedIndex !== null) {\r\n const row = paginatedRows[focusedIndex];\r\n const id = row.id ?? rowId(row, focusedIndex);\r\n if (selectable) toggleSelectRow(id);\r\n onRowClick?.(row);\r\n }\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n const showActions = Boolean(renderRowActions);\r\n\r\n return (\r\n <div\r\n className={`ui-datagrid ${className}`}\r\n onKeyDown={onKeyDownTable}\r\n tabIndex={0}\r\n role=\"grid\"\r\n aria-rowcount={rows.length}\r\n >\r\n <div className=\"ui-datagrid-table\">\r\n {/* HEADER */}\r\n <div className=\"ui-datagrid-header\" role=\"row\">\r\n {selectable && (\r\n <div className=\"ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--select\">\r\n <input\r\n type=\"checkbox\"\r\n aria-label=\"Select all on page\"\r\n onChange={selectAllOnPage}\r\n checked={\r\n paginatedRows.length > 0 &&\r\n paginatedRows.every((r, i) =>\r\n selection.has(r.id ?? rowId(r, i))\r\n )\r\n }\r\n />\r\n </div>\r\n )}\r\n\r\n {columns.map((col) => {\r\n const isSorted = sort.key === col.key;\r\n return (\r\n <div\r\n key={col.key}\r\n className={`ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--${\r\n col.align ?? 'left'\r\n }`}\r\n role=\"columnheader\"\r\n style={{ width: col.width }}\r\n aria-sort={\r\n isSorted\r\n ? sort.dir === 'asc'\r\n ? 'ascending'\r\n : 'descending'\r\n : 'none'\r\n }\r\n onClick={() => col.sortable && toggleSort(col.key)}\r\n >\r\n <div className=\"ui-datagrid-header-content\">\r\n <span>{col.title}</span>\r\n {col.sortable && (\r\n <span className=\"ui-datagrid-sort-indicator\">\r\n {isSorted ? (sort.dir === 'asc' ? '▲' : '▼') : '⤓'}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n\r\n {showActions && (\r\n <div className=\"ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--actions\" />\r\n )}\r\n </div>\r\n\r\n {/* BODY */}\r\n <div className=\"ui-datagrid-body\" role=\"rowgroup\">\r\n {paginatedRows.length === 0 ? (\r\n <div className=\"ui-datagrid-empty\">No data</div>\r\n ) : (\r\n paginatedRows.map((row, idx) => {\r\n const rid = row.id ?? rowId(row, idx);\r\n const isSelected = selection.has(rid);\r\n const focused = focusedIndex === idx;\r\n\r\n return (\r\n <div\r\n key={String(rid)}\r\n className={[\r\n 'ui-datagrid-row',\r\n isSelected ? 'selected' : '',\r\n focused ? 'focused' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"row\"\r\n tabIndex={focused ? 0 : -1}\r\n aria-selected={isSelected || undefined}\r\n onClick={() => {\r\n if (selectable) toggleSelectRow(rid);\r\n onRowClick?.(row);\r\n setFocusedIndex(idx);\r\n }}\r\n onFocus={() => setFocusedIndex(idx)}\r\n >\r\n {selectable && (\r\n <div className=\"ui-datagrid-cell ui-datagrid-cell--select\">\r\n <input\r\n type=\"checkbox\"\r\n checked={isSelected}\r\n onClick={(e) => e.stopPropagation()}\r\n onChange={() => toggleSelectRow(rid)}\r\n aria-label={`Select row ${String(rid)}`}\r\n />\r\n </div>\r\n )}\r\n\r\n {columns.map((col) => (\r\n <div\r\n key={col.key}\r\n role=\"gridcell\"\r\n className={`ui-datagrid-cell ui-datagrid-cell--${\r\n col.align ?? 'left'\r\n }`}\r\n style={{ width: col.width }}\r\n >\r\n {col.render\r\n ? col.render(row)\r\n : String(row[col.key] ?? '')}\r\n </div>\r\n ))}\r\n\r\n {showActions && (\r\n <div className=\"ui-datagrid-cell ui-datagrid-cell--actions\">\r\n {renderRowActions?.(row)}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n\r\n {/* PAGINATION */}\r\n {!disablePagination && totalPages > 1 && (\r\n <div className=\"ui-datagrid-footer\">\r\n <button\r\n className=\"ui-datagrid-page-btn\"\r\n onClick={() => setPage(1)}\r\n disabled={currentPage === 1}\r\n >\r\n «\r\n </button>\r\n\r\n <button\r\n className=\"ui-datagrid-page-btn\"\r\n onClick={() => setPage(currentPage - 1)}\r\n disabled={currentPage === 1}\r\n >\r\n ‹\r\n </button>\r\n\r\n <div className=\"ui-datagrid-page-info\">\r\n Page {currentPage} of {totalPages}\r\n </div>\r\n\r\n <button\r\n className=\"ui-datagrid-page-btn\"\r\n onClick={() => setPage(currentPage + 1)}\r\n disabled={currentPage === totalPages}\r\n >\r\n ›\r\n </button>\r\n\r\n <button\r\n className=\"ui-datagrid-page-btn\"\r\n onClick={() => setPage(totalPages)}\r\n disabled={currentPage === totalPages}\r\n >\r\n »\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["DataGrid","columns","rows","controlledPage","pageSize","onPageChange","selectable","selectedRowIds","onSelectionChange","onRowClick","renderRowActions","className","disablePagination","sort","setSort","useState","internalPage","setInternalPage","currentPage","internalSelection","setInternalSelection","selection","totalPages","useMemo","sortedRows","key","dir","a","b","va","vb","paginatedRows","start","focusedIndex","setFocusedIndex","rowId","r","idx","toggleSort","prev","setPage","page","next","toggleSelectRow","id","update","set","selectAllOnPage","ids","allSelected","onKeyDownTable","row","showActions","jsx","jsxs","i","col","isSorted","rid","isSelected","focused","e"],"mappings":"sKAoDO,SAASA,EAAsC,CACpD,QAAAC,EACA,KAAAC,EACA,KAAMC,EACN,SAAAC,EAAW,GACX,aAAAC,EAEA,WAAAC,EAAa,GACb,eAAAC,EACA,kBAAAC,EAEA,WAAAC,EACA,iBAAAC,EACA,UAAAC,EAAY,GACZ,kBAAAC,EAAoB,EACtB,EAAqB,CACnB,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAoB,CAAE,IAAK,KAAM,IAAK,KAAM,EAC9D,CAACC,EAAcC,CAAe,EAAIF,EAAAA,SAAS,CAAC,EAC5CG,EAAcf,GAAkBa,EAEhC,CAACG,EAAmBC,CAAoB,EAAIL,EAAAA,SAEhD,IAAI,GAAK,EAELM,EAAYd,GAAkBY,EAE9BG,EAAaC,EAAAA,QAAQ,IACrBX,EAA0B,EACvB,KAAK,IAAI,EAAG,KAAK,KAAKV,EAAK,OAASE,CAAQ,CAAC,EACnD,CAACF,EAAK,OAAQE,EAAUQ,CAAiB,CAAC,EAEvCY,EAAaD,EAAAA,QAAQ,IAAM,CAC/B,GAAI,CAACV,EAAK,KAAO,CAACA,EAAK,IAAK,MAAO,CAAC,GAAGX,CAAI,EAE3C,MAAMuB,EAAMZ,EAAK,IACXa,EAAMb,EAAK,MAAQ,MAAQ,EAAI,GAErC,MAAO,CAAC,GAAGX,CAAI,EAAE,KAAK,CAACyB,EAAGC,IAAM,CAC9B,MAAMC,EAAKF,EAAEF,CAAG,EACVK,EAAKF,EAAEH,CAAG,EAEhB,OAAII,IAAO,QAAaC,IAAO,OAAkB,GAAKJ,EAClDI,IAAO,QAAaD,IAAO,OAAkB,EAAIH,EAEjD,OAAOG,GAAO,UAAY,OAAOC,GAAO,UAClCD,EAAKC,GAAMJ,EAGjBG,aAAc,MAAQC,aAAc,MAC9BD,EAAG,QAAA,EAAYC,EAAG,WAAaJ,EAGlC,OAAOG,GAAM,EAAE,EAAE,cAAc,OAAOC,GAAM,EAAE,CAAC,EAAIJ,CAC5D,CAAC,CACH,EAAG,CAACxB,EAAMW,CAAI,CAAC,EAETkB,EAAgBR,EAAAA,QAAQ,IAAM,CAClC,GAAIX,EAAmB,OAAOY,EAC9B,MAAMQ,GAASd,EAAc,GAAKd,EAClC,OAAOoB,EAAW,MAAMQ,EAAOA,EAAQ5B,CAAQ,CACjD,EAAG,CAACoB,EAAYN,EAAad,EAAUQ,CAAiB,CAAC,EAEnD,CAACqB,EAAcC,CAAe,EAAInB,EAAAA,SAAwB,IAAI,EAE9DoB,EAAQ,CAACC,EAAMC,IACnBD,EAAE,IAAM,OAAOC,CAAG,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,EAAG,CAAC,CAAC,GAExDC,EAAcb,GAAgB,CAClCX,EAASyB,GACHA,EAAK,MAAQd,EAAY,CAAE,IAAAA,EAAK,IAAK,KAAA,EACrCc,EAAK,MAAQ,MAAc,CAAE,IAAAd,EAAK,IAAK,MAAA,EACpC,CAAE,IAAK,KAAM,IAAK,IAAA,CAC1B,CACH,EAEMe,EAAWC,GAAiB,CAChC,MAAMC,EAAO,KAAK,IAAI,EAAG,KAAK,IAAIpB,EAAYmB,CAAI,CAAC,EAC/CtC,IAAmB,QAAWc,EAAgByB,CAAI,EACtDrC,IAAeqC,CAAI,CACrB,EAEMC,EAAmBC,GAAwB,CAC/C,MAAMC,EAAUC,GAA8B,CAC5C,MAAMJ,EAAO,IAAI,IAAII,CAAG,EACxB,OAAIJ,EAAK,IAAIE,CAAE,EAAGF,EAAK,OAAOE,CAAE,EAC3BF,EAAK,IAAIE,CAAE,EACTF,CACT,EAEA,GAAInC,EAAgB,CAClB,MAAMmC,EAAOG,EAAOxB,CAAS,EAC7Bb,IAAoBkC,CAAI,CAC1B,MACEtB,EAAsBmB,GAAS,CAC7B,MAAMG,EAAOG,EAAON,CAAI,EACxB,OAAA/B,IAAoBkC,CAAI,EACjBA,CACT,CAAC,CAEL,EAEMK,EAAkB,IAAM,CAC5B,MAAMC,EAAMjB,EAAc,IAAI,CAACK,EAAG,IAAMA,EAAE,IAAMD,EAAMC,EAAG,CAAC,CAAC,EACrDa,EAAcD,EAAI,MAAOJ,GAAOvB,EAAU,IAAIuB,CAAE,CAAC,EAEjDC,EAAUC,GAA8B,CAC5C,MAAMJ,EAAO,IAAI,IAAII,CAAG,EACxB,OAAIG,IAAiB,QAASL,GAAOF,EAAK,OAAOE,CAAE,CAAC,IAC3C,QAASA,GAAOF,EAAK,IAAIE,CAAE,CAAC,EAC9BF,CACT,EAEA,GAAInC,EAAgB,CAClB,MAAMmC,EAAOG,EAAOxB,CAAS,EAC7Bb,IAAoBkC,CAAI,CAC1B,MACEtB,EAAsBmB,GAAS,CAC7B,MAAMG,EAAOG,EAAON,CAAI,EACxB,OAAA/B,IAAoBkC,CAAI,EACjBA,CACT,CAAC,CAEL,EAEMQ,EAAkB,GAAiD,CACvE,GAAInB,EAAc,SAAW,EAE7B,OAAQ,EAAE,IAAA,CACR,IAAK,YACH,EAAE,eAAA,EACFG,EAAiBK,GACfA,IAAS,KAAO,EAAI,KAAK,IAAIR,EAAc,OAAS,EAAGQ,EAAO,CAAC,CAAA,EAEjE,MAEF,IAAK,UACH,EAAE,eAAA,EACFL,EAAiBK,GAAUA,IAAS,KAAO,EAAI,KAAK,IAAI,EAAGA,EAAO,CAAC,CAAE,EACrE,MAEF,IAAK,WACH,EAAE,eAAA,EACFC,EAAQtB,EAAc,CAAC,EACvBgB,EAAgB,CAAC,EACjB,MAEF,IAAK,SACH,EAAE,eAAA,EACFM,EAAQtB,EAAc,CAAC,EACvBgB,EAAgB,CAAC,EACjB,MAEF,IAAK,OACH,EAAE,eAAA,EACFA,EAAgB,CAAC,EACjB,MAEF,IAAK,MACH,EAAE,eAAA,EACFA,EAAgBH,EAAc,OAAS,CAAC,EACxC,MAEF,IAAK,QAEH,GADA,EAAE,eAAA,EACEE,IAAiB,KAAM,CACzB,MAAMkB,EAAMpB,EAAcE,CAAY,EAChCW,EAAKO,EAAI,IAAMhB,EAAMgB,EAAKlB,CAAY,EACxC3B,KAA4BsC,CAAE,EAClCnC,IAAa0C,CAAG,CAClB,CACA,KAGA,CAEN,EAEMC,EAAc,EAAQ1C,EAE5B,OACE2C,EAAAA,IAAC,MAAA,CACC,UAAW,eAAe1C,CAAS,GACnC,UAAWuC,EACX,SAAU,EACV,KAAK,OACL,gBAAehD,EAAK,OAEpB,SAAAoD,EAAAA,KAAC,MAAA,CAAI,UAAU,oBAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,qBAAqB,KAAK,MACtC,SAAA,CAAAhD,GACC+C,EAAAA,IAAC,MAAA,CAAI,UAAU,qEACb,SAAAA,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,aAAW,qBACX,SAAUN,EACV,QACEhB,EAAc,OAAS,GACvBA,EAAc,MAAM,CAACK,EAAGmB,IACtBlC,EAAU,IAAIe,EAAE,IAAMD,EAAMC,EAAGmB,CAAC,CAAC,CAAA,CACnC,CAAA,EAGN,EAGDtD,EAAQ,IAAKuD,GAAQ,CACpB,MAAMC,EAAW5C,EAAK,MAAQ2C,EAAI,IAClC,OACEH,EAAAA,IAAC,MAAA,CAEC,UAAW,+DACTG,EAAI,OAAS,MACf,GACA,KAAK,eACL,MAAO,CAAE,MAAOA,EAAI,KAAA,EACpB,YACEC,EACI5C,EAAK,MAAQ,MACX,YACA,aACF,OAEN,QAAS,IAAM2C,EAAI,UAAYlB,EAAWkB,EAAI,GAAG,EAEjD,SAAAF,EAAAA,KAAC,MAAA,CAAI,UAAU,6BACb,SAAA,CAAAD,EAAAA,IAAC,OAAA,CAAM,WAAI,KAAA,CAAM,EAChBG,EAAI,UACHH,EAAAA,IAAC,OAAA,CAAK,UAAU,6BACb,SAAAI,EAAY5C,EAAK,MAAQ,MAAQ,IAAM,IAAO,GAAA,CACjD,CAAA,CAAA,CAEJ,CAAA,EAtBK2C,EAAI,GAAA,CAyBf,CAAC,EAEAJ,GACCC,EAAAA,IAAC,MAAA,CAAI,UAAU,qEAAA,CAAsE,CAAA,EAEzF,QAGC,MAAA,CAAI,UAAU,mBAAmB,KAAK,WACpC,WAAc,SAAW,QACvB,MAAA,CAAI,UAAU,oBAAoB,SAAA,SAAA,CAAO,EAE1CtB,EAAc,IAAI,CAACoB,EAAKd,IAAQ,CAC9B,MAAMqB,EAAMP,EAAI,IAAMhB,EAAMgB,EAAKd,CAAG,EAC9BsB,EAAatC,EAAU,IAAIqC,CAAG,EAC9BE,EAAU3B,IAAiBI,EAEjC,OACEiB,EAAAA,KAAC,MAAA,CAEC,UAAW,CACT,kBACAK,EAAa,WAAa,GAC1BC,EAAU,UAAY,EAAA,EAErB,OAAO,OAAO,EACd,KAAK,GAAG,EACX,KAAK,MACL,SAAUA,EAAU,EAAI,GACxB,gBAAeD,GAAc,OAC7B,QAAS,IAAM,CACTrD,KAA4BoD,CAAG,EACnCjD,IAAa0C,CAAG,EAChBjB,EAAgBG,CAAG,CACrB,EACA,QAAS,IAAMH,EAAgBG,CAAG,EAEjC,SAAA,CAAA/B,GACC+C,EAAAA,IAAC,MAAA,CAAI,UAAU,4CACb,SAAAA,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,QAASM,EACT,QAAUE,GAAMA,EAAE,gBAAA,EAClB,SAAU,IAAMlB,EAAgBe,CAAG,EACnC,aAAY,cAAc,OAAOA,CAAG,CAAC,EAAA,CAAA,EAEzC,EAGDzD,EAAQ,IAAKuD,GACZH,EAAAA,IAAC,MAAA,CAEC,KAAK,WACL,UAAW,sCACTG,EAAI,OAAS,MACf,GACA,MAAO,CAAE,MAAOA,EAAI,KAAA,EAEnB,SAAAA,EAAI,OACDA,EAAI,OAAOL,CAAG,EACd,OAAOA,EAAIK,EAAI,GAAG,GAAK,EAAE,CAAA,EATxBA,EAAI,GAAA,CAWZ,EAEAJ,GACCC,EAAAA,IAAC,MAAA,CAAI,UAAU,6CACZ,SAAA3C,IAAmByC,CAAG,CAAA,CACzB,CAAA,CAAA,EAhDG,OAAOO,CAAG,CAAA,CAoDrB,CAAC,CAAA,CAEL,EAGC,CAAC9C,GAAqBU,EAAa,GAClCgC,EAAAA,KAAC,MAAA,CAAI,UAAU,qBACb,SAAA,CAAAD,EAAAA,IAAC,SAAA,CACC,UAAU,uBACV,QAAS,IAAMb,EAAQ,CAAC,EACxB,SAAUtB,IAAgB,EAC3B,SAAA,GAAA,CAAA,EAIDmC,EAAAA,IAAC,SAAA,CACC,UAAU,uBACV,QAAS,IAAMb,EAAQtB,EAAc,CAAC,EACtC,SAAUA,IAAgB,EAC3B,SAAA,GAAA,CAAA,EAIDoC,EAAAA,KAAC,MAAA,CAAI,UAAU,wBAAwB,SAAA,CAAA,QAC/BpC,EAAY,OAAKI,CAAA,EACzB,EAEA+B,EAAAA,IAAC,SAAA,CACC,UAAU,uBACV,QAAS,IAAMb,EAAQtB,EAAc,CAAC,EACtC,SAAUA,IAAgBI,EAC3B,SAAA,GAAA,CAAA,EAID+B,EAAAA,IAAC,SAAA,CACC,UAAU,uBACV,QAAS,IAAMb,EAAQlB,CAAU,EACjC,SAAUJ,IAAgBI,EAC3B,SAAA,GAAA,CAAA,CAED,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,CAGN"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataGrid.js","sources":["../../../src/components/datagrid/DataGrid.tsx"],"sourcesContent":["/**\r\n * DataGrid.tsx\r\n * -------------\r\n * Vercel-style DataGrid for NUI\r\n *\r\n * Features:\r\n * - Sortable columns\r\n * - Sticky header\r\n * - Optional row selection (checkbox)\r\n * - Row actions slot\r\n * - Pagination (client-side)\r\n * - Keyboard navigation & focus\r\n * - Accessible (aria-sort, aria-selected, table/grid roles)\r\n */\r\n\r\nimport React, { useMemo, useState } from 'react';\r\nimport './DataGrid.css';\r\n\r\nexport type DataRow = Record<string, unknown> & {\r\n id?: string | number;\r\n};\r\n\r\nexport type DataGridColumn<T extends DataRow = DataRow> = {\r\n key: keyof T & string;\r\n title: React.ReactNode;\r\n sortable?: boolean;\r\n width?: number | string;\r\n align?: 'left' | 'center' | 'right';\r\n render?: (row: T) => React.ReactNode;\r\n};\r\n\r\nexport interface DataGridProps<T extends DataRow = DataRow> {\r\n columns: DataGridColumn<T>[];\r\n rows: T[];\r\n\r\n page?: number;\r\n pageSize?: number;\r\n onPageChange?: (page: number) => void;\r\n\r\n selectable?: boolean;\r\n selectedRowIds?: Set<string | number>;\r\n onSelectionChange?: (ids: Set<string | number>) => void;\r\n\r\n onRowClick?: (row: T) => void;\r\n renderRowActions?: (row: T) => React.ReactNode;\r\n\r\n className?: string;\r\n disablePagination?: boolean;\r\n}\r\n\r\ntype SortState = { key: string | null; dir: 'asc' | 'desc' | null };\r\n\r\nexport function DataGrid<T extends DataRow = DataRow>({\r\n columns,\r\n rows,\r\n page: controlledPage,\r\n pageSize = 10,\r\n onPageChange,\r\n\r\n selectable = false,\r\n selectedRowIds,\r\n onSelectionChange,\r\n\r\n onRowClick,\r\n renderRowActions,\r\n className = '',\r\n disablePagination = false,\r\n}: DataGridProps<T>) {\r\n const [sort, setSort] = useState<SortState>({ key: null, dir: null });\r\n const [internalPage, setInternalPage] = useState(1);\r\n const currentPage = controlledPage ?? internalPage;\r\n\r\n const [internalSelection, setInternalSelection] = useState<\r\n Set<string | number>\r\n >(new Set());\r\n\r\n const selection = selectedRowIds ?? internalSelection;\r\n\r\n const totalPages = useMemo(() => {\r\n if (disablePagination) return 1;\r\n return Math.max(1, Math.ceil(rows.length / pageSize));\r\n }, [rows.length, pageSize, disablePagination]);\r\n\r\n const sortedRows = useMemo(() => {\r\n if (!sort.key || !sort.dir) return [...rows];\r\n\r\n const key = sort.key as keyof T;\r\n const dir = sort.dir === 'asc' ? 1 : -1;\r\n\r\n return [...rows].sort((a, b) => {\r\n const va = a[key];\r\n const vb = b[key];\r\n\r\n if (va === undefined && vb !== undefined) return -1 * dir;\r\n if (vb === undefined && va !== undefined) return 1 * dir;\r\n\r\n if (typeof va === 'number' && typeof vb === 'number') {\r\n return (va - vb) * dir;\r\n }\r\n\r\n if (va instanceof Date && vb instanceof Date) {\r\n return (va.getTime() - vb.getTime()) * dir;\r\n }\r\n\r\n return String(va ?? '').localeCompare(String(vb ?? '')) * dir;\r\n });\r\n }, [rows, sort]);\r\n\r\n const paginatedRows = useMemo(() => {\r\n if (disablePagination) return sortedRows;\r\n const start = (currentPage - 1) * pageSize;\r\n return sortedRows.slice(start, start + pageSize);\r\n }, [sortedRows, currentPage, pageSize, disablePagination]);\r\n\r\n const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\r\n\r\n const rowId = (r: T, idx: number) =>\r\n r.id ?? `row-${idx}-${Math.random().toString(36).slice(2, 7)}`;\r\n\r\n const toggleSort = (key: string) => {\r\n setSort((prev) => {\r\n if (prev.key !== key) return { key, dir: 'asc' };\r\n if (prev.dir === 'asc') return { key, dir: 'desc' };\r\n return { key: null, dir: null };\r\n });\r\n };\r\n\r\n const setPage = (page: number) => {\r\n const next = Math.max(1, Math.min(totalPages, page));\r\n if (controlledPage === undefined) setInternalPage(next);\r\n onPageChange?.(next);\r\n };\r\n\r\n const toggleSelectRow = (id: string | number) => {\r\n const update = (set: Set<string | number>) => {\r\n const next = new Set(set);\r\n if (next.has(id)) next.delete(id);\r\n else next.add(id);\r\n return next;\r\n };\r\n\r\n if (selectedRowIds) {\r\n const next = update(selection);\r\n onSelectionChange?.(next);\r\n } else {\r\n setInternalSelection((prev) => {\r\n const next = update(prev);\r\n onSelectionChange?.(next);\r\n return next;\r\n });\r\n }\r\n };\r\n\r\n const selectAllOnPage = () => {\r\n const ids = paginatedRows.map((r, i) => r.id ?? rowId(r, i));\r\n const allSelected = ids.every((id) => selection.has(id));\r\n\r\n const update = (set: Set<string | number>) => {\r\n const next = new Set(set);\r\n if (allSelected) ids.forEach((id) => next.delete(id));\r\n else ids.forEach((id) => next.add(id));\r\n return next;\r\n };\r\n\r\n if (selectedRowIds) {\r\n const next = update(selection);\r\n onSelectionChange?.(next);\r\n } else {\r\n setInternalSelection((prev) => {\r\n const next = update(prev);\r\n onSelectionChange?.(next);\r\n return next;\r\n });\r\n }\r\n };\r\n\r\n const onKeyDownTable = (e: React.KeyboardEvent<HTMLDivElement>): void => {\r\n if (paginatedRows.length === 0) return;\r\n\r\n switch (e.key) {\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n setFocusedIndex((prev) =>\r\n prev === null ? 0 : Math.min(paginatedRows.length - 1, prev + 1)\r\n );\r\n break;\r\n\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n setFocusedIndex((prev) => (prev === null ? 0 : Math.max(0, prev - 1)));\r\n break;\r\n\r\n case 'PageDown':\r\n e.preventDefault();\r\n setPage(currentPage + 1);\r\n setFocusedIndex(0);\r\n break;\r\n\r\n case 'PageUp':\r\n e.preventDefault();\r\n setPage(currentPage - 1);\r\n setFocusedIndex(0);\r\n break;\r\n\r\n case 'Home':\r\n e.preventDefault();\r\n setFocusedIndex(0);\r\n break;\r\n\r\n case 'End':\r\n e.preventDefault();\r\n setFocusedIndex(paginatedRows.length - 1);\r\n break;\r\n\r\n case 'Enter':\r\n e.preventDefault();\r\n if (focusedIndex !== null) {\r\n const row = paginatedRows[focusedIndex];\r\n const id = row.id ?? rowId(row, focusedIndex);\r\n if (selectable) toggleSelectRow(id);\r\n onRowClick?.(row);\r\n }\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n const showActions = Boolean(renderRowActions);\r\n\r\n return (\r\n <div\r\n className={`ui-datagrid ${className}`}\r\n onKeyDown={onKeyDownTable}\r\n tabIndex={0}\r\n role=\"grid\"\r\n aria-rowcount={rows.length}\r\n >\r\n <div className=\"ui-datagrid-table\">\r\n {/* HEADER */}\r\n <div className=\"ui-datagrid-header\" role=\"row\">\r\n {selectable && (\r\n <div className=\"ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--select\">\r\n <input\r\n type=\"checkbox\"\r\n aria-label=\"Select all on page\"\r\n onChange={selectAllOnPage}\r\n checked={\r\n paginatedRows.length > 0 &&\r\n paginatedRows.every((r, i) =>\r\n selection.has(r.id ?? rowId(r, i))\r\n )\r\n }\r\n />\r\n </div>\r\n )}\r\n\r\n {columns.map((col) => {\r\n const isSorted = sort.key === col.key;\r\n return (\r\n <div\r\n key={col.key}\r\n className={`ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--${\r\n col.align ?? 'left'\r\n }`}\r\n role=\"columnheader\"\r\n style={{ width: col.width }}\r\n aria-sort={\r\n isSorted\r\n ? sort.dir === 'asc'\r\n ? 'ascending'\r\n : 'descending'\r\n : 'none'\r\n }\r\n onClick={() => col.sortable && toggleSort(col.key)}\r\n >\r\n <div className=\"ui-datagrid-header-content\">\r\n <span>{col.title}</span>\r\n {col.sortable && (\r\n <span className=\"ui-datagrid-sort-indicator\">\r\n {isSorted ? (sort.dir === 'asc' ? '▲' : '▼') : '⤓'}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n\r\n {showActions && (\r\n <div className=\"ui-datagrid-cell ui-datagrid-cell--header ui-datagrid-cell--actions\" />\r\n )}\r\n </div>\r\n\r\n {/* BODY */}\r\n <div className=\"ui-datagrid-body\" role=\"rowgroup\">\r\n {paginatedRows.length === 0 ? (\r\n <div className=\"ui-datagrid-empty\">No data</div>\r\n ) : (\r\n paginatedRows.map((row, idx) => {\r\n const rid = row.id ?? rowId(row, idx);\r\n const isSelected = selection.has(rid);\r\n const focused = focusedIndex === idx;\r\n\r\n return (\r\n <div\r\n key={String(rid)}\r\n className={[\r\n 'ui-datagrid-row',\r\n isSelected ? 'selected' : '',\r\n focused ? 'focused' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"row\"\r\n tabIndex={focused ? 0 : -1}\r\n aria-selected={isSelected || undefined}\r\n onClick={() => {\r\n if (selectable) toggleSelectRow(rid);\r\n onRowClick?.(row);\r\n setFocusedIndex(idx);\r\n }}\r\n onFocus={() => setFocusedIndex(idx)}\r\n >\r\n {selectable && (\r\n <div className=\"ui-datagrid-cell ui-datagrid-cell--select\">\r\n <input\r\n type=\"checkbox\"\r\n checked={isSelected}\r\n onClick={(e) => e.stopPropagation()}\r\n onChange={() => toggleSelectRow(rid)}\r\n aria-label={`Select row ${String(rid)}`}\r\n />\r\n </div>\r\n )}\r\n\r\n {columns.map((col) => (\r\n <div\r\n key={col.key}\r\n role=\"gridcell\"\r\n className={`ui-datagrid-cell ui-datagrid-cell--${\r\n col.align ?? 'left'\r\n }`}\r\n style={{ width: col.width }}\r\n >\r\n {col.render\r\n ? col.render(row)\r\n : String(row[col.key] ?? '')}\r\n </div>\r\n ))}\r\n\r\n {showActions && (\r\n <div className=\"ui-datagrid-cell ui-datagrid-cell--actions\">\r\n {renderRowActions?.(row)}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n\r\n {/* PAGINATION */}\r\n {!disablePagination && totalPages > 1 && (\r\n <div className=\"ui-datagrid-footer\">\r\n <button\r\n className=\"ui-datagrid-page-btn\"\r\n onClick={() => setPage(1)}\r\n disabled={currentPage === 1}\r\n >\r\n «\r\n </button>\r\n\r\n <button\r\n className=\"ui-datagrid-page-btn\"\r\n onClick={() => setPage(currentPage - 1)}\r\n disabled={currentPage === 1}\r\n >\r\n ‹\r\n </button>\r\n\r\n <div className=\"ui-datagrid-page-info\">\r\n Page {currentPage} of {totalPages}\r\n </div>\r\n\r\n <button\r\n className=\"ui-datagrid-page-btn\"\r\n onClick={() => setPage(currentPage + 1)}\r\n disabled={currentPage === totalPages}\r\n >\r\n ›\r\n </button>\r\n\r\n <button\r\n className=\"ui-datagrid-page-btn\"\r\n onClick={() => setPage(totalPages)}\r\n disabled={currentPage === totalPages}\r\n >\r\n »\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["DataGrid","columns","rows","controlledPage","pageSize","onPageChange","selectable","selectedRowIds","onSelectionChange","onRowClick","renderRowActions","className","disablePagination","sort","setSort","useState","internalPage","setInternalPage","currentPage","internalSelection","setInternalSelection","selection","totalPages","useMemo","sortedRows","key","dir","a","b","va","vb","paginatedRows","start","focusedIndex","setFocusedIndex","rowId","r","idx","toggleSort","prev","setPage","page","next","toggleSelectRow","id","update","set","selectAllOnPage","ids","i","allSelected","onKeyDownTable","row","showActions","jsx","jsxs","col","isSorted","rid","isSelected","focused","e"],"mappings":"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"}
|