@shohojdhara/atomix 0.3.13 → 0.3.15

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.
Files changed (249) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +2 -0
  3. package/build-tools/EXAMPLES.md +372 -0
  4. package/build-tools/README.md +242 -0
  5. package/build-tools/__tests__/error-handler.test.js +230 -0
  6. package/build-tools/__tests__/index.test.js +141 -0
  7. package/build-tools/__tests__/rollup-plugin.test.js +194 -0
  8. package/build-tools/__tests__/utils.test.js +161 -0
  9. package/build-tools/__tests__/vite-plugin.test.js +129 -0
  10. package/build-tools/__tests__/webpack-loader.test.js +190 -0
  11. package/build-tools/error-handler.js +308 -0
  12. package/build-tools/index.d.ts +43 -0
  13. package/build-tools/index.js +88 -0
  14. package/build-tools/package.json +67 -0
  15. package/build-tools/rollup-plugin.js +236 -0
  16. package/build-tools/types.d.ts +163 -0
  17. package/build-tools/utils.js +203 -0
  18. package/build-tools/vite-plugin.js +161 -0
  19. package/build-tools/webpack-loader.js +123 -0
  20. package/dist/atomix.css +298 -167
  21. package/dist/atomix.css.map +1 -1
  22. package/dist/atomix.min.css +3 -3
  23. package/dist/atomix.min.css.map +1 -1
  24. package/dist/build-tools/EXAMPLES.md +372 -0
  25. package/dist/build-tools/README.md +242 -0
  26. package/dist/build-tools/__tests__/error-handler.test.js +230 -0
  27. package/dist/build-tools/__tests__/index.test.js +141 -0
  28. package/dist/build-tools/__tests__/rollup-plugin.test.js +194 -0
  29. package/dist/build-tools/__tests__/utils.test.js +161 -0
  30. package/dist/build-tools/__tests__/vite-plugin.test.js +129 -0
  31. package/dist/build-tools/__tests__/webpack-loader.test.js +190 -0
  32. package/dist/build-tools/error-handler.js +308 -0
  33. package/dist/build-tools/index.d.ts +43 -0
  34. package/dist/build-tools/index.js +88 -0
  35. package/dist/build-tools/package.json +67 -0
  36. package/dist/build-tools/rollup-plugin.js +236 -0
  37. package/dist/build-tools/types.d.ts +163 -0
  38. package/dist/build-tools/utils.js +203 -0
  39. package/dist/build-tools/vite-plugin.js +161 -0
  40. package/dist/build-tools/webpack-loader.js +123 -0
  41. package/dist/charts.d.ts +2 -2
  42. package/dist/charts.js +87 -58
  43. package/dist/charts.js.map +1 -1
  44. package/dist/core.d.ts +42 -12
  45. package/dist/core.js +175 -135
  46. package/dist/core.js.map +1 -1
  47. package/dist/forms.d.ts +30 -16
  48. package/dist/forms.js +146 -131
  49. package/dist/forms.js.map +1 -1
  50. package/dist/heavy.d.ts +2 -2
  51. package/dist/heavy.js +151 -118
  52. package/dist/heavy.js.map +1 -1
  53. package/dist/index.d.ts +130 -106
  54. package/dist/index.esm.js +1083 -465
  55. package/dist/index.esm.js.map +1 -1
  56. package/dist/index.js +1102 -483
  57. package/dist/index.js.map +1 -1
  58. package/dist/index.min.js +1 -1
  59. package/dist/index.min.js.map +1 -1
  60. package/dist/theme.d.ts +27 -2
  61. package/dist/theme.js +721 -108
  62. package/dist/theme.js.map +1 -1
  63. package/package.json +23 -8
  64. package/scripts/atomix-cli.js +749 -1153
  65. package/scripts/cli/__tests__/README.md +81 -0
  66. package/scripts/cli/__tests__/basic.test.js +115 -0
  67. package/scripts/cli/__tests__/component-generator.test.js +332 -0
  68. package/scripts/cli/__tests__/integration.test.js +327 -0
  69. package/scripts/cli/__tests__/test-setup.js +133 -0
  70. package/scripts/cli/__tests__/token-manager.test.js +251 -0
  71. package/scripts/cli/__tests__/utils.test.js +78 -118
  72. package/scripts/cli/component-generator.js +564 -0
  73. package/scripts/cli/dependency-checker.js +355 -0
  74. package/scripts/cli/documentation-sync.js +542 -0
  75. package/scripts/cli/interactive-init.js +129 -292
  76. package/scripts/cli/mappings.js +211 -0
  77. package/scripts/cli/migration-tools.js +95 -288
  78. package/scripts/cli/template-manager.js +105 -0
  79. package/scripts/cli/templates/README.md +123 -0
  80. package/scripts/cli/templates/common-templates.js +636 -0
  81. package/scripts/cli/templates/composable-templates.js +171 -0
  82. package/scripts/cli/templates/config-templates.js +126 -0
  83. package/scripts/cli/templates/index.js +102 -0
  84. package/scripts/cli/templates/project-templates.js +342 -0
  85. package/scripts/cli/templates/react-templates.js +331 -0
  86. package/scripts/cli/templates/scss-templates.js +155 -0
  87. package/scripts/cli/templates/storybook-templates.js +236 -0
  88. package/scripts/cli/templates/testing-templates.js +224 -0
  89. package/scripts/cli/templates/testing-utils.js +278 -0
  90. package/scripts/cli/templates/token-templates.js +447 -0
  91. package/scripts/cli/templates/types-templates.js +147 -0
  92. package/scripts/cli/templates.js +35 -0
  93. package/scripts/cli/theme-bridge.js +28 -16
  94. package/scripts/cli/token-manager.js +432 -247
  95. package/scripts/cli/utils.js +37 -26
  96. package/src/components/Accordion/Accordion.stories.tsx +369 -870
  97. package/src/components/Accordion/Accordion.test.tsx +57 -0
  98. package/src/components/Accordion/Accordion.tsx +4 -0
  99. package/src/components/AtomixGlass/AtomixGlass.tsx +80 -39
  100. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +103 -81
  101. package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +8 -7
  102. package/src/components/AtomixGlass/glass-utils.ts +2 -2
  103. package/src/components/AtomixGlass/shader-utils.ts +5 -0
  104. package/src/components/AtomixGlass/stories/Customization.stories.tsx +131 -0
  105. package/src/components/AtomixGlass/stories/Examples.stories.tsx +2965 -2861
  106. package/src/components/AtomixGlass/stories/Modes.stories.tsx +1 -1
  107. package/src/components/AtomixGlass/stories/Overview.stories.tsx +348 -0
  108. package/src/components/AtomixGlass/stories/Performance.stories.tsx +103 -0
  109. package/src/components/AtomixGlass/stories/Playground.stories.tsx +73 -59
  110. package/src/components/AtomixGlass/stories/{ShaderVariants.stories.tsx → Shaders.stories.tsx} +1 -1
  111. package/src/components/AtomixGlass/stories/shared-components.tsx +90 -190
  112. package/src/components/Avatar/Avatar.stories.tsx +239 -27
  113. package/src/components/Badge/Badge.stories.tsx +132 -373
  114. package/src/components/Badge/Badge.test.tsx +51 -0
  115. package/src/components/Badge/Badge.tsx +20 -1
  116. package/src/components/Block/Block.stories.tsx +26 -17
  117. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +141 -23
  118. package/src/components/Breadcrumb/Breadcrumb.tsx +2 -2
  119. package/src/components/Button/Button.stories.tsx +463 -1126
  120. package/src/components/Button/Button.test.tsx +107 -0
  121. package/src/components/Button/Button.tsx +50 -54
  122. package/src/components/Button/ButtonGroup.stories.tsx +373 -217
  123. package/src/components/Button/README.md +5 -0
  124. package/src/components/Callout/Callout.stories.tsx +299 -644
  125. package/src/components/Callout/Callout.test.tsx +10 -10
  126. package/src/components/Callout/Callout.tsx +7 -7
  127. package/src/components/Callout/README.md +9 -8
  128. package/src/components/Card/Card.stories.tsx +248 -68
  129. package/src/components/Card/Card.tsx +2 -2
  130. package/src/components/Chart/Chart.stories.tsx +156 -14
  131. package/src/components/Chart/Chart.tsx +1 -1
  132. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +151 -69
  133. package/src/components/Countdown/Countdown.stories.tsx +115 -8
  134. package/src/components/DataTable/DataTable.stories.tsx +346 -146
  135. package/src/components/DataTable/DataTable.tsx +14 -12
  136. package/src/components/DatePicker/DatePicker.stories.tsx +325 -1066
  137. package/src/components/Dropdown/Dropdown.stories.tsx +157 -37
  138. package/src/components/EdgePanel/EdgePanel.stories.tsx +230 -21
  139. package/src/components/Footer/Footer.stories.tsx +392 -328
  140. package/src/components/Form/Checkbox.stories.tsx +143 -9
  141. package/src/components/Form/Checkbox.test.tsx +63 -0
  142. package/src/components/Form/Checkbox.tsx +90 -52
  143. package/src/components/Form/Form.stories.tsx +121 -22
  144. package/src/components/Form/FormGroup.stories.tsx +128 -5
  145. package/src/components/Form/Input.stories.tsx +28 -16
  146. package/src/components/Form/Input.test.tsx +59 -0
  147. package/src/components/Form/Input.tsx +97 -95
  148. package/src/components/Form/Radio.stories.tsx +232 -97
  149. package/src/components/Form/Radio.tsx +2 -2
  150. package/src/components/Form/Select.stories.tsx +144 -12
  151. package/src/components/Form/Select.tsx +2 -2
  152. package/src/components/Form/Textarea.stories.tsx +171 -13
  153. package/src/components/Form/Textarea.test.tsx +45 -0
  154. package/src/components/Form/Textarea.tsx +88 -86
  155. package/src/components/Hero/Hero.stories.tsx +333 -32
  156. package/src/components/List/List.stories.tsx +143 -5
  157. package/src/components/Modal/Modal.stories.tsx +185 -46
  158. package/src/components/Navigation/Navbar/Navbar.stories.tsx +5 -5
  159. package/src/components/Navigation/Navbar/Navbar.tsx +1 -1
  160. package/src/components/Navigation/README.md +1 -1
  161. package/src/components/Pagination/Pagination.stories.tsx +5 -2
  162. package/src/components/Pagination/Pagination.tsx +1 -1
  163. package/src/components/PhotoViewer/PhotoViewer.stories.tsx +10 -10
  164. package/src/components/Popover/Popover.stories.tsx +449 -99
  165. package/src/components/ProductReview/ProductReview.tsx +1 -1
  166. package/src/components/Progress/Progress.stories.tsx +167 -5
  167. package/src/components/Progress/Progress.tsx +46 -46
  168. package/src/components/Rating/Rating.stories.tsx +4 -4
  169. package/src/components/Rating/Rating.tsx +8 -8
  170. package/src/components/River/River.stories.tsx +1 -1
  171. package/src/components/SectionIntro/SectionIntro.stories.tsx +240 -48
  172. package/src/components/Slider/Slider.stories.tsx +63 -63
  173. package/src/components/Spinner/Spinner.stories.tsx +104 -10
  174. package/src/components/Spinner/Spinner.test.tsx +35 -0
  175. package/src/components/Spinner/Spinner.tsx +9 -2
  176. package/src/components/Steps/Steps.stories.tsx +172 -43
  177. package/src/components/Tabs/Tabs.stories.tsx +136 -10
  178. package/src/components/Testimonial/Testimonial.stories.tsx +121 -4
  179. package/src/components/Todo/Todo.stories.tsx +198 -9
  180. package/src/components/Toggle/Toggle.stories.tsx +153 -43
  181. package/src/components/Toggle/Toggle.test.tsx +91 -0
  182. package/src/components/Toggle/Toggle.tsx +44 -27
  183. package/src/components/Tooltip/Tooltip.stories.tsx +194 -104
  184. package/src/components/Tooltip/Tooltip.tsx +1 -1
  185. package/src/components/Upload/Upload.stories.tsx +113 -24
  186. package/src/layouts/Grid/Grid.stories.tsx +49 -49
  187. package/src/layouts/MasonryGrid/MasonryGrid.stories.tsx +2 -2
  188. package/src/lib/README.md +2 -2
  189. package/src/lib/__tests__/theme-tools.test.ts +193 -0
  190. package/src/lib/composables/index.ts +2 -2
  191. package/src/lib/composables/useAccordion.ts +12 -3
  192. package/src/lib/composables/useAtomixGlass.ts +28 -56
  193. package/src/lib/composables/useBreadcrumb.ts +2 -2
  194. package/src/lib/composables/useCallout.ts +7 -7
  195. package/src/lib/composables/useChartExport.ts +2 -7
  196. package/src/lib/composables/useDataTable.ts +46 -29
  197. package/src/lib/composables/useNavbar.ts +1 -1
  198. package/src/lib/constants/components.ts +10 -33
  199. package/src/lib/storybook/InteractiveDemo.tsx +113 -0
  200. package/src/lib/storybook/PreviewContainer.tsx +36 -0
  201. package/src/lib/storybook/VariantsGrid.tsx +21 -0
  202. package/src/lib/storybook/index.ts +3 -0
  203. package/src/lib/theme/core/createThemeObject.ts +9 -5
  204. package/src/lib/theme/devtools/CLI.ts +155 -0
  205. package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +213 -0
  206. package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +566 -0
  207. package/src/lib/theme/devtools/LiveEditor.tsx +2 -1
  208. package/src/lib/theme/devtools/index.ts +3 -0
  209. package/src/lib/theme/errors/errors.ts +8 -0
  210. package/src/lib/theme/runtime/ThemeProvider.tsx +117 -57
  211. package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +305 -0
  212. package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +588 -0
  213. package/src/lib/theme/utils/__tests__/themeValidation.test.ts +264 -0
  214. package/src/lib/theme/utils/index.ts +1 -0
  215. package/src/lib/theme/utils/themeValidation.ts +501 -0
  216. package/src/lib/theme-tools.ts +32 -3
  217. package/src/lib/types/components.ts +82 -27
  218. package/src/lib/utils/__tests__/csv.test.ts +45 -0
  219. package/src/lib/utils/csv.ts +17 -0
  220. package/src/lib/utils/dataTableExport.ts +1 -10
  221. package/src/lib/utils/themeNaming.ts +1 -1
  222. package/src/styles/01-settings/_index.scss +2 -1
  223. package/src/styles/01-settings/_settings.accordion.scss +28 -7
  224. package/src/styles/01-settings/_settings.colors.scss +11 -11
  225. package/src/styles/01-settings/_settings.typography.scss +5 -5
  226. package/src/styles/02-tools/_tools.utility-api.scss +14 -0
  227. package/src/styles/06-components/_components.accordion.scss +56 -14
  228. package/src/styles/06-components/_components.callout.scss +29 -33
  229. package/src/styles/06-components/_components.checkbox.scss +23 -17
  230. package/src/styles/06-components/_index.scss +1 -1
  231. package/src/styles/99-utilities/_index.scss +2 -0
  232. package/src/styles/99-utilities/_utilities.display.scss +14 -3
  233. package/src/styles/99-utilities/_utilities.flex.scss +10 -10
  234. package/src/styles/99-utilities/_utilities.scss +3 -1
  235. package/src/styles/99-utilities/_utilities.text-gradient.scss +45 -0
  236. package/src/styles/99-utilities/_utilities.text.scss +28 -8
  237. package/themes/dark-complementary/README.md +98 -0
  238. package/themes/dark-complementary/index.scss +158 -0
  239. package/themes/default-light/README.md +81 -0
  240. package/themes/default-light/index.scss +154 -0
  241. package/themes/high-contrast/README.md +105 -0
  242. package/themes/high-contrast/index.scss +172 -0
  243. package/themes/test-theme/README.md +38 -0
  244. package/themes/test-theme/index.scss +47 -0
  245. package/scripts/cli/__tests__/cli-commands.test.js +0 -204
  246. package/scripts/cli/__tests__/vitest.config.js +0 -26
  247. package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +0 -1438
  248. package/src/lib/composables/useButton.ts +0 -93
  249. package/src/lib/composables/useCheckbox.ts +0 -70
