@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.
- package/README.md +101 -199
- package/atomix.config.ts +241 -0
- package/dist/atomix.css +260 -179
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +250 -179
- package/dist/atomix.min.css.map +1 -1
- package/dist/charts.js +61 -66
- package/dist/charts.js.map +1 -1
- package/dist/core.js +47 -31
- package/dist/core.js.map +1 -1
- package/dist/forms.js +47 -31
- package/dist/forms.js.map +1 -1
- package/dist/heavy.js +47 -31
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +1841 -1633
- package/dist/index.esm.js +4975 -4113
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +5151 -4290
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/theme.d.ts +1572 -1442
- package/dist/theme.js +4816 -4080
- package/dist/theme.js.map +1 -1
- package/package.json +6 -20
- package/src/components/Accordion/Accordion.stories.tsx +50 -17
- package/src/components/AtomixGlass/AtomixGlass.tsx +65 -31
- package/src/components/AtomixGlass/AtomixGlassContainer.tsx +11 -4
- package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +1 -32
- package/src/components/AtomixGlass/stories/Examples.stories.tsx +2 -2
- package/src/components/AtomixGlass/stories/shared-components.tsx +0 -31
- package/src/components/Avatar/Avatar.stories.tsx +7 -0
- package/src/components/Badge/Badge.stories.tsx +91 -13
- package/src/components/Block/Block.stories.tsx +7 -23
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +7 -0
- package/src/components/Button/Button.stories.tsx +141 -22
- package/src/components/Button/ButtonGroup.stories.tsx +315 -0
- package/src/components/Button/ButtonGroup.tsx +67 -0
- package/src/components/Button/index.ts +2 -0
- package/src/components/Callout/Callout.stories.tsx +8 -6
- package/src/components/Card/Card.stories.tsx +82 -28
- package/src/components/Chart/AnimatedChart.tsx +0 -1
- package/src/components/Chart/AreaChart.tsx +0 -1
- package/src/components/Chart/BarChart.tsx +0 -1
- package/src/components/Chart/BubbleChart.tsx +0 -1
- package/src/components/Chart/CandlestickChart.tsx +0 -1
- package/src/components/Chart/Chart.stories.tsx +5 -7
- package/src/components/Chart/Chart.tsx +0 -16
- package/src/components/Chart/ChartRenderer.tsx +1 -1
- package/src/components/Chart/DonutChart.tsx +0 -1
- package/src/components/Chart/FunnelChart.tsx +0 -1
- package/src/components/Chart/GaugeChart.tsx +0 -1
- package/src/components/Chart/HeatmapChart.tsx +0 -1
- package/src/components/Chart/LineChart.tsx +0 -1
- package/src/components/Chart/MultiAxisChart.tsx +0 -1
- package/src/components/Chart/PieChart.tsx +0 -1
- package/src/components/Chart/RadarChart.tsx +0 -1
- package/src/components/Chart/ScatterChart.tsx +0 -1
- package/src/components/Chart/WaterfallChart.tsx +0 -1
- package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +7 -0
- package/src/components/DataTable/DataTable.stories.tsx +23 -16
- package/src/components/DatePicker/DatePicker.stories.tsx +27 -19
- package/src/components/Dropdown/Dropdown.stories.tsx +11 -19
- package/src/components/EdgePanel/EdgePanel.stories.tsx +1 -0
- package/src/components/Footer/Footer.stories.tsx +8 -6
- package/src/components/Footer/FooterLink.tsx +9 -2
- package/src/components/Form/Checkbox.stories.tsx +7 -0
- package/src/components/Form/Form.stories.tsx +7 -0
- package/src/components/Form/FormGroup.stories.tsx +9 -1
- package/src/components/Form/Input.stories.tsx +69 -16
- package/src/components/Form/Radio.stories.tsx +9 -1
- package/src/components/Form/Select.stories.tsx +9 -1
- package/src/components/Form/Textarea.stories.tsx +10 -2
- package/src/components/Hero/Hero.stories.tsx +7 -0
- package/src/components/List/List.stories.tsx +7 -0
- package/src/components/Messages/Messages.stories.tsx +8 -7
- package/src/components/Modal/Modal.stories.tsx +17 -6
- package/src/components/Navigation/Menu/Menu.stories.tsx +7 -0
- package/src/components/Navigation/Nav/Nav.stories.tsx +7 -0
- package/src/components/Navigation/Navbar/Navbar.stories.tsx +1 -0
- package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +1 -1
- package/src/components/Pagination/Pagination.stories.tsx +188 -111
- package/src/components/Pagination/Pagination.tsx +83 -3
- package/src/components/PhotoViewer/PhotoViewer.stories.tsx +10 -5
- package/src/components/Popover/Popover.stories.tsx +191 -115
- package/src/components/ProductReview/ProductReview.stories.tsx +80 -58
- package/src/components/Progress/Progress.stories.tsx +79 -49
- package/src/components/Rating/Rating.stories.tsx +109 -84
- package/src/components/River/River.stories.tsx +194 -114
- package/src/components/SectionIntro/SectionIntro.stories.tsx +19 -9
- package/src/components/Slider/Slider.stories.tsx +7 -0
- package/src/components/Spinner/Spinner.stories.tsx +15 -11
- package/src/components/Steps/Steps.stories.tsx +132 -98
- package/src/components/Tabs/Tabs.stories.tsx +163 -112
- package/src/components/Testimonial/Testimonial.stories.tsx +114 -68
- package/src/components/Todo/Todo.stories.tsx +38 -12
- package/src/components/Toggle/Toggle.stories.tsx +61 -28
- package/src/components/Tooltip/Tooltip.stories.tsx +318 -200
- package/src/components/Upload/Upload.stories.tsx +122 -84
- package/src/components/VideoPlayer/VideoPlayer.stories.tsx +7 -24
- package/src/components/index.ts +1 -0
- package/src/lib/composables/useAtomixGlass.ts +2 -3
- package/src/lib/composables/useNavbar.ts +0 -10
- package/src/lib/config/loader.ts +2 -1
- package/src/lib/constants/components.ts +10 -0
- package/src/lib/hooks/useComponentCustomization.ts +1 -1
- package/src/lib/theme/README.md +174 -0
- package/src/lib/theme/adapters/index.ts +31 -0
- package/src/lib/theme/adapters/themeAdapter.ts +287 -0
- package/src/lib/theme/config/__tests__/configLoader.test.ts +207 -0
- package/src/lib/theme/config/configLoader.ts +254 -0
- package/src/lib/theme/config/loader.ts +37 -48
- package/src/lib/theme/config/types.ts +2 -2
- package/src/lib/theme/config/validator.ts +15 -91
- package/src/lib/theme/{constants.ts → constants/constants.ts} +0 -18
- package/src/lib/theme/constants/index.ts +8 -0
- package/src/lib/theme/core/ThemeRegistry.ts +19 -6
- package/src/lib/theme/core/__tests__/createTheme.test.ts +132 -0
- package/src/lib/theme/core/composeTheme.ts +155 -0
- package/src/lib/theme/core/createTheme.ts +94 -0
- package/src/lib/theme/{createTheme.ts → core/createThemeObject.ts} +10 -6
- package/src/lib/theme/core/index.ts +5 -19
- package/src/lib/theme/devtools/Comparator.tsx +346 -22
- package/src/lib/theme/devtools/IMPROVEMENTS.md +139 -38
- package/src/lib/theme/devtools/Inspector.tsx +335 -51
- package/src/lib/theme/devtools/LiveEditor.tsx +478 -107
- package/src/lib/theme/devtools/Preview.tsx +471 -221
- package/src/lib/theme/{core → devtools}/ThemeValidator.ts +1 -1
- package/src/lib/theme/devtools/index.ts +14 -4
- package/src/lib/theme/devtools/useHistory.ts +130 -0
- package/src/lib/theme/errors/index.ts +12 -0
- package/src/lib/theme/generators/cssFile.ts +79 -0
- package/src/lib/theme/generators/generateCSS.ts +89 -0
- package/src/lib/theme/{generateCSSVariables.ts → generators/generateCSSVariables.ts} +3 -13
- package/src/lib/theme/generators/index.ts +19 -0
- package/src/lib/theme/i18n/rtl.ts +5 -6
- package/src/lib/theme/index.ts +120 -15
- package/src/lib/theme/runtime/ThemeApplicator.ts +52 -111
- package/src/lib/theme/{ThemeContext.tsx → runtime/ThemeContext.tsx} +1 -1
- package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +1 -1
- package/src/lib/theme/runtime/ThemeProvider.tsx +456 -179
- package/src/lib/theme/runtime/index.ts +1 -2
- package/src/lib/theme/runtime/useTheme.ts +1 -2
- package/src/lib/theme/test/testTheme.ts +385 -0
- package/src/lib/theme/tokens/index.ts +12 -0
- package/src/lib/theme/tokens/tokens.ts +721 -0
- package/src/lib/theme/types.ts +6 -42
- package/src/lib/theme/{utils.ts → utils/domUtils.ts} +2 -2
- package/src/lib/theme/utils/index.ts +11 -0
- package/src/lib/theme/utils/injectCSS.ts +90 -0
- package/src/lib/theme/utils/themeHelpers.ts +78 -0
- package/src/lib/theme/{themeUtils.ts → utils/themeUtils.ts} +1 -1
- package/src/lib/theme-tools.ts +7 -8
- package/src/lib/types/components.ts +40 -130
- package/src/lib/utils/componentUtils.ts +1 -1
- package/src/styles/01-settings/_settings.design-tokens.scss +4 -1
- package/src/styles/02-tools/_tools.button.scss +66 -79
- package/src/styles/06-components/_components.atomix-glass.scss +13 -3
- package/src/styles/06-components/_components.pagination.scss +88 -0
- package/scripts/sync-theme-config.js +0 -309
- package/src/lib/theme/composeTheme.ts +0 -370
- package/src/lib/theme/core/ThemeCache.ts +0 -283
- package/src/lib/theme/core/ThemeEngine.test.ts +0 -146
- package/src/lib/theme/core/ThemeEngine.ts +0 -665
- package/src/lib/theme/createThemeFromConfig.ts +0 -132
- package/src/lib/theme/devtools/CLI.ts +0 -364
- package/src/lib/theme/runtime/ThemeManager.test.ts +0 -192
- package/src/lib/theme/runtime/ThemeManager.ts +0 -446
- package/src/styles/03-generic/_generated-root.css +0 -26
- package/src/themes/README.md +0 -442
- package/src/themes/themes.config.js +0 -68
- /package/src/lib/theme/{cssVariableMapper.ts → adapters/cssVariableMapper.ts} +0 -0
- /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
|
-
}
|