@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.
Files changed (343) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/build-tools/EXAMPLES.md +372 -0
  3. package/build-tools/README.md +242 -0
  4. package/build-tools/__tests__/error-handler.test.js +230 -0
  5. package/build-tools/__tests__/index.test.js +141 -0
  6. package/build-tools/__tests__/rollup-plugin.test.js +194 -0
  7. package/build-tools/__tests__/utils.test.js +161 -0
  8. package/build-tools/__tests__/vite-plugin.test.js +129 -0
  9. package/build-tools/__tests__/webpack-loader.test.js +190 -0
  10. package/build-tools/error-handler.js +308 -0
  11. package/build-tools/index.d.ts +44 -0
  12. package/build-tools/index.js +88 -0
  13. package/build-tools/package.json +50 -0
  14. package/build-tools/rollup-plugin.js +236 -0
  15. package/build-tools/types.d.ts +163 -0
  16. package/build-tools/utils.js +203 -0
  17. package/build-tools/vite-plugin.js +161 -0
  18. package/build-tools/webpack-loader.js +123 -0
  19. package/dist/atomix.css +21044 -2618
  20. package/dist/atomix.css.map +1 -1
  21. package/dist/atomix.min.css +77 -3
  22. package/dist/atomix.min.css.map +1 -1
  23. package/dist/build-tools/EXAMPLES.md +372 -0
  24. package/dist/build-tools/README.md +242 -0
  25. package/dist/build-tools/__tests__/error-handler.test.js +230 -0
  26. package/dist/build-tools/__tests__/index.test.js +141 -0
  27. package/dist/build-tools/__tests__/rollup-plugin.test.js +194 -0
  28. package/dist/build-tools/__tests__/utils.test.js +161 -0
  29. package/dist/build-tools/__tests__/vite-plugin.test.js +129 -0
  30. package/dist/build-tools/__tests__/webpack-loader.test.js +190 -0
  31. package/dist/build-tools/error-handler.js +308 -0
  32. package/dist/build-tools/index.d.ts +44 -0
  33. package/dist/build-tools/index.js +88 -0
  34. package/dist/build-tools/package.json +50 -0
  35. package/dist/build-tools/rollup-plugin.js +236 -0
  36. package/dist/build-tools/types.d.ts +163 -0
  37. package/dist/build-tools/utils.js +203 -0
  38. package/dist/build-tools/vite-plugin.js +161 -0
  39. package/dist/build-tools/webpack-loader.js +123 -0
  40. package/dist/charts.d.ts +1 -1
  41. package/dist/charts.js +86 -57
  42. package/dist/charts.js.map +1 -1
  43. package/dist/core.d.ts +1 -1
  44. package/dist/core.js +136 -112
  45. package/dist/core.js.map +1 -1
  46. package/dist/forms.d.ts +2 -5
  47. package/dist/forms.js +140 -128
  48. package/dist/forms.js.map +1 -1
  49. package/dist/heavy.d.ts +1 -1
  50. package/dist/heavy.js +136 -112
  51. package/dist/heavy.js.map +1 -1
  52. package/dist/index.d.ts +152 -78
  53. package/dist/index.esm.js +346 -340
  54. package/dist/index.esm.js.map +1 -1
  55. package/dist/index.js +359 -353
  56. package/dist/index.js.map +1 -1
  57. package/dist/index.min.js +1 -1
  58. package/dist/index.min.js.map +1 -1
  59. package/dist/layout.js.map +1 -1
  60. package/dist/theme.d.ts +9 -9
  61. package/dist/theme.js.map +1 -1
  62. package/package.json +23 -8
  63. package/scripts/atomix-cli.js +170 -73
  64. package/scripts/cli/__tests__/README.md +81 -0
  65. package/scripts/cli/__tests__/basic.test.js +115 -0
  66. package/scripts/cli/__tests__/component-generator.test.js +332 -0
  67. package/scripts/cli/__tests__/integration.test.js +327 -0
  68. package/scripts/cli/__tests__/test-setup.js +133 -0
  69. package/scripts/cli/__tests__/token-manager.test.js +251 -0
  70. package/scripts/cli/__tests__/utils.test.js +161 -0
  71. package/scripts/cli/component-generator.js +253 -299
  72. package/scripts/cli/dependency-checker.js +355 -0
  73. package/scripts/cli/interactive-init.js +46 -5
  74. package/scripts/cli/template-manager.js +0 -2
  75. package/scripts/cli/templates/common-templates.js +636 -0
  76. package/scripts/cli/templates/composable-templates.js +148 -126
  77. package/scripts/cli/templates/index.js +23 -16
  78. package/scripts/cli/templates/project-templates.js +151 -23
  79. package/scripts/cli/templates/react-templates.js +280 -210
  80. package/scripts/cli/templates/scss-templates.js +90 -91
  81. package/scripts/cli/templates/testing-templates.js +206 -27
  82. package/scripts/cli/templates/testing-utils.js +278 -0
  83. package/scripts/cli/templates/types-templates.js +70 -56
  84. package/scripts/cli/theme-bridge.js +8 -2
  85. package/scripts/cli/token-manager.js +318 -206
  86. package/scripts/cli/utils.js +0 -1
  87. package/src/components/Accordion/Accordion.stories.tsx +358 -850
  88. package/src/components/Accordion/Accordion.test.tsx +70 -50
  89. package/src/components/Accordion/Accordion.tsx +99 -94
  90. package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
  91. package/src/components/AtomixGlass/AtomixGlass.tsx +80 -39
  92. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +103 -81
  93. package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
  94. package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +8 -7
  95. package/src/components/AtomixGlass/glass-utils.ts +6 -5
  96. package/src/components/AtomixGlass/shader-utils.ts +133 -52
  97. package/src/components/AtomixGlass/stories/Customization.stories.tsx +131 -0
  98. package/src/components/AtomixGlass/stories/Examples.stories.tsx +2957 -2853
  99. package/src/components/AtomixGlass/stories/Modes.stories.tsx +1 -1
  100. package/src/components/AtomixGlass/stories/Overview.stories.tsx +348 -0
  101. package/src/components/AtomixGlass/stories/Performance.stories.tsx +103 -0
  102. package/src/components/AtomixGlass/stories/Playground.stories.tsx +51 -36
  103. package/src/components/AtomixGlass/stories/{ShaderVariants.stories.tsx → Shaders.stories.tsx} +2 -2
  104. package/src/components/AtomixGlass/stories/shared-components.tsx +90 -190
  105. package/src/components/Avatar/Avatar.stories.tsx +195 -0
  106. package/src/components/Avatar/Avatar.tsx +58 -56
  107. package/src/components/Badge/Badge.stories.tsx +122 -352
  108. package/src/components/Badge/Badge.test.tsx +41 -41
  109. package/src/components/Badge/Badge.tsx +64 -62
  110. package/src/components/Block/Block.stories.tsx +30 -11
  111. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +142 -23
  112. package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
  113. package/src/components/Button/Button.stories.tsx +454 -1126
  114. package/src/components/Button/Button.test.tsx +123 -0
  115. package/src/components/Button/Button.tsx +88 -60
  116. package/src/components/Button/ButtonGroup.stories.tsx +376 -215
  117. package/src/components/Button/ButtonGroup.tsx +4 -15
  118. package/src/components/Callout/Callout.stories.tsx +316 -568
  119. package/src/components/Card/Card.stories.tsx +292 -81
  120. package/src/components/Card/Card.tsx +30 -14
  121. package/src/components/Chart/AreaChart.tsx +1 -1
  122. package/src/components/Chart/CandlestickChart.tsx +23 -16
  123. package/src/components/Chart/Chart.stories.tsx +153 -16
  124. package/src/components/Chart/Chart.tsx +40 -44
  125. package/src/components/Chart/ChartRenderer.tsx +39 -12
  126. package/src/components/Chart/ChartToolbar.tsx +21 -5
  127. package/src/components/Chart/DonutChart.tsx +1 -1
  128. package/src/components/Chart/FunnelChart.tsx +4 -1
  129. package/src/components/Chart/GaugeChart.tsx +3 -1
  130. package/src/components/Chart/HeatmapChart.tsx +50 -37
  131. package/src/components/Chart/LineChart.tsx +3 -2
  132. package/src/components/Chart/MultiAxisChart.tsx +24 -16
  133. package/src/components/Chart/RadarChart.tsx +19 -17
  134. package/src/components/Chart/ScatterChart.tsx +29 -21
  135. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +152 -66
  136. package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
  137. package/src/components/Countdown/Countdown.stories.tsx +114 -7
  138. package/src/components/DataTable/DataTable.stories.tsx +349 -144
  139. package/src/components/DataTable/DataTable.test.tsx +26 -148
  140. package/src/components/DataTable/DataTable.tsx +485 -456
  141. package/src/components/DatePicker/DatePicker.stories.tsx +310 -1066
  142. package/src/components/DatePicker/DatePicker.tsx +31 -26
  143. package/src/components/Dropdown/Dropdown.stories.tsx +153 -36
  144. package/src/components/Dropdown/Dropdown.tsx +313 -299
  145. package/src/components/EdgePanel/EdgePanel.stories.tsx +221 -25
  146. package/src/components/EdgePanel/EdgePanel.tsx +1 -3
  147. package/src/components/Footer/Footer.stories.tsx +396 -327
  148. package/src/components/Footer/Footer.tsx +130 -128
  149. package/src/components/Footer/FooterLink.tsx +2 -2
  150. package/src/components/Form/Checkbox.stories.tsx +140 -6
  151. package/src/components/Form/Checkbox.test.tsx +63 -0
  152. package/src/components/Form/Checkbox.tsx +122 -78
  153. package/src/components/Form/Form.stories.tsx +110 -19
  154. package/src/components/Form/FormGroup.stories.tsx +127 -4
  155. package/src/components/Form/Input.stories.tsx +22 -39
  156. package/src/components/Form/Input.test.tsx +38 -44
  157. package/src/components/Form/Radio.stories.tsx +146 -17
  158. package/src/components/Form/Radio.tsx +68 -66
  159. package/src/components/Form/Select.stories.tsx +140 -8
  160. package/src/components/Form/Select.tsx +184 -182
  161. package/src/components/Form/Textarea.stories.tsx +149 -6
  162. package/src/components/Form/Textarea.test.tsx +27 -32
  163. package/src/components/Hero/Hero.stories.tsx +372 -38
  164. package/src/components/Hero/Hero.tsx +201 -55
  165. package/src/components/Icon/index.ts +7 -1
  166. package/src/components/List/List.stories.tsx +141 -3
  167. package/src/components/List/List.tsx +19 -23
  168. package/src/components/Modal/Modal.stories.tsx +183 -43
  169. package/src/components/Modal/Modal.tsx +130 -127
  170. package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
  171. package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
  172. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
  173. package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
  174. package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
  175. package/src/components/Pagination/Pagination.stories.tsx +7 -4
  176. package/src/components/Pagination/Pagination.tsx +199 -202
  177. package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
  178. package/src/components/Popover/Popover.stories.tsx +354 -97
  179. package/src/components/Popover/Popover.tsx +41 -37
  180. package/src/components/Progress/Progress.stories.tsx +160 -7
  181. package/src/components/River/River.stories.tsx +3 -2
  182. package/src/components/SectionIntro/SectionIntro.stories.tsx +239 -47
  183. package/src/components/Slider/Slider.stories.tsx +12 -4
  184. package/src/components/Spinner/Spinner.stories.tsx +104 -8
  185. package/src/components/Spinner/Spinner.test.tsx +23 -23
  186. package/src/components/Spinner/Spinner.tsx +43 -46
  187. package/src/components/Steps/Steps.stories.tsx +173 -42
  188. package/src/components/Tabs/Tabs.stories.tsx +141 -12
  189. package/src/components/Tabs/Tabs.tsx +74 -72
  190. package/src/components/Testimonial/Testimonial.stories.tsx +120 -3
  191. package/src/components/Todo/Todo.stories.tsx +198 -9
  192. package/src/components/Toggle/Toggle.stories.tsx +137 -36
  193. package/src/components/Toggle/Toggle.test.tsx +65 -70
  194. package/src/components/Toggle/Toggle.tsx +4 -1
  195. package/src/components/Tooltip/Tooltip.stories.tsx +194 -100
  196. package/src/components/Tooltip/Tooltip.tsx +104 -106
  197. package/src/components/Upload/Upload.stories.tsx +241 -150
  198. package/src/components/Upload/Upload.tsx +287 -283
  199. package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
  200. package/src/components/index.ts +13 -2
  201. package/src/layouts/Grid/Grid.stories.tsx +9 -3
  202. package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
  203. package/src/lib/README.md +2 -2
  204. package/src/lib/__tests__/theme-tools.test.ts +219 -0
  205. package/src/lib/composables/index.ts +2 -2
  206. package/src/lib/composables/shared-mouse-tracker.ts +13 -14
  207. package/src/lib/composables/useAtomixGlass.ts +126 -97
  208. package/src/lib/composables/useChartExport.ts +3 -8
  209. package/src/lib/composables/useDataTable.ts +72 -43
  210. package/src/lib/composables/useHero.ts +58 -14
  211. package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
  212. package/src/lib/composables/useInput.ts +10 -8
  213. package/src/lib/composables/useSideMenu.ts +6 -5
  214. package/src/lib/composables/useTooltip.ts +1 -2
  215. package/src/lib/composables/useVideoPlayer.ts +44 -35
  216. package/src/lib/config/index.ts +154 -154
  217. package/src/lib/constants/components.ts +9 -32
  218. package/src/lib/constants/cssVariables.ts +29 -29
  219. package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
  220. package/src/lib/hooks/index.ts +1 -1
  221. package/src/lib/hooks/useComponentCustomization.ts +11 -17
  222. package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
  223. package/src/lib/patterns/__tests__/slots.test.ts +1 -1
  224. package/src/lib/patterns/index.ts +1 -1
  225. package/src/lib/patterns/slots.tsx +8 -13
  226. package/src/lib/storybook/InteractiveDemo.tsx +13 -18
  227. package/src/lib/storybook/PreviewContainer.tsx +1 -1
  228. package/src/lib/storybook/VariantsGrid.tsx +3 -7
  229. package/src/lib/storybook/index.ts +1 -1
  230. package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
  231. package/src/lib/theme/adapters/index.ts +3 -9
  232. package/src/lib/theme/adapters/themeAdapter.ts +41 -26
  233. package/src/lib/theme/config/index.ts +1 -1
  234. package/src/lib/theme/config/types.ts +2 -2
  235. package/src/lib/theme/config/validator.ts +10 -5
  236. package/src/lib/theme/constants/constants.ts +2 -2
  237. package/src/lib/theme/constants/index.ts +1 -2
  238. package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
  239. package/src/lib/theme/core/composeTheme.ts +32 -26
  240. package/src/lib/theme/core/createTheme.ts +1 -1
  241. package/src/lib/theme/core/createThemeObject.ts +308 -301
  242. package/src/lib/theme/core/index.ts +3 -3
  243. package/src/lib/theme/devtools/CLI.ts +107 -105
  244. package/src/lib/theme/devtools/Comparator.tsx +50 -32
  245. package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
  246. package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
  247. package/src/lib/theme/devtools/Inspector.tsx +75 -60
  248. package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
  249. package/src/lib/theme/devtools/Preview.tsx +150 -106
  250. package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
  251. package/src/lib/theme/devtools/index.ts +3 -9
  252. package/src/lib/theme/devtools/useHistory.ts +23 -21
  253. package/src/lib/theme/errors/errors.ts +12 -11
  254. package/src/lib/theme/errors/index.ts +2 -7
  255. package/src/lib/theme/generators/generateCSS.ts +9 -13
  256. package/src/lib/theme/generators/generateCSSNested.ts +1 -6
  257. package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
  258. package/src/lib/theme/generators/index.ts +1 -4
  259. package/src/lib/theme/i18n/index.ts +1 -1
  260. package/src/lib/theme/i18n/rtl.ts +13 -13
  261. package/src/lib/theme/index.ts +7 -16
  262. package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
  263. package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
  264. package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
  265. package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
  266. package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
  267. package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
  268. package/src/lib/theme/runtime/index.ts +2 -5
  269. package/src/lib/theme/runtime/useTheme.ts +18 -18
  270. package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
  271. package/src/lib/theme/test/testTheme.ts +15 -16
  272. package/src/lib/theme/tokens/index.ts +2 -7
  273. package/src/lib/theme/tokens/tokens.ts +25 -24
  274. package/src/lib/theme/types.ts +428 -411
  275. package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
  276. package/src/lib/theme/utils/componentTheming.ts +18 -18
  277. package/src/lib/theme/utils/domUtils.ts +277 -289
  278. package/src/lib/theme/utils/index.ts +1 -2
  279. package/src/lib/theme/utils/injectCSS.ts +10 -14
  280. package/src/lib/theme/utils/naming.ts +20 -16
  281. package/src/lib/theme/utils/themeHelpers.ts +10 -12
  282. package/src/lib/theme/utils/themeUtils.ts +85 -86
  283. package/src/lib/theme/utils/themeValidation.ts +82 -33
  284. package/src/lib/theme-tools.ts +8 -6
  285. package/src/lib/types/components.ts +172 -71
  286. package/src/lib/types/partProps.ts +1 -1
  287. package/src/lib/utils/__tests__/csv.test.ts +45 -0
  288. package/src/lib/utils/componentUtils.ts +8 -12
  289. package/src/lib/utils/csv.ts +19 -0
  290. package/src/lib/utils/dataTableExport.ts +2 -15
  291. package/src/lib/utils/fontPreloader.ts +10 -19
  292. package/src/lib/utils/icons.ts +4 -1
  293. package/src/lib/utils/index.ts +2 -6
  294. package/src/lib/utils/memoryMonitor.ts +10 -8
  295. package/src/lib/utils/themeNaming.ts +2 -2
  296. package/src/styles/01-settings/_index.scss +1 -1
  297. package/src/styles/01-settings/_settings.accordion.scss +28 -7
  298. package/src/styles/01-settings/_settings.colors.scss +11 -11
  299. package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
  300. package/src/styles/01-settings/_settings.navbar.scss +1 -1
  301. package/src/styles/01-settings/_settings.spacing.scss +3 -4
  302. package/src/styles/01-settings/_settings.tooltip.scss +1 -1
  303. package/src/styles/01-settings/_settings.typography.scss +4 -4
  304. package/src/styles/02-tools/_tools.button.scss +51 -21
  305. package/src/styles/02-tools/_tools.utility-api.scss +38 -12
  306. package/src/styles/03-generic/_generic.root.scss +4 -3
  307. package/src/styles/06-components/_components.accordion.scss +56 -14
  308. package/src/styles/06-components/_components.atomix-glass.scss +13 -9
  309. package/src/styles/06-components/_components.button.scss +16 -4
  310. package/src/styles/06-components/_components.callout.scss +27 -21
  311. package/src/styles/06-components/_components.card.scss +5 -14
  312. package/src/styles/06-components/_components.chart.scss +22 -19
  313. package/src/styles/06-components/_components.checkbox.scss +25 -17
  314. package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
  315. package/src/styles/06-components/_components.edge-panel.scss +9 -2
  316. package/src/styles/06-components/_components.footer.scss +1 -1
  317. package/src/styles/06-components/_components.side-menu.scss +5 -5
  318. package/src/styles/06-components/_components.toggle.scss +18 -0
  319. package/src/styles/06-components/_index.scss +1 -1
  320. package/src/styles/06-components/old.chart.styles.scss +0 -2
  321. package/src/styles/99-utilities/_index.scss +2 -0
  322. package/src/styles/99-utilities/_utilities.border.scss +69 -27
  323. package/src/styles/99-utilities/_utilities.display.scss +1 -1
  324. package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
  325. package/src/styles/99-utilities/_utilities.position.scss +16 -9
  326. package/src/styles/99-utilities/_utilities.scss +2 -0
  327. package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
  328. package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
  329. package/src/styles/99-utilities/_utilities.text-gradient.scss +45 -0
  330. package/src/styles/99-utilities/_utilities.text.scss +67 -46
  331. package/themes/dark-complementary/README.md +98 -0
  332. package/themes/dark-complementary/index.scss +158 -0
  333. package/themes/default-light/README.md +81 -0
  334. package/themes/default-light/index.scss +154 -0
  335. package/themes/high-contrast/README.md +105 -0
  336. package/themes/high-contrast/index.scss +172 -0
  337. package/themes/test-theme/README.md +38 -0
  338. package/themes/test-theme/index.scss +47 -0
  339. package/scripts/cli/templates-original-backup.js +0 -1655
  340. package/scripts/cli/templates_backup.js +0 -684
  341. package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +0 -1438
  342. package/src/lib/composables/useButton.ts +0 -93
  343. 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 { 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,17 +98,22 @@ 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
118
  <div className="u-flex u-flex-wrap u-gap-3 u-items-center">
53
119
  <Spinner size="sm" />
@@ -55,10 +121,16 @@ export const Sizes: Story = {
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
135
  <div className="u-flex u-flex-wrap u-gap-3 u-items-center">
64
136
  {THEME_COLORS.map(color => (
@@ -66,4 +138,28 @@ export const ColorVariants: Story = {
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
153
+ style={{ height: '200px', display: 'flex', alignItems: 'center', justifyContent: 'center' }}
154
+ >
155
+ <Spinner fullscreen={true} variant="primary" size="lg" />
156
+ </div>
157
+ ),
158
+ parameters: {
159
+ docs: {
160
+ description: {
161
+ story: 'Fullscreen spinner centered in the viewport.',
162
+ },
163
+ },
164
+ },
69
165
  };
@@ -4,32 +4,32 @@ import { Spinner } from './Spinner';
4
4
 
5
5
  // Mock AtomixGlass component
6
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
- ),
7
+ AtomixGlass: ({ children, ...props }: any) => (
8
+ <div data-testid="atomix-glass" data-glass-props={JSON.stringify(props)}>
9
+ {children}
10
+ </div>
11
+ ),
12
12
  }));
