@shohojdhara/atomix 0.3.5 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/README.md +101 -199
  2. package/atomix.config.ts +241 -0
  3. package/dist/atomix.css +260 -179
  4. package/dist/atomix.css.map +1 -1
  5. package/dist/atomix.min.css +250 -179
  6. package/dist/atomix.min.css.map +1 -1
  7. package/dist/charts.js +61 -66
  8. package/dist/charts.js.map +1 -1
  9. package/dist/core.js +47 -31
  10. package/dist/core.js.map +1 -1
  11. package/dist/forms.js +47 -31
  12. package/dist/forms.js.map +1 -1
  13. package/dist/heavy.js +47 -31
  14. package/dist/heavy.js.map +1 -1
  15. package/dist/index.d.ts +1841 -1633
  16. package/dist/index.esm.js +4975 -4113
  17. package/dist/index.esm.js.map +1 -1
  18. package/dist/index.js +5151 -4290
  19. package/dist/index.js.map +1 -1
  20. package/dist/index.min.js +1 -1
  21. package/dist/index.min.js.map +1 -1
  22. package/dist/theme.d.ts +1572 -1442
  23. package/dist/theme.js +4816 -4080
  24. package/dist/theme.js.map +1 -1
  25. package/package.json +6 -20
  26. package/src/components/Accordion/Accordion.stories.tsx +50 -17
  27. package/src/components/AtomixGlass/AtomixGlass.tsx +65 -31
  28. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +11 -4
  29. package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +1 -32
  30. package/src/components/AtomixGlass/stories/Examples.stories.tsx +2 -2
  31. package/src/components/AtomixGlass/stories/shared-components.tsx +0 -31
  32. package/src/components/Avatar/Avatar.stories.tsx +7 -0
  33. package/src/components/Badge/Badge.stories.tsx +91 -13
  34. package/src/components/Block/Block.stories.tsx +7 -23
  35. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +7 -0
  36. package/src/components/Button/Button.stories.tsx +141 -22
  37. package/src/components/Button/ButtonGroup.stories.tsx +315 -0
  38. package/src/components/Button/ButtonGroup.tsx +67 -0
  39. package/src/components/Button/index.ts +2 -0
  40. package/src/components/Callout/Callout.stories.tsx +8 -6
  41. package/src/components/Card/Card.stories.tsx +82 -28
  42. package/src/components/Chart/AnimatedChart.tsx +0 -1
  43. package/src/components/Chart/AreaChart.tsx +0 -1
  44. package/src/components/Chart/BarChart.tsx +0 -1
  45. package/src/components/Chart/BubbleChart.tsx +0 -1
  46. package/src/components/Chart/CandlestickChart.tsx +0 -1
  47. package/src/components/Chart/Chart.stories.tsx +5 -7
  48. package/src/components/Chart/Chart.tsx +0 -16
  49. package/src/components/Chart/ChartRenderer.tsx +1 -1
  50. package/src/components/Chart/DonutChart.tsx +0 -1
  51. package/src/components/Chart/FunnelChart.tsx +0 -1
  52. package/src/components/Chart/GaugeChart.tsx +0 -1
  53. package/src/components/Chart/HeatmapChart.tsx +0 -1
  54. package/src/components/Chart/LineChart.tsx +0 -1
  55. package/src/components/Chart/MultiAxisChart.tsx +0 -1
  56. package/src/components/Chart/PieChart.tsx +0 -1
  57. package/src/components/Chart/RadarChart.tsx +0 -1
  58. package/src/components/Chart/ScatterChart.tsx +0 -1
  59. package/src/components/Chart/WaterfallChart.tsx +0 -1
  60. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +7 -0
  61. package/src/components/DataTable/DataTable.stories.tsx +23 -16
  62. package/src/components/DatePicker/DatePicker.stories.tsx +27 -19
  63. package/src/components/Dropdown/Dropdown.stories.tsx +11 -19
  64. package/src/components/EdgePanel/EdgePanel.stories.tsx +1 -0
  65. package/src/components/Footer/Footer.stories.tsx +8 -6
  66. package/src/components/Footer/FooterLink.tsx +9 -2
  67. package/src/components/Form/Checkbox.stories.tsx +7 -0
  68. package/src/components/Form/Form.stories.tsx +7 -0
  69. package/src/components/Form/FormGroup.stories.tsx +9 -1
  70. package/src/components/Form/Input.stories.tsx +69 -16
  71. package/src/components/Form/Radio.stories.tsx +9 -1
  72. package/src/components/Form/Select.stories.tsx +9 -1
  73. package/src/components/Form/Textarea.stories.tsx +10 -2
  74. package/src/components/Hero/Hero.stories.tsx +7 -0
  75. package/src/components/List/List.stories.tsx +7 -0
  76. package/src/components/Messages/Messages.stories.tsx +8 -7
  77. package/src/components/Modal/Modal.stories.tsx +17 -6
  78. package/src/components/Navigation/Menu/Menu.stories.tsx +7 -0
  79. package/src/components/Navigation/Nav/Nav.stories.tsx +7 -0
  80. package/src/components/Navigation/Navbar/Navbar.stories.tsx +1 -0
  81. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +1 -1
  82. package/src/components/Pagination/Pagination.stories.tsx +188 -111
  83. package/src/components/Pagination/Pagination.tsx +83 -3
  84. package/src/components/PhotoViewer/PhotoViewer.stories.tsx +10 -5
  85. package/src/components/Popover/Popover.stories.tsx +191 -115
  86. package/src/components/ProductReview/ProductReview.stories.tsx +80 -58
  87. package/src/components/Progress/Progress.stories.tsx +79 -49
  88. package/src/components/Rating/Rating.stories.tsx +109 -84
  89. package/src/components/River/River.stories.tsx +194 -114
  90. package/src/components/SectionIntro/SectionIntro.stories.tsx +19 -9
  91. package/src/components/Slider/Slider.stories.tsx +7 -0
  92. package/src/components/Spinner/Spinner.stories.tsx +15 -11
  93. package/src/components/Steps/Steps.stories.tsx +132 -98
  94. package/src/components/Tabs/Tabs.stories.tsx +163 -112
  95. package/src/components/Testimonial/Testimonial.stories.tsx +114 -68
  96. package/src/components/Todo/Todo.stories.tsx +38 -12
  97. package/src/components/Toggle/Toggle.stories.tsx +61 -28
  98. package/src/components/Tooltip/Tooltip.stories.tsx +318 -200
  99. package/src/components/Upload/Upload.stories.tsx +122 -84
  100. package/src/components/VideoPlayer/VideoPlayer.stories.tsx +7 -24
  101. package/src/components/index.ts +1 -0
  102. package/src/lib/composables/useAtomixGlass.ts +2 -3
  103. package/src/lib/composables/useNavbar.ts +0 -10
  104. package/src/lib/config/loader.ts +2 -1
  105. package/src/lib/constants/components.ts +10 -0
  106. package/src/lib/hooks/useComponentCustomization.ts +1 -1
  107. package/src/lib/theme/README.md +174 -0
  108. package/src/lib/theme/adapters/index.ts +31 -0
  109. package/src/lib/theme/adapters/themeAdapter.ts +287 -0
  110. package/src/lib/theme/config/__tests__/configLoader.test.ts +207 -0
  111. package/src/lib/theme/config/configLoader.ts +254 -0
  112. package/src/lib/theme/config/loader.ts +37 -48
  113. package/src/lib/theme/config/types.ts +2 -2
  114. package/src/lib/theme/config/validator.ts +15 -91
  115. package/src/lib/theme/{constants.ts → constants/constants.ts} +0 -18
  116. package/src/lib/theme/constants/index.ts +8 -0
  117. package/src/lib/theme/core/ThemeRegistry.ts +19 -6
  118. package/src/lib/theme/core/__tests__/createTheme.test.ts +132 -0
  119. package/src/lib/theme/core/composeTheme.ts +155 -0
  120. package/src/lib/theme/core/createTheme.ts +94 -0
  121. package/src/lib/theme/{createTheme.ts → core/createThemeObject.ts} +10 -6
  122. package/src/lib/theme/core/index.ts +5 -19
  123. package/src/lib/theme/devtools/Comparator.tsx +346 -22
  124. package/src/lib/theme/devtools/IMPROVEMENTS.md +139 -38
  125. package/src/lib/theme/devtools/Inspector.tsx +335 -51
  126. package/src/lib/theme/devtools/LiveEditor.tsx +478 -107
  127. package/src/lib/theme/devtools/Preview.tsx +471 -221
  128. package/src/lib/theme/{core → devtools}/ThemeValidator.ts +1 -1
  129. package/src/lib/theme/devtools/index.ts +14 -4
  130. package/src/lib/theme/devtools/useHistory.ts +130 -0
  131. package/src/lib/theme/errors/index.ts +12 -0
  132. package/src/lib/theme/generators/cssFile.ts +79 -0
  133. package/src/lib/theme/generators/generateCSS.ts +89 -0
  134. package/src/lib/theme/{generateCSSVariables.ts → generators/generateCSSVariables.ts} +3 -13
  135. package/src/lib/theme/generators/index.ts +19 -0
  136. package/src/lib/theme/i18n/rtl.ts +5 -6
  137. package/src/lib/theme/index.ts +120 -15
  138. package/src/lib/theme/runtime/ThemeApplicator.ts +52 -111
  139. package/src/lib/theme/{ThemeContext.tsx → runtime/ThemeContext.tsx} +1 -1
  140. package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +1 -1
  141. package/src/lib/theme/runtime/ThemeProvider.tsx +456 -179
  142. package/src/lib/theme/runtime/index.ts +1 -2
  143. package/src/lib/theme/runtime/useTheme.ts +1 -2
  144. package/src/lib/theme/test/testTheme.ts +385 -0
  145. package/src/lib/theme/tokens/index.ts +12 -0
  146. package/src/lib/theme/tokens/tokens.ts +721 -0
  147. package/src/lib/theme/types.ts +6 -42
  148. package/src/lib/theme/{utils.ts → utils/domUtils.ts} +2 -2
  149. package/src/lib/theme/utils/index.ts +11 -0
  150. package/src/lib/theme/utils/injectCSS.ts +90 -0
  151. package/src/lib/theme/utils/themeHelpers.ts +78 -0
  152. package/src/lib/theme/{themeUtils.ts → utils/themeUtils.ts} +1 -1
  153. package/src/lib/theme-tools.ts +7 -8
  154. package/src/lib/types/components.ts +40 -130
  155. package/src/lib/utils/componentUtils.ts +1 -1
  156. package/src/styles/01-settings/_settings.design-tokens.scss +4 -1
  157. package/src/styles/02-tools/_tools.button.scss +66 -79
  158. package/src/styles/06-components/_components.atomix-glass.scss +13 -3
  159. package/src/styles/06-components/_components.pagination.scss +88 -0
  160. package/scripts/sync-theme-config.js +0 -309
  161. package/src/lib/theme/composeTheme.ts +0 -370
  162. package/src/lib/theme/core/ThemeCache.ts +0 -283
  163. package/src/lib/theme/core/ThemeEngine.test.ts +0 -146
  164. package/src/lib/theme/core/ThemeEngine.ts +0 -665
  165. package/src/lib/theme/createThemeFromConfig.ts +0 -132
  166. package/src/lib/theme/devtools/CLI.ts +0 -364
  167. package/src/lib/theme/runtime/ThemeManager.test.ts +0 -192
  168. package/src/lib/theme/runtime/ThemeManager.ts +0 -446
  169. package/src/styles/03-generic/_generated-root.css +0 -26
  170. package/src/themes/README.md +0 -442
  171. package/src/themes/themes.config.js +0 -68
  172. /package/src/lib/theme/{cssVariableMapper.ts → adapters/cssVariableMapper.ts} +0 -0
  173. /package/src/lib/theme/{errors.ts → errors/errors.ts} +0 -0
