@motion-proto/live-tokens 0.78.0 → 0.80.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 (172) hide show
  1. package/.claude/skills/live-tokens-check-compliance/SKILL.md +49 -38
  2. package/.claude/skills/live-tokens-create-component/SKILL.md +23 -28
  3. package/.claude/skills/live-tokens-create-component/references/contract-tests.md +61 -0
  4. package/.claude/skills/live-tokens-create-component/references/sketch-mode.md +2 -2
  5. package/.claude/skills/live-tokens-create-component/references/token-naming.md +6 -15
  6. package/.claude/skills/live-tokens-create-page/SKILL.md +6 -4
  7. package/.claude/skills/live-tokens-create-theme/references/design-directions.md +1 -1
  8. package/.claude/skills/live-tokens-pick-component/SKILL.md +3 -3
  9. package/.claude/skills/live-tokens-set-colors/references/color-anchors.md +1 -1
  10. package/.claude/skills/live-tokens-set-geometry/SKILL.md +1 -1
  11. package/.claude/skills/live-tokens-set-geometry/references/geometry-anchors.md +1 -1
  12. package/CHANGELOG.md +271 -0
  13. package/README.md +10 -16
  14. package/bin/check-component.mjs +154 -551
  15. package/bin/check-page.mjs +57 -541
  16. package/bin/cli.mjs +93 -16
  17. package/bin/contractRunner.mjs +37 -91
  18. package/bin/lib/buildChecks.mjs +32 -0
  19. package/bin/lib/catalogue.mjs +161 -34
  20. package/bin/lib/componentSource.mjs +152 -0
  21. package/bin/lib/cssValues.mjs +9 -0
  22. package/bin/lib/dataDir.mjs +126 -0
  23. package/bin/lib/findings.mjs +103 -12
  24. package/bin/lib/fixers.mjs +64 -0
  25. package/bin/lib/geometry.mjs +92 -0
  26. package/bin/lib/pageSource.mjs +230 -0
  27. package/bin/lib/report.mjs +57 -59
  28. package/bin/lib/tokenVocabulary.mjs +104 -34
  29. package/bin/migrate-build-script.mjs +66 -0
  30. package/bin/migrate.mjs +5 -0
  31. package/bin/rules/componentStructure.mjs +344 -0
  32. package/bin/rules/componentUse.mjs +313 -0
  33. package/bin/rules/importsAndRoutes.mjs +136 -0
  34. package/bin/rules/testRuns.mjs +122 -0
  35. package/bin/rules/tokens.mjs +426 -0
  36. package/bin/setup-claude.mjs +1 -2
  37. package/dist-plugin/{chunk-PDNL4NC5.js → chunk-D4WRIKEZ.js} +7 -2
  38. package/dist-plugin/{chunk-SWXRVZKT.js → chunk-REBHE3ZM.js} +414 -1
  39. package/dist-plugin/index.cjs +470 -19
  40. package/dist-plugin/index.d.cts +1 -0
  41. package/dist-plugin/index.d.ts +1 -0
  42. package/dist-plugin/index.js +87 -55
  43. package/dist-plugin/migrateData/index.cjs +422 -4
  44. package/dist-plugin/migrateData/index.js +2 -2
  45. package/dist-plugin/setColors/index.cjs +414 -1
  46. package/dist-plugin/setColors/index.d.cts +1 -1
  47. package/dist-plugin/setColors/index.d.ts +1 -1
  48. package/dist-plugin/setColors/index.js +1 -1
  49. package/dist-plugin/setGeometry/index.cjs +423 -13
  50. package/dist-plugin/setGeometry/index.d.cts +3 -3
  51. package/dist-plugin/setGeometry/index.d.ts +3 -3
  52. package/dist-plugin/setGeometry/index.js +10 -13
  53. package/dist-plugin/setType/index.d.cts +1 -1
  54. package/dist-plugin/setType/index.d.ts +1 -1
  55. package/dist-plugin/{themeTypes-BxRtuN5V.d.cts → themeTypes-B8_Idrp4.d.cts} +2 -2
  56. package/dist-plugin/{themeTypes-BxRtuN5V.d.ts → themeTypes-B8_Idrp4.d.ts} +2 -2
  57. package/package.json +2 -2
  58. package/src/editor/component-editor/CalloutEditor.svelte +2 -2
  59. package/src/editor/component-editor/CollapsibleSectionEditor.svelte +14 -15
  60. package/src/editor/component-editor/CornerBadgeEditor.svelte +14 -14
  61. package/src/editor/component-editor/DialogEditor.svelte +5 -5
  62. package/src/editor/component-editor/InlineEditActionsEditor.svelte +2 -2
  63. package/src/editor/component-editor/RadioButtonEditor.svelte +21 -21
  64. package/src/editor/component-editor/SectionDividerEditor.svelte +7 -7
  65. package/src/editor/component-editor/SegmentedControlEditor.svelte +5 -5
  66. package/src/editor/component-editor/SideNavigationEditor.svelte +25 -25
  67. package/src/editor/component-editor/TabBarEditor.svelte +6 -6
  68. package/src/editor/component-editor/TableEditor.svelte +6 -6
  69. package/src/editor/component-editor/ToggleEditor.svelte +2 -2
  70. package/src/editor/component-editor/index.ts +3 -0
  71. package/src/editor/component-editor/registry.ts +57 -1
  72. package/src/editor/component-editor/scaffolding/TokenLayout.svelte +14 -14
  73. package/src/editor/component-editor/scaffolding/VariantGroup.svelte +3 -0
  74. package/src/editor/component-editor/scaffolding/types.ts +15 -0
  75. package/src/editor/core/components/adjustAliases.ts +4 -4
  76. package/src/editor/core/components/aliasKinds.ts +20 -19
  77. package/src/editor/core/sketch/sketchLayer.ts +3 -3
  78. package/src/editor/core/themes/migrateComponentConfig.ts +14 -6
  79. package/src/editor/core/themes/migrations/2026-09-13-badge-brand.ts +42 -0
  80. package/src/editor/core/themes/migrations/2026-09-13-collapsiblesection-open.ts +33 -0
  81. package/src/editor/core/themes/migrations/2026-09-13-cornerbadge-prefix.ts +70 -0
  82. package/src/editor/core/themes/migrations/2026-09-13-hairline.ts +92 -0
  83. package/src/editor/core/themes/migrations/2026-09-13-indicator.ts +54 -0
  84. package/src/editor/core/themes/migrations/2026-09-13-sectiondivider-surface.ts +36 -0
  85. package/src/editor/core/themes/migrations/2026-09-13-selected-state.ts +124 -0
  86. package/src/editor/core/themes/migrations/2026-09-13-toggle-label.ts +31 -0
  87. package/src/editor/core/themes/migrations/index.ts +16 -0
  88. package/src/editor/core/themes/themeService.ts +3 -3
  89. package/src/editor/core/themes/themeTypes.ts +13 -15
  90. package/src/editor/docs/Docs.svelte +1 -1
  91. package/src/editor/docs/content/light-and-dark.md +3 -3
  92. package/src/editor/docs/content.generated.ts +1 -1
  93. package/src/editor/index.ts +1 -0
  94. package/src/editor/overlay/LiveEditorOverlay.svelte +15 -0
  95. package/src/editor/skill-atlas/SkillAtlas.svelte +4 -4
  96. package/src/editor/skill-atlas/TreeNodeCard.svelte +4 -4
  97. package/src/editor/skill-atlas/skillSources.generated.ts +11 -14
  98. package/src/editor/skill-atlas/skillTrees.ts +1 -3
  99. package/src/editor/skill-atlas/trees/check-compliance.ts +37 -149
  100. package/src/editor/skill-atlas/trees/create-component.ts +62 -64
  101. package/src/editor/skill-atlas/trees/create-page.ts +38 -17
  102. package/src/editor/skill-atlas/trees/pick-component.ts +3 -3
  103. package/src/editor/skill-atlas/trees/set-geometry.ts +1 -1
  104. package/src/editor/ui/UIPaletteSelector.svelte +11 -15
  105. package/src/editor/ui/variantScales.ts +8 -8
  106. package/src/live-tokens/data/themes/autumn.json +188 -188
  107. package/src/live-tokens/data/themes/halloween.json +188 -188
  108. package/src/live-tokens/data/themes/midnight-study.json +245 -245
  109. package/src/live-tokens/data/themes/ocean.json +188 -188
  110. package/src/live-tokens/data/themes/royal-velvet.json +188 -188
  111. package/src/live-tokens/data/themes/sketchy.json +188 -188
  112. package/src/live-tokens/data/themes/spring-meadow.json +188 -188
  113. package/src/live-tokens/data/themes/sunset.json +188 -188
  114. package/src/system/components/Badge.svelte +27 -23
  115. package/src/system/components/Button.svelte +13 -7
  116. package/src/system/components/Callout.svelte +16 -11
  117. package/src/system/components/Card.svelte +22 -15
  118. package/src/system/components/CodeSnippet.svelte +10 -6
  119. package/src/system/components/CollapsibleSection.svelte +81 -76
  120. package/src/system/components/CornerBadge.svelte +78 -72
  121. package/src/system/components/Dialog.svelte +21 -18
  122. package/src/system/components/IconButton.svelte +13 -9
  123. package/src/system/components/Image.svelte +14 -8
  124. package/src/system/components/ImageLightbox.svelte +10 -6
  125. package/src/system/components/InlineEditActions.svelte +17 -14
  126. package/src/system/components/Input.svelte +13 -7
  127. package/src/system/components/MenuSelect.svelte +13 -7
  128. package/src/system/components/Notification.svelte +17 -11
  129. package/src/system/components/Panel.svelte +13 -6
  130. package/src/system/components/ProgressBar.svelte +10 -5
  131. package/src/system/components/RadioButton.svelte +33 -30
  132. package/src/system/components/SectionDivider.svelte +28 -21
  133. package/src/system/components/SegmentedControl.svelte +27 -23
  134. package/src/system/components/SideNavigation.svelte +175 -171
  135. package/src/system/components/Slider.svelte +11 -7
  136. package/src/system/components/TabBar.svelte +53 -49
  137. package/src/system/components/Table.svelte +20 -15
  138. package/src/system/components/Toggle.svelte +14 -10
  139. package/src/system/components/Tooltip.svelte +10 -6
  140. package/src/system/styles/CONVENTIONS.md +3 -4
  141. package/src/testing-js/chunk-3UKGXCDL.js +48 -0
  142. package/src/testing-js/chunk-3UKGXCDL.js.map +1 -0
  143. package/src/testing-js/{chunk-FAFOAWYL.js → chunk-Q3YIAAG3.js} +17 -3
  144. package/src/testing-js/chunk-Q3YIAAG3.js.map +1 -0
  145. package/src/testing-js/{chunk-GNIUPIU2.js → chunk-U7OJE5DU.js} +18 -18
  146. package/src/testing-js/chunk-U7OJE5DU.js.map +1 -0
  147. package/src/testing-js/{chunk-4JQX6WWL.js → chunk-ZMZQZ33J.js} +474 -166
  148. package/src/testing-js/chunk-ZMZQZ33J.js.map +1 -0
  149. package/src/testing-js/component-behavior.contract.js +155 -0
  150. package/src/testing-js/component-behavior.contract.js.map +1 -0
  151. package/src/testing-js/component-editor.contract.js +6 -4
  152. package/src/testing-js/component-editor.contract.js.map +1 -1
  153. package/src/testing-js/component-render.contract.js +14 -10
  154. package/src/testing-js/component-render.contract.js.map +1 -1
  155. package/src/testing-js/index.d.ts +44 -4
  156. package/src/testing-js/index.js +13 -7
  157. package/src/testing-js/index.js.map +1 -1
  158. package/src/testing-js/page-compliance.contract.js +48 -10
  159. package/src/testing-js/page-compliance.contract.js.map +1 -1
  160. package/src/testing-js/registry.contract.js +5 -3
  161. package/src/testing-js/registry.contract.js.map +1 -1
  162. package/src/testing-js/{vitest-C-wNWcoA.d.ts → vitest-BMLIbDs2.d.ts} +8 -2
  163. package/src/testing-js/vitest.d.ts +1 -1
  164. package/src/testing-js/vitest.js +2 -1
  165. package/template/package.json +1 -2
  166. package/template/vite.config.ts +3 -2
  167. package/.claude/skills/live-tokens-create-component/SKILL copy.md +0 -196
  168. package/.claude/skills/live-tokens-fix-findings/SKILL.md +0 -105
  169. package/src/editor/skill-atlas/trees/fix-findings.ts +0 -504
  170. package/src/testing-js/chunk-4JQX6WWL.js.map +0 -1
  171. package/src/testing-js/chunk-FAFOAWYL.js.map +0 -1
  172. package/src/testing-js/chunk-GNIUPIU2.js.map +0 -1
