@fabio.caffarello/react-design-system 1.7.0 → 1.8.0
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/README.md +48 -3
- package/dist/docs/components/ComponentStatusTable.d.ts +11 -0
- package/dist/ui/atoms/Accordion/Accordion.d.ts +34 -0
- package/dist/ui/atoms/Accordion/Accordion.stories.d.ts +11 -0
- package/dist/ui/atoms/Accordion/Accordion.test.d.ts +1 -0
- package/dist/ui/atoms/Accordion/index.d.ts +2 -0
- package/dist/ui/atoms/Avatar/Avatar.d.ts +30 -0
- package/dist/ui/atoms/Avatar/Avatar.stories.d.ts +13 -0
- package/dist/ui/atoms/Avatar/Avatar.test.d.ts +1 -0
- package/dist/ui/atoms/Avatar/AvatarGroup.d.ts +26 -0
- package/dist/ui/atoms/Avatar/index.d.ts +9 -0
- package/dist/ui/atoms/Badge/Badge.d.ts +14 -6
- package/dist/ui/atoms/Badge/Badge.stories.d.ts +8 -9
- package/dist/ui/atoms/BoxWrapper/BoxWrapper.d.ts +3 -3
- package/dist/ui/atoms/BoxWrapper/BoxWrapper.test.d.ts +1 -0
- package/dist/ui/atoms/Button/Button.d.ts +32 -10
- package/dist/ui/atoms/Button/Button.stories.d.ts +7 -0
- package/dist/ui/atoms/Button/Button.test.d.ts +1 -0
- package/dist/ui/atoms/Checkbox/Checkbox.d.ts +2 -1
- package/dist/ui/atoms/Collapsible/Collapsible.stories.d.ts +2 -0
- package/dist/ui/atoms/Info/Info.d.ts +2 -3
- package/dist/ui/atoms/Info/Info.test.d.ts +1 -0
- package/dist/ui/atoms/Input/Input.d.ts +14 -4
- package/dist/ui/atoms/Input/Input.stories.d.ts +6 -0
- package/dist/ui/atoms/Popover/Popover.d.ts +35 -0
- package/dist/ui/atoms/Popover/Popover.stories.d.ts +11 -0
- package/dist/ui/atoms/Popover/Popover.test.d.ts +1 -0
- package/dist/ui/atoms/Popover/index.d.ts +2 -0
- package/dist/ui/atoms/Progress/Progress.d.ts +33 -0
- package/dist/ui/atoms/Progress/Progress.stories.d.ts +12 -0
- package/dist/ui/atoms/Progress/Progress.test.d.ts +1 -0
- package/dist/ui/atoms/Select/Select.d.ts +18 -6
- package/dist/ui/atoms/Select/Select.stories.d.ts +11 -8
- package/dist/ui/atoms/Separator/Separator.d.ts +23 -0
- package/dist/ui/atoms/Separator/Separator.stories.d.ts +10 -0
- package/dist/ui/atoms/Separator/Separator.test.d.ts +1 -0
- package/dist/ui/atoms/Separator/index.d.ts +2 -0
- package/dist/ui/atoms/Skeleton/Skeleton.d.ts +1 -1
- package/dist/ui/atoms/Skeleton/Skeleton.stories.d.ts +24 -0
- package/dist/ui/atoms/Slider/Slider.d.ts +45 -0
- package/dist/ui/atoms/Slider/Slider.stories.d.ts +13 -0
- package/dist/ui/atoms/Slider/Slider.test.d.ts +1 -0
- package/dist/ui/atoms/Slider/index.d.ts +2 -0
- package/dist/ui/atoms/Spinner/Spinner.d.ts +22 -0
- package/dist/ui/atoms/Spinner/Spinner.stories.d.ts +9 -0
- package/dist/ui/atoms/Spinner/Spinner.test.d.ts +1 -0
- package/dist/ui/atoms/Switch/Switch.d.ts +28 -0
- package/dist/ui/atoms/Switch/Switch.stories.d.ts +11 -0
- package/dist/ui/atoms/Switch/Switch.test.d.ts +1 -0
- package/dist/ui/atoms/Switch/index.d.ts +2 -0
- package/dist/ui/atoms/Tooltip/Tooltip.d.ts +2 -1
- package/dist/ui/atoms/Tooltip/Tooltip.stories.d.ts +17 -0
- package/dist/ui/atoms/index.d.ts +20 -3
- package/dist/ui/index.d.ts +6 -1
- package/dist/ui/molecules/Card/Card.d.ts +6 -2
- package/dist/ui/molecules/Card/Card.stories.d.ts +2 -0
- package/dist/ui/molecules/ColorPicker/ColorPicker.d.ts +28 -0
- package/dist/ui/molecules/ColorPicker/ColorPicker.stories.d.ts +12 -0
- package/dist/ui/molecules/ColorPicker/ColorPicker.test.d.ts +1 -0
- package/dist/ui/molecules/ColorPicker/index.d.ts +2 -0
- package/dist/ui/molecules/DatePicker/DatePicker.d.ts +74 -0
- package/dist/ui/molecules/DatePicker/DatePicker.stories.d.ts +12 -0
- package/dist/ui/molecules/DatePicker/DatePicker.test.d.ts +1 -0
- package/dist/ui/molecules/DatePicker/DatePickerCalendar.d.ts +6 -0
- package/dist/ui/molecules/DatePicker/DatePickerContext.d.ts +28 -0
- package/dist/ui/molecules/DatePicker/DatePickerInput.d.ts +9 -0
- package/dist/ui/molecules/DatePicker/DatePickerProvider.d.ts +23 -0
- package/dist/ui/molecules/DatePicker/index.d.ts +14 -0
- package/dist/ui/molecules/Dropdown/Dropdown.d.ts +2 -1
- package/dist/ui/molecules/Dropdown/Dropdown.stories.d.ts +13 -0
- package/dist/ui/molecules/EmptyState/EmptyState.stories.d.ts +22 -0
- package/dist/ui/molecules/FileUpload/FileUpload.d.ts +37 -0
- package/dist/ui/molecules/FileUpload/FileUpload.stories.d.ts +12 -0
- package/dist/ui/molecules/FileUpload/FileUpload.test.d.ts +1 -0
- package/dist/ui/molecules/FileUpload/index.d.ts +2 -0
- package/dist/ui/molecules/Form/Form.d.ts +29 -4
- package/dist/ui/molecules/Form/Form.stories.d.ts +2 -0
- package/dist/ui/molecules/Form/FormContext.d.ts +17 -0
- package/dist/ui/molecules/Form/FormField.d.ts +36 -0
- package/dist/ui/molecules/Form/FormProvider.d.ts +14 -0
- package/dist/ui/molecules/Form/index.d.ts +13 -0
- package/dist/ui/molecules/Form/useFormFieldArray.d.ts +28 -0
- package/dist/ui/molecules/InputWithLabel/InputWithLabel.test.d.ts +1 -0
- package/dist/ui/molecules/Rating/Rating.d.ts +33 -0
- package/dist/ui/molecules/Rating/Rating.stories.d.ts +13 -0
- package/dist/ui/molecules/Rating/Rating.test.d.ts +1 -0
- package/dist/ui/molecules/Rating/index.d.ts +2 -0
- package/dist/ui/molecules/SearchInput/SearchInput.d.ts +24 -0
- package/dist/ui/molecules/SearchInput/SearchInput.stories.d.ts +10 -0
- package/dist/ui/molecules/SearchInput/SearchInput.test.d.ts +1 -0
- package/dist/ui/molecules/SearchInput/index.d.ts +2 -0
- package/dist/ui/molecules/SidebarHeader/SidebarHeader.test.d.ts +1 -0
- package/dist/ui/molecules/TableActions/TableActions.d.ts +31 -0
- package/dist/ui/molecules/TableActions/TableActions.stories.d.ts +7 -0
- package/dist/ui/molecules/TableActions/TableActions.test.d.ts +1 -0
- package/dist/ui/molecules/TableFilters/TableFilters.d.ts +37 -0
- package/dist/ui/molecules/TableFilters/TableFilters.stories.d.ts +7 -0
- package/dist/ui/molecules/TableFilters/TableFilters.test.d.ts +1 -0
- package/dist/ui/molecules/TablePagination/TablePagination.d.ts +29 -0
- package/dist/ui/molecules/TablePagination/TablePagination.stories.d.ts +8 -0
- package/dist/ui/molecules/TablePagination/TablePagination.test.d.ts +1 -0
- package/dist/ui/molecules/Tabs/Tabs.d.ts +15 -0
- package/dist/ui/molecules/Tabs/Tabs.stories.d.ts +10 -0
- package/dist/ui/molecules/Tabs/Tabs.test.d.ts +1 -0
- package/dist/ui/molecules/Tabs/TabsContent.d.ts +14 -0
- package/dist/ui/molecules/Tabs/TabsContext.d.ts +18 -0
- package/dist/ui/molecules/Tabs/TabsList.d.ts +12 -0
- package/dist/ui/molecules/Tabs/TabsProvider.d.ts +16 -0
- package/dist/ui/molecules/Tabs/TabsTrigger.d.ts +13 -0
- package/dist/ui/molecules/Tabs/index.d.ts +17 -0
- package/dist/ui/molecules/TimePicker/TimePicker.d.ts +29 -0
- package/dist/ui/molecules/TimePicker/TimePicker.stories.d.ts +12 -0
- package/dist/ui/molecules/TimePicker/TimePicker.test.d.ts +1 -0
- package/dist/ui/molecules/TimePicker/index.d.ts +2 -0
- package/dist/ui/molecules/index.d.ts +13 -5
- package/dist/ui/organisms/CommandPalette/CommandPalette.d.ts +37 -0
- package/dist/ui/organisms/CommandPalette/CommandPalette.stories.d.ts +11 -0
- package/dist/ui/organisms/CommandPalette/CommandPalette.test.d.ts +1 -0
- package/dist/ui/organisms/CommandPalette/index.d.ts +2 -0
- package/dist/ui/organisms/DataGrid/DataGrid.d.ts +84 -0
- package/dist/ui/organisms/DataGrid/DataGrid.stories.d.ts +14 -0
- package/dist/ui/organisms/DataGrid/DataGrid.test.d.ts +1 -0
- package/dist/ui/organisms/DataGrid/index.d.ts +2 -0
- package/dist/ui/organisms/Dialog/AlertDialog.d.ts +34 -0
- package/dist/ui/organisms/Dialog/Dialog.d.ts +58 -0
- package/dist/ui/organisms/Dialog/Dialog.stories.d.ts +13 -0
- package/dist/ui/organisms/Dialog/Dialog.test.d.ts +1 -0
- package/dist/ui/organisms/Dialog/DialogClose.d.ts +8 -0
- package/dist/ui/organisms/Dialog/DialogContent.d.ts +8 -0
- package/dist/ui/organisms/Dialog/DialogContext.d.ts +10 -0
- package/dist/ui/organisms/Dialog/DialogDescription.d.ts +4 -0
- package/dist/ui/organisms/Dialog/DialogFooter.d.ts +5 -0
- package/dist/ui/organisms/Dialog/DialogHeader.d.ts +5 -0
- package/dist/ui/organisms/Dialog/DialogProvider.d.ts +10 -0
- package/dist/ui/organisms/Dialog/DialogTitle.d.ts +5 -0
- package/dist/ui/organisms/Dialog/DialogTrigger.d.ts +6 -0
- package/dist/ui/organisms/Dialog/index.d.ts +22 -0
- package/dist/ui/organisms/Sidebar/Sidebar.d.ts +7 -4
- package/dist/ui/organisms/Sidebar/SidebarGroup/SidebarGroup.d.ts +27 -0
- package/dist/ui/organisms/Sidebar/SidebarGroup/SidebarGroup.stories.d.ts +11 -0
- package/dist/ui/organisms/Sidebar/SidebarGroup/SidebarGroup.test.d.ts +1 -0
- package/dist/ui/organisms/Sidebar/SidebarHeader/SidebarHeader.d.ts +19 -0
- package/dist/ui/organisms/Sidebar/SidebarHeader/SidebarHeader.test.d.ts +1 -0
- package/dist/ui/organisms/Sidebar/SidebarItem/SidebarItem.d.ts +23 -0
- package/dist/ui/organisms/Sidebar/SidebarItem/SidebarItem.stories.d.ts +10 -0
- package/dist/ui/organisms/Sidebar/SidebarItem/SidebarItem.test.d.ts +1 -0
- package/dist/ui/organisms/Sidebar/index.d.ts +8 -0
- package/dist/ui/organisms/Stepper/Stepper.d.ts +40 -0
- package/dist/ui/organisms/Stepper/Stepper.stories.d.ts +12 -0
- package/dist/ui/organisms/Stepper/Stepper.test.d.ts +1 -0
- package/dist/ui/organisms/Stepper/index.d.ts +2 -0
- package/dist/ui/organisms/Table/Table.d.ts +84 -16
- package/dist/ui/organisms/Table/Table.stories.d.ts +15 -0
- package/dist/ui/organisms/Table/TableActions/TableActions.d.ts +31 -0
- package/dist/ui/organisms/Table/TableActions/TableActions.stories.d.ts +7 -0
- package/dist/ui/organisms/Table/TableActions/TableActions.test.d.ts +1 -0
- package/dist/ui/organisms/Table/TableActions.d.ts +13 -0
- package/dist/ui/organisms/Table/TableBody.d.ts +12 -0
- package/dist/ui/organisms/Table/TableCell.d.ts +14 -0
- package/dist/ui/organisms/Table/TableContext.d.ts +75 -0
- package/dist/ui/organisms/Table/TableEmptyState.d.ts +11 -0
- package/dist/ui/organisms/Table/TableFilters/TableFilters.d.ts +37 -0
- package/dist/ui/organisms/Table/TableFilters/TableFilters.stories.d.ts +7 -0
- package/dist/ui/organisms/Table/TableFilters/TableFilters.test.d.ts +1 -0
- package/dist/ui/organisms/Table/TableFilters.d.ts +12 -0
- package/dist/ui/organisms/Table/TableHeader.d.ts +10 -0
- package/dist/ui/organisms/Table/TableHeaderCell.d.ts +18 -0
- package/dist/ui/organisms/Table/TableHeaderRow.d.ts +10 -0
- package/dist/ui/organisms/Table/TablePagination/TablePagination.d.ts +29 -0
- package/dist/ui/organisms/Table/TablePagination/TablePagination.stories.d.ts +8 -0
- package/dist/ui/organisms/Table/TablePagination/TablePagination.test.d.ts +1 -0
- package/dist/ui/organisms/Table/TablePagination.d.ts +14 -0
- package/dist/ui/organisms/Table/TableProvider.d.ts +55 -0
- package/dist/ui/organisms/Table/TableRow.d.ts +14 -0
- package/dist/ui/organisms/Table/TableTypes.d.ts +8 -0
- package/dist/ui/organisms/Table/index.d.ts +30 -0
- package/dist/ui/organisms/Table/useColumnResizing.d.ts +39 -0
- package/dist/ui/organisms/Table/useVirtualScrolling.d.ts +35 -0
- package/dist/ui/organisms/Timeline/Timeline.d.ts +34 -0
- package/dist/ui/organisms/Timeline/Timeline.stories.d.ts +12 -0
- package/dist/ui/organisms/Timeline/Timeline.test.d.ts +1 -0
- package/dist/ui/organisms/Timeline/index.d.ts +2 -0
- package/dist/ui/organisms/Toast/Toast.d.ts +8 -0
- package/dist/ui/organisms/Toast/Toast.stories.d.ts +14 -0
- package/dist/ui/organisms/Toast/Toast.test.d.ts +1 -0
- package/dist/ui/organisms/Toast/ToastContainer.d.ts +5 -0
- package/dist/ui/organisms/Toast/ToastContext.d.ts +21 -0
- package/dist/ui/organisms/Toast/ToastProvider.d.ts +7 -0
- package/dist/ui/organisms/Toast/index.d.ts +15 -0
- package/dist/ui/organisms/Toast/useToast.d.ts +35 -0
- package/dist/ui/organisms/index.d.ts +12 -2
- package/dist/ui/providers/AdvancedThemeProvider.d.ts +52 -0
- package/dist/ui/providers/index.d.ts +9 -0
- package/dist/ui/themes/ThemeBuilder.d.ts +28 -0
- package/dist/ui/themes/ThemeRegistry.d.ts +55 -0
- package/dist/ui/themes/index.d.ts +9 -0
- package/dist/ui/themes/types.d.ts +48 -0
- package/dist/ui/themes/utils.d.ts +21 -0
- package/dist/ui/tokens/TokenVisualizations.d.ts +41 -0
- package/dist/ui/tokens/animations.d.ts +65 -0
- package/dist/ui/tokens/borders.d.ts +61 -0
- package/dist/ui/tokens/gradients.d.ts +55 -0
- package/dist/ui/tokens/index.d.ts +31 -0
- package/dist/ui/tokens/opacity.d.ts +51 -0
- package/dist/ui/tokens/radius.d.ts +45 -0
- package/dist/ui/tokens/shadows.d.ts +42 -0
- package/dist/ui/tokens/themes/dark.d.ts +26 -26
- package/dist/ui/tokens/themes/light.d.ts +26 -26
- package/dist/ui/tokens/tokens.factory.d.ts +42 -0
- package/dist/ui/tokens/z-index.d.ts +44 -0
- package/dist/ui/utils/index.d.ts +6 -0
- package/package.json +50 -6
- package/src/docs/Accessibility.mdx +402 -0
- package/src/docs/BestPractices.mdx +315 -0
- package/src/docs/ComponentComposition.mdx +381 -0
- package/src/docs/ComponentStatus.mdx +177 -0
- package/src/docs/DesignSystem.mdx +121 -0
- package/src/docs/GettingStarted.mdx +284 -0
- package/src/docs/MigrationGuide.mdx +297 -0
- package/src/docs/Performance.mdx +206 -0
- package/src/docs/components/ComponentStatusTable.tsx +184 -0
- package/src/setupTests.ts +32 -0
- package/src/ui/atoms/Accordion/Accordion.stories.tsx +147 -0
- package/src/ui/atoms/Accordion/Accordion.test.tsx +86 -0
- package/src/ui/atoms/Accordion/Accordion.tsx +147 -0
- package/src/ui/atoms/Accordion/index.ts +2 -0
- package/src/ui/atoms/Avatar/Avatar.stories.tsx +226 -0
- package/src/ui/atoms/Avatar/Avatar.test.tsx +233 -0
- package/src/ui/atoms/Avatar/Avatar.tsx +128 -0
- package/src/ui/atoms/Avatar/AvatarGroup.tsx +96 -0
- package/src/ui/atoms/Avatar/index.ts +11 -0
- package/src/ui/atoms/Badge/Badge.stories.tsx +65 -56
- package/src/ui/atoms/Badge/Badge.test.tsx +27 -50
- package/src/ui/atoms/Badge/Badge.tsx +70 -27
- package/src/ui/atoms/BoxWrapper/BoxWrapper.stories.tsx +1 -1
- package/src/ui/atoms/BoxWrapper/BoxWrapper.test.tsx +27 -0
- package/src/ui/atoms/BoxWrapper/BoxWrapper.tsx +5 -2
- package/src/ui/atoms/Button/Button.stories.tsx +130 -1
- package/src/ui/atoms/Button/Button.test.tsx +233 -0
- package/src/ui/atoms/Button/Button.tsx +160 -53
- package/src/ui/atoms/Checkbox/Checkbox.tsx +14 -1
- package/src/ui/atoms/Collapsible/Collapsible.stories.tsx +47 -1
- package/src/ui/atoms/Collapsible/Collapsible.test.tsx +36 -24
- package/src/ui/atoms/Collapsible/Collapsible.tsx +9 -1
- package/src/ui/atoms/ErrorMessage/ErrorMessage.stories.tsx +1 -1
- package/src/ui/atoms/Info/Info.stories.tsx +1 -1
- package/src/ui/atoms/Info/Info.test.tsx +45 -0
- package/src/ui/atoms/Info/Info.tsx +2 -2
- package/src/ui/atoms/Input/Input.stories.tsx +80 -0
- package/src/ui/atoms/Input/Input.test.tsx +190 -36
- package/src/ui/atoms/Input/Input.tsx +144 -25
- package/src/ui/atoms/Label/Label.stories.tsx +1 -1
- package/src/ui/atoms/NavLink/NavLink.stories.tsx +1 -1
- package/src/ui/atoms/Popover/Popover.stories.tsx +157 -0
- package/src/ui/atoms/Popover/Popover.test.tsx +80 -0
- package/src/ui/atoms/Popover/Popover.tsx +256 -0
- package/src/ui/atoms/Popover/index.ts +2 -0
- package/src/ui/atoms/Progress/Progress.css +17 -0
- package/src/ui/atoms/Progress/Progress.stories.tsx +170 -0
- package/src/ui/atoms/Progress/Progress.test.tsx +134 -0
- package/src/ui/atoms/Progress/Progress.tsx +138 -0
- package/src/ui/atoms/Radio/Radio.tsx +1 -1
- package/src/ui/atoms/Select/Select.stories.tsx +93 -58
- package/src/ui/atoms/Select/Select.test.tsx +162 -46
- package/src/ui/atoms/Select/Select.tsx +142 -44
- package/src/ui/atoms/Separator/Separator.stories.tsx +88 -0
- package/src/ui/atoms/Separator/Separator.test.tsx +34 -0
- package/src/ui/atoms/Separator/Separator.tsx +81 -0
- package/src/ui/atoms/Separator/index.ts +2 -0
- package/src/ui/atoms/Skeleton/Skeleton.stories.tsx +62 -0
- package/src/ui/atoms/Skeleton/Skeleton.tsx +19 -2
- package/src/ui/atoms/Slider/Slider.stories.tsx +205 -0
- package/src/ui/atoms/Slider/Slider.test.tsx +53 -0
- package/src/ui/atoms/Slider/Slider.tsx +307 -0
- package/src/ui/atoms/Slider/index.ts +2 -0
- package/src/ui/atoms/Spinner/Spinner.stories.tsx +56 -0
- package/src/ui/atoms/Spinner/Spinner.test.tsx +35 -0
- package/src/ui/atoms/Spinner/Spinner.tsx +88 -0
- package/src/ui/atoms/Switch/Switch.stories.tsx +182 -0
- package/src/ui/atoms/Switch/Switch.test.tsx +90 -0
- package/src/ui/atoms/Switch/Switch.tsx +181 -0
- package/src/ui/atoms/Switch/index.ts +2 -0
- package/src/ui/atoms/Text/Text.stories.tsx +1 -1
- package/src/ui/atoms/Text/Text.test.tsx +48 -32
- package/src/ui/atoms/Textarea/Textarea.stories.tsx +1 -1
- package/src/ui/atoms/Tooltip/Tooltip.stories.tsx +44 -0
- package/src/ui/atoms/Tooltip/Tooltip.tsx +94 -6
- package/src/ui/atoms/index.ts +27 -4
- package/src/ui/index.ts +6 -1
- package/src/ui/molecules/Breadcrumb/Breadcrumb.stories.tsx +1 -1
- package/src/ui/molecules/Breadcrumb/Breadcrumb.tsx +1 -1
- package/src/ui/molecules/Card/Card.stories.tsx +49 -1
- package/src/ui/molecules/Card/Card.tsx +40 -5
- package/src/ui/molecules/ColorPicker/ColorPicker.stories.tsx +156 -0
- package/src/ui/molecules/ColorPicker/ColorPicker.test.tsx +47 -0
- package/src/ui/molecules/ColorPicker/ColorPicker.tsx +271 -0
- package/src/ui/molecules/ColorPicker/index.ts +2 -0
- package/src/ui/molecules/DatePicker/DatePicker.mdx +150 -0
- package/src/ui/molecules/DatePicker/DatePicker.stories.tsx +188 -0
- package/src/ui/molecules/DatePicker/DatePicker.test.tsx +381 -0
- package/src/ui/molecules/DatePicker/DatePicker.tsx +231 -0
- package/src/ui/molecules/DatePicker/DatePickerCalendar.tsx +277 -0
- package/src/ui/molecules/DatePicker/DatePickerContext.tsx +39 -0
- package/src/ui/molecules/DatePicker/DatePickerInput.tsx +147 -0
- package/src/ui/molecules/DatePicker/DatePickerProvider.tsx +100 -0
- package/src/ui/molecules/DatePicker/index.ts +16 -0
- package/src/ui/molecules/Dropdown/Dropdown.stories.tsx +50 -8
- package/src/ui/molecules/Dropdown/Dropdown.test.tsx +272 -12
- package/src/ui/molecules/Dropdown/Dropdown.tsx +176 -10
- package/src/ui/molecules/EmptyState/EmptyState.stories.tsx +24 -2
- package/src/ui/molecules/EmptyState/EmptyState.tsx +9 -3
- package/src/ui/molecules/FileUpload/FileUpload.stories.tsx +177 -0
- package/src/ui/molecules/FileUpload/FileUpload.test.tsx +114 -0
- package/src/ui/molecules/FileUpload/FileUpload.tsx +312 -0
- package/src/ui/molecules/FileUpload/index.ts +2 -0
- package/src/ui/molecules/Form/Form.mdx +145 -0
- package/src/ui/molecules/Form/Form.stories.tsx +121 -1
- package/src/ui/molecules/Form/Form.test.tsx +1 -3
- package/src/ui/molecules/Form/Form.tsx +95 -15
- package/src/ui/molecules/Form/FormContext.tsx +35 -0
- package/src/ui/molecules/Form/FormField.tsx +83 -0
- package/src/ui/molecules/Form/FormProvider.tsx +34 -0
- package/src/ui/molecules/Form/index.ts +21 -0
- package/src/ui/molecules/Form/useFormFieldArray.ts +46 -0
- package/src/ui/molecules/InputWithLabel/InputWithLabel.stories.tsx +1 -1
- package/src/ui/molecules/InputWithLabel/InputWithLabel.test.tsx +44 -0
- package/src/ui/molecules/InputWithLabel/InputWithLabel.tsx +3 -1
- package/src/ui/molecules/NavbarGroup/NavbarGroup.stories.tsx +1 -1
- package/src/ui/molecules/Pagination/Pagination.stories.tsx +1 -1
- package/src/ui/molecules/Rating/Rating.stories.tsx +206 -0
- package/src/ui/molecules/Rating/Rating.test.tsx +60 -0
- package/src/ui/molecules/Rating/Rating.tsx +173 -0
- package/src/ui/molecules/Rating/index.ts +2 -0
- package/src/ui/molecules/SearchInput/SearchInput.stories.tsx +146 -0
- package/src/ui/molecules/SearchInput/SearchInput.test.tsx +82 -0
- package/src/ui/molecules/SearchInput/SearchInput.tsx +133 -0
- package/src/ui/molecules/SearchInput/index.ts +2 -0
- package/src/ui/molecules/Tabs/Tabs.stories.tsx +229 -0
- package/src/ui/molecules/Tabs/Tabs.test.tsx +497 -0
- package/src/ui/molecules/Tabs/Tabs.tsx +58 -0
- package/src/ui/molecules/Tabs/TabsContent.tsx +50 -0
- package/src/ui/molecules/Tabs/TabsContext.tsx +36 -0
- package/src/ui/molecules/Tabs/TabsList.tsx +98 -0
- package/src/ui/molecules/Tabs/TabsProvider.tsx +53 -0
- package/src/ui/molecules/Tabs/TabsTrigger.tsx +111 -0
- package/src/ui/molecules/Tabs/index.ts +23 -0
- package/src/ui/molecules/TimePicker/TimePicker.stories.tsx +145 -0
- package/src/ui/molecules/TimePicker/TimePicker.test.tsx +41 -0
- package/src/ui/molecules/TimePicker/TimePicker.tsx +264 -0
- package/src/ui/molecules/TimePicker/index.ts +2 -0
- package/src/ui/molecules/index.ts +20 -7
- package/src/ui/organisms/CommandPalette/CommandPalette.stories.tsx +218 -0
- package/src/ui/organisms/CommandPalette/CommandPalette.test.tsx +85 -0
- package/src/ui/organisms/CommandPalette/CommandPalette.tsx +333 -0
- package/src/ui/organisms/CommandPalette/index.ts +2 -0
- package/src/ui/organisms/DataGrid/DataGrid.stories.tsx +196 -0
- package/src/ui/organisms/DataGrid/DataGrid.test.tsx +53 -0
- package/src/ui/organisms/DataGrid/DataGrid.tsx +294 -0
- package/src/ui/organisms/DataGrid/index.ts +2 -0
- package/src/ui/organisms/Dialog/AlertDialog.tsx +92 -0
- package/src/ui/organisms/Dialog/Dialog.mdx +200 -0
- package/src/ui/organisms/Dialog/Dialog.stories.tsx +226 -0
- package/src/ui/organisms/Dialog/Dialog.test.tsx +435 -0
- package/src/ui/organisms/Dialog/Dialog.tsx +79 -0
- package/src/ui/organisms/Dialog/DialogClose.tsx +45 -0
- package/src/ui/organisms/Dialog/DialogContent.tsx +149 -0
- package/src/ui/organisms/Dialog/DialogContext.tsx +25 -0
- package/src/ui/organisms/Dialog/DialogDescription.tsx +28 -0
- package/src/ui/organisms/Dialog/DialogFooter.tsx +18 -0
- package/src/ui/organisms/Dialog/DialogHeader.tsx +18 -0
- package/src/ui/organisms/Dialog/DialogProvider.tsx +73 -0
- package/src/ui/organisms/Dialog/DialogTitle.tsx +31 -0
- package/src/ui/organisms/Dialog/DialogTrigger.tsx +34 -0
- package/src/ui/organisms/Dialog/index.ts +24 -0
- package/src/ui/organisms/LoginBox/LoginBox.stories.tsx +1 -1
- package/src/ui/organisms/Modal/Modal.stories.tsx +2 -2
- package/src/ui/organisms/Modal/Modal.test.tsx +1 -1
- package/src/ui/organisms/Sidebar/Sidebar.stories.tsx +1 -1
- package/src/ui/organisms/Sidebar/Sidebar.test.tsx +5 -3
- package/src/ui/organisms/Sidebar/Sidebar.tsx +21 -6
- package/src/ui/{molecules → organisms/Sidebar}/SidebarGroup/SidebarGroup.stories.tsx +2 -2
- package/src/ui/{molecules → organisms/Sidebar}/SidebarGroup/SidebarGroup.test.tsx +32 -9
- package/src/ui/{molecules → organisms/Sidebar}/SidebarGroup/SidebarGroup.tsx +7 -7
- package/src/ui/organisms/Sidebar/SidebarHeader/SidebarHeader.test.tsx +66 -0
- package/src/ui/{molecules → organisms/Sidebar}/SidebarHeader/SidebarHeader.tsx +1 -2
- package/src/ui/{atoms → organisms/Sidebar}/SidebarItem/SidebarItem.stories.tsx +1 -1
- package/src/ui/{atoms → organisms/Sidebar}/SidebarItem/SidebarItem.test.tsx +9 -8
- package/src/ui/{atoms → organisms/Sidebar}/SidebarItem/SidebarItem.tsx +9 -3
- package/src/ui/organisms/Sidebar/index.ts +13 -0
- package/src/ui/organisms/Stepper/Stepper.stories.tsx +253 -0
- package/src/ui/organisms/Stepper/Stepper.test.tsx +76 -0
- package/src/ui/organisms/Stepper/Stepper.tsx +323 -0
- package/src/ui/organisms/Stepper/index.ts +2 -0
- package/src/ui/organisms/Table/Table.mdx +154 -0
- package/src/ui/organisms/Table/Table.stories.tsx +614 -4
- package/src/ui/organisms/Table/Table.test.tsx +86 -4
- package/src/ui/organisms/Table/Table.tsx +215 -99
- package/src/ui/organisms/Table/TableActions/TableActions.stories.tsx +88 -0
- package/src/ui/organisms/Table/TableActions/TableActions.test.tsx +64 -0
- package/src/ui/organisms/Table/TableActions/TableActions.tsx +71 -0
- package/src/ui/organisms/Table/TableActions.tsx +46 -0
- package/src/ui/organisms/Table/TableBody.tsx +137 -0
- package/src/ui/organisms/Table/TableCell.tsx +36 -0
- package/src/ui/organisms/Table/TableContext.tsx +111 -0
- package/src/ui/organisms/Table/TableEmptyState.tsx +51 -0
- package/src/ui/organisms/Table/TableFilters/TableFilters.stories.tsx +111 -0
- package/src/ui/organisms/Table/TableFilters/TableFilters.test.tsx +104 -0
- package/src/ui/organisms/Table/TableFilters/TableFilters.tsx +191 -0
- package/src/ui/organisms/Table/TableFilters.tsx +39 -0
- package/src/ui/organisms/Table/TableHeader.tsx +29 -0
- package/src/ui/organisms/Table/TableHeaderCell.tsx +142 -0
- package/src/ui/organisms/Table/TableHeaderRow.tsx +72 -0
- package/src/ui/organisms/Table/TablePagination/TablePagination.stories.tsx +87 -0
- package/src/ui/organisms/Table/TablePagination/TablePagination.test.tsx +90 -0
- package/src/ui/organisms/Table/TablePagination/TablePagination.tsx +207 -0
- package/src/ui/organisms/Table/TablePagination.tsx +48 -0
- package/src/ui/organisms/Table/TableProvider.tsx +429 -0
- package/src/ui/organisms/Table/TableRow.tsx +85 -0
- package/src/ui/organisms/Table/TableTypes.ts +11 -0
- package/src/ui/organisms/Table/index.ts +55 -0
- package/src/ui/organisms/Table/useColumnResizing.ts +134 -0
- package/src/ui/organisms/Table/useVirtualScrolling.ts +116 -0
- package/src/ui/organisms/Timeline/Timeline.stories.tsx +230 -0
- package/src/ui/organisms/Timeline/Timeline.test.tsx +47 -0
- package/src/ui/organisms/Timeline/Timeline.tsx +179 -0
- package/src/ui/organisms/Timeline/index.ts +2 -0
- package/src/ui/organisms/Toast/Toast.stories.tsx +169 -0
- package/src/ui/organisms/Toast/Toast.test.tsx +537 -0
- package/src/ui/organisms/Toast/Toast.tsx +144 -0
- package/src/ui/organisms/Toast/ToastContainer.tsx +54 -0
- package/src/ui/organisms/Toast/ToastContext.tsx +38 -0
- package/src/ui/organisms/Toast/ToastProvider.tsx +56 -0
- package/src/ui/organisms/Toast/index.ts +17 -0
- package/src/ui/organisms/Toast/useToast.ts +70 -0
- package/src/ui/organisms/index.ts +17 -2
- package/src/ui/providers/AdvancedThemeProvider.tsx +229 -0
- package/src/ui/providers/index.ts +14 -0
- package/src/ui/themes/README.md +281 -0
- package/src/ui/themes/ThemeBuilder.ts +149 -0
- package/src/ui/themes/ThemeRegistry.ts +187 -0
- package/src/ui/themes/index.ts +20 -0
- package/src/ui/themes/types.ts +53 -0
- package/src/ui/themes/utils.ts +70 -0
- package/src/ui/tokens/README.md +212 -0
- package/src/ui/tokens/TokenVisualizations.tsx +273 -0
- package/src/ui/tokens/Tokens.mdx +348 -0
- package/src/ui/tokens/animations.ts +157 -0
- package/src/ui/tokens/borders.ts +121 -0
- package/src/ui/tokens/gradients.ts +154 -0
- package/src/ui/tokens/index.ts +57 -0
- package/src/ui/tokens/opacity.ts +107 -0
- package/src/ui/tokens/radius.ts +107 -0
- package/src/ui/tokens/shadows.ts +92 -0
- package/src/ui/tokens/tokens.factory.ts +124 -0
- package/src/ui/tokens/z-index.ts +113 -0
- package/src/ui/utils/index.ts +10 -0
- package/src/App.css +0 -42
- package/src/App.tsx +0 -35
- package/src/index.css +0 -68
- package/src/main.tsx +0 -15
|
@@ -1,47 +1,63 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import Text from
|
|
4
|
-
|
|
5
|
-
describe(
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const { getByText } = render(<Text>{TEXT}</Text>);
|
|
10
|
-
|
|
11
|
-
expect(getByText(TEXT)).toBeInTheDocument();
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
|
+
import Text from './Text';
|
|
4
|
+
|
|
5
|
+
describe('Text', () => {
|
|
6
|
+
it('renders text content', () => {
|
|
7
|
+
render(<Text>Hello World</Text>);
|
|
8
|
+
expect(screen.getByText('Hello World')).toBeInTheDocument();
|
|
12
9
|
});
|
|
13
10
|
|
|
14
|
-
it(
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
expect(heading.container.querySelector("h2")).toBeInTheDocument();
|
|
20
|
-
expect(regular.container.querySelector("p")).toBeInTheDocument();
|
|
21
|
-
expect(listItem.container.querySelector("li")).toBeInTheDocument();
|
|
11
|
+
it('renders as paragraph by default', () => {
|
|
12
|
+
const { container } = render(<Text>Content</Text>);
|
|
13
|
+
const text = container.querySelector('p');
|
|
14
|
+
expect(text).toBeInTheDocument();
|
|
22
15
|
});
|
|
23
16
|
|
|
24
|
-
it(
|
|
25
|
-
const { container } = render(<Text
|
|
17
|
+
it('renders as heading when variant is heading', () => {
|
|
18
|
+
const { container } = render(<Text variant="heading">Heading</Text>);
|
|
19
|
+
const text = container.querySelector('h2');
|
|
20
|
+
expect(text).toBeInTheDocument();
|
|
21
|
+
});
|
|
26
22
|
|
|
27
|
-
|
|
23
|
+
it('renders as list item when variant is list', () => {
|
|
24
|
+
const { container } = render(<Text variant="list">List item</Text>);
|
|
25
|
+
const text = container.querySelector('li');
|
|
26
|
+
expect(text).toBeInTheDocument();
|
|
28
27
|
});
|
|
29
28
|
|
|
30
|
-
it(
|
|
31
|
-
const { container } = render(<Text
|
|
29
|
+
it('renders as custom element when as prop is provided', () => {
|
|
30
|
+
const { container } = render(<Text as="span">Content</Text>);
|
|
31
|
+
const text = container.querySelector('span');
|
|
32
|
+
expect(text).toBeInTheDocument();
|
|
33
|
+
});
|
|
32
34
|
|
|
33
|
-
|
|
35
|
+
it('applies bold class when bold prop is true', () => {
|
|
36
|
+
const { container } = render(<Text bold>Bold text</Text>);
|
|
37
|
+
const text = container.querySelector('p');
|
|
38
|
+
expect(text).toHaveClass('font-bold');
|
|
34
39
|
});
|
|
35
40
|
|
|
36
|
-
it(
|
|
37
|
-
const { container } = render(<Text italic>
|
|
41
|
+
it('applies italic class when italic prop is true', () => {
|
|
42
|
+
const { container } = render(<Text italic>Italic text</Text>);
|
|
43
|
+
const text = container.querySelector('p');
|
|
44
|
+
expect(text).toHaveClass('italic');
|
|
45
|
+
});
|
|
38
46
|
|
|
39
|
-
|
|
47
|
+
it('applies color class when color prop is provided', () => {
|
|
48
|
+
const { container } = render(<Text color="red-500">Colored text</Text>);
|
|
49
|
+
const text = container.querySelector('p');
|
|
50
|
+
expect(text).toHaveClass('text-red-500');
|
|
40
51
|
});
|
|
41
52
|
|
|
42
|
-
it(
|
|
43
|
-
const { container } = render(<Text
|
|
53
|
+
it('applies custom className', () => {
|
|
54
|
+
const { container } = render(<Text className="custom-class">Content</Text>);
|
|
55
|
+
const text = container.querySelector('p');
|
|
56
|
+
expect(text).toHaveClass('custom-class');
|
|
57
|
+
});
|
|
44
58
|
|
|
45
|
-
|
|
59
|
+
it('passes through HTML attributes', () => {
|
|
60
|
+
render(<Text data-testid="text">Content</Text>);
|
|
61
|
+
expect(screen.getByTestId('text')).toBeInTheDocument();
|
|
46
62
|
});
|
|
47
|
-
});
|
|
63
|
+
});
|
|
@@ -7,12 +7,26 @@ const meta = {
|
|
|
7
7
|
component: Tooltip,
|
|
8
8
|
parameters: {
|
|
9
9
|
layout: "centered",
|
|
10
|
+
docs: {
|
|
11
|
+
description: {
|
|
12
|
+
component: "A tooltip component that displays additional information on hover or focus. Supports keyboard navigation and includes proper ARIA attributes. Tooltips appear immediately on focus (no delay) for better keyboard accessibility.",
|
|
13
|
+
},
|
|
14
|
+
},
|
|
10
15
|
},
|
|
11
16
|
tags: ["autodocs"],
|
|
12
17
|
argTypes: {
|
|
13
18
|
position: {
|
|
14
19
|
control: "select",
|
|
15
20
|
options: ["top", "bottom", "left", "right"],
|
|
21
|
+
description: "Position of the tooltip relative to the trigger element",
|
|
22
|
+
},
|
|
23
|
+
delay: {
|
|
24
|
+
control: "number",
|
|
25
|
+
description: "Delay in milliseconds before showing tooltip on hover (not applied on focus)",
|
|
26
|
+
},
|
|
27
|
+
'aria-label': {
|
|
28
|
+
control: "text",
|
|
29
|
+
description: "Accessible label for screen readers",
|
|
16
30
|
},
|
|
17
31
|
},
|
|
18
32
|
} satisfies Meta<typeof Tooltip>;
|
|
@@ -58,3 +72,33 @@ export const Right: Story = {
|
|
|
58
72
|
position: "right",
|
|
59
73
|
},
|
|
60
74
|
};
|
|
75
|
+
|
|
76
|
+
export const WithCustomDelay: Story = {
|
|
77
|
+
args: {
|
|
78
|
+
content: "This tooltip has a 500ms delay",
|
|
79
|
+
children: <Button>Hover me (wait 500ms)</Button>,
|
|
80
|
+
delay: 500,
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export const KeyboardAccessible: Story = {
|
|
85
|
+
args: {
|
|
86
|
+
content: "Press Tab to focus and see tooltip immediately",
|
|
87
|
+
children: <Button>Focus me with Tab</Button>,
|
|
88
|
+
},
|
|
89
|
+
parameters: {
|
|
90
|
+
docs: {
|
|
91
|
+
description: {
|
|
92
|
+
story: "Tab to focus the button. The tooltip appears immediately without delay for keyboard users.",
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export const WithAriaLabel: Story = {
|
|
99
|
+
args: {
|
|
100
|
+
content: "Additional information",
|
|
101
|
+
children: <Button>Button with tooltip</Button>,
|
|
102
|
+
'aria-label': "Button that shows additional information on hover",
|
|
103
|
+
},
|
|
104
|
+
};
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import type { HTMLAttributes, ReactNode } from "react";
|
|
4
|
-
import { useState } from "react";
|
|
3
|
+
import type { HTMLAttributes, ReactNode, KeyboardEvent, FocusEvent, ReactElement } from "react";
|
|
4
|
+
import { useState, useRef, useEffect, cloneElement, isValidElement } from "react";
|
|
5
5
|
|
|
6
6
|
export interface TooltipProps extends HTMLAttributes<HTMLDivElement> {
|
|
7
7
|
content: string;
|
|
8
8
|
children: ReactNode;
|
|
9
9
|
position?: "top" | "bottom" | "left" | "right";
|
|
10
10
|
delay?: number;
|
|
11
|
+
'aria-label'?: string;
|
|
11
12
|
}
|
|
12
13
|
|
|
13
14
|
/**
|
|
@@ -29,10 +30,16 @@ export default function Tooltip({
|
|
|
29
30
|
position = "top",
|
|
30
31
|
delay = 200,
|
|
31
32
|
className = "",
|
|
33
|
+
'aria-label': _ariaLabel,
|
|
32
34
|
...props
|
|
33
35
|
}: TooltipProps) {
|
|
34
36
|
const [isVisible, setIsVisible] = useState(false);
|
|
35
|
-
const [timeoutId, setTimeoutId] = useState<
|
|
37
|
+
const [timeoutId, setTimeoutId] = useState<NodeJS.Timeout | null>(null);
|
|
38
|
+
const tooltipRef = useRef<HTMLDivElement>(null);
|
|
39
|
+
const triggerRef = useRef<HTMLElement | null>(null);
|
|
40
|
+
|
|
41
|
+
// Generate unique ID for tooltip
|
|
42
|
+
const tooltipId = `tooltip-${Math.random().toString(36).substr(2, 9)}`;
|
|
36
43
|
|
|
37
44
|
const handleMouseEnter = () => {
|
|
38
45
|
const id = setTimeout(() => {
|
|
@@ -49,6 +56,43 @@ export default function Tooltip({
|
|
|
49
56
|
setIsVisible(false);
|
|
50
57
|
};
|
|
51
58
|
|
|
59
|
+
const handleFocus = () => {
|
|
60
|
+
// Show tooltip immediately on focus (no delay for keyboard users)
|
|
61
|
+
setIsVisible(true);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const handleBlur = () => {
|
|
65
|
+
setIsVisible(false);
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const handleKeyDown = (e: KeyboardEvent) => {
|
|
69
|
+
if (e.key === 'Escape') {
|
|
70
|
+
setIsVisible(false);
|
|
71
|
+
triggerRef.current?.blur();
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// Close tooltip when clicking outside
|
|
76
|
+
useEffect(() => {
|
|
77
|
+
if (!isVisible) return;
|
|
78
|
+
|
|
79
|
+
const handleClickOutside = (event: MouseEvent) => {
|
|
80
|
+
if (
|
|
81
|
+
tooltipRef.current &&
|
|
82
|
+
!tooltipRef.current.contains(event.target as Node) &&
|
|
83
|
+
triggerRef.current &&
|
|
84
|
+
!triggerRef.current.contains(event.target as Node)
|
|
85
|
+
) {
|
|
86
|
+
setIsVisible(false);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
document.addEventListener('mousedown', handleClickOutside);
|
|
91
|
+
return () => {
|
|
92
|
+
document.removeEventListener('mousedown', handleClickOutside);
|
|
93
|
+
};
|
|
94
|
+
}, [isVisible]);
|
|
95
|
+
|
|
52
96
|
const positionClasses: Record<NonNullable<TooltipProps["position"]>, string> = {
|
|
53
97
|
top: "bottom-full left-1/2 transform -translate-x-1/2 mb-2",
|
|
54
98
|
bottom: "top-full left-1/2 transform -translate-x-1/2 mt-2",
|
|
@@ -63,22 +107,66 @@ export default function Tooltip({
|
|
|
63
107
|
right: "right-full top-1/2 transform -translate-y-1/2 border-r-gray-900",
|
|
64
108
|
};
|
|
65
109
|
|
|
110
|
+
// Clone children to add accessibility props
|
|
111
|
+
const childrenWithProps = isValidElement(children)
|
|
112
|
+
? (() => {
|
|
113
|
+
const childElement = children as ReactElement<HTMLAttributes<HTMLElement> & { ref?: React.Ref<HTMLElement> }>;
|
|
114
|
+
const existingProps = childElement.props;
|
|
115
|
+
const existingRef = existingProps.ref;
|
|
116
|
+
|
|
117
|
+
return cloneElement(childElement, {
|
|
118
|
+
ref: (node: HTMLElement | null) => {
|
|
119
|
+
triggerRef.current = node;
|
|
120
|
+
// Preserve existing ref if any
|
|
121
|
+
if (typeof existingRef === 'function') {
|
|
122
|
+
existingRef(node);
|
|
123
|
+
} else if (existingRef && typeof existingRef === 'object' && 'current' in existingRef) {
|
|
124
|
+
(existingRef as React.MutableRefObject<HTMLElement | null>).current = node;
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
'aria-describedby': isVisible ? tooltipId : existingProps['aria-describedby'],
|
|
128
|
+
onMouseEnter: (e: React.MouseEvent<HTMLElement>) => {
|
|
129
|
+
handleMouseEnter();
|
|
130
|
+
existingProps.onMouseEnter?.(e);
|
|
131
|
+
},
|
|
132
|
+
onMouseLeave: (e: React.MouseEvent<HTMLElement>) => {
|
|
133
|
+
handleMouseLeave();
|
|
134
|
+
existingProps.onMouseLeave?.(e);
|
|
135
|
+
},
|
|
136
|
+
onFocus: (e: FocusEvent<HTMLElement>) => {
|
|
137
|
+
handleFocus();
|
|
138
|
+
existingProps.onFocus?.(e);
|
|
139
|
+
},
|
|
140
|
+
onBlur: (e: FocusEvent<HTMLElement>) => {
|
|
141
|
+
handleBlur();
|
|
142
|
+
existingProps.onBlur?.(e);
|
|
143
|
+
},
|
|
144
|
+
onKeyDown: (e: KeyboardEvent<HTMLElement>) => {
|
|
145
|
+
handleKeyDown(e);
|
|
146
|
+
existingProps.onKeyDown?.(e);
|
|
147
|
+
},
|
|
148
|
+
} as Partial<typeof existingProps>);
|
|
149
|
+
})()
|
|
150
|
+
: children;
|
|
151
|
+
|
|
66
152
|
return (
|
|
67
153
|
<div
|
|
68
154
|
className={`relative inline-block ${className}`}
|
|
69
|
-
onMouseEnter={handleMouseEnter}
|
|
70
|
-
onMouseLeave={handleMouseLeave}
|
|
71
155
|
{...props}
|
|
72
156
|
>
|
|
73
|
-
{
|
|
157
|
+
{childrenWithProps}
|
|
74
158
|
{isVisible && (
|
|
75
159
|
<div
|
|
160
|
+
ref={tooltipRef}
|
|
161
|
+
id={tooltipId}
|
|
76
162
|
className={`absolute z-50 px-2 py-1 text-xs text-white bg-gray-900 rounded shadow-lg whitespace-nowrap ${positionClasses[position]}`}
|
|
77
163
|
role="tooltip"
|
|
164
|
+
aria-live="polite"
|
|
78
165
|
>
|
|
79
166
|
{content}
|
|
80
167
|
<div
|
|
81
168
|
className={`absolute w-0 h-0 border-4 border-transparent ${arrowClasses[position]}`}
|
|
169
|
+
aria-hidden="true"
|
|
82
170
|
/>
|
|
83
171
|
</div>
|
|
84
172
|
)}
|
package/src/ui/atoms/index.ts
CHANGED
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
export { default as Info } from "./Info/Info";
|
|
2
|
+
export type { InfoProps } from "./Info/Info";
|
|
2
3
|
|
|
3
4
|
export { default as Text } from "./Text/Text";
|
|
4
5
|
|
|
5
6
|
export { default as Input } from "./Input/Input";
|
|
6
|
-
export type { InputProps } from "./Input/Input";
|
|
7
|
+
export type { InputProps, InputSize, InputVariant, InputState } from "./Input/Input";
|
|
7
8
|
|
|
8
9
|
export { default as Button } from "./Button/Button";
|
|
10
|
+
export type { ButtonProps, ButtonVariant, ButtonSize } from "./Button/Button";
|
|
9
11
|
|
|
10
12
|
export { default as BoxWrapper } from "./BoxWrapper/BoxWrapper";
|
|
13
|
+
export type { BoxWrapperProps } from "./BoxWrapper/BoxWrapper";
|
|
11
14
|
|
|
12
15
|
export { default as Badge } from "./Badge/Badge";
|
|
13
16
|
|
|
14
17
|
export { default as Select } from "./Select/Select";
|
|
18
|
+
export type { SelectProps, SelectOption, SelectOptionGroup, SelectSize } from "./Select/Select";
|
|
15
19
|
|
|
16
20
|
export { default as Textarea } from "./Textarea/Textarea";
|
|
17
21
|
|
|
@@ -25,11 +29,10 @@ export { default as Tooltip } from "./Tooltip/Tooltip";
|
|
|
25
29
|
export type { TooltipProps } from "./Tooltip/Tooltip";
|
|
26
30
|
|
|
27
31
|
export { default as Skeleton } from "./Skeleton/Skeleton";
|
|
32
|
+
export { default as Spinner } from "./Spinner/Spinner";
|
|
33
|
+
export type { SpinnerProps, SpinnerSize, SpinnerVariant } from "./Spinner/Spinner";
|
|
28
34
|
export type { SkeletonProps } from "./Skeleton/Skeleton";
|
|
29
35
|
|
|
30
|
-
export { default as SidebarItem } from "./SidebarItem/SidebarItem";
|
|
31
|
-
export type { SidebarItemProps } from "./SidebarItem/SidebarItem";
|
|
32
|
-
|
|
33
36
|
export { default as Collapsible } from "./Collapsible/Collapsible";
|
|
34
37
|
export type { CollapsibleProps } from "./Collapsible/Collapsible";
|
|
35
38
|
|
|
@@ -38,3 +41,23 @@ export type { CheckboxProps } from "./Checkbox/Checkbox";
|
|
|
38
41
|
|
|
39
42
|
export { default as Radio } from "./Radio/Radio";
|
|
40
43
|
export type { RadioProps } from "./Radio/Radio";
|
|
44
|
+
|
|
45
|
+
export { default as Progress } from "./Progress/Progress";
|
|
46
|
+
export type { ProgressProps, ProgressVariant, ProgressSize } from "./Progress/Progress";
|
|
47
|
+
|
|
48
|
+
export { default as Switch } from "./Switch/Switch";
|
|
49
|
+
export type { SwitchProps, SwitchSize } from "./Switch/Switch";
|
|
50
|
+
|
|
51
|
+
export { default as Separator } from "./Separator/Separator";
|
|
52
|
+
export type { SeparatorProps, SeparatorOrientation, SeparatorVariant } from "./Separator/Separator";
|
|
53
|
+
|
|
54
|
+
export { default as Accordion } from "./Accordion/Accordion";
|
|
55
|
+
export type { AccordionProps, AccordionItem, AccordionType } from "./Accordion/Accordion";
|
|
56
|
+
|
|
57
|
+
export { default as Slider } from "./Slider/Slider";
|
|
58
|
+
export type { SliderProps, SliderVariant, SliderSize } from "./Slider/Slider";
|
|
59
|
+
|
|
60
|
+
export { default as Popover } from "./Popover/Popover";
|
|
61
|
+
export type { PopoverProps, PopoverPlacement } from "./Popover/Popover";
|
|
62
|
+
|
|
63
|
+
export * from "./Avatar";
|
package/src/ui/index.ts
CHANGED
|
@@ -9,10 +9,15 @@ export * from "./tokens/breakpoints";
|
|
|
9
9
|
export * from "./tokens/tokens.factory";
|
|
10
10
|
export * from "./tokens/themes/light";
|
|
11
11
|
export * from "./tokens/themes/dark";
|
|
12
|
-
export * from "./providers
|
|
12
|
+
export * from "./providers";
|
|
13
|
+
export * from "./themes";
|
|
13
14
|
|
|
14
15
|
// Export helper functions for convenience
|
|
15
16
|
export { getSpacingClass, getSpacing } from "./tokens/spacing";
|
|
16
17
|
export { getTypographyClasses, getTypography } from "./tokens/typography";
|
|
17
18
|
export { getColorClass, getColor } from "./tokens/colors";
|
|
18
19
|
export { getBreakpoint, getMediaQuery } from "./tokens/breakpoints";
|
|
20
|
+
export { getAnimationClass, getAnimation, getTransitionClass } from "./tokens/animations";
|
|
21
|
+
export { getZIndexClass, getZIndex } from "./tokens/z-index";
|
|
22
|
+
export { getOpacityClass, getOpacity } from "./tokens/opacity";
|
|
23
|
+
export { getGradientClass, getGradient } from "./tokens/gradients";
|
|
@@ -49,7 +49,7 @@ export default function Breadcrumb({
|
|
|
49
49
|
].filter(Boolean).join(" ");
|
|
50
50
|
|
|
51
51
|
return (
|
|
52
|
-
<nav aria-label="Breadcrumb" className={classes} {...
|
|
52
|
+
<nav aria-label="Breadcrumb" className={classes} {...props}>
|
|
53
53
|
<ol className="flex items-center space-x-2">
|
|
54
54
|
{items.map((item, index) => {
|
|
55
55
|
const isLast = index === items.length - 1;
|
|
@@ -3,7 +3,7 @@ import Card from "./Card";
|
|
|
3
3
|
import { Text, Button } from "../../atoms";
|
|
4
4
|
|
|
5
5
|
const meta: Meta<typeof Card> = {
|
|
6
|
-
title: "
|
|
6
|
+
title: "Molecules/Card",
|
|
7
7
|
component: Card,
|
|
8
8
|
parameters: {
|
|
9
9
|
docs: {
|
|
@@ -23,6 +23,18 @@ const meta: Meta<typeof Card> = {
|
|
|
23
23
|
options: ["none", "small", "medium", "large"],
|
|
24
24
|
description: "Padding size",
|
|
25
25
|
},
|
|
26
|
+
onClick: {
|
|
27
|
+
control: false,
|
|
28
|
+
description: "Click handler. When provided, card becomes interactive with keyboard support.",
|
|
29
|
+
},
|
|
30
|
+
'aria-label': {
|
|
31
|
+
control: "text",
|
|
32
|
+
description: "Accessible label for interactive cards",
|
|
33
|
+
},
|
|
34
|
+
'aria-labelledby': {
|
|
35
|
+
control: "text",
|
|
36
|
+
description: "ID of element that labels the card",
|
|
37
|
+
},
|
|
26
38
|
},
|
|
27
39
|
};
|
|
28
40
|
|
|
@@ -114,4 +126,40 @@ export const NoPadding: StoryObj<typeof Card> = {
|
|
|
114
126
|
},
|
|
115
127
|
};
|
|
116
128
|
|
|
129
|
+
export const Interactive: StoryObj<typeof Card> = {
|
|
130
|
+
args: {
|
|
131
|
+
variant: "hover",
|
|
132
|
+
onClick: () => alert("Card clicked!"),
|
|
133
|
+
'aria-label': "Clickable card example",
|
|
134
|
+
children: (
|
|
135
|
+
<>
|
|
136
|
+
<Text as="h3" className="text-lg font-semibold mb-2">Interactive Card</Text>
|
|
137
|
+
<Text as="p" className="text-gray-600">This card is clickable. Press Enter or Space when focused to activate.</Text>
|
|
138
|
+
</>
|
|
139
|
+
),
|
|
140
|
+
},
|
|
141
|
+
parameters: {
|
|
142
|
+
docs: {
|
|
143
|
+
description: {
|
|
144
|
+
story: "Interactive cards support keyboard navigation. Tab to focus, then press Enter or Space to activate.",
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
export const WithAriaLabel: StoryObj<typeof Card> = {
|
|
151
|
+
args: {
|
|
152
|
+
variant: "hover",
|
|
153
|
+
onClick: () => alert("Card clicked!"),
|
|
154
|
+
'aria-label': "Product card: Premium Plan - $99/month",
|
|
155
|
+
children: (
|
|
156
|
+
<>
|
|
157
|
+
<Text as="h3" className="text-lg font-semibold mb-2">Premium Plan</Text>
|
|
158
|
+
<Text as="p" className="text-gray-600 mb-2">$99/month</Text>
|
|
159
|
+
<Text as="p" className="text-sm text-gray-500">Includes all features</Text>
|
|
160
|
+
</>
|
|
161
|
+
),
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
|
|
117
165
|
export default meta;
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
import { memo, useMemo, useCallback } from 'react';
|
|
1
2
|
import type { HTMLAttributes } from "react";
|
|
2
3
|
|
|
3
4
|
interface Props extends HTMLAttributes<HTMLDivElement> {
|
|
4
5
|
variant?: "default" | "hover" | "selected";
|
|
5
6
|
padding?: "none" | "small" | "medium" | "large";
|
|
7
|
+
onClick?: () => void;
|
|
8
|
+
'aria-label'?: string;
|
|
9
|
+
'aria-labelledby'?: string;
|
|
6
10
|
}
|
|
7
11
|
|
|
8
12
|
/**
|
|
@@ -11,6 +15,7 @@ interface Props extends HTMLAttributes<HTMLDivElement> {
|
|
|
11
15
|
* A versatile card component for displaying content in containers.
|
|
12
16
|
* Follows Atomic Design principles as a Molecule component.
|
|
13
17
|
* Can be used to replace BoxWrapper in many cases with more flexibility.
|
|
18
|
+
* Optimized with React.memo to prevent unnecessary re-renders.
|
|
14
19
|
*
|
|
15
20
|
* @example
|
|
16
21
|
* ```tsx
|
|
@@ -20,10 +25,13 @@ interface Props extends HTMLAttributes<HTMLDivElement> {
|
|
|
20
25
|
* </Card>
|
|
21
26
|
* ```
|
|
22
27
|
*/
|
|
23
|
-
|
|
28
|
+
const Card = memo(function Card({
|
|
24
29
|
variant = "default",
|
|
25
30
|
padding = "medium",
|
|
26
31
|
className = "",
|
|
32
|
+
onClick,
|
|
33
|
+
'aria-label': ariaLabel,
|
|
34
|
+
'aria-labelledby': ariaLabelledBy,
|
|
27
35
|
children,
|
|
28
36
|
...props
|
|
29
37
|
}: Props) {
|
|
@@ -48,16 +56,43 @@ export default function Card({
|
|
|
48
56
|
large: "p-6",
|
|
49
57
|
};
|
|
50
58
|
|
|
51
|
-
const
|
|
59
|
+
const isInteractive = useMemo(() =>
|
|
60
|
+
onClick !== undefined || variant === "hover",
|
|
61
|
+
[onClick, variant]
|
|
62
|
+
);
|
|
63
|
+
const role = isInteractive ? "button" : undefined;
|
|
64
|
+
const tabIndex = isInteractive ? 0 : undefined;
|
|
65
|
+
|
|
66
|
+
const classes = useMemo(() => [
|
|
52
67
|
...baseClasses,
|
|
53
68
|
variantClasses[variant],
|
|
54
69
|
paddingClasses[padding],
|
|
55
70
|
className,
|
|
56
|
-
].filter(Boolean).join(" ");
|
|
71
|
+
].filter(Boolean).join(" "), [variant, padding, className]);
|
|
72
|
+
|
|
73
|
+
const handleKeyDown = useCallback((e: React.KeyboardEvent<HTMLDivElement>) => {
|
|
74
|
+
if (isInteractive && (e.key === 'Enter' || e.key === ' ')) {
|
|
75
|
+
e.preventDefault();
|
|
76
|
+
onClick?.();
|
|
77
|
+
}
|
|
78
|
+
}, [isInteractive, onClick]);
|
|
57
79
|
|
|
58
80
|
return (
|
|
59
|
-
<div
|
|
81
|
+
<div
|
|
82
|
+
className={classes}
|
|
83
|
+
role={role}
|
|
84
|
+
tabIndex={tabIndex}
|
|
85
|
+
onClick={onClick}
|
|
86
|
+
onKeyDown={handleKeyDown}
|
|
87
|
+
aria-label={ariaLabel}
|
|
88
|
+
aria-labelledby={ariaLabelledBy}
|
|
89
|
+
{...props}
|
|
90
|
+
>
|
|
60
91
|
{children}
|
|
61
92
|
</div>
|
|
62
93
|
);
|
|
63
|
-
}
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
Card.displayName = 'Card';
|
|
97
|
+
|
|
98
|
+
export default Card;
|