@shohojdhara/atomix 0.3.15 → 0.4.1

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 (276) hide show
  1. package/build-tools/index.d.ts +31 -30
  2. package/build-tools/package.json +4 -21
  3. package/dist/atomix.css +20234 -2027
  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 +4 -5
  10. package/dist/charts.js.map +1 -1
  11. package/dist/core.d.ts +87 -10
  12. package/dist/core.js +673 -480
  13. package/dist/core.js.map +1 -1
  14. package/dist/forms.d.ts +15 -3
  15. package/dist/forms.js +530 -97
  16. package/dist/forms.js.map +1 -1
  17. package/dist/heavy.js +5 -6
  18. package/dist/heavy.js.map +1 -1
  19. package/dist/index.d.ts +644 -277
  20. package/dist/index.esm.js +1948 -1347
  21. package/dist/index.esm.js.map +1 -1
  22. package/dist/index.js +3333 -2728
  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.js.map +1 -1
  27. package/dist/theme.d.ts +9 -9
  28. package/dist/theme.js.map +1 -1
  29. package/package.json +2 -2
  30. package/scripts/atomix-cli.js +10 -1
  31. package/scripts/cli/__tests__/utils.test.js +6 -2
  32. package/scripts/cli/migration-tools.js +2 -2
  33. package/scripts/cli/theme-bridge.js +7 -9
  34. package/scripts/cli/utils.js +2 -1
  35. package/src/components/Accordion/Accordion.stories.tsx +72 -23
  36. package/src/components/Accordion/Accordion.test.tsx +70 -50
  37. package/src/components/Accordion/Accordion.tsx +219 -96
  38. package/src/components/Accordion/AccordionCompound.test.tsx +70 -0
  39. package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
  40. package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
  41. package/src/components/AtomixGlass/glass-utils.ts +4 -3
  42. package/src/components/AtomixGlass/shader-utils.ts +128 -52
  43. package/src/components/AtomixGlass/stories/Playground.stories.tsx +1 -1
  44. package/src/components/AtomixGlass/stories/Shaders.stories.tsx +1 -1
  45. package/src/components/Avatar/Avatar.stories.tsx +45 -62
  46. package/src/components/Avatar/Avatar.tsx +58 -56
  47. package/src/components/Badge/Badge.stories.tsx +20 -9
  48. package/src/components/Badge/Badge.test.tsx +41 -41
  49. package/src/components/Badge/Badge.tsx +64 -62
  50. package/src/components/Block/Block.stories.tsx +14 -4
  51. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +9 -8
  52. package/src/components/Breadcrumb/Breadcrumb.tsx +173 -65
  53. package/src/components/Breadcrumb/BreadcrumbCompound.test.tsx +84 -0
  54. package/src/components/Button/Button.stories.tsx +13 -22
  55. package/src/components/Button/Button.test.tsx +97 -81
  56. package/src/components/Button/Button.tsx +46 -14
  57. package/src/components/Button/ButtonGroup.stories.tsx +37 -32
  58. package/src/components/Button/ButtonGroup.tsx +4 -15
  59. package/src/components/Callout/Callout.stories.tsx +166 -918
  60. package/src/components/Callout/Callout.tsx +196 -84
  61. package/src/components/Callout/CalloutCompound.test.tsx +72 -0
  62. package/src/components/Card/Card.stories.tsx +67 -36
  63. package/src/components/Card/Card.tsx +30 -14
  64. package/src/components/Chart/AreaChart.tsx +1 -1
  65. package/src/components/Chart/CandlestickChart.tsx +23 -16
  66. package/src/components/Chart/Chart.stories.tsx +4 -9
  67. package/src/components/Chart/Chart.tsx +40 -44
  68. package/src/components/Chart/ChartRenderer.tsx +39 -12
  69. package/src/components/Chart/ChartToolbar.tsx +21 -5
  70. package/src/components/Chart/DonutChart.tsx +1 -1
  71. package/src/components/Chart/FunnelChart.tsx +4 -1
  72. package/src/components/Chart/GaugeChart.tsx +3 -1
  73. package/src/components/Chart/HeatmapChart.tsx +50 -37
  74. package/src/components/Chart/LineChart.tsx +3 -2
  75. package/src/components/Chart/MultiAxisChart.tsx +24 -16
  76. package/src/components/Chart/RadarChart.tsx +19 -17
  77. package/src/components/Chart/ScatterChart.tsx +29 -21
  78. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +6 -2
  79. package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
  80. package/src/components/Countdown/Countdown.stories.tsx +7 -7
  81. package/src/components/DataTable/DataTable.stories.tsx +43 -38
  82. package/src/components/DataTable/DataTable.test.tsx +26 -148
  83. package/src/components/DataTable/DataTable.tsx +485 -456
  84. package/src/components/DatePicker/DatePicker.stories.tsx +32 -47
  85. package/src/components/DatePicker/DatePicker.tsx +31 -26
  86. package/src/components/Dropdown/Dropdown.stories.tsx +2 -5
  87. package/src/components/Dropdown/Dropdown.tsx +425 -298
  88. package/src/components/Dropdown/DropdownCompound.test.tsx +64 -0
  89. package/src/components/EdgePanel/EdgePanel.stories.tsx +6 -19
  90. package/src/components/EdgePanel/EdgePanel.tsx +163 -113
  91. package/src/components/EdgePanel/EdgePanelCompound.test.tsx +53 -0
  92. package/src/components/Footer/Footer.stories.tsx +21 -16
  93. package/src/components/Footer/Footer.tsx +130 -128
  94. package/src/components/Footer/FooterLink.tsx +2 -2
  95. package/src/components/Form/Checkbox.test.tsx +49 -49
  96. package/src/components/Form/Checkbox.tsx +108 -100
  97. package/src/components/Form/Form.stories.tsx +2 -10
  98. package/src/components/Form/Input.stories.tsx +22 -39
  99. package/src/components/Form/Input.test.tsx +38 -44
  100. package/src/components/Form/Radio.stories.tsx +6 -12
  101. package/src/components/Form/Radio.tsx +68 -66
  102. package/src/components/Form/Select.stories.tsx +23 -0
  103. package/src/components/Form/Select.test.tsx +99 -0
  104. package/src/components/Form/Select.tsx +239 -186
  105. package/src/components/Form/SelectOption.tsx +88 -0
  106. package/src/components/Form/Textarea.test.tsx +27 -32
  107. package/src/components/Hero/Hero.stories.tsx +93 -23
  108. package/src/components/Hero/Hero.test.tsx +142 -0
  109. package/src/components/Hero/Hero.tsx +343 -58
  110. package/src/components/Icon/index.ts +7 -1
  111. package/src/components/List/List.test.tsx +62 -0
  112. package/src/components/List/List.tsx +32 -25
  113. package/src/components/List/ListItem.tsx +20 -0
  114. package/src/components/Modal/Modal.stories.tsx +67 -2
  115. package/src/components/Modal/Modal.tsx +208 -125
  116. package/src/components/Modal/ModalCompound.test.tsx +94 -0
  117. package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
  118. package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
  119. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
  120. package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
  121. package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
  122. package/src/components/Pagination/Pagination.stories.tsx +7 -4
  123. package/src/components/Pagination/Pagination.tsx +199 -202
  124. package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
  125. package/src/components/Popover/Popover.stories.tsx +99 -192
  126. package/src/components/Popover/Popover.tsx +41 -37
  127. package/src/components/Progress/Progress.stories.tsx +35 -44
  128. package/src/components/River/River.stories.tsx +2 -1
  129. package/src/components/SectionIntro/SectionIntro.stories.tsx +71 -71
  130. package/src/components/Slider/Slider.stories.tsx +12 -4
  131. package/src/components/Spinner/Spinner.stories.tsx +3 -1
  132. package/src/components/Spinner/Spinner.test.tsx +23 -23
  133. package/src/components/Spinner/Spinner.tsx +43 -46
  134. package/src/components/Steps/Steps.stories.tsx +8 -6
  135. package/src/components/Steps/Steps.tsx +124 -21
  136. package/src/components/Steps/StepsCompound.test.tsx +81 -0
  137. package/src/components/Tabs/Tabs.stories.tsx +12 -9
  138. package/src/components/Tabs/Tabs.tsx +230 -75
  139. package/src/components/Tabs/TabsCompound.test.tsx +64 -0
  140. package/src/components/Toggle/Toggle.stories.tsx +27 -13
  141. package/src/components/Toggle/Toggle.test.tsx +65 -70
  142. package/src/components/Toggle/Toggle.tsx +4 -1
  143. package/src/components/Tooltip/Tooltip.stories.tsx +24 -20
  144. package/src/components/Tooltip/Tooltip.tsx +104 -106
  145. package/src/components/Upload/Upload.stories.tsx +129 -127
  146. package/src/components/Upload/Upload.tsx +287 -283
  147. package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
  148. package/src/components/index.ts +13 -2
  149. package/src/layouts/Grid/Grid.stories.tsx +9 -3
  150. package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
  151. package/src/lib/__tests__/theme-tools.test.ts +32 -6
  152. package/src/lib/composables/index.ts +0 -4
  153. package/src/lib/composables/shared-mouse-tracker.ts +13 -14
  154. package/src/lib/composables/useAtomixGlass.ts +102 -60
  155. package/src/lib/composables/useChartExport.ts +1 -1
  156. package/src/lib/composables/useDataTable.ts +29 -17
  157. package/src/lib/composables/useHero.ts +58 -14
  158. package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
  159. package/src/lib/composables/useInput.ts +10 -8
  160. package/src/lib/composables/useSideMenu.ts +6 -5
  161. package/src/lib/composables/useTooltip.ts +1 -2
  162. package/src/lib/composables/useVideoPlayer.ts +44 -35
  163. package/src/lib/config/index.ts +154 -154
  164. package/src/lib/constants/cssVariables.ts +29 -29
  165. package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
  166. package/src/lib/hooks/index.ts +1 -1
  167. package/src/lib/hooks/useComponentCustomization.ts +11 -17
  168. package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
  169. package/src/lib/patterns/__tests__/slots.test.ts +1 -1
  170. package/src/lib/patterns/index.ts +1 -1
  171. package/src/lib/patterns/slots.tsx +8 -13
  172. package/src/lib/storybook/InteractiveDemo.tsx +13 -18
  173. package/src/lib/storybook/PreviewContainer.tsx +1 -1
  174. package/src/lib/storybook/VariantsGrid.tsx +3 -7
  175. package/src/lib/storybook/index.ts +1 -1
  176. package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
  177. package/src/lib/theme/adapters/index.ts +3 -9
  178. package/src/lib/theme/adapters/themeAdapter.ts +41 -26
  179. package/src/lib/theme/config/index.ts +1 -1
  180. package/src/lib/theme/config/types.ts +2 -2
  181. package/src/lib/theme/config/validator.ts +10 -5
  182. package/src/lib/theme/constants/constants.ts +2 -2
  183. package/src/lib/theme/constants/index.ts +1 -2
  184. package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
  185. package/src/lib/theme/core/composeTheme.ts +32 -26
  186. package/src/lib/theme/core/createTheme.ts +1 -1
  187. package/src/lib/theme/core/createThemeObject.ts +308 -301
  188. package/src/lib/theme/core/index.ts +3 -3
  189. package/src/lib/theme/devtools/CLI.ts +105 -111
  190. package/src/lib/theme/devtools/Comparator.tsx +50 -32
  191. package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
  192. package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
  193. package/src/lib/theme/devtools/Inspector.tsx +75 -60
  194. package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
  195. package/src/lib/theme/devtools/Preview.tsx +150 -106
  196. package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
  197. package/src/lib/theme/devtools/index.ts +3 -9
  198. package/src/lib/theme/devtools/useHistory.ts +23 -21
  199. package/src/lib/theme/errors/errors.ts +12 -11
  200. package/src/lib/theme/errors/index.ts +2 -7
  201. package/src/lib/theme/generators/generateCSS.ts +9 -13
  202. package/src/lib/theme/generators/generateCSSNested.ts +1 -6
  203. package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
  204. package/src/lib/theme/generators/index.ts +1 -4
  205. package/src/lib/theme/i18n/index.ts +1 -1
  206. package/src/lib/theme/i18n/rtl.ts +13 -13
  207. package/src/lib/theme/index.ts +7 -16
  208. package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
  209. package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
  210. package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
  211. package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
  212. package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
  213. package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
  214. package/src/lib/theme/runtime/index.ts +2 -5
  215. package/src/lib/theme/runtime/useTheme.ts +18 -18
  216. package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
  217. package/src/lib/theme/test/testTheme.ts +15 -16
  218. package/src/lib/theme/tokens/index.ts +2 -7
  219. package/src/lib/theme/tokens/tokens.ts +25 -24
  220. package/src/lib/theme/types.ts +428 -411
  221. package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
  222. package/src/lib/theme/utils/componentTheming.ts +18 -18
  223. package/src/lib/theme/utils/domUtils.ts +277 -289
  224. package/src/lib/theme/utils/index.ts +1 -2
  225. package/src/lib/theme/utils/injectCSS.ts +10 -14
  226. package/src/lib/theme/utils/naming.ts +20 -16
  227. package/src/lib/theme/utils/themeHelpers.ts +10 -12
  228. package/src/lib/theme/utils/themeUtils.ts +85 -86
  229. package/src/lib/theme/utils/themeValidation.ts +82 -33
  230. package/src/lib/theme-tools.ts +8 -6
  231. package/src/lib/types/components.ts +180 -73
  232. package/src/lib/types/partProps.ts +1 -1
  233. package/src/lib/utils/__tests__/componentUtils.test.ts +57 -2
  234. package/src/lib/utils/__tests__/csv.test.ts +1 -1
  235. package/src/lib/utils/__tests__/themeNaming.test.ts +117 -0
  236. package/src/lib/utils/componentUtils.ts +8 -12
  237. package/src/lib/utils/csv.ts +3 -1
  238. package/src/lib/utils/dataTableExport.ts +1 -5
  239. package/src/lib/utils/fontPreloader.ts +10 -19
  240. package/src/lib/utils/icons.ts +4 -1
  241. package/src/lib/utils/index.ts +2 -6
  242. package/src/lib/utils/memoryMonitor.ts +10 -8
  243. package/src/lib/utils/themeNaming.ts +3 -3
  244. package/src/styles/01-settings/_index.scss +0 -1
  245. package/src/styles/01-settings/_settings.colors.scss +8 -8
  246. package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
  247. package/src/styles/01-settings/_settings.navbar.scss +1 -1
  248. package/src/styles/01-settings/_settings.spacing.scss +3 -4
  249. package/src/styles/01-settings/_settings.tooltip.scss +1 -1
  250. package/src/styles/01-settings/_settings.typography.scss +1 -1
  251. package/src/styles/02-tools/_tools.breakpoints.scss +1 -1
  252. package/src/styles/02-tools/_tools.button.scss +51 -21
  253. package/src/styles/02-tools/_tools.utility-api.scss +36 -24
  254. package/src/styles/03-generic/_generic.root.scss +4 -3
  255. package/src/styles/06-components/_components.atomix-glass.scss +13 -9
  256. package/src/styles/06-components/_components.button.scss +16 -4
  257. package/src/styles/06-components/_components.callout.scss +27 -21
  258. package/src/styles/06-components/_components.card.scss +5 -14
  259. package/src/styles/06-components/_components.chart.scss +22 -19
  260. package/src/styles/06-components/_components.checkbox.scss +3 -1
  261. package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
  262. package/src/styles/06-components/_components.edge-panel.scss +9 -2
  263. package/src/styles/06-components/_components.footer.scss +1 -1
  264. package/src/styles/06-components/_components.side-menu.scss +5 -5
  265. package/src/styles/06-components/_components.toggle.scss +18 -0
  266. package/src/styles/06-components/_index.scss +1 -1
  267. package/src/styles/06-components/old.chart.styles.scss +0 -2
  268. package/src/styles/99-utilities/_utilities.border.scss +69 -27
  269. package/src/styles/99-utilities/_utilities.display.scss +1 -1
  270. package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
  271. package/src/styles/99-utilities/_utilities.position.scss +16 -9
  272. package/src/styles/99-utilities/_utilities.scss +1 -1
  273. package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
  274. package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
  275. package/src/styles/99-utilities/_utilities.text-gradient.scss +30 -30
  276. package/src/styles/99-utilities/_utilities.text.scss +67 -47
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Theme Tools for Library Users
3
- *
3
+ *
4
4
  * Developer-friendly utilities for working with Atomix themes
