@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
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
import { Meta } from '@storybook/addon-docs/blocks';
|
|
2
|
+
|
|
3
|
+
<Meta title="Design System/Accessibility" />
|
|
4
|
+
|
|
5
|
+
# Accessibility Guide
|
|
6
|
+
|
|
7
|
+
Este guia explica como usar o React Design System de forma acessível e como os componentes atendem aos padrões WCAG 2.1 AA.
|
|
8
|
+
|
|
9
|
+
## Padrões de Acessibilidade
|
|
10
|
+
|
|
11
|
+
Todos os componentes do design system são **WCAG 2.1 AA compliant**, garantindo:
|
|
12
|
+
|
|
13
|
+
- ✅ Contraste de cores adequado (4.5:1 para texto normal, 3:1 para texto grande)
|
|
14
|
+
- ✅ Navegação completa por teclado
|
|
15
|
+
- ✅ Suporte a screen readers
|
|
16
|
+
- ✅ ARIA attributes apropriados
|
|
17
|
+
- ✅ Focus management correto
|
|
18
|
+
|
|
19
|
+
## Uso Acessível de Componentes
|
|
20
|
+
|
|
21
|
+
### Labels Sempre Obrigatórios
|
|
22
|
+
|
|
23
|
+
```tsx
|
|
24
|
+
// ✅ Correto: Label associado
|
|
25
|
+
<Label htmlFor="email">Email</Label>
|
|
26
|
+
<Input id="email" type="email" />
|
|
27
|
+
|
|
28
|
+
// ❌ Incorreto: Sem label
|
|
29
|
+
<Input placeholder="Email" /> // Não acessível para screen readers
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### ARIA Labels para Ícones
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
// ✅ Correto: ARIA label para botões com apenas ícones
|
|
36
|
+
<Button aria-label="Close dialog" onClick={handleClose}>
|
|
37
|
+
<CloseIcon />
|
|
38
|
+
</Button>
|
|
39
|
+
|
|
40
|
+
// ❌ Incorreto: Sem contexto
|
|
41
|
+
<Button onClick={handleClose}>
|
|
42
|
+
<CloseIcon />
|
|
43
|
+
</Button>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Descrições Adicionais
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
// ✅ Correto: Descrição associada
|
|
50
|
+
<Input
|
|
51
|
+
id="password"
|
|
52
|
+
type="password"
|
|
53
|
+
aria-describedby="password-help"
|
|
54
|
+
/>
|
|
55
|
+
<span id="password-help">Password must be at least 8 characters</span>
|
|
56
|
+
|
|
57
|
+
// ❌ Incorreto: Sem descrição
|
|
58
|
+
<Input type="password" />
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Navegação por Teclado
|
|
62
|
+
|
|
63
|
+
Todos os componentes interativos suportam navegação por teclado:
|
|
64
|
+
|
|
65
|
+
### Teclas Suportadas
|
|
66
|
+
|
|
67
|
+
- **Tab**: Navegar entre elementos
|
|
68
|
+
- **Enter/Space**: Ativar botões e links
|
|
69
|
+
- **Arrow Keys**: Navegar em menus, tabs, selects
|
|
70
|
+
- **Escape**: Fechar modais e popovers
|
|
71
|
+
- **Home/End**: Navegar para início/fim em listas
|
|
72
|
+
|
|
73
|
+
### Exemplo: Menu Acessível
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
import { Dropdown, Button } from '@fabio.caffarello/react-design-system';
|
|
77
|
+
|
|
78
|
+
function AccessibleMenu() {
|
|
79
|
+
return (
|
|
80
|
+
<Dropdown
|
|
81
|
+
trigger={<Button>Menu</Button>}
|
|
82
|
+
items={[
|
|
83
|
+
{ label: 'Item 1', onClick: () => {} },
|
|
84
|
+
{ label: 'Item 2', onClick: () => {} },
|
|
85
|
+
]}
|
|
86
|
+
/>
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
// Navegação por teclado já implementada
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Focus Management
|
|
93
|
+
|
|
94
|
+
### Focus Trap em Modais
|
|
95
|
+
|
|
96
|
+
```tsx
|
|
97
|
+
import { Modal, Button } from '@fabio.caffarello/react-design-system';
|
|
98
|
+
|
|
99
|
+
function AccessibleModal() {
|
|
100
|
+
return (
|
|
101
|
+
<Modal
|
|
102
|
+
isOpen={isOpen}
|
|
103
|
+
onClose={handleClose}
|
|
104
|
+
// Focus trap automático
|
|
105
|
+
// Focus retorna ao trigger ao fechar
|
|
106
|
+
>
|
|
107
|
+
<h2>Modal Title</h2>
|
|
108
|
+
<p>Modal content</p>
|
|
109
|
+
<Button onClick={handleClose}>Close</Button>
|
|
110
|
+
</Modal>
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Focus Visible
|
|
116
|
+
|
|
117
|
+
Todos os componentes têm estilos de focus visíveis:
|
|
118
|
+
|
|
119
|
+
```css
|
|
120
|
+
/* Automático em todos os componentes */
|
|
121
|
+
button:focus-visible {
|
|
122
|
+
outline: 2px solid var(--color-primary-default);
|
|
123
|
+
outline-offset: 2px;
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Screen Readers
|
|
128
|
+
|
|
129
|
+
### Estrutura Semântica
|
|
130
|
+
|
|
131
|
+
```tsx
|
|
132
|
+
// ✅ Correto: HTML semântico
|
|
133
|
+
import { Card, Text, Button } from '@fabio.caffarello/react-design-system';
|
|
134
|
+
|
|
135
|
+
<Card>
|
|
136
|
+
<Text variant="heading">Title</Text>
|
|
137
|
+
<Text>Description</Text>
|
|
138
|
+
<Button>Action</Button>
|
|
139
|
+
</Card>
|
|
140
|
+
|
|
141
|
+
// ❌ Incorreto: Divs genéricas
|
|
142
|
+
<div>
|
|
143
|
+
<div>Title</div>
|
|
144
|
+
<div>Description</div>
|
|
145
|
+
<div>Action</div>
|
|
146
|
+
</div>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### ARIA Roles
|
|
150
|
+
|
|
151
|
+
Componentes usam roles apropriados automaticamente:
|
|
152
|
+
|
|
153
|
+
```tsx
|
|
154
|
+
// Button usa role="button" automaticamente
|
|
155
|
+
<Button>Click me</Button>
|
|
156
|
+
|
|
157
|
+
// Input usa role apropriado baseado no type
|
|
158
|
+
<Input type="email" role="textbox" />
|
|
159
|
+
|
|
160
|
+
// Modal usa role="dialog" automaticamente
|
|
161
|
+
<Modal>Content</Modal>
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Contraste de Cores
|
|
165
|
+
|
|
166
|
+
### Verificação Automática
|
|
167
|
+
|
|
168
|
+
O design system garante contraste adequado:
|
|
169
|
+
|
|
170
|
+
```tsx
|
|
171
|
+
// ✅ Correto: Cores do design system garantem contraste
|
|
172
|
+
import { getColorClass } from '@fabio.caffarello/react-design-system';
|
|
173
|
+
|
|
174
|
+
<div className={getColorClass('primary', 'DEFAULT', 'bg')}>
|
|
175
|
+
<Text className={getColorClass('primary', 'contrast', 'text')}>
|
|
176
|
+
Text with proper contrast
|
|
177
|
+
</Text>
|
|
178
|
+
</div>
|
|
179
|
+
|
|
180
|
+
// ❌ Evitar: Cores customizadas sem verificar contraste
|
|
181
|
+
<div className="bg-blue-500 text-blue-200">
|
|
182
|
+
Text with poor contrast
|
|
183
|
+
</div>
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Dark Mode
|
|
187
|
+
|
|
188
|
+
O sistema de temas garante contraste adequado em ambos os modos:
|
|
189
|
+
|
|
190
|
+
```tsx
|
|
191
|
+
import { AdvancedThemeProvider } from '@fabio.caffarello/react-design-system';
|
|
192
|
+
|
|
193
|
+
<AdvancedThemeProvider defaultTheme="dark">
|
|
194
|
+
{/* Contraste garantido automaticamente */}
|
|
195
|
+
</AdvancedThemeProvider>
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Formulários Acessíveis
|
|
199
|
+
|
|
200
|
+
### Estrutura Completa
|
|
201
|
+
|
|
202
|
+
```tsx
|
|
203
|
+
import { Form, Label, Input, ErrorMessage, Button } from '@fabio.caffarello/react-design-system';
|
|
204
|
+
|
|
205
|
+
function AccessibleForm() {
|
|
206
|
+
return (
|
|
207
|
+
<Form onSubmit={handleSubmit}>
|
|
208
|
+
<Label htmlFor="email">Email</Label>
|
|
209
|
+
<Input
|
|
210
|
+
id="email"
|
|
211
|
+
type="email"
|
|
212
|
+
required
|
|
213
|
+
aria-required="true"
|
|
214
|
+
aria-invalid={errors.email ? 'true' : 'false'}
|
|
215
|
+
aria-describedby={errors.email ? 'email-error' : undefined}
|
|
216
|
+
/>
|
|
217
|
+
{errors.email && (
|
|
218
|
+
<ErrorMessage id="email-error">
|
|
219
|
+
{errors.email}
|
|
220
|
+
</ErrorMessage>
|
|
221
|
+
)}
|
|
222
|
+
|
|
223
|
+
<Button type="submit">Submit</Button>
|
|
224
|
+
</Form>
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### Validação Acessível
|
|
230
|
+
|
|
231
|
+
```tsx
|
|
232
|
+
import { Input, ErrorMessage } from '@fabio.caffarello/react-design-system';
|
|
233
|
+
|
|
234
|
+
function ValidatedInput({ error, ...props }) {
|
|
235
|
+
return (
|
|
236
|
+
<div>
|
|
237
|
+
<Input
|
|
238
|
+
{...props}
|
|
239
|
+
aria-invalid={error ? 'true' : 'false'}
|
|
240
|
+
aria-describedby={error ? `${props.id}-error` : undefined}
|
|
241
|
+
/>
|
|
242
|
+
{error && (
|
|
243
|
+
<ErrorMessage id={`${props.id}-error`} role="alert">
|
|
244
|
+
{error}
|
|
245
|
+
</ErrorMessage>
|
|
246
|
+
)}
|
|
247
|
+
</div>
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## Listas e Tabelas
|
|
253
|
+
|
|
254
|
+
### Tabelas Acessíveis
|
|
255
|
+
|
|
256
|
+
```tsx
|
|
257
|
+
import { Table } from '@fabio.caffarello/react-design-system';
|
|
258
|
+
|
|
259
|
+
function AccessibleTable() {
|
|
260
|
+
return (
|
|
261
|
+
<Table
|
|
262
|
+
data={data}
|
|
263
|
+
columns={columns}
|
|
264
|
+
// Headers automáticos com scope="col"
|
|
265
|
+
// Caption opcional
|
|
266
|
+
caption="User data table"
|
|
267
|
+
/>
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Listas Acessíveis
|
|
273
|
+
|
|
274
|
+
```tsx
|
|
275
|
+
import { Card, Text } from '@fabio.caffarello/react-design-system';
|
|
276
|
+
|
|
277
|
+
function AccessibleList({ items }) {
|
|
278
|
+
return (
|
|
279
|
+
<ul role="list">
|
|
280
|
+
{items.map((item) => (
|
|
281
|
+
<li key={item.id}>
|
|
282
|
+
<Card>
|
|
283
|
+
<Text>{item.name}</Text>
|
|
284
|
+
</Card>
|
|
285
|
+
</li>
|
|
286
|
+
))}
|
|
287
|
+
</ul>
|
|
288
|
+
);
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
## Animações e Transições
|
|
293
|
+
|
|
294
|
+
### Preferências de Movimento
|
|
295
|
+
|
|
296
|
+
O design system respeita `prefers-reduced-motion`:
|
|
297
|
+
|
|
298
|
+
```css
|
|
299
|
+
/* Automático em todos os componentes */
|
|
300
|
+
@media (prefers-reduced-motion: reduce) {
|
|
301
|
+
* {
|
|
302
|
+
animation-duration: 0.01ms !important;
|
|
303
|
+
transition-duration: 0.01ms !important;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Animações Não Essenciais
|
|
309
|
+
|
|
310
|
+
Animações decorativas podem ser desabilitadas:
|
|
311
|
+
|
|
312
|
+
```tsx
|
|
313
|
+
// Animações são opcionais e podem ser desabilitadas
|
|
314
|
+
<Spinner /> // Animação pode ser desabilitada via CSS
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
## Testes de Acessibilidade
|
|
318
|
+
|
|
319
|
+
### Testes Automatizados
|
|
320
|
+
|
|
321
|
+
Todos os componentes têm testes de acessibilidade:
|
|
322
|
+
|
|
323
|
+
```tsx
|
|
324
|
+
import { render, screen } from '@testing-library/react';
|
|
325
|
+
import { axe, toHaveNoViolations } from 'jest-axe';
|
|
326
|
+
import { Button } from '@fabio.caffarello/react-design-system';
|
|
327
|
+
|
|
328
|
+
expect.extend(toHaveNoViolations);
|
|
329
|
+
|
|
330
|
+
test('Button is accessible', async () => {
|
|
331
|
+
const { container } = render(<Button>Click me</Button>);
|
|
332
|
+
const results = await axe(container);
|
|
333
|
+
expect(results).toHaveNoViolations();
|
|
334
|
+
});
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
### Testes Manuais
|
|
338
|
+
|
|
339
|
+
Checklist para testes manuais:
|
|
340
|
+
|
|
341
|
+
- [ ] Navegação completa por teclado
|
|
342
|
+
- [ ] Screen reader anuncia corretamente
|
|
343
|
+
- [ ] Contraste de cores adequado
|
|
344
|
+
- [ ] Focus visível em todos os elementos
|
|
345
|
+
- [ ] Labels associados corretamente
|
|
346
|
+
- [ ] Erros anunciados apropriadamente
|
|
347
|
+
|
|
348
|
+
## Ferramentas
|
|
349
|
+
|
|
350
|
+
### axe DevTools
|
|
351
|
+
|
|
352
|
+
Use o axe DevTools para verificar acessibilidade:
|
|
353
|
+
|
|
354
|
+
1. Instale a extensão do navegador
|
|
355
|
+
2. Abra a página
|
|
356
|
+
3. Execute a verificação
|
|
357
|
+
4. Corrija problemas encontrados
|
|
358
|
+
|
|
359
|
+
### WAVE
|
|
360
|
+
|
|
361
|
+
Use o WAVE para análise de acessibilidade:
|
|
362
|
+
|
|
363
|
+
1. Acesse [wave.webaim.org](https://wave.webaim.org)
|
|
364
|
+
2. Insira a URL ou código
|
|
365
|
+
3. Analise os resultados
|
|
366
|
+
|
|
367
|
+
### Lighthouse
|
|
368
|
+
|
|
369
|
+
Use o Lighthouse para auditoria completa:
|
|
370
|
+
|
|
371
|
+
1. Abra DevTools
|
|
372
|
+
2. Vá para a aba Lighthouse
|
|
373
|
+
3. Selecione "Accessibility"
|
|
374
|
+
4. Execute a auditoria
|
|
375
|
+
|
|
376
|
+
## Checklist de Acessibilidade
|
|
377
|
+
|
|
378
|
+
Antes de publicar um componente ou página:
|
|
379
|
+
|
|
380
|
+
- [ ] Todos os inputs têm labels associados
|
|
381
|
+
- [ ] Botões com apenas ícones têm aria-label
|
|
382
|
+
- [ ] Navegação por teclado funciona
|
|
383
|
+
- [ ] Contraste de cores adequado (4.5:1 mínimo)
|
|
384
|
+
- [ ] Focus visível em todos os elementos
|
|
385
|
+
- [ ] Screen reader anuncia corretamente
|
|
386
|
+
- [ ] Erros são anunciados apropriadamente
|
|
387
|
+
- [ ] Animações respeitam prefers-reduced-motion
|
|
388
|
+
|
|
389
|
+
## Recursos Adicionais
|
|
390
|
+
|
|
391
|
+
- [WCAG 2.1 Guidelines](https://www.w3.org/WAI/WCAG21/quickref/)
|
|
392
|
+
- [ARIA Authoring Practices](https://www.w3.org/WAI/ARIA/apg/)
|
|
393
|
+
- [WebAIM](https://webaim.org/)
|
|
394
|
+
- [A11y Project](https://www.a11yproject.com/)
|
|
395
|
+
|
|
396
|
+
## Suporte
|
|
397
|
+
|
|
398
|
+
Se encontrar problemas de acessibilidade:
|
|
399
|
+
|
|
400
|
+
1. Consulte a [documentação do componente](./Design%20System/Components)
|
|
401
|
+
2. Verifique os [testes de acessibilidade](./Design%20System/Component%20Status)
|
|
402
|
+
3. Abra uma [issue no GitHub](https://github.com/fabiocaffarello/react-design-system/issues)
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import { Meta } from '@storybook/addon-docs/blocks';
|
|
2
|
+
|
|
3
|
+
<Meta title="Design System/Best Practices" />
|
|
4
|
+
|
|
5
|
+
# Best Practices
|
|
6
|
+
|
|
7
|
+
Este guia apresenta as melhores práticas para usar o React Design System de forma eficiente e consistente.
|
|
8
|
+
|
|
9
|
+
## Estrutura de Componentes
|
|
10
|
+
|
|
11
|
+
### Atomic Design
|
|
12
|
+
|
|
13
|
+
Sempre siga a hierarquia do Atomic Design:
|
|
14
|
+
|
|
15
|
+
1. **Atoms** → Componentes básicos e indivisíveis
|
|
16
|
+
2. **Molecules** → Combinações de atoms
|
|
17
|
+
3. **Organisms** → Combinações de molecules e atoms
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
// ✅ Correto: Usar atoms para construir molecules
|
|
21
|
+
import { Input, Label, Button } from '@fabio.caffarello/react-design-system';
|
|
22
|
+
|
|
23
|
+
function LoginForm() {
|
|
24
|
+
return (
|
|
25
|
+
<form>
|
|
26
|
+
<Label htmlFor="email">Email</Label>
|
|
27
|
+
<Input id="email" type="email" />
|
|
28
|
+
<Button type="submit">Login</Button>
|
|
29
|
+
</form>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// ❌ Incorreto: Não recriar atoms dentro de molecules
|
|
34
|
+
function BadLoginForm() {
|
|
35
|
+
return (
|
|
36
|
+
<form>
|
|
37
|
+
<input type="email" /> {/* Use o componente Input do design system */}
|
|
38
|
+
</form>
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Uso de Tokens
|
|
44
|
+
|
|
45
|
+
### Sempre Use Design Tokens
|
|
46
|
+
|
|
47
|
+
Use tokens em vez de valores hardcoded:
|
|
48
|
+
|
|
49
|
+
```tsx
|
|
50
|
+
// ✅ Correto: Usar tokens
|
|
51
|
+
import { getSpacingClass, getColorClass } from '@fabio.caffarello/react-design-system';
|
|
52
|
+
|
|
53
|
+
<div className={`${getSpacingClass('md', 'p')} ${getColorClass('primary', 'DEFAULT', 'bg')}`}>
|
|
54
|
+
Content
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
// ❌ Incorreto: Valores hardcoded
|
|
58
|
+
<div className="p-4 bg-indigo-500">
|
|
59
|
+
Content
|
|
60
|
+
</div>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Tokens de Cores
|
|
64
|
+
|
|
65
|
+
Use cores semânticas:
|
|
66
|
+
|
|
67
|
+
```tsx
|
|
68
|
+
// ✅ Correto: Cores semânticas
|
|
69
|
+
getColorClass('primary', 'DEFAULT', 'bg')
|
|
70
|
+
getColorClass('error', 'DEFAULT', 'text')
|
|
71
|
+
getColorClass('success', 'DEFAULT', 'border')
|
|
72
|
+
|
|
73
|
+
// ❌ Incorreto: Cores específicas
|
|
74
|
+
'bg-indigo-500'
|
|
75
|
+
'text-red-600'
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Acessibilidade
|
|
79
|
+
|
|
80
|
+
### Sempre Forneça Labels
|
|
81
|
+
|
|
82
|
+
```tsx
|
|
83
|
+
// ✅ Correto
|
|
84
|
+
<Label htmlFor="username">Username</Label>
|
|
85
|
+
<Input id="username" />
|
|
86
|
+
|
|
87
|
+
// ❌ Incorreto
|
|
88
|
+
<Input placeholder="Username" /> // Sem label associado
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Use ARIA Attributes Quando Necessário
|
|
92
|
+
|
|
93
|
+
```tsx
|
|
94
|
+
// ✅ Correto: Componente com ARIA
|
|
95
|
+
<Button aria-label="Close dialog" onClick={handleClose}>
|
|
96
|
+
<CloseIcon />
|
|
97
|
+
</Button>
|
|
98
|
+
|
|
99
|
+
// ✅ Correto: Componente com descrição
|
|
100
|
+
<Input
|
|
101
|
+
id="password"
|
|
102
|
+
type="password"
|
|
103
|
+
aria-describedby="password-help"
|
|
104
|
+
/>
|
|
105
|
+
<span id="password-help">Password must be at least 8 characters</span>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Navegação por Teclado
|
|
109
|
+
|
|
110
|
+
Todos os componentes interativos já suportam navegação por teclado. Não desabilite isso:
|
|
111
|
+
|
|
112
|
+
```tsx
|
|
113
|
+
// ✅ Correto: Deixar navegação por teclado funcionar
|
|
114
|
+
<Button onClick={handleClick}>Click me</Button>
|
|
115
|
+
|
|
116
|
+
// ❌ Incorreto: Desabilitar navegação por teclado
|
|
117
|
+
<Button onClick={handleClick} onKeyDown={(e) => e.preventDefault()}>
|
|
118
|
+
Click me
|
|
119
|
+
</Button>
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Performance
|
|
123
|
+
|
|
124
|
+
### Use Code Splitting
|
|
125
|
+
|
|
126
|
+
Importe apenas o que você precisa:
|
|
127
|
+
|
|
128
|
+
```tsx
|
|
129
|
+
// ✅ Correto: Import específico
|
|
130
|
+
import { Button, Input } from '@fabio.caffarello/react-design-system/atoms';
|
|
131
|
+
|
|
132
|
+
// ⚠️ Aceitável mas menos otimizado
|
|
133
|
+
import { Button, Input } from '@fabio.caffarello/react-design-system';
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Memoização
|
|
137
|
+
|
|
138
|
+
Componentes já otimizados não precisam de memoização adicional:
|
|
139
|
+
|
|
140
|
+
```tsx
|
|
141
|
+
// ✅ Correto: Componentes já são memoizados
|
|
142
|
+
import { Card } from '@fabio.caffarello/react-design-system';
|
|
143
|
+
|
|
144
|
+
function MyComponent() {
|
|
145
|
+
return <Card>Content</Card>;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// ❌ Desnecessário: Componentes já são otimizados
|
|
149
|
+
import { memo } from 'react';
|
|
150
|
+
const MyCard = memo(Card);
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Temas
|
|
154
|
+
|
|
155
|
+
### Use AdvancedThemeProvider
|
|
156
|
+
|
|
157
|
+
```tsx
|
|
158
|
+
// ✅ Correto: Usar AdvancedThemeProvider
|
|
159
|
+
import { AdvancedThemeProvider } from '@fabio.caffarello/react-design-system';
|
|
160
|
+
|
|
161
|
+
function App() {
|
|
162
|
+
return (
|
|
163
|
+
<AdvancedThemeProvider defaultTheme="light">
|
|
164
|
+
<YourApp />
|
|
165
|
+
</AdvancedThemeProvider>
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Crie Temas Customizados
|
|
171
|
+
|
|
172
|
+
```tsx
|
|
173
|
+
// ✅ Correto: Criar tema customizado
|
|
174
|
+
import { ThemeBuilder } from '@fabio.caffarello/react-design-system';
|
|
175
|
+
|
|
176
|
+
const brandTheme = ThemeBuilder.create({
|
|
177
|
+
name: 'brand',
|
|
178
|
+
base: 'light',
|
|
179
|
+
colors: {
|
|
180
|
+
primary: {
|
|
181
|
+
DEFAULT: { hex: '#your-brand-color' },
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
}).build();
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Composição de Componentes
|
|
188
|
+
|
|
189
|
+
### Compose, Não Modifique
|
|
190
|
+
|
|
191
|
+
```tsx
|
|
192
|
+
// ✅ Correto: Compor componentes
|
|
193
|
+
function CustomCard({ children, ...props }) {
|
|
194
|
+
return (
|
|
195
|
+
<Card padding="large" variant="hover" {...props}>
|
|
196
|
+
{children}
|
|
197
|
+
</Card>
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// ❌ Incorreto: Modificar componentes diretamente
|
|
202
|
+
// Não modifique os componentes do design system
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Use Variants
|
|
206
|
+
|
|
207
|
+
```tsx
|
|
208
|
+
// ✅ Correto: Usar variants
|
|
209
|
+
<Button variant="primary" size="large">Submit</Button>
|
|
210
|
+
<Button variant="secondary" size="small">Cancel</Button>
|
|
211
|
+
|
|
212
|
+
// ❌ Incorreto: Criar componentes customizados para variantes
|
|
213
|
+
function CustomButton() {
|
|
214
|
+
return <button className="custom-primary-large">Submit</button>;
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## Formulários
|
|
219
|
+
|
|
220
|
+
### Use Form Component
|
|
221
|
+
|
|
222
|
+
```tsx
|
|
223
|
+
// ✅ Correto: Usar componente Form
|
|
224
|
+
import { Form, Input, Button } from '@fabio.caffarello/react-design-system';
|
|
225
|
+
|
|
226
|
+
function LoginForm() {
|
|
227
|
+
return (
|
|
228
|
+
<Form onSubmit={handleSubmit}>
|
|
229
|
+
<Input name="email" type="email" required />
|
|
230
|
+
<Input name="password" type="password" required />
|
|
231
|
+
<Button type="submit">Login</Button>
|
|
232
|
+
</Form>
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Validação
|
|
238
|
+
|
|
239
|
+
```tsx
|
|
240
|
+
// ✅ Correto: Validação com react-hook-form
|
|
241
|
+
import { useForm } from 'react-hook-form';
|
|
242
|
+
import { Form, Input, Button } from '@fabio.caffarello/react-design-system';
|
|
243
|
+
|
|
244
|
+
function ValidatedForm() {
|
|
245
|
+
const { register, handleSubmit, formState: { errors } } = useForm();
|
|
246
|
+
|
|
247
|
+
return (
|
|
248
|
+
<Form onSubmit={handleSubmit(onSubmit)}>
|
|
249
|
+
<Input
|
|
250
|
+
{...register('email', { required: true })}
|
|
251
|
+
error={errors.email ? 'Email is required' : undefined}
|
|
252
|
+
/>
|
|
253
|
+
<Button type="submit">Submit</Button>
|
|
254
|
+
</Form>
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Testes
|
|
260
|
+
|
|
261
|
+
### Teste Componentes
|
|
262
|
+
|
|
263
|
+
```tsx
|
|
264
|
+
// ✅ Correto: Testar componentes
|
|
265
|
+
import { render, screen } from '@testing-library/react';
|
|
266
|
+
import { Button } from '@fabio.caffarello/react-design-system';
|
|
267
|
+
|
|
268
|
+
test('renders button', () => {
|
|
269
|
+
render(<Button>Click me</Button>);
|
|
270
|
+
expect(screen.getByRole('button')).toBeInTheDocument();
|
|
271
|
+
});
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## TypeScript
|
|
275
|
+
|
|
276
|
+
### Use Types do Design System
|
|
277
|
+
|
|
278
|
+
```tsx
|
|
279
|
+
// ✅ Correto: Usar tipos exportados
|
|
280
|
+
import type { ButtonProps } from '@fabio.caffarello/react-design-system';
|
|
281
|
+
|
|
282
|
+
function MyButton(props: ButtonProps) {
|
|
283
|
+
return <Button {...props} />;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// ❌ Incorreto: Criar tipos próprios
|
|
287
|
+
interface MyButtonProps {
|
|
288
|
+
// ...
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
## Erros Comuns
|
|
293
|
+
|
|
294
|
+
### ❌ Não Faça Isso
|
|
295
|
+
|
|
296
|
+
1. **Não modifique componentes diretamente**
|
|
297
|
+
2. **Não use valores hardcoded em vez de tokens**
|
|
298
|
+
3. **Não ignore acessibilidade**
|
|
299
|
+
4. **Não importe tudo quando precisa de pouco**
|
|
300
|
+
5. **Não crie componentes que já existem**
|
|
301
|
+
|
|
302
|
+
### ✅ Faça Isso
|
|
303
|
+
|
|
304
|
+
1. **Use componentes como estão**
|
|
305
|
+
2. **Use design tokens**
|
|
306
|
+
3. **Sempre considere acessibilidade**
|
|
307
|
+
4. **Use code splitting**
|
|
308
|
+
5. **Reutilize componentes existentes**
|
|
309
|
+
|
|
310
|
+
## Recursos Adicionais
|
|
311
|
+
|
|
312
|
+
- [Getting Started Guide](./Design%20System/Getting%20Started)
|
|
313
|
+
- [Component Composition Guide](./Design%20System/Component%20Composition)
|
|
314
|
+
- [Accessibility Guide](./Design%20System/Accessibility)
|
|
315
|
+
- [Performance Guide](./Design%20System/Performance)
|