@tryvitris/website-harness 1.0.1 → 1.0.2

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 (70) hide show
  1. package/agent/graph.yaml +16 -8
  2. package/agent/refs/browser.md +2 -0
  3. package/agent/refs/compose.md +2 -0
  4. package/agent/refs/design-quality.md +2 -0
  5. package/agent/refs/direction.md +2 -0
  6. package/agent/refs/implement.md +2 -0
  7. package/agent/refs/template-adaptation.md +2 -0
  8. package/agent/refs/template-library.md +2 -0
  9. package/agent/refs/typography.md +15 -0
  10. package/bin/api/agent/evaluate.js +7 -6
  11. package/bin/api/agent/grade.js +7 -6
  12. package/bin/api/cli/api.js +15 -14
  13. package/bin/api/cli.js +17 -16
  14. package/bin/api/engine.js +8 -7
  15. package/bin/api/hosting.js +9 -8
  16. package/bin/api/index.js +4 -3
  17. package/bin/api/render.js +2 -1
  18. package/bin/api/theme.js +2 -1
  19. package/bin/chunks/{chunk-JBSGJR7X.js → chunk-ATPI2YRF.js} +2 -2
  20. package/bin/chunks/{chunk-KIWEFRNG.js → chunk-BMD5GVUT.js} +6 -6
  21. package/bin/chunks/{chunk-AUO5I56E.js → chunk-C3F7XQD2.js} +194 -1
  22. package/bin/chunks/{chunk-UR4NWYVW.js → chunk-CPQQQ5YB.js} +3 -3
  23. package/bin/chunks/{chunk-LKN75JGA.js → chunk-GE6UUEG2.js} +13 -8
  24. package/bin/chunks/{chunk-445FZZEC.js → chunk-GM57SNLL.js} +9 -9
  25. package/bin/chunks/{chunk-RE4GOHSU.js → chunk-GO3XEQBA.js} +3 -3
  26. package/bin/chunks/{chunk-GQPUILFR.js → chunk-JPQCUN2J.js} +1301 -1252
  27. package/bin/chunks/{chunk-37F7XIMH.js → chunk-JTXFTNEA.js} +6 -1
  28. package/bin/chunks/{chunk-L44ZTNDM.js → chunk-NMTFSWPK.js} +6 -6
  29. package/bin/chunks/{chunk-VKU5TY5C.js → chunk-OQGUEQ6F.js} +1 -1
  30. package/bin/chunks/{chunk-M72KKZIB.js → chunk-Q6FLOYHS.js} +4 -3
  31. package/bin/chunks/{chunk-H3BS2EBR.js → chunk-QRIYA3GJ.js} +3 -3
  32. package/bin/chunks/chunk-S2XVNTQP.js +90 -0
  33. package/bin/chunks/{chunk-54QPYUM2.js → chunk-XJTAR7KM.js} +1 -1
  34. package/bin/chunks/{chunk-72Y4YMTV.js → chunk-YYK6367V.js} +2 -2
  35. package/bin/chunks/{chunk-65LRZIBP.js → chunk-YYYPSFFZ.js} +2 -2
  36. package/bin/chunks/{design-context-store-ETVS4N6W.js → design-context-store-BDYBQQCO.js} +7 -6
  37. package/bin/chunks/{packets-XFXKHSEY.js → packets-RXFWDCK2.js} +7 -6
  38. package/bin/chunks/{preparation-3OR7LVPQ.js → preparation-ETEEMB5H.js} +7 -6
  39. package/bin/cloudflare/backend.js +90 -11
  40. package/bin/types/src/agent/browser-typography.d.ts +33 -0
  41. package/bin/types/src/agent/theme-suite-identity.d.ts +1 -0
  42. package/bin/types/src/agent/typography-policy.d.ts +6 -0
  43. package/bin/types/src/compile/site.d.ts +1 -1
  44. package/bin/types/src/theme.d.ts +3 -1
  45. package/bin/types/src/types.d.ts +6 -1
  46. package/bin/types/src/typography.d.ts +27 -0
  47. package/bin/vitris-art.js +7 -6
  48. package/bin/vitris-build.js +5 -4
  49. package/bin/vitris-create-site.js +9 -8
  50. package/bin/vitris-cursor-hook.js +7 -6
  51. package/bin/vitris-eval.js +9 -8
  52. package/bin/vitris-go.js +9 -8
  53. package/bin/vitris-harvest.js +8 -7
  54. package/bin/vitris-knowledge.js +8 -7
  55. package/bin/vitris-launch-preflight.js +7 -6
  56. package/bin/vitris-motion-view.js +7 -6
  57. package/bin/vitris-references.js +5 -4
  58. package/bin/vitris-refresh.js +8 -7
  59. package/bin/vitris-stock.js +1 -1
  60. package/bin/vitris-templates.js +91 -1
  61. package/bin/vitris-themes.js +7 -6
  62. package/bin/vitris-upgrade.js +8 -7
  63. package/bin/vitris-verify-browser.js +33 -8
  64. package/bin/vitris-verify-performance.js +5 -4
  65. package/bin/vitris.js +17 -16
  66. package/design-system/MASTER.md +4 -0
  67. package/docs/CLI.md +4 -0
  68. package/package.json +2 -2
  69. package/templates/site/site.json +1 -0
  70. package/templates/site/theme/defaults.json +78 -17