@@ -60,8 +60,8 @@ const basicSlides: SliderSlide[] = [
60
60
  }}
61
61
  >
62
62
  <div className="u-text-center">
63
- <h2 className="u-fs-3 u-c-white u-mb-3">Welcome to Atomix</h2>
64
- <p className="u-fs-base u-c-white u-mb-4">
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-fs-3 u-c-white u-mb-3">Flexible Components</h2>
88
- <p className="u-fs-base u-c-white u-mb-4">
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-fs-3 u-c-white u-mb-3">Easy to Use</h2>
112
- <p className="u-fs-base u-c-white u-mb-4">Simple API and comprehensive documentation</p>
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-fs-3 u-c-white u-mb-3">Fully Responsive</h2>
134
- <p className="u-fs-base u-c-white u-mb-4">
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-fs-3 u-c-white u-mb-3">Accessible Design</h2>
158
- <p className="u-fs-base u-c-white u-mb-4">WCAG 2.1 AA compliant for all users</p>
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-fs-3 u-c-white u-mb-3">Themeable</h2>
180
- <p className="u-fs-base u-c-white u-mb-4">
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-fs-3 u-c-white u-mb-3">Performance Focused</h2>
204
- <p className="u-fs-base u-c-white u-mb-4">
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-fs-3 u-c-white u-mb-3">Developer Friendly</h2>
228
- <p className="u-fs-base u-c-white u-mb-4">Well documented with clear APIs and examples</p>
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-fs-3 u-c-white u-mb-3">Modular Components</h2>
250
- <p className="u-fs-base u-c-white u-mb-4">
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-fs-3 u-c-white u-mb-3">Cross Browser</h2>
274
- <p className="u-fs-base u-c-white u-mb-4">
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-fs-3 u-c-white u-mb-3">RTL Support</h2>
298
- <p className="u-fs-base u-c-white u-mb-4">Full right-to-left language support built-in</p>
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-fs-3 u-c-white u-mb-3">Open Source</h2>
320
- <p className="u-fs-base u-c-white u-mb-4">Free to use and contribute to the community</p>
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-fs-4 u-fw-bold u-mb-2">Premium Plan</h3>
345
- <p className="u-fs-sm u-c-muted u-mb-3">Perfect for small teams and growing businesses</p>
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-fs-1 u-fw-bold">$29</span>
348
- <span className="u-fs-sm u-c-muted">/month</span>
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-fs-4 u-fw-bold u-mb-2">Business Plan</h3>
372
- <p className="u-fs-sm u-c-muted u-mb-3">For established teams with advanced needs</p>
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-fs-1 u-fw-bold">$79</span>
375
- <span className="u-fs-sm u-c-muted">/month</span>
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-fs-4 u-fw-bold u-mb-2">Enterprise Plan</h3>
399
- <p className="u-fs-sm u-c-muted u-mb-3">Custom solutions for large organizations</p>
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-fs-1 u-fw-bold">Custom</span>
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-fs-4 u-fw-bold u-mb-2">Developer Plan</h3>
425
- <p className="u-fs-sm u-c-muted u-mb-3">For developers and technical teams</p>
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-fs-1 u-fw-bold">$49</span>
428
- <span className="u-fs-sm u-c-muted">/month</span>
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-d-flex u-justify-content-center">
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-fs-base u-fst-italic u-mb-4">
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-fs-4 u-fw-bold">Jane Cooper</h4>
461
- <p className="u-fs-sm u-c-muted">Product Designer, TechCorp</p>
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-d-flex u-justify-content-center">
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-fs-base u-fst-italic u-mb-4">
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-fs-4 u-fw-bold">John Doe</h4>
486
- <p className="u-fs-sm u-c-muted">Frontend Developer, StartupX</p>
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-d-flex u-justify-content-center">
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-fs-base u-fst-italic u-mb-4">
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-fs-4 u-fw-bold">Sarah Johnson</h4>
511
- <p className="u-fs-sm u-c-muted">Accessibility Lead, InclusiveTech</p>
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-d-flex u-flex-column u-justify-content-center u-p-5">
526
- <h2 className="u-fs-3 u-fw-bold u-mb-3">Responsive Design</h2>
527
- <p className="u-fs-base u-c-muted u-mb-4">
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-d-flex u-align-items-center u-justify-content-center u-p-5">
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-d-flex u-flex-column u-justify-content-center u-p-5">
562
- <h2 className="u-fs-3 u-fw-bold u-mb-3">Accessibility</h2>
563
- <p className="u-fs-base u-c-muted u-mb-4">
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-d-flex u-align-items-center u-justify-content-center u-p-5">
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-d-flex u-flex-column u-justify-content-center u-p-5">
598
- <h2 className="u-fs-3 u-fw-bold u-mb-3">Customizable</h2>
599
- <p className="u-fs-base u-c-muted u-mb-4">
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-d-flex u-align-items-center u-justify-content-center u-p-5">
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={{
@@ -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 { Spinner } from './Spinner';
4
5
  import { THEME_COLORS, SIZES } from '../../lib/constants/components';
5
6
 
@@ -10,8 +11,56 @@ const meta = {
10
11
  layout: 'centered',
11
12
  docs: {
12
13
  description: {
13
- component:
14
- 'The Spinner component provides visual feedback during loading states. It displays an animated loading indicator that can be customized with different variants and sizes. Use spinners to indicate that content is being loaded or processed.',
14
+ component: `
15
+ # Spinner
16
+
17
+ ## Overview
18
+
19
+ Spinner provides visual feedback during loading states. It displays an animated loading indicator that can be customized with different variants and sizes. Use spinners to indicate that content is being loaded or processed.
20
+
21
+ ## Features
22
+
23
+ - Multiple color variants
24
+ - Multiple size options
25
+ - Fullscreen mode
26
+ - Smooth animations
27
+ - Accessible design
28
+ - Responsive behavior
29
+
30
+ ## Accessibility
31
+
32
+ - Screen reader: Loading state announced appropriately
33
+ - ARIA support: Proper roles and properties for spinner components
34
+ - Keyboard support: Accessible via keyboard navigation
35
+ - Focus management: Focus indicators maintained for interactive elements
36
+
37
+ ## Usage Examples
38
+
39
+ ### Basic Usage
40
+
41
+ \`\`\`tsx
42
+ <Spinner />
43
+ \`\`\`
44
+
45
+ ### With Variant and Size
46
+
47
+ \`\`\`tsx
48
+ <Spinner
49
+ variant="primary"
50
+ size="lg"
51
+ />
52
+ \`\`\`
53
+
54
+ ## API Reference
55
+
56
+ ### Props
57
+
58
+ | Prop | Type | Default | Description |
59
+ | ---- | ---- | ------- | ----------- |
60
+ | variant | ThemeColor | 'primary' | The color variant of the spinner |
61
+ | size | 'sm' \\| 'md' \\| 'lg' | 'md' | The size of the spinner |
62
+ | fullscreen | boolean | false | Whether the spinner should be centered and fixed in the viewport |
63
+ `,
15
64
  },
16
65
  },
17
66
  },
@@ -21,15 +70,27 @@ const meta = {
21
70
  control: { type: 'select' },
22
71
  options: THEME_COLORS,
23
72
  description: 'The color variant of the spinner',
73
+ table: {
74
+ type: { summary: 'ThemeColor' },
75
+ defaultValue: { summary: 'primary' },
76
+ },
24
77
  },
25
78
  size: {
26
79
  control: { type: 'select' },
27
80
  options: SIZES,
28
81
  description: 'The size of the spinner',
82
+ table: {
83
+ type: { summary: '"sm" | "md" | "lg"' },
84
+ defaultValue: { summary: 'md' },
85
+ },
29
86
  },
30
87
  fullscreen: {
31
88
  control: 'boolean',
32
89
  description: 'Whether the spinner should be centered and fixed in the viewport',
90
+ table: {
91
+ type: { summary: 'boolean' },
92
+ defaultValue: { summary: false },
93
+ },
33
94
  },
34
95
  },
35
96
  } satisfies Meta<typeof Spinner>;