@@ -0,0 +1,155 @@
1
+ import {
2
+ ContractViolation,
3
+ isInapplicable,
4
+ partLocator
5
+ } from "./chunk-3UKGXCDL.js";
6
+ import {
7
+ selectedContracts
8
+ } from "./chunk-ZMZQZ33J.js";
9
+
10
+ // src/testing/component-behavior.contract.ts
11
+ import { existsSync } from "fs";
12
+ import path from "path";
13
+ import { fileURLToPath, pathToFileURL } from "url";
14
+ import { describe, it, vi } from "vitest";
15
+ import { flushSync, mount, unmount } from "svelte";
16
+ import { getComponentRegistryEntries } from "../editor/component-editor/registry";
17
+ var REGISTRY_SETUP_ENV = "LIVE_TOKENS_REGISTRY_SETUP";
18
+ var setupModule = process.env[REGISTRY_SETUP_ENV];
19
+ if (setupModule) await import(pathToFileURL(path.resolve(setupModule)).href);
20
+ var packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
21
+ var consumerRoot = process.cwd();
22
+ var contracts = await selectedContracts();
23
+ function runtimeSource(contract) {
24
+ const entry = getComponentRegistryEntries().find((candidate) => candidate.id === contract.id);
25
+ if (!entry) return { skip: "no component is registered under this id" };
26
+ const root = entry.origin === "system" ? packageRoot : consumerRoot;
27
+ const file = path.resolve(root, entry.sourceFile);
28
+ if (!existsSync(file)) return { skip: `the registration names ${entry.sourceFile}, which does not exist` };
29
+ return { url: pathToFileURL(file).href };
30
+ }
31
+ function resolvePart(contract, target, key) {
32
+ const locator = partLocator(contract, key);
33
+ const scope = locator.portal ? document : target;
34
+ const node = scope.querySelector(locator.selector);
35
+ if (!node) {
36
+ throw new ContractViolation("contract-behavior", contract.id, `no element matches part "${key}" (${locator.selector})`);
37
+ }
38
+ return node;
39
+ }
40
+ function dispatch(node, action) {
41
+ if (action.kind === "click") {
42
+ node.dispatchEvent(new MouseEvent("click", { bubbles: true, cancelable: true }));
43
+ return;
44
+ }
45
+ if (action.kind === "keydown") {
46
+ node.dispatchEvent(new KeyboardEvent("keydown", { key: action.key ?? "", bubbles: true, cancelable: true }));
47
+ return;
48
+ }
49
+ node.value = action.value ?? "";
50
+ node.dispatchEvent(new Event("input", { bubbles: true }));
51
+ }
52
+ function describeValue(value) {
53
+ if (value instanceof Event) return `${value.constructor.name}(${value.type})`;
54
+ return JSON.stringify(value) ?? String(value);
55
+ }
56
+ function matchesArg(actual, expected) {
57
+ if (expected === null || typeof expected !== "object" || Array.isArray(expected)) {
58
+ return Object.is(actual, expected);
59
+ }
60
+ if (actual === null || typeof actual !== "object") return false;
61
+ return Object.entries(expected).every(([key, value]) => matchesArg(actual[key], value));
62
+ }
63
+ function sameArgs(actual, expected) {
64
+ return actual.length === expected.length && expected.every((value, index) => matchesArg(actual[index], value));
65
+ }
66
+ async function runCase(contract, runtime, testCase) {
67
+ const target = document.createElement("div");
68
+ document.body.appendChild(target);
69
+ const fail = (message) => {
70
+ throw new ContractViolation("contract-behavior", contract.id, `${testCase.name}: ${message}`);
71
+ };
72
+ const expectation = testCase.expect;
73
+ const callbackProp = expectation.kind === "callback" || expectation.kind === "no-callback" ? expectation.prop : null;
74
+ const spy = callbackProp === null ? null : vi.fn();
75
+ const props = {
76
+ ...testCase.props,
77
+ ...callbackProp === null ? {} : { [callbackProp]: spy }
78
+ };
79
+ const instance = mount(runtime, { target, props });
80
+ flushSync();
81
+ try {
82
+ if (testCase.action) {
83
+ dispatch(resolvePart(contract, target, testCase.action.part), testCase.action);
84
+ flushSync();
85
+ }
86
+ if (expectation.kind === "callback") {
87
+ const calls = spy.mock.calls;
88
+ if (calls.length === 0) fail(`${expectation.prop} was not called`);
89
+ if (!sameArgs(calls[0], expectation.args)) {
90
+ fail(`${expectation.prop} was called with [${calls[0].map(describeValue).join(", ")}], expected ${describeValue(expectation.args)}`);
91
+ }
92
+ return;
93
+ }
94
+ if (expectation.kind === "no-callback") {
95
+ if (spy.mock.calls.length > 0) {
96
+ fail(`${expectation.prop} was called with [${spy.mock.calls[0].map(describeValue).join(", ")}]`);
97
+ }
98
+ return;
99
+ }
100
+ const node = resolvePart(contract, target, expectation.part);
101
+ if (expectation.kind === "attribute") {
102
+ const actual = node.getAttribute(expectation.name);
103
+ if (actual !== expectation.value) {
104
+ fail(`${expectation.part}[${expectation.name}] is ${describeValue(actual)}, expected ${describeValue(expectation.value)}`);
105
+ }
106
+ return;
107
+ }
108
+ const text = (node.textContent ?? "").replace(/\s+/g, " ").trim();
109
+ if (text !== expectation.value) {
110
+ fail(`${expectation.part} reads ${describeValue(text)}, expected ${describeValue(expectation.value)}`);
111
+ }
112
+ } finally {
113
+ unmount(instance);
114
+ target.remove();
115
+ }
116
+ }
117
+ describe("component behavior contract", () => {
118
+ describe.each(contracts.map((contract) => [contract.id, contract]))("%s", (_id, contract) => {
119
+ const declared = contract.behavior;
120
+ if (isInapplicable(declared)) {
121
+ it("says why it declares no behavior", () => {
122
+ if (declared.reason.trim() === "") {
123
+ throw new ContractViolation("contract-behavior", contract.id, "behavior is inapplicable with no reason");
124
+ }
125
+ });
126
+ return;
127
+ }
128
+ if (!declared || declared.cases.length === 0) {
129
+ it("declares its behavior", () => {
130
+ throw new ContractViolation(
131
+ "contract-behavior",
132
+ contract.id,
133
+ "declare `behavior` with at least one case, or mark it { applicable: false, reason }"
134
+ );
135
+ });
136
+ return;
137
+ }
138
+ const source = runtimeSource(contract);
139
+ if ("skip" in source) {
140
+ for (const testCase of declared.cases) it.skip(`${testCase.name} (${source.skip})`, () => {
141
+ });
142
+ return;
143
+ }
144
+ const { url } = source;
145
+ let loading = null;
146
+ it.each(declared.cases.map((testCase) => [testCase.name, testCase]))("%s", async (_name, testCase) => {
147
+ loading ??= import(
148
+ /* @vite-ignore */
149
+ url
150
+ ).then((module) => module.default);
151
+ await runCase(contract, await loading, testCase);
152
+ });
153
+ });
154
+ });
155
+ //# sourceMappingURL=component-behavior.contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../testing/component-behavior.contract.ts"],"sourcesContent":["// @vitest-environment happy-dom\n//\n// A controlled component moves nothing itself, so the browser suites watch a\n// click land and see the preview unchanged. The callback it calls instead is\n// observable only from a mounted fixture, which is what this suite drives.\n// The setup module is what registers the project's components; without one the\n// run covers the components the package registers itself.\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { describe, it, vi } from 'vitest';\nimport { flushSync, mount, unmount } from 'svelte';\nimport type { Component } from 'svelte';\nimport { getComponentRegistryEntries } from '../editor/component-editor/registry';\nimport {\n ContractViolation,\n isInapplicable,\n partLocator,\n type BehaviorCase,\n type ComponentContract,\n} from './componentContract';\nimport { selectedContracts } from './contracts';\n\nconst REGISTRY_SETUP_ENV = 'LIVE_TOKENS_REGISTRY_SETUP';\n\nconst setupModule = process.env[REGISTRY_SETUP_ENV];\nif (setupModule) await import(pathToFileURL(path.resolve(setupModule)).href);\n\n/** `<package>/src/testing/` is this file's directory in the repository and in\n * an installed copy alike, so the package root is two levels up. */\nconst packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');\nconst consumerRoot = process.cwd();\n\nconst contracts = await selectedContracts();\n\n/**\n * Where the registration says the runtime is, or why this suite cannot reach\n * it. A registration naming a file that is not there is `contract-registry`'s\n * finding, and reporting it again per behavior case would multiply one defect\n * across every declared case.\n */\nfunction runtimeSource(contract: ComponentContract): { url: string } | { skip: string } {\n const entry = getComponentRegistryEntries().find((candidate) => candidate.id === contract.id);\n if (!entry) return { skip: 'no component is registered under this id' };\n const root = entry.origin === 'system' ? packageRoot : consumerRoot;\n const file = path.resolve(root, entry.sourceFile);\n if (!existsSync(file)) return { skip: `the registration names ${entry.sourceFile}, which does not exist` };\n return { url: pathToFileURL(file).href };\n}\n\nfunction resolvePart(contract: ComponentContract, target: HTMLElement, key: string): HTMLElement {\n const locator = partLocator(contract, key);\n const scope: ParentNode = locator.portal ? document : target;\n const node = scope.querySelector<HTMLElement>(locator.selector);\n if (!node) {\n throw new ContractViolation('contract-behavior', contract.id, `no element matches part \"${key}\" (${locator.selector})`);\n }\n return node;\n}\n\nfunction dispatch(node: HTMLElement, action: NonNullable<BehaviorCase['action']>): void {\n if (action.kind === 'click') {\n node.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true }));\n return;\n }\n if (action.kind === 'keydown') {\n node.dispatchEvent(new KeyboardEvent('keydown', { key: action.key ?? '', bubbles: true, cancelable: true }));\n return;\n }\n (node as HTMLInputElement).value = action.value ?? '';\n node.dispatchEvent(new Event('input', { bubbles: true }));\n}\n\nfunction describeValue(value: unknown): string {\n if (value instanceof Event) return `${value.constructor.name}(${value.type})`;\n return JSON.stringify(value) ?? String(value);\n}\n\n/** An expected object pins the keys it names and nothing else, so a case can\n * ask for `{ type: 'click' }` of the event a DOM handler hands on. */\nfunction matchesArg(actual: unknown, expected: unknown): boolean {\n if (expected === null || typeof expected !== 'object' || Array.isArray(expected)) {\n return Object.is(actual, expected);\n }\n if (actual === null || typeof actual !== 'object') return false;\n return Object.entries(expected as Record<string, unknown>)\n .every(([key, value]) => matchesArg((actual as Record<string, unknown>)[key], value));\n}\n\nfunction sameArgs(actual: unknown[], expected: unknown[]): boolean {\n return actual.length === expected.length\n && expected.every((value, index) => matchesArg(actual[index], value));\n}\n\nasync function runCase(\n contract: ComponentContract,\n runtime: Component<Record<string, unknown>>,\n testCase: BehaviorCase,\n): Promise<void> {\n const target = document.createElement('div');\n document.body.appendChild(target);\n const fail = (message: string): never => {\n throw new ContractViolation('contract-behavior', contract.id, `${testCase.name}: ${message}`);\n };\n\n const expectation = testCase.expect;\n const callbackProp = expectation.kind === 'callback' || expectation.kind === 'no-callback'\n ? expectation.prop\n : null;\n const spy = callbackProp === null ? null : vi.fn();\n const props: Record<string, unknown> = {\n ...testCase.props,\n ...(callbackProp === null ? {} : { [callbackProp]: spy }),\n };\n\n const instance = mount(runtime, { target, props });\n flushSync();\n try {\n if (testCase.action) {\n dispatch(resolvePart(contract, target, testCase.action.part), testCase.action);\n flushSync();\n }\n if (expectation.kind === 'callback') {\n const calls = spy!.mock.calls;\n if (calls.length === 0) fail(`${expectation.prop} was not called`);\n if (!sameArgs(calls[0], expectation.args)) {\n fail(`${expectation.prop} was called with [${calls[0].map(describeValue).join(', ')}], expected ${describeValue(expectation.args)}`);\n }\n return;\n }\n if (expectation.kind === 'no-callback') {\n if (spy!.mock.calls.length > 0) {\n fail(`${expectation.prop} was called with [${spy!.mock.calls[0].map(describeValue).join(', ')}]`);\n }\n return;\n }\n const node = resolvePart(contract, target, expectation.part);\n if (expectation.kind === 'attribute') {\n const actual = node.getAttribute(expectation.name);\n if (actual !== expectation.value) {\n fail(`${expectation.part}[${expectation.name}] is ${describeValue(actual)}, expected ${describeValue(expectation.value)}`);\n }\n return;\n }\n const text = (node.textContent ?? '').replace(/\\s+/g, ' ').trim();\n if (text !== expectation.value) {\n fail(`${expectation.part} reads ${describeValue(text)}, expected ${describeValue(expectation.value)}`);\n }\n } finally {\n unmount(instance);\n target.remove();\n }\n}\n\ndescribe('component behavior contract', () => {\n describe.each(contracts.map((contract) => [contract.id, contract] as const))('%s', (_id, contract) => {\n const declared = contract.behavior;\n if (isInapplicable(declared)) {\n it('says why it declares no behavior', () => {\n if (declared.reason.trim() === '') {\n throw new ContractViolation('contract-behavior', contract.id, 'behavior is inapplicable with no reason');\n }\n });\n return;\n }\n // A contract written before `behavior` existed reaches here with the field\n // missing, which the types forbid but a consumer's upgrade produces.\n if (!declared || declared.cases.length === 0) {\n it('declares its behavior', () => {\n throw new ContractViolation(\n 'contract-behavior',\n contract.id,\n 'declare `behavior` with at least one case, or mark it { applicable: false, reason }',\n );\n });\n return;\n }\n const source = runtimeSource(contract);\n if ('skip' in source) {\n for (const testCase of declared.cases) it.skip(`${testCase.name} (${source.skip})`, () => {});\n return;\n }\n const { url } = source;\n // One import for the whole component, started by the first case rather\n // than during collection, so a runtime that fails to load rejects inside a\n // test that reports it instead of as an unhandled rejection.\n let loading: Promise<Component<Record<string, unknown>>> | null = null;\n it.each(declared.cases.map((testCase) => [testCase.name, testCase] as const))('%s', async (_name, testCase) => {\n loading ??= import(/* @vite-ignore */ url).then((module) => module.default as Component<Record<string, unknown>>);\n await runCase(contract, await loading, testCase);\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,14 +1,16 @@
1
1
  import {
2
2
  ContractHarness
3
- } from "./chunk-GNIUPIU2.js";
3
+ } from "./chunk-U7OJE5DU.js";
4
4
  import "./chunk-WIZ6W7UT.js";