@@ -3,17 +3,23 @@
3
3
  *
4
4
  * Applies theme configurations to the DOM, including CSS variables,
5
5
  * component overrides, typography, spacing, and color palettes.
6
+ *
7
+ * Uses the unified theme system for CSS generation and injection.
6
8
  */
7
9
 
8
- import { applyCSSVariables, removeCSSVariables } from '../cssVariableMapper';
9
10
  import type { Theme, ThemeComponentOverrides, ComponentThemeOverride } from '../types';
11
+ import type { DesignTokens } from '../tokens/tokens';
12
+ import { createTheme } from '../core/createTheme';
13
+ import { injectCSS, removeCSS } from '../utils/injectCSS';
10
14
 
11
15
  /**
12
16
  * Theme applicator class for runtime theme application
17
+ *
18
+ * Uses the unified theme system for efficient CSS variable generation and injection.
13
19
  */
14
20
  export class ThemeApplicator {
15
- private appliedVars: Set<string> = new Set();
16
21
  private root: HTMLElement;
22
+ private styleId: string = 'atomix-theme-applicator';
17
23
 
18
24
  constructor(root: HTMLElement = document.documentElement) {
19
25
  this.root = root;
@@ -21,129 +27,71 @@ export class ThemeApplicator {
21
27
 
22
28
  /**
23
29
  * Apply a complete theme configuration
30
+ *
31
+ * Uses the unified theme system to convert Theme to DesignTokens and inject CSS.
32
+ * Automatically respects atomix.config.ts when using DesignTokens.
24
33
  */
25
- applyTheme(theme: Theme): void {
34
+ applyTheme(theme: Theme | DesignTokens): void {
26
35
  // Clear previously applied variables
27
36
  this.clearAppliedVars();
28
37
 
29
- // Apply global CSS variables
30
- if (theme.cssVars) {
31
- this.applyGlobalCSSVars(theme.cssVars);
32
- }
33
-
34
- // Apply typography system
35
- if (theme.typography) {
36
- this.applyTypography(theme.typography);
37
- }
38
-
39
- // Apply spacing system
40
- if (theme.spacing) {
41
- this.applySpacing(theme.spacing);
42
- }
43
-
44
- // Apply color palette
45
- if (theme.palette) {
46
- this.applyPalette(theme.palette);
38
+ // Check if it's DesignTokens
39
+ if (this.isDesignTokens(theme)) {
40
+ // Direct DesignTokens - use unified theme system (with config support)
41
+ this.applyDesignTokens(theme);
42
+ } else {
43
+ // Theme object - use createTheme which handles Theme objects
44
+ // createTheme automatically converts Theme to DesignTokens internally
45
+ const css = createTheme(theme, {
46
+ selector: ':root',
47
+ prefix: 'atomix',
48
+ });
49
+ injectCSS(css, this.styleId);
47
50
  }
48
51
 
49
- // Apply component overrides
50
- if ((theme as any).components) {
52
+ // Apply component overrides (only for Theme objects)
53
+ if (!this.isDesignTokens(theme) && (theme as any).components) {
51
54
  this.applyComponentOverrides((theme as any).components);
52
55
  }
53
56
  }
54
57
 
55
58
  /**
56
- * Apply global CSS variables
59
+ * Apply DesignTokens using unified theme system
60
+ *
61
+ * Uses createTheme() which automatically loads from atomix.config.ts
62
+ * if no tokens are provided, ensuring config is always respected.
57
63
  */
58
- private applyGlobalCSSVars(vars: Record<string, string | number>): void {
59
- Object.entries(vars).forEach(([key, value]) => {
60
- this.root.style.setProperty(key, String(value));
61
- this.appliedVars.add(key);
64
+ private applyDesignTokens(tokens: Partial<DesignTokens>): void {
65
+ // Use createTheme() which handles config loading automatically
66
+ // If tokens is empty, it will load from config
67
+ const css = createTheme(tokens, {
68
+ selector: ':root',
69
+ prefix: 'atomix', // Can be overridden by config
62
70
  });
63
- }
64
-
65
- /**
66
- * Apply typography system
67
- */
68
- private applyTypography(typography: Theme['typography']): void {
69
- if (!typography) return;
70
-
71
- const vars: Record<string, string | number> = {};
72
-
73
- if (typography.fontFamily) {
74
- vars['--atomix-font-family'] = typography.fontFamily;
75
- }
76
-
77
- if (typography.fontSize) {
78
- Object.entries(typography.fontSize).forEach(([key, value]) => {
79
- if (typeof value === 'string' || typeof value === 'number') {
80
- vars[`--atomix-font-size-${key}`] = value;
81
- }
82
- });
83
- }
84
-
85
- if (typography.fontWeight) {
86
- Object.entries(typography.fontWeight).forEach(([key, value]) => {
87
- if (typeof value === 'string' || typeof value === 'number') {
88
- vars[`--atomix-font-weight-${key}`] = value;
89
- }
90
- });
91
- }
92
71
 
93
- if (typography.lineHeight) {
94
- Object.entries(typography.lineHeight).forEach(([key, value]) => {
95
- if (typeof value === 'string' || typeof value === 'number') {
96
- vars[`--atomix-line-height-${key}`] = value;
97
- }
98
- });
99
- }
100
-
101
- this.applyGlobalCSSVars(vars);
72
+ // Inject CSS into DOM
73
+ injectCSS(css, this.styleId);
102
74
  }
103
75
 
104
76
  /**
105
- * Apply spacing system
77
+ * Check if object is DesignTokens
106
78
  */
107
- private applySpacing(spacing: any): void {
108
- const vars: Record<string, string | number> = {};
109
-
110
- // Handle spacing function or object
111
- if (typeof spacing === 'function') {
112
- // If spacing is a function, we can't iterate it directly
113
- // Just skip for now as it's a special case
114
- return;
115
- }
116
-
117
- if (typeof spacing === 'object' && spacing !== null) {
118
- Object.entries(spacing).forEach(([key, value]) => {
119
- if (typeof value === 'string' || typeof value === 'number') {
120
- vars[`--atomix-space-${key}`] = value;
121
- }
122
- });
123
- }
124
-
125
- this.applyGlobalCSSVars(vars);
79
+ private isDesignTokens(obj: Theme | DesignTokens): obj is DesignTokens {
80
+ // DesignTokens is a flat object with string keys, no nested structures
81
+ return obj !== null &&
82
+ typeof obj === 'object' &&
83
+ !('palette' in obj) &&
84
+ !('typography' in obj) &&
85
+ !('__isJSTheme' in obj);
126
86
  }
127
87
 
128
88
  /**
129
- * Apply color palette
89
+ * Apply global CSS variables (for component overrides)
130
90
  */
131
- private applyPalette(palette: Theme['palette']): void {
132
- if (!palette) return;
133
-
134
- const vars: Record<string, string | number> = {};
135
-
136
- Object.entries(palette).forEach(([colorName, colorScale]) => {
137
- if (colorScale && typeof colorScale === 'object') {
138
- Object.entries(colorScale).forEach(([shade, value]) => {
139
- if (value && (typeof value === 'string' || typeof value === 'number')) {
140
- vars[`--atomix-color-${colorName}-${shade}`] = value;
141
- }
142
- });
143
- }
91
+ private applyGlobalCSSVars(vars: Record<string, string | number>): void {
92
+ Object.entries(vars).forEach(([key, value]) => {
93
+ this.root.style.setProperty(key, String(value));
144
94
  });
145
-
146
- this.applyGlobalCSSVars(vars);
147
95
  }
148
96
 
149
97
  /**
@@ -213,15 +161,7 @@ export class ThemeApplicator {
213
161
  * Clear all applied CSS variables
214
162
  */
215
163
  private clearAppliedVars(): void {
216
- removeCSSVariables(Array.from(this.appliedVars), this.root);
217
- this.appliedVars.clear();
218
- }
219
-
220
- /**
221
- * Get all currently applied variables
222
- */
223
- getAppliedVars(): string[] {
224
- return Array.from(this.appliedVars);
164
+ removeCSS(this.styleId);
225
165
  }
226
166
 
227
167
  /**
@@ -229,6 +169,7 @@ export class ThemeApplicator {
229
169
  */
230
170
  removeTheme(): void {
231
171
  this.clearAppliedVars();
172
+ removeCSS(this.styleId);
232
173
  }
233
174
 
234
175
  /**
@@ -5,7 +5,7 @@
5
5
  */
6
6
 
7
7
  import { createContext } from 'react';
8
- import type { ThemeContextValue } from './types';
8
+ import type { ThemeContextValue } from '../types';
9
9
 
10
10
  /**
11
11
  * Theme context with default values
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  import React, { Component, type ReactNode, type ErrorInfo } from 'react';
9
- import { ThemeError, ThemeErrorCode, getLogger } from '../errors';
9
+ import { ThemeError, ThemeErrorCode, getLogger } from '../errors/errors';
10
10
 
11
11
  /**
12
12
  * Error boundary state