@shohojdhara/atomix 0.3.5 → 0.3.7

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 (182) 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 +69 -166
  8. package/dist/charts.js.map +1 -1
  9. package/dist/core.js +184 -263
  10. package/dist/core.js.map +1 -1
  11. package/dist/forms.js +55 -131
  12. package/dist/forms.js.map +1 -1
  13. package/dist/heavy.js +184 -263
  14. package/dist/heavy.js.map +1 -1
  15. package/dist/index.d.ts +1831 -1657
  16. package/dist/index.esm.js +4497 -4318
  17. package/dist/index.esm.js.map +1 -1
  18. package/dist/index.js +4510 -4328
  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 +1431 -1472
  23. package/dist/theme.js +4175 -4138
  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 +128 -322
  28. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +12 -5
  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/Button.tsx +85 -167
  38. package/src/components/Button/ButtonGroup.stories.tsx +315 -0
  39. package/src/components/Button/ButtonGroup.tsx +67 -0
  40. package/src/components/Button/index.ts +2 -0
  41. package/src/components/Callout/Callout.stories.tsx +8 -6
  42. package/src/components/Card/Card.stories.tsx +82 -28
  43. package/src/components/Chart/AnimatedChart.tsx +0 -1
  44. package/src/components/Chart/AreaChart.tsx +0 -1
  45. package/src/components/Chart/BarChart.tsx +0 -1
  46. package/src/components/Chart/BubbleChart.tsx +0 -1
  47. package/src/components/Chart/CandlestickChart.tsx +0 -1
  48. package/src/components/Chart/Chart.stories.tsx +5 -7
  49. package/src/components/Chart/Chart.tsx +0 -16
  50. package/src/components/Chart/ChartRenderer.tsx +1 -1
  51. package/src/components/Chart/DonutChart.tsx +0 -1
  52. package/src/components/Chart/FunnelChart.tsx +0 -1
  53. package/src/components/Chart/GaugeChart.tsx +0 -1
  54. package/src/components/Chart/HeatmapChart.tsx +0 -1
  55. package/src/components/Chart/LineChart.tsx +0 -1
  56. package/src/components/Chart/MultiAxisChart.tsx +0 -1
  57. package/src/components/Chart/PieChart.tsx +0 -1
  58. package/src/components/Chart/RadarChart.tsx +0 -1
  59. package/src/components/Chart/ScatterChart.tsx +0 -1
  60. package/src/components/Chart/WaterfallChart.tsx +0 -1
  61. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +7 -0
  62. package/src/components/DataTable/DataTable.stories.tsx +23 -16
  63. package/src/components/DatePicker/DatePicker.stories.tsx +27 -19
  64. package/src/components/Dropdown/Dropdown.stories.tsx +11 -19
  65. package/src/components/EdgePanel/EdgePanel.stories.tsx +1 -0
  66. package/src/components/Footer/Footer.stories.tsx +8 -6
  67. package/src/components/Footer/FooterLink.tsx +9 -2
  68. package/src/components/Form/Checkbox.stories.tsx +7 -0
  69. package/src/components/Form/Form.stories.tsx +7 -0
  70. package/src/components/Form/FormGroup.stories.tsx +9 -1
  71. package/src/components/Form/Input.stories.tsx +69 -16
  72. package/src/components/Form/Radio.stories.tsx +9 -1
  73. package/src/components/Form/Select.stories.tsx +9 -1
  74. package/src/components/Form/Textarea.stories.tsx +10 -2
  75. package/src/components/Hero/Hero.stories.tsx +7 -0
  76. package/src/components/List/List.stories.tsx +7 -0
  77. package/src/components/Messages/Messages.stories.tsx +8 -7
  78. package/src/components/Modal/Modal.stories.tsx +17 -6
  79. package/src/components/Navigation/Menu/Menu.stories.tsx +7 -0
  80. package/src/components/Navigation/Nav/Nav.stories.tsx +7 -0
  81. package/src/components/Navigation/Navbar/Navbar.stories.tsx +1 -0
  82. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +1 -1
  83. package/src/components/Pagination/Pagination.stories.tsx +188 -111
  84. package/src/components/Pagination/Pagination.tsx +83 -3
  85. package/src/components/PhotoViewer/PhotoViewer.stories.tsx +10 -5
  86. package/src/components/Popover/Popover.stories.tsx +191 -115
  87. package/src/components/ProductReview/ProductReview.stories.tsx +80 -58
  88. package/src/components/Progress/Progress.stories.tsx +79 -49
  89. package/src/components/Rating/Rating.stories.tsx +109 -84
  90. package/src/components/River/River.stories.tsx +194 -114
  91. package/src/components/SectionIntro/SectionIntro.stories.tsx +19 -9
  92. package/src/components/Slider/Slider.stories.tsx +7 -0
  93. package/src/components/Spinner/Spinner.stories.tsx +15 -11
  94. package/src/components/Steps/Steps.stories.tsx +132 -98
  95. package/src/components/Tabs/Tabs.stories.tsx +163 -112
  96. package/src/components/Testimonial/Testimonial.stories.tsx +114 -68
  97. package/src/components/Todo/Todo.stories.tsx +38 -12
  98. package/src/components/Toggle/Toggle.stories.tsx +61 -28
  99. package/src/components/Tooltip/Tooltip.stories.tsx +318 -200
  100. package/src/components/Upload/Upload.stories.tsx +122 -84
  101. package/src/components/VideoPlayer/VideoPlayer.stories.tsx +7 -24
  102. package/src/components/index.ts +1 -0
  103. package/src/lib/composables/useAtomixGlass.ts +9 -10
  104. package/src/lib/composables/useNavbar.ts +0 -10
  105. package/src/lib/config/loader.ts +4 -4
  106. package/src/lib/constants/components.ts +17 -0
  107. package/src/lib/hooks/useComponentCustomization.ts +1 -1
  108. package/src/lib/hooks/usePerformanceMonitor.ts +1 -1
  109. package/src/lib/hooks/useThemeTokens.ts +105 -0
  110. package/src/lib/theme/README.md +174 -0
  111. package/src/lib/theme/adapters/index.ts +31 -0
  112. package/src/lib/theme/adapters/themeAdapter.ts +287 -0
  113. package/src/lib/theme/config/__tests__/configLoader.test.ts +207 -0
  114. package/src/lib/theme/config/configLoader.ts +95 -0
  115. package/src/lib/theme/config/loader.ts +37 -54
  116. package/src/lib/theme/config/types.ts +2 -2
  117. package/src/lib/theme/config/validator.ts +15 -91
  118. package/src/lib/theme/{constants.ts → constants/constants.ts} +1 -19
  119. package/src/lib/theme/constants/index.ts +8 -0
  120. package/src/lib/theme/core/ThemeRegistry.ts +75 -266
  121. package/src/lib/theme/core/__tests__/createTheme.test.ts +132 -0
  122. package/src/lib/theme/core/composeTheme.ts +105 -0
  123. package/src/lib/theme/core/createTheme.ts +108 -0
  124. package/src/lib/theme/{createTheme.ts → core/createThemeObject.ts} +12 -8
  125. package/src/lib/theme/core/index.ts +19 -19
  126. package/src/lib/theme/devtools/Comparator.tsx +346 -22
  127. package/src/lib/theme/devtools/IMPROVEMENTS.md +139 -38
  128. package/src/lib/theme/devtools/Inspector.tsx +335 -51
  129. package/src/lib/theme/devtools/LiveEditor.tsx +478 -107
  130. package/src/lib/theme/devtools/Preview.tsx +471 -221
  131. package/src/lib/theme/{core → devtools}/ThemeValidator.ts +1 -1
  132. package/src/lib/theme/devtools/index.ts +14 -4
  133. package/src/lib/theme/devtools/useHistory.ts +130 -0
  134. package/src/lib/theme/{errors.ts → errors/errors.ts} +1 -1
  135. package/src/lib/theme/errors/index.ts +12 -0
  136. package/src/lib/theme/generators/cssFile.ts +79 -0
  137. package/src/lib/theme/generators/generateCSS.ts +89 -0
  138. package/src/lib/theme/generators/generateCSSNested.ts +130 -0
  139. package/src/lib/theme/{generateCSSVariables.ts → generators/generateCSSVariables.ts} +3 -13
  140. package/src/lib/theme/generators/index.ts +25 -0
  141. package/src/lib/theme/i18n/rtl.ts +5 -6
  142. package/src/lib/theme/index.ts +149 -19
  143. package/src/lib/theme/runtime/ThemeApplicator.ts +53 -112
  144. package/src/lib/theme/{ThemeContext.tsx → runtime/ThemeContext.tsx} +1 -1
  145. package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +5 -5
  146. package/src/lib/theme/runtime/ThemeProvider.tsx +266 -282
  147. package/src/lib/theme/runtime/index.ts +2 -2
  148. package/src/lib/theme/runtime/useTheme.ts +1 -2
  149. package/src/lib/theme/runtime/useThemeTokens.ts +131 -0
  150. package/src/lib/theme/test/testTheme.ts +385 -0
  151. package/src/lib/theme/tokens/index.ts +12 -0
  152. package/src/lib/theme/tokens/tokens.ts +721 -0
  153. package/src/lib/theme/types.ts +6 -42
  154. package/src/lib/theme/utils/componentTheming.ts +132 -0
  155. package/src/lib/theme/{utils.ts → utils/domUtils.ts} +2 -2
  156. package/src/lib/theme/utils/index.ts +11 -0
  157. package/src/lib/theme/utils/injectCSS.ts +90 -0
  158. package/src/lib/theme/utils/naming.ts +100 -0
  159. package/src/lib/theme/utils/themeHelpers.ts +78 -0
  160. package/src/lib/theme/{themeUtils.ts → utils/themeUtils.ts} +7 -7
  161. package/src/lib/theme-tools.ts +7 -8
  162. package/src/lib/types/components.ts +40 -130
  163. package/src/lib/utils/componentUtils.ts +2 -2
  164. package/src/lib/utils/memoryMonitor.ts +3 -3
  165. package/src/lib/utils/themeNaming.ts +135 -0
  166. package/src/styles/01-settings/_settings.design-tokens.scss +4 -1
  167. package/src/styles/02-tools/_tools.button.scss +66 -79
  168. package/src/styles/06-components/_components.atomix-glass.scss +13 -3
  169. package/src/styles/06-components/_components.pagination.scss +88 -0
  170. package/scripts/sync-theme-config.js +0 -309
  171. package/src/lib/theme/composeTheme.ts +0 -370
  172. package/src/lib/theme/core/ThemeCache.ts +0 -283
  173. package/src/lib/theme/core/ThemeEngine.test.ts +0 -146
  174. package/src/lib/theme/core/ThemeEngine.ts +0 -665
  175. package/src/lib/theme/createThemeFromConfig.ts +0 -132
  176. package/src/lib/theme/devtools/CLI.ts +0 -364
  177. package/src/lib/theme/runtime/ThemeManager.test.ts +0 -192
  178. package/src/lib/theme/runtime/ThemeManager.ts +0 -446
  179. package/src/styles/03-generic/_generated-root.css +0 -26
  180. package/src/themes/README.md +0 -442
  181. package/src/themes/themes.config.js +0 -68
  182. /package/src/lib/theme/{cssVariableMapper.ts → adapters/cssVariableMapper.ts} +0 -0