@@ -0,0 +1,27 @@
1
+ import type { SiteConfig, ThemeTokens } from './types.ts';
2
+ export declare const TYPE_ROLES: readonly ["display", "section", "subheading", "card-title", "body", "ui", "caption", "label"];
3
+ export type TypeRole = typeof TYPE_ROLES[number];
4
+ export type TypeStyle = {
5
+ size: string;
6
+ weight: number;
7
+ lineHeight: string;
8
+ tracking: string;
9
+ font: 'body' | 'display';
10
+ };
11
+ export type TypographySystem = {
12
+ roles: Partial<Record<TypeRole, Partial<TypeStyle>>>;
13
+ variants?: Record<string, Partial<TypeStyle> & {
14
+ role: TypeRole;
15
+ reason: string;
16
+ }>;
17
+ };
18
+ export declare const MINIMUM_TYPE_PX = 12;
19
+ export declare const DEFAULT_TYPE_ROLES: Record<TypeRole, TypeStyle>;
20
+ export declare const TYPE_SELECTORS: Record<TypeRole, string[]>;
21
+ export declare function typographyEnabled(site?: Pick<SiteConfig, 'typography'>): boolean;
22
+ export declare function resolvedTypography(theme?: Pick<ThemeTokens, 'typography'>): Record<TypeRole, TypeStyle>;
23
+ /** Reject malformed values early; actual CSS lengths are resolved and checked in Chromium. */
24
+ export declare function validateTypography(value: unknown, requireRoles?: boolean): string[];
25
+ export declare function typographyVariables(theme: ThemeTokens): string;
26
+ export declare function typographyCss(): string;
27
+ export declare function typographyVariantCss(theme: ThemeTokens): string;
package/bin/vitris-art.js CHANGED
@@ -12,7 +12,7 @@ import {
12
12
  retireProducedAsset,
13
13
  validateAssetProduction,
14
14
  withMutationLock
15
- } from "./chunks/chunk-GQPUILFR.js";
15
+ } from "./chunks/chunk-JPQCUN2J.js";
16
16
  import "./chunks/chunk-KVMZSQ3D.js";
17
17
  import "./chunks/chunk-WOORR67N.js";
18
18
  import "./chunks/chunk-PRLL7B63.js";
@@ -27,17 +27,18 @@ import {
27
27
  } from "./chunks/chunk-TY33XMHW.js";
28
28
  import "./chunks/chunk-HL6JVA4A.js";
29
29
  import "./chunks/chunk-M2ETYSVJ.js";
30
- import "./chunks/chunk-AUO5I56E.js";
30
+ import "./chunks/chunk-C3F7XQD2.js";
31
31
  import "./chunks/chunk-BIEDSEL2.js";
32
32
  import "./chunks/chunk-IKNMBGGD.js";
33
33
  import "./chunks/chunk-WEFDVXFX.js";
34
34
  import {
35
35
  findHarnessRoot
36
- } from "./chunks/chunk-H3BS2EBR.js";
37
- import "./chunks/chunk-L44ZTNDM.js";
38
- import "./chunks/chunk-37F7XIMH.js";
39
- import "./chunks/chunk-LKN75JGA.js";
36
+ } from "./chunks/chunk-QRIYA3GJ.js";
37
+ import "./chunks/chunk-NMTFSWPK.js";
38
+ import "./chunks/chunk-JTXFTNEA.js";
39
+ import "./chunks/chunk-GE6UUEG2.js";
40
40
  import "./chunks/chunk-YYPYYOEV.js";
41
+ import "./chunks/chunk-S2XVNTQP.js";
41
42
  import "./chunks/chunk-GZDLXYZV.js";
42
43
  import {
43
44
  mediaDimensions
@@ -1,11 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  buildVerified
4
- } from "./chunks/chunk-H3BS2EBR.js";
5
- import "./chunks/chunk-L44ZTNDM.js";
6
- import "./chunks/chunk-37F7XIMH.js";
7
- import "./chunks/chunk-LKN75JGA.js";
4
+ } from "./chunks/chunk-QRIYA3GJ.js";
5
+ import "./chunks/chunk-NMTFSWPK.js";
6
+ import "./chunks/chunk-JTXFTNEA.js";
7
+ import "./chunks/chunk-GE6UUEG2.js";
8
8
  import "./chunks/chunk-YYPYYOEV.js";
9
+ import "./chunks/chunk-S2XVNTQP.js";
9
10
  import "./chunks/chunk-GZDLXYZV.js";
10
11
  import "./chunks/chunk-T6PE4KN4.js";
11
12
  import "./chunks/chunk-7FS67SRF.js";
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  createSite
4
- } from "./chunks/chunk-M72KKZIB.js";
4
+ } from "./chunks/chunk-Q6FLOYHS.js";
5
5
  import "./chunks/chunk-34H54KEY.js";
6
6
  import "./chunks/chunk-JCRGE6AL.js";
7
7
  import {
8
8
  promptSourceUrl
9
- } from "./chunks/chunk-54QPYUM2.js";
9
+ } from "./chunks/chunk-XJTAR7KM.js";
10
10
  import "./chunks/chunk-XGTHGWPW.js";
11
11
  import {
12
12
  siteInputsFromArgv
13
- } from "./chunks/chunk-GQPUILFR.js";
13
+ } from "./chunks/chunk-JPQCUN2J.js";
14
14
  import "./chunks/chunk-KVMZSQ3D.js";
15
15
  import "./chunks/chunk-WOORR67N.js";
16
16
  import "./chunks/chunk-PRLL7B63.js";
@@ -20,15 +20,16 @@ import "./chunks/chunk-M4LNHYYR.js";
20
20
  import "./chunks/chunk-TY33XMHW.js";
21
21
  import "./chunks/chunk-HL6JVA4A.js";
22
22
  import "./chunks/chunk-M2ETYSVJ.js";
23
- import "./chunks/chunk-AUO5I56E.js";
23
+ import "./chunks/chunk-C3F7XQD2.js";
24
24
  import "./chunks/chunk-BIEDSEL2.js";
25
25
  import "./chunks/chunk-IKNMBGGD.js";
26
26
  import "./chunks/chunk-WEFDVXFX.js";