5
5
  import {
6
6
  ContractViolation,
7
+ isInapplicable
8
+ } from "./chunk-3UKGXCDL.js";
9
+ import "./chunk-NB3NZRBM.js";
10
+ import {
7
11
  allContracts,
8
- isInapplicable,
9
12
  selectedContracts
10
- } from "./chunk-4JQX6WWL.js";
11
- import "./chunk-NB3NZRBM.js";
13
+ } from "./chunk-ZMZQZ33J.js";
12
14
 
13
15
  // src/testing/component-editor.contract.ts
14
16
  import { test } from "@playwright/test";
@@ -1 +1 @@
1
- {"version":3,"sources":["../testing/component-editor.contract.ts"],"sourcesContent":["import { test } from '@playwright/test';\nimport { ContractViolation, isInapplicable } from './componentContract';\nimport { allContracts, selectedContracts } from './contracts';\nimport { ContractHarness } from './support/contractHarness';\n\nconst selected = await selectedContracts();\nconst requested = process.env.LIVE_TOKENS_COMPONENT;\n\n// A failing test rather than a throw from the config: the JSON report then\n// carries the rule, and the runner maps it like any other violation instead\n// of reading a stderr tail.\nif (requested && selected.length === 0) {\n const declared = (await allContracts()).map((contract) => contract.id).sort();\n test.describe.serial(requested, () => {\n test(`${requested} has a component contract`, () => {\n throw new ContractViolation(\n 'contract-missing',\n requested,\n 'no component contract is declared for it. Export one from the module '\n + `\\`contractsModule\\` names in live-tokens.testing.ts. Declared: ${declared.join(', ')}`,\n );\n });\n });\n}\n\nfor (const contract of selected) {\n // Serial, so a component that is not registered reports that and stops rather\n // than reporting six preview failures caused by the missing entry.\n test.describe.serial(contract.id, () => {\n test(`${contract.id} is listed in its registry group`, async ({ page }) => {\n const harness = await ContractHarness.attach(page, contract);\n await harness.assertListed();\n });\n\n test(`${contract.id} declares every part and every shipped alias`, async ({ page }) => {\n const harness = await ContractHarness.open(page, contract);\n await harness.assertInventory();\n });\n\n test(`${contract.id} resolves every alias it paints with`, async ({ page }) => {\n const harness = await ContractHarness.open(page, contract);\n await harness.assertAliasesResolve();\n });\n\n test(`${contract.id} previews the state being edited`, async ({ page }) => {\n const harness = await ContractHarness.open(page, contract);\n if (isInapplicable(contract.states)) {\n test.info().annotations.push({ type: 'inapplicable', description: contract.states.reason });\n }\n await harness.assertStates();\n });\n\n test(`${contract.id} answers the pointer and the keyboard`, async ({ page }) => {\n const harness = await ContractHarness.open(page, contract);\n if (isInapplicable(contract.interaction)) {\n test.info().annotations.push({ type: 'inapplicable', description: contract.interaction.reason });\n }\n await harness.assertInteraction();\n });\n\n test(`${contract.id} persists an edit and resets to the saved config`, async ({ page }) => {\n test.setTimeout(180_000);\n const harness = await ContractHarness.open(page, contract);\n await harness.assertPersistence();\n });\n\n test(`${contract.id} takes the theme's values and gives them back`, async ({ page }) => {\n const harness = await ContractHarness.open(page, contract);\n await harness.assertThemeProjection(contract.theme);\n });\n\n test(`${contract.id} draws every painted part in Sketch mode`, async ({ page }) => {\n const harness = await ContractHarness.open(page, contract);\n const sketch = contract.sketch;\n if (isInapplicable(sketch)) {\n test.info().annotations.push({ type: 'inapplicable', description: sketch.reason });\n await harness.assertNoSketchPaint('pencil');\n return;\n }\n await harness.assertSketchPaint(sketch);\n });\n });\n}\n"],"mappings":";;;;;;;;;;;;;AAAA,SAAS,YAAY;AAKrB,IAAM,WAAW,MAAM,kBAAkB;AACzC,IAAM,YAAY,QAAQ,IAAI;AAK9B,IAAI,aAAa,SAAS,WAAW,GAAG;AACtC,QAAM,YAAY,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,SAAS,EAAE,EAAE,KAAK;AAC5E,OAAK,SAAS,OAAO,WAAW,MAAM;AACpC,SAAK,GAAG,SAAS,6BAA6B,MAAM;AAClD,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA,uIACoE,SAAS,KAAK,IAAI,CAAC;AAAA,MACzF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,WAAW,YAAY,UAAU;AAG/B,OAAK,SAAS,OAAO,SAAS,IAAI,MAAM;AACtC,SAAK,GAAG,SAAS,EAAE,oCAAoC,OAAO,EAAE,KAAK,MAAM;AACzE,YAAM,UAAU,MAAM,gBAAgB,OAAO,MAAM,QAAQ;AAC3D,YAAM,QAAQ,aAAa;AAAA,IAC7B,CAAC;AAED,SAAK,GAAG,SAAS,EAAE,gDAAgD,OAAO,EAAE,KAAK,MAAM;AACrF,YAAM,UAAU,MAAM,gBAAgB,KAAK,MAAM,QAAQ;AACzD,YAAM,QAAQ,gBAAgB;AAAA,IAChC,CAAC;AAED,SAAK,GAAG,SAAS,EAAE,wCAAwC,OAAO,EAAE,KAAK,MAAM;AAC7E,YAAM,UAAU,MAAM,gBAAgB,KAAK,MAAM,QAAQ;AACzD,YAAM,QAAQ,qBAAqB;AAAA,IACrC,CAAC;AAED,SAAK,GAAG,SAAS,EAAE,oCAAoC,OAAO,EAAE,KAAK,MAAM;AACzE,YAAM,UAAU,MAAM,gBAAgB,KAAK,MAAM,QAAQ;AACzD,UAAI,eAAe,SAAS,MAAM,GAAG;AACnC,aAAK,KAAK,EAAE,YAAY,KAAK,EAAE,MAAM,gBAAgB,aAAa,SAAS,OAAO,OAAO,CAAC;AAAA,MAC5F;AACA,YAAM,QAAQ,aAAa;AAAA,IAC7B,CAAC;AAED,SAAK,GAAG,SAAS,EAAE,yCAAyC,OAAO,EAAE,KAAK,MAAM;AAC9E,YAAM,UAAU,MAAM,gBAAgB,KAAK,MAAM,QAAQ;AACzD,UAAI,eAAe,SAAS,WAAW,GAAG;AACxC,aAAK,KAAK,EAAE,YAAY,KAAK,EAAE,MAAM,gBAAgB,aAAa,SAAS,YAAY,OAAO,CAAC;AAAA,MACjG;AACA,YAAM,QAAQ,kBAAkB;AAAA,IAClC,CAAC;AAED,SAAK,GAAG,SAAS,EAAE,oDAAoD,OAAO,EAAE,KAAK,MAAM;AACzF,WAAK,WAAW,IAAO;AACvB,YAAM,UAAU,MAAM,gBAAgB,KAAK,MAAM,QAAQ;AACzD,YAAM,QAAQ,kBAAkB;AAAA,IAClC,CAAC;AAED,SAAK,GAAG,SAAS,EAAE,iDAAiD,OAAO,EAAE,KAAK,MAAM;AACtF,YAAM,UAAU,MAAM,gBAAgB,KAAK,MAAM,QAAQ;AACzD,YAAM,QAAQ,sBAAsB,SAAS,KAAK;AAAA,IACpD,CAAC;AAED,SAAK,GAAG,SAAS,EAAE,4CAA4C,OAAO,EAAE,KAAK,MAAM;AACjF,YAAM,UAAU,MAAM,gBAAgB,KAAK,MAAM,QAAQ;AACzD,YAAM,SAAS,SAAS;AACxB,UAAI,eAAe,MAAM,GAAG;AAC1B,aAAK,KAAK,EAAE,YAAY,KAAK,EAAE,MAAM,gBAAgB,aAAa,OAAO,OAAO,CAAC;AACjF,cAAM,QAAQ,oBAAoB,QAAQ;AAC1C;AAAA,MACF;AACA,YAAM,QAAQ,kBAAkB,MAAM;AAAA,IACxC,CAAC;AAAA,EACH,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../testing/component-editor.contract.ts"],"sourcesContent":["import { test } from '@playwright/test';\nimport { ContractViolation, isInapplicable } from './componentContract';\nimport { allContracts, selectedContracts } from './contracts';\nimport { ContractHarness } from './support/contractHarness';\n\nconst selected = await selectedContracts();\nconst requested = process.env.LIVE_TOKENS_COMPONENT;\n\n// A failing test rather than a throw from the config: the JSON report then\n// carries the rule, and the runner maps it like any other violation instead\n// of reading a stderr tail.\nif (requested && selected.length === 0) {\n const declared = (await allContracts()).map((contract) => contract.id).sort();\n test.describe.serial(requested, () => {\n test(`${requested} has a component contract`, () => {\n throw new ContractViolation(\n 'contract-missing',\n requested,\n 'no component contract is declared for it. Export one from the module '\n + `\\`contractsModule\\` names in live-tokens.testing.ts. Declared: ${declared.join(', ')}`,\n );\n });\n });\n}\n\nfor (const contract of selected) {\n // Serial, so a component that is not registered reports that and stops rather\n // than reporting six preview failures caused by the missing entry.\n test.describe.serial(contract.id, () => {\n test(`${contract.id} is listed in its registry group`, async ({ page }) => {\n const harness = await ContractHarness.attach(page, contract);\n await harness.assertListed();\n });\n\n test(`${contract.id} declares every part and every shipped alias`, async ({ page }) => {\n const harness = await ContractHarness.open(page, contract);\n await harness.assertInventory();\n });\n\n test(`${contract.id} resolves every alias it paints with`, async ({ page }) => {\n const harness = await ContractHarness.open(page, contract);\n await harness.assertAliasesResolve();\n });\n\n test(`${contract.id} previews the state being edited`, async ({ page }) => {\n const harness = await ContractHarness.open(page, contract);\n if (isInapplicable(contract.states)) {\n test.info().annotations.push({ type: 'inapplicable', description: contract.states.reason });\n }\n await harness.assertStates();\n });\n\n test(`${contract.id} answers the pointer and the keyboard`, async ({ page }) => {\n const harness = await ContractHarness.open(page, contract);\n if (isInapplicable(contract.interaction)) {\n test.info().annotations.push({ type: 'inapplicable', description: contract.interaction.reason });\n }\n await harness.assertInteraction();\n });\n\n test(`${contract.id} persists an edit and resets to the saved config`, async ({ page }) => {\n test.setTimeout(180_000);\n const harness = await ContractHarness.open(page, contract);\n await harness.assertPersistence();\n });\n\n test(`${contract.id} takes the theme's values and gives them back`, async ({ page }) => {\n const harness = await ContractHarness.open(page, contract);\n await harness.assertThemeProjection(contract.theme);\n });\n\n test(`${contract.id} draws every painted part in Sketch mode`, async ({ page }) => {\n const harness = await ContractHarness.open(page, contract);\n const sketch = contract.sketch;\n if (isInapplicable(sketch)) {\n test.info().annotations.push({ type: 'inapplicable', description: sketch.reason });\n await harness.assertNoSketchPaint('pencil');\n return;\n }\n await harness.assertSketchPaint(sketch);\n });\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;AAAA,SAAS,YAAY;AAKrB,IAAM,WAAW,MAAM,kBAAkB;AACzC,IAAM,YAAY,QAAQ,IAAI;AAK9B,IAAI,aAAa,SAAS,WAAW,GAAG;AACtC,QAAM,YAAY,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,SAAS,EAAE,EAAE,KAAK;AAC5E,OAAK,SAAS,OAAO,WAAW,MAAM;AACpC,SAAK,GAAG,SAAS,6BAA6B,MAAM;AAClD,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA,uIACoE,SAAS,KAAK,IAAI,CAAC;AAAA,MACzF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,WAAW,YAAY,UAAU;AAG/B,OAAK,SAAS,OAAO,SAAS,IAAI,MAAM;AACtC,SAAK,GAAG,SAAS,EAAE,oCAAoC,OAAO,EAAE,KAAK,MAAM;AACzE,YAAM,UAAU,MAAM,gBAAgB,OAAO,MAAM,QAAQ;AAC3D,YAAM,QAAQ,aAAa;AAAA,IAC7B,CAAC;AAED,SAAK,GAAG,SAAS,EAAE,gDAAgD,OAAO,EAAE,KAAK,MAAM;AACrF,YAAM,UAAU,MAAM,gBAAgB,KAAK,MAAM,QAAQ;AACzD,YAAM,QAAQ,gBAAgB;AAAA,IAChC,CAAC;AAED,SAAK,GAAG,SAAS,EAAE,wCAAwC,OAAO,EAAE,KAAK,MAAM;AAC7E,YAAM,UAAU,MAAM,gBAAgB,KAAK,MAAM,QAAQ;AACzD,YAAM,QAAQ,qBAAqB;AAAA,IACrC,CAAC;AAED,SAAK,GAAG,SAAS,EAAE,oCAAoC,OAAO,EAAE,KAAK,MAAM;AACzE,YAAM,UAAU,MAAM,gBAAgB,KAAK,MAAM,QAAQ;AACzD,UAAI,eAAe,SAAS,MAAM,GAAG;AACnC,aAAK,KAAK,EAAE,YAAY,KAAK,EAAE,MAAM,gBAAgB,aAAa,SAAS,OAAO,OAAO,CAAC;AAAA,MAC5F;AACA,YAAM,QAAQ,aAAa;AAAA,IAC7B,CAAC;AAED,SAAK,GAAG,SAAS,EAAE,yCAAyC,OAAO,EAAE,KAAK,MAAM;AAC9E,YAAM,UAAU,MAAM,gBAAgB,KAAK,MAAM,QAAQ;AACzD,UAAI,eAAe,SAAS,WAAW,GAAG;AACxC,aAAK,KAAK,EAAE,YAAY,KAAK,EAAE,MAAM,gBAAgB,aAAa,SAAS,YAAY,OAAO,CAAC;AAAA,MACjG;AACA,YAAM,QAAQ,kBAAkB;AAAA,IAClC,CAAC;AAED,SAAK,GAAG,SAAS,EAAE,oDAAoD,OAAO,EAAE,KAAK,MAAM;AACzF,WAAK,WAAW,IAAO;AACvB,YAAM,UAAU,MAAM,gBAAgB,KAAK,MAAM,QAAQ;AACzD,YAAM,QAAQ,kBAAkB;AAAA,IAClC,CAAC;AAED,SAAK,GAAG,SAAS,EAAE,iDAAiD,OAAO,EAAE,KAAK,MAAM;AACtF,YAAM,UAAU,MAAM,gBAAgB,KAAK,MAAM,QAAQ;AACzD,YAAM,QAAQ,sBAAsB,SAAS,KAAK;AAAA,IACpD,CAAC;AAED,SAAK,GAAG,SAAS,EAAE,4CAA4C,OAAO,EAAE,KAAK,MAAM;AACjF,YAAM,UAAU,MAAM,gBAAgB,KAAK,MAAM,QAAQ;AACzD,YAAM,SAAS,SAAS;AACxB,UAAI,eAAe,MAAM,GAAG;AAC1B,aAAK,KAAK,EAAE,YAAY,KAAK,EAAE,MAAM,gBAAgB,aAAa,OAAO,OAAO,CAAC;AACjF,cAAM,QAAQ,oBAAoB,QAAQ;AAC1C;AAAA,MACF;AACA,YAAM,QAAQ,kBAAkB,MAAM;AAAA,IACxC,CAAC;AAAA,EACH,CAAC;AACH;","names":[]}
@@ -1,13 +1,14 @@
1
1
  import {
2
2
  ContractHarness
3
- } from "./chunk-GNIUPIU2.js";
3
+ } from "./chunk-U7OJE5DU.js";
4
4
  import {
5
5
  openComponentsEditor
6
6
  } from "./chunk-WIZ6W7UT.js";
