@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
@@ -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
@@ -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 type { AtomixGlassProps } from '../../lib/types/components';
4
5
  import { Tooltip } from './Tooltip';
5
6
 
@@ -13,8 +14,69 @@ const meta = {
13
14
  layout: 'fullscreen',
14
15
  docs: {
15
16
  description: {
16
- component:
17
- 'The Tooltip component displays contextual information when users hover over or click on an element. It supports multiple positions, triggers, and can include rich content. Tooltips are useful for providing additional context without cluttering the interface.',
17
+ component: `
18
+ # Tooltip
19
+
20
+ ## Overview
21
+
22
+ Tooltip displays contextual information when users hover over or click on an element. It supports multiple positions, triggers, and can include rich content. Tooltips are useful for providing additional context without cluttering the interface.
23
+
24
+ ## Features
25
+
26
+ - Multiple position options (top, bottom, left, right with corners)
27
+ - Hover and click triggers
28
+ - Configurable delays and offsets
29
+ - Glass morphism effect
30
+ - Rich content support
31
+ - Accessible design
32
+ - Responsive behavior
33
+
34
+ ## Accessibility
35
+
36
+ - Screen reader: Tooltip content announced appropriately
37
+ - ARIA support: Proper roles and properties for tooltip components
38
+ - Keyboard support: Accessible via keyboard navigation
39
+ - Focus management: Maintains focus on trigger element
40
+
41
+ ## Usage Examples
42
+
43
+ ### Basic Usage
44
+
45
+ \`\`\`tsx
46
+ <Tooltip
47
+ content="Tooltip text"
48
+ position="top"
49
+ >
50
+ <button>Hover me</button>
51
+ </Tooltip>
52
+ \`\`\`
53
+
54
+ ### With Glass Effect
55
+
56
+ \`\`\`tsx
57
+ <Tooltip
58
+ content="Tooltip text"
59
+ position="top"
60
+ glass={true}
61
+ >
62
+ <button>Hover me</button>
63
+ </Tooltip>
64
+ \`\`\`
65
+
66
+ ## API Reference
67
+
68
+ ### Props
69
+
70
+ | Prop | Type | Default | Description |
71
+ | ---- | ---- | ------- | ----------- |
72
+ | position | Position | 'top' | Position of the tooltip relative to the trigger |
73
+ | trigger | 'hover' \\| 'click' | 'hover' | How the tooltip is triggered |
74
+ | delay | number | 200 | Delay in milliseconds before showing tooltip |
75
+ | offset | number | 10 | Offset distance from the trigger element |
76
+ | glass | boolean \\| GlassProps | false | Enable glass morphism effect |
77
+ | content | ReactNode | - | Content to display in the tooltip |
78
+ | children | ReactNode | - | Trigger element for the tooltip |
79
+ `,
18
80
  },
19
81
  },
20
82
  },
@@ -32,24 +94,52 @@ const meta = {
32
94
  'bottom-left',
33
95
  'bottom-right',
34
96
  ],
35
- defaultValue: 'top',
97
+ description: 'Position of the tooltip relative to the trigger',
98
+ table: {
99
+ type: { summary: 'Position' },
100
+ defaultValue: { summary: 'top' },
101
+ },
36
102
  },
37
103
  trigger: {
38
104
  control: { type: 'select' },
39
105
  options: ['hover', 'click'],
40
- defaultValue: 'hover',
106
+ description: 'How the tooltip is triggered',
107
+ table: {
108
+ type: { summary: '"hover" | "click"' },
109
+ defaultValue: { summary: 'hover' },
110
+ },
41
111
  },
42
112
  delay: {
43
113
  control: { type: 'number' },
44
- defaultValue: 200,
114
+ description: 'Delay in milliseconds before showing tooltip',
115
+ table: {
116
+ type: { summary: 'number' },
117
+ defaultValue: { summary: 200 },
118
+ },
45
119
  },
46
120
  offset: {
47
121
  control: { type: 'number' },
48
- defaultValue: 10,
122
+ description: 'Offset distance from the trigger element',
123
+ table: {
124
+ type: { summary: 'number' },
125
+ defaultValue: { summary: 10 },
126
+ },
49
127
  },