27
- import "./chunks/chunk-H3BS2EBR.js";
28
- import "./chunks/chunk-L44ZTNDM.js";
29
- import "./chunks/chunk-37F7XIMH.js";
30
- import "./chunks/chunk-LKN75JGA.js";
27
+ import "./chunks/chunk-QRIYA3GJ.js";
28
+ import "./chunks/chunk-NMTFSWPK.js";
29
+ import "./chunks/chunk-JTXFTNEA.js";
30
+ import "./chunks/chunk-GE6UUEG2.js";
31
31
  import "./chunks/chunk-YYPYYOEV.js";
32
+ import "./chunks/chunk-S2XVNTQP.js";
32
33
  import "./chunks/chunk-GZDLXYZV.js";
33
34
  import "./chunks/chunk-G7MNMULR.js";
34
35
  import "./chunks/chunk-T6PE4KN4.js";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handleCursorHook
4
- } from "./chunks/chunk-GQPUILFR.js";
4
+ } from "./chunks/chunk-JPQCUN2J.js";
5
5
  import "./chunks/chunk-KVMZSQ3D.js";
6
6
  import "./chunks/chunk-WOORR67N.js";
7
7
  import "./chunks/chunk-PRLL7B63.js";
@@ -11,15 +11,16 @@ import "./chunks/chunk-M4LNHYYR.js";
11
11
  import "./chunks/chunk-TY33XMHW.js";
12
12
  import "./chunks/chunk-HL6JVA4A.js";
13
13
  import "./chunks/chunk-M2ETYSVJ.js";
14
- import "./chunks/chunk-AUO5I56E.js";
14
+ import "./chunks/chunk-C3F7XQD2.js";
15
15
  import "./chunks/chunk-BIEDSEL2.js";
16
16
  import "./chunks/chunk-IKNMBGGD.js";
17
17
  import "./chunks/chunk-WEFDVXFX.js";
18
- import "./chunks/chunk-H3BS2EBR.js";
19
- import "./chunks/chunk-L44ZTNDM.js";
20
- import "./chunks/chunk-37F7XIMH.js";
21
- import "./chunks/chunk-LKN75JGA.js";
18
+ import "./chunks/chunk-QRIYA3GJ.js";
19
+ import "./chunks/chunk-NMTFSWPK.js";
20
+ import "./chunks/chunk-JTXFTNEA.js";
21
+ import "./chunks/chunk-GE6UUEG2.js";
22
22
  import "./chunks/chunk-YYPYYOEV.js";
23
+ import "./chunks/chunk-S2XVNTQP.js";
23
24
  import "./chunks/chunk-GZDLXYZV.js";
24
25
  import "./chunks/chunk-G7MNMULR.js";
25
26
  import "./chunks/chunk-T6PE4KN4.js";
@@ -3,7 +3,7 @@ import {
3
3
  gradeAll,
4
4
  gradeNode,
5
5
  reviewSubject
6
- } from "./chunks/chunk-GQPUILFR.js";
6
+ } from "./chunks/chunk-JPQCUN2J.js";
7
7
  import "./chunks/chunk-KVMZSQ3D.js";
8
8
  import "./chunks/chunk-WOORR67N.js";
9
9
  import "./chunks/chunk-PRLL7B63.js";
@@ -13,15 +13,16 @@ import "./chunks/chunk-M4LNHYYR.js";
13
13
  import "./chunks/chunk-TY33XMHW.js";
14
14
  import "./chunks/chunk-HL6JVA4A.js";
15
15
  import "./chunks/chunk-M2ETYSVJ.js";
16
- import "./chunks/chunk-AUO5I56E.js";
16
+ import "./chunks/chunk-C3F7XQD2.js";
17
17
  import "./chunks/chunk-BIEDSEL2.js";
18
18
  import "./chunks/chunk-IKNMBGGD.js";
19
19
  import "./chunks/chunk-WEFDVXFX.js";
20
- import "./chunks/chunk-H3BS2EBR.js";
21
- import "./chunks/chunk-L44ZTNDM.js";
22
- import "./chunks/chunk-37F7XIMH.js";
23
- import "./chunks/chunk-LKN75JGA.js";
20
+ import "./chunks/chunk-QRIYA3GJ.js";
21
+ import "./chunks/chunk-NMTFSWPK.js";
22
+ import "./chunks/chunk-JTXFTNEA.js";
23
+ import "./chunks/chunk-GE6UUEG2.js";
24
24
  import "./chunks/chunk-YYPYYOEV.js";
25
+ import "./chunks/chunk-S2XVNTQP.js";
25
26
  import "./chunks/chunk-GZDLXYZV.js";
26
27
  import "./chunks/chunk-G7MNMULR.js";