7
+ import "./chunk-3UKGXCDL.js";
8
+ import "./chunk-NB3NZRBM.js";
7
9
  import {
8
10
  selectedContracts
9
- } from "./chunk-4JQX6WWL.js";
10
- import "./chunk-NB3NZRBM.js";
11
+ } from "./chunk-ZMZQZ33J.js";
11
12
 
12
13
  // src/testing/component-render.contract.ts
13
14
  import fs from "fs";
@@ -344,7 +345,7 @@ async function probeCurrentView(page, componentAliases, forcedVariables = [], pr
344
345
  if (variable.includes("letter-spacing")) add("7px", "-2px");
345
346
  if (variable.includes("shadow")) add("rgb(1, 2, 3) 7px 9px 0 3px", "none");
346
347
  if (variable.includes("blur")) add("blur(7px)", "none");
347
- if (variable.includes("gradient") || variable.endsWith("-background")) {
348
+ if (variable.includes("gradient")) {
348
349
  add("linear-gradient(90deg, rgb(1, 2, 3), rgb(253, 127, 3))", "none");
349
350
  }
350
351
  if (variable.includes("duration") || variable.includes("transition")) add("9s", "0s");
@@ -411,6 +412,9 @@ async function probeCurrentView(page, componentAliases, forcedVariables = [], pr
411
412
  return { covered, unchanged };
412
413
  }, { allAliases: componentAliases, forced: forcedVariables, proven: provenVariables });
413
414
  }