50
128
  glass: {
51
129
  control: { type: 'boolean' },
52
130
  description: 'Enable glass morphism effect',
131
+ table: {
132
+ type: { summary: 'boolean | GlassProps' },
133
+ defaultValue: { summary: false },
134
+ },
135
+ },
136
+ content: {
137
+ control: 'object',
138
+ description: 'Content to display in the tooltip',
139
+ table: {
140
+ type: { summary: 'ReactNode' },
141
+ defaultValue: { summary: '-' },
142
+ },
53
143
  },
54
144
  },
55
145
  } satisfies Meta<typeof Tooltip>;
@@ -57,8 +147,7 @@ const meta = {
57
147
  export default meta;
58
148
  type Story = StoryObj<typeof meta>;
59
149
 
60
- // Default Tooltip
61
- export const Default: Story = {
150
+ export const BasicUsage: Story = {
62
151
  render: args => (
63
152
  <div style={{ display: 'flex', justifyContent: 'center', padding: '100px' }}>
64
153
  <Tooltip {...args}>
@@ -71,6 +160,13 @@ export const Default: Story = {
71
160
  position: 'top',
72
161
  trigger: 'hover',
73
162
  } as any,
163
+ parameters: {
164
+ docs: {
165
+ description: {
166
+ story: 'Default tooltip with top position and hover trigger.',
167
+ },
168
+ },
169
+ },
74
170
  };
75
171
 
76
172
  export const ClickTrigger: Story = {
@@ -86,117 +182,115 @@ export const ClickTrigger: Story = {
86
182
  position: 'top',
87
183
  trigger: 'click',
88
184
  } as any,
185
+ parameters: {
186
+ docs: {
187
+ description: {
188
+ story: 'Tooltip with click trigger instead of hover.',
189
+ },
190
+ },
191
+ },
89
192
  };
90
193
 
91
- export const BottomPosition: Story = {
92
- render: args => (
93
- <div style={{ display: 'flex', justifyContent: 'center', padding: '100px' }}>
94
- <Tooltip {...args}>
95
- <button className="c-btn c-btn--primary">Hover me</button>
96
- </Tooltip>
97
- </div>
98
- ),
99
- args: {
100
- content: <p className="u-mb-0">This tooltip appears below the trigger</p>,
101
- position: 'bottom',
102
- } as any,
103
- };
194
+ export const AllPositions: Story = {
195
+ render: () => (
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
+ >
207
+ <div>
208
+ <Tooltip content="Top Left Tooltip">
209
+ <button className="c-btn c-btn--primary">Top Left</button>
210
+ </Tooltip>
211
+ </div>
212
+ <div>
213
+ <Tooltip content="Top Tooltip" position="top">
214
+ <button className="c-btn c-btn--primary">Top</button>
215
+ </Tooltip>
216
+ </div>
217
+ <div>
218
+ <Tooltip content="Top Right Tooltip" position="top-right">
219
+ <button className="c-btn c-btn--primary">Top Right</button>
220
+ </Tooltip>
221
+ </div>
104
222
 
105
- export const LeftPosition: Story = {
106
- render: args => (
107
- <div style={{ display: 'flex', justifyContent: 'center', padding: '100px' }}>
108
- <Tooltip {...args}>
109
- <button className="c-btn c-btn--primary">Hover me</button>
110
- </Tooltip>
111
- </div>
112
- ),
113
- args: {
114
- content: <p className="u-mb-0">This tooltip appears to the left</p>,
115
- position: 'left',
116
- } as any,
117
- };
223
+ <div>
224
+ <Tooltip content="Left Tooltip" position="left">
225
+ <button className="c-btn c-btn--primary">Left</button>
226
+ </Tooltip>
227
+ </div>
118
228
 
119
- export const RightPosition: Story = {
120
- render: args => (
121
- <div style={{ display: 'flex', justifyContent: 'center', padding: '100px' }}>
122
- <Tooltip {...args}>
123
- <button className="c-btn c-btn--primary">Hover me</button>
124
- </Tooltip>
125
- </div>
126
- ),
127
- args: {
128
- content: <p className="u-mb-0">This tooltip appears to the right</p>,
129
- position: 'right',
130
- } as any,
131
- };
229
+ <div style={{ textAlign: 'center' }}>
230
+ <p>All tooltip positions</p>
231
+ </div>
132
232
 
133
- export const WithIcon: Story = {
134
- render: args => (
135
- <div style={{ display: 'flex', justifyContent: 'center', padding: '100px' }}>
136
- <Tooltip {...args}>
137
- <i className="icon-lux-info" style={{ fontSize: '24px', cursor: 'pointer' }}></i>
138
- </Tooltip>
139
- </div>
140
- ),
141
- args: {
142
- content: <p className="u-mb-0">Tooltips work great with icons</p>,
143
- position: 'top',
144
- } as any,
145
- };
233
+ <div>
234
+ <Tooltip content="Right Tooltip" position="right">
235
+ <button className="c-btn c-btn--primary">Right</button>
236
+ </Tooltip>
237
+ </div>
146
238
 
147
- export const CustomDelay: Story = {
148
- render: args => (
149
- <div style={{ display: 'flex', justifyContent: 'center', padding: '100px' }}>
150
- <Tooltip {...args}>
151
- <button className="c-btn c-btn--primary">Hover me (500ms delay)</button>
152
- </Tooltip>
239
+ <div>
240
+ <Tooltip content="Bottom Left Tooltip" position="bottom-left">
241
+ <button className="c-btn c-btn--primary">Bottom Left</button>
242
+ </Tooltip>
243
+ </div>
244
+ <div>
245
+ <Tooltip content="Bottom Tooltip" position="bottom">
246
+ <button className="c-btn c-btn--primary">Bottom</button>
247
+ </Tooltip>
248
+ </div>
249
+ <div>
250
+ <Tooltip content="Bottom Right Tooltip" position="bottom-right">
251
+ <button className="c-btn c-btn--primary">Bottom Right</button>
252
+ </Tooltip>
253
+ </div>
153
254
  </div>
154
255
  ),
155
- args: {
156
- content: <p className="u-mb-0">This tooltip has a longer delay</p>,
157
- position: 'top',
158
- delay: 500,
159
- } as any,
256
+ parameters: {
257
+ docs: {
258
+ description: {
259
+ story: 'All available tooltip positions demonstrated.',
260
+ },
261
+ },
262
+ },
160
263
  };
161
264
 
162
- export const CustomOffset: Story = {
265
+ export const WithGlassEffect: Story = {
163
266
  render: args => (
164
- <div style={{ display: 'flex', justifyContent: 'center', padding: '100px' }}>
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
+ >
165
276
  <Tooltip {...args}>
166
277
  <button className="c-btn c-btn--primary">Hover me</button>
167
278
  </Tooltip>
168
279
  </div>
169
280
  ),
170
281
  args: {
171
- content: <p className="u-mb-0">This tooltip has a larger offset from the trigger</p>,
282
+ content: <p className="u-mb-0">Tooltip with glass effect applied</p>,
172
283
  position: 'top',
173
- offset: 20,
174
- } as any,
175
- };
176
-
177
- export const RichContent: Story = {
178
- render: args => (
179
- <div style={{ display: 'flex', justifyContent: 'center', padding: '100px' }}>
180
- <Tooltip {...args}>
181
- <button className="c-btn c-btn--primary">Click for rich content</button>
182
- </Tooltip>
183
- </div>
184
- ),
185
- args: {
186
- content: (
187
- <div>
188
- <h4 style={{ marginTop: 0, marginBottom: '8px' }}>Rich Tooltip Content</h4>
189
- <ul style={{ margin: 0, paddingLeft: '16px' }}>
190
- <li>Supports HTML content</li>
191
- <li>Can include multiple elements</li>
192
- <li>Helpful for complex information</li>
193
- </ul>
194
- </div>
195
- ),
196
- position: 'bottom',
197
- trigger: 'click',
198
- offset: 15,
284
+ trigger: 'hover',
285
+ glass: true,
199
286
  } as any,
287
+ parameters: {
288
+ docs: {
289
+ description: {
290
+ story: 'Tooltip with glass morphism effect applied.',
291
+ },
292
+ },
293
+ },
200
294
  };
201
295
 
202
296
  /**