27
28
  import {
@@ -44,7 +45,7 @@ if (paths.length) {
44
45
  } else if (process.argv.includes("--expand-packet")) {
45
46
  const expId = arg("--expand-packet");
46
47
  const manifestHash = arg("--manifest-hash");
47
- const { expandPacketItem } = await import("./chunks/packets-XFXKHSEY.js");
48
+ const { expandPacketItem } = await import("./chunks/packets-RXFWDCK2.js");
48
49
  console.log(expandPacketItem(root, node || "business-review", expId, manifestHash));
49
50
  } else if (process.argv.includes("--expand-design-context")) {
50
51
  const preparationId = arg("--preparation");
@@ -52,7 +53,7 @@ if (paths.length) {
52
53
  if (!preparationId || !expansionId || expansionId.startsWith("--")) {
53
54
  throw new Error("Use --expand-design-context <ID> --preparation <PREP_ID> [--site PATH]");
54
55
  }
55
- const { expandDesignContextForPreparation } = await import("./chunks/design-context-store-ETVS4N6W.js");
56
+ const { expandDesignContextForPreparation } = await import("./chunks/design-context-store-BDYBQQCO.js");
56
57
  const result = expandDesignContextForPreparation(root, preparationId, expansionId);
57
58
  if (!result.ok) {
58
59
  console.error(result.reason);
package/bin/vitris-go.js CHANGED
@@ -7,8 +7,8 @@ import {
7
7
  runCreativeProfile,
8
8
  runSite,
9
9
  statusSite
10
- } from "./chunks/chunk-RE4GOHSU.js";
11
- import "./chunks/chunk-65LRZIBP.js";
10
+ } from "./chunks/chunk-GO3XEQBA.js";
11
+ import "./chunks/chunk-YYYPSFFZ.js";
12
12
  import "./chunks/chunk-34H54KEY.js";
13
13
  import "./chunks/chunk-JCRGE6AL.js";
14
14
  import "./chunks/chunk-XL2DRAYI.js";
@@ -19,7 +19,7 @@ import {
19
19
  resolveSiteInputsLive,
20
20
  runWorkflow,
21
21
  siteInputsFromArgv
22
- } from "./chunks/chunk-GQPUILFR.js";
22
+ } from "./chunks/chunk-JPQCUN2J.js";
23
23
  import "./chunks/chunk-KVMZSQ3D.js";
24
24
  import "./chunks/chunk-WOORR67N.js";
25
25
  import "./chunks/chunk-PRLL7B63.js";
@@ -29,17 +29,18 @@ import "./chunks/chunk-M4LNHYYR.js";
29
29
  import "./chunks/chunk-TY33XMHW.js";
30
30
  import "./chunks/chunk-HL6JVA4A.js";
31
31
  import "./chunks/chunk-M2ETYSVJ.js";
32
- import "./chunks/chunk-AUO5I56E.js";
32
+ import "./chunks/chunk-C3F7XQD2.js";
33
33
  import "./chunks/chunk-BIEDSEL2.js";
34
34
  import "./chunks/chunk-IKNMBGGD.js";
35
35
  import "./chunks/chunk-WEFDVXFX.js";
36
36
  import {
37
37
  isPreserveSite
38
- } from "./chunks/chunk-H3BS2EBR.js";
39
- import "./chunks/chunk-L44ZTNDM.js";
40
- import "./chunks/chunk-37F7XIMH.js";
41
- import "./chunks/chunk-LKN75JGA.js";
38
+ } from "./chunks/chunk-QRIYA3GJ.js";
39
+ import "./chunks/chunk-NMTFSWPK.js";
40
+ import "./chunks/chunk-JTXFTNEA.js";
41
+ import "./chunks/chunk-GE6UUEG2.js";
42
42
  import "./chunks/chunk-YYPYYOEV.js";
43
+ import "./chunks/chunk-S2XVNTQP.js";
43
44
  import "./chunks/chunk-GZDLXYZV.js";
44
45
  import "./chunks/chunk-G7MNMULR.js";
45
46
  import "./chunks/chunk-T6PE4KN4.js";
@@ -3,13 +3,13 @@ import {
3
3
  gatherOnboard,
4
4
  normalizeSourceUrl,
5
5
  persistOnboard
6
- } from "./chunks/chunk-54QPYUM2.js";
6
+ } from "./chunks/chunk-XJTAR7KM.js";
7
7
  import {
8
8
  loadDevVars
9
9
  } from "./chunks/chunk-XGTHGWPW.js";
10
10
  import {
11
11
  gradeHarvest
12
- } from "./chunks/chunk-GQPUILFR.js";
12
+ } from "./chunks/chunk-JPQCUN2J.js";
13
13
  import "./chunks/chunk-KVMZSQ3D.js";
14
14
  import "./chunks/chunk-WOORR67N.js";
15
15
  import "./chunks/chunk-PRLL7B63.js";
@@ -19,15 +19,16 @@ import "./chunks/chunk-M4LNHYYR.js";
19
19
  import "./chunks/chunk-TY33XMHW.js";
20
20
  import "./chunks/chunk-HL6JVA4A.js";
21
21
  import "./chunks/chunk-M2ETYSVJ.js";
22
- import "./chunks/chunk-AUO5I56E.js";
22
+ import "./chunks/chunk-C3F7XQD2.js";
23
23
  import "./chunks/chunk-BIEDSEL2.js";
24
24
  import "./chunks/chunk-IKNMBGGD.js";
25
25
  import "./chunks/chunk-WEFDVXFX.js";
26
- import "./chunks/chunk-H3BS2EBR.js";
27
- import "./chunks/chunk-L44ZTNDM.js";
28
- import "./chunks/chunk-37F7XIMH.js";
29
- import "./chunks/chunk-LKN75JGA.js";
26
+ import "./chunks/chunk-QRIYA3GJ.js";
27
+ import "./chunks/chunk-NMTFSWPK.js";
28
+ import "./chunks/chunk-JTXFTNEA.js";
29
+ import "./chunks/chunk-GE6UUEG2.js";
30
30
  import "./chunks/chunk-YYPYYOEV.js";
31
+ import "./chunks/chunk-S2XVNTQP.js";
31
32
  import "./chunks/chunk-GZDLXYZV.js";
32
33
  import "./chunks/chunk-G7MNMULR.js";
33
34
  import "./chunks/chunk-T6PE4KN4.js";
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  explainStage
4
- } from "./chunks/chunk-VKU5TY5C.js";
5
- import "./chunks/chunk-GQPUILFR.js";
4
+ } from "./chunks/chunk-OQGUEQ6F.js";
5
+ import "./chunks/chunk-JPQCUN2J.js";
6
6
  import "./chunks/chunk-KVMZSQ3D.js";
