@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
@@ -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
- }