@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
|
@@ -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 { Tabs } from './Tabs';
|
|
5
6
|
|
|
@@ -13,8 +14,67 @@ const meta = {
|
|
|
13
14
|
layout: 'padded',
|
|
14
15
|
docs: {
|
|
15
16
|
description: {
|
|
16
|
-
component:
|
|
17
|
-
|
|
17
|
+
component: `
|
|
18
|
+
# Tabs
|
|
19
|
+
|
|
20
|
+
## Overview
|
|
21
|
+
|
|
22
|
+
Tabs organize content into multiple panels accessible via tab navigation. It provides a clean interface for switching between different views or sections of content. Tabs support keyboard navigation and can include rich content in each panel.
|
|
23
|
+
|
|
24
|
+
## Features
|
|
25
|
+
|
|
26
|
+
- Multiple tab panels with distinct content
|
|
27
|
+
- Keyboard navigation support
|
|
28
|
+
- Active tab indication
|
|
29
|
+
- Glass morphism effect option
|
|
30
|
+
- Rich content support
|
|
31
|
+
- Accessible design
|
|
32
|
+
- Responsive behavior
|
|
33
|
+
|
|
34
|
+
## Accessibility
|
|
35
|
+
|
|
36
|
+
- Keyboard support: Navigate tabs with arrow keys, activate with Enter/Space
|
|
37
|
+
- Screen reader: Tab labels and content announced properly
|
|
38
|
+
- ARIA support: Proper roles and properties for tab components
|
|
39
|
+
- Focus management: Maintains focus on active tab element
|
|
40
|
+
|
|
41
|
+
## Usage Examples
|
|
42
|
+
|
|
43
|
+
### Basic Usage
|
|
44
|
+
|
|
45
|
+
\`\`\`tsx
|
|
46
|
+
<Tabs
|
|
47
|
+
items={[
|
|
48
|
+
{ label: 'Tab 1', content: <div>Content 1</div> },
|
|
49
|
+
{ label: 'Tab 2', content: <div>Content 2</div> },
|
|
50
|
+
]}
|
|
51
|
+
/>
|
|
52
|
+
\`\`\`
|
|
53
|
+
|
|
54
|
+
### With Glass Effect
|
|
55
|
+
|
|
56
|
+
\`\`\`tsx
|
|
57
|
+
<Tabs
|
|
58
|
+
glass={true}
|
|
59
|
+
items={[
|
|
60
|
+
{ label: 'Tab 1', content: <div>Content 1</div> },
|
|
61
|
+
{ label: 'Tab 2', content: <div>Content 2</div> },
|
|
62
|
+
]}
|
|
63
|
+
/>
|
|
64
|
+
\`\`\`
|
|
65
|
+
|
|
66
|
+
## API Reference
|
|
67
|
+
|
|
68
|
+
### Props
|
|
69
|
+
|
|
70
|
+
| Prop | Type | Default | Description |
|
|
71
|
+
| ---- | ---- | ------- | ----------- |
|
|
72
|
+
| activeIndex | number | 0 | The index of the currently active tab |
|
|
73
|
+
| items | TabItem[] | [] | Array of tab items with labels and content |
|
|
74
|
+
| glass | boolean \\| GlassProps | false | Enable glass morphism effect |
|
|
75
|
+
| onChange | (index: number) => void | - | Callback when active tab changes |
|
|
76
|
+
| className | string | - | Additional CSS classes for the component |
|
|
77
|
+
`,
|
|
18
78
|
},
|
|
19
79
|
},
|
|
20
80
|
},
|
|
@@ -23,11 +83,30 @@ const meta = {
|
|
|
23
83
|
activeIndex: {
|
|
24
84
|
control: { type: 'number' },
|
|
25
85
|
description: 'The index of the currently active tab',
|
|
26
|
-
|
|
86
|
+
table: {
|
|
87
|
+
type: { summary: 'number' },
|
|
88
|
+
defaultValue: { summary: 0 },
|
|
89
|
+
},
|
|
27
90
|
},
|
|
28
91
|
glass: {
|
|
29
92
|
control: 'boolean',
|
|
30
93
|
description: 'Enable glass morphism effect',
|
|
94
|
+
table: {
|
|
95
|
+
type: { summary: 'boolean | GlassProps' },
|
|
96
|
+
defaultValue: { summary: false },
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
onChange: {
|
|
100
|
+
action: 'tab changed',
|
|
101
|
+
description: 'Callback when active tab changes',
|
|
102
|
+
},
|
|
103
|
+
className: {
|
|
104
|
+
control: 'text',
|
|
105
|
+
description: 'Additional CSS classes for the component',
|
|
106
|
+
table: {
|
|
107
|
+
type: { summary: 'string' },
|
|
108
|
+
defaultValue: { summary: '-' },
|
|
109
|
+
},
|
|
31
110
|
},
|
|
32
111
|
},
|
|
33
112
|
} satisfies Meta<typeof Tabs>;
|
|
@@ -35,10 +114,7 @@ const meta = {
|
|
|
35
114
|
export default meta;
|
|
36
115
|
type Story = StoryObj<typeof meta>;
|
|
37
116
|
|
|
38
|
-
|
|
39
|
-
* Default tabs component with three tabs.
|
|
40
|
-
*/
|
|
41
|
-
export const Default: Story = {
|
|
117
|
+
export const BasicUsage: Story = {
|
|
42
118
|
render: args => (
|
|
43
119
|
<div style={{ maxWidth: '600px', margin: '0 auto', padding: '30px' }}>
|
|
44
120
|
<Tabs {...args} />
|
|
@@ -61,11 +137,15 @@ export const Default: Story = {
|
|
|
61
137
|
],
|
|
62
138
|
activeIndex: 0,
|
|
63
139
|
},
|
|
140
|
+
parameters: {
|
|
141
|
+
docs: {
|
|
142
|
+
description: {
|
|
143
|
+
story: 'Basic tabs component with three tabs.',
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
},
|
|
64
147
|
};
|
|
65
148
|
|
|
66
|
-
/**
|
|
67
|
-
* Tabs with a different tab initially active (Tab 2).
|
|
68
|
-
*/
|
|
69
149
|
export const WithDifferentActiveTab: Story = {
|
|
70
150
|
render: args => (
|
|
71
151
|
<div style={{ maxWidth: '600px', margin: '0 auto', padding: '30px' }}>
|
|
@@ -89,6 +169,54 @@ export const WithDifferentActiveTab: Story = {
|
|
|
89
169
|
],
|
|
90
170
|
activeIndex: 1,
|
|
91
171
|
},
|
|
172
|
+
parameters: {
|
|
173
|
+
docs: {
|
|
174
|
+
description: {
|
|
175
|
+
story: 'Tabs with a different tab initially active (Tab 2).',
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
export const WithGlassEffect: Story = {
|
|
182
|
+
render: args => (
|
|
183
|
+
<div
|
|
184
|
+
style={{
|
|
185
|
+
maxWidth: '600px',
|
|
186
|
+
margin: '0 auto',
|
|
187
|
+
padding: '30px',
|
|
188
|
+
background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
|
|
189
|
+
minHeight: '300px',
|
|
190
|
+
}}
|
|
191
|
+
>
|
|
192
|
+
<Tabs {...args} />
|
|
193
|
+
</div>
|
|
194
|
+
),
|
|
195
|
+
args: {
|
|
196
|
+
items: [
|
|
197
|
+
{
|
|
198
|
+
label: 'Tab 1',
|
|
199
|
+
content: <p>This is the content for Tab 1 with glass effect.</p>,
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
label: 'Tab 2',
|
|
203
|
+
content: <p>This is the content for Tab 2 with glass effect.</p>,
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
label: 'Tab 3',
|
|
207
|
+
content: <p>This is the content for Tab 3 with glass effect.</p>,
|
|
208
|
+
},
|
|
209
|
+
],
|
|
210
|
+
activeIndex: 0,
|
|
211
|
+
glass: true,
|
|
212
|
+
},
|
|
213
|
+
parameters: {
|
|
214
|
+
docs: {
|
|
215
|
+
description: {
|
|
216
|
+
story: 'Tabs with glass morphism effect applied.',
|
|
217
|
+
},
|
|
218
|
+
},
|
|
219
|
+
},
|
|
92
220
|
};
|
|
93
221
|
|
|
94
222
|
/**
|
|
@@ -98,7 +226,8 @@ export const WithRichContent: Story = {
|
|
|
98
226
|
parameters: {
|
|
99
227
|
docs: {
|
|
100
228
|
description: {
|
|
101
|
-
story:
|
|
229
|
+
story:
|
|
230
|
+
'Demonstrates tabs containing rich HTML content including headings, lists, and tables, showing the flexibility of the tabs component.',
|
|
102
231
|
},
|
|
103
232
|
},
|
|
104
233
|
},
|
|
@@ -266,4 +395,4 @@ export const GlassCustom: Story = {
|
|
|
266
395
|
</div>
|
|
267
396
|
</div>
|
|
268
397
|
),
|
|
269
|
-
};
|
|
398
|
+
};
|
|
@@ -61,83 +61,85 @@ export interface TabsProps {
|
|
|
61
61
|
/**
|
|
62
62
|
* Tabs component for switching between different content panels
|
|
63
63
|
*/
|
|
64
|
-
export const Tabs: React.FC<TabsProps> = memo(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
onTabChange
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
<
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
<
|
|
88
|
-
|
|
89
|
-
|
|
64
|
+
export const Tabs: React.FC<TabsProps> = memo(
|
|
65
|
+
({
|
|
66
|
+
items,
|
|
67
|
+
activeIndex = TAB.DEFAULTS.ACTIVE_INDEX,
|
|
68
|
+
onTabChange,
|
|
69
|
+
className = '',
|
|
70
|
+
style,
|
|
71
|
+
glass,
|
|
72
|
+
}) => {
|
|
73
|
+
const [currentTab, setCurrentTab] = useState(activeIndex);
|
|
74
|
+
|
|
75
|
+
// Handle tab change
|
|
76
|
+
const handleTabClick = (index: number) => {
|
|
77
|
+
setCurrentTab(index);
|
|
78
|
+
if (onTabChange) {
|
|
79
|
+
onTabChange(index);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const tabContent = (
|
|
84
|
+
<div className={`c-tabs js-atomix-tab ${className}`} style={style}>
|
|
85
|
+
<ul className="c-tabs__nav">
|
|
86
|
+
{items.map((item, index) => (
|
|
87
|
+
<li className="c-tabs__nav-item" key={`tab-nav-${index}`}>
|
|
88
|
+
<button
|
|
89
|
+
className={`c-tabs__nav-btn ${index === currentTab ? TAB.CLASSES.ACTIVE : ''}`}
|
|
90
|
+
onClick={() => handleTabClick(index)}
|
|
91
|
+
data-tabindex={index}
|
|
92
|
+
role="tab"
|
|
93
|
+
aria-selected={index === currentTab}
|
|
94
|
+
aria-controls={`tab-panel-${index}`}
|
|
95
|
+
>
|
|
96
|
+
{item.label}
|
|
97
|
+
</button>
|
|
98
|
+
</li>
|
|
99
|
+
))}
|
|
100
|
+
</ul>
|
|
101
|
+
<div className="c-tabs__panels">
|
|
102
|
+
{items.map((item, index) => (
|
|
103
|
+
<div
|
|
104
|
+
className={`c-tabs__panel ${index === currentTab ? TAB.CLASSES.ACTIVE : ''}`}
|
|
105
|
+
key={`tab-panel-${index}`}
|
|
90
106
|
data-tabindex={index}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
aria-
|
|
107
|
+
id={`tab-panel-${index}`}
|
|
108
|
+
role="tabpanel"
|
|
109
|
+
aria-labelledby={`tab-nav-${index}`}
|
|
110
|
+
style={{
|
|
111
|
+
height: index === currentTab ? 'auto' : '0px',
|
|
112
|
+
opacity: index === currentTab ? 1 : 0,
|
|
113
|
+
overflow: 'hidden',
|
|
114
|
+
transition: 'height 0.3s ease, opacity 0.3s ease',
|
|
115
|
+
}}
|
|
94
116
|
>
|
|
95
|
-
{item.
|
|
96
|
-
</
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
</ul>
|
|
100
|
-
<div className="c-tabs__panels">
|
|
101
|
-
{items.map((item, index) => (
|
|
102
|
-
<div
|
|
103
|
-
className={`c-tabs__panel ${index === currentTab ? TAB.CLASSES.ACTIVE : ''}`}
|
|
104
|
-
key={`tab-panel-${index}`}
|
|
105
|
-
data-tabindex={index}
|
|
106
|
-
id={`tab-panel-${index}`}
|
|
107
|
-
role="tabpanel"
|
|
108
|
-
aria-labelledby={`tab-nav-${index}`}
|
|
109
|
-
style={{
|
|
110
|
-
height: index === currentTab ? 'auto' : '0px',
|
|
111
|
-
opacity: index === currentTab ? 1 : 0,
|
|
112
|
-
overflow: 'hidden',
|
|
113
|
-
transition: 'height 0.3s ease, opacity 0.3s ease',
|
|
114
|
-
}}
|
|
115
|
-
>
|
|
116
|
-
<div className="c-tabs__panel-body">{item.content}</div>
|
|
117
|
-
</div>
|
|
118
|
-
))}
|
|
117
|
+
<div className="c-tabs__panel-body">{item.content}</div>
|
|
118
|
+
</div>
|
|
119
|
+
))}
|
|
120
|
+
</div>
|
|
119
121
|
</div>
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
if (glass) {
|
|
125
|
+
// Default glass settings for tabs
|
|
126
|
+
const defaultGlassProps = {
|
|
127
|
+
displacementScale: 60,
|
|
128
|
+
blurAmount: 1,
|
|
129
|
+
saturation: 160,
|
|
130
|
+
aberrationIntensity: 0.5,
|
|
131
|
+
cornerRadius: 8,
|
|
132
|
+
mode: 'shader' as const,
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
|
|
136
|
+
|
|
137
|
+
return <AtomixGlass {...glassProps}>{tabContent}</AtomixGlass>;
|
|
138
|
+
}
|
|
135
139
|
|
|
136
|
-
return
|
|
140
|
+
return tabContent;
|
|
137
141
|
}
|
|
138
|
-
|
|
139
|
-
return tabContent;
|
|
140
|
-
});
|
|
142
|
+
);
|
|
141
143
|
|
|
142
144
|
Tabs.displayName = 'Tabs';
|
|
143
145
|
|
|
@@ -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 { Testimonial } from './Testimonial';
|
|
4
5
|
|
|
5
6
|
const meta = {
|
|
@@ -9,20 +10,108 @@ const meta = {
|
|
|
9
10
|
layout: 'centered',
|
|
10
11
|
docs: {
|
|
11
12
|
description: {
|
|
12
|
-
component:
|
|
13
|
-
|
|
13
|
+
component: `
|
|
14
|
+
# Testimonial
|
|
15
|
+
|
|
16
|
+
## Overview
|
|
17
|
+
|
|
18
|
+
Testimonial component displays customer reviews, quotes, or endorsements with author information and avatars. It supports multiple sizes, skeleton loading states, and can display rich content. Testimonials are ideal for showcasing social proof, customer feedback, or featured quotes on landing pages and marketing sites.
|
|
19
|
+
|
|
20
|
+
## Features
|
|
21
|
+
|
|
22
|
+
- Customer quotes with author information
|
|
23
|
+
- Avatar display with author details
|
|
24
|
+
- Multiple size variants
|
|
25
|
+
- Skeleton loading states
|
|
26
|
+
- Responsive design
|
|
27
|
+
- Accessible markup
|
|
28
|
+
- Customizable styling
|
|
29
|
+
|
|
30
|
+
## Accessibility
|
|
31
|
+
|
|
32
|
+
- Screen reader: Quote and author information announced properly
|
|
33
|
+
- ARIA support: Proper roles and properties for testimonial components
|
|
34
|
+
- Keyboard support: Accessible via keyboard navigation
|
|
35
|
+
- Focus management: Maintains focus on interactive elements
|
|
36
|
+
|
|
37
|
+
## Usage Examples
|
|
38
|
+
|
|
39
|
+
### Basic Usage
|
|
40
|
+
|
|
41
|
+
\`\`\`tsx
|
|
42
|
+
<Testimonial
|
|
43
|
+
quote="Great product!"
|
|
44
|
+
author={{
|
|
45
|
+
name: 'John Doe',
|
|
46
|
+
role: 'Customer',
|
|
47
|
+
avatarSrc: '/path/to/avatar.jpg',
|
|
48
|
+
avatarAlt: 'John Doe'
|
|
49
|
+
}}
|
|
50
|
+
/>
|
|
51
|
+
\`\`\`
|
|
52
|
+
|
|
53
|
+
### With Size Variant
|
|
54
|
+
|
|
55
|
+
\`\`\`tsx
|
|
56
|
+
<Testimonial
|
|
57
|
+
quote="Great product!"
|
|
58
|
+
author={{
|
|
59
|
+
name: 'John Doe',
|
|
60
|
+
role: 'Customer',
|
|
61
|
+
avatarSrc: '/path/to/avatar.jpg',
|
|
62
|
+
avatarAlt: 'John Doe'
|
|
63
|
+
}}
|
|
64
|
+
size="lg"
|
|
65
|
+
/>
|
|
66
|
+
\`\`\`
|
|
67
|
+
|
|
68
|
+
## API Reference
|
|
69
|
+
|
|
70
|
+
### Props
|
|
71
|
+
|
|
72
|
+
| Prop | Type | Default | Description |
|
|
73
|
+
| ---- | ---- | ------- | ----------- |
|
|
74
|
+
| quote | string | - | The testimonial quote text |
|
|
75
|
+
| author | AuthorInfo | - | Information about the testimonial author |
|
|
76
|
+
| size | '' \\| 'sm' \\| 'lg' | '' | Size variant of the testimonial |
|
|
77
|
+
| skeleton | boolean | false | Whether to show skeleton loading state |
|
|
78
|
+
`,
|
|
14
79
|
},
|
|
15
80
|
},
|
|
16
81
|
},
|
|
17
82
|
tags: ['autodocs'],
|
|
18
83
|
argTypes: {
|
|
84
|
+
quote: {
|
|
85
|
+
control: 'text',
|
|
86
|
+
description: 'The testimonial quote text',
|
|
87
|
+
table: {
|
|
88
|
+
type: { summary: 'string' },
|
|
89
|
+
defaultValue: { summary: '-' },
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
author: {
|
|
93
|
+
control: 'object',
|
|
94
|
+
description: 'Information about the testimonial author',
|
|
95
|
+
table: {
|
|
96
|
+
type: { summary: 'AuthorInfo' },
|
|
97
|
+
defaultValue: { summary: '-' },
|
|
98
|
+
},
|
|
99
|
+
},
|
|
19
100
|
size: {
|
|
20
101
|
control: { type: 'select', options: ['', 'sm', 'lg'] },
|
|
21
102
|
description: 'Size variant of the testimonial',
|
|
103
|
+
table: {
|
|
104
|
+
type: { summary: '"" | "sm" | "lg"' },
|
|
105
|
+
defaultValue: { summary: '' },
|
|
106
|
+
},
|
|
22
107
|
},
|
|
23
108
|
skeleton: {
|
|
24
109
|
control: 'boolean',
|
|
25
110
|
description: 'Whether to show skeleton loading state',
|
|
111
|
+
table: {
|
|
112
|
+
type: { summary: 'boolean' },
|
|
113
|
+
defaultValue: { summary: false },
|
|
114
|
+
},
|
|
26
115
|
},
|
|
27
116
|
},
|
|
28
117
|
} satisfies Meta<typeof Testimonial>;
|
|
@@ -31,7 +120,7 @@ export default meta;
|
|
|
31
120
|
type Story = StoryObj<typeof meta>;
|
|
32
121
|
|
|
33
122
|
// Default testimonial
|
|
34
|
-
export const
|
|
123
|
+
export const BasicUsage: Story = {
|
|
35
124
|
render: args => (
|
|
36
125
|
<div style={{ padding: '30px' }}>
|
|
37
126
|
<Testimonial {...args} />
|
|
@@ -49,6 +138,13 @@ export const Default: Story = {
|
|
|
49
138
|
},
|
|
50
139
|
size: '',
|
|
51
140
|
},
|
|
141
|
+
parameters: {
|
|
142
|
+
docs: {
|
|
143
|
+
description: {
|
|
144
|
+
story: 'Basic testimonial with default size.',
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
},
|
|
52
148
|
};
|
|
53
149
|
|
|
54
150
|
// Large testimonial
|
|
@@ -70,6 +166,13 @@ export const Large: Story = {
|
|
|
70
166
|
},
|
|
71
167
|
size: 'lg',
|
|
72
168
|
},
|
|
169
|
+
parameters: {
|
|
170
|
+
docs: {
|
|
171
|
+
description: {
|
|
172
|
+
story: 'Large testimonial with expanded size.',
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
},
|
|
73
176
|
};
|
|
74
177
|
|
|
75
178
|
// Small testimonial
|
|
@@ -91,6 +194,13 @@ export const Small: Story = {
|
|
|
91
194
|
},
|
|
92
195
|
size: 'sm',
|
|
93
196
|
},
|
|
197
|
+
parameters: {
|
|
198
|
+
docs: {
|
|
199
|
+
description: {
|
|
200
|
+
story: 'Small testimonial with compact size.',
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
},
|
|
94
204
|
};
|
|
95
205
|
|
|
96
206
|
// Skeleton loading state
|
|
@@ -104,6 +214,13 @@ export const Skeleton: Story = {
|
|
|
104
214
|
skeleton: true,
|
|
105
215
|
size: '',
|
|
106
216
|
},
|
|
217
|
+
parameters: {
|
|
218
|
+
docs: {
|
|
219
|
+
description: {
|
|
220
|
+
story: 'Testimonial showing skeleton loading state.',
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
},
|
|
107
224
|
};
|
|
108
225
|
|
|
109
226
|
// Large skeleton
|