@framesquared/theme 0.1.0
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/LICENSE +21 -0
- package/dist/index.d.ts +101 -0
- package/dist/index.js +318 -0
- package/dist/index.js.map +1 -0
- package/package.json +26 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 John Carbone
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @framesquared/theme – Theme
|
|
3
|
+
*
|
|
4
|
+
* A design token container. Tokens are a nested object of values
|
|
5
|
+
* (colors, spacing, typography, etc.). Themes can inherit from
|
|
6
|
+
* a parent — child tokens override parent tokens. apply() sets
|
|
7
|
+
* all tokens as CSS custom properties on :root.
|
|
8
|
+
*/
|
|
9
|
+
interface ThemeConfig {
|
|
10
|
+
name: string;
|
|
11
|
+
parent?: Theme;
|
|
12
|
+
tokens: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
declare class Theme {
|
|
15
|
+
private _name;
|
|
16
|
+
private _parent;
|
|
17
|
+
private _tokens;
|
|
18
|
+
private _appliedVars;
|
|
19
|
+
constructor(config: ThemeConfig);
|
|
20
|
+
getName(): string;
|
|
21
|
+
getToken(path: string): unknown;
|
|
22
|
+
setToken(path: string, value: unknown): void;
|
|
23
|
+
apply(): void;
|
|
24
|
+
unapply(): void;
|
|
25
|
+
getVariableNames(): string[];
|
|
26
|
+
private flatten;
|
|
27
|
+
private getMergedTokens;
|
|
28
|
+
private flattenObj;
|
|
29
|
+
private getByPath;
|
|
30
|
+
private setByPath;
|
|
31
|
+
private deepClone;
|
|
32
|
+
private deepMerge;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @framesquared/theme – ThemeManager
|
|
37
|
+
*
|
|
38
|
+
* Singleton that manages registered themes. setTheme() unapplies
|
|
39
|
+
* the current theme, applies the new one, and fires 'themechange'.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
declare const ThemeManager: {
|
|
43
|
+
register(theme: Theme): void;
|
|
44
|
+
setTheme(name: string): void;
|
|
45
|
+
getTheme(name?: string): Theme | null;
|
|
46
|
+
getActiveThemeName(): string;
|
|
47
|
+
getToken(path: string): unknown;
|
|
48
|
+
on(event: string, fn: Function): void;
|
|
49
|
+
off(event: string, fn: Function): void;
|
|
50
|
+
reset(): void;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @framesquared/theme – StyleSheet
|
|
55
|
+
*
|
|
56
|
+
* Manages CSS rule injection via a <style> element. Supports
|
|
57
|
+
* addRule/removeRule with camelCase→kebab-case conversion.
|
|
58
|
+
*/
|
|
59
|
+
declare class StyleSheet {
|
|
60
|
+
private _styleEl;
|
|
61
|
+
private _rules;
|
|
62
|
+
constructor(name: string);
|
|
63
|
+
getStyleElement(): HTMLStyleElement;
|
|
64
|
+
/**
|
|
65
|
+
* Add a CSS rule. Returns an ID that can be used to remove it.
|
|
66
|
+
*/
|
|
67
|
+
addRule(selector: string, styles: Record<string, string | number>): number;
|
|
68
|
+
/**
|
|
69
|
+
* Remove a previously added rule by its ID.
|
|
70
|
+
*/
|
|
71
|
+
removeRule(id: number): void;
|
|
72
|
+
/**
|
|
73
|
+
* Remove the style element from DOM and clear all rules.
|
|
74
|
+
*/
|
|
75
|
+
destroy(): void;
|
|
76
|
+
private rebuild;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* @framesquared/theme – ClassicTheme
|
|
81
|
+
* ExtJS classic look — blue tones, subtle gradients, traditional feel.
|
|
82
|
+
*/
|
|
83
|
+
|
|
84
|
+
declare const ClassicTheme: Theme;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @framesquared/theme – ModernTheme
|
|
88
|
+
* Clean, flat design — Material-inspired colors, generous spacing.
|
|
89
|
+
*/
|
|
90
|
+
|
|
91
|
+
declare const ModernTheme: Theme;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* @framesquared/theme – DarkTheme
|
|
95
|
+
* Dark mode — inherits from ModernTheme, inverts backgrounds
|
|
96
|
+
* and text colors for dark environments.
|
|
97
|
+
*/
|
|
98
|
+
|
|
99
|
+
declare const DarkTheme: Theme;
|
|
100
|
+
|
|
101
|
+
export { ClassicTheme, DarkTheme, ModernTheme, StyleSheet, Theme, type ThemeConfig, ThemeManager };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
// src/Theme.ts
|
|
2
|
+
var Theme = class {
|
|
3
|
+
_name;
|
|
4
|
+
_parent;
|
|
5
|
+
_tokens;
|
|
6
|
+
_appliedVars = [];
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this._name = config.name;
|
|
9
|
+
this._parent = config.parent ?? null;
|
|
10
|
+
this._tokens = this.deepClone(config.tokens);
|
|
11
|
+
}
|
|
12
|
+
getName() {
|
|
13
|
+
return this._name;
|
|
14
|
+
}
|
|
15
|
+
// -----------------------------------------------------------------------
|
|
16
|
+
// Token access
|
|
17
|
+
// -----------------------------------------------------------------------
|
|
18
|
+
getToken(path) {
|
|
19
|
+
const local = this.getByPath(this._tokens, path);
|
|
20
|
+
if (local !== void 0) return local;
|
|
21
|
+
if (this._parent) return this._parent.getToken(path);
|
|
22
|
+
return void 0;
|
|
23
|
+
}
|
|
24
|
+
setToken(path, value) {
|
|
25
|
+
this.setByPath(this._tokens, path, value);
|
|
26
|
+
}
|
|
27
|
+
// -----------------------------------------------------------------------
|
|
28
|
+
// CSS custom properties
|
|
29
|
+
// -----------------------------------------------------------------------
|
|
30
|
+
apply() {
|
|
31
|
+
this._appliedVars = [];
|
|
32
|
+
const flat = this.flatten();
|
|
33
|
+
const root = document.documentElement;
|
|
34
|
+
for (const [varName, value] of flat) {
|
|
35
|
+
root.style.setProperty(varName, String(value));
|
|
36
|
+
this._appliedVars.push(varName);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
unapply() {
|
|
40
|
+
const root = document.documentElement;
|
|
41
|
+
for (const varName of this._appliedVars) {
|
|
42
|
+
root.style.removeProperty(varName);
|
|
43
|
+
}
|
|
44
|
+
this._appliedVars = [];
|
|
45
|
+
}
|
|
46
|
+
getVariableNames() {
|
|
47
|
+
return this.flatten().map(([name]) => name);
|
|
48
|
+
}
|
|
49
|
+
// -----------------------------------------------------------------------
|
|
50
|
+
// Flatten tokens to CSS variable pairs
|
|
51
|
+
// -----------------------------------------------------------------------
|
|
52
|
+
flatten() {
|
|
53
|
+
const result = [];
|
|
54
|
+
const merged = this.getMergedTokens();
|
|
55
|
+
this.flattenObj(merged, "--ext", result);
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
getMergedTokens() {
|
|
59
|
+
if (!this._parent) return this._tokens;
|
|
60
|
+
const parentTokens = this._parent.getMergedTokens();
|
|
61
|
+
return this.deepMerge(parentTokens, this._tokens);
|
|
62
|
+
}
|
|
63
|
+
flattenObj(obj, prefix, result) {
|
|
64
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
65
|
+
const varName = `${prefix}-${key}`;
|
|
66
|
+
if (value !== null && typeof value === "object" && !Array.isArray(value)) {
|
|
67
|
+
this.flattenObj(value, varName, result);
|
|
68
|
+
} else {
|
|
69
|
+
result.push([varName, value]);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// -----------------------------------------------------------------------
|
|
74
|
+
// Helpers
|
|
75
|
+
// -----------------------------------------------------------------------
|
|
76
|
+
getByPath(obj, path) {
|
|
77
|
+
const parts = path.split(".");
|
|
78
|
+
let current = obj;
|
|
79
|
+
for (const part of parts) {
|
|
80
|
+
if (current == null || typeof current !== "object") return void 0;
|
|
81
|
+
current = current[part];
|
|
82
|
+
}
|
|
83
|
+
return current;
|
|
84
|
+
}
|
|
85
|
+
setByPath(obj, path, value) {
|
|
86
|
+
const parts = path.split(".");
|
|
87
|
+
let current = obj;
|
|
88
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
89
|
+
if (current[parts[i]] == null || typeof current[parts[i]] !== "object") {
|
|
90
|
+
current[parts[i]] = {};
|
|
91
|
+
}
|
|
92
|
+
current = current[parts[i]];
|
|
93
|
+
}
|
|
94
|
+
current[parts[parts.length - 1]] = value;
|
|
95
|
+
}
|
|
96
|
+
deepClone(obj) {
|
|
97
|
+
return JSON.parse(JSON.stringify(obj));
|
|
98
|
+
}
|
|
99
|
+
deepMerge(target, source) {
|
|
100
|
+
const result = { ...target };
|
|
101
|
+
for (const key of Object.keys(source)) {
|
|
102
|
+
if (source[key] !== null && typeof source[key] === "object" && !Array.isArray(source[key]) && target[key] !== null && typeof target[key] === "object" && !Array.isArray(target[key])) {
|
|
103
|
+
result[key] = this.deepMerge(target[key], source[key]);
|
|
104
|
+
} else {
|
|
105
|
+
result[key] = source[key];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// src/ThemeManager.ts
|
|
113
|
+
var themes = /* @__PURE__ */ new Map();
|
|
114
|
+
var activeTheme = null;
|
|
115
|
+
var activeName = "";
|
|
116
|
+
var listeners = {};
|
|
117
|
+
function fire(event, ...args) {
|
|
118
|
+
(listeners[event] ?? []).forEach((fn) => fn(...args));
|
|
119
|
+
}
|
|
120
|
+
var ThemeManager = {
|
|
121
|
+
register(theme) {
|
|
122
|
+
themes.set(theme.getName(), theme);
|
|
123
|
+
},
|
|
124
|
+
setTheme(name) {
|
|
125
|
+
const theme = themes.get(name);
|
|
126
|
+
if (!theme) return;
|
|
127
|
+
if (activeTheme) activeTheme.unapply();
|
|
128
|
+
activeTheme = theme;
|
|
129
|
+
activeName = name;
|
|
130
|
+
theme.apply();
|
|
131
|
+
fire("themechange", theme, name);
|
|
132
|
+
},
|
|
133
|
+
getTheme(name) {
|
|
134
|
+
if (name) return themes.get(name) ?? null;
|
|
135
|
+
return activeTheme;
|
|
136
|
+
},
|
|
137
|
+
getActiveThemeName() {
|
|
138
|
+
return activeName;
|
|
139
|
+
},
|
|
140
|
+
getToken(path) {
|
|
141
|
+
return activeTheme?.getToken(path) ?? void 0;
|
|
142
|
+
},
|
|
143
|
+
on(event, fn) {
|
|
144
|
+
(listeners[event] ??= []).push(fn);
|
|
145
|
+
},
|
|
146
|
+
off(event, fn) {
|
|
147
|
+
const list = listeners[event];
|
|
148
|
+
if (!list) return;
|
|
149
|
+
const idx = list.indexOf(fn);
|
|
150
|
+
if (idx >= 0) list.splice(idx, 1);
|
|
151
|
+
},
|
|
152
|
+
reset() {
|
|
153
|
+
if (activeTheme) activeTheme.unapply();
|
|
154
|
+
activeTheme = null;
|
|
155
|
+
activeName = "";
|
|
156
|
+
themes.clear();
|
|
157
|
+
for (const key of Object.keys(listeners)) {
|
|
158
|
+
listeners[key] = [];
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
// src/StyleSheet.ts
|
|
164
|
+
var ruleCounter = 0;
|
|
165
|
+
function toKebab(str) {
|
|
166
|
+
return str.replace(/([A-Z])/g, "-$1").toLowerCase();
|
|
167
|
+
}
|
|
168
|
+
var StyleSheet = class {
|
|
169
|
+
_styleEl;
|
|
170
|
+
_rules = /* @__PURE__ */ new Map();
|
|
171
|
+
constructor(name) {
|
|
172
|
+
this._styleEl = document.createElement("style");
|
|
173
|
+
this._styleEl.setAttribute("data-ext-stylesheet", name);
|
|
174
|
+
}
|
|
175
|
+
getStyleElement() {
|
|
176
|
+
return this._styleEl;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Add a CSS rule. Returns an ID that can be used to remove it.
|
|
180
|
+
*/
|
|
181
|
+
addRule(selector, styles) {
|
|
182
|
+
const id = ruleCounter++;
|
|
183
|
+
const declarations = Object.entries(styles).map(([prop, val]) => `${toKebab(prop)}: ${val}`).join("; ");
|
|
184
|
+
const ruleText = `${selector} { ${declarations}; }`;
|
|
185
|
+
this._rules.set(id, ruleText);
|
|
186
|
+
this.rebuild();
|
|
187
|
+
return id;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Remove a previously added rule by its ID.
|
|
191
|
+
*/
|
|
192
|
+
removeRule(id) {
|
|
193
|
+
this._rules.delete(id);
|
|
194
|
+
this.rebuild();
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Remove the style element from DOM and clear all rules.
|
|
198
|
+
*/
|
|
199
|
+
destroy() {
|
|
200
|
+
if (this._styleEl.parentNode) {
|
|
201
|
+
this._styleEl.parentNode.removeChild(this._styleEl);
|
|
202
|
+
}
|
|
203
|
+
this._rules.clear();
|
|
204
|
+
}
|
|
205
|
+
rebuild() {
|
|
206
|
+
this._styleEl.textContent = Array.from(this._rules.values()).join("\n");
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
// src/themes/ClassicTheme.ts
|
|
211
|
+
var ClassicTheme = new Theme({
|
|
212
|
+
name: "classic",
|
|
213
|
+
tokens: {
|
|
214
|
+
color: {
|
|
215
|
+
primary: "#157fcc",
|
|
216
|
+
secondary: "#486085",
|
|
217
|
+
success: "#4caf50",
|
|
218
|
+
warning: "#ff9800",
|
|
219
|
+
error: "#cf4c35",
|
|
220
|
+
background: "#f0f0f0",
|
|
221
|
+
surface: "#ffffff",
|
|
222
|
+
text: { primary: "#333333", secondary: "#666666", disabled: "#999999" }
|
|
223
|
+
},
|
|
224
|
+
spacing: { xs: 2, sm: 4, md: 8, lg: 12, xl: 16 },
|
|
225
|
+
borderRadius: { sm: 1, md: 2, lg: 4, xl: 8, round: "50%" },
|
|
226
|
+
shadow: {
|
|
227
|
+
sm: "0 1px 2px rgba(0,0,0,0.15)",
|
|
228
|
+
md: "0 2px 4px rgba(0,0,0,0.2)",
|
|
229
|
+
lg: "0 4px 8px rgba(0,0,0,0.25)",
|
|
230
|
+
xl: "0 8px 16px rgba(0,0,0,0.3)"
|
|
231
|
+
},
|
|
232
|
+
typography: {
|
|
233
|
+
fontFamily: { sans: "Tahoma, Arial, Verdana, sans-serif", mono: "Consolas, monospace" },
|
|
234
|
+
fontSize: { xs: 11, sm: 12, md: 13, lg: 14, xl: 18, xxl: 24 },
|
|
235
|
+
fontWeight: { normal: 400, medium: 500, bold: 700 },
|
|
236
|
+
lineHeight: { tight: 1.2, normal: 1.4, relaxed: 1.6 }
|
|
237
|
+
},
|
|
238
|
+
component: {
|
|
239
|
+
button: { height: 28, padding: "0 12px", borderRadius: 2 },
|
|
240
|
+
panel: { headerHeight: 32, borderWidth: 1, borderColor: "#99bce8" },
|
|
241
|
+
field: { height: 26, labelWidth: 100 },
|
|
242
|
+
grid: { rowHeight: 26, headerHeight: 30 }
|
|
243
|
+
},
|
|
244
|
+
breakpoints: { xs: 0, sm: 600, md: 960, lg: 1280, xl: 1920 },
|
|
245
|
+
transition: { fast: "100ms", normal: "200ms", slow: "300ms" },
|
|
246
|
+
zIndex: { dropdown: 1e3, modal: 1050, tooltip: 1100, notification: 1200 }
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
// src/themes/ModernTheme.ts
|
|
251
|
+
var ModernTheme = new Theme({
|
|
252
|
+
name: "modern",
|
|
253
|
+
tokens: {
|
|
254
|
+
color: {
|
|
255
|
+
primary: "#1976d2",
|
|
256
|
+
secondary: "#dc004e",
|
|
257
|
+
success: "#4caf50",
|
|
258
|
+
warning: "#ff9800",
|
|
259
|
+
error: "#f44336",
|
|
260
|
+
background: "#ffffff",
|
|
261
|
+
surface: "#f5f5f5",
|
|
262
|
+
text: { primary: "#212121", secondary: "#757575", disabled: "#bdbdbd" }
|
|
263
|
+
},
|
|
264
|
+
spacing: { xs: 4, sm: 8, md: 16, lg: 24, xl: 32 },
|
|
265
|
+
borderRadius: { sm: 2, md: 4, lg: 8, xl: 16, round: "50%" },
|
|
266
|
+
shadow: {
|
|
267
|
+
sm: "0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)",
|
|
268
|
+
md: "0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23)",
|
|
269
|
+
lg: "0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23)",
|
|
270
|
+
xl: "0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22)"
|
|
271
|
+
},
|
|
272
|
+
typography: {
|
|
273
|
+
fontFamily: { sans: "Inter, -apple-system, sans-serif", mono: "Fira Code, monospace" },
|
|
274
|
+
fontSize: { xs: 12, sm: 14, md: 16, lg: 18, xl: 24, xxl: 32 },
|
|
275
|
+
fontWeight: { normal: 400, medium: 500, bold: 700 },
|
|
276
|
+
lineHeight: { tight: 1.2, normal: 1.5, relaxed: 1.75 }
|
|
277
|
+
},
|
|
278
|
+
component: {
|
|
279
|
+
button: { height: 36, padding: "0 16px", borderRadius: 4 },
|
|
280
|
+
panel: { headerHeight: 40, borderWidth: 1, borderColor: "#e0e0e0" },
|
|
281
|
+
field: { height: 32, labelWidth: 150 },
|
|
282
|
+
grid: { rowHeight: 32, headerHeight: 36 }
|
|
283
|
+
},
|
|
284
|
+
breakpoints: { xs: 0, sm: 600, md: 960, lg: 1280, xl: 1920 },
|
|
285
|
+
transition: { fast: "150ms", normal: "250ms", slow: "400ms" },
|
|
286
|
+
zIndex: { dropdown: 1e3, modal: 1050, tooltip: 1100, notification: 1200 }
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
// src/themes/DarkTheme.ts
|
|
291
|
+
var DarkTheme = new Theme({
|
|
292
|
+
name: "dark",
|
|
293
|
+
parent: ModernTheme,
|
|
294
|
+
tokens: {
|
|
295
|
+
color: {
|
|
296
|
+
primary: "#90caf9",
|
|
297
|
+
secondary: "#f48fb1",
|
|
298
|
+
success: "#81c784",
|
|
299
|
+
warning: "#ffb74d",
|
|
300
|
+
error: "#e57373",
|
|
301
|
+
background: "#121212",
|
|
302
|
+
surface: "#1e1e1e",
|
|
303
|
+
text: { primary: "#e0e0e0", secondary: "#aaaaaa", disabled: "#666666" }
|
|
304
|
+
},
|
|
305
|
+
component: {
|
|
306
|
+
panel: { borderColor: "#333333" }
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
export {
|
|
311
|
+
ClassicTheme,
|
|
312
|
+
DarkTheme,
|
|
313
|
+
ModernTheme,
|
|
314
|
+
StyleSheet,
|
|
315
|
+
Theme,
|
|
316
|
+
ThemeManager
|
|
317
|
+
};
|
|
318
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Theme.ts","../src/ThemeManager.ts","../src/StyleSheet.ts","../src/themes/ClassicTheme.ts","../src/themes/ModernTheme.ts","../src/themes/DarkTheme.ts"],"sourcesContent":["/**\n * @framesquared/theme – Theme\n *\n * A design token container. Tokens are a nested object of values\n * (colors, spacing, typography, etc.). Themes can inherit from\n * a parent — child tokens override parent tokens. apply() sets\n * all tokens as CSS custom properties on :root.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport interface ThemeConfig {\n name: string;\n parent?: Theme;\n tokens: Record<string, unknown>;\n}\n\nexport class Theme {\n private _name: string;\n private _parent: Theme | null;\n private _tokens: Record<string, unknown>;\n private _appliedVars: string[] = [];\n\n constructor(config: ThemeConfig) {\n this._name = config.name;\n this._parent = config.parent ?? null;\n this._tokens = this.deepClone(config.tokens);\n }\n\n getName(): string {\n return this._name;\n }\n\n // -----------------------------------------------------------------------\n // Token access\n // -----------------------------------------------------------------------\n\n getToken(path: string): unknown {\n // Check local tokens first\n const local = this.getByPath(this._tokens, path);\n if (local !== undefined) return local;\n // Fall back to parent\n if (this._parent) return this._parent.getToken(path);\n return undefined;\n }\n\n setToken(path: string, value: unknown): void {\n this.setByPath(this._tokens, path, value);\n }\n\n // -----------------------------------------------------------------------\n // CSS custom properties\n // -----------------------------------------------------------------------\n\n apply(): void {\n this._appliedVars = [];\n const flat = this.flatten();\n const root = document.documentElement;\n for (const [varName, value] of flat) {\n root.style.setProperty(varName, String(value));\n this._appliedVars.push(varName);\n }\n }\n\n unapply(): void {\n const root = document.documentElement;\n for (const varName of this._appliedVars) {\n root.style.removeProperty(varName);\n }\n this._appliedVars = [];\n }\n\n getVariableNames(): string[] {\n return this.flatten().map(([name]) => name);\n }\n\n // -----------------------------------------------------------------------\n // Flatten tokens to CSS variable pairs\n // -----------------------------------------------------------------------\n\n private flatten(): [string, unknown][] {\n const result: [string, unknown][] = [];\n // Merge parent tokens first, then local tokens override\n const merged = this.getMergedTokens();\n this.flattenObj(merged, '--ext', result);\n return result;\n }\n\n private getMergedTokens(): Record<string, unknown> {\n if (!this._parent) return this._tokens;\n const parentTokens = (this._parent as any).getMergedTokens();\n return this.deepMerge(parentTokens, this._tokens);\n }\n\n private flattenObj(obj: any, prefix: string, result: [string, unknown][]): void {\n for (const [key, value] of Object.entries(obj)) {\n const varName = `${prefix}-${key}`;\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n this.flattenObj(value, varName, result);\n } else {\n result.push([varName, value]);\n }\n }\n }\n\n // -----------------------------------------------------------------------\n // Helpers\n // -----------------------------------------------------------------------\n\n private getByPath(obj: any, path: string): unknown {\n const parts = path.split('.');\n let current = obj;\n for (const part of parts) {\n if (current == null || typeof current !== 'object') return undefined;\n current = current[part];\n }\n return current;\n }\n\n private setByPath(obj: any, path: string, value: unknown): void {\n const parts = path.split('.');\n let current = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n if (current[parts[i]] == null || typeof current[parts[i]] !== 'object') {\n current[parts[i]] = {};\n }\n current = current[parts[i]];\n }\n current[parts[parts.length - 1]] = value;\n }\n\n private deepClone(obj: Record<string, unknown>): Record<string, unknown> {\n return JSON.parse(JSON.stringify(obj));\n }\n\n private deepMerge(target: any, source: any): any {\n const result = { ...target };\n for (const key of Object.keys(source)) {\n if (\n source[key] !== null &&\n typeof source[key] === 'object' &&\n !Array.isArray(source[key]) &&\n target[key] !== null &&\n typeof target[key] === 'object' &&\n !Array.isArray(target[key])\n ) {\n result[key] = this.deepMerge(target[key], source[key]);\n } else {\n result[key] = source[key];\n }\n }\n return result;\n }\n}\n","/**\n * @framesquared/theme – ThemeManager\n *\n * Singleton that manages registered themes. setTheme() unapplies\n * the current theme, applies the new one, and fires 'themechange'.\n */\n\nimport type { Theme } from './Theme.js';\n\nconst themes = new Map<string, Theme>();\nlet activeTheme: Theme | null = null;\nlet activeName = '';\nconst listeners: Record<string, Function[]> = {};\n\nfunction fire(event: string, ...args: unknown[]): void {\n (listeners[event] ?? []).forEach(fn => fn(...args));\n}\n\nexport const ThemeManager = {\n register(theme: Theme): void {\n themes.set(theme.getName(), theme);\n },\n\n setTheme(name: string): void {\n const theme = themes.get(name);\n if (!theme) return;\n\n // Unapply current\n if (activeTheme) activeTheme.unapply();\n\n // Apply new\n activeTheme = theme;\n activeName = name;\n theme.apply();\n\n fire('themechange', theme, name);\n },\n\n getTheme(name?: string): Theme | null {\n if (name) return themes.get(name) ?? null;\n return activeTheme;\n },\n\n getActiveThemeName(): string {\n return activeName;\n },\n\n getToken(path: string): unknown {\n return activeTheme?.getToken(path) ?? undefined;\n },\n\n on(event: string, fn: Function): void {\n (listeners[event] ??= []).push(fn);\n },\n\n off(event: string, fn: Function): void {\n const list = listeners[event];\n if (!list) return;\n const idx = list.indexOf(fn);\n if (idx >= 0) list.splice(idx, 1);\n },\n\n reset(): void {\n if (activeTheme) activeTheme.unapply();\n activeTheme = null;\n activeName = '';\n themes.clear();\n for (const key of Object.keys(listeners)) {\n listeners[key] = [];\n }\n },\n};\n","/**\n * @framesquared/theme – StyleSheet\n *\n * Manages CSS rule injection via a <style> element. Supports\n * addRule/removeRule with camelCase→kebab-case conversion.\n */\n\nlet ruleCounter = 0;\n\nfunction toKebab(str: string): string {\n return str.replace(/([A-Z])/g, '-$1').toLowerCase();\n}\n\nexport class StyleSheet {\n private _styleEl: HTMLStyleElement;\n private _rules = new Map<number, string>();\n\n constructor(name: string) {\n this._styleEl = document.createElement('style');\n this._styleEl.setAttribute('data-ext-stylesheet', name);\n }\n\n getStyleElement(): HTMLStyleElement {\n return this._styleEl;\n }\n\n /**\n * Add a CSS rule. Returns an ID that can be used to remove it.\n */\n addRule(selector: string, styles: Record<string, string | number>): number {\n const id = ruleCounter++;\n const declarations = Object.entries(styles)\n .map(([prop, val]) => `${toKebab(prop)}: ${val}`)\n .join('; ');\n const ruleText = `${selector} { ${declarations}; }`;\n this._rules.set(id, ruleText);\n this.rebuild();\n return id;\n }\n\n /**\n * Remove a previously added rule by its ID.\n */\n removeRule(id: number): void {\n this._rules.delete(id);\n this.rebuild();\n }\n\n /**\n * Remove the style element from DOM and clear all rules.\n */\n destroy(): void {\n if (this._styleEl.parentNode) {\n this._styleEl.parentNode.removeChild(this._styleEl);\n }\n this._rules.clear();\n }\n\n private rebuild(): void {\n this._styleEl.textContent = Array.from(this._rules.values()).join('\\n');\n }\n}\n","/**\n * @framesquared/theme – ClassicTheme\n * ExtJS classic look — blue tones, subtle gradients, traditional feel.\n */\n\nimport { Theme } from '../Theme.js';\n\nexport const ClassicTheme = new Theme({\n name: 'classic',\n tokens: {\n color: {\n primary: '#157fcc',\n secondary: '#486085',\n success: '#4caf50',\n warning: '#ff9800',\n error: '#cf4c35',\n background: '#f0f0f0',\n surface: '#ffffff',\n text: { primary: '#333333', secondary: '#666666', disabled: '#999999' },\n },\n spacing: { xs: 2, sm: 4, md: 8, lg: 12, xl: 16 },\n borderRadius: { sm: 1, md: 2, lg: 4, xl: 8, round: '50%' },\n shadow: {\n sm: '0 1px 2px rgba(0,0,0,0.15)',\n md: '0 2px 4px rgba(0,0,0,0.2)',\n lg: '0 4px 8px rgba(0,0,0,0.25)',\n xl: '0 8px 16px rgba(0,0,0,0.3)',\n },\n typography: {\n fontFamily: { sans: 'Tahoma, Arial, Verdana, sans-serif', mono: 'Consolas, monospace' },\n fontSize: { xs: 11, sm: 12, md: 13, lg: 14, xl: 18, xxl: 24 },\n fontWeight: { normal: 400, medium: 500, bold: 700 },\n lineHeight: { tight: 1.2, normal: 1.4, relaxed: 1.6 },\n },\n component: {\n button: { height: 28, padding: '0 12px', borderRadius: 2 },\n panel: { headerHeight: 32, borderWidth: 1, borderColor: '#99bce8' },\n field: { height: 26, labelWidth: 100 },\n grid: { rowHeight: 26, headerHeight: 30 },\n },\n breakpoints: { xs: 0, sm: 600, md: 960, lg: 1280, xl: 1920 },\n transition: { fast: '100ms', normal: '200ms', slow: '300ms' },\n zIndex: { dropdown: 1000, modal: 1050, tooltip: 1100, notification: 1200 },\n },\n});\n","/**\n * @framesquared/theme – ModernTheme\n * Clean, flat design — Material-inspired colors, generous spacing.\n */\n\nimport { Theme } from '../Theme.js';\n\nexport const ModernTheme = new Theme({\n name: 'modern',\n tokens: {\n color: {\n primary: '#1976d2',\n secondary: '#dc004e',\n success: '#4caf50',\n warning: '#ff9800',\n error: '#f44336',\n background: '#ffffff',\n surface: '#f5f5f5',\n text: { primary: '#212121', secondary: '#757575', disabled: '#bdbdbd' },\n },\n spacing: { xs: 4, sm: 8, md: 16, lg: 24, xl: 32 },\n borderRadius: { sm: 2, md: 4, lg: 8, xl: 16, round: '50%' },\n shadow: {\n sm: '0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)',\n md: '0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23)',\n lg: '0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23)',\n xl: '0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22)',\n },\n typography: {\n fontFamily: { sans: 'Inter, -apple-system, sans-serif', mono: 'Fira Code, monospace' },\n fontSize: { xs: 12, sm: 14, md: 16, lg: 18, xl: 24, xxl: 32 },\n fontWeight: { normal: 400, medium: 500, bold: 700 },\n lineHeight: { tight: 1.2, normal: 1.5, relaxed: 1.75 },\n },\n component: {\n button: { height: 36, padding: '0 16px', borderRadius: 4 },\n panel: { headerHeight: 40, borderWidth: 1, borderColor: '#e0e0e0' },\n field: { height: 32, labelWidth: 150 },\n grid: { rowHeight: 32, headerHeight: 36 },\n },\n breakpoints: { xs: 0, sm: 600, md: 960, lg: 1280, xl: 1920 },\n transition: { fast: '150ms', normal: '250ms', slow: '400ms' },\n zIndex: { dropdown: 1000, modal: 1050, tooltip: 1100, notification: 1200 },\n },\n});\n","/**\n * @framesquared/theme – DarkTheme\n * Dark mode — inherits from ModernTheme, inverts backgrounds\n * and text colors for dark environments.\n */\n\nimport { Theme } from '../Theme.js';\nimport { ModernTheme } from './ModernTheme.js';\n\nexport const DarkTheme = new Theme({\n name: 'dark',\n parent: ModernTheme,\n tokens: {\n color: {\n primary: '#90caf9',\n secondary: '#f48fb1',\n success: '#81c784',\n warning: '#ffb74d',\n error: '#e57373',\n background: '#121212',\n surface: '#1e1e1e',\n text: { primary: '#e0e0e0', secondary: '#aaaaaa', disabled: '#666666' },\n },\n component: {\n panel: { borderColor: '#333333' },\n },\n },\n});\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@framesquared/theme",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Theming and CSS-in-JS token system",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@framesquared/core": "0.1.0"
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsup",
|
|
22
|
+
"test": "vitest run",
|
|
23
|
+
"clean": "rm -rf dist",
|
|
24
|
+
"typecheck": "tsc --noEmit --project tsconfig.build.json"
|
|
25
|
+
}
|
|
26
|
+
}
|