@shohojdhara/atomix 0.3.12 → 0.3.14
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 +19 -0
- package/README.md +2 -0
- package/dist/atomix.css +101 -88
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +5 -15258
- package/dist/atomix.min.css.map +1 -1
- package/dist/charts.d.ts +1 -1
- package/dist/charts.js +17 -19
- package/dist/charts.js.map +1 -1
- package/dist/core.d.ts +41 -11
- package/dist/core.js +55 -41
- package/dist/core.js.map +1 -1
- package/dist/forms.d.ts +28 -11
- package/dist/forms.js +25 -24
- package/dist/forms.js.map +1 -1
- package/dist/heavy.d.ts +1 -1
- package/dist/heavy.js +32 -25
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +122 -46
- package/dist/index.esm.js +865 -200
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +870 -204
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/theme.d.ts +27 -2
- package/dist/theme.js +721 -108
- package/dist/theme.js.map +1 -1
- package/package.json +1 -1
- package/scripts/atomix-cli.js +610 -1111
- package/scripts/cli/component-generator.js +610 -0
- package/scripts/cli/documentation-sync.js +542 -0
- package/scripts/cli/interactive-init.js +84 -288
- package/scripts/cli/mappings.js +211 -0
- package/scripts/cli/migration-tools.js +95 -288
- package/scripts/cli/template-manager.js +107 -0
- package/scripts/cli/templates/README.md +123 -0
- package/scripts/cli/templates/composable-templates.js +149 -0
- package/scripts/cli/templates/config-templates.js +126 -0
- package/scripts/cli/templates/index.js +95 -0
- package/scripts/cli/templates/project-templates.js +214 -0
- package/scripts/cli/templates/react-templates.js +261 -0
- package/scripts/cli/templates/scss-templates.js +156 -0
- package/scripts/cli/templates/storybook-templates.js +236 -0
- package/scripts/cli/templates/testing-templates.js +45 -0
- package/scripts/cli/templates/token-templates.js +447 -0
- package/scripts/cli/templates/types-templates.js +133 -0
- package/scripts/cli/templates-original-backup.js +1655 -0
- package/scripts/cli/templates.js +35 -0
- package/scripts/cli/templates_backup.js +684 -0
- package/scripts/cli/theme-bridge.js +20 -14
- package/scripts/cli/token-manager.js +150 -77
- package/scripts/cli/utils.js +37 -25
- package/src/components/Accordion/Accordion.stories.tsx +5 -5
- package/src/components/Accordion/Accordion.test.tsx +57 -0
- package/src/components/Accordion/Accordion.tsx +4 -0
- package/src/components/AtomixGlass/AtomixGlassContainer.tsx +41 -44
- package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +1 -1
- package/src/components/AtomixGlass/stories/Examples.stories.tsx +37 -37
- package/src/components/AtomixGlass/stories/Modes.stories.tsx +1 -2
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +50 -51
- package/src/components/Avatar/Avatar.stories.tsx +26 -26
- package/src/components/Badge/Badge.stories.tsx +31 -31
- package/src/components/Badge/Badge.test.tsx +51 -0
- package/src/components/Badge/Badge.tsx +20 -1
- package/src/components/Block/Block.stories.tsx +5 -5
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -1
- package/src/components/Breadcrumb/Breadcrumb.tsx +2 -2
- package/src/components/Button/Button.stories.tsx +13 -13
- package/src/components/Button/Button.tsx +4 -4
- package/src/components/Button/ButtonGroup.stories.tsx +2 -2
- package/src/components/Button/README.md +5 -0
- package/src/components/Callout/Callout.stories.tsx +11 -11
- package/src/components/Callout/Callout.test.tsx +10 -10
- package/src/components/Callout/Callout.tsx +7 -7
- package/src/components/Callout/README.md +9 -8
- package/src/components/Card/Card.tsx +2 -2
- package/src/components/Chart/Chart.stories.tsx +6 -6
- package/src/components/Chart/Chart.tsx +1 -1
- package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +1 -1
- package/src/components/DataTable/DataTable.tsx +14 -12
- package/src/components/DatePicker/DatePicker.stories.tsx +6 -6
- package/src/components/Dropdown/Dropdown.stories.tsx +4 -4
- package/src/components/Form/Checkbox.stories.tsx +3 -3
- package/src/components/Form/Checkbox.tsx +4 -2
- package/src/components/Form/Form.stories.tsx +3 -3
- package/src/components/Form/FormGroup.stories.tsx +1 -1
- package/src/components/Form/Input.stories.tsx +28 -16
- package/src/components/Form/Input.test.tsx +59 -0
- package/src/components/Form/Input.tsx +97 -95
- package/src/components/Form/Radio.stories.tsx +94 -94
- package/src/components/Form/Radio.tsx +2 -2
- package/src/components/Form/Select.stories.tsx +4 -4
- package/src/components/Form/Select.tsx +2 -2
- package/src/components/Form/Textarea.stories.tsx +22 -7
- package/src/components/Form/Textarea.test.tsx +45 -0
- package/src/components/Form/Textarea.tsx +88 -86
- package/src/components/List/List.stories.tsx +2 -2
- package/src/components/Modal/Modal.stories.tsx +4 -4
- package/src/components/Navigation/Navbar/Navbar.stories.tsx +5 -5
- package/src/components/Navigation/Navbar/Navbar.tsx +1 -1
- package/src/components/Navigation/README.md +1 -1
- package/src/components/Pagination/Pagination.stories.tsx +5 -2
- package/src/components/Pagination/Pagination.tsx +1 -1
- package/src/components/PhotoViewer/PhotoViewer.stories.tsx +10 -10
- package/src/components/Popover/Popover.stories.tsx +1 -1
- package/src/components/ProductReview/ProductReview.tsx +1 -1
- package/src/components/Progress/Progress.tsx +46 -46
- package/src/components/Rating/Rating.stories.tsx +4 -4
- package/src/components/Rating/Rating.tsx +8 -8
- package/src/components/Slider/Slider.stories.tsx +63 -63
- package/src/components/Spinner/Spinner.stories.tsx +2 -2
- package/src/components/Spinner/Spinner.test.tsx +35 -0
- package/src/components/Spinner/Spinner.tsx +9 -2
- package/src/components/Testimonial/Testimonial.stories.tsx +1 -1
- package/src/components/Toggle/Toggle.stories.tsx +32 -9
- package/src/components/Toggle/Toggle.test.tsx +91 -0
- package/src/components/Toggle/Toggle.tsx +44 -27
- package/src/components/Tooltip/Tooltip.tsx +1 -1
- package/src/layouts/Grid/Grid.stories.tsx +49 -49
- package/src/layouts/MasonryGrid/MasonryGrid.stories.tsx +2 -2
- package/src/lib/composables/useAccordion.ts +12 -3
- package/src/lib/composables/useBreadcrumb.ts +2 -2
- package/src/lib/composables/useCallout.ts +7 -7
- package/src/lib/composables/useNavbar.ts +1 -1
- package/src/lib/constants/components.ts +1 -1
- package/src/lib/storybook/InteractiveDemo.tsx +113 -0
- package/src/lib/storybook/PreviewContainer.tsx +36 -0
- package/src/lib/storybook/VariantsGrid.tsx +21 -0
- package/src/lib/storybook/index.ts +3 -0
- package/src/lib/theme/core/createThemeObject.ts +9 -5
- package/src/lib/theme/devtools/CLI.ts +155 -0
- package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +213 -0
- package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +566 -0
- package/src/lib/theme/devtools/LiveEditor.tsx +2 -1
- package/src/lib/theme/devtools/index.ts +3 -0
- package/src/lib/theme/errors/errors.ts +8 -0
- package/src/lib/theme/runtime/ThemeProvider.tsx +117 -57
- package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +305 -0
- package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +588 -0
- package/src/lib/theme/utils/__tests__/themeValidation.test.ts +264 -0
- package/src/lib/theme/utils/index.ts +1 -0
- package/src/lib/theme/utils/themeValidation.ts +501 -0
- package/src/lib/theme-tools.ts +32 -3
- package/src/lib/types/components.ts +81 -26
- package/src/lib/utils/themeNaming.ts +1 -1
- package/src/styles/06-components/_components.atomix-glass.scss +14 -15
- package/src/styles/06-components/_components.callout.scss +29 -33
- package/src/styles/06-components/_index.scss +1 -1
- package/src/styles/99-utilities/_utilities.display.scss +14 -3
- package/src/styles/99-utilities/_utilities.flex.scss +10 -10
- package/src/styles/99-utilities/_utilities.text.scss +28 -8
- package/scripts/cli/__tests__/cli-commands.test.js +0 -204
- package/scripts/cli/__tests__/utils.test.js +0 -201
- package/scripts/cli/__tests__/vitest.config.js +0 -26
|
@@ -60,8 +60,8 @@ const basicSlides: SliderSlide[] = [
|
|
|
60
60
|
}}
|
|
61
61
|
>
|
|
62
62
|
<div className="u-text-center">
|
|
63
|
-
<h2 className="u-
|
|
64
|
-
<p className="u-
|
|
63
|
+
<h2 className="u-text-3 u-c-white u-mb-3">Welcome to Atomix</h2>
|
|
64
|
+
<p className="u-text-base u-c-white u-mb-4">
|
|
65
65
|
A modern design system for building responsive interfaces
|
|
66
66
|
</p>
|
|
67
67
|
<Button variant="primary">Get Started</Button>
|
|
@@ -84,8 +84,8 @@ const basicSlides: SliderSlide[] = [
|
|
|
84
84
|
}}
|
|
85
85
|
>
|
|
86
86
|
<div className="u-text-center">
|
|
87
|
-
<h2 className="u-
|
|
88
|
-
<p className="u-
|
|
87
|
+
<h2 className="u-text-3 u-c-white u-mb-3">Flexible Components</h2>
|
|
88
|
+
<p className="u-text-base u-c-white u-mb-4">
|
|
89
89
|
Build with reusable and customizable components
|
|
90
90
|
</p>
|
|
91
91
|
<Button variant="light">Learn More</Button>
|
|
@@ -108,8 +108,8 @@ const basicSlides: SliderSlide[] = [
|
|
|
108
108
|
}}
|
|
109
109
|
>
|
|
110
110
|
<div className="u-text-center">
|
|
111
|
-
<h2 className="u-
|
|
112
|
-
<p className="u-
|
|
111
|
+
<h2 className="u-text-3 u-c-white u-mb-3">Easy to Use</h2>
|
|
112
|
+
<p className="u-text-base u-c-white u-mb-4">Simple API and comprehensive documentation</p>
|
|
113
113
|
<Button variant="light">View Docs</Button>
|
|
114
114
|
</div>
|
|
115
115
|
</div>
|
|
@@ -130,8 +130,8 @@ const basicSlides: SliderSlide[] = [
|
|
|
130
130
|
}}
|
|
131
131
|
>
|
|
132
132
|
<div className="u-text-center">
|
|
133
|
-
<h2 className="u-
|
|
134
|
-
<p className="u-
|
|
133
|
+
<h2 className="u-text-3 u-c-white u-mb-3">Fully Responsive</h2>
|
|
134
|
+
<p className="u-text-base u-c-white u-mb-4">
|
|
135
135
|
Works on all device sizes from mobile to desktop
|
|
136
136
|
</p>
|
|
137
137
|
<Button variant="dark">See Demo</Button>
|
|
@@ -154,8 +154,8 @@ const basicSlides: SliderSlide[] = [
|
|
|
154
154
|
}}
|
|
155
155
|
>
|
|
156
156
|
<div className="u-text-center">
|
|
157
|
-
<h2 className="u-
|
|
158
|
-
<p className="u-
|
|
157
|
+
<h2 className="u-text-3 u-c-white u-mb-3">Accessible Design</h2>
|
|
158
|
+
<p className="u-text-base u-c-white u-mb-4">WCAG 2.1 AA compliant for all users</p>
|
|
159
159
|
<Button variant="info">Learn More</Button>
|
|
160
160
|
</div>
|
|
161
161
|
</div>
|
|
@@ -176,8 +176,8 @@ const basicSlides: SliderSlide[] = [
|
|
|
176
176
|
}}
|
|
177
177
|
>
|
|
178
178
|
<div className="u-text-center">
|
|
179
|
-
<h2 className="u-
|
|
180
|
-
<p className="u-
|
|
179
|
+
<h2 className="u-text-3 u-c-white u-mb-3">Themeable</h2>
|
|
180
|
+
<p className="u-text-base u-c-white u-mb-4">
|
|
181
181
|
Easily customize colors, spacing and typography
|
|
182
182
|
</p>
|
|
183
183
|
<Button variant="warning">View Themes</Button>
|
|
@@ -200,8 +200,8 @@ const basicSlides: SliderSlide[] = [
|
|
|
200
200
|
}}
|
|
201
201
|
>
|
|
202
202
|
<div className="u-text-center">
|
|
203
|
-
<h2 className="u-
|
|
204
|
-
<p className="u-
|
|
203
|
+
<h2 className="u-text-3 u-c-white u-mb-3">Performance Focused</h2>
|
|
204
|
+
<p className="u-text-base u-c-white u-mb-4">
|
|
205
205
|
Optimized for fast loading and smooth interactions
|
|
206
206
|
</p>
|
|
207
207
|
<Button variant="success">See Benchmarks</Button>
|
|
@@ -224,8 +224,8 @@ const basicSlides: SliderSlide[] = [
|
|
|
224
224
|
}}
|
|
225
225
|
>
|
|
226
226
|
<div className="u-text-center">
|
|
227
|
-
<h2 className="u-
|
|
228
|
-
<p className="u-
|
|
227
|
+
<h2 className="u-text-3 u-c-white u-mb-3">Developer Friendly</h2>
|
|
228
|
+
<p className="u-text-base u-c-white u-mb-4">Well documented with clear APIs and examples</p>
|
|
229
229
|
<Button variant="primary">View Docs</Button>
|
|
230
230
|
</div>
|
|
231
231
|
</div>
|
|
@@ -246,8 +246,8 @@ const basicSlides: SliderSlide[] = [
|
|
|
246
246
|
}}
|
|
247
247
|
>
|
|
248
248
|
<div className="u-text-center">
|
|
249
|
-
<h2 className="u-
|
|
250
|
-
<p className="u-
|
|
249
|
+
<h2 className="u-text-3 u-c-white u-mb-3">Modular Components</h2>
|
|
250
|
+
<p className="u-text-base u-c-white u-mb-4">
|
|
251
251
|
Import only what you need to reduce bundle size
|
|
252
252
|
</p>
|
|
253
253
|
<Button variant="dark">See Components</Button>
|
|
@@ -270,8 +270,8 @@ const basicSlides: SliderSlide[] = [
|
|
|
270
270
|
}}
|
|
271
271
|
>
|
|
272
272
|
<div className="u-text-center">
|
|
273
|
-
<h2 className="u-
|
|
274
|
-
<p className="u-
|
|
273
|
+
<h2 className="u-text-3 u-c-white u-mb-3">Cross Browser</h2>
|
|
274
|
+
<p className="u-text-base u-c-white u-mb-4">
|
|
275
275
|
Consistent experience across all modern browsers
|
|
276
276
|
</p>
|
|
277
277
|
<Button variant="secondary">View Support</Button>
|
|
@@ -294,8 +294,8 @@ const basicSlides: SliderSlide[] = [
|
|
|
294
294
|
}}
|
|
295
295
|
>
|
|
296
296
|
<div className="u-text-center">
|
|
297
|
-
<h2 className="u-
|
|
298
|
-
<p className="u-
|
|
297
|
+
<h2 className="u-text-3 u-c-white u-mb-3">RTL Support</h2>
|
|
298
|
+
<p className="u-text-base u-c-white u-mb-4">Full right-to-left language support built-in</p>
|
|
299
299
|
<Button variant="info">Learn More</Button>
|
|
300
300
|
</div>
|
|
301
301
|
</div>
|
|
@@ -316,8 +316,8 @@ const basicSlides: SliderSlide[] = [
|
|
|
316
316
|
}}
|
|
317
317
|
>
|
|
318
318
|
<div className="u-text-center">
|
|
319
|
-
<h2 className="u-
|
|
320
|
-
<p className="u-
|
|
319
|
+
<h2 className="u-text-3 u-c-white u-mb-3">Open Source</h2>
|
|
320
|
+
<p className="u-text-base u-c-white u-mb-4">Free to use and contribute to the community</p>
|
|
321
321
|
<Button variant="success">View on GitHub</Button>
|
|
322
322
|
</div>
|
|
323
323
|
</div>
|
|
@@ -341,11 +341,11 @@ const productSlides: SliderSlide[] = [
|
|
|
341
341
|
borderRadius: '4px',
|
|
342
342
|
}}
|
|
343
343
|
/>
|
|
344
|
-
<h3 className="u-
|
|
345
|
-
<p className="u-
|
|
344
|
+
<h3 className="u-text-4 u-font-bold u-mb-2">Premium Plan</h3>
|
|
345
|
+
<p className="u-text-sm u-c-muted u-mb-3">Perfect for small teams and growing businesses</p>
|
|
346
346
|
<div className="u-mb-4">
|
|
347
|
-
<span className="u-
|
|
348
|
-
<span className="u-
|
|
347
|
+
<span className="u-text-1 u-font-bold">$29</span>
|
|
348
|
+
<span className="u-text-sm u-c-muted">/month</span>
|
|
349
349
|
</div>
|
|
350
350
|
<Button variant="primary" className="u-w-100">
|
|
351
351
|
Get Started
|
|
@@ -368,11 +368,11 @@ const productSlides: SliderSlide[] = [
|
|
|
368
368
|
borderRadius: '4px',
|
|
369
369
|
}}
|
|
370
370
|
/>
|
|
371
|
-
<h3 className="u-
|
|
372
|
-
<p className="u-
|
|
371
|
+
<h3 className="u-text-4 u-font-bold u-mb-2">Business Plan</h3>
|
|
372
|
+
<p className="u-text-sm u-c-muted u-mb-3">For established teams with advanced needs</p>
|
|
373
373
|
<div className="u-mb-4">
|
|
374
|
-
<span className="u-
|
|
375
|
-
<span className="u-
|
|
374
|
+
<span className="u-text-1 u-font-bold">$79</span>
|
|
375
|
+
<span className="u-text-sm u-c-muted">/month</span>
|
|
376
376
|
</div>
|
|
377
377
|
<Button variant="secondary" className="u-w-100">
|
|
378
378
|
Get Started
|
|
@@ -395,10 +395,10 @@ const productSlides: SliderSlide[] = [
|
|
|
395
395
|
borderRadius: '4px',
|
|
396
396
|
}}
|
|
397
397
|
/>
|
|
398
|
-
<h3 className="u-
|
|
399
|
-
<p className="u-
|
|
398
|
+
<h3 className="u-text-4 u-font-bold u-mb-2">Enterprise Plan</h3>
|
|
399
|
+
<p className="u-text-sm u-c-muted u-mb-3">Custom solutions for large organizations</p>
|
|
400
400
|
<div className="u-mb-4">
|
|
401
|
-
<span className="u-
|
|
401
|
+
<span className="u-text-1 u-font-bold">Custom</span>
|
|
402
402
|
</div>
|
|
403
403
|
<Button variant="dark" className="u-w-100">
|
|
404
404
|
Contact Sales
|
|
@@ -421,11 +421,11 @@ const productSlides: SliderSlide[] = [
|
|
|
421
421
|
borderRadius: '4px',
|
|
422
422
|
}}
|
|
423
423
|
/>
|
|
424
|
-
<h3 className="u-
|
|
425
|
-
<p className="u-
|
|
424
|
+
<h3 className="u-text-4 u-font-bold u-mb-2">Developer Plan</h3>
|
|
425
|
+
<p className="u-text-sm u-c-muted u-mb-3">For developers and technical teams</p>
|
|
426
426
|
<div className="u-mb-4">
|
|
427
|
-
<span className="u-
|
|
428
|
-
<span className="u-
|
|
427
|
+
<span className="u-text-1 u-font-bold">$49</span>
|
|
428
|
+
<span className="u-text-sm u-c-muted">/month</span>
|
|
429
429
|
</div>
|
|
430
430
|
<Button variant="info" className="u-w-100">
|
|
431
431
|
Get Started
|
|
@@ -443,7 +443,7 @@ const testimonialSlides: SliderSlide[] = [
|
|
|
443
443
|
content: (
|
|
444
444
|
<Card className="u-h-100">
|
|
445
445
|
<div className="u-p-5 u-text-center">
|
|
446
|
-
<div className="u-mb-4 u-
|
|
446
|
+
<div className="u-mb-4 u-flex u-justify-center">
|
|
447
447
|
<div
|
|
448
448
|
style={{
|
|
449
449
|
width: '60px',
|
|
@@ -453,12 +453,12 @@ const testimonialSlides: SliderSlide[] = [
|
|
|
453
453
|
}}
|
|
454
454
|
/>
|
|
455
455
|
</div>
|
|
456
|
-
<p className="u-
|
|
456
|
+
<p className="u-text-base u-fst-italic u-mb-4">
|
|
457
457
|
"Atomix has completely transformed how we build our user interfaces. The components are
|
|
458
458
|
intuitive and the design system is consistent across all our products."
|
|
459
459
|
</p>
|
|
460
|
-
<h4 className="u-
|
|
461
|
-
<p className="u-
|
|
460
|
+
<h4 className="u-text-4 u-font-bold">Jane Cooper</h4>
|
|
461
|
+
<p className="u-text-sm u-c-muted">Product Designer, TechCorp</p>
|
|
462
462
|
</div>
|
|
463
463
|
</Card>
|
|
464
464
|
),
|
|
@@ -468,7 +468,7 @@ const testimonialSlides: SliderSlide[] = [
|
|
|
468
468
|
content: (
|
|
469
469
|
<Card className="u-h-100">
|
|
470
470
|
<div className="u-p-5 u-text-center">
|
|
471
|
-
<div className="u-mb-4 u-
|
|
471
|
+
<div className="u-mb-4 u-flex u-justify-center">
|
|
472
472
|
<div
|
|
473
473
|
style={{
|
|
474
474
|
width: '60px',
|
|
@@ -478,12 +478,12 @@ const testimonialSlides: SliderSlide[] = [
|
|
|
478
478
|
}}
|
|
479
479
|
/>
|
|
480
480
|
</div>
|
|
481
|
-
<p className="u-
|
|
481
|
+
<p className="u-text-base u-fst-italic u-mb-4">
|
|
482
482
|
"Implementing Atomix reduced our development time by 40%. The documentation is excellent
|
|
483
483
|
and the components are highly customizable."
|
|
484
484
|
</p>
|
|
485
|
-
<h4 className="u-
|
|
486
|
-
<p className="u-
|
|
485
|
+
<h4 className="u-text-4 u-font-bold">John Doe</h4>
|
|
486
|
+
<p className="u-text-sm u-c-muted">Frontend Developer, StartupX</p>
|
|
487
487
|
</div>
|
|
488
488
|
</Card>
|
|
489
489
|
),
|
|
@@ -493,7 +493,7 @@ const testimonialSlides: SliderSlide[] = [
|
|
|
493
493
|
content: (
|
|
494
494
|
<Card className="u-h-100">
|
|
495
495
|
<div className="u-p-5 u-text-center">
|
|
496
|
-
<div className="u-mb-4 u-
|
|
496
|
+
<div className="u-mb-4 u-flex u-justify-center">
|
|
497
497
|
<div
|
|
498
498
|
style={{
|
|
499
499
|
width: '60px',
|
|
@@ -503,12 +503,12 @@ const testimonialSlides: SliderSlide[] = [
|
|
|
503
503
|
}}
|
|
504
504
|
/>
|
|
505
505
|
</div>
|
|
506
|
-
<p className="u-
|
|
506
|
+
<p className="u-text-base u-fst-italic u-mb-4">
|
|
507
507
|
"The accessibility features in Atomix are impressive. Our products now meet WCAG 2.1 AA
|
|
508
508
|
standards with minimal effort."
|
|
509
509
|
</p>
|
|
510
|
-
<h4 className="u-
|
|
511
|
-
<p className="u-
|
|
510
|
+
<h4 className="u-text-4 u-font-bold">Sarah Johnson</h4>
|
|
511
|
+
<p className="u-text-sm u-c-muted">Accessibility Lead, InclusiveTech</p>
|
|
512
512
|
</div>
|
|
513
513
|
</Card>
|
|
514
514
|
),
|
|
@@ -522,9 +522,9 @@ const featureSlides: SliderSlide[] = [
|
|
|
522
522
|
content: (
|
|
523
523
|
<div className="u-h-100" style={{ display: 'flex', alignItems: 'center' }}>
|
|
524
524
|
<div className="o-grid u-w-100">
|
|
525
|
-
<div className="o-grid__col u-col-12 u-col-md-6 u-
|
|
526
|
-
<h2 className="u-
|
|
527
|
-
<p className="u-
|
|
525
|
+
<div className="o-grid__col u-col-12 u-col-md-6 u-flex u-flex-column u-justify-center u-p-5">
|
|
526
|
+
<h2 className="u-text-3 u-font-bold u-mb-3">Responsive Design</h2>
|
|
527
|
+
<p className="u-text-base u-c-muted u-mb-4">
|
|
528
528
|
All components are built with mobile-first responsive design principles, ensuring your
|
|
529
529
|
interfaces look great on any device.
|
|
530
530
|
</p>
|
|
@@ -532,7 +532,7 @@ const featureSlides: SliderSlide[] = [
|
|
|
532
532
|
<Button variant="primary">Learn More</Button>
|
|
533
533
|
</div>
|
|
534
534
|
</div>
|
|
535
|
-
<div className="o-grid__col u-col-12 u-col-md-6 u-
|
|
535
|
+
<div className="o-grid__col u-col-12 u-col-md-6 u-flex u-items-center u-justify-center u-p-5">
|
|
536
536
|
<div
|
|
537
537
|
className="u-w-100 u-h-100"
|
|
538
538
|
style={{
|
|
@@ -558,9 +558,9 @@ const featureSlides: SliderSlide[] = [
|
|
|
558
558
|
content: (
|
|
559
559
|
<div className="u-h-100" style={{ display: 'flex', alignItems: 'center' }}>
|
|
560
560
|
<div className="o-grid u-w-100">
|
|
561
|
-
<div className="o-grid__col u-col-12 u-col-md-6 u-
|
|
562
|
-
<h2 className="u-
|
|
563
|
-
<p className="u-
|
|
561
|
+
<div className="o-grid__col u-col-12 u-col-md-6 u-flex u-flex-column u-justify-center u-p-5">
|
|
562
|
+
<h2 className="u-text-3 u-font-bold u-mb-3">Accessibility</h2>
|
|
563
|
+
<p className="u-text-base u-c-muted u-mb-4">
|
|
564
564
|
Built with WCAG 2.1 AA compliance in mind, ensuring your applications are usable by
|
|
565
565
|
everyone, including people with disabilities.
|
|
566
566
|
</p>
|
|
@@ -568,7 +568,7 @@ const featureSlides: SliderSlide[] = [
|
|
|
568
568
|
<Button variant="secondary">Accessibility Guide</Button>
|
|
569
569
|
</div>
|
|
570
570
|
</div>
|
|
571
|
-
<div className="o-grid__col u-col-12 u-col-md-6 u-
|
|
571
|
+
<div className="o-grid__col u-col-12 u-col-md-6 u-flex u-items-center u-justify-center u-p-5">
|
|
572
572
|
<div
|
|
573
573
|
className="u-w-100 u-h-100"
|
|
574
574
|
style={{
|
|
@@ -594,9 +594,9 @@ const featureSlides: SliderSlide[] = [
|
|
|
594
594
|
content: (
|
|
595
595
|
<div className="u-h-100" style={{ display: 'flex', alignItems: 'center' }}>
|
|
596
596
|
<div className="o-grid u-w-100">
|
|
597
|
-
<div className="o-grid__col u-col-12 u-col-md-6 u-
|
|
598
|
-
<h2 className="u-
|
|
599
|
-
<p className="u-
|
|
597
|
+
<div className="o-grid__col u-col-12 u-col-md-6 u-flex u-flex-column u-justify-center u-p-5">
|
|
598
|
+
<h2 className="u-text-3 u-font-bold u-mb-3">Customizable</h2>
|
|
599
|
+
<p className="u-text-base u-c-muted u-mb-4">
|
|
600
600
|
Easily customize colors, spacing, typography and more through CSS variables or SCSS
|
|
601
601
|
mixins to match your brand identity.
|
|
602
602
|
</p>
|
|
@@ -604,7 +604,7 @@ const featureSlides: SliderSlide[] = [
|
|
|
604
604
|
<Button variant="success">Customization Guide</Button>
|
|
605
605
|
</div>
|
|
606
606
|
</div>
|
|
607
|
-
<div className="o-grid__col u-col-12 u-col-md-6 u-
|
|
607
|
+
<div className="o-grid__col u-col-12 u-col-md-6 u-flex u-items-center u-justify-center u-p-5">
|
|
608
608
|
<div
|
|
609
609
|
className="u-w-100 u-h-100"
|
|
610
610
|
style={{
|
|
@@ -49,7 +49,7 @@ export const Default: Story = {
|
|
|
49
49
|
// Size Variants
|
|
50
50
|
export const Sizes: Story = {
|
|
51
51
|
render: () => (
|
|
52
|
-
<div className="u-
|
|
52
|
+
<div className="u-flex u-flex-wrap u-gap-3 u-items-center">
|
|
53
53
|
<Spinner size="sm" />
|
|
54
54
|
<Spinner size="md" />
|
|
55
55
|
<Spinner size="lg" />
|
|
@@ -60,7 +60,7 @@ export const Sizes: Story = {
|
|
|
60
60
|
// Color Variants
|
|
61
61
|
export const ColorVariants: Story = {
|
|
62
62
|
render: () => (
|
|
63
|
-
<div className="u-
|
|
63
|
+
<div className="u-flex u-flex-wrap u-gap-3 u-items-center">
|
|
64
64
|
{THEME_COLORS.map(color => (
|
|
65
65
|
<Spinner key={color} variant={color} />
|
|
66
66
|
))}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { render, screen } from '@testing-library/react';
|
|
2
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
3
|
+
import { Spinner } from './Spinner';
|
|
4
|
+
|
|
5
|
+
// Mock AtomixGlass component
|
|
6
|
+
vi.mock('../AtomixGlass/AtomixGlass', () => ({
|
|
7
|
+
AtomixGlass: ({ children, ...props }: any) => (
|
|
8
|
+
<div data-testid="atomix-glass" data-glass-props={JSON.stringify(props)}>
|
|
9
|
+
{children}
|
|
10
|
+
</div>
|
|
11
|
+
),
|
|
12
|
+
}));
|
|
13
|
+
|
|
14
|
+
describe('Spinner Component', () => {
|
|
15
|
+
it('renders with default accessibility props', () => {
|
|
16
|
+
render(<Spinner />);
|
|
17
|
+
const spinner = screen.getByRole('status');
|
|
18
|
+
expect(spinner).toBeInTheDocument();
|
|
19
|
+
expect(spinner).toHaveAttribute('aria-label', 'Loading');
|
|
20
|
+
expect(screen.getByText('Loading...')).toBeInTheDocument();
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('renders with custom accessibility props', () => {
|
|
24
|
+
render(<Spinner role="alert" aria-label="Please wait" />);
|
|
25
|
+
const spinner = screen.getByRole('alert');
|
|
26
|
+
expect(spinner).toBeInTheDocument();
|
|
27
|
+
expect(spinner).toHaveAttribute('aria-label', 'Please wait');
|
|
28
|
+
expect(screen.getByText('Please wait')).toBeInTheDocument();
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('renders as glass when enabled', () => {
|
|
32
|
+
render(<Spinner glass />);
|
|
33
|
+
expect(screen.getByTestId('atomix-glass')).toBeInTheDocument();
|
|
34
|
+
});
|
|
35
|
+
});
|
|
@@ -11,6 +11,8 @@ export const Spinner: React.FC<SpinnerProps> = memo(({
|
|
|
11
11
|
className = '',
|
|
12
12
|
style,
|
|
13
13
|
glass,
|
|
14
|
+
'aria-label': ariaLabel,
|
|
15
|
+
role = 'status',
|
|
14
16
|
}) => {
|
|
15
17
|
const { generateSpinnerClass } = useSpinner({
|
|
16
18
|
size,
|
|
@@ -26,8 +28,13 @@ export const Spinner: React.FC<SpinnerProps> = memo(({
|
|
|
26
28
|
});
|
|
27
29
|
|
|
28
30
|
const spinnerContent = (
|
|
29
|
-
<div
|
|
30
|
-
|
|
31
|
+
<div
|
|
32
|
+
className={spinnerClass}
|
|
33
|
+
style={style}
|
|
34
|
+
role={role}
|
|
35
|
+
aria-label={ariaLabel || 'Loading'}
|
|
36
|
+
>
|
|
37
|
+
<span className={SPINNER.VISUALLY_HIDDEN}>{ariaLabel || 'Loading...'}</span>
|
|
31
38
|
</div>
|
|
32
39
|
);
|
|
33
40
|
|
|
@@ -200,7 +200,7 @@ export const TestimonialGridLayout: Story = {
|
|
|
200
200
|
const TestimonialWithImage: React.FC = () => {
|
|
201
201
|
return (
|
|
202
202
|
<div className="o-container">
|
|
203
|
-
<div className="o-grid u-
|
|
203
|
+
<div className="o-grid u-items-center">
|
|
204
204
|
<div className="o-grid__col o-grid__col--6">
|
|
205
205
|
<Testimonial
|
|
206
206
|
quote="The intuitive interface, seamless syncing across devices, and helpful features have made me more productive than ever before."
|
|
@@ -16,11 +16,19 @@ const meta = {
|
|
|
16
16
|
},
|
|
17
17
|
tags: ['autodocs'],
|
|
18
18
|
argTypes: {
|
|
19
|
-
|
|
19
|
+
defaultChecked: {
|
|
20
20
|
control: { type: 'boolean' },
|
|
21
|
-
description: 'Whether the toggle is initially on',
|
|
21
|
+
description: 'Whether the toggle is initially on (uncontrolled)',
|
|
22
22
|
defaultValue: false,
|
|
23
23
|
},
|
|
24
|
+
checked: {
|
|
25
|
+
control: { type: 'boolean' },
|
|
26
|
+
description: 'Whether the toggle is on (controlled)',
|
|
27
|
+
},
|
|
28
|
+
onChange: {
|
|
29
|
+
action: 'changed',
|
|
30
|
+
description: 'Callback when the toggle state changes',
|
|
31
|
+
},
|
|
24
32
|
disabled: {
|
|
25
33
|
control: { type: 'boolean' },
|
|
26
34
|
description: 'Whether the toggle is disabled',
|
|
@@ -43,11 +51,26 @@ export const Default: Story = {
|
|
|
43
51
|
</div>
|
|
44
52
|
),
|
|
45
53
|
args: {
|
|
46
|
-
|
|
54
|
+
defaultChecked: false,
|
|
47
55
|
disabled: false,
|
|
48
56
|
},
|
|
49
57
|
};
|
|
50
58
|
|
|
59
|
+
/**
|
|
60
|
+
* Controlled Toggle using checked and onChange.
|
|
61
|
+
*/
|
|
62
|
+
export const Controlled: Story = {
|
|
63
|
+
render: () => {
|
|
64
|
+
const [isChecked, setIsChecked] = React.useState(false);
|
|
65
|
+
return (
|
|
66
|
+
<div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '1rem' }}>
|
|
67
|
+
<p>Checked: {isChecked ? 'Yes' : 'No'}</p>
|
|
68
|
+
<Toggle checked={isChecked} onChange={setIsChecked} />
|
|
69
|
+
</div>
|
|
70
|
+
);
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
|
|
51
74
|
export const InitiallyOn: Story = {
|
|
52
75
|
render: args => (
|
|
53
76
|
<div style={{ display: 'flex', justifyContent: 'center', padding: '30px' }}>
|
|
@@ -55,7 +78,7 @@ export const InitiallyOn: Story = {
|
|
|
55
78
|
</div>
|
|
56
79
|
),
|
|
57
80
|
args: {
|
|
58
|
-
|
|
81
|
+
defaultChecked: true,
|
|
59
82
|
disabled: false,
|
|
60
83
|
},
|
|
61
84
|
};
|
|
@@ -67,7 +90,7 @@ export const Disabled: Story = {
|
|
|
67
90
|
</div>
|
|
68
91
|
),
|
|
69
92
|
args: {
|
|
70
|
-
|
|
93
|
+
defaultChecked: false,
|
|
71
94
|
disabled: true,
|
|
72
95
|
},
|
|
73
96
|
};
|
|
@@ -79,14 +102,14 @@ export const DisabledOn: Story = {
|
|
|
79
102
|
</div>
|
|
80
103
|
),
|
|
81
104
|
args: {
|
|
82
|
-
|
|
105
|
+
defaultChecked: true,
|
|
83
106
|
disabled: true,
|
|
84
107
|
},
|
|
85
108
|
};
|
|
86
109
|
|
|
87
110
|
export const Glass: Story = {
|
|
88
111
|
args: {
|
|
89
|
-
|
|
112
|
+
defaultChecked: false,
|
|
90
113
|
disabled: false,
|
|
91
114
|
glass: true,
|
|
92
115
|
},
|
|
@@ -109,7 +132,7 @@ export const Glass: Story = {
|
|
|
109
132
|
|
|
110
133
|
export const GlassOn: Story = {
|
|
111
134
|
args: {
|
|
112
|
-
|
|
135
|
+
defaultChecked: true,
|
|
113
136
|
disabled: false,
|
|
114
137
|
glass: true,
|
|
115
138
|
},
|
|
@@ -135,7 +158,7 @@ export const GlassOn: Story = {
|
|
|
135
158
|
|
|
136
159
|
export const GlassCustom: Story = {
|
|
137
160
|
args: {
|
|
138
|
-
|
|
161
|
+
defaultChecked: false,
|
|
139
162
|
disabled: false,
|
|
140
163
|
glass: {
|
|
141
164
|
displacementScale: 80,
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { render, screen, fireEvent } from '@testing-library/react';
|
|
2
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
3
|
+
import { Toggle } from './Toggle';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
|
|
6
|
+
describe('Toggle Component', () => {
|
|
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
|
+
|
|
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
|
+
|
|
20
|
+
it('toggles state when clicked (uncontrolled)', () => {
|
|
21
|
+
const handleChange = vi.fn();
|
|
22
|
+
render(<Toggle onChange={handleChange} />);
|
|
23
|
+
const toggle = screen.getByRole('switch');
|
|
24
|
+
|
|
25
|
+
fireEvent.click(toggle);
|
|
26
|
+
expect(toggle).toHaveAttribute('aria-checked', 'true');
|
|
27
|
+
expect(handleChange).toHaveBeenCalledWith(true);
|
|
28
|
+
|
|
29
|
+
fireEvent.click(toggle);
|
|
30
|
+
expect(toggle).toHaveAttribute('aria-checked', 'false');
|
|
31
|
+
expect(handleChange).toHaveBeenCalledWith(false);
|
|
32
|
+
});
|
|
33
|
+
|
|
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
|
+
|
|
39
|
+
rerender(<Toggle checked={false} />);
|
|
40
|
+
expect(toggle).toHaveAttribute('aria-checked', 'false');
|
|
41
|
+
});
|
|
42
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
66
|
+
it('handles keyboard interaction', () => {
|
|
67
|
+
const handleChange = vi.fn();
|
|
68
|
+
render(<Toggle onChange={handleChange} />);
|
|
69
|
+
const toggle = screen.getByRole('switch');
|
|
70
|
+
|
|
71
|
+
fireEvent.keyDown(toggle, { key: 'Enter' });
|
|
72
|
+
expect(toggle).toHaveAttribute('aria-checked', 'true');
|
|
73
|
+
expect(handleChange).toHaveBeenCalledWith(true);
|
|
74
|
+
|
|
75
|
+
fireEvent.keyDown(toggle, { key: ' ' });
|
|
76
|
+
expect(toggle).toHaveAttribute('aria-checked', 'false');
|
|
77
|
+
expect(handleChange).toHaveBeenCalledWith(false);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('applies accessibility attributes', () => {
|
|
81
|
+
render(
|
|
82
|
+
<Toggle
|
|
83
|
+
aria-label="Accessible Toggle"
|
|
84
|
+
aria-describedby="description-id"
|
|
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
|
+
});
|
|
91
|
+
});
|