@shohojdhara/atomix 0.3.14 → 0.4.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/CHANGELOG.md +20 -0
- package/build-tools/EXAMPLES.md +372 -0
- package/build-tools/README.md +242 -0
- package/build-tools/__tests__/error-handler.test.js +230 -0
- package/build-tools/__tests__/index.test.js +141 -0
- package/build-tools/__tests__/rollup-plugin.test.js +194 -0
- package/build-tools/__tests__/utils.test.js +161 -0
- package/build-tools/__tests__/vite-plugin.test.js +129 -0
- package/build-tools/__tests__/webpack-loader.test.js +190 -0
- package/build-tools/error-handler.js +308 -0
- package/build-tools/index.d.ts +44 -0
- package/build-tools/index.js +88 -0
- package/build-tools/package.json +50 -0
- package/build-tools/rollup-plugin.js +236 -0
- package/build-tools/types.d.ts +163 -0
- package/build-tools/utils.js +203 -0
- package/build-tools/vite-plugin.js +161 -0
- package/build-tools/webpack-loader.js +123 -0
- package/dist/atomix.css +21044 -2618
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +77 -3
- package/dist/atomix.min.css.map +1 -1
- package/dist/build-tools/EXAMPLES.md +372 -0
- package/dist/build-tools/README.md +242 -0
- package/dist/build-tools/__tests__/error-handler.test.js +230 -0
- package/dist/build-tools/__tests__/index.test.js +141 -0
- package/dist/build-tools/__tests__/rollup-plugin.test.js +194 -0
- package/dist/build-tools/__tests__/utils.test.js +161 -0
- package/dist/build-tools/__tests__/vite-plugin.test.js +129 -0
- package/dist/build-tools/__tests__/webpack-loader.test.js +190 -0
- package/dist/build-tools/error-handler.js +308 -0
- package/dist/build-tools/index.d.ts +44 -0
- package/dist/build-tools/index.js +88 -0
- package/dist/build-tools/package.json +50 -0
- package/dist/build-tools/rollup-plugin.js +236 -0
- package/dist/build-tools/types.d.ts +163 -0
- package/dist/build-tools/utils.js +203 -0
- package/dist/build-tools/vite-plugin.js +161 -0
- package/dist/build-tools/webpack-loader.js +123 -0
- package/dist/charts.d.ts +1 -1
- package/dist/charts.js +86 -57
- package/dist/charts.js.map +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/core.js +136 -112
- package/dist/core.js.map +1 -1
- package/dist/forms.d.ts +2 -5
- package/dist/forms.js +140 -128
- package/dist/forms.js.map +1 -1
- package/dist/heavy.d.ts +1 -1
- package/dist/heavy.js +136 -112
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +152 -78
- package/dist/index.esm.js +346 -340
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +359 -353
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/layout.js.map +1 -1
- package/dist/theme.d.ts +9 -9
- package/dist/theme.js.map +1 -1
- package/package.json +23 -8
- package/scripts/atomix-cli.js +170 -73
- package/scripts/cli/__tests__/README.md +81 -0
- package/scripts/cli/__tests__/basic.test.js +115 -0
- package/scripts/cli/__tests__/component-generator.test.js +332 -0
- package/scripts/cli/__tests__/integration.test.js +327 -0
- package/scripts/cli/__tests__/test-setup.js +133 -0
- package/scripts/cli/__tests__/token-manager.test.js +251 -0
- package/scripts/cli/__tests__/utils.test.js +161 -0
- package/scripts/cli/component-generator.js +253 -299
- package/scripts/cli/dependency-checker.js +355 -0
- package/scripts/cli/interactive-init.js +46 -5
- package/scripts/cli/template-manager.js +0 -2
- package/scripts/cli/templates/common-templates.js +636 -0
- package/scripts/cli/templates/composable-templates.js +148 -126
- package/scripts/cli/templates/index.js +23 -16
- package/scripts/cli/templates/project-templates.js +151 -23
- package/scripts/cli/templates/react-templates.js +280 -210
- package/scripts/cli/templates/scss-templates.js +90 -91
- package/scripts/cli/templates/testing-templates.js +206 -27
- package/scripts/cli/templates/testing-utils.js +278 -0
- package/scripts/cli/templates/types-templates.js +70 -56
- package/scripts/cli/theme-bridge.js +8 -2
- package/scripts/cli/token-manager.js +318 -206
- package/scripts/cli/utils.js +0 -1
- package/src/components/Accordion/Accordion.stories.tsx +358 -850
- package/src/components/Accordion/Accordion.test.tsx +70 -50
- package/src/components/Accordion/Accordion.tsx +99 -94
- package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
- package/src/components/AtomixGlass/AtomixGlass.tsx +80 -39
- package/src/components/AtomixGlass/AtomixGlassContainer.tsx +103 -81
- package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
- package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +8 -7
- package/src/components/AtomixGlass/glass-utils.ts +6 -5
- package/src/components/AtomixGlass/shader-utils.ts +133 -52
- package/src/components/AtomixGlass/stories/Customization.stories.tsx +131 -0
- package/src/components/AtomixGlass/stories/Examples.stories.tsx +2957 -2853
- package/src/components/AtomixGlass/stories/Modes.stories.tsx +1 -1
- package/src/components/AtomixGlass/stories/Overview.stories.tsx +348 -0
- package/src/components/AtomixGlass/stories/Performance.stories.tsx +103 -0
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +51 -36
- package/src/components/AtomixGlass/stories/{ShaderVariants.stories.tsx → Shaders.stories.tsx} +2 -2
- package/src/components/AtomixGlass/stories/shared-components.tsx +90 -190
- package/src/components/Avatar/Avatar.stories.tsx +195 -0
- package/src/components/Avatar/Avatar.tsx +58 -56
- package/src/components/Badge/Badge.stories.tsx +122 -352
- package/src/components/Badge/Badge.test.tsx +41 -41
- package/src/components/Badge/Badge.tsx +64 -62
- package/src/components/Block/Block.stories.tsx +30 -11
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +142 -23
- package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
- package/src/components/Button/Button.stories.tsx +454 -1126
- package/src/components/Button/Button.test.tsx +123 -0
- package/src/components/Button/Button.tsx +88 -60
- package/src/components/Button/ButtonGroup.stories.tsx +376 -215
- package/src/components/Button/ButtonGroup.tsx +4 -15
- package/src/components/Callout/Callout.stories.tsx +316 -568
- package/src/components/Card/Card.stories.tsx +292 -81
- package/src/components/Card/Card.tsx +30 -14
- package/src/components/Chart/AreaChart.tsx +1 -1
- package/src/components/Chart/CandlestickChart.tsx +23 -16
- package/src/components/Chart/Chart.stories.tsx +153 -16
- package/src/components/Chart/Chart.tsx +40 -44
- package/src/components/Chart/ChartRenderer.tsx +39 -12
- package/src/components/Chart/ChartToolbar.tsx +21 -5
- package/src/components/Chart/DonutChart.tsx +1 -1
- package/src/components/Chart/FunnelChart.tsx +4 -1
- package/src/components/Chart/GaugeChart.tsx +3 -1
- package/src/components/Chart/HeatmapChart.tsx +50 -37
- package/src/components/Chart/LineChart.tsx +3 -2
- package/src/components/Chart/MultiAxisChart.tsx +24 -16
- package/src/components/Chart/RadarChart.tsx +19 -17
- package/src/components/Chart/ScatterChart.tsx +29 -21
- package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +152 -66
- package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
- package/src/components/Countdown/Countdown.stories.tsx +114 -7
- package/src/components/DataTable/DataTable.stories.tsx +349 -144
- package/src/components/DataTable/DataTable.test.tsx +26 -148
- package/src/components/DataTable/DataTable.tsx +485 -456
- package/src/components/DatePicker/DatePicker.stories.tsx +310 -1066
- package/src/components/DatePicker/DatePicker.tsx +31 -26
- package/src/components/Dropdown/Dropdown.stories.tsx +153 -36
- package/src/components/Dropdown/Dropdown.tsx +313 -299
- package/src/components/EdgePanel/EdgePanel.stories.tsx +221 -25
- package/src/components/EdgePanel/EdgePanel.tsx +1 -3
- package/src/components/Footer/Footer.stories.tsx +396 -327
- package/src/components/Footer/Footer.tsx +130 -128
- package/src/components/Footer/FooterLink.tsx +2 -2
- package/src/components/Form/Checkbox.stories.tsx +140 -6
- package/src/components/Form/Checkbox.test.tsx +63 -0
- package/src/components/Form/Checkbox.tsx +122 -78
- package/src/components/Form/Form.stories.tsx +110 -19
- package/src/components/Form/FormGroup.stories.tsx +127 -4
- package/src/components/Form/Input.stories.tsx +22 -39
- package/src/components/Form/Input.test.tsx +38 -44
- package/src/components/Form/Radio.stories.tsx +146 -17
- package/src/components/Form/Radio.tsx +68 -66
- package/src/components/Form/Select.stories.tsx +140 -8
- package/src/components/Form/Select.tsx +184 -182
- package/src/components/Form/Textarea.stories.tsx +149 -6
- package/src/components/Form/Textarea.test.tsx +27 -32
- package/src/components/Hero/Hero.stories.tsx +372 -38
- package/src/components/Hero/Hero.tsx +201 -55
- package/src/components/Icon/index.ts +7 -1
- package/src/components/List/List.stories.tsx +141 -3
- package/src/components/List/List.tsx +19 -23
- package/src/components/Modal/Modal.stories.tsx +183 -43
- package/src/components/Modal/Modal.tsx +130 -127
- package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
- package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
- package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
- package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
- package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
- package/src/components/Pagination/Pagination.stories.tsx +7 -4
- package/src/components/Pagination/Pagination.tsx +199 -202
- package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
- package/src/components/Popover/Popover.stories.tsx +354 -97
- package/src/components/Popover/Popover.tsx +41 -37
- package/src/components/Progress/Progress.stories.tsx +160 -7
- package/src/components/River/River.stories.tsx +3 -2
- package/src/components/SectionIntro/SectionIntro.stories.tsx +239 -47
- package/src/components/Slider/Slider.stories.tsx +12 -4
- package/src/components/Spinner/Spinner.stories.tsx +104 -8
- package/src/components/Spinner/Spinner.test.tsx +23 -23
- package/src/components/Spinner/Spinner.tsx +43 -46
- package/src/components/Steps/Steps.stories.tsx +173 -42
- package/src/components/Tabs/Tabs.stories.tsx +141 -12
- package/src/components/Tabs/Tabs.tsx +74 -72
- package/src/components/Testimonial/Testimonial.stories.tsx +120 -3
- package/src/components/Todo/Todo.stories.tsx +198 -9
- package/src/components/Toggle/Toggle.stories.tsx +137 -36
- package/src/components/Toggle/Toggle.test.tsx +65 -70
- package/src/components/Toggle/Toggle.tsx +4 -1
- package/src/components/Tooltip/Tooltip.stories.tsx +194 -100
- package/src/components/Tooltip/Tooltip.tsx +104 -106
- package/src/components/Upload/Upload.stories.tsx +241 -150
- package/src/components/Upload/Upload.tsx +287 -283
- package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
- package/src/components/index.ts +13 -2
- package/src/layouts/Grid/Grid.stories.tsx +9 -3
- package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
- package/src/lib/README.md +2 -2
- package/src/lib/__tests__/theme-tools.test.ts +219 -0
- package/src/lib/composables/index.ts +2 -2
- package/src/lib/composables/shared-mouse-tracker.ts +13 -14
- package/src/lib/composables/useAtomixGlass.ts +126 -97
- package/src/lib/composables/useChartExport.ts +3 -8
- package/src/lib/composables/useDataTable.ts +72 -43
- package/src/lib/composables/useHero.ts +58 -14
- package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
- package/src/lib/composables/useInput.ts +10 -8
- package/src/lib/composables/useSideMenu.ts +6 -5
- package/src/lib/composables/useTooltip.ts +1 -2
- package/src/lib/composables/useVideoPlayer.ts +44 -35
- package/src/lib/config/index.ts +154 -154
- package/src/lib/constants/components.ts +9 -32
- package/src/lib/constants/cssVariables.ts +29 -29
- package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
- package/src/lib/hooks/index.ts +1 -1
- package/src/lib/hooks/useComponentCustomization.ts +11 -17
- package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
- package/src/lib/patterns/__tests__/slots.test.ts +1 -1
- package/src/lib/patterns/index.ts +1 -1
- package/src/lib/patterns/slots.tsx +8 -13
- package/src/lib/storybook/InteractiveDemo.tsx +13 -18
- package/src/lib/storybook/PreviewContainer.tsx +1 -1
- package/src/lib/storybook/VariantsGrid.tsx +3 -7
- package/src/lib/storybook/index.ts +1 -1
- package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
- package/src/lib/theme/adapters/index.ts +3 -9
- package/src/lib/theme/adapters/themeAdapter.ts +41 -26
- package/src/lib/theme/config/index.ts +1 -1
- package/src/lib/theme/config/types.ts +2 -2
- package/src/lib/theme/config/validator.ts +10 -5
- package/src/lib/theme/constants/constants.ts +2 -2
- package/src/lib/theme/constants/index.ts +1 -2
- package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
- package/src/lib/theme/core/composeTheme.ts +32 -26
- package/src/lib/theme/core/createTheme.ts +1 -1
- package/src/lib/theme/core/createThemeObject.ts +308 -301
- package/src/lib/theme/core/index.ts +3 -3
- package/src/lib/theme/devtools/CLI.ts +107 -105
- package/src/lib/theme/devtools/Comparator.tsx +50 -32
- package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
- package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
- package/src/lib/theme/devtools/Inspector.tsx +75 -60
- package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
- package/src/lib/theme/devtools/Preview.tsx +150 -106
- package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
- package/src/lib/theme/devtools/index.ts +3 -9
- package/src/lib/theme/devtools/useHistory.ts +23 -21
- package/src/lib/theme/errors/errors.ts +12 -11
- package/src/lib/theme/errors/index.ts +2 -7
- package/src/lib/theme/generators/generateCSS.ts +9 -13
- package/src/lib/theme/generators/generateCSSNested.ts +1 -6
- package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
- package/src/lib/theme/generators/index.ts +1 -4
- package/src/lib/theme/i18n/index.ts +1 -1
- package/src/lib/theme/i18n/rtl.ts +13 -13
- package/src/lib/theme/index.ts +7 -16
- package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
- package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
- package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
- package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
- package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
- package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
- package/src/lib/theme/runtime/index.ts +2 -5
- package/src/lib/theme/runtime/useTheme.ts +18 -18
- package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
- package/src/lib/theme/test/testTheme.ts +15 -16
- package/src/lib/theme/tokens/index.ts +2 -7
- package/src/lib/theme/tokens/tokens.ts +25 -24
- package/src/lib/theme/types.ts +428 -411
- package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
- package/src/lib/theme/utils/componentTheming.ts +18 -18
- package/src/lib/theme/utils/domUtils.ts +277 -289
- package/src/lib/theme/utils/index.ts +1 -2
- package/src/lib/theme/utils/injectCSS.ts +10 -14
- package/src/lib/theme/utils/naming.ts +20 -16
- package/src/lib/theme/utils/themeHelpers.ts +10 -12
- package/src/lib/theme/utils/themeUtils.ts +85 -86
- package/src/lib/theme/utils/themeValidation.ts +82 -33
- package/src/lib/theme-tools.ts +8 -6
- package/src/lib/types/components.ts +172 -71
- package/src/lib/types/partProps.ts +1 -1
- package/src/lib/utils/__tests__/csv.test.ts +45 -0
- package/src/lib/utils/componentUtils.ts +8 -12
- package/src/lib/utils/csv.ts +19 -0
- package/src/lib/utils/dataTableExport.ts +2 -15
- package/src/lib/utils/fontPreloader.ts +10 -19
- package/src/lib/utils/icons.ts +4 -1
- package/src/lib/utils/index.ts +2 -6
- package/src/lib/utils/memoryMonitor.ts +10 -8
- package/src/lib/utils/themeNaming.ts +2 -2
- package/src/styles/01-settings/_index.scss +1 -1
- package/src/styles/01-settings/_settings.accordion.scss +28 -7
- package/src/styles/01-settings/_settings.colors.scss +11 -11
- package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
- package/src/styles/01-settings/_settings.navbar.scss +1 -1
- package/src/styles/01-settings/_settings.spacing.scss +3 -4
- package/src/styles/01-settings/_settings.tooltip.scss +1 -1
- package/src/styles/01-settings/_settings.typography.scss +4 -4
- package/src/styles/02-tools/_tools.button.scss +51 -21
- package/src/styles/02-tools/_tools.utility-api.scss +38 -12
- package/src/styles/03-generic/_generic.root.scss +4 -3
- package/src/styles/06-components/_components.accordion.scss +56 -14
- package/src/styles/06-components/_components.atomix-glass.scss +13 -9
- package/src/styles/06-components/_components.button.scss +16 -4
- package/src/styles/06-components/_components.callout.scss +27 -21
- package/src/styles/06-components/_components.card.scss +5 -14
- package/src/styles/06-components/_components.chart.scss +22 -19
- package/src/styles/06-components/_components.checkbox.scss +25 -17
- package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
- package/src/styles/06-components/_components.edge-panel.scss +9 -2
- package/src/styles/06-components/_components.footer.scss +1 -1
- package/src/styles/06-components/_components.side-menu.scss +5 -5
- package/src/styles/06-components/_components.toggle.scss +18 -0
- package/src/styles/06-components/_index.scss +1 -1
- package/src/styles/06-components/old.chart.styles.scss +0 -2
- package/src/styles/99-utilities/_index.scss +2 -0
- package/src/styles/99-utilities/_utilities.border.scss +69 -27
- package/src/styles/99-utilities/_utilities.display.scss +1 -1
- package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
- package/src/styles/99-utilities/_utilities.position.scss +16 -9
- package/src/styles/99-utilities/_utilities.scss +2 -0
- package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
- package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
- package/src/styles/99-utilities/_utilities.text-gradient.scss +45 -0
- package/src/styles/99-utilities/_utilities.text.scss +67 -46
- package/themes/dark-complementary/README.md +98 -0
- package/themes/dark-complementary/index.scss +158 -0
- package/themes/default-light/README.md +81 -0
- package/themes/default-light/index.scss +154 -0
- package/themes/high-contrast/README.md +105 -0
- package/themes/high-contrast/index.scss +172 -0
- package/themes/test-theme/README.md +38 -0
- package/themes/test-theme/index.scss +47 -0
- package/scripts/cli/templates-original-backup.js +0 -1655
- package/scripts/cli/templates_backup.js +0 -684
- package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +0 -1438
- package/src/lib/composables/useButton.ts +0 -93
- package/src/lib/composables/useCheckbox.ts +0 -70
|
@@ -4,88 +4,83 @@ import { Toggle } from './Toggle';
|
|
|
4
4
|
import React from 'react';
|
|
5
5
|
|
|
6
6
|
describe('Toggle Component', () => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
it('renders correctly', () => {
|
|
8
|
+
render(<Toggle />);
|
|
9
|
+
const toggle = screen.getByRole('switch');
|
|
10
|
+
expect(toggle).toBeInTheDocument();
|
|
11
|
+
expect(toggle).toHaveAttribute('aria-checked', 'false');
|
|
12
|
+
});
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
it('handles defaultChecked (uncontrolled)', () => {
|
|
15
|
+
render(<Toggle defaultChecked={true} />);
|
|
16
|
+
const toggle = screen.getByRole('switch');
|
|
17
|
+
expect(toggle).toHaveAttribute('aria-checked', 'true');
|
|
18
|
+
});
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
it('toggles state when clicked (uncontrolled)', () => {
|
|
21
|
+
const handleChange = vi.fn();
|
|
22
|
+
render(<Toggle onChange={handleChange} />);
|
|
23
|
+
const toggle = screen.getByRole('switch');
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
fireEvent.click(toggle);
|
|
26
|
+
expect(toggle).toHaveAttribute('aria-checked', 'true');
|
|
27
|
+
expect(handleChange).toHaveBeenCalledWith(true);
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
fireEvent.click(toggle);
|
|
30
|
+
expect(toggle).toHaveAttribute('aria-checked', 'false');
|
|
31
|
+
expect(handleChange).toHaveBeenCalledWith(false);
|
|
32
|
+
});
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
it('handles checked (controlled)', () => {
|
|
35
|
+
const { rerender } = render(<Toggle checked={true} />);
|
|
36
|
+
const toggle = screen.getByRole('switch');
|
|
37
|
+
expect(toggle).toHaveAttribute('aria-checked', 'true');
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
rerender(<Toggle checked={false} />);
|
|
40
|
+
expect(toggle).toHaveAttribute('aria-checked', 'false');
|
|
41
|
+
});
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
it('calls onChange but does not toggle internally when controlled', () => {
|
|
44
|
+
const handleChange = vi.fn();
|
|
45
|
+
render(<Toggle checked={false} onChange={handleChange} />);
|
|
46
|
+
const toggle = screen.getByRole('switch');
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
48
|
+
fireEvent.click(toggle);
|
|
49
|
+
expect(handleChange).toHaveBeenCalledWith(true);
|
|
50
|
+
// Should still be false because it's controlled and we haven't rerendered with checked={true}
|
|
51
|
+
expect(toggle).toHaveAttribute('aria-checked', 'false');
|
|
52
|
+
});
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
54
|
+
it('does not toggle when disabled', () => {
|
|
55
|
+
const handleChange = vi.fn();
|
|
56
|
+
render(<Toggle disabled onChange={handleChange} />);
|
|
57
|
+
const toggle = screen.getByRole('switch');
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
59
|
+
fireEvent.click(toggle);
|
|
60
|
+
expect(handleChange).not.toHaveBeenCalled();
|
|
61
|
+
expect(toggle).toHaveAttribute('aria-checked', 'false');
|
|
62
|
+
expect(toggle).toHaveAttribute('aria-disabled', 'true');
|
|
63
|
+
expect(toggle).toHaveAttribute('tabindex', '-1');
|
|
64
|
+
});
|
|
65
65
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
it('handles keyboard interaction', () => {
|
|
67
|
+
const handleChange = vi.fn();
|
|
68
|
+
render(<Toggle onChange={handleChange} />);
|
|
69
|
+
const toggle = screen.getByRole('switch');
|
|
70
70
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
fireEvent.keyDown(toggle, { key: 'Enter' });
|
|
72
|
+
expect(toggle).toHaveAttribute('aria-checked', 'true');
|
|
73
|
+
expect(handleChange).toHaveBeenCalledWith(true);
|
|
74
74
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
75
|
+
fireEvent.keyDown(toggle, { key: ' ' });
|
|
76
|
+
expect(toggle).toHaveAttribute('aria-checked', 'false');
|
|
77
|
+
expect(handleChange).toHaveBeenCalledWith(false);
|
|
78
|
+
});
|
|
79
79
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
);
|
|
87
|
-
const toggle = screen.getByRole('switch');
|
|
88
|
-
expect(toggle).toHaveAttribute('aria-label', 'Accessible Toggle');
|
|
89
|
-
expect(toggle).toHaveAttribute('aria-describedby', 'description-id');
|
|
90
|
-
});
|
|
80
|
+
it('applies accessibility attributes', () => {
|
|
81
|
+
render(<Toggle aria-label="Accessible Toggle" aria-describedby="description-id" />);
|
|
82
|
+
const toggle = screen.getByRole('switch');
|
|
83
|
+
expect(toggle).toHaveAttribute('aria-label', 'Accessible Toggle');
|
|
84
|
+
expect(toggle).toHaveAttribute('aria-describedby', 'description-id');
|
|
85
|
+
});
|
|
91
86
|
});
|
|
@@ -91,8 +91,11 @@ export const Toggle: React.FC<ToggleProps> = ({
|
|
|
91
91
|
'c-toggle',
|
|
92
92
|
isChecked && TOGGLE.CLASSES.IS_ON,
|
|
93
93
|
disabled && 'is-disabled',
|
|
94
|
+
glass && 'c-toggle--glass',
|
|
94
95
|
className,
|
|
95
|
-
]
|
|
96
|
+
]
|
|
97
|
+
.filter(Boolean)
|
|
98
|
+
.join(' ');
|
|
96
99
|
|
|
97
100
|
const toggleContent = (
|
|
98
101
|
<div
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import { fn } from '@storybook/test';
|
|
3
4
|
import type { AtomixGlassProps } from '../../lib/types/components';
|
|
4
5
|
import { Tooltip } from './Tooltip';
|
|
5
6
|
|
|
@@ -13,8 +14,69 @@ const meta = {
|
|
|
13
14
|
layout: 'fullscreen',
|
|
14
15
|
docs: {
|
|
15
16
|
description: {
|
|
16
|
-
component:
|
|
17
|
-
|
|
17
|
+
component: `
|
|
18
|
+
# Tooltip
|
|
19
|
+
|
|
20
|
+
## Overview
|
|
21
|
+
|
|
22
|
+
Tooltip displays contextual information when users hover over or click on an element. It supports multiple positions, triggers, and can include rich content. Tooltips are useful for providing additional context without cluttering the interface.
|
|
23
|
+
|
|
24
|
+
## Features
|
|
25
|
+
|
|
26
|
+
- Multiple position options (top, bottom, left, right with corners)
|
|
27
|
+
- Hover and click triggers
|
|
28
|
+
- Configurable delays and offsets
|
|
29
|
+
- Glass morphism effect
|
|
30
|
+
- Rich content support
|
|
31
|
+
- Accessible design
|
|
32
|
+
- Responsive behavior
|
|
33
|
+
|
|
34
|
+
## Accessibility
|
|
35
|
+
|
|
36
|
+
- Screen reader: Tooltip content announced appropriately
|
|
37
|
+
- ARIA support: Proper roles and properties for tooltip components
|
|
38
|
+
- Keyboard support: Accessible via keyboard navigation
|
|
39
|
+
- Focus management: Maintains focus on trigger element
|
|
40
|
+
|
|
41
|
+
## Usage Examples
|
|
42
|
+
|
|
43
|
+
### Basic Usage
|
|
44
|
+
|
|
45
|
+
\`\`\`tsx
|
|
46
|
+
<Tooltip
|
|
47
|
+
content="Tooltip text"
|
|
48
|
+
position="top"
|
|
49
|
+
>
|
|
50
|
+
<button>Hover me</button>
|
|
51
|
+
</Tooltip>
|
|
52
|
+
\`\`\`
|
|
53
|
+
|
|
54
|
+
### With Glass Effect
|
|
55
|
+
|
|
56
|
+
\`\`\`tsx
|
|
57
|
+
<Tooltip
|
|
58
|
+
content="Tooltip text"
|
|
59
|
+
position="top"
|
|
60
|
+
glass={true}
|
|
61
|
+
>
|
|
62
|
+
<button>Hover me</button>
|
|
63
|
+
</Tooltip>
|
|
64
|
+
\`\`\`
|
|
65
|
+
|
|
66
|
+
## API Reference
|
|
67
|
+
|
|
68
|
+
### Props
|
|
69
|
+
|
|
70
|
+
| Prop | Type | Default | Description |
|
|
71
|
+
| ---- | ---- | ------- | ----------- |
|
|
72
|
+
| position | Position | 'top' | Position of the tooltip relative to the trigger |
|
|
73
|
+
| trigger | 'hover' \\| 'click' | 'hover' | How the tooltip is triggered |
|
|
74
|
+
| delay | number | 200 | Delay in milliseconds before showing tooltip |
|
|
75
|
+
| offset | number | 10 | Offset distance from the trigger element |
|
|
76
|
+
| glass | boolean \\| GlassProps | false | Enable glass morphism effect |
|
|
77
|
+
| content | ReactNode | - | Content to display in the tooltip |
|
|
78
|
+
| children | ReactNode | - | Trigger element for the tooltip |
|
|
79
|
+
`,
|
|
18
80
|
},
|
|
19
81
|
},
|
|
20
82
|
},
|
|
@@ -32,24 +94,52 @@ const meta = {
|
|
|
32
94
|
'bottom-left',
|
|
33
95
|
'bottom-right',
|
|
34
96
|
],
|
|
35
|
-
|
|
97
|
+
description: 'Position of the tooltip relative to the trigger',
|
|
98
|
+
table: {
|
|
99
|
+
type: { summary: 'Position' },
|
|
100
|
+
defaultValue: { summary: 'top' },
|
|
101
|
+
},
|
|
36
102
|
},
|
|
37
103
|
trigger: {
|
|
38
104
|
control: { type: 'select' },
|
|
39
105
|
options: ['hover', 'click'],
|
|
40
|
-
|
|
106
|
+
description: 'How the tooltip is triggered',
|
|
107
|
+
table: {
|
|
108
|
+
type: { summary: '"hover" | "click"' },
|
|
109
|
+
defaultValue: { summary: 'hover' },
|
|
110
|
+
},
|
|
41
111
|
},
|
|
42
112
|
delay: {
|
|
43
113
|
control: { type: 'number' },
|
|
44
|
-
|
|
114
|
+
description: 'Delay in milliseconds before showing tooltip',
|
|
115
|
+
table: {
|
|
116
|
+
type: { summary: 'number' },
|
|
117
|
+
defaultValue: { summary: 200 },
|
|
118
|
+
},
|
|
45
119
|
},
|
|
46
120
|
offset: {
|
|
47
121
|
control: { type: 'number' },
|
|
48
|
-
|
|
122
|
+
description: 'Offset distance from the trigger element',
|
|
123
|
+
table: {
|
|
124
|
+
type: { summary: 'number' },
|
|
125
|
+
defaultValue: { summary: 10 },
|
|
126
|
+
},
|
|
49
127
|
},
|
|
50
128
|
glass: {
|
|
51
129
|
control: { type: 'boolean' },
|
|
52
130
|
description: 'Enable glass morphism effect',
|
|
131
|
+
table: {
|
|
132
|
+
type: { summary: 'boolean | GlassProps' },
|
|
133
|
+
defaultValue: { summary: false },
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
content: {
|
|
137
|
+
control: 'object',
|
|
138
|
+
description: 'Content to display in the tooltip',
|
|
139
|
+
table: {
|
|
140
|
+
type: { summary: 'ReactNode' },
|
|
141
|
+
defaultValue: { summary: '-' },
|
|
142
|
+
},
|
|
53
143
|
},
|
|
54
144
|
},
|
|
55
145
|
} satisfies Meta<typeof Tooltip>;
|
|
@@ -57,8 +147,7 @@ const meta = {
|
|
|
57
147
|
export default meta;
|
|
58
148
|
type Story = StoryObj<typeof meta>;
|
|
59
149
|
|
|
60
|
-
|
|
61
|
-
export const Default: Story = {
|
|
150
|
+
export const BasicUsage: Story = {
|
|
62
151
|
render: args => (
|
|
63
152
|
<div style={{ display: 'flex', justifyContent: 'center', padding: '100px' }}>
|
|
64
153
|
<Tooltip {...args}>
|
|
@@ -71,6 +160,13 @@ export const Default: Story = {
|
|
|
71
160
|
position: 'top',
|
|
72
161
|
trigger: 'hover',
|
|
73
162
|
} as any,
|
|
163
|
+
parameters: {
|
|
164
|
+
docs: {
|
|
165
|
+
description: {
|
|
166
|
+
story: 'Default tooltip with top position and hover trigger.',
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
},
|
|
74
170
|
};
|
|
75
171
|
|
|
76
172
|
export const ClickTrigger: Story = {
|
|
@@ -86,117 +182,115 @@ export const ClickTrigger: Story = {
|
|
|
86
182
|
position: 'top',
|
|
87
183
|
trigger: 'click',
|
|
88
184
|
} as any,
|
|
185
|
+
parameters: {
|
|
186
|
+
docs: {
|
|
187
|
+
description: {
|
|
188
|
+
story: 'Tooltip with click trigger instead of hover.',
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
},
|
|
89
192
|
};
|
|
90
193
|
|
|
91
|
-
export const
|
|
92
|
-
render:
|
|
93
|
-
<div
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
194
|
+
export const AllPositions: Story = {
|
|
195
|
+
render: () => (
|
|
196
|
+
<div
|
|
197
|
+
style={{
|
|
198
|
+
display: 'grid',
|
|
199
|
+
gridTemplateColumns: 'repeat(3, 1fr)',
|
|
200
|
+
gap: '20px',
|
|
201
|
+
padding: '50px',
|
|
202
|
+
alignItems: 'center',
|
|
203
|
+
justifyItems: 'center',
|
|
204
|
+
height: '500px',
|
|
205
|
+
}}
|
|
206
|
+
>
|
|
207
|
+
<div>
|
|
208
|
+
<Tooltip content="Top Left Tooltip">
|
|
209
|
+
<button className="c-btn c-btn--primary">Top Left</button>
|
|
210
|
+
</Tooltip>
|
|
211
|
+
</div>
|
|
212
|
+
<div>
|
|
213
|
+
<Tooltip content="Top Tooltip" position="top">
|
|
214
|
+
<button className="c-btn c-btn--primary">Top</button>
|
|
215
|
+
</Tooltip>
|
|
216
|
+
</div>
|
|
217
|
+
<div>
|
|
218
|
+
<Tooltip content="Top Right Tooltip" position="top-right">
|
|
219
|
+
<button className="c-btn c-btn--primary">Top Right</button>
|
|
220
|
+
</Tooltip>
|
|
221
|
+
</div>
|
|
104
222
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
</Tooltip>
|
|
111
|
-
</div>
|
|
112
|
-
),
|
|
113
|
-
args: {
|
|
114
|
-
content: <p className="u-mb-0">This tooltip appears to the left</p>,
|
|
115
|
-
position: 'left',
|
|
116
|
-
} as any,
|
|
117
|
-
};
|
|
223
|
+
<div>
|
|
224
|
+
<Tooltip content="Left Tooltip" position="left">
|
|
225
|
+
<button className="c-btn c-btn--primary">Left</button>
|
|
226
|
+
</Tooltip>
|
|
227
|
+
</div>
|
|
118
228
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
<Tooltip {...args}>
|
|
123
|
-
<button className="c-btn c-btn--primary">Hover me</button>
|
|
124
|
-
</Tooltip>
|
|
125
|
-
</div>
|
|
126
|
-
),
|
|
127
|
-
args: {
|
|
128
|
-
content: <p className="u-mb-0">This tooltip appears to the right</p>,
|
|
129
|
-
position: 'right',
|
|
130
|
-
} as any,
|
|
131
|
-
};
|
|
229
|
+
<div style={{ textAlign: 'center' }}>
|
|
230
|
+
<p>All tooltip positions</p>
|
|
231
|
+
</div>
|
|
132
232
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
</Tooltip>
|
|
139
|
-
</div>
|
|
140
|
-
),
|
|
141
|
-
args: {
|
|
142
|
-
content: <p className="u-mb-0">Tooltips work great with icons</p>,
|
|
143
|
-
position: 'top',
|
|
144
|
-
} as any,
|
|
145
|
-
};
|
|
233
|
+
<div>
|
|
234
|
+
<Tooltip content="Right Tooltip" position="right">
|
|
235
|
+
<button className="c-btn c-btn--primary">Right</button>
|
|
236
|
+
</Tooltip>
|
|
237
|
+
</div>
|
|
146
238
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
239
|
+
<div>
|
|
240
|
+
<Tooltip content="Bottom Left Tooltip" position="bottom-left">
|
|
241
|
+
<button className="c-btn c-btn--primary">Bottom Left</button>
|
|
242
|
+
</Tooltip>
|
|
243
|
+
</div>
|
|
244
|
+
<div>
|
|
245
|
+
<Tooltip content="Bottom Tooltip" position="bottom">
|
|
246
|
+
<button className="c-btn c-btn--primary">Bottom</button>
|
|
247
|
+
</Tooltip>
|
|
248
|
+
</div>
|
|
249
|
+
<div>
|
|
250
|
+
<Tooltip content="Bottom Right Tooltip" position="bottom-right">
|
|
251
|
+
<button className="c-btn c-btn--primary">Bottom Right</button>
|
|
252
|
+
</Tooltip>
|
|
253
|
+
</div>
|
|
153
254
|
</div>
|
|
154
255
|
),
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
256
|
+
parameters: {
|
|
257
|
+
docs: {
|
|
258
|
+
description: {
|
|
259
|
+
story: 'All available tooltip positions demonstrated.',
|
|
260
|
+
},
|
|
261
|
+
},
|
|
262
|
+
},
|
|
160
263
|
};
|
|
161
264
|
|
|
162
|
-
export const
|
|
265
|
+
export const WithGlassEffect: Story = {
|
|
163
266
|
render: args => (
|
|
164
|
-
<div
|
|
267
|
+
<div
|
|
268
|
+
style={{
|
|
269
|
+
display: 'flex',
|
|
270
|
+
justifyContent: 'center',
|
|
271
|
+
padding: '100px',
|
|
272
|
+
background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
|
|
273
|
+
minHeight: '300px',
|
|
274
|
+
}}
|
|
275
|
+
>
|
|
165
276
|
<Tooltip {...args}>
|
|
166
277
|
<button className="c-btn c-btn--primary">Hover me</button>
|
|
167
278
|
</Tooltip>
|
|
168
279
|
</div>
|
|
169
280
|
),
|
|
170
281
|
args: {
|
|
171
|
-
content: <p className="u-mb-0">
|
|
282
|
+
content: <p className="u-mb-0">Tooltip with glass effect applied</p>,
|
|
172
283
|
position: 'top',
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
export const RichContent: Story = {
|
|
178
|
-
render: args => (
|
|
179
|
-
<div style={{ display: 'flex', justifyContent: 'center', padding: '100px' }}>
|
|
180
|
-
<Tooltip {...args}>
|
|
181
|
-
<button className="c-btn c-btn--primary">Click for rich content</button>
|
|
182
|
-
</Tooltip>
|
|
183
|
-
</div>
|
|
184
|
-
),
|
|
185
|
-
args: {
|
|
186
|
-
content: (
|
|
187
|
-
<div>
|
|
188
|
-
<h4 style={{ marginTop: 0, marginBottom: '8px' }}>Rich Tooltip Content</h4>
|
|
189
|
-
<ul style={{ margin: 0, paddingLeft: '16px' }}>
|
|
190
|
-
<li>Supports HTML content</li>
|
|
191
|
-
<li>Can include multiple elements</li>
|
|
192
|
-
<li>Helpful for complex information</li>
|
|
193
|
-
</ul>
|
|
194
|
-
</div>
|
|
195
|
-
),
|
|
196
|
-
position: 'bottom',
|
|
197
|
-
trigger: 'click',
|
|
198
|
-
offset: 15,
|
|
284
|
+
trigger: 'hover',
|
|
285
|
+
glass: true,
|
|
199
286
|
} as any,
|
|
287
|
+
parameters: {
|
|
288
|
+
docs: {
|
|
289
|
+
description: {
|
|
290
|
+
story: 'Tooltip with glass morphism effect applied.',
|
|
291
|
+
},
|
|
292
|
+
},
|
|
293
|
+
},
|
|
200
294
|
};
|
|
201
295
|
|
|
202
296
|
/**
|