5
5
  */
6
6
 
@@ -49,7 +49,7 @@ export function createDarkVariant(lightTheme: Theme): Theme {
49
49
  },
50
50
  },
51
51
  };
52
-
52
+
53
53
  // Create a new theme by extending the light theme with the dark variant
54
54
  const extendedTheme: Theme = {
55
55
  ...lightTheme,
@@ -67,7 +67,7 @@ export function createDarkVariant(lightTheme: Theme): Theme {
67
67
  },
68
68
  },
69
69
  };
70
-
70
+
71
71
  return extendedTheme;
72
72
  }
73
73
 
@@ -125,9 +125,11 @@ export function getThemeMetadata(theme: Theme): ThemeMetadata {
125
125
  * Check if theme supports dark mode
126
126
  */
127
127
  export function supportsDarkMode(theme: Theme): boolean {
128
- return theme.palette?.mode === 'dark' ||
128
+ return (
129
+ theme.palette?.mode === 'dark' ||
129
130
  theme.supportsDarkMode === true ||
130
- Boolean(theme.a11y?.modes?.includes('dark'));
131
+ Boolean(theme.a11y?.modes?.includes('dark'))
132
+ );
131
133
  }
132
134
 
133
135
  /**
@@ -150,4 +152,4 @@ export function importTheme(json: string): Theme {
150
152
 
151
153
  // Note: createTheme, extendTheme, mergeTheme, and generateCSSVariables
152
154
  // are already exported from './theme' module. Import them directly from there.
153
- // This file only exports theme-tools specific utilities.
155
+ // This file only exports theme-tools specific utilities.
@@ -1,7 +1,44 @@
1
1
  import { ReactNode } from 'react';
2
- import type { ButtonParts, CardParts, InputParts, ModalParts, DropdownParts, BadgeParts, ProgressParts, CheckboxParts, RadioParts } from './partProps';
3
- import type { SlotProps, ButtonRootSlotProps, ButtonIconSlotProps, ButtonLabelSlotProps, ButtonSpinnerSlotProps, BadgeRootSlotProps, BadgeIconSlotProps, BadgeLabelSlotProps, ProgressRootSlotProps, ProgressBarSlotProps, CheckboxRootSlotProps, CheckboxInputSlotProps, CheckboxLabelSlotProps, RadioRootSlotProps, RadioInputSlotProps, RadioLabelSlotProps } from '../patterns/slots';
4
- import type { ButtonCSSVariable, CardCSSVariable, InputCSSVariable, ModalCSSVariable, DropdownCSSVariable, BadgeCSSVariable, ProgressCSSVariable, CheckboxCSSVariable, RadioCSSVariable } from '../constants/cssVariables';
2
+ import type {
3
+ ButtonParts,
4
+ CardParts,
5
+ InputParts,
6
+ ModalParts,
7
+ DropdownParts,
8
+ BadgeParts,
9
+ ProgressParts,
10
+ CheckboxParts,
11
+ RadioParts,
12
+ } from './partProps';
13
+ import type {
14
+ SlotProps,
15
+ ButtonRootSlotProps,
16
+ ButtonIconSlotProps,
17
+ ButtonLabelSlotProps,
18
+ ButtonSpinnerSlotProps,
19
+ BadgeRootSlotProps,
20
+ BadgeIconSlotProps,
21
+ BadgeLabelSlotProps,
22
+ ProgressRootSlotProps,
23
+ ProgressBarSlotProps,
24
+ CheckboxRootSlotProps,
25
+ CheckboxInputSlotProps,
26
+ CheckboxLabelSlotProps,
27
+ RadioRootSlotProps,
28
+ RadioInputSlotProps,
29
+ RadioLabelSlotProps,
30
+ } from '../patterns/slots';
31
+ import type {
32
+ ButtonCSSVariable,
33
+ CardCSSVariable,
34
+ InputCSSVariable,
35
+ ModalCSSVariable,
36
+ DropdownCSSVariable,
37
+ BadgeCSSVariable,
38
+ ProgressCSSVariable,
39
+ CheckboxCSSVariable,
40
+ RadioCSSVariable,
41
+ } from '../constants/cssVariables';
5
42
 
6
43
  // ============================================================================
7
44
  // AtomixGlass Types
@@ -199,7 +236,14 @@ export interface AtomixGlassProps {
199
236
  /**
200
237
  * Shader variant for shader mode
201
238
  */
202
- shaderVariant?: 'liquidGlass' | 'premiumGlass' | 'appleFluid' | 'liquidMetal' | 'plasma' | 'waves' | 'noise';
239
+ shaderVariant?:
240
+ | 'liquidGlass'
241
+ | 'premiumGlass'
242
+ | 'appleFluid'
243
+ | 'liquidMetal'
244
+ | 'plasma'
245
+ | 'waves'
246
+ | 'noise';
203
247
 
204
248
  /**
205
249
  * Accessibility props
@@ -331,7 +375,7 @@ export type StateModifier =
331
375
  */
332
376
  export type IconPosition = 'left' | 'right';
333
377
 
334
- export type listvariant = 'dash' | 'number' | 'text';
378
+ export type listvariant = 'dash' | 'number' | 'text' | 'default';
335
379
  /**;
336
380
  * List component properties
337
381
  */
@@ -914,14 +958,40 @@ export interface HeroBackgroundSliderConfig {
914
958
  customTransition?: (currentIndex: number, nextIndex: number) => string | React.CSSProperties;
915
959
  }
916
960
 
961
+ /**
962
+ * Hero component parts for granular styling
963
+ */
964
+ export interface HeroParts {
965
+ root?: { className?: string; style?: React.CSSProperties };
966
+ container?: { className?: string; style?: React.CSSProperties };
967
+ grid?: { className?: string; style?: React.CSSProperties };
968
+ content?: { className?: string; style?: React.CSSProperties };
969
+ title?: { className?: string; style?: React.CSSProperties };
970
+ subtitle?: { className?: string; style?: React.CSSProperties };
971
+ text?: { className?: string; style?: React.CSSProperties };
972
+ actions?: { className?: string; style?: React.CSSProperties };
973
+ imageWrapper?: { className?: string; style?: React.CSSProperties };
974
+ image?: { className?: string; style?: React.CSSProperties };
975
+ background?: { className?: string; style?: React.CSSProperties };
976
+ overlay?: { className?: string; style?: React.CSSProperties };
977
+ }
978
+
917
979
  /**
918
980
  * Hero component properties
919
981
  */
920
- export interface HeroProps extends BaseComponentProps {
982
+ export interface HeroProps
983
+ extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title' | 'content'>,
984
+ BaseComponentProps {
921
985
  /**
922
986
  * Hero title
923
987
  */
924
- title: string;
988
+ title: ReactNode;
989
+
990
+ /**
991
+ * HTML Heading level for the title
992
+ * @default 'h1'
993
+ */
994
+ headingLevel?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'div';
925
995
 
926
996
  /**
927
997
  * Hero subtitle
@@ -973,11 +1043,31 @@ export interface HeroProps extends BaseComponentProps {
973
1043
  */
974
1044
  imageColSize?: number;
975
1045
 
1046
+ /**
1047
+ * Custom grid column class name for image
1048
+ */
1049
+ imageColClassName?: string;
1050
+
1051
+ /**
1052
+ * Custom inline style for image column
1053
+ */
1054
+ imageColStyle?: React.CSSProperties;
1055
+
976
1056
  /**
977
1057
  * Custom grid column size for content (default is 5)
978
1058
  */
979
1059
  contentColSize?: number;
980
1060
 
1061
+ /**
1062
+ * Custom grid column class name for content
1063
+ */
1064
+ contentColClassName?: string;
1065
+
1066
+ /**
1067
+ * Custom inline style for content column
1068
+ */
1069
+ contentColStyle?: React.CSSProperties;
1070
+
981
1071
  /**
982
1072
  * Custom width for the hero content (overrides the default CSS variable)
983
1073
  */
@@ -1039,6 +1129,23 @@ export interface HeroProps extends BaseComponentProps {
1039
1129
  * Takes precedence over backgroundImageSrc and videoBackground props
1040
1130
  */
1041
1131
  backgroundSlider?: HeroBackgroundSliderConfig;
1132
+
1133
+ /**
1134
+ * Reverse the stacking order of content and image on mobile devices
1135
+ * @default false
1136
+ */
1137
+ reverseOnMobile?: boolean;
1138
+
1139
+ /**
1140
+ * Granular part-based styling
1141
+ */
1142
+ parts?: HeroParts;
1143
+
1144
+ /**
1145
+ * Custom background element to render behind the content
1146
+ * @example <Hero.Background src="..." />
1147
+ */
1148
+ backgroundElement?: ReactNode;
1042
1149
  }
1043
1150
 
1044
1151
  /**
@@ -1468,16 +1575,16 @@ export interface SideMenuProps extends BaseComponentProps {
1468
1575
  active?: boolean | undefined;
1469
1576
  disabled?: boolean | undefined;
1470
1577
  as?:
1471
- | React.ComponentType<{
1472
- href?: string;
1473
- to?: string;
1474
- children: React.ReactNode;
1475
- className?: string;
1476
- onClick?: (event: React.MouseEvent) => void;
1477
- target?: string;
1478
- rel?: string;
1479
- }>
1480
- | undefined;
1578
+ | React.ComponentType<{
1579
+ href?: string;
1580
+ to?: string;
1581
+ children: React.ReactNode;
1582
+ className?: string;
1583
+ onClick?: (event: React.MouseEvent) => void;
1584
+ target?: string;
1585
+ rel?: string;
1586
+ }>
1587
+ | undefined;
1481
1588
  }>;
1482
1589
  }>;
1483
1590
  }
@@ -2339,7 +2446,7 @@ export interface SelectProps extends BaseComponentProps {
2339
2446
  /**
2340
2447
  * Select options
2341
2448
  */
2342
- options: SelectOption[];
2449
+ options?: SelectOption[];
2343
2450
 
2344
2451
  /**
2345
2452
  * Selected value(s)
@@ -3677,17 +3784,17 @@ export interface VideoPlayerProps extends BaseComponentProps {
3677
3784
  * - object: Custom glass configuration
3678
3785
  */
3679
3786
  glass?:
3680
- | boolean
3681
- | {
3682
- displacementScale?: number;
3683
- blurAmount?: number;
3684
- saturation?: number;
3685
- aberrationIntensity?: number;
3686
- elasticity?: number;
3687
- cornerRadius?: number;
3688
- mode?: 'standard' | 'polar' | 'prominent' | 'shader';
3689
- overLight?: boolean;
3690
- };
3787
+ | boolean
3788
+ | {
3789
+ displacementScale?: number;
3790
+ blurAmount?: number;
3791
+ saturation?: number;
3792
+ aberrationIntensity?: number;
3793
+ elasticity?: number;
3794
+ cornerRadius?: number;
3795
+ mode?: 'standard' | 'polar' | 'prominent' | 'shader';
3796
+ overLight?: boolean;
3797
+ };
3691
3798
 
3692
3799
  /**
3693
3800
  * Glass overlay opacity (0-1) when glass variant is enabled
@@ -5075,23 +5182,23 @@ export interface SliderProps extends BaseComponentProps {
5075
5182
  * Whether to enable mouse wheel control
5076
5183
  */
5077
5184
  mousewheel?:
5078
- | boolean
5079
- | {
5080
- forceToAxis?: boolean;
5081
- sensitivity?: number;
5082
- releaseOnEdges?: boolean;
5083
- };
5185
+ | boolean
5186
+ | {
5187
+ forceToAxis?: boolean;
5188
+ sensitivity?: number;
5189
+ releaseOnEdges?: boolean;
5190
+ };
5084
5191
 
5085
5192
  /**
5086
5193
  * Whether to enable keyboard control
5087
5194
  */
5088
5195
  keyboard?:
5089
- | boolean
5090
- | {
5091
- enabled?: boolean;
5092
- onlyInViewport?: boolean;
5093
- pageUpDown?: boolean;
5094
- };
5196
+ | boolean
5197
+ | {
5198
+ enabled?: boolean;
5199
+ onlyInViewport?: boolean;
5200
+ pageUpDown?: boolean;
5201
+ };
5095
5202
 
5096
5203
  /**
5097
5204
  * Whether to grab cursor on hover (default: true)
@@ -5154,16 +5261,16 @@ export interface SliderProps extends BaseComponentProps {
5154
5261
  * Whether to free mode (no snap to slides)
5155
5262
  */
5156
5263
  freeMode?:
5157
- | boolean
5158
- | {
5159
- enabled?: boolean;
5160
- sticky?: boolean;
5161
- momentumRatio?: number;
5162
- momentumVelocityRatio?: number;
5163
- momentumBounce?: boolean;
5164
- momentumBounceRatio?: number;
5165
- minimumVelocity?: number;
5166
- };
5264
+ | boolean
5265
+ | {
5266
+ enabled?: boolean;
5267
+ sticky?: boolean;
5268
+ momentumRatio?: number;
5269
+ momentumVelocityRatio?: number;
5270
+ momentumBounce?: boolean;
5271
+ momentumBounceRatio?: number;
5272
+ minimumVelocity?: number;
5273
+ };
5167
5274
 
5168
5275
  /**
5169
5276
  * Whether to watch for slides and wrapper size changes
@@ -5199,23 +5306,23 @@ export interface SliderProps extends BaseComponentProps {
5199
5306
  * Hash navigation
5200
5307
  */
5201
5308
  hashNavigation?:
5202
- | boolean
5203
- | {
5204
- watchState?: boolean;
5205
- replaceState?: boolean;
5206
- };
5309
+ | boolean
5310
+ | {
5311
+ watchState?: boolean;
5312
+ replaceState?: boolean;
5313
+ };
5207
5314
 
5208
5315
  /**
5209
5316
  * History navigation
5210
5317
  */
5211
5318
  history?:
5212
- | boolean
5213
- | {
5214
- enabled?: boolean;
5215
- root?: string;
5216
- replaceState?: boolean;
5217
- key?: string;
5218
- };
5319
+ | boolean
5320
+ | {
5321
+ enabled?: boolean;
5322
+ root?: string;
5323
+ replaceState?: boolean;
5324
+ key?: string;
5325
+ };
5219
5326
 
5220
5327
  /**
5221
5328
  * Controller configuration
@@ -5230,16 +5337,16 @@ export interface SliderProps extends BaseComponentProps {
5230
5337
  * A11y configuration
5231
5338
  */
5232
5339
  a11y?:
5233
- | boolean
5234
- | {
5235
- enabled?: boolean;
5236
- prevSlideMessage?: string;
5237
- nextSlideMessage?: string;
5238
- firstSlideMessage?: string;
5239
- lastSlideMessage?: string;
5240
- paginationBulletMessage?: string;
5241
- notificationClass?: string;
5242
- };
5340
+ | boolean
5341
+ | {
5342
+ enabled?: boolean;
5343
+ prevSlideMessage?: string;
5344
+ nextSlideMessage?: string;
5345
+ firstSlideMessage?: string;
5346
+ lastSlideMessage?: string;
5347
+ paginationBulletMessage?: string;
5348
+ notificationClass?: string;
5349
+ };
5243
5350
 
5244
5351
  /**
5245
5352
  * Slide change callback
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Part-Based Styling Props
3
- *
3
+ *
4
4
  * Type definitions for styling individual component parts with className and style props.
5
5
  * This enables granular customization of component internals.
6
6
  */
@@ -4,6 +4,8 @@ import {
4
4
  applyPartStyles,
5
5
  createCSSVarStyle,
6
6
  mergeComponentProps,
7
+ isYouTubeUrl,
8
+ extractYouTubeId,
7
9
  } from '../componentUtils';
8
10
 
9
11
  describe('componentUtils', () => {
@@ -58,6 +60,7 @@ describe('componentUtils', () => {
58
60
  className: 'base custom',
59
61
  id: 'test',
60
62
  'data-test': 'value',
63
+ style: {},
61
64
  });
62
65
  });
63
66
  });
@@ -94,8 +97,8 @@ describe('componentUtils', () => {
94
97
  };
95
98
  const result = createCSSVarStyle(cssVars);
96
99
  expect(result).toEqual({
97
- '--atomix-button-padding-x': 16,
98
- '--atomix-button-padding-y': 8,
100
+ '--atomix-button-padding-x': '16px',
101
+ '--atomix-button-padding-y': '8px',
99
102
  });
100
103
  });