7
7
  import "./chunks/chunk-WOORR67N.js";
8
8
  import "./chunks/chunk-PRLL7B63.js";
@@ -12,15 +12,16 @@ import "./chunks/chunk-M4LNHYYR.js";
12
12
  import "./chunks/chunk-TY33XMHW.js";
13
13
  import "./chunks/chunk-HL6JVA4A.js";
14
14
  import "./chunks/chunk-M2ETYSVJ.js";
15
- import "./chunks/chunk-AUO5I56E.js";
15
+ import "./chunks/chunk-C3F7XQD2.js";
16
16
  import "./chunks/chunk-BIEDSEL2.js";
17
17
  import "./chunks/chunk-IKNMBGGD.js";
18
18
  import "./chunks/chunk-WEFDVXFX.js";
19
- import "./chunks/chunk-H3BS2EBR.js";
20
- import "./chunks/chunk-L44ZTNDM.js";
21
- import "./chunks/chunk-37F7XIMH.js";
22
- import "./chunks/chunk-LKN75JGA.js";
19
+ import "./chunks/chunk-QRIYA3GJ.js";
20
+ import "./chunks/chunk-NMTFSWPK.js";
21
+ import "./chunks/chunk-JTXFTNEA.js";
22
+ import "./chunks/chunk-GE6UUEG2.js";
23
23
  import "./chunks/chunk-YYPYYOEV.js";
24
+ import "./chunks/chunk-S2XVNTQP.js";
24
25
  import "./chunks/chunk-GZDLXYZV.js";
25
26
  import "./chunks/chunk-G7MNMULR.js";
26
27
  import "./chunks/chunk-T6PE4KN4.js";
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunks/chunk-XL2DRAYI.js";
11
11
  import {
12
12
  templateAdaptationFailures
13
- } from "./chunks/chunk-GQPUILFR.js";
13
+ } from "./chunks/chunk-JPQCUN2J.js";
14
14
  import "./chunks/chunk-KVMZSQ3D.js";
15
15
  import "./chunks/chunk-WOORR67N.js";
16
16
  import "./chunks/chunk-PRLL7B63.js";
@@ -20,7 +20,7 @@ import "./chunks/chunk-M4LNHYYR.js";
20
20
  import "./chunks/chunk-TY33XMHW.js";
21
21
  import "./chunks/chunk-HL6JVA4A.js";
22
22
  import "./chunks/chunk-M2ETYSVJ.js";
23
- import "./chunks/chunk-AUO5I56E.js";
23
+ import "./chunks/chunk-C3F7XQD2.js";
24
24
  import {
25
25
  LAUNCH_POLICY_ID
26
26
  } from "./chunks/chunk-BIEDSEL2.js";
@@ -30,14 +30,15 @@ import {
30
30
  performancePolicy
31
31
  } from "./chunks/chunk-IKNMBGGD.js";
32
32
  import "./chunks/chunk-WEFDVXFX.js";
33
- import "./chunks/chunk-H3BS2EBR.js";
34
- import "./chunks/chunk-L44ZTNDM.js";
33
+ import "./chunks/chunk-QRIYA3GJ.js";
34
+ import "./chunks/chunk-NMTFSWPK.js";
35
35
  import {
36
36
  COOKIE_COMPLIANCE_PATH,
37
37
  parseFrontmatter
38
- } from "./chunks/chunk-37F7XIMH.js";
39
- import "./chunks/chunk-LKN75JGA.js";
38
+ } from "./chunks/chunk-JTXFTNEA.js";
39
+ import "./chunks/chunk-GE6UUEG2.js";
40
40
  import "./chunks/chunk-YYPYYOEV.js";
41
+ import "./chunks/chunk-S2XVNTQP.js";
41
42
  import "./chunks/chunk-GZDLXYZV.js";
42
43
  import "./chunks/chunk-G7MNMULR.js";
43
44
  import {
@@ -3,7 +3,7 @@ import {
3
3
  TEMPLATE_MOTION_PATH,
4
4
  currentSelectionHash,
5
5
  templateMotionHash
6
- } from "./chunks/chunk-GQPUILFR.js";
6
+ } from "./chunks/chunk-JPQCUN2J.js";
7
7
  import "./chunks/chunk-KVMZSQ3D.js";
8
8
  import "./chunks/chunk-WOORR67N.js";
9
9
  import "./chunks/chunk-PRLL7B63.js";
@@ -13,17 +13,18 @@ import "./chunks/chunk-M4LNHYYR.js";
13
13
  import "./chunks/chunk-TY33XMHW.js";
14
14
  import "./chunks/chunk-HL6JVA4A.js";
15
15
  import "./chunks/chunk-M2ETYSVJ.js";
16
- import "./chunks/chunk-AUO5I56E.js";
16
+ import "./chunks/chunk-C3F7XQD2.js";
17
17
  import "./chunks/chunk-BIEDSEL2.js";
18
18
  import "./chunks/chunk-IKNMBGGD.js";
19
19
  import {
20
20
  previewServer
21
21
  } from "./chunks/chunk-WEFDVXFX.js";
22
- import "./chunks/chunk-H3BS2EBR.js";
23
- import "./chunks/chunk-L44ZTNDM.js";
24
- import "./chunks/chunk-37F7XIMH.js";
25
- import "./chunks/chunk-LKN75JGA.js";
22
+ import "./chunks/chunk-QRIYA3GJ.js";
23
+ import "./chunks/chunk-NMTFSWPK.js";
24
+ import "./chunks/chunk-JTXFTNEA.js";
25
+ import "./chunks/chunk-GE6UUEG2.js";
26
26
  import "./chunks/chunk-YYPYYOEV.js";
27
+ import "./chunks/chunk-S2XVNTQP.js";
27
28
  import "./chunks/chunk-GZDLXYZV.js";
