@shohojdhara/atomix 0.3.4 → 0.3.6

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 (237) hide show
  1. package/README.md +101 -199
  2. package/atomix.config.ts +241 -0
  3. package/dist/atomix.css +269 -189
  4. package/dist/atomix.css.map +1 -0
  5. package/dist/atomix.min.css +15179 -11
  6. package/dist/atomix.min.css.map +1 -0
  7. package/dist/charts.d.ts +1929 -0
  8. package/dist/charts.js +6477 -0
  9. package/dist/charts.js.map +1 -0
  10. package/dist/core.d.ts +1289 -0
  11. package/dist/core.js +3373 -0
  12. package/dist/core.js.map +1 -0
  13. package/dist/forms.d.ts +1085 -0
  14. package/dist/forms.js +2466 -0
  15. package/dist/forms.js.map +1 -0
  16. package/dist/heavy.d.ts +636 -0
  17. package/dist/heavy.js +4566 -0
  18. package/dist/heavy.js.map +1 -0
  19. package/dist/index.d.ts +5171 -4792
  20. package/dist/index.esm.js +6098 -4563
  21. package/dist/index.esm.js.map +1 -1
  22. package/dist/index.js +6291 -4747
  23. package/dist/index.js.map +1 -1
  24. package/dist/index.min.js +1 -1
  25. package/dist/index.min.js.map +1 -1
  26. package/dist/layout.d.ts +300 -0
  27. package/dist/layout.js +336 -0
  28. package/dist/layout.js.map +1 -0
  29. package/dist/theme.d.ts +2122 -0
  30. package/dist/theme.js +6084 -0
  31. package/dist/theme.js.map +1 -0
  32. package/package.json +59 -27
  33. package/scripts/atomix-cli.js +544 -16
  34. package/scripts/cli/__tests__/cli-commands.test.js +204 -0
  35. package/scripts/cli/__tests__/utils.test.js +201 -0
  36. package/scripts/cli/__tests__/vitest.config.js +26 -0
  37. package/scripts/cli/interactive-init.js +1 -1
  38. package/scripts/cli/token-manager.js +32 -7
  39. package/scripts/cli/utils.js +347 -0
  40. package/src/components/Accordion/Accordion.stories.tsx +50 -17
  41. package/src/components/Accordion/Accordion.tsx +5 -54
  42. package/src/components/Accordion/index.ts +1 -1
  43. package/src/components/AtomixGlass/AtomixGlass.tsx +65 -31
  44. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +11 -4
  45. package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +1 -32
  46. package/src/components/AtomixGlass/stories/Examples.stories.tsx +2 -2
  47. package/src/components/AtomixGlass/stories/shared-components.tsx +0 -31
  48. package/src/components/Avatar/Avatar.stories.tsx +7 -0
  49. package/src/components/Avatar/Avatar.tsx +3 -3
  50. package/src/components/Badge/Badge.stories.tsx +91 -13
  51. package/src/components/Badge/Badge.tsx +3 -3
  52. package/src/components/Block/Block.stories.tsx +7 -23
  53. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +7 -0
  54. package/src/components/Breadcrumb/Breadcrumb.tsx +3 -3
  55. package/src/components/Button/Button.stories.tsx +141 -22
  56. package/src/components/Button/ButtonGroup.stories.tsx +315 -0
  57. package/src/components/Button/ButtonGroup.tsx +67 -0
  58. package/src/components/Button/index.ts +2 -0
  59. package/src/components/Callout/Callout.stories.tsx +8 -6
  60. package/src/components/Card/Card.stories.tsx +82 -28
  61. package/src/components/Card/ElevationCard.tsx +1 -1
  62. package/src/components/Chart/AnimatedChart.tsx +19 -18
  63. package/src/components/Chart/AreaChart.tsx +5 -2
  64. package/src/components/Chart/BarChart.tsx +1 -1
  65. package/src/components/Chart/BubbleChart.tsx +6 -6
  66. package/src/components/Chart/CandlestickChart.tsx +0 -1
  67. package/src/components/Chart/Chart.stories.tsx +5 -7
  68. package/src/components/Chart/Chart.tsx +0 -16
  69. package/src/components/Chart/ChartRenderer.tsx +1 -1
  70. package/src/components/Chart/ChartToolbar.tsx +1 -0
  71. package/src/components/Chart/DonutChart.tsx +0 -1
  72. package/src/components/Chart/FunnelChart.tsx +1 -2
  73. package/src/components/Chart/GaugeChart.tsx +0 -1
  74. package/src/components/Chart/HeatmapChart.tsx +0 -1
  75. package/src/components/Chart/LineChart.tsx +0 -1
  76. package/src/components/Chart/MultiAxisChart.tsx +0 -1
  77. package/src/components/Chart/PieChart.tsx +0 -1
  78. package/src/components/Chart/RadarChart.tsx +19 -13
  79. package/src/components/Chart/ScatterChart.tsx +3 -4
  80. package/src/components/Chart/TreemapChart.tsx +2 -1
  81. package/src/components/Chart/WaterfallChart.tsx +0 -2
  82. package/src/components/Chart/types.ts +12 -2
  83. package/src/components/Chart/utils.ts +4 -3
  84. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +7 -0
  85. package/src/components/DataTable/DataTable.stories.tsx +23 -16
  86. package/src/components/DataTable/DataTable.tsx +3 -3
  87. package/src/components/DatePicker/DatePicker.stories.tsx +27 -19
  88. package/src/components/Dropdown/Dropdown.stories.tsx +11 -19
  89. package/src/components/Dropdown/Dropdown.tsx +12 -9
  90. package/src/components/EdgePanel/EdgePanel.stories.tsx +1 -0
  91. package/src/components/Footer/Footer.stories.tsx +8 -6
  92. package/src/components/Footer/FooterLink.tsx +9 -2
  93. package/src/components/Footer/FooterSection.tsx +3 -3
  94. package/src/components/Form/Checkbox.stories.tsx +7 -0
  95. package/src/components/Form/Checkbox.tsx +3 -3
  96. package/src/components/Form/Form.stories.tsx +7 -0
  97. package/src/components/Form/FormGroup.stories.tsx +9 -1
  98. package/src/components/Form/Input.stories.tsx +69 -16
  99. package/src/components/Form/Input.tsx +4 -2
  100. package/src/components/Form/Radio.stories.tsx +9 -1
  101. package/src/components/Form/Radio.tsx +3 -3
  102. package/src/components/Form/Select.stories.tsx +9 -1
  103. package/src/components/Form/Select.tsx +3 -3
  104. package/src/components/Form/Textarea.stories.tsx +10 -2
  105. package/src/components/Form/Textarea.tsx +4 -2
  106. package/src/components/Hero/Hero.stories.tsx +7 -0
  107. package/src/components/List/List.stories.tsx +10 -3
  108. package/src/components/List/List.tsx +3 -3
  109. package/src/components/List/ListGroup.tsx +3 -1
  110. package/src/components/Messages/Messages.stories.tsx +8 -7
  111. package/src/components/Modal/Modal.stories.tsx +17 -6
  112. package/src/components/Modal/Modal.tsx +3 -3
  113. package/src/components/Navigation/Menu/MegaMenu.tsx +9 -3
  114. package/src/components/Navigation/Menu/Menu.stories.tsx +7 -0
  115. package/src/components/Navigation/Menu/Menu.tsx +9 -3
  116. package/src/components/Navigation/Nav/Nav.stories.tsx +7 -0
  117. package/src/components/Navigation/Navbar/Navbar.stories.tsx +1 -0
  118. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +1 -1
  119. package/src/components/Pagination/Pagination.stories.tsx +188 -111
  120. package/src/components/Pagination/Pagination.tsx +88 -7
  121. package/src/components/PhotoViewer/PhotoViewer.stories.tsx +10 -5
  122. package/src/components/PhotoViewer/PhotoViewerImage.tsx +2 -2
  123. package/src/components/Popover/Popover.stories.tsx +191 -115
  124. package/src/components/Popover/Popover.tsx +4 -4
  125. package/src/components/ProductReview/ProductReview.stories.tsx +80 -58
  126. package/src/components/Progress/Progress.stories.tsx +79 -49
  127. package/src/components/Progress/Progress.tsx +6 -2
  128. package/src/components/Rating/Rating.stories.tsx +109 -84
  129. package/src/components/Rating/Rating.tsx +5 -2
  130. package/src/components/River/River.stories.tsx +194 -114
  131. package/src/components/SectionIntro/SectionIntro.stories.tsx +19 -9
  132. package/src/components/Slider/Slider.stories.tsx +7 -0
  133. package/src/components/Slider/Slider.tsx +10 -9
  134. package/src/components/Spinner/Spinner.stories.tsx +15 -11
  135. package/src/components/Spinner/Spinner.tsx +3 -3
  136. package/src/components/Steps/Steps.stories.tsx +132 -98
  137. package/src/components/Tabs/Tabs.stories.tsx +163 -112
  138. package/src/components/Tabs/Tabs.tsx +3 -3
  139. package/src/components/Testimonial/Testimonial.stories.tsx +114 -68
  140. package/src/components/Todo/Todo.stories.tsx +38 -12
  141. package/src/components/Toggle/Toggle.stories.tsx +61 -28
  142. package/src/components/Tooltip/Tooltip.stories.tsx +318 -200
  143. package/src/components/Tooltip/Tooltip.tsx +3 -3
  144. package/src/components/Upload/Upload.stories.tsx +122 -84
  145. package/src/components/VideoPlayer/VideoPlayer.stories.tsx +7 -24
  146. package/src/components/index.ts +6 -2
  147. package/src/layouts/MasonryGrid/MasonryGrid.tsx +2 -2
  148. package/src/lib/composables/useAtomixGlass.ts +2 -3
  149. package/src/lib/composables/useChartPerformance.ts +102 -78
  150. package/src/lib/composables/useChartScale.ts +10 -0
  151. package/src/lib/composables/useHero.ts +9 -2
  152. package/src/lib/composables/useHeroBackgroundSlider.ts +5 -3
  153. package/src/lib/composables/useNavbar.ts +0 -10
  154. package/src/lib/composables/useSideMenu.ts +1 -0
  155. package/src/lib/composables/useVideoPlayer.ts +3 -2
  156. package/src/lib/config/loader.ts +57 -14
  157. package/src/lib/constants/components.ts +10 -0
  158. package/src/lib/hooks/index.ts +0 -1
  159. package/src/lib/hooks/useComponentCustomization.ts +11 -15
  160. package/src/lib/hooks/usePerformanceMonitor.ts +149 -0
  161. package/src/lib/patterns/index.ts +2 -2
  162. package/src/lib/patterns/slots.tsx +2 -2
  163. package/src/lib/theme/README.md +174 -0
  164. package/src/lib/theme/adapters/index.ts +31 -0
  165. package/src/lib/theme/adapters/themeAdapter.ts +287 -0
  166. package/src/lib/theme/config/__tests__/configLoader.test.ts +207 -0
  167. package/src/lib/theme/config/configLoader.ts +254 -0
  168. package/src/lib/theme/config/loader.ts +37 -48
  169. package/src/lib/theme/config/types.ts +2 -2
  170. package/src/lib/theme/config/validator.ts +15 -91
  171. package/src/lib/theme/{constants.ts → constants/constants.ts} +0 -18
  172. package/src/lib/theme/constants/index.ts +8 -0
  173. package/src/lib/theme/core/ThemeRegistry.ts +19 -6
  174. package/src/lib/theme/core/__tests__/createTheme.test.ts +132 -0
  175. package/src/lib/theme/core/composeTheme.ts +155 -0
  176. package/src/lib/theme/core/createTheme.ts +94 -0
  177. package/src/lib/theme/{createTheme.ts → core/createThemeObject.ts} +10 -6
  178. package/src/lib/theme/core/index.ts +5 -19
  179. package/src/lib/theme/devtools/Comparator.tsx +346 -22
  180. package/src/lib/theme/devtools/IMPROVEMENTS.md +139 -38
  181. package/src/lib/theme/devtools/Inspector.tsx +335 -51
  182. package/src/lib/theme/devtools/LiveEditor.tsx +489 -112
  183. package/src/lib/theme/devtools/Preview.tsx +471 -221
  184. package/src/lib/theme/{core → devtools}/ThemeValidator.ts +6 -3
  185. package/src/lib/theme/devtools/index.ts +14 -4
  186. package/src/lib/theme/devtools/useHistory.ts +130 -0
  187. package/src/lib/theme/errors/index.ts +12 -0
  188. package/src/lib/theme/generators/cssFile.ts +79 -0
  189. package/src/lib/theme/generators/generateCSS.ts +89 -0
  190. package/src/lib/theme/{generateCSSVariables.ts → generators/generateCSSVariables.ts} +4 -14
  191. package/src/lib/theme/generators/index.ts +19 -0
  192. package/src/lib/theme/i18n/rtl.ts +7 -7
  193. package/src/lib/theme/index.ts +120 -15
  194. package/src/lib/theme/runtime/ThemeApplicator.ts +53 -95
  195. package/src/lib/theme/{ThemeContext.tsx → runtime/ThemeContext.tsx} +1 -1
  196. package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +4 -4
  197. package/src/lib/theme/runtime/ThemeProvider.tsx +456 -179
  198. package/src/lib/theme/runtime/index.ts +1 -2
  199. package/src/lib/theme/runtime/useTheme.ts +1 -2
  200. package/src/lib/theme/test/testTheme.ts +385 -0
  201. package/src/lib/theme/tokens/index.ts +12 -0
  202. package/src/lib/theme/tokens/tokens.ts +721 -0
  203. package/src/lib/theme/types.ts +6 -42
  204. package/src/lib/theme/{utils.ts → utils/domUtils.ts} +2 -2
  205. package/src/lib/theme/utils/index.ts +11 -0
  206. package/src/lib/theme/utils/injectCSS.ts +90 -0
  207. package/src/lib/theme/utils/themeHelpers.ts +78 -0
  208. package/src/lib/theme/{themeUtils.ts → utils/themeUtils.ts} +1 -1
  209. package/src/lib/theme-tools.ts +8 -9
  210. package/src/lib/types/components.ts +93 -34
  211. package/src/lib/types/partProps.ts +0 -16
  212. package/src/lib/utils/componentUtils.ts +1 -1
  213. package/src/lib/utils/fontPreloader.ts +148 -0
  214. package/src/lib/utils/index.ts +11 -0
  215. package/src/lib/utils/memoryMonitor.ts +189 -0
  216. package/src/styles/01-settings/_settings.design-tokens.scss +4 -1
  217. package/src/styles/01-settings/_settings.fonts.scss +2 -5
  218. package/src/styles/02-tools/_tools.button.scss +66 -79
  219. package/src/styles/06-components/_components.atomix-glass.scss +13 -3
  220. package/src/styles/06-components/_components.navbar.scss +0 -6
  221. package/src/styles/06-components/_components.pagination.scss +88 -0
  222. package/scripts/build-themes.js +0 -208
  223. package/scripts/sync-theme-config.js +0 -309
  224. package/src/components/AtomixGlass/atomixGLass.old.tsx +0 -1263
  225. package/src/lib/theme/composeTheme.ts +0 -370
  226. package/src/lib/theme/core/ThemeCache.ts +0 -283
  227. package/src/lib/theme/core/ThemeEngine.test.ts +0 -146
  228. package/src/lib/theme/core/ThemeEngine.ts +0 -657
  229. package/src/lib/theme/createThemeFromConfig.ts +0 -132
  230. package/src/lib/theme/devtools/CLI.ts +0 -364
  231. package/src/lib/theme/runtime/ThemeManager.test.ts +0 -192
  232. package/src/lib/theme/runtime/ThemeManager.ts +0 -442
  233. package/src/styles/03-generic/_generated-root.css +0 -5
  234. package/src/themes/README.md +0 -442
  235. package/src/themes/themes.config.js +0 -35
  236. /package/src/lib/theme/{cssVariableMapper.ts → adapters/cssVariableMapper.ts} +0 -0
  237. /package/src/lib/theme/{errors.ts → errors/errors.ts} +0 -0