@@ -37,33 +98,66 @@ const meta = {
37
98
  export default meta;
38
99
  type Story = StoryObj<typeof meta>;
39
100
 
40
- // Default Spinner
41
- export const Default: Story = {
101
+ export const BasicUsage: Story = {
42
102
  args: {
43
103
  variant: 'primary',
44
104
  size: 'md',
45
105
  fullscreen: false,
46
106
  },
107
+ parameters: {
108
+ docs: {
109
+ description: {
110
+ story: 'Basic spinner with default settings.',
111
+ },
112
+ },
113
+ },
47
114
  };
48
115
 
49
- // Size Variants
50
- export const Sizes: Story = {
116
+ export const AllSizes: Story = {
51
117
  render: () => (
52
- <div className="u-d-flex u-flex-wrap u-gap-3 u-align-items-center">
118
+ <div className="u-flex u-flex-wrap u-gap-3 u-items-center">
53
119
  <Spinner size="sm" />
54
120
  <Spinner size="md" />
55
121
  <Spinner size="lg" />
56
122
  </div>
57
123
  ),
124
+ parameters: {
125
+ docs: {
126
+ description: {
127
+ story: 'Spinner in all available sizes.',
128
+ },
129
+ },
130
+ },
58
131
  };
59
132
 
60
- // Color Variants
61
- export const ColorVariants: Story = {
133
+ export const AllVariants: Story = {
62
134
  render: () => (
63
- <div className="u-d-flex u-flex-wrap u-gap-3 u-align-items-center">
135
+ <div className="u-flex u-flex-wrap u-gap-3 u-items-center">
64
136
  {THEME_COLORS.map(color => (
65
137
  <Spinner key={color} variant={color} />
66
138
  ))}
67
139
  </div>
68
140
  ),
141
+ parameters: {
142
+ docs: {
143
+ description: {
144
+ story: 'Spinner in all available color variants.',
145
+ },
146
+ },
147
+ },
148
+ };
149
+
150
+ export const Fullscreen: Story = {
151
+ render: () => (
152
+ <div style={{ height: '200px', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
153
+ <Spinner fullscreen={true} variant="primary" size="lg" />
154
+ </div>
155
+ ),
156
+ parameters: {
157
+ docs: {
158
+ description: {
159
+ story: 'Fullscreen spinner centered in the viewport.',
160
+ },
161
+ },
162
+ },
69
163
  };
@@ -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 className={spinnerClass} style={style} role="status">
30
- <span className={SPINNER.VISUALLY_HIDDEN}>Loading...</span>
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