@@ -1,446 +0,0 @@
1
- /**
2
- * Theme Manager
3
- *
4
- * Core theme management class for the Atomix Design System.
5
- * Rewritten to use the new ThemeEngine architecture.
6
- * Handles theme loading, switching, persistence, and events.
7
- * Supports both CSS-based themes and JavaScript-based themes.
8
- */
9
-
10
- import type {
11
- ThemeManagerConfig,
12
- ThemeMetadata,
13
- ThemeChangeEvent,
14
- ThemeLoadOptions,
15
- ThemeEventListeners,
16
- ThemeChangeCallback,
17
- ThemeLoadCallback,
18
- ThemeErrorCallback,
19
- StorageAdapter,
20
- Theme,
21
- } from '../types';
22
-
23
- import {
24
- isBrowser,
25
- isServer,
26
- createLocalStorageAdapter,
27
- } from '../utils';
28
-
29
- import { ThemeEngine, type ThemeEngineConfig } from '../core/ThemeEngine';
30
- import { loadThemeConfig } from '../config/loader';
31
- import { isJSTheme } from '../themeUtils';
32
- import { RTLManager, type RTLConfig } from '../i18n/rtl';
33
- import { ThemeError, ThemeErrorCode, getLogger } from '../errors';
34
- import {
35
- DEFAULT_STORAGE_KEY,
36
- DEFAULT_DATA_ATTRIBUTE,
37
- DEFAULT_BASE_PATH,
38
- } from '../constants';
39
-
40
- /**
41
- * Default configuration values
42
- */
43
- const DEFAULT_CONFIG: Partial<ThemeManagerConfig> = {
44
- basePath: DEFAULT_BASE_PATH,
45
- cdnPath: null,
46
- lazy: true,
47
- storageKey: DEFAULT_STORAGE_KEY,
48
- dataAttribute: DEFAULT_DATA_ATTRIBUTE,
49
- enablePersistence: true,
50
- useMinified: false,
51
- preload: [],
52
- };
53
-
54
- /**
55
- * ThemeManager class
56
- *
57
- * Manages theme loading, switching, and persistence for Atomix Design System.
58
- * Uses the new ThemeEngine architecture for unified CSS/JS theme support.
59
- *
60
- * @example
61
- * ```typescript
62
- * const themeManager = new ThemeManager({
63
- * // No defaultTheme - uses built-in styles
64
- * });
65
- *
66
- * await themeManager.setTheme('my-custom-theme');
67
- * ```
68
- */
69
- export class ThemeManager {
70
- private engine: ThemeEngine;
71
- private config: Required<Omit<ThemeManagerConfig, 'onThemeChange' | 'onError' | 'cdnPath' | 'defaultTheme'>> & {
72
- defaultTheme?: string | Theme;
73
- cdnPath: string | null;
74
- onThemeChange?: (theme: string | Theme) => void;
75
- onError?: (error: Error, themeName: string) => void;
76
- };
77
-
78
- private currentTheme: string | null = null;
79
- private activeTheme: Theme | null = null;
80
- private eventListeners: ThemeEventListeners = {
81
- themeChange: [],
82
- themeLoad: [],
83
- themeError: [],
84
- };
85
- private storageAdapter: StorageAdapter;
86
- private initialized: boolean = false;
87
- private rtlManager?: RTLManager;
88
- private logger = getLogger();
89
-
90
- /**
91
- * Create a new ThemeManager instance
92
- *
93
- * @param config - Theme manager configuration
94
- */
95
- constructor(config: ThemeManagerConfig) {
96
- // Merge with defaults
97
- this.config = {
98
- ...DEFAULT_CONFIG,
99
- ...config,
100
- themes: config.themes || {},
101
- defaultTheme: config.defaultTheme,
102
- } as Required<Omit<ThemeManagerConfig, 'onThemeChange' | 'onError' | 'cdnPath' | 'defaultTheme'>> & {
103
- defaultTheme?: string | Theme;
104
- cdnPath: string | null;
105
- onThemeChange?: (theme: string | Theme) => void;
106
- onError?: (error: Error, themeName: string) => void;
107
- };
108
-
109
- // Initialize storage adapter
110
- this.storageAdapter = createLocalStorageAdapter();
111
-
112
- // Create theme engine
113
- const engineConfig: ThemeEngineConfig = {
114
- basePath: this.config.basePath,
115
- cdnPath: this.config.cdnPath,
116
- useMinified: this.config.useMinified,
117
- dataAttribute: this.config.dataAttribute,
118
- enableCache: true,
119
- };
120
-
121
- this.engine = new ThemeEngine(engineConfig);
122
-
123
- // Initialize RTL manager if configured
124
- if (config.rtl) {
125
- this.rtlManager = new RTLManager(config.rtl);
126
- }
127
-
128
- // Set up engine event listeners
129
- this.engine.on('change', (event) => {
130
- this.currentTheme = event.currentTheme;
131
- this.activeTheme = event.themeObject || null;
132
- this.emitThemeChange(event);
133
- });
134
-
135
- this.engine.on('load', (themeId) => {
136
- this.emitThemeLoad(themeId);
137
- });
138
-
139
- this.engine.on('error', (error, themeId) => {
140
- this.emitThemeError(error, themeId);
141
- });
142
-
143
- // Initialize theme manager
144
- this.initialize();
145
- }
146
-
147
- /**
148
- * Initialize the theme manager
149
- */
150
- private initialize(): void {
151
- if (this.initialized || isServer()) {
152
- return;
153
- }
154
-
155
- // Initialize engine
156
- this.engine.initialize().then(() => {
157
- // Register themes from config if provided
158
- // This allows themes to be passed via ThemeManager config
159
- // even if theme.config.ts fails to load
160
- if (this.config.themes && Object.keys(this.config.themes).length > 0) {
161
- const registry = this.engine.getRegistry();
162
- for (const [themeId, metadata] of Object.entries(this.config.themes)) {
163
- // Only register if not already registered (from theme.config.ts)
164
- if (!registry.has(themeId)) {
165
- // Convert ThemeMetadata to CSSThemeDefinition
166
- registry.register(themeId, {
167
- type: 'css',
168
- name: metadata.name,
169
- class: metadata.class || themeId,
170
- description: metadata.description,
171
- author: metadata.author,
172
- version: metadata.version,
173
- tags: metadata.tags,
174
- supportsDarkMode: metadata.supportsDarkMode,
175
- status: metadata.status,
176
- a11y: metadata.a11y,
177
- color: metadata.color,
178
- features: metadata.features,
179
- dependencies: metadata.dependencies,
180
- });
181
- }
182
- }
183
- }
184
-
185
- // Load default theme only if specified
186
- const defaultTheme = this.getDefaultTheme();
187
- if (defaultTheme) {
188
- // Check if theme exists in registry before attempting to load
189
- const themeId = typeof defaultTheme === 'string' ? defaultTheme : (defaultTheme.name || '');
190
- if (this.engine.getRegistry().has(themeId)) {
191
- this.setTheme(defaultTheme, { removePrevious: false, fallbackOnError: true }).catch((error) => {
192
- // Only log error once, don't spam console
193
- if (error instanceof Error && !error.message.includes('previously failed')) {
194
- this.logger.warn(`Failed to load default theme "${themeId}"`, {
195
- themeId,
196
- error: error.message,
197
- });
198
- }
199
- });
200
- } else {
201
- // Theme not in registry, log warning but don't try to load
202
- this.logger.warn(`Default theme "${themeId}" not found in registry. Using built-in styles.`, {
203
- themeId,
204
- });
205
- }
206
- }
207
- // If no default theme, use built-in styles (no theme CSS loaded)
208
- });
209
-
210
- this.initialized = true;
211
- }
212
-
213
- /**
214
- * Get default theme
215
- */
216
- private getDefaultTheme(): string | Theme | null {
217
- // Check storage first
218
- if (this.config.enablePersistence && this.storageAdapter.isAvailable()) {
219
- const stored = this.storageAdapter.getItem(this.config.storageKey);
220
- if (stored) {
221
- try {
222
- // Try to parse as theme name
223
- if (this.engine.getRegistry().has(stored)) {
224
- return stored;
225
- }
226
- } catch {
227
- // Ignore parse errors
228
- }
229
- }
230
- }
231
-
232
- // Use config default
233
- return this.config.defaultTheme || null;
234
- }
235
-
236
- /**
237
- * Set theme
238
- */
239
- async setTheme(theme: string | Theme, options?: ThemeLoadOptions): Promise<void> {
240
- await this.engine.setTheme(theme, options);
241
-
242
- // Persist to storage
243
- if (this.config.enablePersistence && this.storageAdapter.isAvailable()) {
244
- const themeId = typeof theme === 'string' ? theme : (theme.name || 'js-theme');
245
- this.storageAdapter.setItem(this.config.storageKey, themeId);
246
- }
247
-
248
- // Call config callback
249
- if (this.config.onThemeChange) {
250
- this.config.onThemeChange(theme);
251
- }
252
- }
253
-
254
- /**
255
- * Get current theme
256
- */
257
- getTheme(): string {
258
- return this.currentTheme || (typeof this.config.defaultTheme === 'string' ? this.config.defaultTheme : '');
259
- }
260
-
261
- /**
262
- * Get active theme object (for JS themes)
263
- */
264
- getActiveTheme(): Theme | null {
265
- return this.activeTheme || this.engine.getActiveTheme();
266
- }
267
-
268
- /**
269
- * Get available themes
270
- */
271
- getAvailableThemes(): ThemeMetadata[] {
272
- return this.engine.getRegistry().getAllMetadata();
273
- }
274
-
275
- /**
276
- * Check if theme is loaded
277
- */
278
- isThemeLoaded(themeName: string): boolean {
279
- return this.engine.isThemeLoaded(themeName);
280
- }
281
-
282
- /**
283
- * Preload theme
284
- */
285
- async preloadTheme(themeName: string): Promise<void> {
286
- await this.engine.preloadTheme(themeName);
287
- }
288
-
289
- /**
290
- * Add event listener
291
- */
292
- /* eslint-disable no-dupe-class-members */
293
- on(event: 'themeChange', callback: ThemeChangeCallback): void;
294
- on(event: 'themeLoad', callback: ThemeLoadCallback): void;
295
- on(event: 'themeError', callback: ThemeErrorCallback): void;
296
- /* eslint-enable no-dupe-class-members */
297
- on(event: ThemeManagerEvent, callback: ThemeChangeCallback | ThemeLoadCallback | ThemeErrorCallback): void {
298
- if (event === 'themeChange') {
299
- this.eventListeners.themeChange.push(callback as ThemeChangeCallback);
300
- } else if (event === 'themeLoad') {
301
- this.eventListeners.themeLoad.push(callback as ThemeLoadCallback);
302
- } else if (event === 'themeError') {
303
- this.eventListeners.themeError.push(callback as ThemeErrorCallback);
304
- }
305
- }
306
-
307
- /**
308
- * Remove event listener
309
- */
310
- /* eslint-disable no-dupe-class-members */
311
- off(event: 'themeChange', callback: ThemeChangeCallback): void;
312
- off(event: 'themeLoad', callback: ThemeLoadCallback): void;
313
- off(event: 'themeError', callback: ThemeErrorCallback): void;
314
- /* eslint-enable no-dupe-class-members */
315
- off(event: ThemeManagerEvent, callback: ThemeChangeCallback | ThemeLoadCallback | ThemeErrorCallback): void {
316
- if (event === 'themeChange') {
317
- this.eventListeners.themeChange = this.eventListeners.themeChange.filter(cb => cb !== callback);
318
- } else if (event === 'themeLoad') {
319
- this.eventListeners.themeLoad = this.eventListeners.themeLoad.filter(cb => cb !== callback);
320
- } else if (event === 'themeError') {
321
- this.eventListeners.themeError = this.eventListeners.themeError.filter(cb => cb !== callback);
322
- }
323
- }
324
-
325
- /**
326
- * Emit theme change event
327
- */
328
- private emitThemeChange(event: ThemeChangeEvent): void {
329
- for (const callback of this.eventListeners.themeChange) {
330
- try {
331
- callback(event);
332
- } catch (error) {
333
- this.logger.error(
334
- 'Error in theme change callback',
335
- error instanceof Error ? error : new Error(String(error)),
336
- { event }
337
- );
338
- }
339
- }
340
- }
341
-
342
- /**
343
- * Emit theme load event
344
- */
345
- private emitThemeLoad(themeName: string): void {
346
- for (const callback of this.eventListeners.themeLoad) {
347
- try {
348
- callback(themeName);
349
- } catch (error) {
350
- this.logger.error(
351
- 'Error in theme load callback',
352
- error instanceof Error ? error : new Error(String(error)),
353
- { themeName }
354
- );
355
- }
356
- }
357
- }
358
-
359
- /**
360
- * Emit theme error event
361
- */
362
- private emitThemeError(error: Error, themeName: string): void {
363
- const themeError = error instanceof ThemeError
364
- ? error
365
- : new ThemeError(
366
- error.message,
367
- ThemeErrorCode.THEME_LOAD_FAILED,
368
- { themeName, originalError: error.message }
369
- );
370
-
371
- if (this.config.onError) {
372
- try {
373
- this.config.onError(error, themeName);
374
- } catch (err) {
375
- this.logger.error(
376
- 'Error in onError callback',
377
- err instanceof Error ? err : new Error(String(err)),
378
- { themeName }
379
- );
380
- }
381
- }
382
-
383
- for (const callback of this.eventListeners.themeError) {
384
- try {
385
- callback(error, themeName);
386
- } catch (err) {
387
- this.logger.error(
388
- 'Error in theme error callback',
389
- err instanceof Error ? err : new Error(String(err)),
390
- { themeName }
391
- );
392
- }
393
- }
394
- }
395
-
396
- /**
397
- * Get engine instance (for advanced usage)
398
- */
399
- getEngine(): ThemeEngine {
400
- return this.engine;
401
- }
402
-
403
- /**
404
- * Get RTL manager
405
- */
406
- getRTLManager(): RTLManager | undefined {
407
- return this.rtlManager;
408
- }
409
-
410
- /**
411
- * Set RTL direction
412
- */
413
- setDirection(direction: 'ltr' | 'rtl'): void {
414
- this.rtlManager?.setDirection(direction);
415
- }
416
-
417
- /**
418
- * Get current direction
419
- */
420
- getDirection(): 'ltr' | 'rtl' {
421
- return this.rtlManager?.getDirection() || 'ltr';
422
- }
423
-
424
- /**
425
- * Destroy theme manager
426
- */
427
- destroy(): void {
428
- // Remove all listeners
429
- this.eventListeners = {
430
- themeChange: [],
431
- themeLoad: [],
432
- themeError: [],
433
- };
434
-
435
- // Destroy RTL manager
436
- this.rtlManager?.destroy();
437
-
438
- // Clear engine listeners
439
- this.initialized = false;
440
- }
441
- }
442
-
443
- /**
444
- * Theme manager event type
445
- */
446
- type ThemeManagerEvent = 'themeChange' | 'themeLoad' | 'themeError';
@@ -1,26 +0,0 @@
1
- /* AUTO-GENERATED - DO NOT EDIT MANUALLY */
2
- /* Generated on: 2025-12-23T09:44:24.463Z */
3
- /* This file is generated from atomix.config.ts */
4
- /* Edit atomix.config.ts and run 'npm run sync:config' to regenerate */
5
-
6
- :root {
7
- --atomix-primary: #3b82f6;
8
- --atomix-primary-1: #d8e6fd;
9
- --atomix-primary-10: #183462;
10
- --atomix-primary-2: #b8d2fc;
11
- --atomix-primary-3: #99befa;
12
- --atomix-primary-4: #7aaaf9;
13
- --atomix-primary-5: #5a96f7;
14
- --atomix-primary-6: #3b82f6;
15
- --atomix-primary-7: #326fd1;
16
- --atomix-primary-8: #295bac;
17
- --atomix-primary-9: #204887;
18
- --atomix-primary-bg-subtle: rgba(59, 130, 246, 0.1);
19
- --atomix-primary-border-subtle: rgba(59, 130, 246, 0.2);
20
- --atomix-primary-dark: #204887;
21
- --atomix-primary-hover: #326fd1;
22
- --atomix-primary-light: #99befa;
23
- --atomix-primary-main: #3b82f6;
24
- --atomix-primary-rgb: 59, 130, 246;
25
- --atomix-primary-text-emphasis: #5895f7;
26
- }