@peripheries/renderer 0.6.2 → 0.7.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.
Files changed (36) hide show
  1. package/README.md +11 -1
  2. package/dist/chunks/{load-6zEgvJ6I.js → load-CTAaQSl-.js} +3 -2
  3. package/dist/chunks/load-CTAaQSl-.js.map +1 -0
  4. package/dist/chunks/page-bundles-Eaw5mYKS.js +33 -0
  5. package/dist/chunks/page-bundles-Eaw5mYKS.js.map +1 -0
  6. package/dist/chunks/{projection-Cd0DxvWm.js → projection-BfojIUtA.js} +16 -4
  7. package/dist/chunks/projection-BfojIUtA.js.map +1 -0
  8. package/dist/chunks/{page-bundles-C4VW3dsK.js → refs-CiWBdUpZ.js} +10 -32
  9. package/dist/chunks/refs-CiWBdUpZ.js.map +1 -0
  10. package/dist/core.js +5 -4
  11. package/dist/core.js.map +1 -1
  12. package/dist/react.js +2 -1
  13. package/dist/react.js.map +1 -1
  14. package/dist/runtime.js +9 -3
  15. package/dist/runtime.js.map +1 -1
  16. package/dist/styles.css +50 -45
  17. package/dist/testing.js +4 -3
  18. package/dist/testing.js.map +1 -1
  19. package/dist/theme.js +609 -0
  20. package/dist/theme.js.map +1 -0
  21. package/dist/types/core/bundles/load.d.ts +7 -0
  22. package/dist/types/core/bundles/refs.d.ts +22 -1
  23. package/dist/types/core/bundles/resolve.d.ts +7 -6
  24. package/dist/types/core/index.d.ts +1 -1
  25. package/dist/types/core/layout.d.ts +7 -0
  26. package/dist/types/runtime/boot.d.ts +12 -1
  27. package/dist/types/runtime/index.d.ts +1 -1
  28. package/dist/types/theme/check.d.ts +6 -0
  29. package/dist/types/theme/color.d.ts +29 -0
  30. package/dist/types/theme/derive.d.ts +18 -0
  31. package/dist/types/theme/index.d.ts +5 -0
  32. package/dist/types/theme/parse.d.ts +22 -0
  33. package/package.json +6 -2
  34. package/dist/chunks/load-6zEgvJ6I.js.map +0 -1
  35. package/dist/chunks/page-bundles-C4VW3dsK.js.map +0 -1
  36. package/dist/chunks/projection-Cd0DxvWm.js.map +0 -1
