@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,48 +4,48 @@ import { Badge } from './Badge';
|
|
|
4
4
|
|
|
5
5
|
// Mock AtomixGlass component
|
|
6
6
|
vi.mock('../AtomixGlass/AtomixGlass', () => ({
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
AtomixGlass: ({ children, ...props }: any) => (
|
|
8
|
+
<div data-testid="atomix-glass" data-glass-props={JSON.stringify(props)}>
|
|
9
|
+
{children}
|
|
10
|
+
</div>
|
|
11
|
+
),
|
|
12
12
|
}));
|
|
13
13
|
|
|
14
14
|
describe('Badge Component', () => {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
15
|
+
it('renders correctly', () => {
|
|
16
|
+
render(<Badge label="Test Badge" />);
|
|
17
|
+
expect(screen.getByText('Test Badge')).toBeInTheDocument();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('renders with aria-label', () => {
|
|
21
|
+
render(<Badge label="Badge" aria-label="Accessible Badge" />);
|
|
22
|
+
expect(screen.getByLabelText('Accessible Badge')).toBeInTheDocument();
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('renders close button when onRemove is provided', () => {
|
|
26
|
+
const handleRemove = vi.fn();
|
|
27
|
+
render(<Badge label="Removable" onRemove={handleRemove} />);
|
|
28
|
+
|
|
29
|
+
const closeButton = screen.getByRole('button', { name: 'Remove badge' });
|
|
30
|
+
expect(closeButton).toBeInTheDocument();
|
|
31
|
+
|
|
32
|
+
fireEvent.click(closeButton);
|
|
33
|
+
expect(handleRemove).toHaveBeenCalledTimes(1);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('does not render close button when onRemove is not provided', () => {
|
|
37
|
+
render(<Badge label="Static" />);
|
|
38
|
+
expect(screen.queryByRole('button')).not.toBeInTheDocument();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('disables close button when badge is disabled', () => {
|
|
42
|
+
const handleRemove = vi.fn();
|
|
43
|
+
render(<Badge label="Disabled" onRemove={handleRemove} disabled />);
|
|
44
|
+
|
|
45
|
+
const closeButton = screen.getByRole('button', { name: 'Remove badge' });
|
|
46
|
+
expect(closeButton).toBeDisabled();
|
|
47
|
+
|
|
48
|
+
fireEvent.click(closeButton);
|
|
49
|
+
expect(handleRemove).not.toHaveBeenCalled();
|
|
50
|
+
});
|
|
51
51
|
});
|
|
@@ -4,75 +4,77 @@ import { BADGE } from '../../lib/constants/components';
|
|
|
4
4
|
import { BadgeProps } from '../../lib/types/components';
|
|
5
5
|
import { AtomixGlass } from '../AtomixGlass/AtomixGlass';
|
|
6
6
|
|
|
7
|
-
export const Badge: React.FC<BadgeProps> = memo(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
7
|
+
export const Badge: React.FC<BadgeProps> = memo(
|
|
8
|
+
({
|
|
9
|
+
label,
|
|
10
|
+
variant = 'primary',
|
|
11
|
+
size = 'md',
|
|
12
|
+
disabled = false,
|
|
13
|
+
icon,
|
|
14
|
+
onRemove,
|
|
15
|
+
'aria-label': ariaLabel,
|
|
16
|
+
className = '',
|
|
17
|
+
glass,
|
|
18
|
+
style,
|
|
19
|
+
}) => {
|
|
20
|
+
const { generateBadgeClass } = useBadge({
|
|
21
|
+
variant,
|
|
22
|
+
size,
|
|
23
|
+
disabled,
|
|
24
|
+
});
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
const ref = useRef<HTMLSpanElement>(null);
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
const badgeClass = generateBadgeClass({
|
|
29
|
+
variant,
|
|
30
|
+
size,
|
|
31
|
+
disabled,
|
|
32
|
+
className: `${className} ${glass ? 'c-badge--glass' : ''}`.trim(),
|
|
33
|
+
});
|
|
33
34
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
35
|
+
const badgeElement = (
|
|
36
|
+
<span
|
|
37
|
+
className={badgeClass}
|
|
38
|
+
aria-disabled={disabled}
|
|
39
|
+
aria-label={ariaLabel}
|
|
40
|
+
ref={ref}
|
|
41
|
+
style={style}
|
|
42
|
+
>
|
|
43
|
+
{icon && <span className={BADGE.ICON_CLASS}>{icon}</span>}
|
|
44
|
+
<span>{label}</span>
|
|
45
|
+
{onRemove && (
|
|
46
|
+
<button
|
|
47
|
+
type="button"
|
|
48
|
+
className="c-badge__close"
|
|
49
|
+
onClick={onRemove}
|
|
50
|
+
aria-label="Remove badge"
|
|
51
|
+
disabled={disabled}
|
|
52
|
+
>
|
|
53
|
+
×
|
|
54
|
+
</button>
|
|
55
|
+
)}
|
|
56
|
+
</span>
|
|
57
|
+
);
|
|
57
58
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
59
|
+
if (glass) {
|
|
60
|
+
// Default glass settings for badges
|
|
61
|
+
const defaultGlassProps = {
|
|
62
|
+
displacementScale: 20,
|
|
63
|
+
cornerRadius: ref.current?.getBoundingClientRect().width
|
|
64
|
+
? ref.current?.getBoundingClientRect().width / 2
|
|
65
|
+
: 16,
|
|
66
|
+
className: 'c-badge--glass',
|
|
67
|
+
elasticity: 0,
|
|
68
|
+
};
|
|
68
69
|
|
|
69
|
-
|
|
70
|
+
const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
|
|
70
71
|
|
|
71
|
-
|
|
72
|
-
|
|
72
|
+
return <AtomixGlass {...glassProps}>{badgeElement}</AtomixGlass>;
|
|
73
|
+
}
|
|
73
74
|
|
|
74
|
-
|
|
75
|
-
}
|
|
75
|
+
return badgeElement;
|
|
76
|
+
}
|
|
77
|
+
);
|
|
76
78
|
|
|
77
79
|
Badge.displayName = 'Badge';
|
|
78
80
|
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { fn } from '@storybook/test';
|
|
2
3
|
import { Grid } from '../../layouts/Grid/Grid';
|
|
3
4
|
import GridCol from '../../layouts/Grid/GridCol';
|
|
4
5
|
import { Button } from '../Button/Button';
|
|
5
6
|
import { Card } from '../Card/Card';
|
|
6
7
|
import { Block } from './Block';
|
|
7
8
|
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// META CONFIGURATION
|
|
11
|
+
// ============================================================================
|
|
12
|
+
|
|
8
13
|
const meta = {
|
|
9
14
|
title: 'Components/Block',
|
|
10
15
|
component: Block,
|
|
@@ -43,8 +48,12 @@ const meta = {
|
|
|
43
48
|
export default meta;
|
|
44
49
|
type Story = StoryObj<typeof meta>;
|
|
45
50
|
|
|
51
|
+
// ============================================================================
|
|
52
|
+
// STORY IMPLEMENTATIONS
|
|
53
|
+
// ============================================================================
|
|
54
|
+
|
|
46
55
|
// Basic usage
|
|
47
|
-
export const
|
|
56
|
+
export const BasicUsage: Story = {
|
|
48
57
|
args: {
|
|
49
58
|
children: (
|
|
50
59
|
<div>
|
|
@@ -100,7 +109,7 @@ export const HeroSection: Story = {
|
|
|
100
109
|
<div className="u-text-center">
|
|
101
110
|
<h1>Welcome to Our Platform</h1>
|
|
102
111
|
<p>Experience the power of modern web development with our comprehensive design system.</p>
|
|
103
|
-
<Button size="lg" variant="secondary">
|
|
112
|
+
<Button size="lg" variant="secondary" onClick={fn()}>
|
|
104
113
|
Get Started
|
|
105
114
|
</Button>
|
|
106
115
|
</div>
|
|
@@ -169,7 +178,9 @@ export const ArticleLayout: Story = {
|
|
|
169
178
|
<Block spacing="md" container={{ type: 'sm' }} background="secondary">
|
|
170
179
|
<h3>Ready to get started?</h3>
|
|
171
180
|
<p>Join thousands of developers building with our design system.</p>
|
|
172
|
-
<Button variant="primary"
|
|
181
|
+
<Button variant="primary" onClick={fn()}>
|
|
182
|
+
Start Building
|
|
183
|
+
</Button>
|
|
173
184
|
</Block>
|
|
174
185
|
</div>
|
|
175
186
|
),
|
|
@@ -292,10 +303,10 @@ export const ContentPreview: Story = {
|
|
|
292
303
|
A comprehensive design system with reusable components and consistent design patterns
|
|
293
304
|
</p>
|
|
294
305
|
<div className="u-mb-4">
|
|
295
|
-
<Button size="lg" variant="secondary" className="u-me-2">
|
|
306
|
+
<Button size="lg" variant="secondary" className="u-me-2" onClick={fn()}>
|
|
296
307
|
Get Started
|
|
297
308
|
</Button>
|
|
298
|
-
<Button size="lg" variant="invert" className="u-ms-2">
|
|
309
|
+
<Button size="lg" variant="invert" className="u-ms-2" onClick={fn()}>
|
|
299
310
|
Learn More
|
|
300
311
|
</Button>
|
|
301
312
|
</div>
|
|
@@ -311,10 +322,10 @@ export const ContentPreview: Story = {
|
|
|
311
322
|
text="Multiple variants and sizes for all use cases"
|
|
312
323
|
actions={
|
|
313
324
|
<div>
|
|
314
|
-
<Button variant="primary" size="sm" className="u-me-1">
|
|
325
|
+
<Button variant="primary" size="sm" className="u-me-1" onClick={fn()}>
|
|
315
326
|
Primary
|
|
316
327
|
</Button>
|
|
317
|
-
<Button variant="secondary" size="sm">
|
|
328
|
+
<Button variant="secondary" size="sm" onClick={fn()}>
|
|
318
329
|
Secondary
|
|
319
330
|
</Button>
|
|
320
331
|
</div>
|
|
@@ -325,14 +336,22 @@ export const ContentPreview: Story = {
|
|
|
325
336
|
<Card
|
|
326
337
|
title="Cards"
|
|
327
338
|
text="Flexible content containers with multiple options"
|
|
328
|
-
actions={
|
|
339
|
+
actions={
|
|
340
|
+
<Button variant="primary" onClick={fn()}>
|
|
341
|
+
View Details
|
|
342
|
+
</Button>
|
|
343
|
+
}
|
|
329
344
|
/>
|
|
330
345
|
</GridCol>
|
|
331
346
|
<GridCol xs={12} md={6} lg={4}>
|
|
332
347
|
<Card
|
|
333
348
|
title="Blocks"
|
|
334
349
|
text="Layout containers with consistent spacing and backgrounds"
|
|
335
|
-
actions={
|
|
350
|
+
actions={
|
|
351
|
+
<Button variant="primary" onClick={fn()}>
|
|
352
|
+
Learn More
|
|
353
|
+
</Button>
|
|
354
|
+
}
|
|
336
355
|
/>
|
|
337
356
|
</GridCol>
|
|
338
357
|
</Grid>
|
|
@@ -378,10 +397,10 @@ export const ContentPreview: Story = {
|
|
|
378
397
|
Join thousands of developers and designers building with Atomix Design System
|
|
379
398
|
</p>
|
|
380
399
|
<div>
|
|
381
|
-
<Button size="lg" variant="primary" className="u-me-2">
|
|
400
|
+
<Button size="lg" variant="primary" className="u-me-2" onClick={fn()}>
|
|
382
401
|
Documentation
|
|
383
402
|
</Button>
|
|
384
|
-
<Button size="lg" variant="secondary" className="u-ms-2">
|
|
403
|
+
<Button size="lg" variant="secondary" className="u-ms-2" onClick={fn()}>
|
|
385
404
|
Examples
|
|
386
405
|
</Button>
|
|
387
406
|
</div>
|
|
@@ -1,33 +1,78 @@
|
|
|
1
1
|
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { fn } from '@storybook/test';
|
|
2
3
|
import { Icon } from '../Icon';
|
|
3
4
|
import { Breadcrumb } from './Breadcrumb';
|
|
4
5
|
|
|
5
|
-
const meta = {
|
|
6
|
+
const meta: Meta<typeof Breadcrumb> = {
|
|
6
7
|
title: 'Components/Breadcrumb',
|
|
7
8
|
component: Breadcrumb,
|
|
8
9
|
parameters: {
|
|
9
|
-
layout: '
|
|
10
|
+
layout: 'padded',
|
|
10
11
|
docs: {
|
|
11
12
|
description: {
|
|
12
|
-
component:
|
|
13
|
-
|
|
13
|
+
component: `
|
|
14
|
+
# Breadcrumb Component
|
|
15
|
+
|
|
16
|
+
The Breadcrumb component provides navigation context by showing the current page location within a site hierarchy. It helps users understand where they are and provides quick navigation to parent pages. Breadcrumbs support custom dividers, icons, and are fully accessible.
|
|
17
|
+
|
|
18
|
+
## Features
|
|
19
|
+
- Clear hierarchical navigation
|
|
20
|
+
- Support for custom dividers
|
|
21
|
+
- Icon integration
|
|
22
|
+
- Keyboard navigation support
|
|
23
|
+
- Full accessibility compliance
|
|
24
|
+
- Responsive design
|
|
25
|
+
|
|
26
|
+
## Accessibility
|
|
27
|
+
- Semantic navigation landmark with aria-label
|
|
28
|
+
- Proper heading order
|
|
29
|
+
- Keyboard navigation support (Tab, Enter, Space)
|
|
30
|
+
- Screen reader friendly markup
|
|
31
|
+
`,
|
|
14
32
|
},
|
|
15
33
|
},
|
|
16
34
|
},
|
|
17
35
|
tags: ['autodocs'],
|
|
18
36
|
argTypes: {
|
|
19
|
-
items: {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
37
|
+
items: {
|
|
38
|
+
control: 'object',
|
|
39
|
+
description: 'Array of breadcrumb items with label, href, and optional properties',
|
|
40
|
+
table: {
|
|
41
|
+
type: { summary: 'BreadcrumbItem[]' },
|
|
42
|
+
defaultValue: { summary: '[]' },
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
divider: {
|
|
46
|
+
control: 'text',
|
|
47
|
+
description: 'Custom divider character or component between breadcrumb items',
|
|
48
|
+
table: {
|
|
49
|
+
type: { summary: 'string | ReactNode' },
|
|
50
|
+
defaultValue: { summary: '>' },
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
className: {
|
|
54
|
+
control: 'text',
|
|
55
|
+
description: 'Additional CSS classes',
|
|
56
|
+
table: {
|
|
57
|
+
type: { summary: 'string' },
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
'aria-label': {
|
|
61
|
+
control: 'text',
|
|
62
|
+
description: 'Label for the navigation landmark',
|
|
63
|
+
table: {
|
|
64
|
+
type: { summary: 'string' },
|
|
65
|
+
defaultValue: { summary: 'Breadcrumb' },
|
|
66
|
+
},
|
|
67
|
+
},
|
|
23
68
|
},
|
|
24
69
|
} satisfies Meta<typeof Breadcrumb>;
|
|
25
70
|
|
|
26
71
|
export default meta;
|
|
27
72
|
type Story = StoryObj<typeof meta>;
|
|
28
73
|
|
|
29
|
-
//
|
|
30
|
-
export const
|
|
74
|
+
// Basic Breadcrumb
|
|
75
|
+
export const BasicUsage: Story = {
|
|
31
76
|
args: {
|
|
32
77
|
items: [
|
|
33
78
|
{ label: 'Home', href: '/' },
|
|
@@ -36,6 +81,13 @@ export const Default: Story = {
|
|
|
36
81
|
{ label: 'Product Name', active: true },
|
|
37
82
|
],
|
|
38
83
|
},
|
|
84
|
+
parameters: {
|
|
85
|
+
docs: {
|
|
86
|
+
description: {
|
|
87
|
+
story: 'Simple breadcrumb with basic text links showing site hierarchy.',
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
},
|
|
39
91
|
};
|
|
40
92
|
|
|
41
93
|
// Breadcrumb with Icons
|
|
@@ -64,10 +116,17 @@ export const WithIcons: Story = {
|
|
|
64
116
|
},
|
|
65
117
|
],
|
|
66
118
|
},
|
|
119
|
+
parameters: {
|
|
120
|
+
docs: {
|
|
121
|
+
description: {
|
|
122
|
+
story: 'Breadcrumb with icons for each item to enhance visual recognition.',
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
},
|
|
67
126
|
};
|
|
68
127
|
|
|
69
128
|
// Breadcrumb with Custom Divider
|
|
70
|
-
export const
|
|
129
|
+
export const WithCustomDivider: Story = {
|
|
71
130
|
args: {
|
|
72
131
|
items: [
|
|
73
132
|
{ label: 'Home', href: '/' },
|
|
@@ -77,6 +136,13 @@ export const CustomDivider: Story = {
|
|
|
77
136
|
],
|
|
78
137
|
divider: '/',
|
|
79
138
|
},
|
|
139
|
+
parameters: {
|
|
140
|
+
docs: {
|
|
141
|
+
description: {
|
|
142
|
+
story: 'Breadcrumb with custom divider character instead of the default arrow.',
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
},
|
|
80
146
|
};
|
|
81
147
|
|
|
82
148
|
// Breadcrumb with Click Handlers
|
|
@@ -86,28 +152,81 @@ export const WithClickHandlers: Story = {
|
|
|
86
152
|
{
|
|
87
153
|
label: 'Home',
|
|
88
154
|
href: '/',
|
|
89
|
-
onClick:
|
|
90
|
-
e.preventDefault();
|
|
91
|
-
alert('Home clicked');
|
|
92
|
-
},
|
|
155
|
+
onClick: fn(),
|
|
93
156
|
},
|
|
94
157
|
{
|
|
95
158
|
label: 'Products',
|
|
96
159
|
href: '/products',
|
|
97
|
-
onClick:
|
|
98
|
-
e.preventDefault();
|
|
99
|
-
alert('Products clicked');
|
|
100
|
-
},
|
|
160
|
+
onClick: fn(),
|
|
101
161
|
},
|
|
102
162
|
{
|
|
103
163
|
label: 'Category',
|
|
104
164
|
href: '/products/category',
|
|
105
|
-
onClick:
|
|
106
|
-
e.preventDefault();
|
|
107
|
-
alert('Category clicked');
|
|
108
|
-
},
|
|
165
|
+
onClick: fn(),
|
|
109
166
|
},
|
|
110
167
|
{ label: 'Product Name', active: true },
|
|
111
168
|
],
|
|
112
169
|
},
|
|
170
|
+
parameters: {
|
|
171
|
+
docs: {
|
|
172
|
+
description: {
|
|
173
|
+
story: 'Breadcrumb with click handlers to demonstrate client-side navigation.',
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
// Breadcrumb with Mixed Interactions
|
|
180
|
+
export const WithMixedInteractions: Story = {
|
|
181
|
+
args: {
|
|
182
|
+
items: [
|
|
183
|
+
{ label: 'Home', href: '/' },
|
|
184
|
+
{
|
|
185
|
+
label: 'Products',
|
|
186
|
+
onClick: fn(),
|
|
187
|
+
// Simulating client-side navigation
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
label: 'Category',
|
|
191
|
+
href: '/products/category',
|
|
192
|
+
icon: <Icon name="Folder" size="sm" />,
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
label: 'Product Name',
|
|
196
|
+
active: true,
|
|
197
|
+
icon: <Icon name="Tag" size="sm" />,
|
|
198
|
+
},
|
|
199
|
+
],
|
|
200
|
+
divider: '|',
|
|
201
|
+
},
|
|
202
|
+
parameters: {
|
|
203
|
+
docs: {
|
|
204
|
+
description: {
|
|
205
|
+
story:
|
|
206
|
+
'Breadcrumb combining both traditional link navigation and client-side interactions.',
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
// Long Breadcrumb Path
|
|
213
|
+
export const LongBreadcrumbPath: Story = {
|
|
214
|
+
args: {
|
|
215
|
+
items: [
|
|
216
|
+
{ label: 'Home', href: '/' },
|
|
217
|
+
{ label: 'Products', href: '/products' },
|
|
218
|
+
{ label: 'Electronics', href: '/products/electronics' },
|
|
219
|
+
{ label: 'Computers', href: '/products/electronics/computers' },
|
|
220
|
+
{ label: 'Laptops', href: '/products/electronics/computers/laptops' },
|
|
221
|
+
{ label: 'Gaming Laptops', href: '/products/electronics/computers/laptops/gaming' },
|
|
222
|
+
{ label: 'Current Product', active: true },
|
|
223
|
+
],
|
|
224
|
+
},
|
|
225
|
+
parameters: {
|
|
226
|
+
docs: {
|
|
227
|
+
description: {
|
|
228
|
+
story: 'Long breadcrumb path demonstrating responsive behavior with many levels.',
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
},
|
|
113
232
|
};
|