@shohojdhara/atomix 0.3.15 → 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 (245) hide show
  1. package/build-tools/index.d.ts +31 -30
  2. package/build-tools/package.json +4 -21
  3. package/dist/atomix.css +20924 -2611
  4. package/dist/atomix.css.map +1 -1
  5. package/dist/atomix.min.css +76 -2
  6. package/dist/atomix.min.css.map +1 -1
  7. package/dist/build-tools/index.d.ts +31 -30
  8. package/dist/build-tools/package.json +4 -21
  9. package/dist/charts.js.map +1 -1
  10. package/dist/core.js.map +1 -1
  11. package/dist/forms.js.map +1 -1
  12. package/dist/heavy.js.map +1 -1
  13. package/dist/index.d.ts +144 -18
  14. package/dist/index.esm.js +110 -55
  15. package/dist/index.esm.js.map +1 -1
  16. package/dist/index.js +110 -55
  17. package/dist/index.js.map +1 -1
  18. package/dist/index.min.js +1 -1
  19. package/dist/index.min.js.map +1 -1
  20. package/dist/layout.js.map +1 -1
  21. package/dist/theme.d.ts +9 -9
  22. package/dist/theme.js.map +1 -1
  23. package/package.json +1 -1
  24. package/src/components/Accordion/Accordion.stories.tsx +32 -23
  25. package/src/components/Accordion/Accordion.test.tsx +70 -50
  26. package/src/components/Accordion/Accordion.tsx +99 -94
  27. package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
  28. package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
  29. package/src/components/AtomixGlass/glass-utils.ts +4 -3
  30. package/src/components/AtomixGlass/shader-utils.ts +128 -52
  31. package/src/components/AtomixGlass/stories/Playground.stories.tsx +1 -1
  32. package/src/components/AtomixGlass/stories/Shaders.stories.tsx +1 -1
  33. package/src/components/Avatar/Avatar.stories.tsx +45 -62
  34. package/src/components/Avatar/Avatar.tsx +58 -56
  35. package/src/components/Badge/Badge.stories.tsx +20 -9
  36. package/src/components/Badge/Badge.test.tsx +41 -41
  37. package/src/components/Badge/Badge.tsx +64 -62
  38. package/src/components/Block/Block.stories.tsx +14 -4
  39. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +9 -8
  40. package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
  41. package/src/components/Button/Button.stories.tsx +13 -22
  42. package/src/components/Button/Button.test.tsx +97 -81
  43. package/src/components/Button/Button.tsx +46 -14
  44. package/src/components/Button/ButtonGroup.stories.tsx +37 -32
  45. package/src/components/Button/ButtonGroup.tsx +4 -15
  46. package/src/components/Callout/Callout.stories.tsx +109 -16
  47. package/src/components/Card/Card.stories.tsx +67 -36
  48. package/src/components/Card/Card.tsx +30 -14
  49. package/src/components/Chart/AreaChart.tsx +1 -1
  50. package/src/components/Chart/CandlestickChart.tsx +23 -16
  51. package/src/components/Chart/Chart.stories.tsx +4 -9
  52. package/src/components/Chart/Chart.tsx +40 -44
  53. package/src/components/Chart/ChartRenderer.tsx +39 -12
  54. package/src/components/Chart/ChartToolbar.tsx +21 -5
  55. package/src/components/Chart/DonutChart.tsx +1 -1
  56. package/src/components/Chart/FunnelChart.tsx +4 -1
  57. package/src/components/Chart/GaugeChart.tsx +3 -1
  58. package/src/components/Chart/HeatmapChart.tsx +50 -37
  59. package/src/components/Chart/LineChart.tsx +3 -2
  60. package/src/components/Chart/MultiAxisChart.tsx +24 -16
  61. package/src/components/Chart/RadarChart.tsx +19 -17
  62. package/src/components/Chart/ScatterChart.tsx +29 -21
  63. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +6 -2
  64. package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
  65. package/src/components/Countdown/Countdown.stories.tsx +7 -7
  66. package/src/components/DataTable/DataTable.stories.tsx +43 -38
  67. package/src/components/DataTable/DataTable.test.tsx +26 -148
  68. package/src/components/DataTable/DataTable.tsx +485 -456
  69. package/src/components/DatePicker/DatePicker.stories.tsx +32 -47
  70. package/src/components/DatePicker/DatePicker.tsx +31 -26
  71. package/src/components/Dropdown/Dropdown.stories.tsx +2 -5
  72. package/src/components/Dropdown/Dropdown.tsx +313 -299
  73. package/src/components/EdgePanel/EdgePanel.stories.tsx +6 -19
  74. package/src/components/EdgePanel/EdgePanel.tsx +1 -3
  75. package/src/components/Footer/Footer.stories.tsx +21 -16
  76. package/src/components/Footer/Footer.tsx +130 -128
  77. package/src/components/Footer/FooterLink.tsx +2 -2
  78. package/src/components/Form/Checkbox.test.tsx +49 -49
  79. package/src/components/Form/Checkbox.tsx +108 -100
  80. package/src/components/Form/Form.stories.tsx +2 -10
  81. package/src/components/Form/Input.stories.tsx +22 -39
  82. package/src/components/Form/Input.test.tsx +38 -44
  83. package/src/components/Form/Radio.stories.tsx +6 -12
  84. package/src/components/Form/Radio.tsx +68 -66
  85. package/src/components/Form/Select.tsx +184 -182
  86. package/src/components/Form/Textarea.test.tsx +27 -32
  87. package/src/components/Hero/Hero.stories.tsx +56 -23
  88. package/src/components/Hero/Hero.tsx +201 -55
  89. package/src/components/Icon/index.ts +7 -1
  90. package/src/components/List/List.tsx +19 -23
  91. package/src/components/Modal/Modal.stories.tsx +2 -1
  92. package/src/components/Modal/Modal.tsx +130 -127
  93. package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
  94. package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
  95. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
  96. package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
  97. package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
  98. package/src/components/Pagination/Pagination.stories.tsx +7 -4
  99. package/src/components/Pagination/Pagination.tsx +199 -202
  100. package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
  101. package/src/components/Popover/Popover.stories.tsx +99 -192
  102. package/src/components/Popover/Popover.tsx +41 -37
  103. package/src/components/Progress/Progress.stories.tsx +35 -44
  104. package/src/components/River/River.stories.tsx +2 -1
  105. package/src/components/SectionIntro/SectionIntro.stories.tsx +71 -71
  106. package/src/components/Slider/Slider.stories.tsx +12 -4
  107. package/src/components/Spinner/Spinner.stories.tsx +3 -1
  108. package/src/components/Spinner/Spinner.test.tsx +23 -23
  109. package/src/components/Spinner/Spinner.tsx +43 -46
  110. package/src/components/Steps/Steps.stories.tsx +8 -6
  111. package/src/components/Tabs/Tabs.stories.tsx +12 -9
  112. package/src/components/Tabs/Tabs.tsx +74 -72
  113. package/src/components/Toggle/Toggle.stories.tsx +27 -13
  114. package/src/components/Toggle/Toggle.test.tsx +65 -70
  115. package/src/components/Toggle/Toggle.tsx +4 -1
  116. package/src/components/Tooltip/Tooltip.stories.tsx +24 -20
  117. package/src/components/Tooltip/Tooltip.tsx +104 -106
  118. package/src/components/Upload/Upload.stories.tsx +129 -127
  119. package/src/components/Upload/Upload.tsx +287 -283
  120. package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
  121. package/src/components/index.ts +13 -2
  122. package/src/layouts/Grid/Grid.stories.tsx +9 -3
  123. package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
  124. package/src/lib/__tests__/theme-tools.test.ts +32 -6
  125. package/src/lib/composables/shared-mouse-tracker.ts +13 -14
  126. package/src/lib/composables/useAtomixGlass.ts +106 -49
  127. package/src/lib/composables/useChartExport.ts +1 -1
  128. package/src/lib/composables/useDataTable.ts +29 -17
  129. package/src/lib/composables/useHero.ts +58 -14
  130. package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
  131. package/src/lib/composables/useInput.ts +10 -8
  132. package/src/lib/composables/useSideMenu.ts +6 -5
  133. package/src/lib/composables/useTooltip.ts +1 -2
  134. package/src/lib/composables/useVideoPlayer.ts +44 -35
  135. package/src/lib/config/index.ts +154 -154
  136. package/src/lib/constants/cssVariables.ts +29 -29
  137. package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
  138. package/src/lib/hooks/index.ts +1 -1
  139. package/src/lib/hooks/useComponentCustomization.ts +11 -17
  140. package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
  141. package/src/lib/patterns/__tests__/slots.test.ts +1 -1
  142. package/src/lib/patterns/index.ts +1 -1
  143. package/src/lib/patterns/slots.tsx +8 -13
  144. package/src/lib/storybook/InteractiveDemo.tsx +13 -18
  145. package/src/lib/storybook/PreviewContainer.tsx +1 -1
  146. package/src/lib/storybook/VariantsGrid.tsx +3 -7
  147. package/src/lib/storybook/index.ts +1 -1
  148. package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
  149. package/src/lib/theme/adapters/index.ts +3 -9
  150. package/src/lib/theme/adapters/themeAdapter.ts +41 -26
  151. package/src/lib/theme/config/index.ts +1 -1
  152. package/src/lib/theme/config/types.ts +2 -2
  153. package/src/lib/theme/config/validator.ts +10 -5
  154. package/src/lib/theme/constants/constants.ts +2 -2
  155. package/src/lib/theme/constants/index.ts +1 -2
  156. package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
  157. package/src/lib/theme/core/composeTheme.ts +32 -26
  158. package/src/lib/theme/core/createTheme.ts +1 -1
  159. package/src/lib/theme/core/createThemeObject.ts +308 -301
  160. package/src/lib/theme/core/index.ts +3 -3
  161. package/src/lib/theme/devtools/CLI.ts +106 -104
  162. package/src/lib/theme/devtools/Comparator.tsx +50 -32
  163. package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
  164. package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
  165. package/src/lib/theme/devtools/Inspector.tsx +75 -60
  166. package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
  167. package/src/lib/theme/devtools/Preview.tsx +150 -106
  168. package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
  169. package/src/lib/theme/devtools/index.ts +3 -9
  170. package/src/lib/theme/devtools/useHistory.ts +23 -21
  171. package/src/lib/theme/errors/errors.ts +12 -11
  172. package/src/lib/theme/errors/index.ts +2 -7
  173. package/src/lib/theme/generators/generateCSS.ts +9 -13
  174. package/src/lib/theme/generators/generateCSSNested.ts +1 -6
  175. package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
  176. package/src/lib/theme/generators/index.ts +1 -4
  177. package/src/lib/theme/i18n/index.ts +1 -1
  178. package/src/lib/theme/i18n/rtl.ts +13 -13
  179. package/src/lib/theme/index.ts +7 -16
  180. package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
  181. package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
  182. package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
  183. package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
  184. package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
  185. package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
  186. package/src/lib/theme/runtime/index.ts +2 -5
  187. package/src/lib/theme/runtime/useTheme.ts +18 -18
  188. package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
  189. package/src/lib/theme/test/testTheme.ts +15 -16
  190. package/src/lib/theme/tokens/index.ts +2 -7
  191. package/src/lib/theme/tokens/tokens.ts +25 -24
  192. package/src/lib/theme/types.ts +428 -411
  193. package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
  194. package/src/lib/theme/utils/componentTheming.ts +18 -18
  195. package/src/lib/theme/utils/domUtils.ts +277 -289
  196. package/src/lib/theme/utils/index.ts +1 -2
  197. package/src/lib/theme/utils/injectCSS.ts +10 -14
  198. package/src/lib/theme/utils/naming.ts +20 -16
  199. package/src/lib/theme/utils/themeHelpers.ts +10 -12
  200. package/src/lib/theme/utils/themeUtils.ts +85 -86
  201. package/src/lib/theme/utils/themeValidation.ts +82 -33
  202. package/src/lib/theme-tools.ts +8 -6
  203. package/src/lib/types/components.ts +172 -71
  204. package/src/lib/types/partProps.ts +1 -1
  205. package/src/lib/utils/__tests__/csv.test.ts +1 -1
  206. package/src/lib/utils/componentUtils.ts +8 -12
  207. package/src/lib/utils/csv.ts +3 -1
  208. package/src/lib/utils/dataTableExport.ts +1 -5
  209. package/src/lib/utils/fontPreloader.ts +10 -19
  210. package/src/lib/utils/icons.ts +4 -1
  211. package/src/lib/utils/index.ts +2 -6
  212. package/src/lib/utils/memoryMonitor.ts +10 -8
  213. package/src/lib/utils/themeNaming.ts +2 -2
  214. package/src/styles/01-settings/_index.scss +0 -1
  215. package/src/styles/01-settings/_settings.colors.scss +8 -8
  216. package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
  217. package/src/styles/01-settings/_settings.navbar.scss +1 -1
  218. package/src/styles/01-settings/_settings.spacing.scss +3 -4
  219. package/src/styles/01-settings/_settings.tooltip.scss +1 -1
  220. package/src/styles/01-settings/_settings.typography.scss +1 -1
  221. package/src/styles/02-tools/_tools.button.scss +51 -21
  222. package/src/styles/02-tools/_tools.utility-api.scss +30 -18
  223. package/src/styles/03-generic/_generic.root.scss +4 -3
  224. package/src/styles/06-components/_components.atomix-glass.scss +13 -9
  225. package/src/styles/06-components/_components.button.scss +16 -4
  226. package/src/styles/06-components/_components.callout.scss +27 -21
  227. package/src/styles/06-components/_components.card.scss +5 -14
  228. package/src/styles/06-components/_components.chart.scss +22 -19
  229. package/src/styles/06-components/_components.checkbox.scss +3 -1
  230. package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
  231. package/src/styles/06-components/_components.edge-panel.scss +9 -2
  232. package/src/styles/06-components/_components.footer.scss +1 -1
  233. package/src/styles/06-components/_components.side-menu.scss +5 -5
  234. package/src/styles/06-components/_components.toggle.scss +18 -0
  235. package/src/styles/06-components/_index.scss +1 -1
  236. package/src/styles/06-components/old.chart.styles.scss +0 -2
  237. package/src/styles/99-utilities/_utilities.border.scss +69 -27
  238. package/src/styles/99-utilities/_utilities.display.scss +1 -1
  239. package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
  240. package/src/styles/99-utilities/_utilities.position.scss +16 -9
  241. package/src/styles/99-utilities/_utilities.scss +1 -1
  242. package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
  243. package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
  244. package/src/styles/99-utilities/_utilities.text-gradient.scss +30 -30
  245. package/src/styles/99-utilities/_utilities.text.scss +67 -46