package/dist/theme.js ADDED
@@ -0,0 +1,609 @@
1
+ import { SEMANTIC_TOKENS } from "@peripheries/runtime";
2
+ //#region packages/renderer/src/theme/color.ts
3
+ var NUMBER = /^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i;
4
+ var clamp01 = (n) => Math.min(1, Math.max(0, n));
5
+ function hexColor(value) {
6
+ const hex = value.slice(1);
7
+ if (!/^[0-9a-f]+$/i.test(hex) || ![
8
+ 3,
9
+ 4,
10
+ 6,
11
+ 8
12
+ ].includes(hex.length)) return null;
13
+ const full = hex.length <= 4 ? [...hex].map((c) => c + c).join("") : hex;
14
+ const at = (i) => parseInt(full.slice(i, i + 2), 16) / 255;
15
+ return {
16
+ r: at(0),
17
+ g: at(2),
18
+ b: at(4),
19
+ alpha: full.length === 8 ? at(6) : 1
20
+ };
21
+ }
22
+ function component(token, percent) {
23
+ if (token.toLowerCase() === "none") return 0;
24
+ if (token.endsWith("%")) return NUMBER.test(token.slice(0, -1)) ? Number(token.slice(0, -1)) / 100 * percent : null;
25
+ return NUMBER.test(token) ? Number(token) : null;
26
+ }
27
+ function hue(token) {
28
+ const match = /^(.*?)(deg|grad|rad|turn)?$/i.exec(token);
29
+ const n = match ? component(match[1], NaN) : null;
30
+ if (!match || n === null || Number.isNaN(n)) return null;
31
+ const unit = match[2]?.toLowerCase();
32
+ return ((unit === "rad" ? n * 180 / Math.PI : unit === "grad" ? n * .9 : unit === "turn" ? n * 360 : n) % 360 + 360) % 360;
33
+ }
34
+ function hslToRgb(h, s, l) {
35
+ const f = (n) => {
36
+ const k = (n + h / 30) % 12;
37
+ return l - s * Math.min(l, 1 - l) * Math.max(-1, Math.min(k - 3, 9 - k, 1));
38
+ };
39
+ return [
40
+ f(0),
41
+ f(8),
42
+ f(4)
43
+ ];
44
+ }
45
+ function functionColor(value) {
46
+ const match = /^(rgba?|hsla?|oklch)\((.*)\)$/i.exec(value);
47
+ if (!match) return null;
48
+ const name = match[1].toLowerCase();
49
+ const inner = match[2].trim();
50
+ let channels;
51
+ let alphaToken;
52
+ if (inner.includes(",")) {
53
+ const parts = inner.split(",").map((p) => p.trim());
54
+ if (parts.length < 3 || parts.length > 4) return null;
55
+ channels = parts.slice(0, 3);
56
+ alphaToken = parts[3];
57
+ } else {
58
+ const [main, alpha, ...rest] = inner.split("/");
59
+ if (rest.length) return null;
60
+ channels = main.trim().split(/\s+/);
61
+ alphaToken = alpha?.trim();
62
+ if (channels.length !== 3) return null;
63
+ }
64
+ const alpha = alphaToken === void 0 ? 1 : component(alphaToken, 1);
65
+ if (alpha === null) return null;
66
+ if (name.startsWith("rgb")) {
67
+ const [r, g, b] = channels.map((c) => component(c, 255));
68
+ if (r === null || g === null || b === null) return null;
69
+ return {
70
+ r: clamp01(r / 255),
71
+ g: clamp01(g / 255),
72
+ b: clamp01(b / 255),
73
+ alpha: clamp01(alpha)
74
+ };
75
+ }
76
+ if (name.startsWith("hsl")) {
77
+ const h = hue(channels[0]);
78
+ const s = component(channels[1], 100);
79
+ const l = component(channels[2], 100);
80
+ if (h === null || s === null || l === null) return null;
81
+ const [r, g, b] = hslToRgb(h, clamp01(s / 100), clamp01(l / 100));
82
+ return {
83
+ r: clamp01(r),
84
+ g: clamp01(g),
85
+ b: clamp01(b),
86
+ alpha: clamp01(alpha)
87
+ };
88
+ }
89
+ const l = component(channels[0], 1);
90
+ const c = component(channels[1], .4);
91
+ const h = hue(channels[2]);
92
+ if (l === null || c === null || h === null) return null;
93
+ return {
94
+ ...fromOklch({
95
+ l: clamp01(l),
96
+ c: Math.max(0, c),
97
+ h
98
+ }),
99
+ alpha: clamp01(alpha)
100
+ };
101
+ }
102
+ function parseColor(value) {
103
+ const v = value.trim();
104
+ if (!v) return null;
105
+ return v.startsWith("#") ? hexColor(v) : functionColor(v);
106
+ }
107
+ function toHex(color) {
108
+ const byte = (n) => Math.round(clamp01(n) * 255).toString(16).padStart(2, "0");
109
+ return `#${byte(color.r)}${byte(color.g)}${byte(color.b)}${color.alpha < 1 ? byte(color.alpha) : ""}`;
110
+ }
111
+ var toLinear = (c) => c <= .04045 ? c / 12.92 : ((c + .055) / 1.055) ** 2.4;
112
+ var fromLinear = (c) => c <= .0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - .055;
113
+ function toOklch(color) {
114
+ const r = toLinear(color.r);
115
+ const g = toLinear(color.g);
116
+ const b = toLinear(color.b);
117
+ const l_ = Math.cbrt(.4122214708 * r + .5363325363 * g + .0514459929 * b);
118
+ const m_ = Math.cbrt(.2119034982 * r + .6806995451 * g + .1073969566 * b);
119
+ const s_ = Math.cbrt(.0883024619 * r + .2817188376 * g + .6299787005 * b);
120
+ const L = .2104542553 * l_ + .793617785 * m_ - .0040720468 * s_;
121
+ const A = 1.9779984951 * l_ - 2.428592205 * m_ + .4505937099 * s_;
122
+ const B = .0259040371 * l_ + .7827717662 * m_ - .808675766 * s_;
123
+ const c = Math.hypot(A, B);
124
+ return {
125
+ l: L,
126
+ c: c < 1e-6 ? 0 : c,
127
+ h: c < 1e-6 ? 0 : (Math.atan2(B, A) * 180 / Math.PI + 360) % 360
128
+ };
129
+ }
130
+ function oklchToLinear({ l, c, h }) {
131
+ const A = c * Math.cos(h * Math.PI / 180);
132
+ const B = c * Math.sin(h * Math.PI / 180);
133
+ const lc = (l + .3963377774 * A + .2158037573 * B) ** 3;
134
+ const mc = (l - .1055613458 * A - .0638541728 * B) ** 3;
135
+ const sc = (l - .0894841775 * A - 1.291485548 * B) ** 3;
136
+ return [
137
+ 4.0767416621 * lc - 3.3077115913 * mc + .2309699292 * sc,
138
+ -1.2684380046 * lc + 2.6097574011 * mc - .3413193965 * sc,
139
+ -.0041960863 * lc - .7034186147 * mc + 1.707614701 * sc
140
+ ];
141
+ }
142
+ var inGamut = (rgb) => rgb.every((c) => c >= -1e-4 && c <= 1.0001);
143
+ function fromOklch(color) {
144
+ const l = clamp01(color.l);
145
+ let linear = oklchToLinear({
146
+ ...color,
147
+ l
148
+ });
149
+ if (!inGamut(linear)) {
150
+ let lo = 0;
151
+ let hi = Math.max(0, color.c);
152
+ for (let i = 0; i < 24; i++) {
153
+ const mid = (lo + hi) / 2;
154
+ if (inGamut(oklchToLinear({
155
+ l,
156
+ c: mid,
157
+ h: color.h
158
+ }))) lo = mid;
159
+ else hi = mid;
160
+ }
161
+ linear = oklchToLinear({
162
+ l,
163
+ c: lo,
164
+ h: color.h
165
+ });
166
+ }
167
+ const [r, g, b] = linear.map((c) => clamp01(fromLinear(clamp01(c))));
168
+ return {
169
+ r,
170
+ g,
171
+ b,
172
+ alpha: 1
173
+ };
174
+ }
175
+ function relativeLuminance(color) {
176
+ return .2126 * toLinear(color.r) + .7152 * toLinear(color.g) + .0722 * toLinear(color.b);
177
+ }
178
+ var over = (top, under) => {
179
+ const mix = (a, b) => a * top.alpha + b * (1 - top.alpha);
180
+ return {
181
+ r: mix(top.r, under.r),
182
+ g: mix(top.g, under.g),
183
+ b: mix(top.b, under.b),
184
+ alpha: 1
185
+ };
186
+ };
187
+ var WHITE = {
188
+ r: 1,
189
+ g: 1,
190
+ b: 1,
191
+ alpha: 1
192
+ };
193
+ function contrastRatio(foreground, background) {
194
+ const fg = typeof foreground === "string" ? parseColor(foreground) : foreground;
195
+ const bgRaw = typeof background === "string" ? parseColor(background) : background;
196
+ if (!fg || !bgRaw) return null;
197
+ const bg = bgRaw.alpha < 1 ? over(bgRaw, WHITE) : bgRaw;
198
+ const a = relativeLuminance(fg.alpha < 1 ? over(fg, bg) : fg);
199
+ const b = relativeLuminance(bg);
200
+ return (Math.max(a, b) + .05) / (Math.min(a, b) + .05);
201
+ }
202
+ //#endregion
203
+ //#region packages/renderer/src/theme/parse.ts
204
+ var SEMANTIC = new Set(SEMANTIC_TOKENS);
205
+ var UNSAFE = /[<>{};\\]|\/\*|\*\/|[\u0000-\u001f\u007f]/;
206
+ var isSafeCssValue = (value) => value.trim() !== "" && !UNSAFE.test(value);
207
+ var LENGTH = /^(0|(\d+\.?\d*|\.\d+)(px|rem|em))$/;
208
+ var VAR_REF = /^var\(\s*--([a-z0-9-]+)\s*(?:,\s*(.*))?\)$/i;
209
+ var isColorToken = (name) => name.startsWith("color-") || name.startsWith("chart-");
210
+ var isObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
211
+ function bad(read, path, message) {
212
+ read.diagnostics.push({
213
+ code: "THEME_BAD_VALUE",
214
+ path,
215
+ message,
216
+ severity: "error"
217
+ });
218
+ }
219
+ function unknownKey(read, path) {
220
+ read.diagnostics.push({
221
+ code: "THEME_UNKNOWN_KEY",
222
+ path,
223
+ message: `"${path}" is not a theme key; it is ignored`,
224
+ severity: "warning"
225
+ });
226
+ }
227
+ function readColor(read, path, value) {
228
+ if (typeof value === "string" && isSafeCssValue(value) && parseColor(value)) return value.trim();
229
+ bad(read, path, `${JSON.stringify(value)} is not a colour (hex, rgb(), hsl() or oklch())`);
230
+ }
231
+ function readFont(read, path, value) {
232
+ if (typeof value === "string" && isSafeCssValue(value) && value.length <= 300) return value.trim();
233
+ bad(read, path, `${JSON.stringify(value)} is not a font stack`);
234
+ }
235
+ function readLength(read, path, value) {
236
+ const v = typeof value === "number" && value === 0 ? "0" : typeof value === "string" ? value.trim() : null;
237
+ if (v !== null && LENGTH.test(v)) return v;
238
+ bad(read, path, `${JSON.stringify(value)} is not a length (px, rem, em or 0)`);
239
+ }
240
+ function readToken(read, name, value) {
241
+ const path = `tokens.${name}`;
242
+ const v = typeof value === "number" && Number.isFinite(value) ? String(value) : typeof value === "string" ? value.trim() : null;
243
+ if (v === null || !isSafeCssValue(v) || v.length > 300) return void bad(read, path, `${JSON.stringify(value)} is not a usable CSS value`);
244
+ if (isColorToken(name) && !VAR_REF.test(v) && !parseColor(v)) return void bad(read, path, `${JSON.stringify(value)} is not a colour or a var() reference`);
245
+ return v;
246
+ }
247
+ function readTokens(read, raw) {
248
+ if (!isObject(raw)) return bad(read, "tokens", "tokens must be an object of semantic token names to values");
249
+ const tokens = {};
250
+ for (const [key, value] of Object.entries(raw)) {
251
+ const name = key.replace(/^--/, "");
252
+ if (!SEMANTIC.has(name)) {
253
+ read.diagnostics.push({
254
+ code: "THEME_UNKNOWN_TOKEN",
255
+ path: `tokens.${key}`,
256
+ message: `"${key}" is not a semantic token; it is ignored`,
257
+ severity: "warning"
258
+ });
259
+ continue;
260
+ }
261
+ const v = readToken(read, name, value);
262
+ if (v !== void 0) tokens[name] = v;
263
+ }
264
+ if (Object.keys(tokens).length) read.theme.tokens = {
265
+ ...read.theme.tokens,
266
+ ...tokens
267
+ };
268
+ }
269
+ function readGroup(read, path, raw, keys, each) {
270
+ if (!isObject(raw)) return void bad(read, path, `${path} must be an object`);
271
+ const out = {};
272
+ for (const [key, value] of Object.entries(raw)) if (!keys.includes(key)) unknownKey(read, `${path}.${key}`);
273
+ else if (value !== void 0 && value !== null) {
274
+ const v = each(read, `${path}.${key}`, value);
275
+ if (v !== void 0) out[key] = v;
276
+ }
277
+ return Object.keys(out).length ? out : void 0;
278
+ }
279
+ function readV2(read, raw) {
280
+ for (const [key, value] of Object.entries(raw)) {
281
+ if (value === void 0 || value === null || key === "version") continue;
282
+ switch (key) {
283
+ case "brand":
284
+ case "accent":
285
+ case "neutral": {
286
+ const v = readColor(read, key, value);
287
+ if (v) read.theme[key] = v;
288
+ break;
289
+ }
290
+ case "fonts": {
291
+ const fonts = readGroup(read, key, value, [
292
+ "body",
293
+ "heading",
294
+ "mono"
295
+ ], readFont);
296
+ if (fonts) read.theme.fonts = fonts;
297
+ break;
298
+ }
299
+ case "size": {
300
+ const size = readGroup(read, key, value, [
301
+ "text",
302
+ "space",
303
+ "radius"
304
+ ], readLength);
305
+ if (size) read.theme.size = size;
306
+ break;
307
+ }
308
+ case "scheme":
309
+ if (value === "light" || value === "auto") read.theme.scheme = value;
310
+ else bad(read, key, `${JSON.stringify(value)} is not a scheme ("light" or "auto")`);
311
+ break;
312
+ case "tokens":
313
+ readTokens(read, value);
314
+ break;
315
+ default: unknownKey(read, key);
316
+ }
317
+ }
318
+ }
319
+ var V1_IGNORED = /^(sidebar_|header_|user_button_|secondary_color$|logo_url$)/;
320
+ var snake = (key) => key.replace(/([a-z0-9])([A-Z])/g, "$1_$2").toLowerCase();
321
+ function readV1(read, raw) {
322
+ for (const [key, value] of Object.entries(raw)) {
323
+ if (value === void 0 || value === null || key === "version") continue;
324
+ const name = snake(key);
325
+ switch (name) {
326
+ case "primary_color": {
327
+ const v = readColor(read, key, value);
328
+ if (v) read.theme.brand = v;
329
+ break;
330
+ }
331
+ case "accent_color": {
332
+ const v = readColor(read, key, value);
333
+ if (v) read.theme.accent = v;
334
+ break;
335
+ }
336
+ case "background_color": {
337
+ const v = readColor(read, key, value);
338
+ if (v) read.theme.neutral = v;
339
+ break;
340
+ }
341
+ case "text_color": {
342
+ const v = readColor(read, key, value);
343
+ if (v) read.theme.tokens = {
344
+ ...read.theme.tokens,
345
+ "color-text": v
346
+ };
347
+ break;
348
+ }
349
+ case "font_family": {
350
+ const v = readFont(read, key, value);
351
+ if (v) read.theme.fonts = {
352
+ ...read.theme.fonts,
353
+ body: v
354
+ };
355
+ break;
356
+ }
357
+ default: if (!V1_IGNORED.test(name)) unknownKey(read, key);
358
+ }
359
+ }
360
+ }
361
+ function parseTheme(raw) {
362
+ const read = {
363
+ theme: { version: 2 },
364
+ diagnostics: []
365
+ };
366
+ if (!isObject(raw)) {
367
+ read.diagnostics.push({
368
+ code: "THEME_NOT_OBJECT",
369
+ path: "",
370
+ message: `the theme must be an object, not ${raw === null ? "null" : Array.isArray(raw) ? "an array" : typeof raw}`,
371
+ severity: "error"
372
+ });
373
+ return read;
374
+ }
375
+ const version = raw.version;
376
+ if (version === 2) readV2(read, raw);
377
+ else if (version === void 0 || version === null || version === 1) readV1(read, raw);
378
+ else {
379
+ bad(read, "version", `${JSON.stringify(version)} is not a theme version (1 or 2); read as version 2`);
380
+ readV2(read, raw);
381
+ }
382
+ return read;
383
+ }
384
+ //#endregion
385
+ //#region packages/renderer/src/theme/derive.ts
386
+ var FALLBACK_BASE = {
387
+ "color-bg": "#ffffff",
388
+ "color-text": "#0a0a0a"
389
+ };
390
+ var TEXT_CONTRAST = 4.5;
391
+ var UI_CONTRAST = 3;
392
+ var hex = (lch) => toHex(fromOklch(lch));
393
+ var clampL = (l) => Math.min(1, Math.max(0, l));
394
+ function resolveColor(value, tokens, depth = 0) {
395
+ if (value === void 0 || depth > 8) return null;
396
+ const ref = VAR_REF.exec(value.trim());
397
+ if (!ref) return parseColor(value);
398
+ return resolveColor(tokens[ref[1]], tokens, depth + 1) ?? (ref[2] ? resolveColor(ref[2], tokens, depth + 1) : null);
399
+ }
400
+ function inkOn(color) {
401
+ const { c, h } = toOklch(color);
402
+ const [best, ratio] = [hex({
403
+ l: .97,
404
+ c: Math.min(c, .015),
405
+ h
406
+ }), hex({
407
+ l: .2,
408
+ c: Math.min(c, .03),
409
+ h
410
+ })].map((ink) => [ink, contrastRatio(ink, color) ?? 0]).reduce((a, b) => b[1] > a[1] ? b : a);
411
+ if (ratio >= TEXT_CONTRAST) return best;
412
+ return (contrastRatio("#ffffff", color) ?? 0) >= (contrastRatio("#000000", color) ?? 0) ? "#ffffff" : "#000000";
413
+ }
414
+ function readableOn(color, bg, min) {
415
+ const start = toHex(color);
416
+ if ((contrastRatio(start, bg) ?? 0) >= min) return start;
417
+ const lch = toOklch(color);
418
+ const step = toOklch(bg).l >= .5 ? -.01 : .01;
419
+ for (let l = lch.l + step; l >= 0 && l <= 1; l += step) {
420
+ const candidate = hex({
421
+ ...lch,
422
+ l
423
+ });
424
+ if ((contrastRatio(candidate, bg) ?? 0) >= min) return candidate;
425
+ }
426
+ return step < 0 ? "#000000" : "#ffffff";
427
+ }
428
+ function themeTokens(theme, base = {}) {
429
+ const out = {};
430
+ const explicit = { ...theme.tokens };
431
+ const neutral = theme.neutral ? parseColor(theme.neutral) : null;
432
+ if (neutral) {
433
+ const { l, c, h } = toOklch(neutral);
434
+ out["color-bg"] = toHex({
435
+ ...neutral,
436
+ alpha: 1
437
+ });
438
+ out["color-surface"] = hex({
439
+ l: clampL(l + .025),
440
+ c: c * .6,
441
+ h
442
+ });
443
+ out["color-surface-raised"] = hex({
444
+ l: clampL(l + .04),
445
+ c: c * .5,
446
+ h
447
+ });
448
+ out["color-surface-sunken"] = hex({
449
+ l: clampL(l - .04),
450
+ c: c * 1.2,
451
+ h
452
+ });
453
+ out["color-border"] = hex({
454
+ l: clampL(l - .11),
455
+ c: Math.min(c * 1.5, .05),
456
+ h
457
+ });
458
+ }
459
+ const merged = {
460
+ ...FALLBACK_BASE,
461
+ ...base,
462
+ ...out,
463
+ ...explicit
464
+ };
465
+ const bg = resolveColor(merged["color-bg"], merged) ?? parseColor(FALLBACK_BASE["color-bg"]);
466
+ const brand = theme.brand ? parseColor(theme.brand) : null;
467
+ if (brand) {
468
+ const solid = {
469
+ ...brand,
470
+ alpha: 1
471
+ };
472
+ out["color-brand"] = toHex(solid);
473
+ out["color-on-brand"] = inkOn(solid);
474
+ }
475
+ const accent = theme.accent ? parseColor(theme.accent) : null;
476
+ if (accent) {
477
+ const solid = {
478
+ ...accent,
479
+ alpha: 1
480
+ };
481
+ const { c, h } = toOklch(solid);
482
+ out["color-accent"] = toHex(solid);
483
+ out["color-on-accent"] = inkOn(solid);
484
+ out["color-accent-surface"] = hex({
485
+ l: .95,
486
+ c: Math.min(c * .25, .035),
487
+ h
488
+ });
489
+ out["color-link"] = readableOn(solid, bg, TEXT_CONTRAST);
490
+ out["color-focus"] = readableOn(solid, bg, UI_CONTRAST);
491
+ }
492
+ const { body, heading = body, mono } = theme.fonts ?? {};
493
+ if (body) out["font-body"] = body;
494
+ if (heading) out["font-heading"] = heading;
495
+ if (mono) out["font-mono"] = mono;
496
+ if (theme.size?.text) out["text-base"] = theme.size.text;
497
+ if (theme.size?.space) out["space-unit"] = theme.size.space;
498
+ if (theme.size?.radius) out["radius-base"] = theme.size.radius;
499
+ return {
500
+ ...out,
501
+ ...explicit
502
+ };
503
+ }
504
+ function themeCss(theme, base) {
505
+ const lines = Object.entries(themeTokens(theme, base)).filter(([name, value]) => /^[a-z0-9-]+$/.test(name) && typeof value === "string" && isSafeCssValue(value)).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([name, value]) => ` --${name}: ${value.trim()};`);
506
+ return lines.length ? `@layer theme {\n :root {\n${lines.join("\n")}\n }\n}\n` : "";
507
+ }
508
+ //#endregion
509
+ //#region packages/renderer/src/theme/check.ts
510
+ var CONTRAST_PAIRS = [
511
+ [
512
+ "color-text",
513
+ "color-bg",
514
+ 4.5
515
+ ],
516
+ [
517
+ "color-text",
518
+ "color-surface",
519
+ 4.5
520
+ ],
521
+ [
522
+ "color-text-muted",
523
+ "color-bg",
524
+ 4.5
525
+ ],
526
+ [
527
+ "color-text-muted",
528
+ "color-surface",
529
+ 4.5
530
+ ],
531
+ [
532
+ "color-text-subtle",
533
+ "color-bg",
534
+ 4.5
535
+ ],
536
+ [
537
+ "color-on-brand",
538
+ "color-brand",
539
+ 4.5
540
+ ],
541
+ [
542
+ "color-on-accent",
543
+ "color-accent",
544
+ 4.5
545
+ ],
546
+ [
547
+ "color-link",
548
+ "color-bg",
549
+ 4.5
550
+ ],
551
+ ...[
552
+ "info",
553
+ "success",
554
+ "warning",
555
+ "danger"
556
+ ].flatMap((status) => [[
557
+ `color-${status}`,
558
+ "color-bg",
559
+ 3
560
+ ], [
561
+ `color-on-${status}`,
562
+ `color-${status}`,
563
+ 4.5
564
+ ]]),
565
+ [
566
+ "color-focus",
567
+ "color-bg",
568
+ 3
569
+ ],
570
+ [
571
+ "color-border-strong",
572
+ "color-bg",
573
+ 3
574
+ ]
575
+ ];
576
+ var DARK_NEUTRAL = .5;
577
+ function checkTheme(theme, base = {}) {
578
+ const tier = {
579
+ ...FALLBACK_BASE,
580
+ ...base,
581
+ ...themeTokens(theme, base)
582
+ };
583
+ const diagnostics = [];
584
+ const neutral = theme.neutral ? parseColor(theme.neutral) : null;
585
+ if (neutral && toOklch(neutral).l < DARK_NEUTRAL) diagnostics.push({
586
+ code: "THEME_CONTRAST",
587
+ path: "neutral",
588
+ message: `neutral ${theme.neutral} is dark; the light scheme keeps dark ink on it (set the color-text tokens, or wait for the dark scheme)`,
589
+ severity: "warning"
590
+ });
591
+ for (const [fgName, bgName, min] of CONTRAST_PAIRS) {
592
+ const fg = resolveColor(tier[fgName], tier);
593
+ const bg = resolveColor(tier[bgName], tier);
594
+ if (!fg || !bg) continue;
595
+ const ratio = contrastRatio(fg, bg);
596
+ if (ratio >= min) continue;
597
+ diagnostics.push({
598
+ code: "THEME_CONTRAST",
599
+ path: `${fgName} on ${bgName}`,
600
+ message: `${fgName} (${toHex(fg)}) on ${bgName} (${toHex(bg)}) is ${ratio.toFixed(2)}:1; needs ${min}:1`,
601
+ severity: "warning"
602
+ });
603
+ }
604
+ return diagnostics;
605
+ }
606
+ //#endregion
607
+ export { CONTRAST_PAIRS, checkTheme, contrastRatio, fromOklch, parseColor, parseTheme, relativeLuminance, themeCss, themeTokens, toHex, toOklch };
608
+
609
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","names":[],"sources":["../src/theme/color.ts","../src/theme/parse.ts","../src/theme/derive.ts","../src/theme/check.ts"],"mappings":"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"}
@@ -13,10 +13,14 @@ export type BundleRow = {
13
13
  component_name: string | null;
14
14
  exposed_export: string | null;
15
15
  }>;