13
13
 
14
14
  describe('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
- });
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
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
- });
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
30
 
31
- it('renders as glass when enabled', () => {
32
- render(<Spinner glass />);
33
- expect(screen.getByTestId('atomix-glass')).toBeInTheDocument();
34
- });
31
+ it('renders as glass when enabled', () => {
32
+ render(<Spinner glass />);
33
+ expect(screen.getByTestId('atomix-glass')).toBeInTheDocument();
34
+ });
35
35
  });
@@ -4,53 +4,50 @@ import { useSpinner } from '../../lib/composables/useSpinner';
4
4
  import { SPINNER } from '../../lib/constants/components';
5
5
  import { AtomixGlass } from '../AtomixGlass/AtomixGlass';
6
6
 
7
- export const Spinner: React.FC<SpinnerProps> = memo(({
8
- size = 'md',
9
- variant = 'primary',
10
- fullscreen = false,
11
- className = '',
12
- style,
13
- glass,
14
- 'aria-label': ariaLabel,
15
- role = 'status',
16
- }) => {
17
- const { generateSpinnerClass } = useSpinner({
18
- size,
19
- variant,
20
- fullscreen,
21
- });
22
-
23
- const spinnerClass = generateSpinnerClass({
24
- size,
25
- variant,
26
- fullscreen,
27
- className: `${className} ${glass ? 'c-spinner--glass' : ''}`.trim(),
28
- });
29
-
30
- const spinnerContent = (
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>
38
- </div>
39
- );
40
-
41
- if (glass) {
42
- const defaultGlassProps = {
43
- displacementScale: 20,
44
- blurAmount: 1,
45
- cornerRadius: 999,
46
- mode: 'shader' as const,
47
- };
48
- const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
49
- return <AtomixGlass {...glassProps}>{spinnerContent}</AtomixGlass>;
7
+ export const Spinner: React.FC<SpinnerProps> = memo(
8
+ ({
9
+ size = 'md',
10
+ variant = 'primary',
11
+ fullscreen = false,
12
+ className = '',
13
+ style,
14
+ glass,
15
+ 'aria-label': ariaLabel,
16
+ role = 'status',
17
+ }) => {
18
+ const { generateSpinnerClass } = useSpinner({
19
+ size,
20
+ variant,
21
+ fullscreen,
22
+ });
23
+
24
+ const spinnerClass = generateSpinnerClass({
25
+ size,
26
+ variant,
27
+ fullscreen,
28
+ className: `${className} ${glass ? 'c-spinner--glass' : ''}`.trim(),
29
+ });
30
+
31
+ const spinnerContent = (
32
+ <div className={spinnerClass} style={style} role={role} aria-label={ariaLabel || 'Loading'}>
33
+ <span className={SPINNER.VISUALLY_HIDDEN}>{ariaLabel || 'Loading...'}</span>
34
+ </div>
35
+ );
36
+
37
+ if (glass) {
38
+ const defaultGlassProps = {
39
+ displacementScale: 20,
40
+ blurAmount: 1,
41
+ cornerRadius: 999,
42
+ mode: 'shader' as const,
43
+ };
44
+ const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
45
+ return <AtomixGlass {...glassProps}>{spinnerContent}</AtomixGlass>;
46
+ }
47
+
48
+ return spinnerContent;
50
49
  }
51
-
52
- return spinnerContent;
53
- });
50
+ );
54
51
 
55
52
  export type { SpinnerProps };
56
53
 
@@ -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 { Steps } from './Steps';
4
5
 
5
6
  const meta = {
@@ -9,26 +10,105 @@ const meta = {
9
10
  layout: 'padded',
10
11
  docs: {
11
12
  description: {
12
- component:
13
- 'The Steps component displays a sequence of steps in a process or workflow. It provides visual progress indication and can be displayed horizontally or vertically. Steps are ideal for multi-step forms, onboarding flows, or any process that requires clear progress visualization.',
13
+ component: `
14
+ # Steps
15
+
16
+ ## Overview
17
+
18
+ Steps component displays a sequence of steps in a process or workflow. It provides visual progress indication and can be displayed horizontally or vertically. Steps are ideal for multi-step forms, onboarding flows, or any process that requires clear progress visualization.
19
+
20
+ ## Features
21
+
22
+ - Horizontal and vertical orientations
23
+ - Active step indication
24
+ - Customizable step content
25
+ - Glass morphism effect
26
+ - Accessible design
27
+ - Responsive behavior
28
+
29
+ ## Accessibility
30
+
31
+ - Screen reader: Step status and progress announced appropriately
32
+ - ARIA support: Proper roles and properties for step components
33
+ - Keyboard support: Accessible via keyboard navigation
34
+ - Focus management: Maintains focus on interactive elements
35
+
36
+ ## Usage Examples
37
+
38
+ ### Basic Usage
39
+
40
+ \`\`\`tsx
41
+ <Steps
42
+ items={[
43
+ { number: 1, text: 'Step 1' },
44
+ { number: 2, text: 'Step 2' },
45
+ { number: 3, text: 'Step 3' },
46
+ ]}
47
+ activeIndex={1}
48
+ />
49
+ \`\`\`
50
+
51
+ ### Vertical Orientation
52
+
53
+ \`\`\`tsx
54
+ <Steps
55
+ items={[
56
+ { number: 1, text: 'Step 1' },
57
+ { number: 2, text: 'Step 2' },
58
+ { number: 3, text: 'Step 3' },
59
+ ]}
60
+ activeIndex={1}
61
+ vertical={true}
62
+ />
63
+ \`\`\`
64
+
65
+ ## API Reference
66
+
67
+ ### Props
68
+
69
+ | Prop | Type | Default | Description |
70
+ | ---- | ---- | ------- | ----------- |
71
+ | activeIndex | number | 1 | The index of the currently active step |
72
+ | vertical | boolean | false | Whether to display steps vertically |
73
+ | glass | boolean | false | Enable glass morphism effect |
74
+ | items | StepItem[] | [] | Array of step items with number and text |
75
+ `,
14
76
  },
15
77
  },
16
78
  },
17
79
  tags: ['autodocs'],
18
80
  argTypes: {
19
81
  activeIndex: {
20
- control: { type: 'number' },
82
+ control: { type: 'number', min: 0 },
21
83
  description: 'The index of the currently active step',
22
- defaultValue: 1,
84
+ table: {
85
+ type: { summary: 'number' },
86
+ defaultValue: { summary: 1 },
87
+ },
23
88
  },
24
89
  vertical: {
25
90
  control: { type: 'boolean' },
26
91
  description: 'Whether to display steps vertically',
27
- defaultValue: false,
92
+ table: {
93
+ type: { summary: 'boolean' },
94
+ defaultValue: { summary: false },
95
+ },
28
96
  },
29
97
  glass: {
30
98
  control: 'boolean',
31
99
  description: 'Enable glass morphism effect',
100
+ table: {
101
+ type: { summary: 'boolean' },
102
+ defaultValue: { summary: false },
103
+ },
104
+ },
105
+ items: {
106
+ control: { type: 'object' },
107
+ description: 'Array of step items with number and text',
108
+ table: {
109
+ type: { summary: 'StepItem[]' },
110
+ defaultValue: { summary: '[]' },
111
+ },
32
112
  },
33
113
  },
34
114
  } satisfies Meta<typeof Steps>;
@@ -36,13 +116,8 @@ const meta = {
36
116
  export default meta;
37
117
  type Story = StoryObj<typeof meta>;
38
118
 
39
- // Default horizontal steps
40
- export const Default: Story = {
41
- render: args => (
42
- <div style={{ padding: '30px' }}>
43
- <Steps {...args} />
44
- </div>
45
- ),
119
+ // Basic horizontal steps
120
+ export const BasicHorizontal: Story = {
46
121
  args: {
47
122
  items: [
48
123
  { number: 1, text: 'Step 1' },
@@ -54,15 +129,22 @@ export const Default: Story = {
54
129
  activeIndex: 1,
55
130
  vertical: false,
56
131
  },
57
- };
58
-
59
- // Vertical steps
60
- export const Vertical: Story = {
61
132
  render: args => (
62
133
  <div style={{ padding: '30px' }}>
63
134
  <Steps {...args} />
64
135
  </div>
65
136
  ),
137
+ parameters: {
138
+ docs: {
139
+ description: {
140
+ story: 'Default horizontal steps with basic configuration.',
141
+ },
142
+ },
143
+ },
144
+ };
145
+
146
+ // Vertical steps
147
+ export const BasicVertical: Story = {
66
148
  args: {
67
149
  items: [
68
150
  { number: 1, text: 'Step 1' },
@@ -74,6 +156,18 @@ export const Vertical: Story = {
74
156
  activeIndex: 1,
75
157
  vertical: true,
76
158
  },
159
+ render: args => (
160
+ <div style={{ padding: '30px' }}>
161
+ <Steps {...args} />
162
+ </div>
163
+ ),
164
+ parameters: {
165
+ docs: {
166
+ description: {
167
+ story: 'Steps displayed in vertical orientation.',
168
+ },
169
+ },
170
+ },
77
171
  };
78
172
 
79
173
  // Steps with custom content
@@ -100,20 +194,17 @@ export const WithCustomContent: Story = {
100
194
  text: 'Preferences',
101
195
  content: <p style={{ marginTop: '10px', fontSize: '0.85em' }}>Select your preferences</p>,
102
196
  },
103
- {
104
- number: 4,
105
- text: 'Payment',
106
- content: <p style={{ marginTop: '10px', fontSize: '0.85em' }}>Add payment information</p>,
107
- },
108
- {
109
- number: 5,
110
- text: 'Confirmation',
111
- content: <p style={{ marginTop: '10px', fontSize: '0.85em' }}>Complete your signup</p>,
112
- },
113
197
  ],
114
198
  activeIndex: 1,
115
199
  vertical: false,
116
200
  },
201
+ parameters: {
202
+ docs: {
203
+ description: {
204
+ story: 'Steps with custom content in each step.',
205
+ },
206
+ },
207
+ },
117
208
  };
118
209
 
119
210
  // Steps with custom icons instead of numbers
@@ -152,9 +243,18 @@ export const WithIcons: Story = {
152
243
  };
153
244
 
154
245
  // Interactive steps with buttons for navigation
155
- const InteractiveSteps: React.FC = () => {
246
+ const InteractiveStepsTemplate: React.FC<{ onStepChange?: (index: number) => void }> = ({
247
+ onStepChange,
248
+ }) => {
156
249
  const [activeStep, setActiveStep] = React.useState(0);
157
250
 
251
+ const handleStepChange = (stepIndex: number) => {
252
+ setActiveStep(stepIndex);
253
+ if (onStepChange) {
254
+ onStepChange(stepIndex);
255
+ }
256
+ };
257
+
158
258
  const items = [
159
259
  { number: 1, text: 'Step 1' },
160
260
  { number: 2, text: 'Step 2' },
@@ -165,37 +265,47 @@ const InteractiveSteps: React.FC = () => {
165
265
 
166
266
  return (
167
267
  <div>
168
- <Steps items={items} activeIndex={activeStep} onStepChange={setActiveStep} />
169
- <div style={{ marginTop: '30px', display: 'flex', gap: '10px' }}>
268
+ <Steps items={items} activeIndex={activeStep} onStepChange={handleStepChange} />
269
+ <div style={{ marginTop: '30px', display: 'flex', gap: '10px', justifyContent: 'center' }}>
170
270
  <button
171
271
  className="c-btn c-btn--primary"
172
- onClick={() => setActiveStep(Math.max(0, activeStep - 1))}
272
+ onClick={() => handleStepChange(Math.max(0, activeStep - 1))}
173
273
  disabled={activeStep === 0}
174
274
  >
175
275
  Previous
176
276
  </button>
177
277
  <button
178
278
  className="c-btn c-btn--primary"
179
- onClick={() => setActiveStep(Math.min(items.length - 1, activeStep + 1))}
279
+ onClick={() => handleStepChange(Math.min(items.length - 1, activeStep + 1))}
180
280
  disabled={activeStep === items.length - 1}
181
281
  >
182
282
  Next
183
283
  </button>
284
+ <span style={{ marginLeft: '15px', alignSelf: 'center' }}>
285
+ Current step: {activeStep + 1} of {items.length}
286
+ </span>
184
287
  </div>
185
288
  </div>
186
289
  );
187
290
  };
188
291
 
189
292
  export const Interactive: Story = {
190
- args: {} as any,
191
293
  render: () => (
192
294
  <div style={{ padding: '30px' }}>
193
- <InteractiveSteps />
295
+ <InteractiveStepsTemplate />
194
296
  </div>
195
297
  ),
298
+ parameters: {
299
+ docs: {
300
+ description: {
301
+ story: 'Interactive steps with navigation controls to demonstrate state management.',
302
+ },
303
+ },
304
+ },
196
305
  };
197
306
 
198
- export const Glass: Story = {
307
+ // Glass effect horizontal
308
+ export const GlassHorizontal: Story = {
199
309
  args: {
200
310
  items: [
201
311
  { number: 1, text: 'Glass Step 1' },
@@ -208,7 +318,7 @@ export const Glass: Story = {
208
318
  vertical: false,
209
319
  glass: true,
210
320
  },
211
- render: (args: any) => (
321
+ render: args => (
212
322
  <div
213
323
  style={{
214
324
  background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
@@ -225,8 +335,16 @@ export const Glass: Story = {
225
335
  </div>
226
336
  </div>
227
337
  ),
338
+ parameters: {
339
+ docs: {
340
+ description: {
341
+ story: 'Horizontal steps with glass morphism effect applied.',
342
+ },
343
+ },
344
+ },
228
345
  };
229
346
 
347
+ // Glass effect vertical
230
348
  export const GlassVertical: Story = {
231
349
  args: {
232
350
  items: [
@@ -240,7 +358,7 @@ export const GlassVertical: Story = {
240
358
  vertical: true,
241
359
  glass: true,
242
360
  },
243
- render: (args: any) => (
361
+ render: args => (
244
362
  <div
245
363
  style={{
246
364
  background:
@@ -260,8 +378,16 @@ export const GlassVertical: Story = {
260
378
  </div>
261
379
  </div>
262
380
  ),
381
+ parameters: {
382
+ docs: {
383
+ description: {
384
+ story: 'Vertical steps with glass morphism effect applied.',
385
+ },
386
+ },
387
+ },
263
388
  };
264
389
 
390
+ // Glass effect with custom configuration
265
391
  export const GlassCustom: Story = {
266
392
  args: {
267
393
  items: [
@@ -279,9 +405,9 @@ export const GlassCustom: Story = {
279
405
  saturation: 200,
280
406
  aberrationIntensity: 0.8,
281
407
  cornerRadius: 12,
282
- } as any,
408
+ },
283
409
  },
284
- render: (args: any) => (
410
+ render: args => (
285
411
  <div
286
412
  style={{
287
413
  background: 'linear-gradient(45deg, #ff6b6b, #4ecdc4, #45b7d1, #96ceb4, #feca57)',
@@ -295,18 +421,23 @@ export const GlassCustom: Story = {
295
421
  justifyContent: 'center',
296
422
  }}
297
423
  >
298
- <style>
299
- {`
424
+ <style>{`
300
425
  @keyframes gradient {
301
426
  0% { background-position: 0% 50%; }
302
427
  50% { background-position: 100% 50%; }
303
428
  100% { background-position: 0% 50%; }
304
429
  }
305
- `}
306
- </style>
430
+ `}</style>
307
431
  <div style={{ width: '100%', maxWidth: '800px' }}>
308
432
  <Steps {...args} />
309
433
  </div>
310
434
  </div>
311
435
  ),
436
+ parameters: {
437
+ docs: {
438
+ description: {
439
+ story: 'Horizontal steps with custom glass morphism effect parameters.',
440
+ },
441
+ },
442
+ },
312
443
  };