@ngxsmk/theme 1.0.0 → 1.2.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.
@@ -0,0 +1,115 @@
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] = key === nearest ? hslToHex(base) : hslToHex({ h: base.h, s: base.s, l: stop });
112
+ }
113
+ return scale;
114
+ }
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy90aGVtZS9zcmMvbGliL2NvbG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVNBLE1BQU0sVUFBVSxRQUFRLENBQUMsR0FBVztJQUNsQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuQyxNQUFNLElBQUksR0FDUixLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7UUFDaEIsQ0FBQyxDQUFDLEtBQUs7YUFDRixLQUFLLENBQUMsRUFBRSxDQUFDO2FBQ1QsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2pCLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDYixDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ1osSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDL0MsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUMvQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBRS9DLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEIsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ1osS0FBSyxDQUFDO2dCQUNKLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNqQyxNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQy9CLE1BQU07WUFDUjtnQkFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUFFLENBQUMsSUFBSSxHQUFHLENBQUM7SUFFcEIsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLENBQUM7QUFFRCxNQUFNLFVBQVUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQU87SUFDdkMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNuQixNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ25CLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUMxQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakQsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFckIsSUFBSSxHQUE2QixDQUFDO0lBQ2xDLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3ZCLElBQUksQ0FBQyxHQUFHLEdBQUc7UUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzdCLElBQUksQ0FBQyxHQUFHLEdBQUc7UUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzdCLElBQUksQ0FBQyxHQUFHLEdBQUc7UUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzdCLElBQUksQ0FBQyxHQUFHLEdBQUc7UUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOztRQUM3QixH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QUM7UUFDN0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbG9yU2NhbGUgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqIEhTTCB0cmlwbGU6IGggaW4gWzAsMzYwKSwgcyBhbmQgbCBpbiBbMCwxMDBdLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIc2wge1xuICBoOiBudW1iZXI7XG4gIHM6IG51bWJlcjtcbiAgbDogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGV4VG9Ic2woaGV4OiBzdHJpbmcpOiBIc2wge1xuICBjb25zdCB2YWx1ZSA9IGhleC5yZXBsYWNlKCcjJywgJycpO1xuICBjb25zdCBmdWxsID1cbiAgICB2YWx1ZS5sZW5ndGggPT09IDNcbiAgICAgID8gdmFsdWVcbiAgICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgICAgLm1hcCgoYykgPT4gYyArIGMpXG4gICAgICAgICAgLmpvaW4oJycpXG4gICAgICA6IHZhbHVlO1xuICBpZiAoIS9eWzAtOWEtZkEtRl17Nn0kLy50ZXN0KGZ1bGwpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGhleCBjb2xvcjogXCIke2hleH1cImApO1xuICB9XG5cbiAgY29uc3QgciA9IHBhcnNlSW50KGZ1bGwuc2xpY2UoMCwgMiksIDE2KSAvIDI1NTtcbiAgY29uc3QgZyA9IHBhcnNlSW50KGZ1bGwuc2xpY2UoMiwgNCksIDE2KSAvIDI1NTtcbiAgY29uc3QgYiA9IHBhcnNlSW50KGZ1bGwuc2xpY2UoNCwgNiksIDE2KSAvIDI1NTtcblxuICBjb25zdCBtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcbiAgY29uc3QgbWluID0gTWF0aC5taW4ociwgZywgYik7XG4gIGNvbnN0IGRlbHRhID0gbWF4IC0gbWluO1xuICBjb25zdCBsID0gKG1heCArIG1pbikgLyAyO1xuXG4gIGxldCBoID0gMDtcbiAgbGV0IHMgPSAwO1xuICBpZiAoZGVsdGEgIT09IDApIHtcbiAgICBzID0gZGVsdGEgLyAoMSAtIE1hdGguYWJzKDIgKiBsIC0gMSkpO1xuICAgIHN3aXRjaCAobWF4KSB7XG4gICAgICBjYXNlIHI6XG4gICAgICAgIGggPSA2MCAqICgoKGcgLSBiKSAvIGRlbHRhKSAlIDYpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgZzpcbiAgICAgICAgaCA9IDYwICogKChiIC0gcikgLyBkZWx0YSArIDIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGggPSA2MCAqICgociAtIGcpIC8gZGVsdGEgKyA0KTtcbiAgICB9XG4gIH1cbiAgaWYgKGggPCAwKSBoICs9IDM2MDtcblxuICByZXR1cm4geyBoLCBzOiBzICogMTAwLCBsOiBsICogMTAwIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2xUb0hleCh7IGgsIHMsIGwgfTogSHNsKTogc3RyaW5nIHtcbiAgY29uc3Qgc24gPSBzIC8gMTAwO1xuICBjb25zdCBsbiA9IGwgLyAxMDA7XG4gIGNvbnN0IGMgPSAoMSAtIE1hdGguYWJzKDIgKiBsbiAtIDEpKSAqIHNuO1xuICBjb25zdCB4ID0gYyAqICgxIC0gTWF0aC5hYnMoKChoIC8gNjApICUgMikgLSAxKSk7XG4gIGNvbnN0IG0gPSBsbiAtIGMgLyAyO1xuXG4gIGxldCByZ2I6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgaWYgKGggPCA2MCkgcmdiID0gW2MsIHgsIDBdO1xuICBlbHNlIGlmIChoIDwgMTIwKSByZ2IgPSBbeCwgYywgMF07XG4gIGVsc2UgaWYgKGggPCAxODApIHJnYiA9IFswLCBjLCB4XTtcbiAgZWxzZSBpZiAoaCA8IDI0MCkgcmdiID0gWzAsIHgsIGNdO1xuICBlbHNlIGlmIChoIDwgMzAwKSByZ2IgPSBbeCwgMCwgY107XG4gIGVsc2UgcmdiID0gW2MsIDAsIHhdO1xuXG4gIGNvbnN0IHRvSGV4ID0gKHY6IG51bWJlcikgPT5cbiAgICBNYXRoLnJvdW5kKCh2ICsgbSkgKiAyNTUpXG4gICAgICAudG9TdHJpbmcoMTYpXG4gICAgICAucGFkU3RhcnQoMiwgJzAnKTtcblxuICByZXR1cm4gYCMke3RvSGV4KHJnYlswXSl9JHt0b0hleChyZ2JbMV0pfSR7dG9IZXgocmdiWzJdKX1gLnRvVXBwZXJDYXNlKCk7XG59XG5cbi8qKiBTaGlmdCBhIGNvbG9yJ3MgbGlnaHRuZXNzIGJ5IGBkZWx0YWAgcGVyY2VudGFnZSBwb2ludHMgKGNsYW1wZWQgMOKAkzEwMCkuICovXG5leHBvcnQgZnVuY3Rpb24gc2hpZnRMaWdodG5lc3MoaGV4OiBzdHJpbmcsIGRlbHRhOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBoc2wgPSBoZXhUb0hzbChoZXgpO1xuICByZXR1cm4gaHNsVG9IZXgoeyAuLi5oc2wsIGw6IE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgaHNsLmwgKyBkZWx0YSkpIH0pO1xufVxuXG4vKiogUm90YXRlIGEgY29sb3IncyBodWUgYnkgYGRlZ3JlZXNgLCBrZWVwaW5nIHNhdHVyYXRpb24gYW5kIGxpZ2h0bmVzcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVIdWUoaGV4OiBzdHJpbmcsIGRlZ3JlZXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGhzbCA9IGhleFRvSHNsKGhleCk7XG4gIHJldHVybiBoc2xUb0hleCh7IC4uLmhzbCwgaDogKCgoaHNsLmggKyBkZWdyZWVzKSAlIDM2MCkgKyAzNjApICUgMzYwIH0pO1xufVxuXG4vKipcbiAqIExpZ2h0bmVzcyBzdG9wcyBmb3IgZWFjaCBzY2FsZSBzdGVwLiBUdW5lZCBzbyB0aGF0IHN0ZXAgNTAwLzYwMCBzdGF5cyBjbG9zZVxuICogdG8gdHlwaWNhbCBicmFuZC1jb2xvciBsaWdodG5lc3MgYW5kIHRoZSBleHRyZW1lcyByZW1haW4gdXNhYmxlIGFzIHRpbnRlZFxuICogYmFja2dyb3VuZHMgKDUw4oCTMTAwKSBhbmQgcmVhZGFibGUgdGV4dCAoOTAw4oCTOTUwKS5cbiAqL1xuY29uc3QgTElHSFRORVNTX1NUT1BTOiBSZWNvcmQ8a2V5b2YgQ29sb3JTY2FsZSwgbnVtYmVyPiA9IHtcbiAgNTA6IDk3LFxuICAxMDA6IDk0LFxuICAyMDA6IDg3LFxuICAzMDA6IDc4LFxuICA0MDA6IDY2LFxuICA1MDA6IDU2LFxuICA2MDA6IDQ4LFxuICA3MDA6IDQwLFxuICA4MDA6IDMyLFxuICA5MDA6IDI1LFxuICA5NTA6IDE2LFxufTtcblxuLyoqXG4gKiBEZXJpdmUgYSBmdWxsIDUw4oCTOTUwIGNvbG9yIHNjYWxlIGZyb20gYSBzaW5nbGUgYnJhbmQgaGV4LlxuICpcbiAqIFRoZSBpbnB1dCBjb2xvciBrZWVwcyBpdHMgZXhhY3QgdmFsdWUgYXQgdGhlIHN0ZXAgd2hvc2UgbGlnaHRuZXNzIHN0b3AgaXNcbiAqIG5lYXJlc3QgdG8gdGhlIGlucHV0J3Mgb3duIGxpZ2h0bmVzcywgc28gYHNjYWxlW3N0ZXBdYCByb3VuZC10cmlwcyBicmFuZFxuICogY29sb3JzIGluc3RlYWQgb2Ygc2hpZnRpbmcgdGhlbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcml2ZVNjYWxlKGJhc2VIZXg6IHN0cmluZyk6IENvbG9yU2NhbGUge1xuICBjb25zdCBiYXNlID0gaGV4VG9Ic2woYmFzZUhleCk7XG5cbiAgbGV0IG5lYXJlc3Q6IGtleW9mIENvbG9yU2NhbGUgPSA1MDA7XG4gIGxldCBuZWFyZXN0RGVsdGEgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIGZvciAoY29uc3QgW3N0ZXAsIHN0b3BdIG9mIE9iamVjdC5lbnRyaWVzKExJR0hUTkVTU19TVE9QUykpIHtcbiAgICBjb25zdCBkZWx0YSA9IE1hdGguYWJzKHN0b3AgLSBiYXNlLmwpO1xuICAgIGlmIChkZWx0YSA8IG5lYXJlc3REZWx0YSkge1xuICAgICAgbmVhcmVzdERlbHRhID0gZGVsdGE7XG4gICAgICBuZWFyZXN0ID0gTnVtYmVyKHN0ZXApIGFzIGtleW9mIENvbG9yU2NhbGU7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2NhbGUgPSB7fSBhcyBDb2xvclNjYWxlO1xuICBmb3IgKGNvbnN0IFtzdGVwLCBzdG9wXSBvZiBPYmplY3QuZW50cmllcyhMSUdIVE5FU1NfU1RPUFMpKSB7XG4gICAgY29uc3Qga2V5ID0gTnVtYmVyKHN0ZXApIGFzIGtleW9mIENvbG9yU2NhbGU7XG4gICAgc2NhbGVba2V5XSA9IGtleSA9PT0gbmVhcmVzdCA/IGhzbFRvSGV4KGJhc2UpIDogaHNsVG9IZXgoeyBoOiBiYXNlLmgsIHM6IGJhc2UucywgbDogc3RvcCB9KTtcbiAgfVxuICByZXR1cm4gc2NhbGU7XG59XG4iXX0=
@@ -0,0 +1,238 @@
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('secondary', theme.secondary),
16
+ ...scaleVars('neutral', theme.neutral),
17
+ '--ngxsmk-font-sans': theme.fontFamily.sans,
18
+ '--ngxsmk-font-mono': theme.fontFamily.mono,
19
+ '--ngxsmk-radius-base': theme.radius[theme.radiusBase],
20
+ '--ngxsmk-control-height': CONTROL_HEIGHT,
21
+ // Motion Tokens
22
+ '--ngxsmk-motion-duration': 'var(--ngxsmk-duration-normal)',
23
+ '--ngxsmk-motion-ease': 'var(--ngxsmk-ease-in-out)',
24
+ // Component-specific Tokens (Buttons)
25
+ '--ngxsmk-button-bg': 'var(--ngxsmk-color-primary)',
26
+ '--ngxsmk-button-color': 'var(--ngxsmk-color-on-primary)',
27
+ '--ngxsmk-button-font-family': 'var(--ngxsmk-font-sans)',
28
+ '--ngxsmk-button-font-weight': '500',
29
+ '--ngxsmk-button-radius': 'var(--ngxsmk-radius-base)',
30
+ '--ngxsmk-button-disabled-opacity': '0.5',
31
+ // Component-specific Tokens (Cards)
32
+ '--ngxsmk-card-bg': 'var(--ngxsmk-color-surface)',
33
+ '--ngxsmk-card-radius': 'var(--ngxsmk-radius-xl)',
34
+ '--ngxsmk-card-shadow': 'var(--ngxsmk-shadow-sm)',
35
+ '--ngxsmk-card-border-color': 'var(--ngxsmk-color-outline)',
36
+ // Component-specific Tokens (Accordion)
37
+ '--ngxsmk-accordion-bg': 'var(--ngxsmk-color-surface)',
38
+ '--ngxsmk-accordion-radius': 'var(--ngxsmk-radius-lg)',
39
+ '--ngxsmk-accordion-border-color': 'var(--ngxsmk-color-outline)',
40
+ // Component-specific Tokens (Progress)
41
+ '--ngxsmk-progress-height': '0.5rem',
42
+ '--ngxsmk-progress-bg': 'var(--ngxsmk-color-surface-variant)',
43
+ '--ngxsmk-progress-color': 'var(--ngxsmk-color-primary)',
44
+ '--ngxsmk-progress-radius': 'var(--ngxsmk-radius-full)',
45
+ // Component-specific Tokens (Switch)
46
+ '--ngxsmk-switch-width': '2.25rem',
47
+ '--ngxsmk-switch-height': '1.25rem',
48
+ '--ngxsmk-switch-radius': 'var(--ngxsmk-radius-full)',
49
+ '--ngxsmk-switch-bg': 'var(--ngxsmk-color-outline-strong)',
50
+ '--ngxsmk-switch-thumb-size': '0.875rem',
51
+ '--ngxsmk-switch-thumb-bg': 'var(--ngxsmk-color-surface)',
52
+ '--ngxsmk-switch-checked-bg': 'var(--ngxsmk-color-primary)',
53
+ };
54
+ for (const [key, value] of Object.entries(theme.spacing)) {
55
+ vars[`--ngxsmk-space-${key}`] = value;
56
+ }
57
+ for (const [key, value] of Object.entries(theme.radius)) {
58
+ vars[`--ngxsmk-radius-${key}`] = value;
59
+ }
60
+ for (const [key, value] of Object.entries(theme.shadow)) {
61
+ vars[`--ngxsmk-shadow-${key}`] = value;
62
+ }
63
+ for (const [key, value] of Object.entries(theme.duration)) {
64
+ vars[`--ngxsmk-duration-${key}`] = value;
65
+ }
66
+ for (const [key, value] of Object.entries(theme.easing)) {
67
+ vars[`--ngxsmk-ease-${key}`] = value;
68
+ }
69
+ for (const [key, value] of Object.entries(theme.zIndex)) {
70
+ vars[`--ngxsmk-z-${key}`] = value;
71
+ }
72
+ const sizes = { large: 'lg', medium: 'md', small: 'sm' };
73
+ for (const [role, styles] of Object.entries(theme.typography)) {
74
+ for (const [size, suffix] of Object.entries(sizes)) {
75
+ const style = styles[size];
76
+ vars[`--ngxsmk-text-${role}-${suffix}-size`] = style.size;
77
+ vars[`--ngxsmk-text-${role}-${suffix}-line`] = style.lineHeight;
78
+ vars[`--ngxsmk-text-${role}-${suffix}-weight`] = style.weight;
79
+ }
80
+ }
81
+ // Extra-small body text for dense metadata rows; below the smallest
82
+ // TypeRoleSize so it is emitted outside the role loop.
83
+ vars['--ngxsmk-text-body-xs-size'] = '0.6875rem';
84
+ vars['--ngxsmk-text-body-xs-line'] = '1rem';
85
+ vars['--ngxsmk-text-body-xs-weight'] = '400';
86
+ return vars;
87
+ }
88
+ /** Semantic role tokens for light mode. */
89
+ function lightVars(theme) {
90
+ const vars = {
91
+ 'color-scheme': 'light',
92
+ '--ngxsmk-color-primary': theme.brandBase,
93
+ '--ngxsmk-color-on-primary': '#FFFFFF',
94
+ '--ngxsmk-color-primary-hover': shiftLightness(theme.brandBase, -8),
95
+ '--ngxsmk-color-primary-active': shiftLightness(theme.brandBase, -14),
96
+ '--ngxsmk-color-primary-container': theme.brand[100],
97
+ '--ngxsmk-color-on-primary-container': theme.brand[900],
98
+ '--ngxsmk-color-secondary': theme.secondaryBase,
99
+ '--ngxsmk-color-on-secondary': '#FFFFFF',
100
+ '--ngxsmk-color-secondary-hover': shiftLightness(theme.secondaryBase, -8),
101
+ '--ngxsmk-color-secondary-active': shiftLightness(theme.secondaryBase, -14),
102
+ '--ngxsmk-color-secondary-container': theme.secondary[100],
103
+ '--ngxsmk-color-on-secondary-container': theme.secondary[900],
104
+ // Astryx: cool-grey body, white cards floating on top, hairline borders.
105
+ '--ngxsmk-color-background': theme.neutral[50],
106
+ '--ngxsmk-color-on-background': '#0A1317',
107
+ '--ngxsmk-color-surface': '#FFFFFF',
108
+ '--ngxsmk-color-on-surface': '#0A1317',
109
+ '--ngxsmk-color-surface-variant': theme.neutral[100],
110
+ '--ngxsmk-color-on-surface-variant': theme.neutral[500],
111
+ '--ngxsmk-color-surface-hover': 'rgb(5 54 89 / 0.05)',
112
+ '--ngxsmk-color-surface-active': 'rgb(5 54 89 / 0.1)',
113
+ '--ngxsmk-color-surface-container': '#FFFFFF',
114
+ '--ngxsmk-color-outline': 'rgb(5 54 89 / 0.1)',
115
+ '--ngxsmk-color-outline-strong': theme.neutral[200],
116
+ '--ngxsmk-color-outline-variant': 'rgb(5 54 89 / 0.06)',
117
+ // Elevation ladder
118
+ '--ngxsmk-color-surface-1': '#FFFFFF',
119
+ '--ngxsmk-color-surface-2': theme.neutral[50],
120
+ '--ngxsmk-color-surface-3': theme.neutral[100],
121
+ '--ngxsmk-color-surface-4': theme.neutral[200],
122
+ '--ngxsmk-color-surface-5': theme.neutral[300],
123
+ '--ngxsmk-color-ring': theme.brandBase,
124
+ '--ngxsmk-color-backdrop': 'rgb(1 18 40 / 0.4)',
125
+ '--ngxsmk-shadow-focus': `0 0 0 2px ${theme.brand[100]}, 0 0 0 4px color-mix(in srgb, ${theme.brandBase} 45%, transparent)`,
126
+ };
127
+ const tertiary = deriveScale(rotateHue(theme.brandBase, 64));
128
+ vars['--ngxsmk-color-tertiary'] = tertiary[500];
129
+ vars['--ngxsmk-color-on-tertiary'] = '#FFFFFF';
130
+ vars['--ngxsmk-color-tertiary-container'] = tertiary[100];
131
+ vars['--ngxsmk-color-on-tertiary-container'] = tertiary[900];
132
+ for (const [name, hex] of Object.entries(theme.semantic)) {
133
+ const scale = deriveScale(hex);
134
+ vars[`--ngxsmk-color-${name}`] = hex;
135
+ vars[`--ngxsmk-color-on-${name}`] = '#FFFFFF';
136
+ vars[`--ngxsmk-color-${name}-container`] = scale[100];
137
+ vars[`--ngxsmk-color-on-${name}-container`] = scale[800];
138
+ }
139
+ return { ...vars, ...theme.overrides.light };
140
+ }
141
+ /** Semantic role tokens for dark mode. */
142
+ function darkVars(theme) {
143
+ const vars = {
144
+ 'color-scheme': 'dark',
145
+ '--ngxsmk-color-primary': theme.brand[400],
146
+ '--ngxsmk-color-on-primary': '#FFFFFF',
147
+ '--ngxsmk-color-primary-hover': theme.brand[300],
148
+ '--ngxsmk-color-primary-active': theme.brand[200],
149
+ '--ngxsmk-color-primary-container': theme.brand[900],
150
+ '--ngxsmk-color-on-primary-container': theme.brand[100],
151
+ '--ngxsmk-color-secondary': theme.secondary[400],
152
+ '--ngxsmk-color-on-secondary': '#FFFFFF',
153
+ '--ngxsmk-color-secondary-hover': theme.secondary[300],
154
+ '--ngxsmk-color-secondary-active': theme.secondary[200],
155
+ '--ngxsmk-color-secondary-container': theme.secondary[900],
156
+ '--ngxsmk-color-on-secondary-container': theme.secondary[100],
157
+ // Astryx dark: near-neutral charcoal body, slightly lighter card,
158
+ // lighter still for popovers; hairline light-on-dark borders.
159
+ '--ngxsmk-color-background': '#111112',
160
+ '--ngxsmk-color-on-background': '#DFE2E5',
161
+ '--ngxsmk-color-surface': '#1F1F22',
162
+ '--ngxsmk-color-on-surface': '#DFE2E5',
163
+ '--ngxsmk-color-surface-variant': '#28292C',
164
+ '--ngxsmk-color-on-surface-variant': '#AAAFB5',
165
+ '--ngxsmk-color-surface-hover': 'rgb(255 255 255 / 0.05)',
166
+ '--ngxsmk-color-surface-active': 'rgb(255 255 255 / 0.1)',
167
+ '--ngxsmk-color-surface-container': '#28292C',
168
+ '--ngxsmk-color-outline': 'rgb(242 244 246 / 0.1)',
169
+ '--ngxsmk-color-outline-strong': '#494D53',
170
+ '--ngxsmk-color-outline-variant': 'rgb(242 244 246 / 0.06)',
171
+ // Elevation ladder
172
+ '--ngxsmk-color-surface-1': theme.neutral[800],
173
+ '--ngxsmk-color-surface-2': theme.neutral[700],
174
+ '--ngxsmk-color-surface-3': theme.neutral[600],
175
+ '--ngxsmk-color-surface-4': theme.neutral[500],
176
+ '--ngxsmk-color-surface-5': theme.neutral[400],
177
+ '--ngxsmk-color-ring': theme.brand[400],
178
+ '--ngxsmk-color-backdrop': 'rgb(17 17 18 / 0.6)',
179
+ '--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)`,
180
+ };
181
+ const tertiary = deriveScale(rotateHue(theme.brandBase, 64));
182
+ vars['--ngxsmk-color-tertiary'] = tertiary[400];
183
+ vars['--ngxsmk-color-on-tertiary'] = tertiary[950];
184
+ vars['--ngxsmk-color-tertiary-container'] = tertiary[900];
185
+ vars['--ngxsmk-color-on-tertiary-container'] = tertiary[100];
186
+ for (const [name, hex] of Object.entries(theme.semantic)) {
187
+ const scale = deriveScale(hex);
188
+ vars[`--ngxsmk-color-${name}`] = scale[400];
189
+ vars[`--ngxsmk-color-on-${name}`] = scale[950];
190
+ vars[`--ngxsmk-color-${name}-container`] = scale[950];
191
+ vars[`--ngxsmk-color-on-${name}-container`] = scale[300];
192
+ }
193
+ return { ...vars, ...theme.overrides.dark };
194
+ }
195
+ function block(selector, vars, indent = '') {
196
+ const lines = Object.entries(vars).map(([name, value]) => `${indent} ${name}: ${value};`);
197
+ return `${indent}${selector} {\n${lines.join('\n')}\n${indent}}`;
198
+ }
199
+ /**
200
+ * Transform a theme config into a CSS stylesheet of `--ngxsmk-*` custom
201
+ * properties. Emits static tokens plus light-mode roles on `:root`, and
202
+ * dark-mode roles according to the configured dark-mode strategy.
203
+ */
204
+ export function buildThemeCss(config) {
205
+ const theme = 'brand' in config && 'spacing' in config
206
+ ? config
207
+ : resolveTheme(config);
208
+ const root = block(':root', { ...staticVars(theme), ...lightVars(theme) });
209
+ const dark = darkVars(theme);
210
+ let darkBlock;
211
+ switch (theme.darkMode.strategy) {
212
+ case 'media':
213
+ darkBlock = `@media (prefers-color-scheme: dark) {\n${block(':root', dark, ' ')}\n}`;
214
+ break;
215
+ case 'system': {
216
+ // `light-dark()` support is per-property; the class block still serves
217
+ // as the override hook, so `system` behaves as media + class.
218
+ const cn = theme.darkMode.className;
219
+ darkBlock = [
220
+ `@media (prefers-color-scheme: dark) {\n${block(':root', dark, ' ')}\n}`,
221
+ block(`:root.${cn}, :root.${cn} body, .${cn}`, dark),
222
+ ].join('\n\n');
223
+ break;
224
+ }
225
+ default: {
226
+ // `:root.<class>` (specificity 0,2,0) plus a `body` variant defend the
227
+ // dark tokens against third-party stylesheets that redefine `--ngxsmk-*`
228
+ // on a plain `:root` (0,1,0) — those would otherwise win by source order
229
+ // when injected into <head> after this sheet. The bare `.<class>` keeps
230
+ // scoped (non-root) dark regions working.
231
+ const cn = theme.darkMode.className;
232
+ darkBlock = block(`:root.${cn}, :root.${cn} body, .${cn}`, dark);
233
+ }
234
+ }
235
+ const reducedMotion = `@media (prefers-reduced-motion: reduce) {\n :root {\n --ngxsmk-motion-duration: 0ms;\n }\n}`;
236
+ return `/* Generated by @ngxsmk/theme — do not edit by hand. */\n${root}\n\n${darkBlock}\n\n${reducedMotion}\n`;
237
+ }
238
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvdGhlbWUvc3JjL2xpYi9jc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBSTFDLFNBQVMsU0FBUyxDQUFDLE1BQWMsRUFBRSxLQUFpQjtJQUNsRCxNQUFNLElBQUksR0FBUyxFQUFFLENBQUM7SUFDdEIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsa0JBQWtCLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNuRCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsNkRBQTZEO0FBQzdELFNBQVMsVUFBVSxDQUFDLEtBQW9CO0lBQ3RDLE1BQU0sSUFBSSxHQUFTO1FBQ2pCLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ2xDLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQzFDLEdBQUcsU0FBUyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ3RDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSTtRQUMzQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUk7UUFDM0Msc0JBQXNCLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQ3RELHlCQUF5QixFQUFFLGNBQWM7UUFFekMsZ0JBQWdCO1FBQ2hCLDBCQUEwQixFQUFFLCtCQUErQjtRQUMzRCxzQkFBc0IsRUFBRSwyQkFBMkI7UUFFbkQsc0NBQXNDO1FBQ3RDLG9CQUFvQixFQUFFLDZCQUE2QjtRQUNuRCx1QkFBdUIsRUFBRSxnQ0FBZ0M7UUFDekQsNkJBQTZCLEVBQUUseUJBQXlCO1FBQ3hELDZCQUE2QixFQUFFLEtBQUs7UUFDcEMsd0JBQXdCLEVBQUUsMkJBQTJCO1FBQ3JELGtDQUFrQyxFQUFFLEtBQUs7UUFFekMsb0NBQW9DO1FBQ3BDLGtCQUFrQixFQUFFLDZCQUE2QjtRQUNqRCxzQkFBc0IsRUFBRSx5QkFBeUI7UUFDakQsc0JBQXNCLEVBQUUseUJBQXlCO1FBQ2pELDRCQUE0QixFQUFFLDZCQUE2QjtRQUUzRCx3Q0FBd0M7UUFDeEMsdUJBQXVCLEVBQUUsNkJBQTZCO1FBQ3RELDJCQUEyQixFQUFFLHlCQUF5QjtRQUN0RCxpQ0FBaUMsRUFBRSw2QkFBNkI7UUFFaEUsdUNBQXVDO1FBQ3ZDLDBCQUEwQixFQUFFLFFBQVE7UUFDcEMsc0JBQXNCLEVBQUUscUNBQXFDO1FBQzdELHlCQUF5QixFQUFFLDZCQUE2QjtRQUN4RCwwQkFBMEIsRUFBRSwyQkFBMkI7UUFFdkQscUNBQXFDO1FBQ3JDLHVCQUF1QixFQUFFLFNBQVM7UUFDbEMsd0JBQXdCLEVBQUUsU0FBUztRQUNuQyx3QkFBd0IsRUFBRSwyQkFBMkI7UUFDckQsb0JBQW9CLEVBQUUsb0NBQW9DO1FBQzFELDRCQUE0QixFQUFFLFVBQVU7UUFDeEMsMEJBQTBCLEVBQUUsNkJBQTZCO1FBQ3pELDRCQUE0QixFQUFFLDZCQUE2QjtLQUM1RCxDQUFDO0lBRUYsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN4QyxDQUFDO0lBQ0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN6QyxDQUFDO0lBQ0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN6QyxDQUFDO0lBQ0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDMUQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUMzQyxDQUFDO0lBQ0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBQ0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDcEMsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQVcsQ0FBQztJQUNsRSxLQUFLLE1BQU0sQ0FBQyxJ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LElBQUksQ0FBQyxDQUFDO1FBQ25FLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQUcsa0dBQWtHLENBQUM7SUFDekgsT0FBTyw0REFBNEQsSUFBSSxPQUFPLFNBQVMsT0FBTyxhQUFhLElBQUksQ0FBQztBQUNsSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVyaXZlU2NhbGUsIHJvdGF0ZUh1ZSwgc2hpZnRMaWdodG5lc3MgfSBmcm9tICcuL2NvbG9yJztcbmltcG9ydCB7IHJlc29sdmVUaGVtZSB9IGZyb20gJy4vZGVmaW5lLWNvbmZpZyc7XG5pbXBvcnQgeyBDb2xvclNjYWxlLCBSZXNvbHZlZFRoZW1lLCBUaGVtZUNvbmZpZywgVHlwZVJvbGVTaXplLCBUeXBlU3R5bGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IENPTlRST0xfSEVJR0hUIH0gZnJvbSAnLi90b2tlbnMnO1xuXG50eXBlIFZhcnMgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG5mdW5jdGlvbiBzY2FsZVZhcnMocHJlZml4OiBzdHJpbmcsIHNjYWxlOiBDb2xvclNjYWxlKTogVmFycyB7XG4gIGNvbnN0IHZhcnM6IFZhcnMgPSB7fTtcbiAgZm9yIChjb25zdCBbc3RlcCwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjYWxlKSkge1xuICAgIHZhcnNbYC0tbmd4c21rLWNvbG9yLSR7cHJlZml4fS0ke3N0ZXB9YF0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdmFycztcbn1cblxuLyoqIFRva2VucyB0aGF0IGRvIG5vdCBjaGFuZ2UgYmV0d2VlbiBsaWdodCBhbmQgZGFyayBtb2RlLiAqL1xuZnVuY3Rpb24gc3RhdGljVmFycyh0aGVtZTogUmVzb2x2ZWRUaGVtZSk6IFZhcnMge1xuICBjb25zdCB2YXJzOiBWYXJzID0ge1xuICAgIC4uLnNjYWxlVmFycygnYnJhbmQnLCB0aGVtZS5icmFuZCksXG4gICAgLi4uc2NhbGVWYXJzKCdzZWNvbmRhcnknLCB0aGVtZS5zZWNvbmRhcnkpLFxuICAgIC4uLnNjYWxlVmFycygnbmV1dHJhbCcsIHRoZW1lLm5ldXRyYWwpLFxuICAgICctLW5neHNtay1mb250LXNhbnMnOiB0aGVtZS5mb250RmFtaWx5LnNhbnMsXG4gICAgJy0tbmd4c21rLWZvbnQtbW9ubyc6IHRoZW1lLmZvbnRGYW1pbHkubW9ubyxcbiAgICAnLS1uZ3hzbWstcmFkaXVzLWJhc2UnOiB0aGVtZS5yYWRpdXNbdGhlbWUucmFkaXVzQmFzZV0sXG4gICAgJy0tbmd4c21rLWNvbnRyb2wtaGVpZ2h0JzogQ09OVFJPTF9IRUlHSFQsXG5cbiAgICAvLyBNb3Rpb24gVG9rZW5zXG4gICAgJy0tbmd4c21rLW1vdGlvbi1kdXJhdGlvbic6ICd2YXIoLS1uZ3hzbWstZHVyYXRpb24tbm9ybWFsKScsXG4gICAgJy0tbmd4c21rLW1vdGlvbi1lYXNlJzogJ3ZhcigtLW5neHNtay1lYXNlLWluLW91dCknLFxuXG4gICAgLy8gQ29tcG9uZW50LXNwZWNpZmljIFRva2VucyAoQnV0dG9ucylcbiAgICAnLS1uZ3hzbWstYnV0dG9uLWJnJzogJ3ZhcigtLW5neHNtay1jb2xvci1wcmltYXJ5KScsXG4gICAgJy0tbmd4c21rLWJ1dHRvbi1jb2xvcic6ICd2YXIoLS1uZ3hzbWstY29sb3Itb24tcHJpbWFyeSknLFxuICAgICctLW5neHNtay1idXR0b24tZm9udC1mYW1pbHknOiAndmFyKC0tbmd4c21rLWZvbnQtc2FucyknLFxuICAgICctLW5neHNtay1idXR0b24tZm9udC13ZWlnaHQnOiAnNTAwJyxcbiAgICAnLS1uZ3hzbWstYnV0dG9uLXJhZGl1cyc6ICd2YXIoLS1uZ3hzbWstcmFkaXVzLWJhc2UpJyxcbiAgICAnLS1uZ3hzbWstYnV0dG9uLWRpc2FibGVkLW9wYWNpdHknOiAnMC41JyxcblxuICAgIC8vIENvbXBvbmVudC1zcGVjaWZpYyBUb2tlbnMgKENhcmRzKVxuICAgICctLW5neHNtay1jYXJkLWJnJzogJ3ZhcigtLW5neHNtay1jb2xvci1zdXJmYWNlKScsXG4gICAgJy0tbmd4c21rLWNhcmQtcmFkaXVzJzogJ3ZhcigtLW5neHNtay1yYWRpdXMteGwpJyxcbiAgICAnLS1uZ3hzbWstY2FyZC1zaGFkb3cnOiAndmFyKC0tbmd4c21rLXNoYWRvdy1zbSknLFxuICAgICctLW5neHNtay1jYXJkLWJvcmRlci1jb2xvcic6ICd2YXIoLS1uZ3hzbWstY29sb3Itb3V0bGluZSknLFxuXG4gICAgLy8gQ29tcG9uZW50LXNwZWNpZmljIFRva2VucyAoQWNjb3JkaW9uKVxuICAgICctLW5neHNtay1hY2NvcmRpb24tYmcnOiAndmFyKC0tbmd4c21rLWNvbG9yLXN1cmZhY2UpJyxcbiAgICAnLS1uZ3hzbWstYWNjb3JkaW9uLXJhZGl1cyc6ICd2YXIoLS1uZ3hzbWstcmFkaXVzLWxnKScsXG4gICAgJy0tbmd4c21rLWFjY29yZGlvbi1ib3JkZXItY29sb3InOiAndmFyKC0tbmd4c21rLWNvbG9yLW91dGxpbmUpJyxcblxuICAgIC8vIENvbXBvbmVudC1zcGVjaWZpYyBUb2tlbnMgKFByb2dyZXNzKVxuICAgICctLW5neHNtay1wcm9ncmVzcy1oZWlnaHQnOiAnMC41cmVtJyxcbiAgICAnLS1uZ3hzbWstcHJvZ3Jlc3MtYmcnOiAndmFyKC0tbmd4c21rLWNvbG9yLXN1cmZhY2UtdmFyaWFudCknLFxuICAgICctLW5neHNtay1wcm9ncmVzcy1jb2xvcic6ICd2YXIoLS1uZ3hzbWstY29sb3ItcHJpbWFyeSknLFxuICAgICctLW5neHNtay1wcm9ncmVzcy1yYWRpdXMnOiAndmFyKC0tbmd4c21rLXJhZGl1cy1mdWxsKScsXG5cbiAgICAvLyBDb21wb25lbnQtc3BlY2lmaWMgVG9rZW5zIChTd2l0Y2gpXG4gICAgJy0tbmd4c21rLXN3aXRjaC13aWR0aCc6ICcyLjI1cmVtJyxcbiAgICAnLS1uZ3hzbWstc3dpdGNoLWhlaWdodCc6ICcxLjI1cmVtJyxcbiAgICAnLS1uZ3hzbWstc3dpdGNoLXJhZGl1cyc6ICd2YXIoLS1uZ3hzbWstcmFkaXVzLWZ1bGwpJyxcbiAgICAnLS1uZ3hzbWstc3dpdGNoLWJnJzogJ3ZhcigtLW5neHNtay1jb2xvci1vdXRsaW5lLXN0cm9uZyknLFxuICAgICctLW5neHNtay1zd2l0Y2gtdGh1bWItc2l6ZSc6ICcwLjg3NXJlbScsXG4gICAgJy0tbmd4c21rLXN3aXRjaC10aHVtYi1iZyc6ICd2YXIoLS1uZ3hzbWstY29sb3Itc3VyZmFjZSknLFxuICAgICctLW5neHNtay1zd2l0Y2gtY2hlY2tlZC1iZyc6ICd2YXIoLS1uZ3hzbWstY29sb3ItcHJpbWFyeSknLFxuICB9O1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoZW1lLnNwYWNpbmcpKSB7XG4gICAgdmFyc1tgLS1uZ3hzbWstc3BhY2UtJHtrZXl9YF0gPSB2YWx1ZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGVtZS5yYWRpdXMpKSB7XG4gICAgdmFyc1tgLS1uZ3hzbWstcmFkaXVzLSR7a2V5fWBdID0gdmFsdWU7XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhlbWUuc2hhZG93KSkge1xuICAgIHZhcnNbYC0tbmd4c21rLXNoYWRvdy0ke2tleX1gXSA9IHZhbHVlO1xuICB9XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoZW1lLmR1cmF0aW9uKSkge1xuICAgIHZhcnNbYC0tbmd4c21rLWR1cmF0aW9uLSR7a2V5fWBdID0gdmFsdWU7XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhlbWUuZWFzaW5nKSkge1xuICAgIHZhcnNbYC0tbmd4c21rLWVhc2UtJHtrZXl9YF0gPSB2YWx1ZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGVtZS56SW5kZXgpKSB7XG4gICAgdmFyc1tgLS1uZ3hzbWstei0ke2tleX1gXSA9IHZhbHVlO1xuICB9XG5cbiAgY29uc3Qgc2l6ZXMgPSB7IGxhcmdlOiAnbGcnLCBtZWRpdW06ICdtZCcsIHNtYWxsOiAnc20nIH0gYXMgY29uc3Q7XG4gIGZvciAoY29uc3QgW3JvbGUsIHN0eWxlc10gb2YgT2JqZWN0LmVudHJpZXModGhlbWUudHlwb2dyYXBoeSkpIHtcbiAgICBmb3IgKGNvbnN0IFtzaXplLCBzdWZmaXhdIG9mIE9iamVjdC5lbnRyaWVzKHNpemVzKSkge1xuICAgICAgY29uc3Qgc3R5bGU6IFR5cGVTdHlsZSA9IHN0eWxlc1tzaXplIGFzIFR5cGVSb2xlU2l6ZV07XG4gICAgICB2YXJzW2AtLW5neHNtay10ZXh0LSR7cm9sZX0tJHtzdWZmaXh9LXNpemVgXSA9IHN0eWxlLnNpemU7XG4gICAgICB2YXJzW2AtLW5neHNtay10ZXh0LSR7cm9sZX0tJHtzdWZmaXh9LWxpbmVgXSA9IHN0eWxlLmxpbmVIZWlnaHQ7XG4gICAgICB2YXJzW2AtLW5neHNtay10ZXh0LSR7cm9sZX0tJHtzdWZmaXh9LXdlaWdodGBdID0gc3R5bGUud2VpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIC8vIEV4dHJhLXNtYWxsIGJvZHkgdGV4dCBmb3IgZGVuc2UgbWV0YWRhdGEgcm93czsgYmVsb3cgdGhlIHNtYWxsZXN0XG4gIC8vIFR5cGVSb2xlU2l6ZSBzbyBpdCBpcyBlbWl0dGVkIG91dHNpZGUgdGhlIHJvbGUgbG9vcC5cbiAgdmFyc1snLS1uZ3hzbWstdGV4dC1ib2R5LXhzLXNpemUnXSA9ICcwLjY4NzVyZW0nO1xuICB2YXJzWyctLW5neHNtay10ZXh0LWJvZHkteHMtbGluZSddID0gJzFyZW0nO1xuICB2YXJzWyctLW5neHNtay10ZXh0LWJvZHkteHMtd2VpZ2h0J10gPSAnNDAwJztcblxuICByZXR1cm4gdmFycztcbn1cblxuLyoqIFNlbWFudGljIHJvbGUgdG9rZW5zIGZvciBsaWdodCBtb2RlLiAqL1xuZnVuY3Rpb24gbGlnaHRWYXJzKHRoZW1lOiBSZXNvbHZlZFRoZW1lKTogVmFycyB7XG4gIGNvbnN0IHZhcnM6IFZhcnMgPSB7XG4gICAgJ2NvbG9yLXNjaGVtZSc6ICdsaWdodCcsXG5cbiAgICAnLS1uZ3hzbWstY29sb3ItcHJpbWFyeSc6IHRoZW1lLmJyYW5kQmFzZSxcbiAgICAnLS1uZ3hzbWstY29sb3Itb24tcHJpbWFyeSc6ICcjRkZGRkZGJyxcbiAgICAnLS1uZ3hzbWstY29sb3ItcHJpbWFyeS1ob3Zlcic6IHNoaWZ0TGlnaHRuZXNzKHRoZW1lLmJyYW5kQmFzZSwgLTgpLFxuICAgICctLW5neHNtay1jb2xvci1wcmltYXJ5LWFjdGl2ZSc6IHNoaWZ0TGlnaHRuZXNzKHRoZW1lLmJyYW5kQmFzZSwgLTE0KSxcbiAgICAnLS1uZ3hzbWstY29sb3ItcHJpbWFyeS1jb250YWluZXInOiB0aGVtZS5icmFuZFsxMDBdLFxuICAgICctLW5neHNtay1jb2xvci1vbi1wcmltYXJ5LWNvbnRhaW5lcic6IHRoZW1lLmJyYW5kWzkwMF0sXG5cbiAgICAnLS1uZ3hzbWstY29sb3Itc2Vjb25kYXJ5JzogdGhlbWUuc2Vjb25kYXJ5QmFzZSxcbiAgICAnLS1uZ3hzbWstY29sb3Itb24tc2Vjb25kYXJ5JzogJyNGRkZGRkYnLFxuICAgICctLW5neHNtay1jb2xvci1zZWNvbmRhcnktaG92ZXInOiBzaGlmdExpZ2h0bmVzcyh0aGVtZS5zZWNvbmRhcnlCYXNlLCAtOCksXG4gICAgJy0tbmd4c21rLWNvbG9yLXNlY29uZGFyeS1hY3RpdmUnOiBzaGlmdExpZ2h0bmVzcyh0aGVtZS5zZWNvbmRhcnlCYXNlLCAtMTQpLFxuICAgICctLW5neHNtay1jb2xvci1zZWNvbmRhcnktY29udGFpbmVyJzogdGhlbWUuc2Vjb25kYXJ5WzEwMF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLXNlY29uZGFyeS1jb250YWluZXInOiB0aGVtZS5zZWNvbmRhcnlbOTAwXSxcblxuICAgIC8vIEFzdHJ5eDogY29vbC1ncmV5IGJvZHksIHdoaXRlIGNhcmRzIGZsb2F0aW5nIG9uIHRvcCwgaGFpcmxpbmUgYm9yZGVycy5cbiAgICAnLS1uZ3hzbWstY29sb3ItYmFja2dyb3VuZCc6IHRoZW1lLm5ldXRyYWxbNTBdLFxuICAgICctLW5neHNtay1jb2xvci1vbi1iYWNrZ3JvdW5kJzogJyMwQTEzMTcnLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlJzogJyNGRkZGRkYnLFxuICAgICctLW5neHNtay1jb2xvci1vbi1zdXJmYWNlJzogJyMwQTEzMTcnLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLXZhcmlhbnQnOiB0aGVtZS5uZXV0cmFsWzEwMF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLXN1cmZhY2UtdmFyaWFudCc6IHRoZW1lLm5ldXRyYWxbNTAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itc3VyZmFjZS1ob3Zlcic6ICdyZ2IoNSA1NCA4OSAvIDAuMDUpJyxcbiAgICAnLS1uZ3hzbWstY29sb3Itc3VyZmFjZS1hY3RpdmUnOiAncmdiKDUgNTQgODkgLyAwLjEpJyxcbiAgICAnLS1uZ3hzbWstY29sb3Itc3VyZmFjZS1jb250YWluZXInOiAnI0ZGRkZGRicsXG4gICAgJy0tbmd4c21rLWNvbG9yLW91dGxpbmUnOiAncmdiKDUgNTQgODkgLyAwLjEpJyxcbiAgICAnLS1uZ3hzbWstY29sb3Itb3V0bGluZS1zdHJvbmcnOiB0aGVtZS5uZXV0cmFsWzIwMF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLW91dGxpbmUtdmFyaWFudCc6ICdyZ2IoNSA1NCA4OSAvIDAuMDYpJyxcblxuICAgIC8vIEVsZXZhdGlvbiBsYWRkZXJcbiAgICAnLS1uZ3hzbWstY29sb3Itc3VyZmFjZS0xJzogJyNGRkZGRkYnLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLTInOiB0aGVtZS5uZXV0cmFsWzUwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itc3VyZmFjZS0zJzogdGhlbWUubmV1dHJhbFsxMDBdLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLTQnOiB0aGVtZS5uZXV0cmFsWzIwMF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UtNSc6IHRoZW1lLm5ldXRyYWxbMzAwXSxcblxuICAgICctLW5neHNtay1jb2xvci1yaW5nJzogdGhlbWUuYnJhbmRCYXNlLFxuICAgICctLW5neHNtay1jb2xvci1iYWNrZHJvcCc6ICdyZ2IoMSAxOCA0MCAvIDAuNCknLFxuICAgICctLW5neHNtay1zaGFkb3ctZm9jdXMnOiBgMCAwIDAgMnB4ICR7dGhlbWUuYnJhbmRbMTAwXX0sIDAgMCAwIDRweCBjb2xvci1taXgoaW4gc3JnYiwgJHt0aGVtZS5icmFuZEJhc2V9IDQ1JSwgdHJhbnNwYXJlbnQpYCxcbiAgfTtcblxuICBjb25zdCB0ZXJ0aWFyeSA9IGRlcml2ZVNjYWxlKHJvdGF0ZUh1ZSh0aGVtZS5icmFuZEJhc2UsIDY0KSk7XG4gIHZhcnNbJy0tbmd4c21rLWNvbG9yLXRlcnRpYXJ5J10gPSB0ZXJ0aWFyeVs1MDBdO1xuICB2YXJzWyctLW5neHNtay1jb2xvci1vbi10ZXJ0aWFyeSddID0gJyNGRkZGRkYnO1xuICB2YXJzWyctLW5neHNtay1jb2xvci10ZXJ0aWFyeS1jb250YWluZXInXSA9IHRlcnRpYXJ5WzEwMF07XG4gIHZhcnNbJy0tbmd4c21rLWNvbG9yLW9uLXRlcnRpYXJ5LWNvbnRhaW5lciddID0gdGVydGlhcnlbOTAwXTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBoZXhdIG9mIE9iamVjdC5lbnRyaWVzKHRoZW1lLnNlbWFudGljKSkge1xuICAgIGNvbnN0IHNjYWxlID0gZGVyaXZlU2NhbGUoaGV4KTtcbiAgICB2YXJzW2AtLW5neHNtay1jb2xvci0ke25hbWV9YF0gPSBoZXg7XG4gICAgdmFyc1tgLS1uZ3hzbWstY29sb3Itb24tJHtuYW1lfWBdID0gJyNGRkZGRkYnO1xuICAgIHZhcnNbYC0tbmd4c21rLWNvbG9yLSR7bmFtZX0tY29udGFpbmVyYF0gPSBzY2FsZVsxMDBdO1xuICAgIHZhcnNbYC0tbmd4c21rLWNvbG9yLW9uLSR7bmFtZX0tY29udGFpbmVyYF0gPSBzY2FsZVs4MDBdO1xuICB9XG5cbiAgcmV0dXJuIHsgLi4udmFycywgLi4udGhlbWUub3ZlcnJpZGVzLmxpZ2h0IH07XG59XG5cbi8qKiBTZW1hbnRpYyByb2xlIHRva2VucyBmb3IgZGFyayBtb2RlLiAqL1xuZnVuY3Rpb24gZGFya1ZhcnModGhlbWU6IFJlc29sdmVkVGhlbWUpOiBWYXJzIHtcbiAgY29uc3QgdmFyczogVmFycyA9IHtcbiAgICAnY29sb3Itc2NoZW1lJzogJ2RhcmsnLFxuXG4gICAgJy0tbmd4c21rLWNvbG9yLXByaW1hcnknOiB0aGVtZS5icmFuZFs0MDBdLFxuICAgICctLW5neHNtay1jb2xvci1vbi1wcmltYXJ5JzogJyNGRkZGRkYnLFxuICAgICctLW5neHNtay1jb2xvci1wcmltYXJ5LWhvdmVyJzogdGhlbWUuYnJhbmRbMzAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3ItcHJpbWFyeS1hY3RpdmUnOiB0aGVtZS5icmFuZFsyMDBdLFxuICAgICctLW5neHNtay1jb2xvci1wcmltYXJ5LWNvbnRhaW5lcic6IHRoZW1lLmJyYW5kWzkwMF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLXByaW1hcnktY29udGFpbmVyJzogdGhlbWUuYnJhbmRbMTAwXSxcblxuICAgICctLW5neHNtay1jb2xvci1zZWNvbmRhcnknOiB0aGVtZS5zZWNvbmRhcnlbNDAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itb24tc2Vjb25kYXJ5JzogJyNGRkZGRkYnLFxuICAgICctLW5neHNtay1jb2xvci1zZWNvbmRhcnktaG92ZXInOiB0aGVtZS5zZWNvbmRhcnlbMzAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itc2Vjb25kYXJ5LWFjdGl2ZSc6IHRoZW1lLnNlY29uZGFyeVsyMDBdLFxuICAgICctLW5neHNtay1jb2xvci1zZWNvbmRhcnktY29udGFpbmVyJzogdGhlbWUuc2Vjb25kYXJ5WzkwMF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLXNlY29uZGFyeS1jb250YWluZXInOiB0aGVtZS5zZWNvbmRhcnlbMTAwXSxcblxuICAgIC8vIEFzdHJ5eCBkYXJrOiBuZWFyLW5ldXRyYWwgY2hhcmNvYWwgYm9keSwgc2xpZ2h0bHkgbGlnaHRlciBjYXJkLFxuICAgIC8vIGxpZ2h0ZXIgc3RpbGwgZm9yIHBvcG92ZXJzOyBoYWlybGluZSBsaWdodC1vbi1kYXJrIGJvcmRlcnMuXG4gICAgJy0tbmd4c21rLWNvbG9yLWJhY2tncm91bmQnOiAnIzExMTExMicsXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLWJhY2tncm91bmQnOiAnI0RGRTJFNScsXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UnOiAnIzFGMUYyMicsXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLXN1cmZhY2UnOiAnI0RGRTJFNScsXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UtdmFyaWFudCc6ICcjMjgyOTJDJyxcbiAgICAnLS1uZ3hzbWstY29sb3Itb24tc3VyZmFjZS12YXJpYW50JzogJyNBQUFGQjUnLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLWhvdmVyJzogJ3JnYigyNTUgMjU1IDI1NSAvIDAuMDUpJyxcbiAgICAnLS1uZ3hzbWstY29sb3Itc3VyZmFjZS1hY3RpdmUnOiAncmdiKDI1NSAyNTUgMjU1IC8gMC4xKScsXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UtY29udGFpbmVyJzogJyMyODI5MkMnLFxuICAgICctLW5neHNtay1jb2xvci1vdXRsaW5lJzogJ3JnYigyNDIgMjQ0IDI0NiAvIDAuMSknLFxuICAgICctLW5neHNtay1jb2xvci1vdXRsaW5lLXN0cm9uZyc6ICcjNDk0RDUzJyxcbiAgICAnLS1uZ3hzbWstY29sb3Itb3V0bGluZS12YXJpYW50JzogJ3JnYigyNDIgMjQ0IDI0NiAvIDAuMDYpJyxcblxuICAgIC8vIEVsZXZhdGlvbiBsYWRkZXJcbiAgICAnLS1uZ3hzbWstY29sb3Itc3VyZmFjZS0xJzogdGhlbWUubmV1dHJhbFs4MDBdLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLTInOiB0aGVtZS5uZXV0cmFsWzcwMF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UtMyc6IHRoZW1lLm5ldXRyYWxbNjAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itc3VyZmFjZS00JzogdGhlbWUubmV1dHJhbFs1MDBdLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLTUnOiB0aGVtZS5uZXV0cmFsWzQwMF0sXG5cbiAgICAnLS1uZ3hzbWstY29sb3ItcmluZyc6IHRoZW1lLmJyYW5kWzQwMF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLWJhY2tkcm9wJzogJ3JnYigxNyAxNyAxOCAvIDAuNiknLFxuICAgICctLW5neHNtay1zaGFkb3ctZm9jdXMnOiBgMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCAke3RoZW1lLmJyYW5kWzQwMF19IDI1JSwgdHJhbnNwYXJlbnQpLCAwIDAgMCA0cHggY29sb3ItbWl4KGluIHNyZ2IsICR7dGhlbWUuYnJhbmRbNDAwXX0gNDUlLCB0cmFuc3BhcmVudClgLFxuICB9O1xuXG4gIGNvbnN0IHRlcnRpYXJ5ID0gZGVyaXZlU2NhbGUocm90YXRlSHVlKHRoZW1lLmJyYW5kQmFzZSwgNjQpKTtcbiAgdmFyc1snLS1uZ3hzbWstY29sb3ItdGVydGlhcnknXSA9IHRlcnRpYXJ5WzQwMF07XG4gIHZhcnNbJy0tbmd4c21rLWNvbG9yLW9uLXRlcnRpYXJ5J10gPSB0ZXJ0aWFyeVs5NTBdO1xuICB2YXJzWyctLW5neHNtay1jb2xvci10ZXJ0aWFyeS1jb250YWluZXInXSA9IHRlcnRpYXJ5WzkwMF07XG4gIHZhcnNbJy0tbmd4c21rLWNvbG9yLW9uLXRlcnRpYXJ5LWNvbnRhaW5lciddID0gdGVydGlhcnlbMTAwXTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBoZXhdIG9mIE9iamVjdC5lbnRyaWVzKHRoZW1lLnNlbWFudGljKSkge1xuICAgIGNvbnN0IHNjYWxlID0gZGVyaXZlU2NhbGUoaGV4KTtcbiAgICB2YXJzW2AtLW5neHNtay1jb2xvci0ke25hbWV9YF0gPSBzY2FsZVs0MDBdO1xuICAgIHZhcnNbYC0tbmd4c21rLWNvbG9yLW9uLSR7bmFtZX1gXSA9IHNjYWxlWzk1MF07XG4gICAgdmFyc1tgLS1uZ3hzbWstY29sb3ItJHtuYW1lfS1jb250YWluZXJgXSA9IHNjYWxlWzk1MF07XG4gICAgdmFyc1tgLS1uZ3hzbWstY29sb3Itb24tJHtuYW1lfS1jb250YWluZXJgXSA9IHNjYWxlWzMwMF07XG4gIH1cblxuICByZXR1cm4geyAuLi52YXJzLCAuLi50aGVtZS5vdmVycmlkZXMuZGFyayB9O1xufVxuXG5mdW5jdGlvbiBibG9jayhzZWxlY3Rvcjogc3RyaW5nLCB2YXJzOiBWYXJzLCBpbmRlbnQgPSAnJyk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gT2JqZWN0LmVudHJpZXModmFycykubWFwKChbbmFtZSwgdmFsdWVdKSA9PiBgJHtpbmRlbnR9ICAke25hbWV9OiAke3ZhbHVlfTtgKTtcbiAgcmV0dXJuIGAke2luZGVudH0ke3NlbGVjdG9yfSB7XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2luZGVudH19YDtcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYSB0aGVtZSBjb25maWcgaW50byBhIENTUyBzdHlsZXNoZWV0IG9mIGAtLW5neHNtay0qYCBjdXN0b21cbiAqIHByb3BlcnRpZXMuIEVtaXRzIHN0YXRpYyB0b2tlbnMgcGx1cyBsaWdodC1tb2RlIHJvbGVzIG9uIGA6cm9vdGAsIGFuZFxuICogZGFyay1tb2RlIHJvbGVzIGFjY29yZGluZyB0byB0aGUgY29uZmlndXJlZCBkYXJrLW1vZGUgc3RyYXRlZ3kuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFRoZW1lQ3NzKGNvbmZpZzogVGhlbWVDb25maWcgfCBSZXNvbHZlZFRoZW1lKTogc3RyaW5nIHtcbiAgY29uc3QgdGhlbWUgPVxuICAgICdicmFuZCcgaW4gY29uZmlnICYmICdzcGFjaW5nJyBpbiAoY29uZmlnIGFzIG9iamVjdClcbiAgICAgID8gKGNvbmZpZyBhcyBSZXNvbHZlZFRoZW1lKVxuICAgICAgOiByZXNvbHZlVGhlbWUoY29uZmlnIGFzIFRoZW1lQ29uZmlnKTtcblxuICBjb25zdCByb290ID0gYmxvY2soJzpyb290JywgeyAuLi5zdGF0aWNWYXJzKHRoZW1lKSwgLi4ubGlnaHRWYXJzKHRoZW1lKSB9KTtcbiAgY29uc3QgZGFyayA9IGRhcmtWYXJzKHRoZW1lKTtcblxuICBsZXQgZGFya0Jsb2NrOiBzdHJpbmc7XG4gIHN3aXRjaCAodGhlbWUuZGFya01vZGUuc3RyYXRlZ3kpIHtcbiAgICBjYXNlICdtZWRpYSc6XG4gICAgICBkYXJrQmxvY2sgPSBgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykge1xcbiR7YmxvY2soJzpyb290JywgZGFyaywgJyAgJyl9XFxufWA7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzeXN0ZW0nOiB7XG4gICAgICAvLyBgbGlnaHQtZGFyaygpYCBzdXBwb3J0IGlzIHBlci1wcm9wZXJ0eTsgdGhlIGNsYXNzIGJsb2NrIHN0aWxsIHNlcnZlc1xuICAgICAgLy8gYXMgdGhlIG92ZXJyaWRlIGhvb2ssIHNvIGBzeXN0ZW1gIGJlaGF2ZXMgYXMgbWVkaWEgKyBjbGFzcy5cbiAgICAgIGNvbnN0IGNuID0gdGhlbWUuZGFya01vZGUuY2xhc3NOYW1lO1xuICAgICAgZGFya0Jsb2NrID0gW1xuICAgICAgICBgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykge1xcbiR7YmxvY2soJzpyb290JywgZGFyaywgJyAgJyl9XFxufWAsXG4gICAgICAgIGJsb2NrKGA6cm9vdC4ke2NufSwgOnJvb3QuJHtjbn0gYm9keSwgLiR7Y259YCwgZGFyayksXG4gICAgICBdLmpvaW4oJ1xcblxcbicpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIC8vIGA6cm9vdC48Y2xhc3M+YCAoc3BlY2lmaWNpdHkgMCwyLDApIHBsdXMgYSBgYm9keWAgdmFyaWFudCBkZWZlbmQgdGhlXG4gICAgICAvLyBkYXJrIHRva2VucyBhZ2FpbnN0IHRoaXJkLXBhcnR5IHN0eWxlc2hlZXRzIHRoYXQgcmVkZWZpbmUgYC0tbmd4c21rLSpgXG4gICAgICAvLyBvbiBhIHBsYWluIGA6cm9vdGAgKDAsMSwwKSDigJQgdGhvc2Ugd291bGQgb3RoZXJ3aXNlIHdpbiBieSBzb3VyY2Ugb3JkZXJcbiAgICAgIC8vIHdoZW4gaW5qZWN0ZWQgaW50byA8aGVhZD4gYWZ0ZXIgdGhpcyBzaGVldC4gVGhlIGJhcmUgYC48Y2xhc3M+YCBrZWVwc1xuICAgICAgLy8gc2NvcGVkIChub24tcm9vdCkgZGFyayByZWdpb25zIHdvcmtpbmcuXG4gICAgICBjb25zdCBjbiA9IHRoZW1lLmRhcmtNb2RlLmNsYXNzTmFtZTtcbiAgICAgIGRhcmtCbG9jayA9IGJsb2NrKGA6cm9vdC4ke2NufSwgOnJvb3QuJHtjbn0gYm9keSwgLiR7Y259YCwgZGFyayk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVkdWNlZE1vdGlvbiA9IGBAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkge1xcbiAgOnJvb3Qge1xcbiAgICAtLW5neHNtay1tb3Rpb24tZHVyYXRpb246IDBtcztcXG4gIH1cXG59YDtcbiAgcmV0dXJuIGAvKiBHZW5lcmF0ZWQgYnkgQG5neHNtay90aGVtZSDigJQgZG8gbm90IGVkaXQgYnkgaGFuZC4gKi9cXG4ke3Jvb3R9XFxuXFxuJHtkYXJrQmxvY2t9XFxuXFxuJHtyZWR1Y2VkTW90aW9ufVxcbmA7XG59XG4iXX0=
@@ -0,0 +1,44 @@
1
+ import { deriveScale, rotateHue } 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
+ const secondaryBase = config.brand.secondary ?? rotateHue(config.brand.primary, 60);
17
+ return {
18
+ name: config.name ?? 'custom',
19
+ brandBase: config.brand.primary,
20
+ brand: config.brand.primaryScale ?? deriveScale(config.brand.primary),
21
+ secondaryBase,
22
+ secondary: config.brand.secondaryScale ?? deriveScale(secondaryBase),
23
+ neutral: config.neutral ?? DEFAULT_NEUTRAL,
24
+ semantic: { ...DEFAULT_SEMANTIC, ...config.semantic },
25
+ fontFamily: { ...DEFAULT_FONT_FAMILY, ...config.typography?.fontFamily },
26
+ typography: DEFAULT_TYPOGRAPHY,
27
+ spacing: SPACING,
28
+ radius: RADIUS,
29
+ radiusBase: config.borderRadius ?? 'md',
30
+ shadow: SHADOW,
31
+ duration: DURATION,
32
+ easing: EASING,
33
+ zIndex: Z_INDEX,
34
+ darkMode: {
35
+ strategy: config.darkMode?.strategy ?? 'class',
36
+ className: config.darkMode?.className ?? 'dark',
37
+ },
38
+ overrides: {
39
+ light: config.overrides?.light ?? {},
40
+ dark: config.overrides?.dark ?? {},
41
+ },
42
+ };
43
+ }
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5lLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3RoZW1lL3NyYy9saWIvZGVmaW5lLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLE1BQU0sRUFDTixPQUFPLEVBQ1AsT0FBTyxHQUNSLE1BQU0sVUFBVSxDQUFDO0FBR2xCOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLE1BQW1CO0lBQzlDLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxxRUFBcUU7QUFDckUsTUFBTSxVQUFVLFlBQVksQ0FBQyxNQUFtQjtJQUM5QyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDcEYsT0FBTztRQUNMLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxJQUFJLFFBQVE7UUFDN0IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTztRQUMvQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ3JFLGFBQWE7UUFDYixTQUFTLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLElBQUksV0FBVyxDQUFDLGFBQWEsQ0FBQztRQUNwRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sSUFBSSxlQUFlO1FBQzFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsZ0JBQWdCLEVBQUUsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFO1FBQ3JELFVBQVUsRUFBRSxFQUFFLEdBQUcsbUJBQW1CLEVBQUUsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRTtRQUN4RSxVQUFVLEVBQUUsa0JBQWtCO1FBQzlCLE9BQU8sRUFBRSxPQUFPO1FBQ2hCLE1BQU0sRUFBRSxNQUFNO1FBQ2QsVUFBVSxFQUFFLE1BQU0sQ0FBQyxZQUFZLElBQUksSUFBSTtRQUN2QyxNQUFNLEVBQUUsTUFBTTtRQUNkLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLE1BQU0sRUFBRSxNQUFNO1FBQ2QsTUFBTSxFQUFFLE9BQU87UUFDZixRQUFRLEVBQUU7WUFDUixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFRLElBQUksT0FBTztZQUM5QyxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxTQUFTLElBQUksTUFBTTtTQUNoRDtRQUNELFNBQVMsRUFBRTtZQUNULEtBQUssRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3BDLElBQUksRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO1NBQ25DO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXJpdmVTY2FsZSwgcm90YXRlSHVlIH0gZnJvbSAnLi9jb2xvcic7XG5pbXBvcnQge1xuICBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICBERUZBVUxUX05FVVRSQUwsXG4gIERFRkFVTFRfU0VNQU5USUMsXG4gIERFRkFVTFRfVFlQT0dSQVBIWSxcbiAgRFVSQVRJT04sXG4gIEVBU0lORyxcbiAgUkFESVVTLFxuICBTSEFET1csXG4gIFNQQUNJTkcsXG4gIFpfSU5ERVgsXG59IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7IFJlc29sdmVkVGhlbWUsIFRoZW1lQ29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogSWRlbnRpdHkgaGVscGVyIHRoYXQgZ2l2ZXMgYG5neHNtay5jb25maWcudHNgIGZpbGVzIGZ1bGwgdHlwZSBpbmZlcmVuY2U6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ0BuZ3hzbWsvdGhlbWUnO1xuICogZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHsgYnJhbmQ6IHsgcHJpbWFyeTogJyM3QzNBRUQnIH0gfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUNvbmZpZyhjb25maWc6IFRoZW1lQ29uZmlnKTogVGhlbWVDb25maWcge1xuICByZXR1cm4gY29uZmlnO1xufVxuXG4vKiogTWVyZ2UgYSB1c2VyIGNvbmZpZyB3aXRoIGRlZmF1bHRzIGFuZCBkZXJpdmUgYWxsIGNvbG9yIHNjYWxlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVGhlbWUoY29uZmlnOiBUaGVtZUNvbmZpZyk6IFJlc29sdmVkVGhlbWUge1xuICBjb25zdCBzZWNvbmRhcnlCYXNlID0gY29uZmlnLmJyYW5kLnNlY29uZGFyeSA/PyByb3RhdGVIdWUoY29uZmlnLmJyYW5kLnByaW1hcnksIDYwKTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBjb25maWcubmFtZSA/PyAnY3VzdG9tJyxcbiAgICBicmFuZEJhc2U6IGNvbmZpZy5icmFuZC5wcmltYXJ5LFxuICAgIGJyYW5kOiBjb25maWcuYnJhbmQucHJpbWFyeVNjYWxlID8/IGRlcml2ZVNjYWxlKGNvbmZpZy5icmFuZC5wcmltYXJ5KSxcbiAgICBzZWNvbmRhcnlCYXNlLFxuICAgIHNlY29uZGFyeTogY29uZmlnLmJyYW5kLnNlY29uZGFyeVNjYWxlID8/IGRlcml2ZVNjYWxlKHNlY29uZGFyeUJhc2UpLFxuICAgIG5ldXRyYWw6IGNvbmZpZy5uZXV0cmFsID8/IERFRkFVTFRfTkVVVFJBTCxcbiAgICBzZW1hbnRpYzogeyAuLi5ERUZBVUxUX1NFTUFOVElDLCAuLi5jb25maWcuc2VtYW50aWMgfSxcbiAgICBmb250RmFtaWx5OiB7IC4uLkRFRkFVTFRfRk9OVF9GQU1JTFksIC4uLmNvbmZpZy50eXBvZ3JhcGh5Py5mb250RmFtaWx5IH0sXG4gICAgdHlwb2dyYXBoeTogREVGQVVMVF9UWVBPR1JBUEhZLFxuICAgIHNwYWNpbmc6IFNQQUNJTkcsXG4gICAgcmFkaXVzOiBSQURJVVMsXG4gICAgcmFkaXVzQmFzZTogY29uZmlnLmJvcmRlclJhZGl1cyA/PyAnbWQnLFxuICAgIHNoYWRvdzogU0hBRE9XLFxuICAgIGR1cmF0aW9uOiBEVVJBVElPTixcbiAgICBlYXNpbmc6IEVBU0lORyxcbiAgICB6SW5kZXg6IFpfSU5ERVgsXG4gICAgZGFya01vZGU6IHtcbiAgICAgIHN0cmF0ZWd5OiBjb25maWcuZGFya01vZGU/LnN0cmF0ZWd5ID8/ICdjbGFzcycsXG4gICAgICBjbGFzc05hbWU6IGNvbmZpZy5kYXJrTW9kZT8uY2xhc3NOYW1lID8/ICdkYXJrJyxcbiAgICB9LFxuICAgIG92ZXJyaWRlczoge1xuICAgICAgbGlnaHQ6IGNvbmZpZy5vdmVycmlkZXM/LmxpZ2h0ID8/IHt9LFxuICAgICAgZGFyazogY29uZmlnLm92ZXJyaWRlcz8uZGFyayA/PyB7fSxcbiAgICB9LFxuICB9O1xufVxuIl19
@@ -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==