@@ -1,19 +1,29 @@
1
1
  import React from 'react';
2
- import { StoryFn, Meta } from '@storybook/react';
3
- import { fn } from '@storybook/test';
2
+ import type { Meta, StoryObj } from '@storybook/react';
4
3
  import { Steps } from './Steps';
5
- import type { StepsProps } from './Steps';
6
4
 
7
- export default {
5
+ const meta = {
8
6
  title: 'Components/Steps',
9
7
  component: Steps,
8
+ parameters: {
9
+ layout: 'padded',
10
+ docs: {
11
+ 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.',
14
+ },
15
+ },
16
+ },
17
+ tags: ['autodocs'],
10
18
  argTypes: {
11
19
  activeIndex: {
12
20
  control: { type: 'number' },
21
+ description: 'The index of the currently active step',
13
22
  defaultValue: 1,
14
23
  },
15
24
  vertical: {
16
25
  control: { type: 'boolean' },
26
+ description: 'Whether to display steps vertically',
17
27
  defaultValue: false,
18
28
  },
19
29
  glass: {
@@ -21,103 +31,124 @@ export default {
21
31
  description: 'Enable glass morphism effect',
22
32
  },
23
33
  },
24
- } as Meta<typeof Steps>;
34
+ } satisfies Meta<typeof Steps>;
25
35
 