101
104
 
@@ -141,4 +144,56 @@ describe('componentUtils', () => {
141
144
  expect(result).toEqual(baseProps);
142
145
  });
143
146
  });
147
+
148
+ describe('isYouTubeUrl', () => {
149
+ it('should return true for standard YouTube URLs', () => {
150
+ expect(isYouTubeUrl('https://www.youtube.com/watch?v=dQw4w9WgXcQ')).toBe(true);
151
+ expect(isYouTubeUrl('http://www.youtube.com/watch?v=dQw4w9WgXcQ')).toBe(true);
152
+ expect(isYouTubeUrl('www.youtube.com/watch?v=dQw4w9WgXcQ')).toBe(true);
153
+ expect(isYouTubeUrl('youtube.com/watch?v=dQw4w9WgXcQ')).toBe(true);
154
+ });
155
+
156
+ it('should return true for shortened YouTube URLs', () => {
157
+ expect(isYouTubeUrl('https://youtu.be/dQw4w9WgXcQ')).toBe(true);
158
+ expect(isYouTubeUrl('http://youtu.be/dQw4w9WgXcQ')).toBe(true);
159
+ expect(isYouTubeUrl('youtu.be/dQw4w9WgXcQ')).toBe(true);
160
+ });
161
+
162
+ it('should return true for embed YouTube URLs', () => {
163
+ expect(isYouTubeUrl('https://www.youtube.com/embed/dQw4w9WgXcQ')).toBe(true);
164
+ });
165
+
166
+ it('should return false for non-YouTube URLs', () => {
167
+ expect(isYouTubeUrl('https://vimeo.com/12345')).toBe(false);
168
+ expect(isYouTubeUrl('https://google.com')).toBe(false);
169
+ expect(isYouTubeUrl('random string')).toBe(false);
170
+ expect(isYouTubeUrl('')).toBe(false);
171
+ });
172
+ });
173
+
174
+ describe('extractYouTubeId', () => {
175
+ it('should extract ID from standard YouTube URLs', () => {
176
+ expect(extractYouTubeId('https://www.youtube.com/watch?v=dQw4w9WgXcQ')).toBe('dQw4w9WgXcQ');
177
+ });
178
+
179
+ it('should extract ID from shortened YouTube URLs', () => {
180
+ expect(extractYouTubeId('https://youtu.be/dQw4w9WgXcQ')).toBe('dQw4w9WgXcQ');
181
+ });
182
+
183
+ it('should extract ID from embed YouTube URLs', () => {
184
+ expect(extractYouTubeId('https://www.youtube.com/embed/dQw4w9WgXcQ')).toBe('dQw4w9WgXcQ');
185
+ });
186
+
187
+ it('should extract ID with additional query parameters', () => {
188
+ expect(extractYouTubeId('https://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtu.be')).toBe(
189
+ 'dQw4w9WgXcQ'
190
+ );
191
+ });
192
+
193
+ it('should return null for non-YouTube URLs', () => {
194
+ expect(extractYouTubeId('https://vimeo.com/12345')).toBe(null);
195
+ expect(extractYouTubeId('https://google.com')).toBe(null);
196
+ expect(extractYouTubeId('')).toBe(null);
197
+ });
198
+ });
144
199
  });