415
+ async function selectTab(tab) {
416
+ await tab.click({ force: true });
417
+ }
414
418
  async function selectComponent(page, component) {
415
419
  await page.evaluate(async (id) => {
416
420
  const editor = window.__liveTokensEditor;
@@ -470,7 +474,7 @@ for (const [component, aliases] of aliasesByComponent) {
470
474
  const variantLabels = await variantTabs.count() ? await variantTabs.allTextContents() : [""];
471
475
  for (let variantIndex = 0; variantIndex < variantLabels.length; variantIndex++) {
472
476
  if (variantLabels[variantIndex]) {
473
- await page.locator(".variant-group:visible .variant-tabs .variant-tab-btn").nth(variantIndex).click({ force: true });
477
+ await selectTab(page.locator(".variant-group:visible .variant-tabs .variant-tab-btn").nth(variantIndex));
474
478
  }
475
479
  await probe(componentAliases, forced);
476
480
  const primaryTabs = page.locator(
@@ -478,18 +482,18 @@ for (const [component, aliases] of aliasesByComponent) {
478
482
  );
479
483
  const primaryLabels = await primaryTabs.allTextContents();
480
484
  for (let primaryIndex = 0; primaryIndex < primaryLabels.length; primaryIndex++) {
481
- await page.locator(
485
+ await selectTab(page.locator(
482
486
  ".variant-group:visible .tabs-states-block > .tabs-selectors:first-of-type .state-tab-btn"
483
- ).nth(primaryIndex).click({ force: true });
487
+ ).nth(primaryIndex));
484
488
  await probe(componentAliases, forced);
485
489
  const secondaryTabs = page.locator(
486
490
  ".variant-group:visible .tabs-states-block > .tabs-selectors.substrip .state-tab-btn"
487
491
  );
488
492
  const secondaryLabels = await secondaryTabs.allTextContents();
489
493
  for (let secondaryIndex = 0; secondaryIndex < secondaryLabels.length; secondaryIndex++) {
490
- await page.locator(
494
+ await selectTab(page.locator(
491
495
  ".variant-group:visible .tabs-states-block > .tabs-selectors.substrip .state-tab-btn"
492
- ).nth(secondaryIndex).click({ force: true });
496
+ ).nth(secondaryIndex));
493
497
  await probe(componentAliases, forced);
494
498
  }
495
499
  }
@@ -526,7 +530,7 @@ for (const [component, aliases] of aliasesByComponent) {
526
530
  const firstStateTab = page.locator(
527
531
  ".variant-group:visible .tabs-states-block > .tabs-selectors:first-of-type .state-tab-btn"
528
532
  ).first();
529
- if (await firstStateTab.count()) await firstStateTab.click({ force: true });
533
+ if (await firstStateTab.count()) await selectTab(firstStateTab);
530
534
  const hoverTargets = page.locator(".variant-group:visible .tabs-preview *:visible");
531
535
  for (let index = 0; index < await hoverTargets.count(); index++) {
532
536
  if (forced.every((variable) => covered.has(variable))) return;
@@ -1 +1 @@
1
- {"version":3,"sources":["../testing/component-render.contract.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { expect, test, type Locator, type Page } from '@playwright/test';\nimport { openComponentsEditor } from './support/editor';\nimport { selectedContracts } from './contracts';\nimport { ContractHarness } from './support/contractHarness';\n\n// Each test boots its own editor and asserts only over its own component's\n// aliases, so the 25 component tests carry no shared state between them.\ntest.describe.configure({ mode: 'parallel' });\n\ninterface AliasCase {\n component: string;\n variable: string;\n}\n\nfunction discoverDefaultAliases(): AliasCase[] {\n const root = path.resolve(process.env.LIVE_TOKENS_DATA_DIR ?? 'src/live-tokens/data', 'component-configs');\n const cases: AliasCase[] = [];\n for (const directory of fs.readdirSync(root).sort()) {\n const file = path.join(root, directory, 'default.json');\n if (!fs.existsSync(file)) continue;\n const data = JSON.parse(fs.readFileSync(file, 'utf8')) as {\n component?: string;\n aliases?: Record<string, unknown>;\n };\n const component = data.component ?? directory;\n for (const variable of Object.keys(data.aliases ?? {}).sort()) {\n cases.push({ component, variable });\n }\n }\n return cases;\n}\n\nconst requestedComponent = process.env.LIVE_TOKENS_COMPONENT;\nconst aliasCases = discoverDefaultAliases()\n .filter(({ component }) => !requestedComponent || component === requestedComponent);\nconst aliasesByComponent = new Map<string, string[]>();\nfor (const { component, variable } of aliasCases) {\n const variables = aliasesByComponent.get(component) ?? [];\n variables.push(variable);\n aliasesByComponent.set(component, variables);\n}\n\ninterface ProbeResult {\n covered: string[];\n unchanged: string[];\n}\n\n/**\n * Exercise each standard token selector through the same click path a designer\n * uses. The rendered-property probe below deliberately writes root variables\n * directly so it can try arbitrary CSS values; this companion gate proves the\n * editor control itself reaches the store and the document root.\n */\nasync function exerciseVisibleTokenControls(\n page: Page,\n componentAliases: string[],\n exercised: Set<string>,\n): Promise<void> {\n const group = page.locator('.variant-group:visible');\n const settle = () => page.evaluate(() => new Promise<void>((resolve) =>\n requestAnimationFrame(() => requestAnimationFrame(() => resolve()))));\n await settle();\n // A disabled or locked selector (a hover surface stood down while the tint\n // is on) opens a dropdown with nothing to pick from.\n const variables = await group.locator('.ui-token-selector:visible[data-token-variable]:not(.disabled):not(.locked)')\n .evaluateAll((elements) => [...new Set(elements\n .map((element) => (element as HTMLElement).dataset.tokenVariable)\n .filter((value): value is string => !!value))]);\n\n for (const variable of variables) {\n if (!componentAliases.includes(variable) || exercised.has(variable)) continue;\n const selector = group.locator(`.ui-token-selector:visible[data-token-variable=\"${variable}\"]:not(.disabled):not(.locked)`).first();\n if (await selector.count() === 0) continue;\n const before = await page.evaluate((name) =>\n document.documentElement.style.getPropertyValue(name).trim(), variable);\n\n const optionSelector = [\n '.ui-ts-dropdown .static-chip:not(.active):not(:disabled)',\n '.ui-ts-dropdown .ui-option-item:not(.active):not(:disabled)',\n '.ui-ts-dropdown .font-size-row:not(.active):not(:disabled)',\n ].join(', ');\n let after = before;\n let foundOption = false;\n // Some semantic options can resolve to the same CSS as the current alias.\n // Try several distinct visible choices before treating the control as dead.\n for (let attempt = 0; attempt < 4 && after === before; attempt++) {\n await settle();\n await selector.locator('.ui-ts-trigger').click();\n const options = selector.locator(optionSelector);\n const count = await options.count();\n if (count === 0) {\n // Close an unsupported dropdown before the traversal moves on. The\n // final coverage assertion reports its precise variable.\n await selector.locator('.ui-ts-trigger').click();\n break;\n }\n foundOption = true;\n await options.nth(attempt % count).click();\n await settle();\n after = await page.evaluate((name) =>\n document.documentElement.style.getPropertyValue(name).trim(), variable);\n }\n if (!foundOption) continue;\n expect(after, `${variable} did not write through its editor control`).not.toBe(before);\n exercised.add(variable);\n }\n}\n\n/** Split padding exposes four side selectors and a merge action instead of a\n * selector for the fallback parent value. Merge each visible composite, then\n * exercise the newly rendered parent selector through the standard path. */\nasync function exerciseVisibleSplitPaddingControls(\n page: Page,\n componentAliases: string[],\n exercised: Set<string>,\n): Promise<void> {\n const group = page.locator('.variant-group:visible');\n const variables = await group.locator('.merge-btn:visible[data-padding-parent-variable]')\n .evaluateAll((elements) => [...new Set(elements\n .map((element) => (element as HTMLElement).dataset.paddingParentVariable)\n .filter((value): value is string => !!value))]);\n\n for (const variable of variables) {\n if (!componentAliases.includes(variable) || exercised.has(variable)) continue;\n const merge = group.locator(`.merge-btn:visible[data-padding-parent-variable=\"${variable}\"]`).first();\n if (await merge.count()) await merge.click();\n }\n if (variables.length > 0) {\n await page.evaluate(() => new Promise<void>((resolve) =>\n requestAnimationFrame(() => requestAnimationFrame(() => resolve()))));\n await exerciseVisibleTokenControls(page, componentAliases, exercised);\n }\n}\n\n/** A single semantic control may intentionally own several CSS variables.\n * Every listed variable must change before the component traversal can\n * advance. */\n/** Returns the gate inputs it toggled, so the caller can put each one back\n * after probing: a gate left on locks rows behind it (a hover surface stood\n * down behind a tint), and those rows still have to be exercised in the\n * views that follow. */\nasync function exerciseVisibleCompositeControls(\n page: Page,\n componentAliases: string[],\n exercised: Set<string>,\n): Promise<Locator[]> {\n const toggled: Locator[] = [];\n const group = page.locator('.variant-group:visible');\n const controls = group.locator('[data-token-variables]:visible');\n for (let index = 0; index < await controls.count(); index++) {\n const control = controls.nth(index);\n const variables = ((await control.getAttribute('data-token-variables')) ?? '')\n .split(/\\s+/)\n .filter((variable) => componentAliases.includes(variable) && !exercised.has(variable));\n if (variables.length === 0) continue;\n const before = await page.evaluate((names) => Object.fromEntries(names.map((name) => [name,\n document.documentElement.style.getPropertyValue(name).trim(),\n ])), variables);\n // A gate is a checkbox, a radio, or a Toggle, which is a `role=\"switch\"`.\n const input = control.locator('input[type=\"checkbox\"], input[type=\"radio\"], [role=\"switch\"]').first();\n if (await input.count() === 0) continue;\n await input.click();\n toggled.push(input);\n await page.evaluate(() => new Promise<void>((resolve) =>\n requestAnimationFrame(() => requestAnimationFrame(() => resolve()))));\n const after = await page.evaluate((names) => Object.fromEntries(names.map((name) => [name,\n document.documentElement.style.getPropertyValue(name).trim(),\n ])), variables);\n for (const variable of variables) {\n expect(after[variable], `${variable} did not write through its composite control`)\n .not.toBe(before[variable]);\n exercised.add(variable);\n }\n }\n return toggled;\n}\n\n/** Component-owned gradients use a composite editor instead of a token\n * selector. Pick a real stop colour through its nested palette control and\n * assert the owning component variable—not the scratch stop variable—writes. */\nasync function exerciseVisibleGradientControls(\n page: Page,\n componentAliases: string[],\n exercised: Set<string>,\n): Promise<void> {\n const group = page.locator('.variant-group:visible');\n const editors = group.locator('.gradient-editor:visible[data-token-variable]');\n for (let index = 0; index < await editors.count(); index++) {\n const editor = editors.nth(index);\n const variable = await editor.getAttribute('data-token-variable');\n if (!variable || !componentAliases.includes(variable) || exercised.has(variable)) continue;\n const before = await page.evaluate((name) =>\n document.documentElement.style.getPropertyValue(name).trim(), variable);\n\n // Promote an empty/flat background to Solid so its stop picker is present,\n // then select a non-active invariant colour through the real palette UI.\n const solid = editor.getByRole('radio', { name: 'Solid' });\n if (await solid.count() && !await solid.isChecked()) await solid.check({ force: true });\n const picker = editor.locator('.picker-slot .ui-token-selector').first();\n await picker.locator('.ui-ts-trigger').click({ force: true });\n const swatch = picker.locator('.static-chip:not(.active):not(:disabled)').first();\n if (await swatch.count() === 0) continue;\n await swatch.click({ force: true });\n\n await expect.poll(() => page.evaluate((name) =>\n document.documentElement.style.getPropertyValue(name).trim(), variable),\n { message: `${variable} did not write through its gradient editor` })\n .not.toMatch(new RegExp(`^${escapeRegExp(before)}$`));\n exercised.add(variable);\n }\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Exercise every property control visible for the current standardized\n * VariantGroup view. The preview and property panel are deliberately siblings:\n * only `.tabs-preview` is fingerprinted, so a selector repaint cannot satisfy\n * the runtime-component contract.\n */\nasync function probeCurrentView(\n page: Page,\n componentAliases: string[],\n forcedVariables: string[] = [],\n provenVariables: string[] = [],\n): Promise<ProbeResult> {\n return page.evaluate(async ({ allAliases, forced, proven }) => {\n const group = Array.from(document.querySelectorAll<HTMLElement>('.variant-group'))\n .find((element) => element.offsetParent !== null);\n const preview = group?.querySelector<HTMLElement>('.tabs-preview');\n if (!group || !preview) return { covered: [], unchanged: [] };\n\n const visibleVariables = new Set<string>();\n if (forced.length > 0) {\n for (const variable of forced) {\n if (allAliases.includes(variable)) visibleVariables.add(variable);\n }\n } else {\n for (const element of group.querySelectorAll<HTMLElement>('[data-token-variable]')) {\n const variable = element.dataset.tokenVariable;\n if (element.offsetParent !== null && variable && allAliases.includes(variable)) {\n visibleVariables.add(variable);\n }\n }\n for (const element of group.querySelectorAll<HTMLElement>('[data-token-variables]')) {\n if (element.offsetParent === null) continue;\n for (const variable of (element.dataset.tokenVariables ?? '').split(/\\s+/)) {\n if (allAliases.includes(variable)) visibleVariables.add(variable);\n }\n }\n }\n\n // Split padding's four override slots are intentionally hidden controls.\n // The standardized padding control owns them, so include their default-file\n // variables whenever their base padding row is visible.\n for (const variable of [...visibleVariables]) {\n if (!variable.endsWith('-padding')) continue;\n for (const side of ['top', 'right', 'bottom', 'left']) {\n const sideVariable = `${variable}-${side}`;\n if (allAliases.includes(sideVariable)) visibleVariables.add(sideVariable);\n }\n }\n\n // A property already observed repainting cannot become less reactive in a\n // later view, and it is already recorded as both seen and covered. Probing\n // it again in every remaining view is the traversal's dominant cost: a\n // component with 47 views pays for its whole alias set 47 times over.\n for (const variable of proven) visibleVariables.delete(variable);\n if (visibleVariables.size === 0) return { covered: [], unchanged: [] };\n const properties = [\n 'display', 'visibility', 'opacity', 'position', 'zIndex',\n 'color', 'background', 'backgroundColor', 'backgroundImage', 'backgroundSize', 'backgroundPosition',\n 'border', 'borderColor', 'borderWidth', 'borderStyle',\n 'borderTopColor', 'borderRightColor', 'borderBottomColor', 'borderLeftColor',\n 'borderTopWidth', 'borderRightWidth', 'borderBottomWidth', 'borderLeftWidth',\n 'borderRadius', 'borderTopLeftRadius', 'borderTopRightRadius',\n 'borderBottomRightRadius', 'borderBottomLeftRadius',\n 'outline', 'outlineColor', 'outlineWidth', 'boxShadow',\n 'filter', 'backdropFilter', 'mixBlendMode',\n 'fontFamily', 'fontSize', 'fontWeight', 'fontStyle', 'lineHeight', 'letterSpacing',\n 'textAlign', 'textDecoration', 'textTransform', 'textShadow', 'whiteSpace',\n 'padding', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft',\n 'margin', 'marginTop', 'marginRight', 'marginBottom', 'marginLeft',\n 'gap', 'rowGap', 'columnGap',\n 'width', 'minWidth', 'maxWidth', 'height', 'minHeight', 'maxHeight',\n 'top', 'right', 'bottom', 'left',\n 'transform', 'transformOrigin', 'translate', 'rotate', 'scale',\n 'justifyContent', 'justifyItems', 'justifySelf', 'alignContent', 'alignItems', 'alignSelf',\n 'gridTemplateColumns', 'gridTemplateRows', 'gridColumn', 'gridRow', 'flex', 'flexDirection',\n 'overflow', 'overflowX', 'overflowY', 'clipPath', 'objectFit', 'objectPosition',\n 'fill', 'stroke', 'strokeWidth', 'strokeDasharray', 'strokeDashoffset',\n 'cursor', 'pointerEvents', 'content',\n 'transitionProperty', 'transitionDuration', 'transitionTimingFunction', 'transitionDelay',\n 'scrollbarColor', 'scrollbarWidth',\n ] as const;\n\n const ignoredAttribute = /^(class|style|data-|aria-)/;\n const stableAttributes = (element: Element) => Array.from(element.attributes)\n .filter((attribute) => !ignoredAttribute.test(attribute.name))\n .map((attribute) => `${attribute.name}=${attribute.value}`)\n .sort()\n .join(';');\n\n const pseudoSelectorsFor = (variable: string) => {\n const pseudoSelectors = ['::before', '::after'];\n if (variable.includes('placeholder')) pseudoSelectors.push('::placeholder');\n if (variable.includes('scrollbar')) {\n pseudoSelectors.push(\n '::-webkit-scrollbar',\n '::-webkit-scrollbar-track',\n '::-webkit-scrollbar-thumb',\n );\n }\n return pseudoSelectors;\n };\n\n // Fixed overlays are portaled to body and are therefore outside the\n // preview subtree. Dialog roles let the harness include them without a\n // component-specific selector or fixture.\n const fingerprintNodes = () => {\n const roots = [preview, ...document.querySelectorAll<HTMLElement>('[role=\"dialog\"]')];\n return roots.flatMap((root) => [root, ...root.querySelectorAll<HTMLElement>('*')]);\n };\n\n const nodeFingerprint = (element: HTMLElement, index: number, pseudoSelectors: string[]) => {\n const style = getComputedStyle(element);\n const rect = element.getBoundingClientRect();\n const values = properties.map((property) => style[property]).join('|');\n const pseudoValues = pseudoSelectors.map((selector) => {\n const pseudo = getComputedStyle(element, selector);\n return properties.map((property) => pseudo[property]).join('|');\n }).join('~');\n return [\n index,\n element.tagName,\n values,\n pseudoValues,\n `${rect.x},${rect.y},${rect.width},${rect.height}`,\n `${element.scrollWidth},${element.scrollHeight}`,\n stableAttributes(element),\n ].join('~');\n };\n\n const fingerprint = (variable: string) => {\n const pseudoSelectors = pseudoSelectorsFor(variable);\n return fingerprintNodes().map((element, index) =>\n nodeFingerprint(element, index, pseudoSelectors));\n };\n\n /** Proving a repaint takes one difference, so stop at the node that moved\n * instead of reading every remaining node's computed style. Each node\n * costs 58 properties across the element and its pseudo-elements, and this\n * walk runs once per candidate value per alias, so it is the probe's\n * dominant cost. Only the negative case has to read everything. */\n const movedFrom = (variable: string, baseline: string[]) => {\n const pseudoSelectors = pseudoSelectorsFor(variable);\n const nodes = fingerprintNodes();\n if (nodes.length !== baseline.length) return true;\n for (let index = 0; index < nodes.length; index++) {\n if (nodeFingerprint(nodes[index], index, pseudoSelectors) !== baseline[index]) return true;\n }\n return false;\n };\n\n const alternateValues = (variable: string, current: string): string[] => {\n const values: string[] = [];\n const add = (...candidates: string[]) => {\n for (const candidate of candidates) {\n if (candidate !== current && !values.includes(candidate)) values.push(candidate);\n }\n };\n if (/(surface|color|text|border)(?!-width)|-icon$|outline-color/.test(variable)) {\n add('rgb(1, 2, 3)', 'rgb(253, 127, 3)');\n }\n if (variable.includes('font-family')) add('monospace', 'serif');\n if (variable.includes('font-weight')) add('900', '200');\n if (variable.includes('line-height')) add('2.75', '0.75');\n if (variable.includes('letter-spacing')) add('7px', '-2px');\n if (variable.includes('shadow')) add('rgb(1, 2, 3) 7px 9px 0 3px', 'none');\n if (variable.includes('blur')) add('blur(7px)', 'none');\n if (variable.includes('gradient') || variable.endsWith('-background')) {\n add('linear-gradient(90deg, rgb(1, 2, 3), rgb(253, 127, 3))', 'none');\n }\n if (variable.includes('duration') || variable.includes('transition')) add('9s', '0s');\n if (variable.includes('opacity')) add('0.17', '0.83');\n if (variable.includes('display')) add(current === 'none' ? 'block' : 'none', 'contents');\n if (variable.includes('align')) add('right', 'center', 'flex-end');\n if (variable.includes('position')) add('above-label', 'below-description', 'center');\n if (variable.includes('button-variant')) add('danger', 'outline');\n if (variable.includes('shimmer')) {\n add('linear-gradient(90deg, transparent, rgb(255 255 255 / 80%), transparent)', 'none');\n }\n if (/(padding|margin|radius|width|height|size|gap|offset|inset|thickness)/.test(variable)) {\n add('37px', '3px');\n }\n if (variable.includes('scale')) add('1.73', '0.53');\n add('__live_tokens_invalid_probe__', '37px', 'rgb(1, 2, 3)', 'none', '2');\n return values;\n };\n\n const root = document.documentElement;\n const covered: string[] = [];\n const unchanged: string[] = [];\n // Fast-forward in-flight transitions so the fingerprint samples end states.\n // Reading mid-interpolation makes consecutive samples differ on their own,\n // which reports a dead property as covered. Transition shorthands stay\n // untouched so the duration and easing aliases remain observable.\n const settle = async () => {\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));\n for (const animation of document.getAnimations()) animation.finish();\n };\n\n // Remove animation noise from the fingerprint. The contract concerns the\n // end-state projection, not interpolation frames.\n const freeze = document.createElement('style');\n freeze.dataset.reactivityProbe = 'true';\n freeze.textContent = '*,*::before,*::after{animation:none!important;caret-color:transparent!important}';\n document.head.appendChild(freeze);\n await document.fonts?.ready;\n await settle();\n\n for (const variable of visibleVariables) {\n // A split padding control edits its base plus all materialized sides as\n // one standardized transformation. Probe that same transformation so a\n // base fallback is not incorrectly reported dead merely because the\n // active theme already contains side overrides.\n const mutatedVariables = [variable];\n if (variable.endsWith('-padding')) {\n for (const side of ['top', 'right', 'bottom', 'left']) {\n const sideVariable = `${variable}-${side}`;\n if (allAliases.includes(sideVariable)) mutatedVariables.push(sideVariable);\n }\n }\n const previous = mutatedVariables.map((name) => ({\n name,\n value: root.style.getPropertyValue(name),\n priority: root.style.getPropertyPriority(name),\n }));\n const current = getComputedStyle(root).getPropertyValue(variable).trim();\n const baseline = fingerprint(variable);\n let changed = false;\n for (const candidate of alternateValues(variable, current)) {\n for (const name of mutatedVariables) root.style.setProperty(name, candidate, 'important');\n // CSS updates synchronously. One animation frame also gives the few\n // JavaScript-backed components (SVG/filter bridges) time to reconcile.\n await settle();\n if (movedFrom(variable, baseline)) {\n changed = true;\n break;\n }\n }\n for (const prior of previous) {\n if (prior.value) root.style.setProperty(prior.name, prior.value, prior.priority);\n else root.style.removeProperty(prior.name);\n }\n await settle();\n (changed ? covered : unchanged).push(variable);\n }\n\n freeze.remove();\n return { covered, unchanged };\n }, { allAliases: componentAliases, forced: forcedVariables, proven: provenVariables });\n}\n\nasync function selectComponent(page: Page, component: string): Promise<void> {\n await page.evaluate(async (id) => {\n const editor = window.__liveTokensEditor;\n if (!editor) throw new Error('window.__liveTokensEditor is not present on the components route');\n editor.selectComponent(id);\n await new Promise<void>((resolve) => requestAnimationFrame(() =>\n requestAnimationFrame(() => resolve())));\n }, component);\n await page.locator('.variant-group').filter({ visible: true }).waitFor();\n}\n\nfor (const [component, aliases] of aliasesByComponent) {\n test(`${component} repaints every property in its standardized runtime preview`, async ({ page }) => {\n test.setTimeout(600_000);\n await openComponentsEditor(page);\n const covered = new Set<string>();\n const seen = new Set<string>();\n const unchanged = new Set<string>();\n const controlExercised = new Set<string>();\n\n const probe = async (componentAliases: string[], forced: string[] = []) => {\n const remaining = forced.length > 0\n ? forced.filter((variable) => !covered.has(variable))\n : [];\n if (forced.length > 0 && remaining.length === 0) return;\n\n // Exercise standardized preview toggles (zoom, hover enablement, optional\n // content) when retrying a property that is dormant in the default mode.\n if (forced.length > 0) {\n const unchecked = page.locator(\n '.variant-group:visible .tabs-preview input[type=\"checkbox\"]:not(:checked):not(:disabled), '\n + '.variant-group:visible .properties-header input[type=\"checkbox\"]:not(:checked):not(:disabled)',\n );\n for (let index = 0; index < await unchecked.count(); index++) {\n await unchecked.nth(index).click({ force: true });\n }\n }\n\n // Portaled dialogs sit outside `.tabs-preview`; hover their first action\n // so hover-only chrome aliases are painted too. Role-based discovery keeps\n // this independent of any component name or DOM implementation class.\n const dialogAction = page.locator('[role=\"dialog\"] button:not(:disabled)').first();\n if (await dialogAction.count()) await dialogAction.hover({ force: true });\n\n await exerciseVisibleTokenControls(page, componentAliases, controlExercised);\n const gates = await exerciseVisibleCompositeControls(page, componentAliases, controlExercised);\n // A gate that just opened may have revealed a row (the tint colour).\n await exerciseVisibleTokenControls(page, componentAliases, controlExercised);\n await exerciseVisibleSplitPaddingControls(page, componentAliases, controlExercised);\n await exerciseVisibleGradientControls(page, componentAliases, controlExercised);\n const result = await probeCurrentView(page, componentAliases, remaining, [...covered]);\n for (const gate of gates) {\n if (await gate.count()) await gate.click();\n }\n result.covered.forEach((variable) => covered.add(variable));\n result.covered.forEach((variable) => seen.add(variable));\n result.unchanged.forEach((variable) => {\n seen.add(variable);\n if (!covered.has(variable)) unchanged.add(variable);\n });\n };\n\n const traverseComponent = async (\n componentId: string,\n componentAliases: string[],\n forced: string[] = [],\n ) => {\n await selectComponent(page, componentId);\n\n const visitViews = async () => {\n if (forced.length > 0 && forced.every((variable) => covered.has(variable))) return;\n const sizeSelect = page.locator('.variant-group:visible .preview-actions select').first();\n const sizeValues = await sizeSelect.count()\n ? await sizeSelect.locator('option').evaluateAll((options) =>\n options.map((option) => (option as HTMLOptionElement).value))\n : [''];\n\n for (const sizeValue of sizeValues) {\n const currentSizeSelect = page.locator('.variant-group:visible .preview-actions select').first();\n if (sizeValue && await currentSizeSelect.count()) await currentSizeSelect.selectOption(sizeValue);\n\n const variantTabs = page.locator('.variant-group:visible .variant-tabs .variant-tab-btn');\n const variantLabels = await variantTabs.count()\n ? await variantTabs.allTextContents()\n : [''];\n\n for (let variantIndex = 0; variantIndex < variantLabels.length; variantIndex++) {\n if (variantLabels[variantIndex]) {\n await page.locator('.variant-group:visible .variant-tabs .variant-tab-btn')\n .nth(variantIndex)\n .click({ force: true });\n }\n\n await probe(componentAliases, forced);\n const primaryTabs = page.locator(\n '.variant-group:visible .tabs-states-block > .tabs-selectors:first-of-type .state-tab-btn',\n );\n const primaryLabels = await primaryTabs.allTextContents();\n for (let primaryIndex = 0; primaryIndex < primaryLabels.length; primaryIndex++) {\n await page.locator(\n '.variant-group:visible .tabs-states-block > .tabs-selectors:first-of-type .state-tab-btn',\n ).nth(primaryIndex).click({ force: true });\n await probe(componentAliases, forced);\n\n const secondaryTabs = page.locator(\n '.variant-group:visible .tabs-states-block > .tabs-selectors.substrip .state-tab-btn',\n );\n const secondaryLabels = await secondaryTabs.allTextContents();\n for (let secondaryIndex = 0; secondaryIndex < secondaryLabels.length; secondaryIndex++) {\n await page.locator(\n '.variant-group:visible .tabs-states-block > .tabs-selectors.substrip .state-tab-btn',\n ).nth(secondaryIndex).click({ force: true });\n await probe(componentAliases, forced);\n }\n }\n }\n }\n };\n\n await visitViews();\n if (forced.length === 0 || forced.every((variable) => covered.has(variable))) return;\n\n // Open any dialog-capable preview and repeat the same registry traversal.\n const dialogTrigger = page.locator(\n '.variant-group:visible .tabs-preview [aria-haspopup=\"dialog\"][aria-expanded=\"false\"]',\n ).first();\n if (await dialogTrigger.count()) {\n await dialogTrigger.click({ force: true });\n await page.locator('[role=\"dialog\"]').waitFor();\n await visitViews();\n }\n\n // Exercise every option of standardized canvas selects. This covers modes\n // such as Input type and optional Notification actions without any\n // per-component fixture or test case.\n const canvasSelects = page.locator('.variant-group:visible .tabs-preview .canvas-toolbar select');\n for (let selectIndex = 0; selectIndex < await canvasSelects.count(); selectIndex++) {\n const values = await canvasSelects.nth(selectIndex).locator('option').evaluateAll((options) =>\n options.map((option) => (option as HTMLOptionElement).value));\n for (const value of values) {\n if (forced.every((variable) => covered.has(variable))) return;\n await canvasSelects.nth(selectIndex).selectOption(value);\n await visitViews();\n }\n }\n\n // Expanded/collapsed previews expose motion aliases whose computed style\n // is different in each direction.\n const expanders = page.locator(\n '.variant-group:visible .tabs-preview [aria-expanded]:not([aria-haspopup=\"dialog\"])',\n );\n for (let index = 0; index < await expanders.count(); index++) {\n if (forced.every((variable) => covered.has(variable))) return;\n await expanders.nth(index).click({ force: true });\n await visitViews();\n }\n\n // A default-off hover gate only paints while the runtime element itself\n // matches :hover. Forced preview classes intentionally bypass that gate,\n // so retry unresolved properties while hovering each visible preview node.\n // This stays component-agnostic and runs only for the small unresolved set.\n // The traversal above leaves a forced state selected, and its preview\n // class outranks the gated `:hover` rule, so return to the first state.\n const firstStateTab = page.locator(\n '.variant-group:visible .tabs-states-block > .tabs-selectors:first-of-type .state-tab-btn',\n ).first();\n if (await firstStateTab.count()) await firstStateTab.click({ force: true });\n const hoverTargets = page.locator('.variant-group:visible .tabs-preview *:visible');\n for (let index = 0; index < await hoverTargets.count(); index++) {\n if (forced.every((variable) => covered.has(variable))) return;\n // The node list was read once; a probe above may have re-rendered it.\n try {\n await hoverTargets.nth(index).hover({ force: true, timeout: 2_000 });\n } catch {\n continue;\n }\n await probe(componentAliases, forced);\n }\n };\n\n await traverseComponent(component, aliases);\n\n // Retry every property not yet observed repainting. Composite controls,\n // pseudo-elements, optional content, interaction modes and portaled dialogs\n // are all discovered from standard DOM semantics; there is no component\n // exception table.\n const unresolved = aliases.filter((variable) => !covered.has(variable));\n if (unresolved.length > 0) await traverseComponent(component, aliases, unresolved);\n\n const notExposed = aliases.filter((variable) => !seen.has(variable));\n const notReactive = aliases.filter((variable) => seen.has(variable) && !covered.has(variable));\n const notControlExercised = aliases.filter((variable) => !controlExercised.has(variable));\n\n expect(notExposed, `Properties not exposed by a standardized component view:\\n${notExposed.join('\\n')}`)\n .toEqual([]);\n expect(notReactive, `Properties whose rendered preview did not change:\\n${notReactive.join('\\n')}`)\n .toEqual([]);\n expect(notControlExercised, `Properties not exercised through a rendered editor control:\\n${notControlExercised.join('\\n')}`)\n .toEqual([]);\n expect(covered.size).toBe(aliases.length);\n });\n}\n\ntest('component discovery covers every alias exactly once', () => {\n const perComponent = [...aliasesByComponent.values()].reduce((sum, a) => sum + a.length, 0);\n expect(aliasCases.length).toBeGreaterThan(0);\n expect(perComponent).toBe(aliasCases.length);\n});\n\n// Obligation 6. The traversal above proves every property repaints something in\n// the preview; these pin the mapping, so a repaint elsewhere cannot stand in for\n// the part and CSS property the property is meant to drive.\nfor (const contract of await selectedContracts()) {\n test(`${contract.id} paints each declared property on its declared part`, async ({ page }) => {\n test.setTimeout(180_000);\n const harness = await ContractHarness.open(page, contract);\n expect(await harness.assertProperties()).toBeGreaterThan(0);\n });\n}\n"],"mappings":"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","names":["root"]}
1
+ {"version":3,"sources":["../testing/component-render.contract.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { expect, test, type Locator, type Page } from '@playwright/test';\nimport { openComponentsEditor } from './support/editor';\nimport { selectedContracts } from './contracts';\nimport { ContractHarness } from './support/contractHarness';\n\n// Each test boots its own editor and asserts only over its own component's\n// aliases, so the 25 component tests carry no shared state between them.\ntest.describe.configure({ mode: 'parallel' });\n\ninterface AliasCase {\n component: string;\n variable: string;\n}\n\nfunction discoverDefaultAliases(): AliasCase[] {\n const root = path.resolve(process.env.LIVE_TOKENS_DATA_DIR ?? 'src/live-tokens/data', 'component-configs');\n const cases: AliasCase[] = [];\n for (const directory of fs.readdirSync(root).sort()) {\n const file = path.join(root, directory, 'default.json');\n if (!fs.existsSync(file)) continue;\n const data = JSON.parse(fs.readFileSync(file, 'utf8')) as {\n component?: string;\n aliases?: Record<string, unknown>;\n };\n const component = data.component ?? directory;\n for (const variable of Object.keys(data.aliases ?? {}).sort()) {\n cases.push({ component, variable });\n }\n }\n return cases;\n}\n\nconst requestedComponent = process.env.LIVE_TOKENS_COMPONENT;\nconst aliasCases = discoverDefaultAliases()\n .filter(({ component }) => !requestedComponent || component === requestedComponent);\nconst aliasesByComponent = new Map<string, string[]>();\nfor (const { component, variable } of aliasCases) {\n const variables = aliasesByComponent.get(component) ?? [];\n variables.push(variable);\n aliasesByComponent.set(component, variables);\n}\n\ninterface ProbeResult {\n covered: string[];\n unchanged: string[];\n}\n\n/**\n * Exercise each standard token selector through the same click path a designer\n * uses. The rendered-property probe below deliberately writes root variables\n * directly so it can try arbitrary CSS values; this companion gate proves the\n * editor control itself reaches the store and the document root.\n */\nasync function exerciseVisibleTokenControls(\n page: Page,\n componentAliases: string[],\n exercised: Set<string>,\n): Promise<void> {\n const group = page.locator('.variant-group:visible');\n const settle = () => page.evaluate(() => new Promise<void>((resolve) =>\n requestAnimationFrame(() => requestAnimationFrame(() => resolve()))));\n await settle();\n // A disabled or locked selector (a hover surface stood down while the tint\n // is on) opens a dropdown with nothing to pick from.\n const variables = await group.locator('.ui-token-selector:visible[data-token-variable]:not(.disabled):not(.locked)')\n .evaluateAll((elements) => [...new Set(elements\n .map((element) => (element as HTMLElement).dataset.tokenVariable)\n .filter((value): value is string => !!value))]);\n\n for (const variable of variables) {\n if (!componentAliases.includes(variable) || exercised.has(variable)) continue;\n const selector = group.locator(`.ui-token-selector:visible[data-token-variable=\"${variable}\"]:not(.disabled):not(.locked)`).first();\n if (await selector.count() === 0) continue;\n const before = await page.evaluate((name) =>\n document.documentElement.style.getPropertyValue(name).trim(), variable);\n\n const optionSelector = [\n '.ui-ts-dropdown .static-chip:not(.active):not(:disabled)',\n '.ui-ts-dropdown .ui-option-item:not(.active):not(:disabled)',\n '.ui-ts-dropdown .font-size-row:not(.active):not(:disabled)',\n ].join(', ');\n let after = before;\n let foundOption = false;\n // Some semantic options can resolve to the same CSS as the current alias.\n // Try several distinct visible choices before treating the control as dead.\n for (let attempt = 0; attempt < 4 && after === before; attempt++) {\n await settle();\n await selector.locator('.ui-ts-trigger').click();\n const options = selector.locator(optionSelector);\n const count = await options.count();\n if (count === 0) {\n // Close an unsupported dropdown before the traversal moves on. The\n // final coverage assertion reports its precise variable.\n await selector.locator('.ui-ts-trigger').click();\n break;\n }\n foundOption = true;\n await options.nth(attempt % count).click();\n await settle();\n after = await page.evaluate((name) =>\n document.documentElement.style.getPropertyValue(name).trim(), variable);\n }\n if (!foundOption) continue;\n expect(after, `${variable} did not write through its editor control`).not.toBe(before);\n exercised.add(variable);\n }\n}\n\n/** Split padding exposes four side selectors and a merge action instead of a\n * selector for the fallback parent value. Merge each visible composite, then\n * exercise the newly rendered parent selector through the standard path. */\nasync function exerciseVisibleSplitPaddingControls(\n page: Page,\n componentAliases: string[],\n exercised: Set<string>,\n): Promise<void> {\n const group = page.locator('.variant-group:visible');\n const variables = await group.locator('.merge-btn:visible[data-padding-parent-variable]')\n .evaluateAll((elements) => [...new Set(elements\n .map((element) => (element as HTMLElement).dataset.paddingParentVariable)\n .filter((value): value is string => !!value))]);\n\n for (const variable of variables) {\n if (!componentAliases.includes(variable) || exercised.has(variable)) continue;\n const merge = group.locator(`.merge-btn:visible[data-padding-parent-variable=\"${variable}\"]`).first();\n if (await merge.count()) await merge.click();\n }\n if (variables.length > 0) {\n await page.evaluate(() => new Promise<void>((resolve) =>\n requestAnimationFrame(() => requestAnimationFrame(() => resolve()))));\n await exerciseVisibleTokenControls(page, componentAliases, exercised);\n }\n}\n\n/** A single semantic control may intentionally own several CSS variables.\n * Every listed variable must change before the component traversal can\n * advance. */\n/** Returns the gate inputs it toggled, so the caller can put each one back\n * after probing: a gate left on locks rows behind it (a hover surface stood\n * down behind a tint), and those rows still have to be exercised in the\n * views that follow. */\nasync function exerciseVisibleCompositeControls(\n page: Page,\n componentAliases: string[],\n exercised: Set<string>,\n): Promise<Locator[]> {\n const toggled: Locator[] = [];\n const group = page.locator('.variant-group:visible');\n const controls = group.locator('[data-token-variables]:visible');\n for (let index = 0; index < await controls.count(); index++) {\n const control = controls.nth(index);\n const variables = ((await control.getAttribute('data-token-variables')) ?? '')\n .split(/\\s+/)\n .filter((variable) => componentAliases.includes(variable) && !exercised.has(variable));\n if (variables.length === 0) continue;\n const before = await page.evaluate((names) => Object.fromEntries(names.map((name) => [name,\n document.documentElement.style.getPropertyValue(name).trim(),\n ])), variables);\n // A gate is a checkbox, a radio, or a Toggle, which is a `role=\"switch\"`.\n const input = control.locator('input[type=\"checkbox\"], input[type=\"radio\"], [role=\"switch\"]').first();\n if (await input.count() === 0) continue;\n await input.click();\n toggled.push(input);\n await page.evaluate(() => new Promise<void>((resolve) =>\n requestAnimationFrame(() => requestAnimationFrame(() => resolve()))));\n const after = await page.evaluate((names) => Object.fromEntries(names.map((name) => [name,\n document.documentElement.style.getPropertyValue(name).trim(),\n ])), variables);\n for (const variable of variables) {\n expect(after[variable], `${variable} did not write through its composite control`)\n .not.toBe(before[variable]);\n exercised.add(variable);\n }\n }\n return toggled;\n}\n\n/** Component-owned gradients use a composite editor instead of a token\n * selector. Pick a real stop colour through its nested palette control and\n * assert the owning component variable—not the scratch stop variable—writes. */\nasync function exerciseVisibleGradientControls(\n page: Page,\n componentAliases: string[],\n exercised: Set<string>,\n): Promise<void> {\n const group = page.locator('.variant-group:visible');\n const editors = group.locator('.gradient-editor:visible[data-token-variable]');\n for (let index = 0; index < await editors.count(); index++) {\n const editor = editors.nth(index);\n const variable = await editor.getAttribute('data-token-variable');\n if (!variable || !componentAliases.includes(variable) || exercised.has(variable)) continue;\n const before = await page.evaluate((name) =>\n document.documentElement.style.getPropertyValue(name).trim(), variable);\n\n // Promote an empty/flat background to Solid so its stop picker is present,\n // then select a non-active invariant colour through the real palette UI.\n const solid = editor.getByRole('radio', { name: 'Solid' });\n if (await solid.count() && !await solid.isChecked()) await solid.check({ force: true });\n const picker = editor.locator('.picker-slot .ui-token-selector').first();\n await picker.locator('.ui-ts-trigger').click({ force: true });\n const swatch = picker.locator('.static-chip:not(.active):not(:disabled)').first();\n if (await swatch.count() === 0) continue;\n await swatch.click({ force: true });\n\n await expect.poll(() => page.evaluate((name) =>\n document.documentElement.style.getPropertyValue(name).trim(), variable),\n { message: `${variable} did not write through its gradient editor` })\n .not.toMatch(new RegExp(`^${escapeRegExp(before)}$`));\n exercised.add(variable);\n }\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Exercise every property control visible for the current standardized\n * VariantGroup view. The preview and property panel are deliberately siblings:\n * only `.tabs-preview` is fingerprinted, so a selector repaint cannot satisfy\n * the runtime-component contract.\n */\nasync function probeCurrentView(\n page: Page,\n componentAliases: string[],\n forcedVariables: string[] = [],\n provenVariables: string[] = [],\n): Promise<ProbeResult> {\n return page.evaluate(async ({ allAliases, forced, proven }) => {\n const group = Array.from(document.querySelectorAll<HTMLElement>('.variant-group'))\n .find((element) => element.offsetParent !== null);\n const preview = group?.querySelector<HTMLElement>('.tabs-preview');\n if (!group || !preview) return { covered: [], unchanged: [] };\n\n const visibleVariables = new Set<string>();\n if (forced.length > 0) {\n for (const variable of forced) {\n if (allAliases.includes(variable)) visibleVariables.add(variable);\n }\n } else {\n for (const element of group.querySelectorAll<HTMLElement>('[data-token-variable]')) {\n const variable = element.dataset.tokenVariable;\n if (element.offsetParent !== null && variable && allAliases.includes(variable)) {\n visibleVariables.add(variable);\n }\n }\n for (const element of group.querySelectorAll<HTMLElement>('[data-token-variables]')) {\n if (element.offsetParent === null) continue;\n for (const variable of (element.dataset.tokenVariables ?? '').split(/\\s+/)) {\n if (allAliases.includes(variable)) visibleVariables.add(variable);\n }\n }\n }\n\n // Split padding's four override slots are intentionally hidden controls.\n // The standardized padding control owns them, so include their default-file\n // variables whenever their base padding row is visible.\n for (const variable of [...visibleVariables]) {\n if (!variable.endsWith('-padding')) continue;\n for (const side of ['top', 'right', 'bottom', 'left']) {\n const sideVariable = `${variable}-${side}`;\n if (allAliases.includes(sideVariable)) visibleVariables.add(sideVariable);\n }\n }\n\n // A property already observed repainting cannot become less reactive in a\n // later view, and it is already recorded as both seen and covered. Probing\n // it again in every remaining view is the traversal's dominant cost: a\n // component with 47 views pays for its whole alias set 47 times over.\n for (const variable of proven) visibleVariables.delete(variable);\n if (visibleVariables.size === 0) return { covered: [], unchanged: [] };\n const properties = [\n 'display', 'visibility', 'opacity', 'position', 'zIndex',\n 'color', 'background', 'backgroundColor', 'backgroundImage', 'backgroundSize', 'backgroundPosition',\n 'border', 'borderColor', 'borderWidth', 'borderStyle',\n 'borderTopColor', 'borderRightColor', 'borderBottomColor', 'borderLeftColor',\n 'borderTopWidth', 'borderRightWidth', 'borderBottomWidth', 'borderLeftWidth',\n 'borderRadius', 'borderTopLeftRadius', 'borderTopRightRadius',\n 'borderBottomRightRadius', 'borderBottomLeftRadius',\n 'outline', 'outlineColor', 'outlineWidth', 'boxShadow',\n 'filter', 'backdropFilter', 'mixBlendMode',\n 'fontFamily', 'fontSize', 'fontWeight', 'fontStyle', 'lineHeight', 'letterSpacing',\n 'textAlign', 'textDecoration', 'textTransform', 'textShadow', 'whiteSpace',\n 'padding', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft',\n 'margin', 'marginTop', 'marginRight', 'marginBottom', 'marginLeft',\n 'gap', 'rowGap', 'columnGap',\n 'width', 'minWidth', 'maxWidth', 'height', 'minHeight', 'maxHeight',\n 'top', 'right', 'bottom', 'left',\n 'transform', 'transformOrigin', 'translate', 'rotate', 'scale',\n 'justifyContent', 'justifyItems', 'justifySelf', 'alignContent', 'alignItems', 'alignSelf',\n 'gridTemplateColumns', 'gridTemplateRows', 'gridColumn', 'gridRow', 'flex', 'flexDirection',\n 'overflow', 'overflowX', 'overflowY', 'clipPath', 'objectFit', 'objectPosition',\n 'fill', 'stroke', 'strokeWidth', 'strokeDasharray', 'strokeDashoffset',\n 'cursor', 'pointerEvents', 'content',\n 'transitionProperty', 'transitionDuration', 'transitionTimingFunction', 'transitionDelay',\n 'scrollbarColor', 'scrollbarWidth',\n ] as const;\n\n const ignoredAttribute = /^(class|style|data-|aria-)/;\n const stableAttributes = (element: Element) => Array.from(element.attributes)\n .filter((attribute) => !ignoredAttribute.test(attribute.name))\n .map((attribute) => `${attribute.name}=${attribute.value}`)\n .sort()\n .join(';');\n\n const pseudoSelectorsFor = (variable: string) => {\n const pseudoSelectors = ['::before', '::after'];\n if (variable.includes('placeholder')) pseudoSelectors.push('::placeholder');\n if (variable.includes('scrollbar')) {\n pseudoSelectors.push(\n '::-webkit-scrollbar',\n '::-webkit-scrollbar-track',\n '::-webkit-scrollbar-thumb',\n );\n }\n return pseudoSelectors;\n };\n\n // Fixed overlays are portaled to body and are therefore outside the\n // preview subtree. Dialog roles let the harness include them without a\n // component-specific selector or fixture.\n const fingerprintNodes = () => {\n const roots = [preview, ...document.querySelectorAll<HTMLElement>('[role=\"dialog\"]')];\n return roots.flatMap((root) => [root, ...root.querySelectorAll<HTMLElement>('*')]);\n };\n\n const nodeFingerprint = (element: HTMLElement, index: number, pseudoSelectors: string[]) => {\n const style = getComputedStyle(element);\n const rect = element.getBoundingClientRect();\n const values = properties.map((property) => style[property]).join('|');\n const pseudoValues = pseudoSelectors.map((selector) => {\n const pseudo = getComputedStyle(element, selector);\n return properties.map((property) => pseudo[property]).join('|');\n }).join('~');\n return [\n index,\n element.tagName,\n values,\n pseudoValues,\n `${rect.x},${rect.y},${rect.width},${rect.height}`,\n `${element.scrollWidth},${element.scrollHeight}`,\n stableAttributes(element),\n ].join('~');\n };\n\n const fingerprint = (variable: string) => {\n const pseudoSelectors = pseudoSelectorsFor(variable);\n return fingerprintNodes().map((element, index) =>\n nodeFingerprint(element, index, pseudoSelectors));\n };\n\n /** Proving a repaint takes one difference, so stop at the node that moved\n * instead of reading every remaining node's computed style. Each node\n * costs 58 properties across the element and its pseudo-elements, and this\n * walk runs once per candidate value per alias, so it is the probe's\n * dominant cost. Only the negative case has to read everything. */\n const movedFrom = (variable: string, baseline: string[]) => {\n const pseudoSelectors = pseudoSelectorsFor(variable);\n const nodes = fingerprintNodes();\n if (nodes.length !== baseline.length) return true;\n for (let index = 0; index < nodes.length; index++) {\n if (nodeFingerprint(nodes[index], index, pseudoSelectors) !== baseline[index]) return true;\n }\n return false;\n };\n\n const alternateValues = (variable: string, current: string): string[] => {\n const values: string[] = [];\n const add = (...candidates: string[]) => {\n for (const candidate of candidates) {\n if (candidate !== current && !values.includes(candidate)) values.push(candidate);\n }\n };\n if (/(surface|color|text|border)(?!-width)|-icon$|outline-color/.test(variable)) {\n add('rgb(1, 2, 3)', 'rgb(253, 127, 3)');\n }\n if (variable.includes('font-family')) add('monospace', 'serif');\n if (variable.includes('font-weight')) add('900', '200');\n if (variable.includes('line-height')) add('2.75', '0.75');\n if (variable.includes('letter-spacing')) add('7px', '-2px');\n if (variable.includes('shadow')) add('rgb(1, 2, 3) 7px 9px 0 3px', 'none');\n if (variable.includes('blur')) add('blur(7px)', 'none');\n if (variable.includes('gradient')) {\n add('linear-gradient(90deg, rgb(1, 2, 3), rgb(253, 127, 3))', 'none');\n }\n if (variable.includes('duration') || variable.includes('transition')) add('9s', '0s');\n if (variable.includes('opacity')) add('0.17', '0.83');\n if (variable.includes('display')) add(current === 'none' ? 'block' : 'none', 'contents');\n if (variable.includes('align')) add('right', 'center', 'flex-end');\n if (variable.includes('position')) add('above-label', 'below-description', 'center');\n if (variable.includes('button-variant')) add('danger', 'outline');\n if (variable.includes('shimmer')) {\n add('linear-gradient(90deg, transparent, rgb(255 255 255 / 80%), transparent)', 'none');\n }\n if (/(padding|margin|radius|width|height|size|gap|offset|inset|thickness)/.test(variable)) {\n add('37px', '3px');\n }\n if (variable.includes('scale')) add('1.73', '0.53');\n add('__live_tokens_invalid_probe__', '37px', 'rgb(1, 2, 3)', 'none', '2');\n return values;\n };\n\n const root = document.documentElement;\n const covered: string[] = [];\n const unchanged: string[] = [];\n // Fast-forward in-flight transitions so the fingerprint samples end states.\n // Reading mid-interpolation makes consecutive samples differ on their own,\n // which reports a dead property as covered. Transition shorthands stay\n // untouched so the duration and easing aliases remain observable.\n const settle = async () => {\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));\n for (const animation of document.getAnimations()) animation.finish();\n };\n\n // Remove animation noise from the fingerprint. The contract concerns the\n // end-state projection, not interpolation frames.\n const freeze = document.createElement('style');\n freeze.dataset.reactivityProbe = 'true';\n freeze.textContent = '*,*::before,*::after{animation:none!important;caret-color:transparent!important}';\n document.head.appendChild(freeze);\n await document.fonts?.ready;\n await settle();\n\n for (const variable of visibleVariables) {\n // A split padding control edits its base plus all materialized sides as\n // one standardized transformation. Probe that same transformation so a\n // base fallback is not incorrectly reported dead merely because the\n // active theme already contains side overrides.\n const mutatedVariables = [variable];\n if (variable.endsWith('-padding')) {\n for (const side of ['top', 'right', 'bottom', 'left']) {\n const sideVariable = `${variable}-${side}`;\n if (allAliases.includes(sideVariable)) mutatedVariables.push(sideVariable);\n }\n }\n const previous = mutatedVariables.map((name) => ({\n name,\n value: root.style.getPropertyValue(name),\n priority: root.style.getPropertyPriority(name),\n }));\n const current = getComputedStyle(root).getPropertyValue(variable).trim();\n const baseline = fingerprint(variable);\n let changed = false;\n for (const candidate of alternateValues(variable, current)) {\n for (const name of mutatedVariables) root.style.setProperty(name, candidate, 'important');\n // CSS updates synchronously. One animation frame also gives the few\n // JavaScript-backed components (SVG/filter bridges) time to reconcile.\n await settle();\n if (movedFrom(variable, baseline)) {\n changed = true;\n break;\n }\n }\n for (const prior of previous) {\n if (prior.value) root.style.setProperty(prior.name, prior.value, prior.priority);\n else root.style.removeProperty(prior.name);\n }\n await settle();\n (changed ? covered : unchanged).push(variable);\n }\n\n freeze.remove();\n return { covered, unchanged };\n }, { allAliases: componentAliases, forced: forcedVariables, proven: provenVariables });\n}\n\n/** A forced click skips actionability but still lands at the tab's centre, so\n * chrome sitting over a tab hits the chrome and fails the run. */\nasync function selectTab(tab: Locator): Promise<void> {\n await tab.click({ force: true });\n}\n\nasync function selectComponent(page: Page, component: string): Promise<void> {\n await page.evaluate(async (id) => {\n const editor = window.__liveTokensEditor;\n if (!editor) throw new Error('window.__liveTokensEditor is not present on the components route');\n editor.selectComponent(id);\n await new Promise<void>((resolve) => requestAnimationFrame(() =>\n requestAnimationFrame(() => resolve())));\n }, component);\n await page.locator('.variant-group').filter({ visible: true }).waitFor();\n}\n\nfor (const [component, aliases] of aliasesByComponent) {\n test(`${component} repaints every property in its standardized runtime preview`, async ({ page }) => {\n test.setTimeout(600_000);\n await openComponentsEditor(page);\n const covered = new Set<string>();\n const seen = new Set<string>();\n const unchanged = new Set<string>();\n const controlExercised = new Set<string>();\n\n const probe = async (componentAliases: string[], forced: string[] = []) => {\n const remaining = forced.length > 0\n ? forced.filter((variable) => !covered.has(variable))\n : [];\n if (forced.length > 0 && remaining.length === 0) return;\n\n // Exercise standardized preview toggles (zoom, hover enablement, optional\n // content) when retrying a property that is dormant in the default mode.\n if (forced.length > 0) {\n const unchecked = page.locator(\n '.variant-group:visible .tabs-preview input[type=\"checkbox\"]:not(:checked):not(:disabled), '\n + '.variant-group:visible .properties-header input[type=\"checkbox\"]:not(:checked):not(:disabled)',\n );\n for (let index = 0; index < await unchecked.count(); index++) {\n await unchecked.nth(index).click({ force: true });\n }\n }\n\n // Portaled dialogs sit outside `.tabs-preview`; hover their first action\n // so hover-only chrome aliases are painted too. Role-based discovery keeps\n // this independent of any component name or DOM implementation class.\n const dialogAction = page.locator('[role=\"dialog\"] button:not(:disabled)').first();\n if (await dialogAction.count()) await dialogAction.hover({ force: true });\n\n await exerciseVisibleTokenControls(page, componentAliases, controlExercised);\n const gates = await exerciseVisibleCompositeControls(page, componentAliases, controlExercised);\n // A gate that just opened may have revealed a row (the tint colour).\n await exerciseVisibleTokenControls(page, componentAliases, controlExercised);\n await exerciseVisibleSplitPaddingControls(page, componentAliases, controlExercised);\n await exerciseVisibleGradientControls(page, componentAliases, controlExercised);\n const result = await probeCurrentView(page, componentAliases, remaining, [...covered]);\n for (const gate of gates) {\n if (await gate.count()) await gate.click();\n }\n result.covered.forEach((variable) => covered.add(variable));\n result.covered.forEach((variable) => seen.add(variable));\n result.unchanged.forEach((variable) => {\n seen.add(variable);\n if (!covered.has(variable)) unchanged.add(variable);\n });\n };\n\n const traverseComponent = async (\n componentId: string,\n componentAliases: string[],\n forced: string[] = [],\n ) => {\n await selectComponent(page, componentId);\n\n const visitViews = async () => {\n if (forced.length > 0 && forced.every((variable) => covered.has(variable))) return;\n const sizeSelect = page.locator('.variant-group:visible .preview-actions select').first();\n const sizeValues = await sizeSelect.count()\n ? await sizeSelect.locator('option').evaluateAll((options) =>\n options.map((option) => (option as HTMLOptionElement).value))\n : [''];\n\n for (const sizeValue of sizeValues) {\n const currentSizeSelect = page.locator('.variant-group:visible .preview-actions select').first();\n if (sizeValue && await currentSizeSelect.count()) await currentSizeSelect.selectOption(sizeValue);\n\n const variantTabs = page.locator('.variant-group:visible .variant-tabs .variant-tab-btn');\n const variantLabels = await variantTabs.count()\n ? await variantTabs.allTextContents()\n : [''];\n\n for (let variantIndex = 0; variantIndex < variantLabels.length; variantIndex++) {\n if (variantLabels[variantIndex]) {\n await selectTab(page.locator('.variant-group:visible .variant-tabs .variant-tab-btn')\n .nth(variantIndex));\n }\n\n await probe(componentAliases, forced);\n const primaryTabs = page.locator(\n '.variant-group:visible .tabs-states-block > .tabs-selectors:first-of-type .state-tab-btn',\n );\n const primaryLabels = await primaryTabs.allTextContents();\n for (let primaryIndex = 0; primaryIndex < primaryLabels.length; primaryIndex++) {\n await selectTab(page.locator(\n '.variant-group:visible .tabs-states-block > .tabs-selectors:first-of-type .state-tab-btn',\n ).nth(primaryIndex));\n await probe(componentAliases, forced);\n\n const secondaryTabs = page.locator(\n '.variant-group:visible .tabs-states-block > .tabs-selectors.substrip .state-tab-btn',\n );\n const secondaryLabels = await secondaryTabs.allTextContents();\n for (let secondaryIndex = 0; secondaryIndex < secondaryLabels.length; secondaryIndex++) {\n await selectTab(page.locator(\n '.variant-group:visible .tabs-states-block > .tabs-selectors.substrip .state-tab-btn',\n ).nth(secondaryIndex));\n await probe(componentAliases, forced);\n }\n }\n }\n }\n };\n\n await visitViews();\n if (forced.length === 0 || forced.every((variable) => covered.has(variable))) return;\n\n // Open any dialog-capable preview and repeat the same registry traversal.\n const dialogTrigger = page.locator(\n '.variant-group:visible .tabs-preview [aria-haspopup=\"dialog\"][aria-expanded=\"false\"]',\n ).first();\n if (await dialogTrigger.count()) {\n await dialogTrigger.click({ force: true });\n await page.locator('[role=\"dialog\"]').waitFor();\n await visitViews();\n }\n\n // Exercise every option of standardized canvas selects. This covers modes\n // such as Input type and optional Notification actions without any\n // per-component fixture or test case.\n const canvasSelects = page.locator('.variant-group:visible .tabs-preview .canvas-toolbar select');\n for (let selectIndex = 0; selectIndex < await canvasSelects.count(); selectIndex++) {\n const values = await canvasSelects.nth(selectIndex).locator('option').evaluateAll((options) =>\n options.map((option) => (option as HTMLOptionElement).value));\n for (const value of values) {\n if (forced.every((variable) => covered.has(variable))) return;\n await canvasSelects.nth(selectIndex).selectOption(value);\n await visitViews();\n }\n }\n\n // Expanded/collapsed previews expose motion aliases whose computed style\n // is different in each direction.\n const expanders = page.locator(\n '.variant-group:visible .tabs-preview [aria-expanded]:not([aria-haspopup=\"dialog\"])',\n );\n for (let index = 0; index < await expanders.count(); index++) {\n if (forced.every((variable) => covered.has(variable))) return;\n await expanders.nth(index).click({ force: true });\n await visitViews();\n }\n\n // A default-off hover gate only paints while the runtime element itself\n // matches :hover. Forced preview classes intentionally bypass that gate,\n // so retry unresolved properties while hovering each visible preview node.\n // This stays component-agnostic and runs only for the small unresolved set.\n // The traversal above leaves a forced state selected, and its preview\n // class outranks the gated `:hover` rule, so return to the first state.\n const firstStateTab = page.locator(\n '.variant-group:visible .tabs-states-block > .tabs-selectors:first-of-type .state-tab-btn',\n ).first();\n if (await firstStateTab.count()) await selectTab(firstStateTab);\n const hoverTargets = page.locator('.variant-group:visible .tabs-preview *:visible');\n for (let index = 0; index < await hoverTargets.count(); index++) {\n if (forced.every((variable) => covered.has(variable))) return;\n // The node list was read once; a probe above may have re-rendered it.\n try {\n await hoverTargets.nth(index).hover({ force: true, timeout: 2_000 });\n } catch {\n continue;\n }\n await probe(componentAliases, forced);\n }\n };\n\n await traverseComponent(component, aliases);\n\n // Retry every property not yet observed repainting. Composite controls,\n // pseudo-elements, optional content, interaction modes and portaled dialogs\n // are all discovered from standard DOM semantics; there is no component\n // exception table.\n const unresolved = aliases.filter((variable) => !covered.has(variable));\n if (unresolved.length > 0) await traverseComponent(component, aliases, unresolved);\n\n const notExposed = aliases.filter((variable) => !seen.has(variable));\n const notReactive = aliases.filter((variable) => seen.has(variable) && !covered.has(variable));\n const notControlExercised = aliases.filter((variable) => !controlExercised.has(variable));\n\n expect(notExposed, `Properties not exposed by a standardized component view:\\n${notExposed.join('\\n')}`)\n .toEqual([]);\n expect(notReactive, `Properties whose rendered preview did not change:\\n${notReactive.join('\\n')}`)\n .toEqual([]);\n expect(notControlExercised, `Properties not exercised through a rendered editor control:\\n${notControlExercised.join('\\n')}`)\n .toEqual([]);\n expect(covered.size).toBe(aliases.length);\n });\n}\n\ntest('component discovery covers every alias exactly once', () => {\n const perComponent = [...aliasesByComponent.values()].reduce((sum, a) => sum + a.length, 0);\n expect(aliasCases.length).toBeGreaterThan(0);\n expect(perComponent).toBe(aliasCases.length);\n});\n\n// Obligation 6. The traversal above proves every property repaints something in\n// the preview; these pin the mapping, so a repaint elsewhere cannot stand in for\n// the part and CSS property the property is meant to drive.\nfor (const contract of await selectedContracts()) {\n test(`${contract.id} paints each declared property on its declared part`, async ({ page }) => {\n test.setTimeout(180_000);\n const harness = await ContractHarness.open(page, contract);\n expect(await harness.assertProperties()).toBeGreaterThan(0);\n });\n}\n"],"mappings":"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","names":["root"]}