28
29
  import "./chunks/chunk-G7MNMULR.js";
29
30
  import {
@@ -17,11 +17,12 @@ import {
17
17
  } from "./chunks/chunk-WEFDVXFX.js";
18
18
  import {
19
19
  buildVerified
20
- } from "./chunks/chunk-H3BS2EBR.js";
21
- import "./chunks/chunk-L44ZTNDM.js";
22
- import "./chunks/chunk-37F7XIMH.js";
23
- import "./chunks/chunk-LKN75JGA.js";
20
+ } from "./chunks/chunk-QRIYA3GJ.js";
21
+ import "./chunks/chunk-NMTFSWPK.js";
22
+ import "./chunks/chunk-JTXFTNEA.js";
23
+ import "./chunks/chunk-GE6UUEG2.js";
24
24
  import "./chunks/chunk-YYPYYOEV.js";
25
+ import "./chunks/chunk-S2XVNTQP.js";
25
26
  import "./chunks/chunk-GZDLXYZV.js";
26
27
  import "./chunks/chunk-T6PE4KN4.js";
27
28
  import "./chunks/chunk-7FS67SRF.js";
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  upgradeSite
4
- } from "./chunks/chunk-JBSGJR7X.js";
4
+ } from "./chunks/chunk-ATPI2YRF.js";
5
5
  import "./chunks/chunk-JCRGE6AL.js";
6
- import "./chunks/chunk-GQPUILFR.js";
6
+ import "./chunks/chunk-JPQCUN2J.js";
7
7
  import "./chunks/chunk-KVMZSQ3D.js";
8
8
  import "./chunks/chunk-WOORR67N.js";
9
9
  import "./chunks/chunk-PRLL7B63.js";
@@ -13,15 +13,16 @@ import "./chunks/chunk-M4LNHYYR.js";
13
13
  import "./chunks/chunk-TY33XMHW.js";
14
14
  import "./chunks/chunk-HL6JVA4A.js";
15
15
  import "./chunks/chunk-M2ETYSVJ.js";
16
- import "./chunks/chunk-AUO5I56E.js";
16
+ import "./chunks/chunk-C3F7XQD2.js";
17
17
  import "./chunks/chunk-BIEDSEL2.js";
18
18
  import "./chunks/chunk-IKNMBGGD.js";
19
19
  import "./chunks/chunk-WEFDVXFX.js";
20
- import "./chunks/chunk-H3BS2EBR.js";
21
- import "./chunks/chunk-L44ZTNDM.js";
22
- import "./chunks/chunk-37F7XIMH.js";
23
- import "./chunks/chunk-LKN75JGA.js";
20
+ import "./chunks/chunk-QRIYA3GJ.js";
21
+ import "./chunks/chunk-NMTFSWPK.js";
22
+ import "./chunks/chunk-JTXFTNEA.js";
23
+ import "./chunks/chunk-GE6UUEG2.js";
24
24
  import "./chunks/chunk-YYPYYOEV.js";
25
+ import "./chunks/chunk-S2XVNTQP.js";
25
26
  import "./chunks/chunk-GZDLXYZV.js";
26
27
  import "./chunks/chunk-G7MNMULR.js";
27
28
  import "./chunks/chunk-T6PE4KN4.js";
@@ -33,7 +33,7 @@ if (!command || command === "--help") {
33
33
  if (!site) throw new Error("--site required");
34
34
  const item = readStockCatalog(catalogPath).items.find((i) => i.id === id);
35
35
  if (!item) throw new Error("Unknown stock asset");
36
- const { findActivePreparation } = await import("./chunks/preparation-3OR7LVPQ.js");
36
+ const { findActivePreparation } = await import("./chunks/preparation-ETEEMB5H.js");
37
37
  const current = existsSync(join(site, "agent/PREPARED.json"));
38
38
  if (current && !findActivePreparation(site, "media") && !findActivePreparation(site, "asset-production")) throw new Error("Import stock during media or asset-production; route later additions through the declared owner");
39
39
  const launch = existsSync(join(site, "launch.json")) ? json(join(site, "launch.json")) : {};
@@ -3,10 +3,15 @@ import {
3
3
  loadDevVars
4
4
  } from "./chunks/chunk-XGTHGWPW.js";
5
5
  import {
6
+ captureTypographyStates,
6
7
  releaseRank,
7
8
  themeHash,
9
+ typographyConsistencyFailures,
8
10
  validateManifest
9
- } from "./chunks/chunk-AUO5I56E.js";
11
+ } from "./chunks/chunk-C3F7XQD2.js";
12
+ import {
13
+ validateTypography
14
+ } from "./chunks/chunk-S2XVNTQP.js";
10
15
 
11
16
  // scripts/templates.ts
12
17
  import { readFileSync, writeFileSync, readdirSync, lstatSync, realpathSync, existsSync, mkdirSync, renameSync, unlinkSync } from "node:fs";
@@ -53,6 +58,75 @@ async function putVerified(key, body, mime) {
53
58
  throw Error("Unreachable");
54
59
  }
55
60
 