16
+ /** A shared lineage's specifier: the loader imports it by this, never by URL. */
17
+ specifier?: string | null;
16
18
  };
17
19
  export type LoadedBundle = {
18
20
  id: string;
19
21
  label: string;
22
+ /** Set for a shared lineage (`@stack/core`). */
23
+ specifier?: string;
20
24
  components: Record<string, ComponentType<Record<string, unknown>>>;
21
25
  /** `contracts.json`: per-component @data / @action / @printPolicy / @size. */
22
26
  contracts: Record<string, unknown>;
@@ -41,6 +45,9 @@ export declare function runtimeReady(g?: Record<string, unknown>): Promise<void>
41
45
  /**
42
46
  * Load one bundle, once per bundle id (ids are immutable). Waits for the
43
47
  * shared runtime first, so the bundle's bare imports resolve to the host's.
48
+ * A shared lineage is imported by its specifier, which the page's import map
49
+ * points at its live version: dependents that import it get the same module
50
+ * instance, and so the same React contexts (design/core-and-tokens.md §4).
44
51
  */
45
52
  export declare function loadBundle(row: BundleRow, files: BundleFiles): Promise<LoadedBundle>;
46
53
  /** Load every bundle in scope in parallel; a failure drops that bundle, not the page. */
@@ -10,7 +10,22 @@ export type LineageRef = {
10
10
  } | {
11
11
  kind: 'pinned';
12
12
  bundleId: string;
13
+ }
14
+ /** A shared lineage (design/core-and-tokens.md §4), imported by its specifier. */
15
+ | {
16
+ kind: 'shared';
17
+ specifier: string;
18
+ orgSlug: string;
19
+ bundle: string;
20
+ };
21
+ /** A row of `shared_lineage_live`, as the scope needs it. */
22
+ export type SharedLineage = {
23
+ specifier: string;
24
+ org_slug: string;
25
+ bundle_name: string;
13
26
  };
27
+ /** The shared lineage `@core/Name` resolves from first. */
28
+ export declare const CORE_SPECIFIER = "@stack/core";
14
29
  export declare const MAIN = "main";
15
30
  export declare const PUBLIC = "public";
16
31
  /**
@@ -36,6 +51,12 @@ export type BundleScopeInput = {
36
51
  orgs?: Array<{
37
52
  id: string;
38
53
  }>;
54
+ /** `shared_lineage_live`: the shared lineages, after every org lineage. */
55
+ shared?: readonly SharedLineage[];
39
56
  };
40
- /** The ordered, de-duplicated lineage list for a page: page → project → section → org main. */
57
+ /**
58
+ * The ordered, de-duplicated lineage list for a page: page → project →
59
+ * section → org main → shared lineages (design/core-and-tokens.md §3), so an
60
+ * org lineage replaces a shared component by exporting the same name.
61
+ */
41
62
  export declare function bundleScope(input: BundleScopeInput): LineageRef[];