@@ -40,6 +40,6 @@ describe('sanitizeCSVCell', () => {
40
40
 
41
41
  it('should handle mixed cases', () => {
42
42
  // Dangerous character + quotes + newlines
43
- expect(sanitizeCSVCell('=cmd|\' /C calc\'!A0\n')).toBe("'=cmd|' /C calc'!A0 ");
43
+ expect(sanitizeCSVCell("=cmd|' /C calc'!A0\n")).toBe("'=cmd|' /C calc'!A0 ");
44
44
  });
45
45
  });
@@ -0,0 +1,117 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import { ThemeNaming } from '../themeNaming';
3
+
4
+ describe('ThemeNaming', () => {
5
+ afterEach(() => {
6
+ // Reset prefix to default after each test
7
+ ThemeNaming.setPrefix('atomix');
8
+ });
9
+
10
+ describe('setPrefix / getPrefix', () => {
11
+ it('should have default prefix "atomix"', () => {
12
+ expect(ThemeNaming.getPrefix()).toBe('atomix');
13
+ });
14
+
15
+ it('should update prefix', () => {
16
+ ThemeNaming.setPrefix('custom');
17
+ expect(ThemeNaming.getPrefix()).toBe('custom');
18
+ });
19
+ });
20
+
21
+ describe('camelToKebab', () => {
22
+ it('should convert camelCase to kebab-case', () => {
23
+ expect(ThemeNaming.camelToKebab('camelCase')).toBe('camel-case');
24
+ });
25
+
26
+ it('should handle PascalCase', () => {
27
+ expect(ThemeNaming.camelToKebab('PascalCase')).toBe('pascal-case');
28
+ });
29
+
30
+ it('should handle simple strings', () => {
31
+ expect(ThemeNaming.camelToKebab('simple')).toBe('simple');
32
+ });
33
+
34
+ it('should handle empty string', () => {
35
+ expect(ThemeNaming.camelToKebab('')).toBe('');
36
+ });
37
+ });
38
+
39
+ describe('kebabToCamel', () => {
40
+ it('should convert kebab-case to camelCase', () => {
41
+ expect(ThemeNaming.kebabToCamel('kebab-case')).toBe('kebabCase');
42
+ });
43
+
44
+ it('should handle simple strings', () => {
45
+ expect(ThemeNaming.kebabToCamel('simple')).toBe('simple');
46
+ });
47
+
48
+ it('should handle empty string', () => {
49
+ expect(ThemeNaming.kebabToCamel('')).toBe('');
50
+ });
51
+ });
52
+
53
+ describe('cssVar', () => {
54
+ it('should create CSS variable with default prefix', () => {
55
+ expect(ThemeNaming.cssVar('tokenName')).toBe('--atomix-token-name');
56
+ });
57
+
58
+ it('should create CSS variable with custom prefix', () => {
59
+ ThemeNaming.setPrefix('custom');
60
+ expect(ThemeNaming.cssVar('tokenName')).toBe('--custom-token-name');
61
+ });
62
+ });
63
+
64
+ describe('bemClass', () => {
65
+ it('should create block class', () => {
66
+ expect(ThemeNaming.bemClass('block')).toBe('c-block');
67
+ });
68
+
69
+ it('should create block element class', () => {
70
+ expect(ThemeNaming.bemClass('block', 'element')).toBe('c-block__element');
71
+ });
72
+
73
+ it('should create block modifier class', () => {
74
+ expect(ThemeNaming.bemClass('block', undefined, 'mod')).toBe('c-block--mod');
75
+ });
76
+
77
+ it('should create block element modifier class', () => {
78
+ expect(ThemeNaming.bemClass('block', 'element', 'mod')).toBe('c-block__element--mod');
79
+ });
80
+ });
81
+
82
+ describe('variantClass', () => {
83
+ it('should create variant class', () => {
84
+ expect(ThemeNaming.variantClass('button', 'primary')).toBe('c-button--primary');
85
+ });
86
+ });
87
+
88
+ describe('sizeClass', () => {
89
+ it('should create size class', () => {
90
+ expect(ThemeNaming.sizeClass('button', 'lg')).toBe('c-button--lg');
91
+ });
92
+ });
93
+
94
+ describe('stateClass', () => {
95
+ it('should create state class', () => {
96
+ expect(ThemeNaming.stateClass('input', 'disabled')).toBe('c-input--disabled');
97
+ });
98
+ });
99
+
100
+ describe('utilityClass', () => {
101
+ it('should create utility class', () => {
102
+ expect(ThemeNaming.utilityClass('flex')).toBe('u-flex');
103
+ });
104
+ });
105
+
106
+ describe('layoutClass', () => {
107
+ it('should create layout class', () => {
108
+ expect(ThemeNaming.layoutClass('grid')).toBe('l-grid');
109
+ });
110
+ });
111
+
112
+ describe('objectClass', () => {
113
+ it('should create object class', () => {
114
+ expect(ThemeNaming.objectClass('container')).toBe('o-container');
115
+ });
116
+ });
117
+ });
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Component Utilities
3
- *
3
+ *
4
4
  * Helper functions for component development with the new customization system