26
- const Template: StoryFn<typeof Steps> = args => (
27
- <div style={{ padding: '30px' }}>
28
- <Steps {...args} />
29
- </div>
30
- );
36
+ export default meta;
37
+ type Story = StoryObj<typeof meta>;
31
38
 
32
39
  // Default horizontal steps
33
- export const Default = Template.bind({});
34
- Default.args = {
35
- items: [
36
- { number: 1, text: 'Step 1' },
37
- { number: 2, text: 'Step 2' },
38
- { number: 3, text: 'Step 3' },
39
- { number: 4, text: 'Step 4' },
40
- { number: 5, text: 'Step 5' },
41
- ],
42
- activeIndex: 1,
43
- vertical: false,
40
+ export const Default: Story = {
41
+ render: args => (
42
+ <div style={{ padding: '30px' }}>
43
+ <Steps {...args} />
44
+ </div>
45
+ ),
46
+ args: {
47
+ items: [
48
+ { number: 1, text: 'Step 1' },
49
+ { number: 2, text: 'Step 2' },
50
+ { number: 3, text: 'Step 3' },
51
+ { number: 4, text: 'Step 4' },
52
+ { number: 5, text: 'Step 5' },
53
+ ],
54
+ activeIndex: 1,
55
+ vertical: false,
56
+ },
44
57
  };
45
58
 
46
59
  // Vertical steps
47
- export const Vertical = Template.bind({});
48
- Vertical.args = {
49
- items: [
50
- { number: 1, text: 'Step 1' },
51
- { number: 2, text: 'Step 2' },
52
- { number: 3, text: 'Step 3' },
53
- { number: 4, text: 'Step 4' },
54
- { number: 5, text: 'Step 5' },
55
- ],
56
- activeIndex: 1,
57
- vertical: true,
60
+ export const Vertical: Story = {
61
+ render: args => (
62
+ <div style={{ padding: '30px' }}>
63
+ <Steps {...args} />
64
+ </div>
65
+ ),
66
+ args: {
67
+ items: [
68
+ { number: 1, text: 'Step 1' },
69
+ { number: 2, text: 'Step 2' },
70
+ { number: 3, text: 'Step 3' },
71
+ { number: 4, text: 'Step 4' },
72
+ { number: 5, text: 'Step 5' },
73
+ ],
74
+ activeIndex: 1,
75
+ vertical: true,
76
+ },
58
77
  };
59
78
 
60
79
  // Steps with custom content
61
- export const WithCustomContent = Template.bind({});
62
- WithCustomContent.args = {
63
- items: [
64
- {
65
- number: 1,
66
- text: 'Registration',
67
- content: <p style={{ marginTop: '10px', fontSize: '0.85em' }}>Create your account</p>,
68
- },
69
- {
70
- number: 2,
71
- text: 'Personal Info',
72
- content: <p style={{ marginTop: '10px', fontSize: '0.85em' }}>Tell us about yourself</p>,
73
- },
74
- {
75
- number: 3,
76
- text: 'Preferences',
77
- content: <p style={{ marginTop: '10px', fontSize: '0.85em' }}>Select your preferences</p>,
78
- },
79
- {
80
- number: 4,
81
- text: 'Payment',
82
- content: <p style={{ marginTop: '10px', fontSize: '0.85em' }}>Add payment information</p>,
83
- },
84
- {
85
- number: 5,
86
- text: 'Confirmation',
87
- content: <p style={{ marginTop: '10px', fontSize: '0.85em' }}>Complete your signup</p>,
88
- },
89
- ],
90
- activeIndex: 1,
91
- vertical: false,
80
+ export const WithCustomContent: Story = {
81
+ render: args => (
82
+ <div style={{ padding: '30px' }}>
83
+ <Steps {...args} />
84
+ </div>
85
+ ),
86
+ args: {
87
+ items: [
88
+ {
89
+ number: 1,
90
+ text: 'Registration',
91
+ content: <p style={{ marginTop: '10px', fontSize: '0.85em' }}>Create your account</p>,
92
+ },
93
+ {
94
+ number: 2,
95
+ text: 'Personal Info',
96
+ content: <p style={{ marginTop: '10px', fontSize: '0.85em' }}>Tell us about yourself</p>,
97
+ },
98
+ {
99
+ number: 3,
100
+ text: 'Preferences',
101
+ content: <p style={{ marginTop: '10px', fontSize: '0.85em' }}>Select your preferences</p>,
102
+ },
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
+ ],
114
+ activeIndex: 1,
115
+ vertical: false,
116
+ },
92
117
  };
93
118
 
94
119
  // Steps with custom icons instead of numbers
95
- export const WithIcons = Template.bind({});
96
- WithIcons.args = {
97
- items: [
98
- {
99
- number: <i className="icon-lux-user" style={{ fontSize: '16px' }}></i>,
100
- text: 'Account',
101
- },
102
- {
103
- number: <i className="icon-lux-settings" style={{ fontSize: '16px' }}></i>,
104
- text: 'Settings',
105
- },
106
- {
107
- number: <i className="icon-lux-calendar" style={{ fontSize: '16px' }}></i>,
108
- text: 'Schedule',
109
- },
110
- {
111
- number: <i className="icon-lux-card" style={{ fontSize: '16px' }}></i>,
112
- text: 'Payment',
113
- },
114
- {
115
- number: <i className="icon-lux-check" style={{ fontSize: '16px' }}></i>,
116
- text: 'Complete',
117
- },
118
- ],
119
- activeIndex: 1,
120
- vertical: false,
120
+ export const WithIcons: Story = {
121
+ render: args => (
122
+ <div style={{ padding: '30px' }}>
123
+ <Steps {...args} />
124
+ </div>
125
+ ),
126
+ args: {
127
+ items: [
128
+ {
129
+ number: <i className="icon-lux-user" style={{ fontSize: '16px' }}></i>,
130
+ text: 'Account',
131
+ },
132
+ {
133
+ number: <i className="icon-lux-settings" style={{ fontSize: '16px' }}></i>,
134
+ text: 'Settings',
135
+ },
136
+ {
137
+ number: <i className="icon-lux-calendar" style={{ fontSize: '16px' }}></i>,
138
+ text: 'Schedule',
139
+ },
140
+ {
141
+ number: <i className="icon-lux-card" style={{ fontSize: '16px' }}></i>,
142
+ text: 'Payment',
143
+ },
144
+ {
145
+ number: <i className="icon-lux-check" style={{ fontSize: '16px' }}></i>,
146
+ text: 'Complete',
147
+ },
148
+ ],
149
+ activeIndex: 1,
150
+ vertical: false,
151
+ },
121
152
  };
122
153
 
123
154
  // Interactive steps with buttons for navigation
@@ -155,13 +186,16 @@ const InteractiveSteps: React.FC = () => {
155
186
  );
156
187
  };
157
188
 
158
- export const Interactive: StoryFn<typeof Steps> = () => (
159
- <div style={{ padding: '30px' }}>
160
- <InteractiveSteps />
161
- </div>
162
- );
189
+ export const Interactive: Story = {
190
+ args: {} as any,
191
+ render: () => (
192
+ <div style={{ padding: '30px' }}>
193
+ <InteractiveSteps />
194
+ </div>
195
+ ),
196
+ };
163
197
 
164
- export const Glass = {
198
+ export const Glass: Story = {
165
199
  args: {
166
200
  items: [
167
201
  { number: 1, text: 'Glass Step 1' },
@@ -193,7 +227,7 @@ export const Glass = {
193
227
  ),
194
228
  };
195
229
 
196
- export const GlassVertical = {
230
+ export const GlassVertical: Story = {
197
231
  args: {
198
232
  items: [
199
233
  { number: 1, text: 'Glass Step 1' },
@@ -228,7 +262,7 @@ export const GlassVertical = {
228
262
  ),
229
263
  };
230
264
 
231
- export const GlassCustom = {
265
+ export const GlassCustom: Story = {
232
266
  args: {
233
267
  items: [
234
268
  { number: 1, text: 'Custom Glass Step 1' },
@@ -245,7 +279,7 @@ export const GlassCustom = {
245
279
  saturation: 200,
246
280
  aberrationIntensity: 0.8,
247
281
  cornerRadius: 12,
248
- },
282
+ } as any,
249
283
  },
250
284
  render: (args: any) => (
251
285
  <div
@@ -1,14 +1,28 @@
1
1
  import React from 'react';
2
- import { StoryFn, Meta } from '@storybook/react';
3
- import { fn } from '@storybook/test';
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+ import type { AtomixGlassProps } from '../../lib/types/components';
4
4
  import { Tabs } from './Tabs';
5
5
 
6
- export default {
6
+ // Helper type for glass props in stories (without children requirement)
7
+ type GlassProps = boolean | Omit<AtomixGlassProps, 'children'>;
8
+
9
+ const meta = {
7
10
  title: 'Components/Tabs',
8
11
  component: Tabs,
12
+ parameters: {
13
+ layout: 'padded',
14
+ docs: {
15
+ description: {
16
+ component:
17
+ 'The Tabs component organizes content into multiple panels accessible via tab navigation. It provides a clean interface for switching between different views or sections of content. Tabs support keyboard navigation and can include rich content in each panel.',
18
+ },
19
+ },
20
+ },
21
+ tags: ['autodocs'],
9
22
  argTypes: {
10
23
  activeIndex: {
11
24
  control: { type: 'number' },
25
+ description: 'The index of the currently active tab',
12
26
  defaultValue: 0,
13
27
  },
14
28
  glass: {
@@ -16,123 +30,157 @@ export default {
16
30
  description: 'Enable glass morphism effect',
17
31
  },
18
32
  },
19
- } as Meta<typeof Tabs>;
33
+ } satisfies Meta<typeof Tabs>;
20
34
 
21
- const Template: StoryFn<typeof Tabs> = args => (
22
- <div style={{ maxWidth: '600px', margin: '0 auto', padding: '30px' }}>
23
- <Tabs {...args} />
24
- </div>
25
- );
35
+ export default meta;
36
+ type Story = StoryObj<typeof meta>;
26
37
 
27
- export const Default = Template.bind({});
28
- Default.args = {
29
- items: [
30
- {
31
- label: 'Tab 1',
32
- content: <p>This is the content for Tab 1. Default tab content.</p>,
33
- },
34
- {
35
- label: 'Tab 2',
36
- content: <p>This is the content for Tab 2. It contains different information.</p>,
37
- },
38
- {
39
- label: 'Tab 3',
40
- content: <p>This is the content for Tab 3. Another unique content section.</p>,
41
- },
42
- ],
43
- activeIndex: 0,
38
+ /**
39
+ * Default tabs component with three tabs.
40
+ */
41
+ export const Default: Story = {
42
+ render: args => (
43
+ <div style={{ maxWidth: '600px', margin: '0 auto', padding: '30px' }}>
44
+ <Tabs {...args} />
45
+ </div>
46
+ ),
47
+ args: {
48
+ items: [
49
+ {
50
+ label: 'Tab 1',
51
+ content: <p>This is the content for Tab 1. Default tab content.</p>,
52
+ },
53
+ {
54
+ label: 'Tab 2',
55
+ content: <p>This is the content for Tab 2. It contains different information.</p>,
56
+ },
57
+ {
58
+ label: 'Tab 3',
59
+ content: <p>This is the content for Tab 3. Another unique content section.</p>,
60
+ },
61
+ ],
62
+ activeIndex: 0,
63
+ },
44
64
  };
45
65
 
46
- export const WithDifferentActiveTab = Template.bind({});
47
- WithDifferentActiveTab.args = {
48
- items: [
49
- {
50
- label: 'Tab 1',
51
- content: <p>This is the content for Tab 1.</p>,
52
- },
53
- {
54
- label: 'Tab 2',
55
- content: <p>This is the content for Tab 2. It's initially active.</p>,
56
- },
57
- {
58
- label: 'Tab 3',
59
- content: <p>This is the content for Tab 3.</p>,
60
- },
61
- ],
62
- activeIndex: 1,
66
+ /**
67
+ * Tabs with a different tab initially active (Tab 2).
68
+ */
69
+ export const WithDifferentActiveTab: Story = {
70
+ render: args => (
71
+ <div style={{ maxWidth: '600px', margin: '0 auto', padding: '30px' }}>
72
+ <Tabs {...args} />
73
+ </div>
74
+ ),
75
+ args: {
76
+ items: [
77
+ {
78
+ label: 'Tab 1',
79
+ content: <p>This is the content for Tab 1.</p>,
80
+ },
81
+ {
82
+ label: 'Tab 2',
83
+ content: <p>This is the content for Tab 2. It's initially active.</p>,
84
+ },
85
+ {
86
+ label: 'Tab 3',
87
+ content: <p>This is the content for Tab 3.</p>,
88
+ },
89
+ ],
90
+ activeIndex: 1,
91
+ },
63
92
  };
64
93
 
65
- export const WithRichContent = Template.bind({});
66
- WithRichContent.args = {
67
- items: [
68
- {
69
- label: 'Features',
70
- content: (
71
- <div>
72
- <h3>Key Features</h3>
73
- <ul>
74
- <li>Responsive design</li>
75
- <li>Accessible navigation</li>
76
- <li>Smooth transitions</li>
77
- </ul>
78
- </div>
79
- ),
80
- },
81
- {
82
- label: 'Specifications',
83
- content: (
84
- <div>
85
- <h3>Technical Specifications</h3>
86
- <table style={{ width: '100%', borderCollapse: 'collapse' }}>
87
- <thead>
88
- <tr>
89
- <th style={{ border: '1px solid #ddd', padding: '8px', textAlign: 'left' }}>
90
- Property
91
- </th>
92
- <th style={{ border: '1px solid #ddd', padding: '8px', textAlign: 'left' }}>
93
- Value
94
- </th>
95
- </tr>
96
- </thead>
97
- <tbody>
98
- <tr>
99
- <td style={{ border: '1px solid #ddd', padding: '8px' }}>Size</td>
100
- <td style={{ border: '1px solid #ddd', padding: '8px' }}>Medium</td>
101
- </tr>
102
- <tr>
103
- <td style={{ border: '1px solid #ddd', padding: '8px' }}>Material</td>
104
- <td style={{ border: '1px solid #ddd', padding: '8px' }}>Aluminum</td>
105
- </tr>
106
- </tbody>
107
- </table>
108
- </div>
109
- ),
94
+ /**
95
+ * Tabs with rich content including headings, lists, and tables.
96
+ */
97
+ export const WithRichContent: Story = {
98
+ parameters: {
99
+ docs: {
100
+ description: {
101
+ story: 'Demonstrates tabs containing rich HTML content including headings, lists, and tables, showing the flexibility of the tabs component.',
102
+ },
110
103
  },
111
- {
112
- label: 'Reviews',
113
- content: (
114
- <div>
115
- <h3>Customer Reviews</h3>
116
- <div style={{ padding: '10px', marginBottom: '10px', backgroundColor: '#f9f9f9' }}>
117
- <p style={{ marginBottom: '5px' }}>
118
- <strong>John D.</strong> ★★★★★
119
- </p>
120
- <p>Great product, highly recommended!</p>
104
+ },
105
+ render: args => (
106
+ <div style={{ maxWidth: '600px', margin: '0 auto', padding: '30px' }}>
107
+ <Tabs {...args} />
108
+ </div>
109
+ ),
110
+ args: {
111
+ items: [
112
+ {
113
+ label: 'Features',
114
+ content: (
115
+ <div>
116
+ <h3>Key Features</h3>
117
+ <ul>
118
+ <li>Responsive design</li>
119
+ <li>Accessible navigation</li>
120
+ <li>Smooth transitions</li>
121
+ </ul>
121
122
  </div>
122
- <div style={{ padding: '10px', backgroundColor: '#f9f9f9' }}>
123
- <p style={{ marginBottom: '5px' }}>
124
- <strong>Sarah T.</strong> ★★★★☆
125
- </p>
126
- <p>Very good quality and fast shipping.</p>
123
+ ),
124
+ },
125
+ {
126
+ label: 'Specifications',
127
+ content: (
128
+ <div>
129
+ <h3>Technical Specifications</h3>
130
+ <table style={{ width: '100%', borderCollapse: 'collapse' }}>
131
+ <thead>
132
+ <tr>
133
+ <th style={{ border: '1px solid #ddd', padding: '8px', textAlign: 'left' }}>
134
+ Property
135
+ </th>
136
+ <th style={{ border: '1px solid #ddd', padding: '8px', textAlign: 'left' }}>
137
+ Value
138
+ </th>
139
+ </tr>
140
+ </thead>
141
+ <tbody>
142
+ <tr>
143
+ <td style={{ border: '1px solid #ddd', padding: '8px' }}>Size</td>
144
+ <td style={{ border: '1px solid #ddd', padding: '8px' }}>Medium</td>
145
+ </tr>
146
+ <tr>
147
+ <td style={{ border: '1px solid #ddd', padding: '8px' }}>Material</td>
148
+ <td style={{ border: '1px solid #ddd', padding: '8px' }}>Aluminum</td>
149
+ </tr>
150
+ </tbody>
151
+ </table>
127
152
  </div>
128
- </div>
129
- ),
130
- },
131
- ],
132
- activeIndex: 0,
153
+ ),
154
+ },
155
+ {
156
+ label: 'Reviews',
157
+ content: (
158
+ <div>
159
+ <h3>Customer Reviews</h3>
160
+ <div style={{ padding: '10px', marginBottom: '10px', backgroundColor: '#f9f9f9' }}>
161
+ <p style={{ marginBottom: '5px' }}>
162
+ <strong>John D.</strong> ★★★★★
163
+ </p>
164
+ <p>Great product, highly recommended!</p>
165
+ </div>
166
+ <div style={{ padding: '10px', backgroundColor: '#f9f9f9' }}>
167
+ <p style={{ marginBottom: '5px' }}>
168
+ <strong>Sarah T.</strong> ★★★★☆
169
+ </p>
170
+ <p>Very good quality and fast shipping.</p>
171
+ </div>
172
+ </div>
173
+ ),
174
+ },
175
+ ],
176
+ activeIndex: 0,
177
+ },
133
178
  };
134
179
 
135
- export const Glass = {
180
+ /**
181
+ * Tabs with glass morphism effect enabled.
182
+ */
183
+ export const Glass: Story = {
136
184
  args: {
137
185
  items: [
138
186
  {
@@ -170,7 +218,10 @@ export const Glass = {
170
218
  ),
171
219
  };
172
220
 
173
- export const GlassCustom = {
221
+ /**
222
+ * Tabs with custom glass morphism settings.
223
+ */
224
+ export const GlassCustom: Story = {
174
225
  args: {
175
226
  items: [
176
227
  {
@@ -193,9 +244,9 @@ export const GlassCustom = {
193
244
  saturation: 200,
194
245
  aberrationIntensity: 0.8,
195
246
  cornerRadius: 12,
196
- },
247
+ } as GlassProps,
197
248
  },
198
- render: (args: any) => (
249
+ render: args => (
199
250
  <div
200
251
  style={{
201
252
  background:
@@ -1,4 +1,4 @@
1
- import React, { useState, ReactNode } from 'react';
1
+ import React, { useState, ReactNode, memo } from 'react';
2
2
  import { TAB } from '../../lib/constants/components';
3
3
  import { AtomixGlass } from '../AtomixGlass/AtomixGlass';
4
4
  import { AtomixGlassProps } from '../../lib/types/components';
@@ -61,7 +61,7 @@ export interface TabsProps {
61
61
  /**
62
62
  * Tabs component for switching between different content panels
63
63
  */
64
- export const Tabs: React.FC<TabsProps> = ({
64
+ export const Tabs: React.FC<TabsProps> = memo(({
65
65
  items,
66
66
  activeIndex = TAB.DEFAULTS.ACTIVE_INDEX,
67
67
  onTabChange,
@@ -137,7 +137,7 @@ export const Tabs: React.FC<TabsProps> = ({
137
137
  }
138
138
 
139
139
  return tabContent;
140
- };
140
+ });
141
141
 
142
142
  Tabs.displayName = 'Tabs';
143
143