@@ -61,83 +61,85 @@ export interface TabsProps {
61
61
  /**
62
62
  * Tabs component for switching between different content panels
63
63
  */
64
- export const Tabs: React.FC<TabsProps> = memo(({
65
- items,
66
- activeIndex = TAB.DEFAULTS.ACTIVE_INDEX,
67
- onTabChange,
68
- className = '',
69
- style,
70
- glass,
71
- }) => {
72
- const [currentTab, setCurrentTab] = useState(activeIndex);
73
-
74
- // Handle tab change
75
- const handleTabClick = (index: number) => {
76
- setCurrentTab(index);
77
- if (onTabChange) {
78
- onTabChange(index);
79
- }
80
- };
81
-
82
- const tabContent = (
83
- <div className={`c-tabs js-atomix-tab ${className}`} style={style}>
84
- <ul className="c-tabs__nav">
85
- {items.map((item, index) => (
86
- <li className="c-tabs__nav-item" key={`tab-nav-${index}`}>
87
- <button
88
- className={`c-tabs__nav-btn ${index === currentTab ? TAB.CLASSES.ACTIVE : ''}`}
89
- onClick={() => handleTabClick(index)}
64
+ export const Tabs: React.FC<TabsProps> = memo(
65
+ ({
66
+ items,
67
+ activeIndex = TAB.DEFAULTS.ACTIVE_INDEX,
68
+ onTabChange,
69
+ className = '',
70
+ style,
71
+ glass,
72
+ }) => {
73
+ const [currentTab, setCurrentTab] = useState(activeIndex);
74
+
75
+ // Handle tab change
76
+ const handleTabClick = (index: number) => {
77
+ setCurrentTab(index);
78
+ if (onTabChange) {
79
+ onTabChange(index);
80
+ }
81
+ };
82
+
83
+ const tabContent = (
84
+ <div className={`c-tabs js-atomix-tab ${className}`} style={style}>
85
+ <ul className="c-tabs__nav">
86
+ {items.map((item, index) => (
87
+ <li className="c-tabs__nav-item" key={`tab-nav-${index}`}>
88
+ <button
89
+ className={`c-tabs__nav-btn ${index === currentTab ? TAB.CLASSES.ACTIVE : ''}`}
90
+ onClick={() => handleTabClick(index)}
91
+ data-tabindex={index}
92
+ role="tab"
93
+ aria-selected={index === currentTab}
94
+ aria-controls={`tab-panel-${index}`}
95
+ >
96
+ {item.label}
97
+ </button>
98
+ </li>
99
+ ))}
100
+ </ul>
101
+ <div className="c-tabs__panels">
102
+ {items.map((item, index) => (
103
+ <div
104
+ className={`c-tabs__panel ${index === currentTab ? TAB.CLASSES.ACTIVE : ''}`}
105
+ key={`tab-panel-${index}`}
90
106
  data-tabindex={index}
91
- role="tab"
92
- aria-selected={index === currentTab}
93
- aria-controls={`tab-panel-${index}`}
107
+ id={`tab-panel-${index}`}
108
+ role="tabpanel"
109
+ aria-labelledby={`tab-nav-${index}`}
110
+ style={{
111
+ height: index === currentTab ? 'auto' : '0px',
112
+ opacity: index === currentTab ? 1 : 0,
113
+ overflow: 'hidden',
114
+ transition: 'height 0.3s ease, opacity 0.3s ease',
115
+ }}
94
116
  >
95
- {item.label}
96
- </button>
97
- </li>
98
- ))}
99
- </ul>
100
- <div className="c-tabs__panels">
101
- {items.map((item, index) => (
102
- <div
103
- className={`c-tabs__panel ${index === currentTab ? TAB.CLASSES.ACTIVE : ''}`}
104
- key={`tab-panel-${index}`}
105
- data-tabindex={index}
106
- id={`tab-panel-${index}`}
107
- role="tabpanel"
108
- aria-labelledby={`tab-nav-${index}`}
109
- style={{
110
- height: index === currentTab ? 'auto' : '0px',
111
- opacity: index === currentTab ? 1 : 0,
112
- overflow: 'hidden',
113
- transition: 'height 0.3s ease, opacity 0.3s ease',
114
- }}
115
- >
116
- <div className="c-tabs__panel-body">{item.content}</div>
117
- </div>
118
- ))}
117
+ <div className="c-tabs__panel-body">{item.content}</div>
118
+ </div>
119
+ ))}
120
+ </div>
119
121
  </div>
120
- </div>
121
- );
122
-
123
- if (glass) {
124
- // Default glass settings for tabs
125
- const defaultGlassProps = {
126
- displacementScale: 60,
127
- blurAmount: 1,
128
- saturation: 160,
129
- aberrationIntensity: 0.5,
130
- cornerRadius: 8,
131
- mode: 'shader' as const,
132
- };
133
-
134
- const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
122
+ );
123
+
124
+ if (glass) {
125
+ // Default glass settings for tabs
126
+ const defaultGlassProps = {
127
+ displacementScale: 60,
128
+ blurAmount: 1,
129
+ saturation: 160,
130
+ aberrationIntensity: 0.5,
131
+ cornerRadius: 8,
132
+ mode: 'shader' as const,
133
+ };
134
+
135
+ const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
136
+
137
+ return <AtomixGlass {...glassProps}>{tabContent}</AtomixGlass>;
138
+ }
135
139
 
136
- return <AtomixGlass {...glassProps}>{tabContent}</AtomixGlass>;
140
+ return tabContent;
137
141
  }
138
-
139
- return tabContent;
140
- });
142
+ );
141
143
 
142
144
  Tabs.displayName = 'Tabs';
143
145
 
@@ -3,7 +3,7 @@ import type { Meta, StoryObj } from '@storybook/react';
3
3
  import { fn } from '@storybook/test';
4
4
  import { Toggle } from './Toggle';
5
5
 
6
- const meta = {
6
+ const meta: Meta<typeof Toggle> = {
7
7
  title: 'Components/Toggle',
8
8
  component: Toggle,
9
9
  parameters: {
@@ -75,7 +75,7 @@ Toggle provides an on/off switch control for binary choices. It offers a more vi
75
75
  description: 'Whether the toggle is initially on (uncontrolled)',
76
76
  table: {
77
77
  type: { summary: 'boolean' },
78
- defaultValue: { summary: false },
78
+ defaultValue: { summary: 'false' },
79
79
  },
80
80
  },
81
81
  checked: {
@@ -95,7 +95,7 @@ Toggle provides an on/off switch control for binary choices. It offers a more vi
95
95
  description: 'Whether the toggle is disabled',
96
96
  table: {
97
97
  type: { summary: 'boolean' },
98
- defaultValue: { summary: false },
98
+ defaultValue: { summary: 'false' },
99
99
  },
100
100
  },
101
101
  glass: {
@@ -103,11 +103,11 @@ Toggle provides an on/off switch control for binary choices. It offers a more vi
103
103
  description: 'Enable glass morphism effect',
104
104
  table: {
105
105
  type: { summary: 'boolean' },
106
- defaultValue: { summary: false },
106
+ defaultValue: { summary: 'false' },
107
107
  },
108
108
  },
109
109
  },
110
- } satisfies Meta<typeof Toggle>;
110
+ };
111
111
 
112
112
  export default meta;
113
113
  type Story = StoryObj<typeof meta>;
@@ -171,7 +171,15 @@ export const InitiallyOn: Story = {
171
171
 
172
172
  export const DisabledStates: Story = {
173
173
  render: () => (
174
- <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '2rem', padding: '30px' }}>
174
+ <div
175
+ style={{
176
+ display: 'flex',
177
+ flexDirection: 'column',
178
+ alignItems: 'center',
179
+ gap: '2rem',
180
+ padding: '30px',
181
+ }}
182
+ >
175
183
  <div style={{ display: 'flex', alignItems: 'center', gap: '1rem' }}>
176
184
  <Toggle disabled={true} checked={false} />
177
185
  <span>Disabled Off</span>
@@ -193,13 +201,19 @@ export const DisabledStates: Story = {
193
201
 
194
202
  export const WithGlassEffect: Story = {
195
203
  render: args => (
196
- <div style={{
197
- display: 'flex',
198
- justifyContent: 'center',
199
- padding: '30px',
200
- background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
201
- minHeight: '200px'
202
- }}>
204
+ <div
205
+ style={{
206
+ background: 'url(https://images.unsplash.com/photo-1579546929518-9e396f3cc809)',
207
+ backgroundSize: 'cover',
208
+ backgroundPosition: 'center',
209
+ padding: '3rem',
210
+ borderRadius: '12px',
211
+ minHeight: '200px',
212
+ display: 'flex',
213
+ alignItems: 'center',
214
+ justifyContent: 'center',
215
+ }}
216
+ >
203
217
  <Toggle {...args} />
204
218
  </div>
205
219
  ),
@@ -4,88 +4,83 @@ import { Toggle } from './Toggle';
4
4
  import React from 'react';
5
5
 
6
6
  describe('Toggle Component', () => {
7
- it('renders correctly', () => {
8
- render(<Toggle />);
9
- const toggle = screen.getByRole('switch');
10
- expect(toggle).toBeInTheDocument();
11
- expect(toggle).toHaveAttribute('aria-checked', 'false');
12
- });
7
+ it('renders correctly', () => {
8
+ render(<Toggle />);
9
+ const toggle = screen.getByRole('switch');
10
+ expect(toggle).toBeInTheDocument();
11
+ expect(toggle).toHaveAttribute('aria-checked', 'false');
12
+ });
13
13
 
14
- it('handles defaultChecked (uncontrolled)', () => {
15
- render(<Toggle defaultChecked={true} />);
16
- const toggle = screen.getByRole('switch');
17
- expect(toggle).toHaveAttribute('aria-checked', 'true');
18
- });
14
+ it('handles defaultChecked (uncontrolled)', () => {
15
+ render(<Toggle defaultChecked={true} />);
16
+ const toggle = screen.getByRole('switch');
17
+ expect(toggle).toHaveAttribute('aria-checked', 'true');
18
+ });
19
19
 
20
- it('toggles state when clicked (uncontrolled)', () => {
21
- const handleChange = vi.fn();
22
- render(<Toggle onChange={handleChange} />);
23
- const toggle = screen.getByRole('switch');
20
+ it('toggles state when clicked (uncontrolled)', () => {
21
+ const handleChange = vi.fn();
22
+ render(<Toggle onChange={handleChange} />);
23
+ const toggle = screen.getByRole('switch');
24
24
 
25
- fireEvent.click(toggle);
26
- expect(toggle).toHaveAttribute('aria-checked', 'true');
27
- expect(handleChange).toHaveBeenCalledWith(true);
25
+ fireEvent.click(toggle);
26
+ expect(toggle).toHaveAttribute('aria-checked', 'true');
27
+ expect(handleChange).toHaveBeenCalledWith(true);
28
28
 
29
- fireEvent.click(toggle);
30
- expect(toggle).toHaveAttribute('aria-checked', 'false');
31
- expect(handleChange).toHaveBeenCalledWith(false);
32
- });
29
+ fireEvent.click(toggle);
30
+ expect(toggle).toHaveAttribute('aria-checked', 'false');
31
+ expect(handleChange).toHaveBeenCalledWith(false);
32
+ });
33
33
 
34
- it('handles checked (controlled)', () => {
35
- const { rerender } = render(<Toggle checked={true} />);
36
- const toggle = screen.getByRole('switch');
37
- expect(toggle).toHaveAttribute('aria-checked', 'true');
34
+ it('handles checked (controlled)', () => {
35
+ const { rerender } = render(<Toggle checked={true} />);
36
+ const toggle = screen.getByRole('switch');
37
+ expect(toggle).toHaveAttribute('aria-checked', 'true');
38
38
 
39
- rerender(<Toggle checked={false} />);
40
- expect(toggle).toHaveAttribute('aria-checked', 'false');
41
- });
39
+ rerender(<Toggle checked={false} />);
40
+ expect(toggle).toHaveAttribute('aria-checked', 'false');
41
+ });
42
42
 
43
- it('calls onChange but does not toggle internally when controlled', () => {
44
- const handleChange = vi.fn();
45
- render(<Toggle checked={false} onChange={handleChange} />);
46
- const toggle = screen.getByRole('switch');
43
+ it('calls onChange but does not toggle internally when controlled', () => {
44
+ const handleChange = vi.fn();
45
+ render(<Toggle checked={false} onChange={handleChange} />);
46
+ const toggle = screen.getByRole('switch');
47
47
 
48
- fireEvent.click(toggle);
49
- expect(handleChange).toHaveBeenCalledWith(true);
50
- // Should still be false because it's controlled and we haven't rerendered with checked={true}
51
- expect(toggle).toHaveAttribute('aria-checked', 'false');
52
- });
48
+ fireEvent.click(toggle);
49
+ expect(handleChange).toHaveBeenCalledWith(true);
50
+ // Should still be false because it's controlled and we haven't rerendered with checked={true}
51
+ expect(toggle).toHaveAttribute('aria-checked', 'false');
52
+ });
53
53
 
54
- it('does not toggle when disabled', () => {
55
- const handleChange = vi.fn();
56
- render(<Toggle disabled onChange={handleChange} />);
57
- const toggle = screen.getByRole('switch');
54
+ it('does not toggle when disabled', () => {
55
+ const handleChange = vi.fn();
56
+ render(<Toggle disabled onChange={handleChange} />);
57
+ const toggle = screen.getByRole('switch');
58
58
 
59
- fireEvent.click(toggle);
60
- expect(handleChange).not.toHaveBeenCalled();
61
- expect(toggle).toHaveAttribute('aria-checked', 'false');
62
- expect(toggle).toHaveAttribute('aria-disabled', 'true');
63
- expect(toggle).toHaveAttribute('tabindex', '-1');
64
- });
59
+ fireEvent.click(toggle);
60
+ expect(handleChange).not.toHaveBeenCalled();
61
+ expect(toggle).toHaveAttribute('aria-checked', 'false');
62
+ expect(toggle).toHaveAttribute('aria-disabled', 'true');
63
+ expect(toggle).toHaveAttribute('tabindex', '-1');
64
+ });
65
65
 
66
- it('handles keyboard interaction', () => {
67
- const handleChange = vi.fn();
68
- render(<Toggle onChange={handleChange} />);
69
- const toggle = screen.getByRole('switch');
66
+ it('handles keyboard interaction', () => {
67
+ const handleChange = vi.fn();
68
+ render(<Toggle onChange={handleChange} />);
69
+ const toggle = screen.getByRole('switch');
70
70
 
71
- fireEvent.keyDown(toggle, { key: 'Enter' });
72
- expect(toggle).toHaveAttribute('aria-checked', 'true');
73
- expect(handleChange).toHaveBeenCalledWith(true);
71
+ fireEvent.keyDown(toggle, { key: 'Enter' });
72
+ expect(toggle).toHaveAttribute('aria-checked', 'true');
73
+ expect(handleChange).toHaveBeenCalledWith(true);
74
74
 
75
- fireEvent.keyDown(toggle, { key: ' ' });
76
- expect(toggle).toHaveAttribute('aria-checked', 'false');
77
- expect(handleChange).toHaveBeenCalledWith(false);
78
- });
75
+ fireEvent.keyDown(toggle, { key: ' ' });
76
+ expect(toggle).toHaveAttribute('aria-checked', 'false');
77
+ expect(handleChange).toHaveBeenCalledWith(false);
78
+ });
79
79
 
80
- it('applies accessibility attributes', () => {
81
- render(
82
- <Toggle
83
- aria-label="Accessible Toggle"
84
- aria-describedby="description-id"
85
- />
86
- );
87
- const toggle = screen.getByRole('switch');
88
- expect(toggle).toHaveAttribute('aria-label', 'Accessible Toggle');
89
- expect(toggle).toHaveAttribute('aria-describedby', 'description-id');
90
- });
80
+ it('applies accessibility attributes', () => {
81
+ render(<Toggle aria-label="Accessible Toggle" aria-describedby="description-id" />);
82
+ const toggle = screen.getByRole('switch');
83
+ expect(toggle).toHaveAttribute('aria-label', 'Accessible Toggle');
84
+ expect(toggle).toHaveAttribute('aria-describedby', 'description-id');
85
+ });
91
86
  });
@@ -91,8 +91,11 @@ export const Toggle: React.FC<ToggleProps> = ({
91
91
  'c-toggle',
92
92
  isChecked && TOGGLE.CLASSES.IS_ON,
93
93
  disabled && 'is-disabled',
94
+ glass && 'c-toggle--glass',
94
95
  className,
95
- ].filter(Boolean).join(' ');
96
+ ]
97
+ .filter(Boolean)
98
+ .join(' ');
96
99
 
97
100
  const toggleContent = (
98
101
  <div
@@ -193,15 +193,17 @@ export const ClickTrigger: Story = {
193
193
 
194
194
  export const AllPositions: Story = {
195
195
  render: () => (
196
- <div style={{
197
- display: 'grid',
198
- gridTemplateColumns: 'repeat(3, 1fr)',
199
- gap: '20px',
200
- padding: '50px',
201
- alignItems: 'center',
202
- justifyItems: 'center',
203
- height: '500px'
204
- }}>
196
+ <div
197
+ style={{
198
+ display: 'grid',
199
+ gridTemplateColumns: 'repeat(3, 1fr)',
200
+ gap: '20px',
201
+ padding: '50px',
202
+ alignItems: 'center',
203
+ justifyItems: 'center',
204
+ height: '500px',
205
+ }}
206
+ >
205
207
  <div>
206
208
  <Tooltip content="Top Left Tooltip">
207
209
  <button className="c-btn c-btn--primary">Top Left</button>
@@ -217,23 +219,23 @@ export const AllPositions: Story = {
217
219
  <button className="c-btn c-btn--primary">Top Right</button>
218
220
  </Tooltip>
219
221
  </div>
220
-
222
+
221
223
  <div>
222
224
  <Tooltip content="Left Tooltip" position="left">
223
225
  <button className="c-btn c-btn--primary">Left</button>
224
226
  </Tooltip>
225
227
  </div>
226
-
228
+
227
229
  <div style={{ textAlign: 'center' }}>
228
230
  <p>All tooltip positions</p>
229
231
  </div>
230
-
232
+
231
233
  <div>
232
234
  <Tooltip content="Right Tooltip" position="right">
233
235
  <button className="c-btn c-btn--primary">Right</button>
234
236
  </Tooltip>
235
237
  </div>
236
-
238
+
237
239
  <div>
238
240
  <Tooltip content="Bottom Left Tooltip" position="bottom-left">
239
241
  <button className="c-btn c-btn--primary">Bottom Left</button>
@@ -262,13 +264,15 @@ export const AllPositions: Story = {
262
264
 
263
265
  export const WithGlassEffect: Story = {
264
266
  render: args => (
265
- <div style={{
266
- display: 'flex',
267
- justifyContent: 'center',
268
- padding: '100px',
269
- background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
270
- minHeight: '300px'
271
- }}>
267
+ <div
268
+ style={{
269
+ display: 'flex',
270
+ justifyContent: 'center',
271
+ padding: '100px',
272
+ background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
273
+ minHeight: '300px',
274
+ }}
275
+ >
272
276
  <Tooltip {...args}>
273
277
  <button className="c-btn c-btn--primary">Hover me</button>
274
278
  </Tooltip>