5
5
  */
6
6
 
@@ -39,7 +39,7 @@ export function createCSSVarStyle(
39
39
  baseStyle?: React.CSSProperties
40
40
  ): React.CSSProperties {
41
41
  if (!cssVars) return baseStyle || {};
42
-
42
+
43
43
  const varStyle = cssVarsToStyle(cssVars);
44
44
  return { ...varStyle, ...baseStyle };
45
45
  }
@@ -102,11 +102,7 @@ export function createPartProps<T extends { className?: string; style?: React.CS
102
102
  /**
103
103
  * Check if component has customization
104
104
  */
105
- export function hasCustomization(props: {
106
- parts?: any;
107
- cssVars?: any;
108
- slots?: any;
109
- }): boolean {
105
+ export function hasCustomization(props: { parts?: any; cssVars?: any; slots?: any }): boolean {
110
106
  return Boolean(props.parts || props.cssVars || props.slots);
111
107
  }
112
108
 
@@ -115,7 +111,7 @@ export function hasCustomization(props: {
115
111
  */
116
112
  export function createDebugAttrs(componentName: string, variant?: string): Record<string, string> {
117
113
  if (typeof process === 'undefined' || process.env?.NODE_ENV !== 'development') return {};
118
-
114
+
119
115
  return {
120
116
  'data-component': componentName,
121
117
  ...(variant && { 'data-variant': variant }),
@@ -126,7 +122,7 @@ export function createDebugAttrs(componentName: string, variant?: string): Recor
126
122
  * Generate a UUID v4
127
123
  */
128
124
  export function generateUUID(): string {
129
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
125
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
130
126
  const r = (Math.random() * 16) | 0;
131
127
  const v = c === 'x' ? r : (r & 0x3) | 0x8;
132
128
  return v.toString(16);
@@ -146,18 +142,18 @@ export function isYouTubeUrl(url: string): boolean {
146
142
  */
147
143
  export function extractYouTubeId(url: string): string | null {
148
144
  if (!isYouTubeUrl(url)) return null;
149
-
145
+
150
146
  const patterns = [
151
147
  /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/)([^&\n?#]+)/,
152
148
  /youtube\.com\/.*[?&]v=([^&\n?#]+)/,
153
149
  ];
154
-
150
+
155
151
  for (const pattern of patterns) {
156
152
  const match = url.match(pattern);
157
153
  if (match && match[1]) {
158
154
  return match[1];
159
155
  }
160
156
  }
161
-
157
+
162
158
  return null;
163
159
  }