@ngxsmk/theme 1.0.0 → 1.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/esm2022/lib/color.mjs +118 -0
- package/esm2022/lib/css.mjs +209 -0
- package/esm2022/lib/define-config.mjs +41 -0
- package/esm2022/lib/presets.mjs +76 -0
- package/esm2022/lib/theme.service.mjs +81 -0
- package/esm2022/lib/tokens.mjs +137 -0
- package/esm2022/lib/types.mjs +9 -0
- package/esm2022/ngxsmk-theme.mjs +5 -0
- package/esm2022/public-api.mjs +11 -0
- package/fesm2022/ngxsmk-theme.mjs +6 -9
- package/fesm2022/ngxsmk-theme.mjs.map +1 -1
- package/index.d.ts +6 -0
- package/lib/color.d.ts +22 -0
- package/lib/color.d.ts.map +1 -0
- package/lib/css.d.ts +8 -0
- package/lib/css.d.ts.map +1 -0
- package/lib/define-config.d.ts +13 -0
- package/lib/define-config.d.ts.map +1 -0
- package/lib/presets.d.ts +15 -0
- package/lib/presets.d.ts.map +1 -0
- package/lib/theme.service.d.ts +33 -0
- package/lib/theme.service.d.ts.map +1 -0
- package/lib/tokens.d.ts +39 -0
- package/lib/tokens.d.ts.map +1 -0
- package/lib/types.d.ts +111 -0
- package/lib/types.d.ts.map +1 -0
- package/ngxsmk-theme.d.ts.map +1 -0
- package/package.json +6 -5
- package/public-api.d.ts +8 -0
- package/public-api.d.ts.map +1 -0
- package/types/ngxsmk-theme.d.ts +0 -238
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
export function hexToHsl(hex) {
|
|
2
|
+
const value = hex.replace('#', '');
|
|
3
|
+
const full = value.length === 3
|
|
4
|
+
? value
|
|
5
|
+
.split('')
|
|
6
|
+
.map((c) => c + c)
|
|
7
|
+
.join('')
|
|
8
|
+
: value;
|
|
9
|
+
if (!/^[0-9a-fA-F]{6}$/.test(full)) {
|
|
10
|
+
throw new Error(`Invalid hex color: "${hex}"`);
|
|
11
|
+
}
|
|
12
|
+
const r = parseInt(full.slice(0, 2), 16) / 255;
|
|
13
|
+
const g = parseInt(full.slice(2, 4), 16) / 255;
|
|
14
|
+
const b = parseInt(full.slice(4, 6), 16) / 255;
|
|
15
|
+
const max = Math.max(r, g, b);
|
|
16
|
+
const min = Math.min(r, g, b);
|
|
17
|
+
const delta = max - min;
|
|
18
|
+
const l = (max + min) / 2;
|
|
19
|
+
let h = 0;
|
|
20
|
+
let s = 0;
|
|
21
|
+
if (delta !== 0) {
|
|
22
|
+
s = delta / (1 - Math.abs(2 * l - 1));
|
|
23
|
+
switch (max) {
|
|
24
|
+
case r:
|
|
25
|
+
h = 60 * (((g - b) / delta) % 6);
|
|
26
|
+
break;
|
|
27
|
+
case g:
|
|
28
|
+
h = 60 * ((b - r) / delta + 2);
|
|
29
|
+
break;
|
|
30
|
+
default:
|
|
31
|
+
h = 60 * ((r - g) / delta + 4);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (h < 0)
|
|
35
|
+
h += 360;
|
|
36
|
+
return { h, s: s * 100, l: l * 100 };
|
|
37
|
+
}
|
|
38
|
+
export function hslToHex({ h, s, l }) {
|
|
39
|
+
const sn = s / 100;
|
|
40
|
+
const ln = l / 100;
|
|
41
|
+
const c = (1 - Math.abs(2 * ln - 1)) * sn;
|
|
42
|
+
const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
|
|
43
|
+
const m = ln - c / 2;
|
|
44
|
+
let rgb;
|
|
45
|
+
if (h < 60)
|
|
46
|
+
rgb = [c, x, 0];
|
|
47
|
+
else if (h < 120)
|
|
48
|
+
rgb = [x, c, 0];
|
|
49
|
+
else if (h < 180)
|
|
50
|
+
rgb = [0, c, x];
|
|
51
|
+
else if (h < 240)
|
|
52
|
+
rgb = [0, x, c];
|
|
53
|
+
else if (h < 300)
|
|
54
|
+
rgb = [x, 0, c];
|
|
55
|
+
else
|
|
56
|
+
rgb = [c, 0, x];
|
|
57
|
+
const toHex = (v) => Math.round((v + m) * 255)
|
|
58
|
+
.toString(16)
|
|
59
|
+
.padStart(2, '0');
|
|
60
|
+
return `#${toHex(rgb[0])}${toHex(rgb[1])}${toHex(rgb[2])}`.toUpperCase();
|
|
61
|
+
}
|
|
62
|
+
/** Shift a color's lightness by `delta` percentage points (clamped 0–100). */
|
|
63
|
+
export function shiftLightness(hex, delta) {
|
|
64
|
+
const hsl = hexToHsl(hex);
|
|
65
|
+
return hslToHex({ ...hsl, l: Math.min(100, Math.max(0, hsl.l + delta)) });
|
|
66
|
+
}
|
|
67
|
+
/** Rotate a color's hue by `degrees`, keeping saturation and lightness. */
|
|
68
|
+
export function rotateHue(hex, degrees) {
|
|
69
|
+
const hsl = hexToHsl(hex);
|
|
70
|
+
return hslToHex({ ...hsl, h: (((hsl.h + degrees) % 360) + 360) % 360 });
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Lightness stops for each scale step. Tuned so that step 500/600 stays close
|
|
74
|
+
* to typical brand-color lightness and the extremes remain usable as tinted
|
|
75
|
+
* backgrounds (50–100) and readable text (900–950).
|
|
76
|
+
*/
|
|
77
|
+
const LIGHTNESS_STOPS = {
|
|
78
|
+
50: 97,
|
|
79
|
+
100: 94,
|
|
80
|
+
200: 87,
|
|
81
|
+
300: 78,
|
|
82
|
+
400: 66,
|
|
83
|
+
500: 56,
|
|
84
|
+
600: 48,
|
|
85
|
+
700: 40,
|
|
86
|
+
800: 32,
|
|
87
|
+
900: 25,
|
|
88
|
+
950: 16,
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Derive a full 50–950 color scale from a single brand hex.
|
|
92
|
+
*
|
|
93
|
+
* The input color keeps its exact value at the step whose lightness stop is
|
|
94
|
+
* nearest to the input's own lightness, so `scale[step]` round-trips brand
|
|
95
|
+
* colors instead of shifting them.
|
|
96
|
+
*/
|
|
97
|
+
export function deriveScale(baseHex) {
|
|
98
|
+
const base = hexToHsl(baseHex);
|
|
99
|
+
let nearest = 500;
|
|
100
|
+
let nearestDelta = Number.POSITIVE_INFINITY;
|
|
101
|
+
for (const [step, stop] of Object.entries(LIGHTNESS_STOPS)) {
|
|
102
|
+
const delta = Math.abs(stop - base.l);
|
|
103
|
+
if (delta < nearestDelta) {
|
|
104
|
+
nearestDelta = delta;
|
|
105
|
+
nearest = Number(step);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const scale = {};
|
|
109
|
+
for (const [step, stop] of Object.entries(LIGHTNESS_STOPS)) {
|
|
110
|
+
const key = Number(step);
|
|
111
|
+
scale[key] =
|
|
112
|
+
key === nearest
|
|
113
|
+
? hslToHex(base)
|
|
114
|
+
: hslToHex({ h: base.h, s: base.s, l: stop });
|
|
115
|
+
}
|
|
116
|
+
return scale;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy90aGVtZS9zcmMvbGliL2NvbG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVNBLE1BQU0sVUFBVSxRQUFRLENBQUMsR0FBVztJQUNsQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuQyxNQUFNLElBQUksR0FDUixLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7UUFDaEIsQ0FBQyxDQUFDLEtBQUs7YUFDRixLQUFLLENBQUMsRUFBRSxDQUFDO2FBQ1QsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2pCLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDYixDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ1osSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDL0MsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUMvQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBRS9DLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEIsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ1osS0FBSyxDQUFDO2dCQUNKLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNqQyxNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQy9CLE1BQU07WUFDUjtnQkFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUFFLENBQUMsSUFBSSxHQUFHLENBQUM7SUFFcEIsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLENBQUM7QUFFRCxNQUFNLFVBQVUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQU87SUFDdkMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNuQixNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ25CLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUMxQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakQsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFckIsSUFBSSxHQUE2QixDQUFDO0lBQ2xDLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3ZCLElBQUksQ0FBQyxHQUFHLEdBQUc7UUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzdCLElBQUksQ0FBQyxHQUFHLEdBQUc7UUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzdCLElBQUksQ0FBQyxHQUFHLEdBQUc7UUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzdCLElBQUksQ0FBQyxHQUFHLEdBQUc7UUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOztRQUM3QixHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXJCLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7U0FDdEIsUUFBUSxDQUFDLEVBQUUsQ0FBQztTQUNaLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFdEIsT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDM0UsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSxNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQVcsRUFBRSxLQUFhO0lBQ3ZELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixPQUFPLFFBQVEsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzVFLENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsTUFBTSxVQUFVLFNBQVMsQ0FBQyxHQUFXLEVBQUUsT0FBZTtJQUNwRCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsT0FBTyxRQUFRLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxlQUFlLEdBQXFDO0lBQ3hELEVBQUUsRUFBRSxFQUFFO0lBQ04sR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLEVBQUU7Q0FDUixDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxPQUFlO0lBQ3pDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUvQixJQUFJLE9BQU8sR0FBcUIsR0FBRyxDQUFDO0lBQ3BDLElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztJQUM1QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1FBQzNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxJQUFJLEtBQUssR0FBRyxZQUFZLEVBQUUsQ0FBQztZQUN6QixZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFxQixDQUFDO1FBQzdDLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsRUFBZ0IsQ0FBQztJQUMvQixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1FBQzNELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQXFCLENBQUM7UUFDN0MsS0FBSyxDQUFDLEdBQUcsQ0FBQztZQUNSLEdBQUcsS0FBSyxPQUFPO2dCQUNiLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUNoQixDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbG9yU2NhbGUgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqIEhTTCB0cmlwbGU6IGggaW4gWzAsMzYwKSwgcyBhbmQgbCBpbiBbMCwxMDBdLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIc2wge1xuICBoOiBudW1iZXI7XG4gIHM6IG51bWJlcjtcbiAgbDogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGV4VG9Ic2woaGV4OiBzdHJpbmcpOiBIc2wge1xuICBjb25zdCB2YWx1ZSA9IGhleC5yZXBsYWNlKCcjJywgJycpO1xuICBjb25zdCBmdWxsID1cbiAgICB2YWx1ZS5sZW5ndGggPT09IDNcbiAgICAgID8gdmFsdWVcbiAgICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgICAgLm1hcCgoYykgPT4gYyArIGMpXG4gICAgICAgICAgLmpvaW4oJycpXG4gICAgICA6IHZhbHVlO1xuICBpZiAoIS9eWzAtOWEtZkEtRl17Nn0kLy50ZXN0KGZ1bGwpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGhleCBjb2xvcjogXCIke2hleH1cImApO1xuICB9XG5cbiAgY29uc3QgciA9IHBhcnNlSW50KGZ1bGwuc2xpY2UoMCwgMiksIDE2KSAvIDI1NTtcbiAgY29uc3QgZyA9IHBhcnNlSW50KGZ1bGwuc2xpY2UoMiwgNCksIDE2KSAvIDI1NTtcbiAgY29uc3QgYiA9IHBhcnNlSW50KGZ1bGwuc2xpY2UoNCwgNiksIDE2KSAvIDI1NTtcblxuICBjb25zdCBtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcbiAgY29uc3QgbWluID0gTWF0aC5taW4ociwgZywgYik7XG4gIGNvbnN0IGRlbHRhID0gbWF4IC0gbWluO1xuICBjb25zdCBsID0gKG1heCArIG1pbikgLyAyO1xuXG4gIGxldCBoID0gMDtcbiAgbGV0IHMgPSAwO1xuICBpZiAoZGVsdGEgIT09IDApIHtcbiAgICBzID0gZGVsdGEgLyAoMSAtIE1hdGguYWJzKDIgKiBsIC0gMSkpO1xuICAgIHN3aXRjaCAobWF4KSB7XG4gICAgICBjYXNlIHI6XG4gICAgICAgIGggPSA2MCAqICgoKGcgLSBiKSAvIGRlbHRhKSAlIDYpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgZzpcbiAgICAgICAgaCA9IDYwICogKChiIC0gcikgLyBkZWx0YSArIDIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGggPSA2MCAqICgociAtIGcpIC8gZGVsdGEgKyA0KTtcbiAgICB9XG4gIH1cbiAgaWYgKGggPCAwKSBoICs9IDM2MDtcblxuICByZXR1cm4geyBoLCBzOiBzICogMTAwLCBsOiBsICogMTAwIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2xUb0hleCh7IGgsIHMsIGwgfTogSHNsKTogc3RyaW5nIHtcbiAgY29uc3Qgc24gPSBzIC8gMTAwO1xuICBjb25zdCBsbiA9IGwgLyAxMDA7XG4gIGNvbnN0IGMgPSAoMSAtIE1hdGguYWJzKDIgKiBsbiAtIDEpKSAqIHNuO1xuICBjb25zdCB4ID0gYyAqICgxIC0gTWF0aC5hYnMoKChoIC8gNjApICUgMikgLSAxKSk7XG4gIGNvbnN0IG0gPSBsbiAtIGMgLyAyO1xuXG4gIGxldCByZ2I6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgaWYgKGggPCA2MCkgcmdiID0gW2MsIHgsIDBdO1xuICBlbHNlIGlmIChoIDwgMTIwKSByZ2IgPSBbeCwgYywgMF07XG4gIGVsc2UgaWYgKGggPCAxODApIHJnYiA9IFswLCBjLCB4XTtcbiAgZWxzZSBpZiAoaCA8IDI0MCkgcmdiID0gWzAsIHgsIGNdO1xuICBlbHNlIGlmIChoIDwgMzAwKSByZ2IgPSBbeCwgMCwgY107XG4gIGVsc2UgcmdiID0gW2MsIDAsIHhdO1xuXG4gIGNvbnN0IHRvSGV4ID0gKHY6IG51bWJlcikgPT5cbiAgICBNYXRoLnJvdW5kKCh2ICsgbSkgKiAyNTUpXG4gICAgICAudG9TdHJpbmcoMTYpXG4gICAgICAucGFkU3RhcnQoMiwgJzAnKTtcblxuICByZXR1cm4gYCMke3RvSGV4KHJnYlswXSl9JHt0b0hleChyZ2JbMV0pfSR7dG9IZXgocmdiWzJdKX1gLnRvVXBwZXJDYXNlKCk7XG59XG5cbi8qKiBTaGlmdCBhIGNvbG9yJ3MgbGlnaHRuZXNzIGJ5IGBkZWx0YWAgcGVyY2VudGFnZSBwb2ludHMgKGNsYW1wZWQgMOKAkzEwMCkuICovXG5leHBvcnQgZnVuY3Rpb24gc2hpZnRMaWdodG5lc3MoaGV4OiBzdHJpbmcsIGRlbHRhOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBoc2wgPSBoZXhUb0hzbChoZXgpO1xuICByZXR1cm4gaHNsVG9IZXgoeyAuLi5oc2wsIGw6IE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgaHNsLmwgKyBkZWx0YSkpIH0pO1xufVxuXG4vKiogUm90YXRlIGEgY29sb3IncyBodWUgYnkgYGRlZ3JlZXNgLCBrZWVwaW5nIHNhdHVyYXRpb24gYW5kIGxpZ2h0bmVzcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVIdWUoaGV4OiBzdHJpbmcsIGRlZ3JlZXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGhzbCA9IGhleFRvSHNsKGhleCk7XG4gIHJldHVybiBoc2xUb0hleCh7IC4uLmhzbCwgaDogKCgoaHNsLmggKyBkZWdyZWVzKSAlIDM2MCkgKyAzNjApICUgMzYwIH0pO1xufVxuXG4vKipcbiAqIExpZ2h0bmVzcyBzdG9wcyBmb3IgZWFjaCBzY2FsZSBzdGVwLiBUdW5lZCBzbyB0aGF0IHN0ZXAgNTAwLzYwMCBzdGF5cyBjbG9zZVxuICogdG8gdHlwaWNhbCBicmFuZC1jb2xvciBsaWdodG5lc3MgYW5kIHRoZSBleHRyZW1lcyByZW1haW4gdXNhYmxlIGFzIHRpbnRlZFxuICogYmFja2dyb3VuZHMgKDUw4oCTMTAwKSBhbmQgcmVhZGFibGUgdGV4dCAoOTAw4oCTOTUwKS5cbiAqL1xuY29uc3QgTElHSFRORVNTX1NUT1BTOiBSZWNvcmQ8a2V5b2YgQ29sb3JTY2FsZSwgbnVtYmVyPiA9IHtcbiAgNTA6IDk3LFxuICAxMDA6IDk0LFxuICAyMDA6IDg3LFxuICAzMDA6IDc4LFxuICA0MDA6IDY2LFxuICA1MDA6IDU2LFxuICA2MDA6IDQ4LFxuICA3MDA6IDQwLFxuICA4MDA6IDMyLFxuICA5MDA6IDI1LFxuICA5NTA6IDE2LFxufTtcblxuLyoqXG4gKiBEZXJpdmUgYSBmdWxsIDUw4oCTOTUwIGNvbG9yIHNjYWxlIGZyb20gYSBzaW5nbGUgYnJhbmQgaGV4LlxuICpcbiAqIFRoZSBpbnB1dCBjb2xvciBrZWVwcyBpdHMgZXhhY3QgdmFsdWUgYXQgdGhlIHN0ZXAgd2hvc2UgbGlnaHRuZXNzIHN0b3AgaXNcbiAqIG5lYXJlc3QgdG8gdGhlIGlucHV0J3Mgb3duIGxpZ2h0bmVzcywgc28gYHNjYWxlW3N0ZXBdYCByb3VuZC10cmlwcyBicmFuZFxuICogY29sb3JzIGluc3RlYWQgb2Ygc2hpZnRpbmcgdGhlbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcml2ZVNjYWxlKGJhc2VIZXg6IHN0cmluZyk6IENvbG9yU2NhbGUge1xuICBjb25zdCBiYXNlID0gaGV4VG9Ic2woYmFzZUhleCk7XG5cbiAgbGV0IG5lYXJlc3Q6IGtleW9mIENvbG9yU2NhbGUgPSA1MDA7XG4gIGxldCBuZWFyZXN0RGVsdGEgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIGZvciAoY29uc3QgW3N0ZXAsIHN0b3BdIG9mIE9iamVjdC5lbnRyaWVzKExJR0hUTkVTU19TVE9QUykpIHtcbiAgICBjb25zdCBkZWx0YSA9IE1hdGguYWJzKHN0b3AgLSBiYXNlLmwpO1xuICAgIGlmIChkZWx0YSA8IG5lYXJlc3REZWx0YSkge1xuICAgICAgbmVhcmVzdERlbHRhID0gZGVsdGE7XG4gICAgICBuZWFyZXN0ID0gTnVtYmVyKHN0ZXApIGFzIGtleW9mIENvbG9yU2NhbGU7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2NhbGUgPSB7fSBhcyBDb2xvclNjYWxlO1xuICBmb3IgKGNvbnN0IFtzdGVwLCBzdG9wXSBvZiBPYmplY3QuZW50cmllcyhMSUdIVE5FU1NfU1RPUFMpKSB7XG4gICAgY29uc3Qga2V5ID0gTnVtYmVyKHN0ZXApIGFzIGtleW9mIENvbG9yU2NhbGU7XG4gICAgc2NhbGVba2V5XSA9XG4gICAgICBrZXkgPT09IG5lYXJlc3RcbiAgICAgICAgPyBoc2xUb0hleChiYXNlKVxuICAgICAgICA6IGhzbFRvSGV4KHsgaDogYmFzZS5oLCBzOiBiYXNlLnMsIGw6IHN0b3AgfSk7XG4gIH1cbiAgcmV0dXJuIHNjYWxlO1xufVxuIl19
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { deriveScale, rotateHue, shiftLightness } from './color';
|
|
2
|
+
import { resolveTheme } from './define-config';
|
|
3
|
+
import { CONTROL_HEIGHT } from './tokens';
|
|
4
|
+
function scaleVars(prefix, scale) {
|
|
5
|
+
const vars = {};
|
|
6
|
+
for (const [step, value] of Object.entries(scale)) {
|
|
7
|
+
vars[`--ngxsmk-color-${prefix}-${step}`] = value;
|
|
8
|
+
}
|
|
9
|
+
return vars;
|
|
10
|
+
}
|
|
11
|
+
/** Tokens that do not change between light and dark mode. */
|
|
12
|
+
function staticVars(theme) {
|
|
13
|
+
const vars = {
|
|
14
|
+
...scaleVars('brand', theme.brand),
|
|
15
|
+
...scaleVars('neutral', theme.neutral),
|
|
16
|
+
'--ngxsmk-font-sans': theme.fontFamily.sans,
|
|
17
|
+
'--ngxsmk-font-mono': theme.fontFamily.mono,
|
|
18
|
+
'--ngxsmk-radius-base': theme.radius[theme.radiusBase],
|
|
19
|
+
'--ngxsmk-control-height': CONTROL_HEIGHT,
|
|
20
|
+
// Component-specific Tokens (Buttons)
|
|
21
|
+
'--ngxsmk-button-bg': 'var(--ngxsmk-color-primary)',
|
|
22
|
+
'--ngxsmk-button-color': 'var(--ngxsmk-color-on-primary)',
|
|
23
|
+
'--ngxsmk-button-font-family': 'var(--ngxsmk-font-sans)',
|
|
24
|
+
'--ngxsmk-button-font-weight': '500',
|
|
25
|
+
'--ngxsmk-button-radius': 'var(--ngxsmk-radius-base)',
|
|
26
|
+
'--ngxsmk-button-disabled-opacity': '0.5',
|
|
27
|
+
// Component-specific Tokens (Cards)
|
|
28
|
+
'--ngxsmk-card-bg': 'var(--ngxsmk-color-surface)',
|
|
29
|
+
'--ngxsmk-card-radius': 'var(--ngxsmk-radius-xl)',
|
|
30
|
+
'--ngxsmk-card-shadow': 'var(--ngxsmk-shadow-sm)',
|
|
31
|
+
'--ngxsmk-card-border-color': 'var(--ngxsmk-color-outline)',
|
|
32
|
+
// Component-specific Tokens (Accordion)
|
|
33
|
+
'--ngxsmk-accordion-bg': 'var(--ngxsmk-color-surface)',
|
|
34
|
+
'--ngxsmk-accordion-radius': 'var(--ngxsmk-radius-lg)',
|
|
35
|
+
'--ngxsmk-accordion-border-color': 'var(--ngxsmk-color-outline)',
|
|
36
|
+
// Component-specific Tokens (Progress)
|
|
37
|
+
'--ngxsmk-progress-height': '0.5rem',
|
|
38
|
+
'--ngxsmk-progress-bg': 'var(--ngxsmk-color-surface-variant)',
|
|
39
|
+
'--ngxsmk-progress-color': 'var(--ngxsmk-color-primary)',
|
|
40
|
+
'--ngxsmk-progress-radius': 'var(--ngxsmk-radius-full)',
|
|
41
|
+
// Component-specific Tokens (Switch)
|
|
42
|
+
'--ngxsmk-switch-width': '2.25rem',
|
|
43
|
+
'--ngxsmk-switch-height': '1.25rem',
|
|
44
|
+
'--ngxsmk-switch-radius': 'var(--ngxsmk-radius-full)',
|
|
45
|
+
'--ngxsmk-switch-bg': 'var(--ngxsmk-color-outline-strong)',
|
|
46
|
+
'--ngxsmk-switch-thumb-size': '0.875rem',
|
|
47
|
+
'--ngxsmk-switch-thumb-bg': 'var(--ngxsmk-color-surface)',
|
|
48
|
+
'--ngxsmk-switch-checked-bg': 'var(--ngxsmk-color-primary)',
|
|
49
|
+
};
|
|
50
|
+
for (const [key, value] of Object.entries(theme.spacing)) {
|
|
51
|
+
vars[`--ngxsmk-space-${key}`] = value;
|
|
52
|
+
}
|
|
53
|
+
for (const [key, value] of Object.entries(theme.radius)) {
|
|
54
|
+
vars[`--ngxsmk-radius-${key}`] = value;
|
|
55
|
+
}
|
|
56
|
+
for (const [key, value] of Object.entries(theme.shadow)) {
|
|
57
|
+
vars[`--ngxsmk-shadow-${key}`] = value;
|
|
58
|
+
}
|
|
59
|
+
for (const [key, value] of Object.entries(theme.duration)) {
|
|
60
|
+
vars[`--ngxsmk-duration-${key}`] = value;
|
|
61
|
+
}
|
|
62
|
+
for (const [key, value] of Object.entries(theme.easing)) {
|
|
63
|
+
vars[`--ngxsmk-ease-${key}`] = value;
|
|
64
|
+
}
|
|
65
|
+
for (const [key, value] of Object.entries(theme.zIndex)) {
|
|
66
|
+
vars[`--ngxsmk-z-${key}`] = value;
|
|
67
|
+
}
|
|
68
|
+
const sizes = { large: 'lg', medium: 'md', small: 'sm' };
|
|
69
|
+
for (const [role, styles] of Object.entries(theme.typography)) {
|
|
70
|
+
for (const [size, suffix] of Object.entries(sizes)) {
|
|
71
|
+
const style = styles[size];
|
|
72
|
+
vars[`--ngxsmk-text-${role}-${suffix}-size`] = style.size;
|
|
73
|
+
vars[`--ngxsmk-text-${role}-${suffix}-line`] = style.lineHeight;
|
|
74
|
+
vars[`--ngxsmk-text-${role}-${suffix}-weight`] = style.weight;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Extra-small body text for dense metadata rows; below the smallest
|
|
78
|
+
// TypeRoleSize so it is emitted outside the role loop.
|
|
79
|
+
vars['--ngxsmk-text-body-xs-size'] = '0.6875rem';
|
|
80
|
+
vars['--ngxsmk-text-body-xs-line'] = '1rem';
|
|
81
|
+
vars['--ngxsmk-text-body-xs-weight'] = '400';
|
|
82
|
+
return vars;
|
|
83
|
+
}
|
|
84
|
+
/** Semantic role tokens for light mode. */
|
|
85
|
+
function lightVars(theme) {
|
|
86
|
+
const vars = {
|
|
87
|
+
'color-scheme': 'light',
|
|
88
|
+
'--ngxsmk-color-primary': theme.brandBase,
|
|
89
|
+
'--ngxsmk-color-on-primary': '#FFFFFF',
|
|
90
|
+
'--ngxsmk-color-primary-hover': shiftLightness(theme.brandBase, -8),
|
|
91
|
+
'--ngxsmk-color-primary-active': shiftLightness(theme.brandBase, -14),
|
|
92
|
+
'--ngxsmk-color-primary-container': theme.brand[100],
|
|
93
|
+
'--ngxsmk-color-on-primary-container': theme.brand[900],
|
|
94
|
+
// Astryx: cool-grey body, white cards floating on top, hairline borders.
|
|
95
|
+
'--ngxsmk-color-background': theme.neutral[50],
|
|
96
|
+
'--ngxsmk-color-on-background': '#0A1317',
|
|
97
|
+
'--ngxsmk-color-surface': '#FFFFFF',
|
|
98
|
+
'--ngxsmk-color-on-surface': '#0A1317',
|
|
99
|
+
'--ngxsmk-color-surface-variant': theme.neutral[100],
|
|
100
|
+
'--ngxsmk-color-on-surface-variant': theme.neutral[500],
|
|
101
|
+
'--ngxsmk-color-surface-hover': 'rgb(5 54 89 / 0.05)',
|
|
102
|
+
'--ngxsmk-color-surface-active': 'rgb(5 54 89 / 0.1)',
|
|
103
|
+
'--ngxsmk-color-surface-container': '#FFFFFF',
|
|
104
|
+
'--ngxsmk-color-outline': 'rgb(5 54 89 / 0.1)',
|
|
105
|
+
'--ngxsmk-color-outline-strong': theme.neutral[200],
|
|
106
|
+
'--ngxsmk-color-outline-variant': 'rgb(5 54 89 / 0.06)',
|
|
107
|
+
'--ngxsmk-color-ring': theme.brandBase,
|
|
108
|
+
'--ngxsmk-color-backdrop': 'rgb(1 18 40 / 0.4)',
|
|
109
|
+
'--ngxsmk-shadow-focus': `0 0 0 2px ${theme.brand[100]}, 0 0 0 4px color-mix(in srgb, ${theme.brandBase} 45%, transparent)`,
|
|
110
|
+
};
|
|
111
|
+
const tertiary = deriveScale(rotateHue(theme.brandBase, 64));
|
|
112
|
+
vars['--ngxsmk-color-tertiary'] = tertiary[500];
|
|
113
|
+
vars['--ngxsmk-color-on-tertiary'] = '#FFFFFF';
|
|
114
|
+
vars['--ngxsmk-color-tertiary-container'] = tertiary[100];
|
|
115
|
+
vars['--ngxsmk-color-on-tertiary-container'] = tertiary[900];
|
|
116
|
+
for (const [name, hex] of Object.entries(theme.semantic)) {
|
|
117
|
+
const scale = deriveScale(hex);
|
|
118
|
+
vars[`--ngxsmk-color-${name}`] = hex;
|
|
119
|
+
vars[`--ngxsmk-color-on-${name}`] = '#FFFFFF';
|
|
120
|
+
vars[`--ngxsmk-color-${name}-container`] = scale[100];
|
|
121
|
+
vars[`--ngxsmk-color-on-${name}-container`] = scale[800];
|
|
122
|
+
}
|
|
123
|
+
return { ...vars, ...theme.overrides.light };
|
|
124
|
+
}
|
|
125
|
+
/** Semantic role tokens for dark mode. */
|
|
126
|
+
function darkVars(theme) {
|
|
127
|
+
const vars = {
|
|
128
|
+
'color-scheme': 'dark',
|
|
129
|
+
'--ngxsmk-color-primary': theme.brand[400],
|
|
130
|
+
'--ngxsmk-color-on-primary': '#FFFFFF',
|
|
131
|
+
'--ngxsmk-color-primary-hover': theme.brand[300],
|
|
132
|
+
'--ngxsmk-color-primary-active': theme.brand[200],
|
|
133
|
+
'--ngxsmk-color-primary-container': theme.brand[900],
|
|
134
|
+
'--ngxsmk-color-on-primary-container': theme.brand[100],
|
|
135
|
+
// Astryx dark: near-neutral charcoal body, slightly lighter card,
|
|
136
|
+
// lighter still for popovers; hairline light-on-dark borders.
|
|
137
|
+
'--ngxsmk-color-background': '#111112',
|
|
138
|
+
'--ngxsmk-color-on-background': '#DFE2E5',
|
|
139
|
+
'--ngxsmk-color-surface': '#1F1F22',
|
|
140
|
+
'--ngxsmk-color-on-surface': '#DFE2E5',
|
|
141
|
+
'--ngxsmk-color-surface-variant': '#28292C',
|
|
142
|
+
'--ngxsmk-color-on-surface-variant': '#AAAFB5',
|
|
143
|
+
'--ngxsmk-color-surface-hover': 'rgb(255 255 255 / 0.05)',
|
|
144
|
+
'--ngxsmk-color-surface-active': 'rgb(255 255 255 / 0.1)',
|
|
145
|
+
'--ngxsmk-color-surface-container': '#28292C',
|
|
146
|
+
'--ngxsmk-color-outline': 'rgb(242 244 246 / 0.1)',
|
|
147
|
+
'--ngxsmk-color-outline-strong': '#494D53',
|
|
148
|
+
'--ngxsmk-color-outline-variant': 'rgb(242 244 246 / 0.06)',
|
|
149
|
+
'--ngxsmk-color-ring': theme.brand[400],
|
|
150
|
+
'--ngxsmk-color-backdrop': 'rgb(17 17 18 / 0.6)',
|
|
151
|
+
'--ngxsmk-shadow-focus': `0 0 0 2px color-mix(in srgb, ${theme.brand[400]} 25%, transparent), 0 0 0 4px color-mix(in srgb, ${theme.brand[400]} 45%, transparent)`,
|
|
152
|
+
};
|
|
153
|
+
const tertiary = deriveScale(rotateHue(theme.brandBase, 64));
|
|
154
|
+
vars['--ngxsmk-color-tertiary'] = tertiary[400];
|
|
155
|
+
vars['--ngxsmk-color-on-tertiary'] = tertiary[950];
|
|
156
|
+
vars['--ngxsmk-color-tertiary-container'] = tertiary[900];
|
|
157
|
+
vars['--ngxsmk-color-on-tertiary-container'] = tertiary[100];
|
|
158
|
+
for (const [name, hex] of Object.entries(theme.semantic)) {
|
|
159
|
+
const scale = deriveScale(hex);
|
|
160
|
+
vars[`--ngxsmk-color-${name}`] = scale[400];
|
|
161
|
+
vars[`--ngxsmk-color-on-${name}`] = scale[950];
|
|
162
|
+
vars[`--ngxsmk-color-${name}-container`] = scale[950];
|
|
163
|
+
vars[`--ngxsmk-color-on-${name}-container`] = scale[300];
|
|
164
|
+
}
|
|
165
|
+
return { ...vars, ...theme.overrides.dark };
|
|
166
|
+
}
|
|
167
|
+
function block(selector, vars, indent = '') {
|
|
168
|
+
const lines = Object.entries(vars).map(([name, value]) => `${indent} ${name}: ${value};`);
|
|
169
|
+
return `${indent}${selector} {\n${lines.join('\n')}\n${indent}}`;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Transform a theme config into a CSS stylesheet of `--ngxsmk-*` custom
|
|
173
|
+
* properties. Emits static tokens plus light-mode roles on `:root`, and
|
|
174
|
+
* dark-mode roles according to the configured dark-mode strategy.
|
|
175
|
+
*/
|
|
176
|
+
export function buildThemeCss(config) {
|
|
177
|
+
const theme = 'brand' in config && 'spacing' in config
|
|
178
|
+
? config
|
|
179
|
+
: resolveTheme(config);
|
|
180
|
+
const root = block(':root', { ...staticVars(theme), ...lightVars(theme) });
|
|
181
|
+
const dark = darkVars(theme);
|
|
182
|
+
let darkBlock;
|
|
183
|
+
switch (theme.darkMode.strategy) {
|
|
184
|
+
case 'media':
|
|
185
|
+
darkBlock = `@media (prefers-color-scheme: dark) {\n${block(':root', dark, ' ')}\n}`;
|
|
186
|
+
break;
|
|
187
|
+
case 'system': {
|
|
188
|
+
// `light-dark()` support is per-property; the class block still serves
|
|
189
|
+
// as the override hook, so `system` behaves as media + class.
|
|
190
|
+
const cn = theme.darkMode.className;
|
|
191
|
+
darkBlock = [
|
|
192
|
+
`@media (prefers-color-scheme: dark) {\n${block(':root', dark, ' ')}\n}`,
|
|
193
|
+
block(`:root.${cn}, :root.${cn} body, .${cn}`, dark),
|
|
194
|
+
].join('\n\n');
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
default: {
|
|
198
|
+
// `:root.<class>` (specificity 0,2,0) plus a `body` variant defend the
|
|
199
|
+
// dark tokens against third-party stylesheets that redefine `--ngxsmk-*`
|
|
200
|
+
// on a plain `:root` (0,1,0) — those would otherwise win by source order
|
|
201
|
+
// when injected into <head> after this sheet. The bare `.<class>` keeps
|
|
202
|
+
// scoped (non-root) dark regions working.
|
|
203
|
+
const cn = theme.darkMode.className;
|
|
204
|
+
darkBlock = block(`:root.${cn}, :root.${cn} body, .${cn}`, dark);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return `/* Generated by @ngxsmk/theme — do not edit by hand. */\n${root}\n\n${darkBlock}\n`;
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvdGhlbWUvc3JjL2xpYi9jc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQVEvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBSTFDLFNBQVMsU0FBUyxDQUFDLE1BQWMsRUFBRSxLQUFpQjtJQUNsRCxNQUFNLElBQUksR0FBUyxFQUFFLENBQUM7SUFDdEIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsa0JBQWtCLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNuRCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsNkRBQTZEO0FBQzdELFNBQVMsVUFBVSxDQUFDLEtBQW9CO0lBQ3RDLE1BQU0sSUFBSSxHQUFTO1FBQ2pCLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ2xDLEdBQUcsU0FBUyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ3RDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSTtRQUMzQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUk7UUFDM0Msc0JBQXNCLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQ3RELHlCQUF5QixFQUFFLGNBQWM7UUFFekMsc0NBQXNDO1FBQ3RDLG9CQUFvQixFQUFFLDZCQUE2QjtRQUNuRCx1QkFBdUIsRUFBRSxnQ0FBZ0M7UUFDekQsNkJBQTZCLEVBQUUseUJBQXlCO1FBQ3hELDZCQUE2QixFQUFFLEtBQUs7UUFDcEMsd0JBQXdCLEVBQUUsMkJBQTJCO1FBQ3JELGtDQUFrQyxFQUFFLEtBQUs7UUFFekMsb0NBQW9DO1FBQ3BDLGtCQUFrQixFQUFFLDZCQUE2QjtRQUNqRCxzQkFBc0IsRUFBRSx5QkFBeUI7UUFDakQsc0JBQXNCLEVBQUUseUJBQXlCO1FBQ2pELDRCQUE0QixFQUFFLDZCQUE2QjtRQUUzRCx3Q0FBd0M7UUFDeEMsdUJBQXVCLEVBQUUsNkJBQTZCO1FBQ3RELDJCQUEyQixFQUFFLHlCQUF5QjtRQUN0RCxpQ0FBaUMsRUFBRSw2QkFBNkI7UUFFaEUsdUNBQXVDO1FBQ3ZDLDBCQUEwQixFQUFFLFFBQVE7UUFDcEMsc0JBQXNCLEVBQUUscUNBQXFDO1FBQzdELHlCQUF5QixFQUFFLDZCQUE2QjtRQUN4RCwwQkFBMEIsRUFBRSwyQkFBMkI7UUFFdkQscUNBQXFDO1FBQ3JDLHVCQUF1QixFQUFFLFNBQVM7UUFDbEMsd0JBQXdCLEVBQUUsU0FBUztRQUNuQyx3QkFBd0IsRUFBRSwyQkFBMkI7UUFDckQsb0JBQW9CLEVBQUUsb0NBQW9DO1FBQzFELDRCQUE0QixFQUFFLFVBQVU7UUFDeEMsMEJBQTBCLEVBQUUsNkJBQTZCO1FBQ3pELDRCQUE0QixFQUFFLDZCQUE2QjtLQUM1RCxDQUFDO0lBRUYsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN4QyxDQUFDO0lBQ0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN6QyxDQUFDO0lBQ0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN6QyxDQUFDO0lBQ0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDMUQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUMzQyxDQUFDO0lBQ0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBQ0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDcEMsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQVcsQ0FBQztJQUNsRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUM5RCxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFD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LFNBQWlCLENBQUM7SUFDdEIsUUFBUSxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLEtBQUssT0FBTztZQUNWLFNBQVMsR0FBRywwQ0FBMEMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUN0RixNQUFNO1FBQ1IsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ2QsdUVBQXVFO1lBQ3ZFLDhEQUE4RDtZQUM5RCxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUNwQyxTQUFTLEdBQUc7Z0JBQ1YsMENBQTBDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUN6RSxLQUFLLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQzthQUNyRCxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNmLE1BQU07UUFDUixDQUFDO1FBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNSLHVFQUF1RTtZQUN2RSx5RUFBeUU7WUFDekUseUVBQXlFO1lBQ3pFLHdFQUF3RTtZQUN4RSwwQ0FBMEM7WUFDMUMsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7WUFDcEMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkUsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLDREQUE0RCxJQUFJLE9BQU8sU0FBUyxJQUFJLENBQUM7QUFDOUYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlcml2ZVNjYWxlLCByb3RhdGVIdWUsIHNoaWZ0TGlnaHRuZXNzIH0gZnJvbSAnLi9jb2xvcic7XG5pbXBvcnQgeyByZXNvbHZlVGhlbWUgfSBmcm9tICcuL2RlZmluZS1jb25maWcnO1xuaW1wb3J0IHtcbiAgQ29sb3JTY2FsZSxcbiAgUmVzb2x2ZWRUaGVtZSxcbiAgVGhlbWVDb25maWcsXG4gIFR5cGVSb2xlU2l6ZSxcbiAgVHlwZVN0eWxlLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IENPTlRST0xfSEVJR0hUIH0gZnJvbSAnLi90b2tlbnMnO1xuXG50eXBlIFZhcnMgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG5mdW5jdGlvbiBzY2FsZVZhcnMocHJlZml4OiBzdHJpbmcsIHNjYWxlOiBDb2xvclNjYWxlKTogVmFycyB7XG4gIGNvbnN0IHZhcnM6IFZhcnMgPSB7fTtcbiAgZm9yIChjb25zdCBbc3RlcCwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjYWxlKSkge1xuICAgIHZhcnNbYC0tbmd4c21rLWNvbG9yLSR7cHJlZml4fS0ke3N0ZXB9YF0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdmFycztcbn1cblxuLyoqIFRva2VucyB0aGF0IGRvIG5vdCBjaGFuZ2UgYmV0d2VlbiBsaWdodCBhbmQgZGFyayBtb2RlLiAqL1xuZnVuY3Rpb24gc3RhdGljVmFycyh0aGVtZTogUmVzb2x2ZWRUaGVtZSk6IFZhcnMge1xuICBjb25zdCB2YXJzOiBWYXJzID0ge1xuICAgIC4uLnNjYWxlVmFycygnYnJhbmQnLCB0aGVtZS5icmFuZCksXG4gICAgLi4uc2NhbGVWYXJzKCduZXV0cmFsJywgdGhlbWUubmV1dHJhbCksXG4gICAgJy0tbmd4c21rLWZvbnQtc2Fucyc6IHRoZW1lLmZvbnRGYW1pbHkuc2FucyxcbiAgICAnLS1uZ3hzbWstZm9udC1tb25vJzogdGhlbWUuZm9udEZhbWlseS5tb25vLFxuICAgICctLW5neHNtay1yYWRpdXMtYmFzZSc6IHRoZW1lLnJhZGl1c1t0aGVtZS5yYWRpdXNCYXNlXSxcbiAgICAnLS1uZ3hzbWstY29udHJvbC1oZWlnaHQnOiBDT05UUk9MX0hFSUdIVCxcblxuICAgIC8vIENvbXBvbmVudC1zcGVjaWZpYyBUb2tlbnMgKEJ1dHRvbnMpXG4gICAgJy0tbmd4c21rLWJ1dHRvbi1iZyc6ICd2YXIoLS1uZ3hzbWstY29sb3ItcHJpbWFyeSknLFxuICAgICctLW5neHNtay1idXR0b24tY29sb3InOiAndmFyKC0tbmd4c21rLWNvbG9yLW9uLXByaW1hcnkpJyxcbiAgICAnLS1uZ3hzbWstYnV0dG9uLWZvbnQtZmFtaWx5JzogJ3ZhcigtLW5neHNtay1mb250LXNhbnMpJyxcbiAgICAnLS1uZ3hzbWstYnV0dG9uLWZvbnQtd2VpZ2h0JzogJzUwMCcsXG4gICAgJy0tbmd4c21rLWJ1dHRvbi1yYWRpdXMnOiAndmFyKC0tbmd4c21rLXJhZGl1cy1iYXNlKScsXG4gICAgJy0tbmd4c21rLWJ1dHRvbi1kaXNhYmxlZC1vcGFjaXR5JzogJzAuNScsXG5cbiAgICAvLyBDb21wb25lbnQtc3BlY2lmaWMgVG9rZW5zIChDYXJkcylcbiAgICAnLS1uZ3hzbWstY2FyZC1iZyc6ICd2YXIoLS1uZ3hzbWstY29sb3Itc3VyZmFjZSknLFxuICAgICctLW5neHNtay1jYXJkLXJhZGl1cyc6ICd2YXIoLS1uZ3hzbWstcmFkaXVzLXhsKScsXG4gICAgJy0tbmd4c21rLWNhcmQtc2hhZG93JzogJ3ZhcigtLW5neHNtay1zaGFkb3ctc20pJyxcbiAgICAnLS1uZ3hzbWstY2FyZC1ib3JkZXItY29sb3InOiAndmFyKC0tbmd4c21rLWNvbG9yLW91dGxpbmUpJyxcblxuICAgIC8vIENvbXBvbmVudC1zcGVjaWZpYyBUb2tlbnMgKEFjY29yZGlvbilcbiAgICAnLS1uZ3hzbWstYWNjb3JkaW9uLWJnJzogJ3ZhcigtLW5neHNtay1jb2xvci1zdXJmYWNlKScsXG4gICAgJy0tbmd4c21rLWFjY29yZGlvbi1yYWRpdXMnOiAndmFyKC0tbmd4c21rLXJhZGl1cy1sZyknLFxuICAgICctLW5neHNtay1hY2NvcmRpb24tYm9yZGVyLWNvbG9yJzogJ3ZhcigtLW5neHNtay1jb2xvci1vdXRsaW5lKScsXG5cbiAgICAvLyBDb21wb25lbnQtc3BlY2lmaWMgVG9rZW5zIChQcm9ncmVzcylcbiAgICAnLS1uZ3hzbWstcHJvZ3Jlc3MtaGVpZ2h0JzogJzAuNXJlbScsXG4gICAgJy0tbmd4c21rLXByb2dyZXNzLWJnJzogJ3ZhcigtLW5neHNtay1jb2xvci1zdXJmYWNlLXZhcmlhbnQpJyxcbiAgICAnLS1uZ3hzbWstcHJvZ3Jlc3MtY29sb3InOiAndmFyKC0tbmd4c21rLWNvbG9yLXByaW1hcnkpJyxcbiAgICAnLS1uZ3hzbWstcHJvZ3Jlc3MtcmFkaXVzJzogJ3ZhcigtLW5neHNtay1yYWRpdXMtZnVsbCknLFxuXG4gICAgLy8gQ29tcG9uZW50LXNwZWNpZmljIFRva2VucyAoU3dpdGNoKVxuICAgICctLW5neHNtay1zd2l0Y2gtd2lkdGgnOiAnMi4yNXJlbScsXG4gICAgJy0tbmd4c21rLXN3aXRjaC1oZWlnaHQnOiAnMS4yNXJlbScsXG4gICAgJy0tbmd4c21rLXN3aXRjaC1yYWRpdXMnOiAndmFyKC0tbmd4c21rLXJhZGl1cy1mdWxsKScsXG4gICAgJy0tbmd4c21rLXN3aXRjaC1iZyc6ICd2YXIoLS1uZ3hzbWstY29sb3Itb3V0bGluZS1zdHJvbmcpJyxcbiAgICAnLS1uZ3hzbWstc3dpdGNoLXRodW1iLXNpemUnOiAnMC44NzVyZW0nLFxuICAgICctLW5neHNtay1zd2l0Y2gtdGh1bWItYmcnOiAndmFyKC0tbmd4c21rLWNvbG9yLXN1cmZhY2UpJyxcbiAgICAnLS1uZ3hzbWstc3dpdGNoLWNoZWNrZWQtYmcnOiAndmFyKC0tbmd4c21rLWNvbG9yLXByaW1hcnkpJyxcbiAgfTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGVtZS5zcGFjaW5nKSkge1xuICAgIHZhcnNbYC0tbmd4c21rLXNwYWNlLSR7a2V5fWBdID0gdmFsdWU7XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhlbWUucmFkaXVzKSkge1xuICAgIHZhcnNbYC0tbmd4c21rLXJhZGl1cy0ke2tleX1gXSA9IHZhbHVlO1xuICB9XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoZW1lLnNoYWRvdykpIHtcbiAgICB2YXJzW2AtLW5neHNtay1zaGFkb3ctJHtrZXl9YF0gPSB2YWx1ZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGVtZS5kdXJhdGlvbikpIHtcbiAgICB2YXJzW2AtLW5neHNtay1kdXJhdGlvbi0ke2tleX1gXSA9IHZhbHVlO1xuICB9XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoZW1lLmVhc2luZykpIHtcbiAgICB2YXJzW2AtLW5neHNtay1lYXNlLSR7a2V5fWBdID0gdmFsdWU7XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhlbWUuekluZGV4KSkge1xuICAgIHZhcnNbYC0tbmd4c21rLXotJHtrZXl9YF0gPSB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHNpemVzID0geyBsYXJnZTogJ2xnJywgbWVkaXVtOiAnbWQnLCBzbWFsbDogJ3NtJyB9IGFzIGNvbnN0O1xuICBmb3IgKGNvbnN0IFtyb2xlLCBzdHlsZXNdIG9mIE9iamVjdC5lbnRyaWVzKHRoZW1lLnR5cG9ncmFwaHkpKSB7XG4gICAgZm9yIChjb25zdCBbc2l6ZSwgc3VmZml4XSBvZiBPYmplY3QuZW50cmllcyhzaXplcykpIHtcbiAgICAgIGNvbnN0IHN0eWxlOiBUeXBlU3R5bGUgPSBzdHlsZXNbc2l6ZSBhcyBUeXBlUm9sZVNpemVdO1xuICAgICAgdmFyc1tgLS1uZ3hzbWstdGV4dC0ke3JvbGV9LSR7c3VmZml4fS1zaXplYF0gPSBzdHlsZS5zaXplO1xuICAgICAgdmFyc1tgLS1uZ3hzbWstdGV4dC0ke3JvbGV9LSR7c3VmZml4fS1saW5lYF0gPSBzdHlsZS5saW5lSGVpZ2h0O1xuICAgICAgdmFyc1tgLS1uZ3hzbWstdGV4dC0ke3JvbGV9LSR7c3VmZml4fS13ZWlnaHRgXSA9IHN0eWxlLndlaWdodDtcbiAgICB9XG4gIH1cblxuICAvLyBFeHRyYS1zbWFsbCBib2R5IHRleHQgZm9yIGRlbnNlIG1ldGFkYXRhIHJvd3M7IGJlbG93IHRoZSBzbWFsbGVzdFxuICAvLyBUeXBlUm9sZVNpemUgc28gaXQgaXMgZW1pdHRlZCBvdXRzaWRlIHRoZSByb2xlIGxvb3AuXG4gIHZhcnNbJy0tbmd4c21rLXRleHQtYm9keS14cy1zaXplJ10gPSAnMC42ODc1cmVtJztcbiAgdmFyc1snLS1uZ3hzbWstdGV4dC1ib2R5LXhzLWxpbmUnXSA9ICcxcmVtJztcbiAgdmFyc1snLS1uZ3hzbWstdGV4dC1ib2R5LXhzLXdlaWdodCddID0gJzQwMCc7XG5cbiAgcmV0dXJuIHZhcnM7XG59XG5cbi8qKiBTZW1hbnRpYyByb2xlIHRva2VucyBmb3IgbGlnaHQgbW9kZS4gKi9cbmZ1bmN0aW9uIGxpZ2h0VmFycyh0aGVtZTogUmVzb2x2ZWRUaGVtZSk6IFZhcnMge1xuICBjb25zdCB2YXJzOiBWYXJzID0ge1xuICAgICdjb2xvci1zY2hlbWUnOiAnbGlnaHQnLFxuXG4gICAgJy0tbmd4c21rLWNvbG9yLXByaW1hcnknOiB0aGVtZS5icmFuZEJhc2UsXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLXByaW1hcnknOiAnI0ZGRkZGRicsXG4gICAgJy0tbmd4c21rLWNvbG9yLXByaW1hcnktaG92ZXInOiBzaGlmdExpZ2h0bmVzcyh0aGVtZS5icmFuZEJhc2UsIC04KSxcbiAgICAnLS1uZ3hzbWstY29sb3ItcHJpbWFyeS1hY3RpdmUnOiBzaGlmdExpZ2h0bmVzcyh0aGVtZS5icmFuZEJhc2UsIC0xNCksXG4gICAgJy0tbmd4c21rLWNvbG9yLXByaW1hcnktY29udGFpbmVyJzogdGhlbWUuYnJhbmRbMTAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itb24tcHJpbWFyeS1jb250YWluZXInOiB0aGVtZS5icmFuZFs5MDBdLFxuXG4gICAgLy8gQXN0cnl4OiBjb29sLWdyZXkgYm9keSwgd2hpdGUgY2FyZHMgZmxvYXRpbmcgb24gdG9wLCBoYWlybGluZSBib3JkZXJzLlxuICAgICctLW5neHNtay1jb2xvci1iYWNrZ3JvdW5kJzogdGhlbWUubmV1dHJhbFs1MF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLWJhY2tncm91bmQnOiAnIzBBMTMxNycsXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UnOiAnI0ZGRkZGRicsXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLXN1cmZhY2UnOiAnIzBBMTMxNycsXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UtdmFyaWFudCc6IHRoZW1lLm5ldXRyYWxbMTAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itb24tc3VyZmFjZS12YXJpYW50JzogdGhlbWUubmV1dHJhbFs1MDBdLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLWhvdmVyJzogJ3JnYig1IDU0IDg5IC8gMC4wNSknLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLWFjdGl2ZSc6ICdyZ2IoNSA1NCA4OSAvIDAuMSknLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLWNvbnRhaW5lcic6ICcjRkZGRkZGJyxcbiAgICAnLS1uZ3hzbWstY29sb3Itb3V0bGluZSc6ICdyZ2IoNSA1NCA4OSAvIDAuMSknLFxuICAgICctLW5neHNtay1jb2xvci1vdXRsaW5lLXN0cm9uZyc6IHRoZW1lLm5ldXRyYWxbMjAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itb3V0bGluZS12YXJpYW50JzogJ3JnYig1IDU0IDg5IC8gMC4wNiknLFxuXG4gICAgJy0tbmd4c21rLWNvbG9yLXJpbmcnOiB0aGVtZS5icmFuZEJhc2UsXG4gICAgJy0tbmd4c21rLWNvbG9yLWJhY2tkcm9wJzogJ3JnYigxIDE4IDQwIC8gMC40KScsXG4gICAgJy0tbmd4c21rLXNoYWRvdy1mb2N1cyc6IGAwIDAgMCAycHggJHt0aGVtZS5icmFuZFsxMDBdfSwgMCAwIDAgNHB4IGNvbG9yLW1peChpbiBzcmdiLCAke3RoZW1lLmJyYW5kQmFzZX0gNDUlLCB0cmFuc3BhcmVudClgLFxuICB9O1xuXG4gIGNvbnN0IHRlcnRpYXJ5ID0gZGVyaXZlU2NhbGUocm90YXRlSHVlKHRoZW1lLmJyYW5kQmFzZSwgNjQpKTtcbiAgdmFyc1snLS1uZ3hzbWstY29sb3ItdGVydGlhcnknXSA9IHRlcnRpYXJ5WzUwMF07XG4gIHZhcnNbJy0tbmd4c21rLWNvbG9yLW9uLXRlcnRpYXJ5J10gPSAnI0ZGRkZGRic7XG4gIHZhcnNbJy0tbmd4c21rLWNvbG9yLXRlcnRpYXJ5LWNvbnRhaW5lciddID0gdGVydGlhcnlbMTAwXTtcbiAgdmFyc1snLS1uZ3hzbWstY29sb3Itb24tdGVydGlhcnktY29udGFpbmVyJ10gPSB0ZXJ0aWFyeVs5MDBdO1xuXG4gIGZvciAoY29uc3QgW25hbWUsIGhleF0gb2YgT2JqZWN0LmVudHJpZXModGhlbWUuc2VtYW50aWMpKSB7XG4gICAgY29uc3Qgc2NhbGUgPSBkZXJpdmVTY2FsZShoZXgpO1xuICAgIHZhcnNbYC0tbmd4c21rLWNvbG9yLSR7bmFtZX1gXSA9IGhleDtcbiAgICB2YXJzW2AtLW5neHNtay1jb2xvci1vbi0ke25hbWV9YF0gPSAnI0ZGRkZGRic7XG4gICAgdmFyc1tgLS1uZ3hzbWstY29sb3ItJHtuYW1lfS1jb250YWluZXJgXSA9IHNjYWxlWzEwMF07XG4gICAgdmFyc1tgLS1uZ3hzbWstY29sb3Itb24tJHtuYW1lfS1jb250YWluZXJgXSA9IHNjYWxlWzgwMF07XG4gIH1cblxuICByZXR1cm4geyAuLi52YXJzLCAuLi50aGVtZS5vdmVycmlkZXMubGlnaHQgfTtcbn1cblxuLyoqIFNlbWFudGljIHJvbGUgdG9rZW5zIGZvciBkYXJrIG1vZGUuICovXG5mdW5jdGlvbiBkYXJrVmFycyh0aGVtZTogUmVzb2x2ZWRUaGVtZSk6IFZhcnMge1xuICBjb25zdCB2YXJzOiBWYXJzID0ge1xuICAgICdjb2xvci1zY2hlbWUnOiAnZGFyaycsXG5cbiAgICAnLS1uZ3hzbWstY29sb3ItcHJpbWFyeSc6IHRoZW1lLmJyYW5kWzQwMF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLXByaW1hcnknOiAnI0ZGRkZGRicsXG4gICAgJy0tbmd4c21rLWNvbG9yLXByaW1hcnktaG92ZXInOiB0aGVtZS5icmFuZFszMDBdLFxuICAgICctLW5neHNtay1jb2xvci1wcmltYXJ5LWFjdGl2ZSc6IHRoZW1lLmJyYW5kWzIwMF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLXByaW1hcnktY29udGFpbmVyJzogdGhlbWUuYnJhbmRbOTAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itb24tcHJpbWFyeS1jb250YWluZXInOiB0aGVtZS5icmFuZFsxMDBdLFxuXG4gICAgLy8gQXN0cnl4IGRhcms6IG5lYXItbmV1dHJhbCBjaGFyY29hbCBib2R5LCBzbGlnaHRseSBsaWdodGVyIGNhcmQsXG4gICAgLy8gbGlnaHRlciBzdGlsbCBmb3IgcG9wb3ZlcnM7IGhhaXJsaW5lIGxpZ2h0LW9uLWRhcmsgYm9yZGVycy5cbiAgICAnLS1uZ3hzbWstY29sb3ItYmFja2dyb3VuZCc6ICcjMTExMTEyJyxcbiAgICAnLS1uZ3hzbWstY29sb3Itb24tYmFja2dyb3VuZCc6ICcjREZFMkU1JyxcbiAgICAnLS1uZ3hzbWstY29sb3Itc3VyZmFjZSc6ICcjMUYxRjIyJyxcbiAgICAnLS1uZ3hzbWstY29sb3Itb24tc3VyZmFjZSc6ICcjREZFMkU1JyxcbiAgICAnLS1uZ3hzbWstY29sb3Itc3VyZmFjZS12YXJpYW50JzogJyMyODI5MkMnLFxuICAgICctLW5neHNtay1jb2xvci1vbi1zdXJmYWNlLXZhcmlhbnQnOiAnI0FBQUZCNScsXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UtaG92ZXInOiAncmdiKDI1NSAyNTUgMjU1IC8gMC4wNSknLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLWFjdGl2ZSc6ICdyZ2IoMjU1IDI1NSAyNTUgLyAwLjEpJyxcbiAgICAnLS1uZ3hzbWstY29sb3Itc3VyZmFjZS1jb250YWluZXInOiAnIzI4MjkyQycsXG4gICAgJy0tbmd4c21rLWNvbG9yLW91dGxpbmUnOiAncmdiKDI0MiAyNDQgMjQ2IC8gMC4xKScsXG4gICAgJy0tbmd4c21rLWNvbG9yLW91dGxpbmUtc3Ryb25nJzogJyM0OTRENTMnLFxuICAgICctLW5neHNtay1jb2xvci1vdXRsaW5lLXZhcmlhbnQnOiAncmdiKDI0MiAyNDQgMjQ2IC8gMC4wNiknLFxuXG4gICAgJy0tbmd4c21rLWNvbG9yLXJpbmcnOiB0aGVtZS5icmFuZFs0MDBdLFxuICAgICctLW5neHNtay1jb2xvci1iYWNrZHJvcCc6ICdyZ2IoMTcgMTcgMTggLyAwLjYpJyxcbiAgICAnLS1uZ3hzbWstc2hhZG93LWZvY3VzJzogYDAgMCAwIDJweCBjb2xvci1taXgoaW4gc3JnYiwgJHt0aGVtZS5icmFuZFs0MDBdfSAyNSUsIHRyYW5zcGFyZW50KSwgMCAwIDAgNHB4IGNvbG9yLW1peChpbiBzcmdiLCAke3RoZW1lLmJyYW5kWzQwMF19IDQ1JSwgdHJhbnNwYXJlbnQpYCxcbiAgfTtcblxuICBjb25zdCB0ZXJ0aWFyeSA9IGRlcml2ZVNjYWxlKHJvdGF0ZUh1ZSh0aGVtZS5icmFuZEJhc2UsIDY0KSk7XG4gIHZhcnNbJy0tbmd4c21rLWNvbG9yLXRlcnRpYXJ5J10gPSB0ZXJ0aWFyeVs0MDBdO1xuICB2YXJzWyctLW5neHNtay1jb2xvci1vbi10ZXJ0aWFyeSddID0gdGVydGlhcnlbOTUwXTtcbiAgdmFyc1snLS1uZ3hzbWstY29sb3ItdGVydGlhcnktY29udGFpbmVyJ10gPSB0ZXJ0aWFyeVs5MDBdO1xuICB2YXJzWyctLW5neHNtay1jb2xvci1vbi10ZXJ0aWFyeS1jb250YWluZXInXSA9IHRlcnRpYXJ5WzEwMF07XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgaGV4XSBvZiBPYmplY3QuZW50cmllcyh0aGVtZS5zZW1hbnRpYykpIHtcbiAgICBjb25zdCBzY2FsZSA9IGRlcml2ZVNjYWxlKGhleCk7XG4gICAgdmFyc1tgLS1uZ3hzbWstY29sb3ItJHtuYW1lfWBdID0gc2NhbGVbNDAwXTtcbiAgICB2YXJzW2AtLW5neHNtay1jb2xvci1vbi0ke25hbWV9YF0gPSBzY2FsZVs5NTBdO1xuICAgIHZhcnNbYC0tbmd4c21rLWNvbG9yLSR7bmFtZX0tY29udGFpbmVyYF0gPSBzY2FsZVs5NTBdO1xuICAgIHZhcnNbYC0tbmd4c21rLWNvbG9yLW9uLSR7bmFtZX0tY29udGFpbmVyYF0gPSBzY2FsZVszMDBdO1xuICB9XG5cbiAgcmV0dXJuIHsgLi4udmFycywgLi4udGhlbWUub3ZlcnJpZGVzLmRhcmsgfTtcbn1cblxuZnVuY3Rpb24gYmxvY2soc2VsZWN0b3I6IHN0cmluZywgdmFyczogVmFycywgaW5kZW50ID0gJycpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lcyA9IE9iamVjdC5lbnRyaWVzKHZhcnMpLm1hcChcbiAgICAoW25hbWUsIHZhbHVlXSkgPT4gYCR7aW5kZW50fSAgJHtuYW1lfTogJHt2YWx1ZX07YCxcbiAgKTtcbiAgcmV0dXJuIGAke2luZGVudH0ke3NlbGVjdG9yfSB7XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2luZGVudH19YDtcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYSB0aGVtZSBjb25maWcgaW50byBhIENTUyBzdHlsZXNoZWV0IG9mIGAtLW5neHNtay0qYCBjdXN0b21cbiAqIHByb3BlcnRpZXMuIEVtaXRzIHN0YXRpYyB0b2tlbnMgcGx1cyBsaWdodC1tb2RlIHJvbGVzIG9uIGA6cm9vdGAsIGFuZFxuICogZGFyay1tb2RlIHJvbGVzIGFjY29yZGluZyB0byB0aGUgY29uZmlndXJlZCBkYXJrLW1vZGUgc3RyYXRlZ3kuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFRoZW1lQ3NzKGNvbmZpZzogVGhlbWVDb25maWcgfCBSZXNvbHZlZFRoZW1lKTogc3RyaW5nIHtcbiAgY29uc3QgdGhlbWUgPSAnYnJhbmQnIGluIGNvbmZpZyAmJiAnc3BhY2luZycgaW4gKGNvbmZpZyBhcyBvYmplY3QpXG4gICAgPyAoY29uZmlnIGFzIFJlc29sdmVkVGhlbWUpXG4gICAgOiByZXNvbHZlVGhlbWUoY29uZmlnIGFzIFRoZW1lQ29uZmlnKTtcblxuICBjb25zdCByb290ID0gYmxvY2soJzpyb290JywgeyAuLi5zdGF0aWNWYXJzKHRoZW1lKSwgLi4ubGlnaHRWYXJzKHRoZW1lKSB9KTtcbiAgY29uc3QgZGFyayA9IGRhcmtWYXJzKHRoZW1lKTtcblxuICBsZXQgZGFya0Jsb2NrOiBzdHJpbmc7XG4gIHN3aXRjaCAodGhlbWUuZGFya01vZGUuc3RyYXRlZ3kpIHtcbiAgICBjYXNlICdtZWRpYSc6XG4gICAgICBkYXJrQmxvY2sgPSBgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykge1xcbiR7YmxvY2soJzpyb290JywgZGFyaywgJyAgJyl9XFxufWA7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzeXN0ZW0nOiB7XG4gICAgICAvLyBgbGlnaHQtZGFyaygpYCBzdXBwb3J0IGlzIHBlci1wcm9wZXJ0eTsgdGhlIGNsYXNzIGJsb2NrIHN0aWxsIHNlcnZlc1xuICAgICAgLy8gYXMgdGhlIG92ZXJyaWRlIGhvb2ssIHNvIGBzeXN0ZW1gIGJlaGF2ZXMgYXMgbWVkaWEgKyBjbGFzcy5cbiAgICAgIGNvbnN0IGNuID0gdGhlbWUuZGFya01vZGUuY2xhc3NOYW1lO1xuICAgICAgZGFya0Jsb2NrID0gW1xuICAgICAgICBgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykge1xcbiR7YmxvY2soJzpyb290JywgZGFyaywgJyAgJyl9XFxufWAsXG4gICAgICAgIGJsb2NrKGA6cm9vdC4ke2NufSwgOnJvb3QuJHtjbn0gYm9keSwgLiR7Y259YCwgZGFyayksXG4gICAgICBdLmpvaW4oJ1xcblxcbicpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIC8vIGA6cm9vdC48Y2xhc3M+YCAoc3BlY2lmaWNpdHkgMCwyLDApIHBsdXMgYSBgYm9keWAgdmFyaWFudCBkZWZlbmQgdGhlXG4gICAgICAvLyBkYXJrIHRva2VucyBhZ2FpbnN0IHRoaXJkLXBhcnR5IHN0eWxlc2hlZXRzIHRoYXQgcmVkZWZpbmUgYC0tbmd4c21rLSpgXG4gICAgICAvLyBvbiBhIHBsYWluIGA6cm9vdGAgKDAsMSwwKSDigJQgdGhvc2Ugd291bGQgb3RoZXJ3aXNlIHdpbiBieSBzb3VyY2Ugb3JkZXJcbiAgICAgIC8vIHdoZW4gaW5qZWN0ZWQgaW50byA8aGVhZD4gYWZ0ZXIgdGhpcyBzaGVldC4gVGhlIGJhcmUgYC48Y2xhc3M+YCBrZWVwc1xuICAgICAgLy8gc2NvcGVkIChub24tcm9vdCkgZGFyayByZWdpb25zIHdvcmtpbmcuXG4gICAgICBjb25zdCBjbiA9IHRoZW1lLmRhcmtNb2RlLmNsYXNzTmFtZTtcbiAgICAgIGRhcmtCbG9jayA9IGJsb2NrKGA6cm9vdC4ke2NufSwgOnJvb3QuJHtjbn0gYm9keSwgLiR7Y259YCwgZGFyayk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGAvKiBHZW5lcmF0ZWQgYnkgQG5neHNtay90aGVtZSDigJQgZG8gbm90IGVkaXQgYnkgaGFuZC4gKi9cXG4ke3Jvb3R9XFxuXFxuJHtkYXJrQmxvY2t9XFxuYDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { deriveScale } from './color';
|
|
2
|
+
import { DEFAULT_FONT_FAMILY, DEFAULT_NEUTRAL, DEFAULT_SEMANTIC, DEFAULT_TYPOGRAPHY, DURATION, EASING, RADIUS, SHADOW, SPACING, Z_INDEX, } from './tokens';
|
|
3
|
+
/**
|
|
4
|
+
* Identity helper that gives `ngxsmk.config.ts` files full type inference:
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* import { defineConfig } from '@ngxsmk/theme';
|
|
8
|
+
* export default defineConfig({ brand: { primary: '#7C3AED' } });
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
export function defineConfig(config) {
|
|
12
|
+
return config;
|
|
13
|
+
}
|
|
14
|
+
/** Merge a user config with defaults and derive all color scales. */
|
|
15
|
+
export function resolveTheme(config) {
|
|
16
|
+
return {
|
|
17
|
+
name: config.name ?? 'custom',
|
|
18
|
+
brandBase: config.brand.primary,
|
|
19
|
+
brand: config.brand.primaryScale ?? deriveScale(config.brand.primary),
|
|
20
|
+
neutral: config.neutral ?? DEFAULT_NEUTRAL,
|
|
21
|
+
semantic: { ...DEFAULT_SEMANTIC, ...config.semantic },
|
|
22
|
+
fontFamily: { ...DEFAULT_FONT_FAMILY, ...config.typography?.fontFamily },
|
|
23
|
+
typography: DEFAULT_TYPOGRAPHY,
|
|
24
|
+
spacing: SPACING,
|
|
25
|
+
radius: RADIUS,
|
|
26
|
+
radiusBase: config.borderRadius ?? 'md',
|
|
27
|
+
shadow: SHADOW,
|
|
28
|
+
duration: DURATION,
|
|
29
|
+
easing: EASING,
|
|
30
|
+
zIndex: Z_INDEX,
|
|
31
|
+
darkMode: {
|
|
32
|
+
strategy: config.darkMode?.strategy ?? 'class',
|
|
33
|
+
className: config.darkMode?.className ?? 'dark',
|
|
34
|
+
},
|
|
35
|
+
overrides: {
|
|
36
|
+
light: config.overrides?.light ?? {},
|
|
37
|
+
dark: config.overrides?.dark ?? {},
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5lLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3RoZW1lL3NyYy9saWIvZGVmaW5lLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3RDLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sTUFBTSxFQUNOLE9BQU8sRUFDUCxPQUFPLEdBQ1IsTUFBTSxVQUFVLENBQUM7QUFHbEI7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsTUFBbUI7SUFDOUMsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELHFFQUFxRTtBQUNyRSxNQUFNLFVBQVUsWUFBWSxDQUFDLE1BQW1CO0lBQzlDLE9BQU87UUFDTCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxRQUFRO1FBQzdCLFNBQVMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU87UUFDL0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUNyRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sSUFBSSxlQUFlO1FBQzFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsZ0JBQWdCLEVBQUUsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFO1FBQ3JELFVBQVUsRUFBRSxFQUFFLEdBQUcsbUJBQW1CLEVBQUUsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRTtRQUN4RSxVQUFVLEVBQUUsa0JBQWtCO1FBQzlCLE9BQU8sRUFBRSxPQUFPO1FBQ2hCLE1BQU0sRUFBRSxNQUFNO1FBQ2QsVUFBVSxFQUFFLE1BQU0sQ0FBQyxZQUFZLElBQUksSUFBSTtRQUN2QyxNQUFNLEVBQUUsTUFBTTtRQUNkLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLE1BQU0sRUFBRSxNQUFNO1FBQ2QsTUFBTSxFQUFFLE9BQU87UUFDZixRQUFRLEVBQUU7WUFDUixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFRLElBQUksT0FBTztZQUM5QyxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxTQUFTLElBQUksTUFBTTtTQUNoRDtRQUNELFNBQVMsRUFBRTtZQUNULEtBQUssRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3BDLElBQUksRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO1NBQ25DO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXJpdmVTY2FsZSB9IGZyb20gJy4vY29sb3InO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgREVGQVVMVF9ORVVUUkFMLFxuICBERUZBVUxUX1NFTUFOVElDLFxuICBERUZBVUxUX1RZUE9HUkFQSFksXG4gIERVUkFUSU9OLFxuICBFQVNJTkcsXG4gIFJBRElVUyxcbiAgU0hBRE9XLFxuICBTUEFDSU5HLFxuICBaX0lOREVYLFxufSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQgeyBSZXNvbHZlZFRoZW1lLCBUaGVtZUNvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIElkZW50aXR5IGhlbHBlciB0aGF0IGdpdmVzIGBuZ3hzbWsuY29uZmlnLnRzYCBmaWxlcyBmdWxsIHR5cGUgaW5mZXJlbmNlOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tICdAbmd4c21rL3RoZW1lJztcbiAqIGV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7IGJyYW5kOiB7IHByaW1hcnk6ICcjN0MzQUVEJyB9IH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVDb25maWcoY29uZmlnOiBUaGVtZUNvbmZpZyk6IFRoZW1lQ29uZmlnIHtcbiAgcmV0dXJuIGNvbmZpZztcbn1cblxuLyoqIE1lcmdlIGEgdXNlciBjb25maWcgd2l0aCBkZWZhdWx0cyBhbmQgZGVyaXZlIGFsbCBjb2xvciBzY2FsZXMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVRoZW1lKGNvbmZpZzogVGhlbWVDb25maWcpOiBSZXNvbHZlZFRoZW1lIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBjb25maWcubmFtZSA/PyAnY3VzdG9tJyxcbiAgICBicmFuZEJhc2U6IGNvbmZpZy5icmFuZC5wcmltYXJ5LFxuICAgIGJyYW5kOiBjb25maWcuYnJhbmQucHJpbWFyeVNjYWxlID8/IGRlcml2ZVNjYWxlKGNvbmZpZy5icmFuZC5wcmltYXJ5KSxcbiAgICBuZXV0cmFsOiBjb25maWcubmV1dHJhbCA/PyBERUZBVUxUX05FVVRSQUwsXG4gICAgc2VtYW50aWM6IHsgLi4uREVGQVVMVF9TRU1BTlRJQywgLi4uY29uZmlnLnNlbWFudGljIH0sXG4gICAgZm9udEZhbWlseTogeyAuLi5ERUZBVUxUX0ZPTlRfRkFNSUxZLCAuLi5jb25maWcudHlwb2dyYXBoeT8uZm9udEZhbWlseSB9LFxuICAgIHR5cG9ncmFwaHk6IERFRkFVTFRfVFlQT0dSQVBIWSxcbiAgICBzcGFjaW5nOiBTUEFDSU5HLFxuICAgIHJhZGl1czogUkFESVVTLFxuICAgIHJhZGl1c0Jhc2U6IGNvbmZpZy5ib3JkZXJSYWRpdXMgPz8gJ21kJyxcbiAgICBzaGFkb3c6IFNIQURPVyxcbiAgICBkdXJhdGlvbjogRFVSQVRJT04sXG4gICAgZWFzaW5nOiBFQVNJTkcsXG4gICAgekluZGV4OiBaX0lOREVYLFxuICAgIGRhcmtNb2RlOiB7XG4gICAgICBzdHJhdGVneTogY29uZmlnLmRhcmtNb2RlPy5zdHJhdGVneSA/PyAnY2xhc3MnLFxuICAgICAgY2xhc3NOYW1lOiBjb25maWcuZGFya01vZGU/LmNsYXNzTmFtZSA/PyAnZGFyaycsXG4gICAgfSxcbiAgICBvdmVycmlkZXM6IHtcbiAgICAgIGxpZ2h0OiBjb25maWcub3ZlcnJpZGVzPy5saWdodCA/PyB7fSxcbiAgICAgIGRhcms6IGNvbmZpZy5vdmVycmlkZXM/LmRhcmsgPz8ge30sXG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default preset: Astryx (Meta) blue. Light-mode primary is the exact
|
|
3
|
+
* Astryx accent (#0064E0); dark mode brightens it to #2694FE via the
|
|
4
|
+
* scale, matching astryx.atmeta.com.
|
|
5
|
+
*/
|
|
6
|
+
export const astryxPreset = {
|
|
7
|
+
name: 'astryx',
|
|
8
|
+
brand: {
|
|
9
|
+
primary: '#0064E0',
|
|
10
|
+
primaryScale: {
|
|
11
|
+
50: '#E7F1FE',
|
|
12
|
+
100: '#CFE3FD',
|
|
13
|
+
200: '#9AC6FC',
|
|
14
|
+
300: '#5CA5FB',
|
|
15
|
+
400: '#2694FE',
|
|
16
|
+
500: '#0064E0',
|
|
17
|
+
600: '#0057C2',
|
|
18
|
+
700: '#0046A0',
|
|
19
|
+
800: '#00397F',
|
|
20
|
+
900: '#002C63',
|
|
21
|
+
950: '#001A3D',
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
/** Retained alias so existing violet-themed demos keep working. */
|
|
26
|
+
export const violetPreset = {
|
|
27
|
+
name: 'violet',
|
|
28
|
+
brand: { primary: '#7C3AED' },
|
|
29
|
+
};
|
|
30
|
+
/** Monochrome preset in the spirit of shadcn/ui's default look. */
|
|
31
|
+
export const neutralPreset = {
|
|
32
|
+
name: 'neutral',
|
|
33
|
+
brand: {
|
|
34
|
+
primary: '#18181B',
|
|
35
|
+
// A neutral brand cannot be derived from lightness alone — pin the scale.
|
|
36
|
+
primaryScale: {
|
|
37
|
+
50: '#FAFAFA',
|
|
38
|
+
100: '#F4F4F5',
|
|
39
|
+
200: '#E4E4E7',
|
|
40
|
+
300: '#D4D4D8',
|
|
41
|
+
400: '#A1A1AA',
|
|
42
|
+
500: '#71717A',
|
|
43
|
+
600: '#3F3F46',
|
|
44
|
+
700: '#27272A',
|
|
45
|
+
800: '#1F1F23',
|
|
46
|
+
900: '#18181B',
|
|
47
|
+
950: '#09090B',
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
overrides: {
|
|
51
|
+
// A near-black brand must invert in dark mode to stay visible.
|
|
52
|
+
dark: {
|
|
53
|
+
'--ngxsmk-color-primary': '#FAFAFA',
|
|
54
|
+
'--ngxsmk-color-on-primary': '#18181B',
|
|
55
|
+
'--ngxsmk-color-primary-hover': '#E4E4E7',
|
|
56
|
+
'--ngxsmk-color-primary-active': '#D4D4D8',
|
|
57
|
+
'--ngxsmk-color-ring': '#D4D4D8',
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
export const emeraldPreset = {
|
|
62
|
+
name: 'emerald',
|
|
63
|
+
brand: { primary: '#059669' },
|
|
64
|
+
};
|
|
65
|
+
export const rosePreset = {
|
|
66
|
+
name: 'rose',
|
|
67
|
+
brand: { primary: '#E11D48' },
|
|
68
|
+
};
|
|
69
|
+
export const presets = {
|
|
70
|
+
astryx: astryxPreset,
|
|
71
|
+
violet: violetPreset,
|
|
72
|
+
neutral: neutralPreset,
|
|
73
|
+
emerald: emeraldPreset,
|
|
74
|
+
rose: rosePreset,
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2V0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3RoZW1lL3NyYy9saWIvcHJlc2V0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFnQjtJQUN2QyxJQUFJLEVBQUUsUUFBUTtJQUNkLEtBQUssRUFBRTtRQUNMLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLFlBQVksRUFBRTtZQUNaLEVBQUUsRUFBRSxTQUFTO1lBQ2IsR0FBRyxFQUFFLFNBQVM7WUFDZCxHQUFHLEVBQUUsU0FBUztZQUNkLEdBQUcsRUFBRSxTQUFTO1lBQ2QsR0FBRyxFQUFFLFNBQVM7WUFDZCxHQUFHLEVBQUUsU0FBUztZQUNkLEdBQUcsRUFBRSxTQUFTO1lBQ2QsR0FBRyxFQUFFLFNBQVM7WUFDZCxHQUFHLEVBQUUsU0FBUztZQUNkLEdBQUcsRUFBRSxTQUFTO1lBQ2QsR0FBRyxFQUFFLFNBQVM7U0FDZjtLQUNGO0NBQ0YsQ0FBQztBQUVGLG1FQUFtRTtBQUNuRSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWdCO0lBQ3ZDLElBQUksRUFBRSxRQUFRO0lBQ2QsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRTtDQUM5QixDQUFDO0FBRUYsbUVBQW1FO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBZ0I7SUFDeEMsSUFBSSxFQUFFLFNBQVM7SUFDZixLQUFLLEVBQUU7UUFDTCxPQUFPLEVBQUUsU0FBUztRQUNsQiwwRUFBMEU7UUFDMUUsWUFBWSxFQUFFO1lBQ1osRUFBRSxFQUFFLFNBQVM7WUFDYixHQUFHLEVBQUUsU0FBUztZQUNkLEdBQUcsRUFBRSxTQUFTO1lBQ2QsR0FBRyxFQUFFLFNBQVM7WUFDZCxHQUFHLEVBQUUsU0FBUztZQUNkLEdBQUcsRUFBRSxTQUFTO1lBQ2QsR0FBRyxFQUFFLFNBQVM7WUFDZCxHQUFHLEVBQUUsU0FBUztZQUNkLEdBQUcsRUFBRSxTQUFTO1lBQ2QsR0FBRyxFQUFFLFNBQVM7WUFDZCxHQUFHLEVBQUUsU0FBUztTQUNmO0tBQ0Y7SUFDRCxTQUFTLEVBQUU7UUFDVCwrREFBK0Q7UUFDL0QsSUFBSSxFQUFFO1lBQ0osd0JBQXdCLEVBQUUsU0FBUztZQUNuQywyQkFBMkIsRUFBRSxTQUFTO1lBQ3RDLDhCQUE4QixFQUFFLFNBQVM7WUFDekMsK0JBQStCLEVBQUUsU0FBUztZQUMxQyxxQkFBcUIsRUFBRSxTQUFTO1NBQ2pDO0tBQ0Y7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFnQjtJQUN4QyxJQUFJLEVBQUUsU0FBUztJQUNmLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUU7Q0FDOUIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBZ0I7SUFDckMsSUFBSSxFQUFFLE1BQU07SUFDWixLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFO0NBQzlCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQWdDO0lBQ2xELE1BQU0sRUFBRSxZQUFZO0lBQ3BCLE1BQU0sRUFBRSxZQUFZO0lBQ3BCLE9BQU8sRUFBRSxhQUFhO0lBQ3RCLE9BQU8sRUFBRSxhQUFhO0lBQ3RCLElBQUksRUFBRSxVQUFVO0NBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUaGVtZUNvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIERlZmF1bHQgcHJlc2V0OiBBc3RyeXggKE1ldGEpIGJsdWUuIExpZ2h0LW1vZGUgcHJpbWFyeSBpcyB0aGUgZXhhY3RcbiAqIEFzdHJ5eCBhY2NlbnQgKCMwMDY0RTApOyBkYXJrIG1vZGUgYnJpZ2h0ZW5zIGl0IHRvICMyNjk0RkUgdmlhIHRoZVxuICogc2NhbGUsIG1hdGNoaW5nIGFzdHJ5eC5hdG1ldGEuY29tLlxuICovXG5leHBvcnQgY29uc3QgYXN0cnl4UHJlc2V0OiBUaGVtZUNvbmZpZyA9IHtcbiAgbmFtZTogJ2FzdHJ5eCcsXG4gIGJyYW5kOiB7XG4gICAgcHJpbWFyeTogJyMwMDY0RTAnLFxuICAgIHByaW1hcnlTY2FsZToge1xuICAgICAgNTA6ICcjRTdGMUZFJyxcbiAgICAgIDEwMDogJyNDRkUzRkQnLFxuICAgICAgMjAwOiAnIzlBQzZGQycsXG4gICAgICAzMDA6ICcjNUNBNUZCJyxcbiAgICAgIDQwMDogJyMyNjk0RkUnLFxuICAgICAgNTAwOiAnIzAwNjRFMCcsXG4gICAgICA2MDA6ICcjMDA1N0MyJyxcbiAgICAgIDcwMDogJyMwMDQ2QTAnLFxuICAgICAgODAwOiAnIzAwMzk3RicsXG4gICAgICA5MDA6ICcjMDAyQzYzJyxcbiAgICAgIDk1MDogJyMwMDFBM0QnLFxuICAgIH0sXG4gIH0sXG59O1xuXG4vKiogUmV0YWluZWQgYWxpYXMgc28gZXhpc3RpbmcgdmlvbGV0LXRoZW1lZCBkZW1vcyBrZWVwIHdvcmtpbmcuICovXG5leHBvcnQgY29uc3QgdmlvbGV0UHJlc2V0OiBUaGVtZUNvbmZpZyA9IHtcbiAgbmFtZTogJ3Zpb2xldCcsXG4gIGJyYW5kOiB7IHByaW1hcnk6ICcjN0MzQUVEJyB9LFxufTtcblxuLyoqIE1vbm9jaHJvbWUgcHJlc2V0IGluIHRoZSBzcGlyaXQgb2Ygc2hhZGNuL3VpJ3MgZGVmYXVsdCBsb29rLiAqL1xuZXhwb3J0IGNvbnN0IG5ldXRyYWxQcmVzZXQ6IFRoZW1lQ29uZmlnID0ge1xuICBuYW1lOiAnbmV1dHJhbCcsXG4gIGJyYW5kOiB7XG4gICAgcHJpbWFyeTogJyMxODE4MUInLFxuICAgIC8vIEEgbmV1dHJhbCBicmFuZCBjYW5ub3QgYmUgZGVyaXZlZCBmcm9tIGxpZ2h0bmVzcyBhbG9uZSDigJQgcGluIHRoZSBzY2FsZS5cbiAgICBwcmltYXJ5U2NhbGU6IHtcbiAgICAgIDUwOiAnI0ZBRkFGQScsXG4gICAgICAxMDA6ICcjRjRGNEY1JyxcbiAgICAgIDIwMDogJyNFNEU0RTcnLFxuICAgICAgMzAwOiAnI0Q0RDREOCcsXG4gICAgICA0MDA6ICcjQTFBMUFBJyxcbiAgICAgIDUwMDogJyM3MTcxN0EnLFxuICAgICAgNjAwOiAnIzNGM0Y0NicsXG4gICAgICA3MDA6ICcjMjcyNzJBJyxcbiAgICAgIDgwMDogJyMxRjFGMjMnLFxuICAgICAgOTAwOiAnIzE4MTgxQicsXG4gICAgICA5NTA6ICcjMDkwOTBCJyxcbiAgICB9LFxuICB9LFxuICBvdmVycmlkZXM6IHtcbiAgICAvLyBBIG5lYXItYmxhY2sgYnJhbmQgbXVzdCBpbnZlcnQgaW4gZGFyayBtb2RlIHRvIHN0YXkgdmlzaWJsZS5cbiAgICBkYXJrOiB7XG4gICAgICAnLS1uZ3hzbWstY29sb3ItcHJpbWFyeSc6ICcjRkFGQUZBJyxcbiAgICAgICctLW5neHNtay1jb2xvci1vbi1wcmltYXJ5JzogJyMxODE4MUInLFxuICAgICAgJy0tbmd4c21rLWNvbG9yLXByaW1hcnktaG92ZXInOiAnI0U0RTRFNycsXG4gICAgICAnLS1uZ3hzbWstY29sb3ItcHJpbWFyeS1hY3RpdmUnOiAnI0Q0RDREOCcsXG4gICAgICAnLS1uZ3hzbWstY29sb3ItcmluZyc6ICcjRDRENEQ4JyxcbiAgICB9LFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGVtZXJhbGRQcmVzZXQ6IFRoZW1lQ29uZmlnID0ge1xuICBuYW1lOiAnZW1lcmFsZCcsXG4gIGJyYW5kOiB7IHByaW1hcnk6ICcjMDU5NjY5JyB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHJvc2VQcmVzZXQ6IFRoZW1lQ29uZmlnID0ge1xuICBuYW1lOiAncm9zZScsXG4gIGJyYW5kOiB7IHByaW1hcnk6ICcjRTExRDQ4JyB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHByZXNldHM6IFJlY29yZDxzdHJpbmcsIFRoZW1lQ29uZmlnPiA9IHtcbiAgYXN0cnl4OiBhc3RyeXhQcmVzZXQsXG4gIHZpb2xldDogdmlvbGV0UHJlc2V0LFxuICBuZXV0cmFsOiBuZXV0cmFsUHJlc2V0LFxuICBlbWVyYWxkOiBlbWVyYWxkUHJlc2V0LFxuICByb3NlOiByb3NlUHJlc2V0LFxufTtcbiJdfQ==
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { DOCUMENT } from '@angular/common';
|
|
2
|
+
import { Injectable, computed, effect, inject, signal, } from '@angular/core';
|
|
3
|
+
import { buildThemeCss } from './css';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
const STORAGE_KEY = 'ngxsmk-theme-mode';
|
|
6
|
+
const STYLE_ID = 'ngxsmk-theme';
|
|
7
|
+
/**
|
|
8
|
+
* Runtime theme control: dark-mode switching (class strategy) and dynamic
|
|
9
|
+
* theme application by injecting generated token CSS into the document.
|
|
10
|
+
*
|
|
11
|
+
* SSR-safe: all DOM access goes through the injected document and degrades
|
|
12
|
+
* gracefully when `window`/`matchMedia` are unavailable.
|
|
13
|
+
*/
|
|
14
|
+
export class NgxsmkThemeService {
|
|
15
|
+
document = inject(DOCUMENT);
|
|
16
|
+
/** User preference: explicit light/dark or follow the OS. */
|
|
17
|
+
mode = signal(this.restoreMode());
|
|
18
|
+
systemDark = signal(this.matchSystemDark());
|
|
19
|
+
/** Effective darkness after resolving `system` against the OS setting. */
|
|
20
|
+
isDark = computed(() => this.mode() === 'system' ? this.systemDark() : this.mode() === 'dark');
|
|
21
|
+
constructor() {
|
|
22
|
+
const media = this.document.defaultView?.matchMedia?.('(prefers-color-scheme: dark)');
|
|
23
|
+
media?.addEventListener('change', (e) => this.systemDark.set(e.matches));
|
|
24
|
+
effect(() => {
|
|
25
|
+
this.document.documentElement.classList.toggle('dark', this.isDark());
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
setMode(mode) {
|
|
29
|
+
this.mode.set(mode);
|
|
30
|
+
try {
|
|
31
|
+
this.document.defaultView?.localStorage?.setItem(STORAGE_KEY, mode);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Storage unavailable (SSR, privacy mode) — preference is session-only.
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
toggle() {
|
|
38
|
+
this.setMode(this.isDark() ? 'light' : 'dark');
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Apply a theme at runtime. Generates token CSS from the config and swaps
|
|
42
|
+
* it into a dedicated `<style>` element, overriding the build-time theme.
|
|
43
|
+
*/
|
|
44
|
+
applyTheme(config) {
|
|
45
|
+
const head = this.document.head;
|
|
46
|
+
let style = this.document.getElementById(STYLE_ID);
|
|
47
|
+
if (!style) {
|
|
48
|
+
style = this.document.createElement('style');
|
|
49
|
+
style.id = STYLE_ID;
|
|
50
|
+
head.appendChild(style);
|
|
51
|
+
}
|
|
52
|
+
style.textContent = buildThemeCss(config);
|
|
53
|
+
}
|
|
54
|
+
/** Remove a runtime-applied theme, falling back to the build-time CSS. */
|
|
55
|
+
clearTheme() {
|
|
56
|
+
this.document.getElementById(STYLE_ID)?.remove();
|
|
57
|
+
}
|
|
58
|
+
restoreMode() {
|
|
59
|
+
try {
|
|
60
|
+
const stored = this.document.defaultView?.localStorage?.getItem(STORAGE_KEY);
|
|
61
|
+
if (stored === 'light' || stored === 'dark' || stored === 'system') {
|
|
62
|
+
return stored;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Fall through to default.
|
|
67
|
+
}
|
|
68
|
+
return 'system';
|
|
69
|
+
}
|
|
70
|
+
matchSystemDark() {
|
|
71
|
+
return (this.document.defaultView?.matchMedia?.('(prefers-color-scheme: dark)')
|
|
72
|
+
.matches ?? false);
|
|
73
|
+
}
|
|
74
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkThemeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
75
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkThemeService, providedIn: 'root' });
|
|
76
|
+
}
|
|
77
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkThemeService, decorators: [{
|
|
78
|
+
type: Injectable,
|
|
79
|
+
args: [{ providedIn: 'root' }]
|
|
80
|
+
}], ctorParameters: () => [] });
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3RoZW1lL3NyYy9saWIvdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNMLFVBQVUsRUFDVixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE9BQU8sQ0FBQzs7QUFLdEMsTUFBTSxXQUFXLEdBQUcsbUJBQW1CLENBQUM7QUFDeEMsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDO0FBRWhDOzs7Ozs7R0FNRztBQUVILE1BQU0sT0FBTyxrQkFBa0I7SUFDWixRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRTdDLDZEQUE2RDtJQUNwRCxJQUFJLEdBQUcsTUFBTSxDQUFZLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBRXJDLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFFN0QsMEVBQTBFO0lBQ2pFLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQzlCLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLE1BQU0sQ0FDdEUsQ0FBQztJQUVGO1FBQ0UsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLENBQ25ELDhCQUE4QixDQUMvQixDQUFDO1FBQ0YsS0FBSyxFQUFFLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFekUsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNWLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFlO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCx3RUFBd0U7UUFDMUUsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVUsQ0FBQyxNQUFtQjtRQUM1QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUNoQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQTRCLENBQUM7UUFDOUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLEtBQUssQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUNELEtBQUssQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsVUFBVTtRQUNSLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFTyxXQUFXO1FBQ2pCLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDN0UsSUFBSSxNQUFNLEtBQUssT0FBTyxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNuRSxPQUFPLE1BQU0sQ0FBQztZQUNoQixDQUFDO1FBQ0gsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLDJCQUEyQjtRQUM3QixDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVPLGVBQWU7UUFDckIsT0FBTyxDQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDLDhCQUE4QixDQUFDO2FBQ3BFLE9BQU8sSUFBSSxLQUFLLENBQ3BCLENBQUM7SUFDSixDQUFDO3VHQTFFVSxrQkFBa0I7MkdBQWxCLGtCQUFrQixjQURMLE1BQU07OzJGQUNuQixrQkFBa0I7a0JBRDlCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgSW5qZWN0YWJsZSxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgYnVpbGRUaGVtZUNzcyB9IGZyb20gJy4vY3NzJztcbmltcG9ydCB7IFRoZW1lQ29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIFRoZW1lTW9kZSA9ICdsaWdodCcgfCAnZGFyaycgfCAnc3lzdGVtJztcblxuY29uc3QgU1RPUkFHRV9LRVkgPSAnbmd4c21rLXRoZW1lLW1vZGUnO1xuY29uc3QgU1RZTEVfSUQgPSAnbmd4c21rLXRoZW1lJztcblxuLyoqXG4gKiBSdW50aW1lIHRoZW1lIGNvbnRyb2w6IGRhcmstbW9kZSBzd2l0Y2hpbmcgKGNsYXNzIHN0cmF0ZWd5KSBhbmQgZHluYW1pY1xuICogdGhlbWUgYXBwbGljYXRpb24gYnkgaW5qZWN0aW5nIGdlbmVyYXRlZCB0b2tlbiBDU1MgaW50byB0aGUgZG9jdW1lbnQuXG4gKlxuICogU1NSLXNhZmU6IGFsbCBET00gYWNjZXNzIGdvZXMgdGhyb3VnaCB0aGUgaW5qZWN0ZWQgZG9jdW1lbnQgYW5kIGRlZ3JhZGVzXG4gKiBncmFjZWZ1bGx5IHdoZW4gYHdpbmRvd2AvYG1hdGNoTWVkaWFgIGFyZSB1bmF2YWlsYWJsZS5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBOZ3hzbWtUaGVtZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcblxuICAvKiogVXNlciBwcmVmZXJlbmNlOiBleHBsaWNpdCBsaWdodC9kYXJrIG9yIGZvbGxvdyB0aGUgT1MuICovXG4gIHJlYWRvbmx5IG1vZGUgPSBzaWduYWw8VGhlbWVNb2RlPih0aGlzLnJlc3RvcmVNb2RlKCkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3lzdGVtRGFyayA9IHNpZ25hbCh0aGlzLm1hdGNoU3lzdGVtRGFyaygpKTtcblxuICAvKiogRWZmZWN0aXZlIGRhcmtuZXNzIGFmdGVyIHJlc29sdmluZyBgc3lzdGVtYCBhZ2FpbnN0IHRoZSBPUyBzZXR0aW5nLiAqL1xuICByZWFkb25seSBpc0RhcmsgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMubW9kZSgpID09PSAnc3lzdGVtJyA/IHRoaXMuc3lzdGVtRGFyaygpIDogdGhpcy5tb2RlKCkgPT09ICdkYXJrJyxcbiAgKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCBtZWRpYSA9IHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXc/Lm1hdGNoTWVkaWE/LihcbiAgICAgICcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJyxcbiAgICApO1xuICAgIG1lZGlhPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4gdGhpcy5zeXN0ZW1EYXJrLnNldChlLm1hdGNoZXMpKTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdkYXJrJywgdGhpcy5pc0RhcmsoKSk7XG4gICAgfSk7XG4gIH1cblxuICBzZXRNb2RlKG1vZGU6IFRoZW1lTW9kZSk6IHZvaWQge1xuICAgIHRoaXMubW9kZS5zZXQobW9kZSk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXc/LmxvY2FsU3RvcmFnZT8uc2V0SXRlbShTVE9SQUdFX0tFWSwgbW9kZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTdG9yYWdlIHVuYXZhaWxhYmxlIChTU1IsIHByaXZhY3kgbW9kZSkg4oCUIHByZWZlcmVuY2UgaXMgc2Vzc2lvbi1vbmx5LlxuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldE1vZGUodGhpcy5pc0RhcmsoKSA/ICdsaWdodCcgOiAnZGFyaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGEgdGhlbWUgYXQgcnVudGltZS4gR2VuZXJhdGVzIHRva2VuIENTUyBmcm9tIHRoZSBjb25maWcgYW5kIHN3YXBzXG4gICAqIGl0IGludG8gYSBkZWRpY2F0ZWQgYDxzdHlsZT5gIGVsZW1lbnQsIG92ZXJyaWRpbmcgdGhlIGJ1aWxkLXRpbWUgdGhlbWUuXG4gICAqL1xuICBhcHBseVRoZW1lKGNvbmZpZzogVGhlbWVDb25maWcpOiB2b2lkIHtcbiAgICBjb25zdCBoZWFkID0gdGhpcy5kb2N1bWVudC5oZWFkO1xuICAgIGxldCBzdHlsZSA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoU1RZTEVfSUQpIGFzIEhUTUxTdHlsZUVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghc3R5bGUpIHtcbiAgICAgIHN0eWxlID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgc3R5bGUuaWQgPSBTVFlMRV9JRDtcbiAgICAgIGhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgIH1cbiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGJ1aWxkVGhlbWVDc3MoY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmUgYSBydW50aW1lLWFwcGxpZWQgdGhlbWUsIGZhbGxpbmcgYmFjayB0byB0aGUgYnVpbGQtdGltZSBDU1MuICovXG4gIGNsZWFyVGhlbWUoKTogdm9pZCB7XG4gICAgdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChTVFlMRV9JRCk/LnJlbW92ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlTW9kZSgpOiBUaGVtZU1vZGUge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yZWQgPSB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3Py5sb2NhbFN0b3JhZ2U/LmdldEl0ZW0oU1RPUkFHRV9LRVkpO1xuICAgICAgaWYgKHN0b3JlZCA9PT0gJ2xpZ2h0JyB8fCBzdG9yZWQgPT09ICdkYXJrJyB8fCBzdG9yZWQgPT09ICdzeXN0ZW0nKSB7XG4gICAgICAgIHJldHVybiBzdG9yZWQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGYWxsIHRocm91Z2ggdG8gZGVmYXVsdC5cbiAgICB9XG4gICAgcmV0dXJuICdzeXN0ZW0nO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXRjaFN5c3RlbURhcmsoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXc/Lm1hdGNoTWVkaWE/LignKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpXG4gICAgICAgIC5tYXRjaGVzID8/IGZhbHNlXG4gICAgKTtcbiAgfVxufVxuIl19
|