61
+ // src/agent/template-typography.ts
62
+ async function verifyTemplateTypography(browser, theme, documents) {
63
+ const invalid = validateTypography(theme.typography, true);
64
+ if (invalid.length) throw Error(invalid.join("\n"));
65
+ const captures = [];
66
+ for (const palette of ["original", "brand"]) {
67
+ const paletteCaptures = [];
68
+ const context = await browser.newContext({ reducedMotion: "reduce" });
69
+ await context.route("**/*", (route) => route.request().method() !== "GET" || route.request().isNavigationRequest() ? route.abort() : route.continue());
70
+ try {
71
+ const page = await context.newPage();
72
+ for (const width of [375, 1080]) for (const document of documents) {
73
+ await page.setViewportSize({ width, height: 900 });
74
+ await page.setContent(document[palette], { waitUntil: "load" });
75
+ await page.evaluate("document.fonts.ready");
76
+ paletteCaptures.push(...await captureTypographyStates(page, theme, document.path, width));
77
+ }
78
+ } finally {
79
+ await context.close();
80
+ }
81
+ const failures = [...paletteCaptures.flatMap((c) => c.failures.map((f) => `${palette} ${c.path} ${c.width}px ${c.state}: ${f}`)), ...typographyConsistencyFailures(paletteCaptures)];
82
+ if (failures.length) throw Error("Template typography verification failed:\n" + failures.join("\n"));
83
+ captures.push(...paletteCaptures.map((c) => ({ ...c, state: `${palette}/${c.state}` })));
84
+ }
85
+ return captures;
86
+ }
87
+
88
+ // src/template-cloud/render.ts
89
+ var esc = (s) => s.replace(/[&<>"']/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" })[c]);
90
+ var lum = (c) => {
91
+ const v = [1, 3, 5].map((i) => {
92
+ const n = parseInt(c.slice(i, i + 2), 16) / 255;
93
+ return n <= 0.04045 ? n / 12.92 : ((n + 0.055) / 1.055) ** 2.4;
94
+ });
95
+ return 0.2126 * v[0] + 0.7152 * v[1] + 0.0722 * v[2];
96
+ };
97
+ var contrast = (a, b) => (Math.max(lum(a), lum(b)) + 0.05) / (Math.min(lum(a), lum(b)) + 0.05);
98
+ function brandVars(tokens, colors) {
99
+ const brand = colors[0] || "#56636b", bg = tokens.colorBg;
100
+ let action = colors.find((c) => contrast(c, bg) >= 4.5) || brand;
101
+ if (contrast(action, bg) < 4.5) {
102
+ const target = lum(bg) < 0.2 ? 255 : 0;
103
+ for (let step = 1; step <= 20; step++) {
104
+ action = "#" + [1, 3, 5].map((i) => Math.round(parseInt(brand.slice(i, i + 2), 16) * (1 - step / 20) + target * step / 20).toString(16).padStart(2, "0")).join("");
105
+ if (contrast(action, bg) >= 4.5) break;
106
+ }
107
+ }
108
+ const t = { ...tokens, colorAccent: action, colorAccentText: contrast(action, "#ffffff") >= 4.5 ? "#ffffff" : contrast(action, "#111111") >= 4.5 ? "#111111" : "#000000", colorFocus: lum(bg) < 0.2 ? "#f4d788" : "#365e85" };
109
+ const keys = { "color-bg": "colorBg", "color-text": "colorText", "color-muted": "colorMuted", "color-accent": "colorAccent", "color-accent-text": "colorAccentText", "color-surface": "colorSurface", "color-surface-2": "colorSurface2", "color-border": "colorBorder", "color-focus": "colorFocus", "font-body": "fontBody", "font-display": "fontDisplay", radius: "radius", max: "maxWidth" };
110
+ return Object.entries(keys).map(([k, v]) => `--${k}:${t[v]}`).join(";") + `;--brand-original:${brand}`;
111
+ }
112
+ function previewBridge(identity) {
113
+ return `<style>html{overscroll-behavior:contain}</style><script>(()=>{const identity=${JSON.stringify(identity)},params=new URLSearchParams(location.hash.slice(1)),nonce=params.get('bridge'),origin=params.get('parent');let ready=false;const report=(kind,extra={})=>{if(parent!==window&&nonce&&origin)parent.postMessage({channel:'vitris-specimen-v1',identity,nonce,kind,...extra},origin);};addEventListener('click',e=>{const back=e.target.closest?.('a[href]');if(parent!==window&&nonce&&origin&&back?.href==='http://127.0.0.1:4390/'){e.preventDefault();report('close');return;}const a=e.target.closest?.('a[data-page-id],a[data-page-role]');if(a&&parent!==window&&nonce&&origin){e.preventDefault();const pageId=a.dataset.pageId||a.dataset.pageRole;report('navigate',{role:pageId,pageId});}});addEventListener('vitris-remember',e=>{const d=e.detail||{};if(typeof d.key==='string')report('memory',{key:d.key,value:d.value});});const metrics=()=>({y:scrollY,height:document.documentElement.scrollHeight,viewport:innerHeight});Promise.all([document.fonts.ready,...Array.from(document.images,i=>i.decode().catch(()=>null))]).then(()=>{if(document.body.getBoundingClientRect().height>0&&document.body.innerText.trim().length>20){ready=true;report('ready',metrics());}else report('error',{message:'Preview has no visible layout.'});});addEventListener('scroll',()=>{if(ready)report('scroll',metrics());},{passive:true});new ResizeObserver(()=>{if(ready)report('resize',metrics());}).observe(document.body);addEventListener('wheel',e=>{if(e.ctrlKey||e.metaKey)return;const max=document.documentElement.scrollHeight-innerHeight;if((e.deltaY<0&&scrollY<=1)||(e.deltaY>0&&scrollY>=max-1))report('edge',{delta:e.deltaY,mode:e.deltaMode});},{passive:true});addEventListener('keydown',e=>{if(e.key==='Escape'){e.preventDefault();report('close');}});addEventListener('message',e=>{const m=e.data;if(e.source!==parent||!m||m.channel!=='vitris-specimen-v1'||m.nonce!==nonce||m.identity!==identity)return;if(m.kind==='memory'&&typeof m.key==='string'){dispatchEvent(new CustomEvent('vitris-apply',{detail:{key:m.key,value:m.value}}));return;}if(m.kind!=='scroll-to'||!Number.isFinite(m.y))return;scrollTo({top:Math.max(0,Math.min(m.y,document.documentElement.scrollHeight-innerHeight)),behavior:'instant'});if(ready)report('scroll',metrics());});})();</script>`;
114
+ }
115
+ function renderCloudPage(recipe, manifest, brand, base, identity) {
116
+ let html = brand.original ? recipe.original : recipe.brand;
117
+ const logo = brand.logo ? `<img src="${esc(brand.logo)}" alt="${esc(brand.name)}">` : `<span>${esc(brand.name)}</span>`;
118
+ html = html.replaceAll("__VITRIS_LOGO__", logo).replaceAll("__VITRIS_BRAND_NAME__", esc(brand.name)).replaceAll("__VITRIS_CSS_VARS__", brandVars(manifest.tokens, brand.colors));
119
+ const encoded = brand.original ? "" : btoa(unescape(encodeURIComponent(JSON.stringify(brand))));
120
+ for (const page of manifest.pages) html = html.replaceAll(new RegExp("__VITRIS_PAGE_" + page.pageId + "__(\\?[A-Za-z0-9%&=;,+|:-]*)?", "g"), (_match, suffix = "") => {
121
+ const params = new URLSearchParams(suffix.replaceAll("&amp;", "&"));
122
+ if (encoded) params.set("b", encoded);
123
+ return esc(base + page.path + (params.size ? "?" + params : ""));
124
+ });
125
+ html = html.replaceAll("__VITRIS_RETURN__", "http://127.0.0.1:4390/");
126
+ if (identity) html = html.replaceAll('loading="lazy"', 'loading="eager"').replace("</body>", previewBridge(identity) + "</body>");
127
+ return html;
128
+ }
129
+
56
130
  // scripts/templates.ts
57
131
  var argv = process.argv.slice(2);
58
132
  var command = argv[0];
@@ -147,6 +221,8 @@ if (command === "gallery") {
147
221
  }
148
222
  const activeRelease = initial.catalog.release || initial.catalog.entries.map((e) => e.theme.release).sort((a, b) => releaseRank(b) - releaseRank(a))[0];
149
223
  if (releaseRank(entry.theme.release) <= releaseRank(activeRelease)) throw Error("New and revised templates require a release newer than the active catalog");
224
+ const typeErrors = validateTypography(entry.theme.tokens.typography, true);
225
+ if (typeErrors.length) throw Error(typeErrors.join("\n"));
150
226
  const assets = draft.assets || [];
151
227
  await pool(assets, async (a) => {
152
228
  const file = confined(root, a.localFile), bytes2 = readFileSync(file);
@@ -162,6 +238,20 @@ if (command === "gallery") {
162
238
  a.licenseUrl = origin + "/" + key2;
163
239
  }
164
240
  });
241
+ const { chromium: typographyChromium } = await import("playwright");
242
+ const typographyBrowser = await typographyChromium.launch();
243
+ try {
244
+ const manifest2 = { ...entry, version: 1, id: entry.theme.id, release: entry.theme.release, revision: "local-validation", name: entry.theme.name, tokens: entry.theme.tokens };
245
+ const documents = entry.pages.map((p) => {
246
+ const input = draft.recipes[p.pageId];
247
+ if (!input) throw Error("Missing recipe " + p.pageId);
248
+ const recipe = json(confined(root, input));
249
+ return { path: p.path, original: renderCloudPage(recipe, manifest2, { name: entry.business, colors: [], original: true }, origin), brand: renderCloudPage(recipe, manifest2, { name: "Typography verification", colors: ["#365e85"] }, origin) };
250
+ });
251
+ await verifyTemplateTypography(typographyBrowser, entry.theme.tokens, documents);
252
+ } finally {
253
+ await typographyBrowser.close();
254
+ }
165
255
  const sourceFiles = [];
166
256
  async function preserve(dir) {
167
257
  for (const f of readdirSync(dir, { withFileTypes: true })) {
@@ -19,7 +19,7 @@ import {
19
19
  thumbnailService,
20
20
  validateAdaptationPreferences,
21
21
  writeThemePicker
22
- } from "./chunks/chunk-GQPUILFR.js";
22
+ } from "./chunks/chunk-JPQCUN2J.js";
23
23
  import "./chunks/chunk-KVMZSQ3D.js";
24
24
  import "./chunks/chunk-WOORR67N.js";
25
25
  import "./chunks/chunk-PRLL7B63.js";
@@ -41,15 +41,16 @@ import {
41
41
  assetBytes,
42
42
  hostedAsset,
43
43
  visualTheme2 as visualTheme
44
- } from "./chunks/chunk-AUO5I56E.js";
44
+ } from "./chunks/chunk-C3F7XQD2.js";
45
45
  import "./chunks/chunk-BIEDSEL2.js";
46
46
  import "./chunks/chunk-IKNMBGGD.js";
47
47
  import "./chunks/chunk-WEFDVXFX.js";
48
- import "./chunks/chunk-H3BS2EBR.js";
49
- import "./chunks/chunk-L44ZTNDM.js";
50
- import "./chunks/chunk-37F7XIMH.js";
51
- import "./chunks/chunk-LKN75JGA.js";
48
+ import "./chunks/chunk-QRIYA3GJ.js";
49
+ import "./chunks/chunk-NMTFSWPK.js";
50
+ import "./chunks/chunk-JTXFTNEA.js";
51
+ import "./chunks/chunk-GE6UUEG2.js";
52
52
  import "./chunks/chunk-YYPYYOEV.js";
53
+ import "./chunks/chunk-S2XVNTQP.js";
53
54
  import "./chunks/chunk-GZDLXYZV.js";
54
55
  import "./chunks/chunk-G7MNMULR.js";
55
56
  import "./chunks/chunk-T6PE4KN4.js";