@motion-proto/live-tokens 0.97.0 → 0.98.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/.claude/skills/live-tokens-check-compliance/SKILL.md +5 -0
  2. package/.claude/skills/live-tokens-create-component/SKILL.md +4 -3
  3. package/.claude/skills/live-tokens-create-component/references/contract-tests.md +71 -11
  4. package/CHANGELOG.md +272 -0
  5. package/README.md +2 -2
  6. package/bin/check-component.mjs +8 -0
  7. package/bin/check-page.mjs +6 -0
  8. package/bin/cli.mjs +36 -6
  9. package/bin/contractRunner.mjs +142 -17
  10. package/bin/lib/findings.mjs +20 -4
  11. package/bin/rules/a11y.mjs +53 -0
  12. package/dist-plugin/{chunk-A4TBP4MM.js → chunk-SLICH4IH.js} +2 -2
  13. package/dist-plugin/index.cjs +148 -3
  14. package/dist-plugin/index.js +250 -105
  15. package/dist-plugin/setColors/index.js +1 -1
  16. package/package.json +47 -2
  17. package/src/demo/LabeledSelect.svelte +1 -1
  18. package/src/editor/bootstrap.ts +3 -1
  19. package/src/editor/component-editor/BadgeEditor.svelte +13 -0
  20. package/src/editor/component-editor/ButtonEditor.svelte +33 -2
  21. package/src/editor/component-editor/CalloutEditor.svelte +13 -0
  22. package/src/editor/component-editor/CardEditor.svelte +12 -2
  23. package/src/editor/component-editor/CodeSnippetEditor.svelte +11 -1
  24. package/src/editor/component-editor/CollapsibleSectionEditor.svelte +18 -1
  25. package/src/editor/component-editor/CornerBadgeEditor.svelte +13 -0
  26. package/src/editor/component-editor/DialogEditor.svelte +15 -0
  27. package/src/editor/component-editor/IconButtonEditor.svelte +29 -1
  28. package/src/editor/component-editor/ImageEditor.svelte +20 -9
  29. package/src/editor/component-editor/ImageLightboxEditor.svelte +44 -0
  30. package/src/editor/component-editor/InlineEditActionsEditor.svelte +13 -1
  31. package/src/editor/component-editor/InputEditor.svelte +23 -0
  32. package/src/editor/component-editor/MenuSelectEditor.svelte +27 -1
  33. package/src/editor/component-editor/NotificationEditor.svelte +15 -0
  34. package/src/editor/component-editor/PanelEditor.svelte +1 -1
  35. package/src/editor/component-editor/ProgressBarEditor.svelte +13 -0
  36. package/src/editor/component-editor/RadioButtonEditor.svelte +20 -1
  37. package/src/editor/component-editor/SectionDividerEditor.svelte +41 -13
  38. package/src/editor/component-editor/SegmentedControlEditor.svelte +29 -1
  39. package/src/editor/component-editor/SideNavigationEditor.svelte +40 -1
  40. package/src/editor/component-editor/SlidePagerEditor.svelte +20 -0
  41. package/src/editor/component-editor/SliderEditor.svelte +33 -0
  42. package/src/editor/component-editor/TabBarEditor.svelte +23 -2
  43. package/src/editor/component-editor/TableEditor.svelte +14 -0
  44. package/src/editor/component-editor/ToggleEditor.svelte +17 -0
  45. package/src/editor/component-editor/TooltipEditor.svelte +11 -2
  46. package/src/editor/component-editor/VideoFrameEditor.svelte +8 -0
  47. package/src/editor/component-editor/VideoLightboxEditor.svelte +10 -0
  48. package/src/editor/component-editor/registration.ts +2 -1
  49. package/src/editor/component-editor/registry.ts +69 -27
  50. package/src/editor/component-editor/scaffolding/DemoHeader.svelte +2 -0
  51. package/src/editor/component-editor/scaffolding/StateBlock.svelte +19 -8
  52. package/src/editor/component-editor/scaffolding/TokenLayout.svelte +3 -0
  53. package/src/editor/component-editor/scaffolding/VariantGroup.svelte +70 -3
  54. package/src/editor/component-editor/scaffolding/editorContext.ts +7 -0
  55. package/src/editor/core/a11y/a11yReport.ts +101 -0
  56. package/src/editor/core/a11y/a11yReportTypes.ts +69 -0
  57. package/src/editor/core/a11y/contrastFailures.ts +22 -0
  58. package/src/editor/core/components/contrastPairRegistry.ts +18 -0
  59. package/src/editor/core/palettes/contrast.ts +44 -0
  60. package/src/editor/core/palettes/contrastPairs.ts +79 -0
  61. package/src/editor/core/palettes/resolveColor.ts +77 -0
  62. package/src/editor/core/store/editorStore.ts +4 -0
  63. package/src/editor/core/store/editorViewStore.ts +2 -2
  64. package/src/editor/core/store/unsavedEdits.ts +10 -0
  65. package/src/editor/core/themes/liveStateStream.ts +7 -1
  66. package/src/editor/core/themes/parsers/gradient.ts +5 -2
  67. package/src/editor/docs/chapters.ts +1 -0
  68. package/src/editor/docs/content/accessibility.md +362 -0
  69. package/src/editor/docs/content/editing-tokens.md +28 -1
  70. package/src/editor/docs/content.generated.ts +2 -1
  71. package/src/editor/pages/ComponentEditorPage.svelte +10 -1
  72. package/src/editor/pages/EditorShell.svelte +96 -10
  73. package/src/editor/skill-atlas/skillSources.generated.ts +3 -3
  74. package/src/editor/skill-atlas/trees/check-compliance.ts +3 -3
  75. package/src/editor/skill-atlas/trees/create-component.ts +12 -12
  76. package/src/editor/ui/EditorViewSwitcher.svelte +15 -2
  77. package/src/editor/ui/GradientEditor.svelte +9 -1
  78. package/src/editor/ui/ThemePanel.svelte +4 -4
  79. package/src/editor/ui/UIContrastReadout.svelte +186 -0
  80. package/src/editor/ui/UIInfoPopover.svelte +16 -2
  81. package/src/editor/ui/UIPaletteSelector.svelte +9 -0
  82. package/src/editor/ui/UITokenSelector.svelte +26 -2
  83. package/src/editor/ui/a11y/A11yComponentIssues.svelte +103 -0
  84. package/src/editor/ui/a11y/A11yFindingRow.svelte +57 -0
  85. package/src/editor/ui/a11y/A11yIssueRow.svelte +121 -0
  86. package/src/editor/ui/a11y/A11yOverview.svelte +242 -0
  87. package/src/editor/ui/a11y/A11yPanel.svelte +128 -0
  88. package/src/editor/ui/a11y/A11yPropertyMark.svelte +84 -0
  89. package/src/editor/ui/a11y/A11yRailMark.svelte +34 -0
  90. package/src/editor/ui/a11y/AccessibilityTab.svelte +334 -0
  91. package/src/editor/ui/a11y/a11yView.ts +218 -0
  92. package/src/editor/ui/contrastReadout.ts +45 -0
  93. package/src/live-tokens/data/themes/autumn.json +20 -20
  94. package/src/live-tokens/data/themes/halloween.json +20 -20
  95. package/src/live-tokens/data/themes/midnight-study.json +20 -20
  96. package/src/live-tokens/data/themes/ocean.json +20 -20
  97. package/src/live-tokens/data/themes/royal-velvet.json +20 -20
  98. package/src/live-tokens/data/themes/sketchy.json +20 -20
  99. package/src/live-tokens/data/themes/spring-meadow.json +20 -20
  100. package/src/live-tokens/data/themes/sunset.json +20 -20
  101. package/src/system/components/Badge.svelte +3 -3
  102. package/src/system/components/Button.svelte +9 -3
  103. package/src/system/components/CodeSnippet.svelte +8 -1
  104. package/src/system/components/CornerBadge.svelte +3 -3
  105. package/src/system/components/Dialog.svelte +43 -14
  106. package/src/system/components/IconButton.svelte +1 -1
  107. package/src/system/components/Image.svelte +7 -0
  108. package/src/system/components/ImageLightbox.svelte +18 -25
  109. package/src/system/components/Input.svelte +8 -1
  110. package/src/system/components/MenuSelect.svelte +30 -2
  111. package/src/system/components/Notification.svelte +1 -1
  112. package/src/system/components/ProgressBar.svelte +6 -0
  113. package/src/system/components/RadioButton.svelte +36 -3
  114. package/src/system/components/SegmentedControl.svelte +36 -2
  115. package/src/system/components/SlidePager.svelte +2 -2
  116. package/src/system/components/Slider.svelte +13 -9
  117. package/src/system/components/TabBar.svelte +33 -3
  118. package/src/system/components/Toggle.svelte +2 -2
  119. package/src/system/components/VideoFrame.svelte +1 -1
  120. package/src/system/components/VideoLightbox.svelte +2 -2
  121. package/src/system/internal/focusTrap.ts +35 -0
  122. package/src/testing-js/__aria__/badge.yml +40 -0
  123. package/src/testing-js/__aria__/button.yml +88 -0
  124. package/src/testing-js/__aria__/callout.yml +12 -0
  125. package/src/testing-js/__aria__/card.yml +8 -0
  126. package/src/testing-js/__aria__/codesnippet.yml +21 -0
  127. package/src/testing-js/__aria__/collapsiblesection.yml +23 -0
  128. package/src/testing-js/__aria__/cornerbadge.yml +24 -0
  129. package/src/testing-js/__aria__/dialog.yml +42 -0
  130. package/src/testing-js/__aria__/iconbutton.yml +57 -0
  131. package/src/testing-js/__aria__/image.yml +10 -0
  132. package/src/testing-js/__aria__/imagelightbox.yml +50 -0
  133. package/src/testing-js/__aria__/inlineeditactions.yml +16 -0
  134. package/src/testing-js/__aria__/input.yml +61 -0
  135. package/src/testing-js/__aria__/menuselect.yml +30 -0
  136. package/src/testing-js/__aria__/notification.yml +30 -0
  137. package/src/testing-js/__aria__/panel.yml +2 -0
  138. package/src/testing-js/__aria__/progressbar.yml +2 -0
  139. package/src/testing-js/__aria__/radiobutton.yml +20 -0
  140. package/src/testing-js/__aria__/sectiondivider.yml +9 -0
  141. package/src/testing-js/__aria__/segmentedcontrol.yml +35 -0
  142. package/src/testing-js/__aria__/sidenavigation.yml +304 -0
  143. package/src/testing-js/__aria__/slidepager.yml +72 -0
  144. package/src/testing-js/__aria__/slider.yml +28 -0
  145. package/src/testing-js/__aria__/tabbar.yml +35 -0
  146. package/src/testing-js/__aria__/table.yml +144 -0
  147. package/src/testing-js/__aria__/toggle.yml +12 -0
  148. package/src/testing-js/__aria__/tooltip.yml +2 -0
  149. package/src/testing-js/__aria__/videoframe.yml +6 -0
  150. package/src/testing-js/__aria__/videolightbox.yml +12 -0
  151. package/src/testing-js/{chunk-WIZ6W7UT.js → chunk-3WCLMOM7.js} +2 -2
  152. package/src/testing-js/{chunk-SHBYZUPD.js → chunk-5HNZHIHG.js} +211 -14
  153. package/src/testing-js/chunk-5HNZHIHG.js.map +1 -0
  154. package/src/testing-js/{chunk-NB3NZRBM.js → chunk-7CM5D7PF.js} +5 -1
  155. package/src/testing-js/chunk-7CM5D7PF.js.map +1 -0
  156. package/src/testing-js/chunk-EWSGE27V.js +168 -0
  157. package/src/testing-js/chunk-EWSGE27V.js.map +1 -0
  158. package/src/testing-js/{chunk-GKO27NGN.js → chunk-R54I7YL6.js} +2 -2
  159. package/src/testing-js/{chunk-X6KHEVIG.js → chunk-RWH46IU5.js} +97 -29
  160. package/src/testing-js/chunk-RWH46IU5.js.map +1 -0
  161. package/src/testing-js/chunk-SHLPDNAQ.js +658 -0
  162. package/src/testing-js/chunk-SHLPDNAQ.js.map +1 -0
  163. package/src/testing-js/{chunk-3UKGXCDL.js → chunk-YVVR3GJZ.js} +1 -1
  164. package/src/testing-js/chunk-YVVR3GJZ.js.map +1 -0
  165. package/src/testing-js/component-a11y.contract.js +283 -0
  166. package/src/testing-js/component-a11y.contract.js.map +1 -0
  167. package/src/testing-js/component-alias.contract.js +2 -2
  168. package/src/testing-js/component-behavior.contract.js +2 -2
  169. package/src/testing-js/component-editor.contract.js +6 -5
  170. package/src/testing-js/component-editor.contract.js.map +1 -1
  171. package/src/testing-js/component-render.contract.js +10 -6
  172. package/src/testing-js/component-render.contract.js.map +1 -1
  173. package/src/testing-js/index.d.ts +44 -16
  174. package/src/testing-js/index.js +9 -9
  175. package/src/testing-js/page-compliance.contract.js +132 -13
  176. package/src/testing-js/page-compliance.contract.js.map +1 -1
  177. package/src/testing-js/vitest.js +3 -3
  178. package/template/package.json +9 -0
  179. package/src/testing-js/chunk-3UKGXCDL.js.map +0 -1
  180. package/src/testing-js/chunk-NB3NZRBM.js.map +0 -1
  181. package/src/testing-js/chunk-SHBYZUPD.js.map +0 -1
  182. package/src/testing-js/chunk-X6KHEVIG.js.map +0 -1
  183. /package/src/testing-js/{chunk-WIZ6W7UT.js.map → chunk-3WCLMOM7.js.map} +0 -0
  184. /package/src/testing-js/{chunk-GKO27NGN.js.map → chunk-R54I7YL6.js.map} +0 -0
@@ -1,14 +1,15 @@
1
1
  import {
2
2
  ContractHarness
3
- } from "./chunk-X6KHEVIG.js";
3
+ } from "./chunk-RWH46IU5.js";
4
4
  import {
5
5
  openComponentsEditor
6
- } from "./chunk-WIZ6W7UT.js";
7
- import "./chunk-3UKGXCDL.js";
8
- import "./chunk-NB3NZRBM.js";
6
+ } from "./chunk-3WCLMOM7.js";
7
+ import "./chunk-EWSGE27V.js";
8
+ import "./chunk-7CM5D7PF.js";
9
+ import "./chunk-YVVR3GJZ.js";
9
10
  import {
10
11
  selectedContracts
11
- } from "./chunk-SHBYZUPD.js";
12
+ } from "./chunk-5HNZHIHG.js";
12
13
 
13
14
  // src/testing/component-render.contract.ts
14
15
  import fs from "fs";
@@ -154,6 +155,7 @@ async function exerciseVisibleGradientControls(page, componentAliases, exercised
154
155
  const variable = await editor.getAttribute("data-token-variable");
155
156
  if (!variable || !componentAliases.includes(variable) || exercised.has(variable)) continue;
156
157
  const before = await page.evaluate((name) => document.documentElement.style.getPropertyValue(name).trim(), variable);
158
+ await editor.evaluate((el) => el.scrollIntoView({ block: "center" }));
157
159
  const solid = editor.getByRole("radio", { name: "Solid" });
158
160
  if (await solid.count() && !await solid.isChecked()) await solid.check({ force: true });
159
161
  const picker = editor.locator(".picker-slot .ui-token-selector").first();
@@ -476,7 +478,9 @@ for (const [component, aliases] of aliasesByComponent) {
476
478
  await unchecked.nth(index).click({ force: true });
477
479
  }
478
480
  }
479
- const dialogAction = page.locator('[role="dialog"] button:not(:disabled)').first();
481
+ const dialogAction = page.locator(
482
+ '[role="dialog"]:not(.tabs-preview [role="dialog"]) button:not(:disabled)'
483
+ ).first();
480
484
  if (await dialogAction.count()) await dialogAction.hover({ force: true });
481
485
  await exerciseVisibleTokenControls(page, componentAliases, controlExercised, proof);
482
486
  const gates = await exerciseVisibleCompositeControls(page, componentAliases, controlExercised);
@@ -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\nconst TOKEN_OPTION_SELECTOR = [\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\n/** Every token selector is one component writing to the variable it is\n * labelled with, so a click through its dropdown proves the same wiring for\n * every property. `tokenWrite` records that proof once per component test. */\ninterface ControlProof {\n tokenWrite: boolean;\n}\n\n/**\n * The rendered-property probe below writes root variables directly so it can\n * try arbitrary CSS values. This companion gate proves the editor control\n * reaches the store and the document root: once per component through the\n * click path a designer uses, and for every property by opening its dropdown\n * and finding a value other than the current one to pick.\n */\nasync function exerciseVisibleTokenControls(\n page: Page,\n componentAliases: string[],\n exercised: Set<string>,\n proof: ControlProof,\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 const pending = variables.filter((variable) => componentAliases.includes(variable) && !exercised.has(variable));\n if (pending.length === 0) return;\n\n if (!proof.tokenWrite) {\n for (const variable of pending) {\n if (await clickThroughTokenControl(page, variable, settle)) {\n exercised.add(variable);\n proof.tokenWrite = true;\n break;\n }\n }\n }\n\n const offered = await page.evaluate(async ({ names, optionSelector }) => {\n const frame = () => new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));\n const visibleGroup = [...document.querySelectorAll<HTMLElement>('.variant-group')]\n .find((element) => element.checkVisibility());\n const counts: Record<string, number> = {};\n for (const name of names) {\n const selector = [...(visibleGroup?.querySelectorAll<HTMLElement>(\n `.ui-token-selector[data-token-variable=\"${CSS.escape(name)}\"]:not(.disabled):not(.locked)`,\n ) ?? [])].find((element) => element.checkVisibility());\n const trigger = selector?.querySelector<HTMLElement>('.ui-ts-trigger');\n if (!selector || !trigger) continue;\n trigger.click();\n await frame();\n await frame();\n counts[name] = selector.querySelectorAll(optionSelector).length;\n trigger.click();\n await frame();\n }\n return counts;\n }, { names: pending.filter((variable) => !exercised.has(variable)), optionSelector: TOKEN_OPTION_SELECTOR });\n for (const [variable, count] of Object.entries(offered)) {\n if (count > 0) exercised.add(variable);\n }\n}\n\n/** Picks options through the real dropdown until the root variable changes.\n * Returns false when the dropdown offers nothing to pick. */\nasync function clickThroughTokenControl(\n page: Page,\n variable: string,\n settle: () => Promise<void>,\n): Promise<boolean> {\n const selector = page.locator('.variant-group:visible')\n .locator(`.ui-token-selector:visible[data-token-variable=\"${variable}\"]:not(.disabled):not(.locked)`).first();\n if (await selector.count() === 0) return false;\n const before = await page.evaluate((name) =>\n document.documentElement.style.getPropertyValue(name).trim(), variable);\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(TOKEN_OPTION_SELECTOR);\n const count = await options.count();\n if (count === 0) {\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) return false;\n expect(after, `${variable} did not write through its editor control`).not.toBe(before);\n return true;\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 proof: ControlProof,\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, proof);\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 const proof: ControlProof = { tokenWrite: false };\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, proof);\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, proof);\n await exerciseVisibleSplitPaddingControls(page, componentAliases, controlExercised, proof);\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 with no rendered editor control offering another value:\\n${notControlExercised.join('\\n')}`)\n .toEqual([]);\n expect(proof.tokenWrite, 'no token selector wrote through its dropdown').toBe(true);\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\nconst TOKEN_OPTION_SELECTOR = [\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\n/** Every token selector is one component writing to the variable it is\n * labelled with, so a click through its dropdown proves the same wiring for\n * every property. `tokenWrite` records that proof once per component test. */\ninterface ControlProof {\n tokenWrite: boolean;\n}\n\n/**\n * The rendered-property probe below writes root variables directly so it can\n * try arbitrary CSS values. This companion gate proves the editor control\n * reaches the store and the document root: once per component through the\n * click path a designer uses, and for every property by opening its dropdown\n * and finding a value other than the current one to pick.\n */\nasync function exerciseVisibleTokenControls(\n page: Page,\n componentAliases: string[],\n exercised: Set<string>,\n proof: ControlProof,\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 const pending = variables.filter((variable) => componentAliases.includes(variable) && !exercised.has(variable));\n if (pending.length === 0) return;\n\n if (!proof.tokenWrite) {\n for (const variable of pending) {\n if (await clickThroughTokenControl(page, variable, settle)) {\n exercised.add(variable);\n proof.tokenWrite = true;\n break;\n }\n }\n }\n\n const offered = await page.evaluate(async ({ names, optionSelector }) => {\n const frame = () => new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));\n const visibleGroup = [...document.querySelectorAll<HTMLElement>('.variant-group')]\n .find((element) => element.checkVisibility());\n const counts: Record<string, number> = {};\n for (const name of names) {\n const selector = [...(visibleGroup?.querySelectorAll<HTMLElement>(\n `.ui-token-selector[data-token-variable=\"${CSS.escape(name)}\"]:not(.disabled):not(.locked)`,\n ) ?? [])].find((element) => element.checkVisibility());\n const trigger = selector?.querySelector<HTMLElement>('.ui-ts-trigger');\n if (!selector || !trigger) continue;\n trigger.click();\n await frame();\n await frame();\n counts[name] = selector.querySelectorAll(optionSelector).length;\n trigger.click();\n await frame();\n }\n return counts;\n }, { names: pending.filter((variable) => !exercised.has(variable)), optionSelector: TOKEN_OPTION_SELECTOR });\n for (const [variable, count] of Object.entries(offered)) {\n if (count > 0) exercised.add(variable);\n }\n}\n\n/** Picks options through the real dropdown until the root variable changes.\n * Returns false when the dropdown offers nothing to pick. */\nasync function clickThroughTokenControl(\n page: Page,\n variable: string,\n settle: () => Promise<void>,\n): Promise<boolean> {\n const selector = page.locator('.variant-group:visible')\n .locator(`.ui-token-selector:visible[data-token-variable=\"${variable}\"]:not(.disabled):not(.locked)`).first();\n if (await selector.count() === 0) return false;\n const before = await page.evaluate((name) =>\n document.documentElement.style.getPropertyValue(name).trim(), variable);\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(TOKEN_OPTION_SELECTOR);\n const count = await options.count();\n if (count === 0) {\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) return false;\n expect(after, `${variable} did not write through its editor control`).not.toBe(before);\n return true;\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 proof: ControlProof,\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, proof);\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 // A forced click lands on whatever covers the point. An editor scrolled\n // up to the edge sits under the pinned preview, so it goes to the middle.\n await editor.evaluate((el) => el.scrollIntoView({ block: 'center' }));\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 const proof: ControlProof = { tokenWrite: false };\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 // An inline dialog inside the preview is excluded: hovering its close\n // button would mask that button's own colour property for the whole probe.\n const dialogAction = page.locator(\n '[role=\"dialog\"]:not(.tabs-preview [role=\"dialog\"]) button:not(:disabled)',\n ).first();\n if (await dialogAction.count()) await dialogAction.hover({ force: true });\n\n await exerciseVisibleTokenControls(page, componentAliases, controlExercised, proof);\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, proof);\n await exerciseVisibleSplitPaddingControls(page, componentAliases, controlExercised, proof);\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 with no rendered editor control offering another value:\\n${notControlExercised.join('\\n')}`)\n .toEqual([]);\n expect(proof.tokenWrite, 'no token selector wrote through its dropdown').toBe(true);\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":";;;;;;;;;;;;;;AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,QAAQ,YAAqC;AAOtD,KAAK,SAAS,UAAU,EAAE,MAAM,WAAW,CAAC;AAO5C,SAAS,yBAAsC;AAC7C,QAAM,OAAO,KAAK,QAAQ,QAAQ,IAAI,wBAAwB,wBAAwB,mBAAmB;AACzG,QAAM,QAAqB,CAAC;AAC5B,aAAW,aAAa,GAAG,YAAY,IAAI,EAAE,KAAK,GAAG;AACnD,UAAM,OAAO,KAAK,KAAK,MAAM,WAAW,cAAc;AACtD,QAAI,CAAC,GAAG,WAAW,IAAI,EAAG;AAC1B,UAAM,OAAO,KAAK,MAAM,GAAG,aAAa,MAAM,MAAM,CAAC;AAIrD,UAAM,YAAY,KAAK,aAAa;AACpC,eAAW,YAAY,OAAO,KAAK,KAAK,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG;AAC7D,YAAM,KAAK,EAAE,WAAW,SAAS,CAAC;AAAA,IACpC;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,qBAAqB,QAAQ,IAAI;AACvC,IAAM,aAAa,uBAAuB,EACvC,OAAO,CAAC,EAAE,UAAU,MAAM,CAAC,sBAAsB,cAAc,kBAAkB;AACpF,IAAM,qBAAqB,oBAAI,IAAsB;AACrD,WAAW,EAAE,WAAW,SAAS,KAAK,YAAY;AAChD,QAAM,YAAY,mBAAmB,IAAI,SAAS,KAAK,CAAC;AACxD,YAAU,KAAK,QAAQ;AACvB,qBAAmB,IAAI,WAAW,SAAS;AAC7C;AAOA,IAAM,wBAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAgBX,eAAe,6BACb,MACA,kBACA,WACA,OACe;AACf,QAAM,QAAQ,KAAK,QAAQ,wBAAwB;AACnD,QAAM,SAAS,MAAM,KAAK,SAAS,MAAM,IAAI,QAAc,CAAC,YAC1D,sBAAsB,MAAM,sBAAsB,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;AACtE,QAAM,OAAO;AAGb,QAAM,YAAY,MAAM,MAAM,QAAQ,6EAA6E,EAChH,YAAY,CAAC,aAAa,CAAC,GAAG,IAAI,IAAI,SACpC,IAAI,CAAC,YAAa,QAAwB,QAAQ,aAAa,EAC/D,OAAO,CAAC,UAA2B,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAClD,QAAM,UAAU,UAAU,OAAO,CAAC,aAAa,iBAAiB,SAAS,QAAQ,KAAK,CAAC,UAAU,IAAI,QAAQ,CAAC;AAC9G,MAAI,QAAQ,WAAW,EAAG;AAE1B,MAAI,CAAC,MAAM,YAAY;AACrB,eAAW,YAAY,SAAS;AAC9B,UAAI,MAAM,yBAAyB,MAAM,UAAU,MAAM,GAAG;AAC1D,kBAAU,IAAI,QAAQ;AACtB,cAAM,aAAa;AACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,KAAK,SAAS,OAAO,EAAE,OAAO,eAAe,MAAM;AACvE,UAAM,QAAQ,MAAM,IAAI,QAAc,CAAC,YAAY,sBAAsB,MAAM,QAAQ,CAAC,CAAC;AACzF,UAAM,eAAe,CAAC,GAAG,SAAS,iBAA8B,gBAAgB,CAAC,EAC9E,KAAK,CAAC,YAAY,QAAQ,gBAAgB,CAAC;AAC9C,UAAM,SAAiC,CAAC;AACxC,eAAW,QAAQ,OAAO;AACxB,YAAM,WAAW,CAAC,GAAI,cAAc;AAAA,QAClC,2CAA2C,IAAI,OAAO,IAAI,CAAC;AAAA,MAC7D,KAAK,CAAC,CAAE,EAAE,KAAK,CAAC,YAAY,QAAQ,gBAAgB,CAAC;AACrD,YAAM,UAAU,UAAU,cAA2B,gBAAgB;AACrE,UAAI,CAAC,YAAY,CAAC,QAAS;AAC3B,cAAQ,MAAM;AACd,YAAM,MAAM;AACZ,YAAM,MAAM;AACZ,aAAO,IAAI,IAAI,SAAS,iBAAiB,cAAc,EAAE;AACzD,cAAQ,MAAM;AACd,YAAM,MAAM;AAAA,IACd;AACA,WAAO;AAAA,EACT,GAAG,EAAE,OAAO,QAAQ,OAAO,CAAC,aAAa,CAAC,UAAU,IAAI,QAAQ,CAAC,GAAG,gBAAgB,sBAAsB,CAAC;AAC3G,aAAW,CAAC,UAAU,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACvD,QAAI,QAAQ,EAAG,WAAU,IAAI,QAAQ;AAAA,EACvC;AACF;AAIA,eAAe,yBACb,MACA,UACA,QACkB;AAClB,QAAM,WAAW,KAAK,QAAQ,wBAAwB,EACnD,QAAQ,mDAAmD,QAAQ,gCAAgC,EAAE,MAAM;AAC9G,MAAI,MAAM,SAAS,MAAM,MAAM,EAAG,QAAO;AACzC,QAAM,SAAS,MAAM,KAAK,SAAS,CAAC,SAClC,SAAS,gBAAgB,MAAM,iBAAiB,IAAI,EAAE,KAAK,GAAG,QAAQ;AACxE,MAAI,QAAQ;AACZ,MAAI,cAAc;AAGlB,WAAS,UAAU,GAAG,UAAU,KAAK,UAAU,QAAQ,WAAW;AAChE,UAAM,OAAO;AACb,UAAM,SAAS,QAAQ,gBAAgB,EAAE,MAAM;AAC/C,UAAM,UAAU,SAAS,QAAQ,qBAAqB;AACtD,UAAM,QAAQ,MAAM,QAAQ,MAAM;AAClC,QAAI,UAAU,GAAG;AACf,YAAM,SAAS,QAAQ,gBAAgB,EAAE,MAAM;AAC/C;AAAA,IACF;AACA,kBAAc;AACd,UAAM,QAAQ,IAAI,UAAU,KAAK,EAAE,MAAM;AACzC,UAAM,OAAO;AACb,YAAQ,MAAM,KAAK,SAAS,CAAC,SAC3B,SAAS,gBAAgB,MAAM,iBAAiB,IAAI,EAAE,KAAK,GAAG,QAAQ;AAAA,EAC1E;AACA,MAAI,CAAC,YAAa,QAAO;AACzB,SAAO,OAAO,GAAG,QAAQ,2CAA2C,EAAE,IAAI,KAAK,MAAM;AACrF,SAAO;AACT;AAKA,eAAe,oCACb,MACA,kBACA,WACA,OACe;AACf,QAAM,QAAQ,KAAK,QAAQ,wBAAwB;AACnD,QAAM,YAAY,MAAM,MAAM,QAAQ,kDAAkD,EACrF,YAAY,CAAC,aAAa,CAAC,GAAG,IAAI,IAAI,SACpC,IAAI,CAAC,YAAa,QAAwB,QAAQ,qBAAqB,EACvE,OAAO,CAAC,UAA2B,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAElD,aAAW,YAAY,WAAW;AAChC,QAAI,CAAC,iBAAiB,SAAS,QAAQ,KAAK,UAAU,IAAI,QAAQ,EAAG;AACrE,UAAM,QAAQ,MAAM,QAAQ,oDAAoD,QAAQ,IAAI,EAAE,MAAM;AACpG,QAAI,MAAM,MAAM,MAAM,EAAG,OAAM,MAAM,MAAM;AAAA,EAC7C;AACA,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,KAAK,SAAS,MAAM,IAAI,QAAc,CAAC,YAC3C,sBAAsB,MAAM,sBAAsB,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;AACtE,UAAM,6BAA6B,MAAM,kBAAkB,WAAW,KAAK;AAAA,EAC7E;AACF;AASA,eAAe,iCACb,MACA,kBACA,WACoB;AACpB,QAAM,UAAqB,CAAC;AAC5B,QAAM,QAAQ,KAAK,QAAQ,wBAAwB;AACnD,QAAM,WAAW,MAAM,QAAQ,gCAAgC;AAC/D,WAAS,QAAQ,GAAG,QAAQ,MAAM,SAAS,MAAM,GAAG,SAAS;AAC3D,UAAM,UAAU,SAAS,IAAI,KAAK;AAClC,UAAM,aAAc,MAAM,QAAQ,aAAa,sBAAsB,KAAM,IACxE,MAAM,KAAK,EACX,OAAO,CAAC,aAAa,iBAAiB,SAAS,QAAQ,KAAK,CAAC,UAAU,IAAI,QAAQ,CAAC;AACvF,QAAI,UAAU,WAAW,EAAG;AAC5B,UAAM,SAAS,MAAM,KAAK,SAAS,CAAC,UAAU,OAAO,YAAY,MAAM,IAAI,CAAC,SAAS;AAAA,MAAC;AAAA,MACpF,SAAS,gBAAgB,MAAM,iBAAiB,IAAI,EAAE,KAAK;AAAA,IAC7D,CAAC,CAAC,GAAG,SAAS;AAEd,UAAM,QAAQ,QAAQ,QAAQ,8DAA8D,EAAE,MAAM;AACpG,QAAI,MAAM,MAAM,MAAM,MAAM,EAAG;AAC/B,UAAM,MAAM,MAAM;AAClB,YAAQ,KAAK,KAAK;AAClB,UAAM,KAAK,SAAS,MAAM,IAAI,QAAc,CAAC,YAC3C,sBAAsB,MAAM,sBAAsB,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;AACtE,UAAM,QAAQ,MAAM,KAAK,SAAS,CAAC,UAAU,OAAO,YAAY,MAAM,IAAI,CAAC,SAAS;AAAA,MAAC;AAAA,MACnF,SAAS,gBAAgB,MAAM,iBAAiB,IAAI,EAAE,KAAK;AAAA,IAC7D,CAAC,CAAC,GAAG,SAAS;AACd,eAAW,YAAY,WAAW;AAChC,aAAO,MAAM,QAAQ,GAAG,GAAG,QAAQ,8CAA8C,EAC9E,IAAI,KAAK,OAAO,QAAQ,CAAC;AAC5B,gBAAU,IAAI,QAAQ;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AACT;AAKA,eAAe,gCACb,MACA,kBACA,WACe;AACf,QAAM,QAAQ,KAAK,QAAQ,wBAAwB;AACnD,QAAM,UAAU,MAAM,QAAQ,+CAA+C;AAC7E,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,MAAM,GAAG,SAAS;AAC1D,UAAM,SAAS,QAAQ,IAAI,KAAK;AAChC,UAAM,WAAW,MAAM,OAAO,aAAa,qBAAqB;AAChE,QAAI,CAAC,YAAY,CAAC,iBAAiB,SAAS,QAAQ,KAAK,UAAU,IAAI,QAAQ,EAAG;AAClF,UAAM,SAAS,MAAM,KAAK,SAAS,CAAC,SAClC,SAAS,gBAAgB,MAAM,iBAAiB,IAAI,EAAE,KAAK,GAAG,QAAQ;AAIxE,UAAM,OAAO,SAAS,CAAC,OAAO,GAAG,eAAe,EAAE,OAAO,SAAS,CAAC,CAAC;AAGpE,UAAM,QAAQ,OAAO,UAAU,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzD,QAAI,MAAM,MAAM,MAAM,KAAK,CAAC,MAAM,MAAM,UAAU,EAAG,OAAM,MAAM,MAAM,EAAE,OAAO,KAAK,CAAC;AACtF,UAAM,SAAS,OAAO,QAAQ,iCAAiC,EAAE,MAAM;AACvE,UAAM,OAAO,QAAQ,gBAAgB,EAAE,MAAM,EAAE,OAAO,KAAK,CAAC;AAC5D,UAAM,SAAS,OAAO,QAAQ,0CAA0C,EAAE,MAAM;AAChF,QAAI,MAAM,OAAO,MAAM,MAAM,EAAG;AAChC,UAAM,OAAO,MAAM,EAAE,OAAO,KAAK,CAAC;AAElC,UAAM,OAAO;AAAA,MAAK,MAAM,KAAK,SAAS,CAAC,SACrC,SAAS,gBAAgB,MAAM,iBAAiB,IAAI,EAAE,KAAK,GAAG,QAAQ;AAAA,MACtE,EAAE,SAAS,GAAG,QAAQ,6CAA6C;AAAA,IAAC,EACnE,IAAI,QAAQ,IAAI,OAAO,IAAI,aAAa,MAAM,CAAC,GAAG,CAAC;AACtD,cAAU,IAAI,QAAQ;AAAA,EACxB;AACF;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;AAQA,eAAe,iBACb,MACA,kBACA,kBAA4B,CAAC,GAC7B,kBAA4B,CAAC,GACP;AACtB,SAAO,KAAK,SAAS,OAAO,EAAE,YAAY,QAAQ,OAAO,MAAM;AAC7D,UAAM,QAAQ,MAAM,KAAK,SAAS,iBAA8B,gBAAgB,CAAC,EAC9E,KAAK,CAAC,YAAY,QAAQ,iBAAiB,IAAI;AAClD,UAAM,UAAU,OAAO,cAA2B,eAAe;AACjE,QAAI,CAAC,SAAS,CAAC,QAAS,QAAO,EAAE,SAAS,CAAC,GAAG,WAAW,CAAC,EAAE;AAE5D,UAAM,mBAAmB,oBAAI,IAAY;AACzC,QAAI,OAAO,SAAS,GAAG;AACrB,iBAAW,YAAY,QAAQ;AAC7B,YAAI,WAAW,SAAS,QAAQ,EAAG,kBAAiB,IAAI,QAAQ;AAAA,MAClE;AAAA,IACF,OAAO;AACL,iBAAW,WAAW,MAAM,iBAA8B,uBAAuB,GAAG;AAClF,cAAM,WAAW,QAAQ,QAAQ;AACjC,YAAI,QAAQ,iBAAiB,QAAQ,YAAY,WAAW,SAAS,QAAQ,GAAG;AAC9E,2BAAiB,IAAI,QAAQ;AAAA,QAC/B;AAAA,MACF;AACA,iBAAW,WAAW,MAAM,iBAA8B,wBAAwB,GAAG;AACnF,YAAI,QAAQ,iBAAiB,KAAM;AACnC,mBAAW,aAAa,QAAQ,QAAQ,kBAAkB,IAAI,MAAM,KAAK,GAAG;AAC1E,cAAI,WAAW,SAAS,QAAQ,EAAG,kBAAiB,IAAI,QAAQ;AAAA,QAClE;AAAA,MACF;AAAA,IACF;AAKA,eAAW,YAAY,CAAC,GAAG,gBAAgB,GAAG;AAC5C,UAAI,CAAC,SAAS,SAAS,UAAU,EAAG;AACpC,iBAAW,QAAQ,CAAC,OAAO,SAAS,UAAU,MAAM,GAAG;AACrD,cAAM,eAAe,GAAG,QAAQ,IAAI,IAAI;AACxC,YAAI,WAAW,SAAS,YAAY,EAAG,kBAAiB,IAAI,YAAY;AAAA,MAC1E;AAAA,IACF;AAMA,eAAW,YAAY,OAAQ,kBAAiB,OAAO,QAAQ;AAC/D,QAAI,iBAAiB,SAAS,EAAG,QAAO,EAAE,SAAS,CAAC,GAAG,WAAW,CAAC,EAAE;AACrE,UAAM,aAAa;AAAA,MACjB;AAAA,MAAW;AAAA,MAAc;AAAA,MAAW;AAAA,MAAY;AAAA,MAChD;AAAA,MAAS;AAAA,MAAc;AAAA,MAAmB;AAAA,MAAmB;AAAA,MAAkB;AAAA,MAC/E;AAAA,MAAU;AAAA,MAAe;AAAA,MAAe;AAAA,MACxC;AAAA,MAAkB;AAAA,MAAoB;AAAA,MAAqB;AAAA,MAC3D;AAAA,MAAkB;AAAA,MAAoB;AAAA,MAAqB;AAAA,MAC3D;AAAA,MAAgB;AAAA,MAAuB;AAAA,MACvC;AAAA,MAA2B;AAAA,MAC3B;AAAA,MAAW;AAAA,MAAgB;AAAA,MAAgB;AAAA,MAC3C;AAAA,MAAU;AAAA,MAAkB;AAAA,MAC5B;AAAA,MAAc;AAAA,MAAY;AAAA,MAAc;AAAA,MAAa;AAAA,MAAc;AAAA,MACnE;AAAA,MAAa;AAAA,MAAkB;AAAA,MAAiB;AAAA,MAAc;AAAA,MAC9D;AAAA,MAAW;AAAA,MAAc;AAAA,MAAgB;AAAA,MAAiB;AAAA,MAC1D;AAAA,MAAU;AAAA,MAAa;AAAA,MAAe;AAAA,MAAgB;AAAA,MACtD;AAAA,MAAO;AAAA,MAAU;AAAA,MACjB;AAAA,MAAS;AAAA,MAAY;AAAA,MAAY;AAAA,MAAU;AAAA,MAAa;AAAA,MACxD;AAAA,MAAO;AAAA,MAAS;AAAA,MAAU;AAAA,MAC1B;AAAA,MAAa;AAAA,MAAmB;AAAA,MAAa;AAAA,MAAU;AAAA,MACvD;AAAA,MAAkB;AAAA,MAAgB;AAAA,MAAe;AAAA,MAAgB;AAAA,MAAc;AAAA,MAC/E;AAAA,MAAuB;AAAA,MAAoB;AAAA,MAAc;AAAA,MAAW;AAAA,MAAQ;AAAA,MAC5E;AAAA,MAAY;AAAA,MAAa;AAAA,MAAa;AAAA,MAAY;AAAA,MAAa;AAAA,MAC/D;AAAA,MAAQ;AAAA,MAAU;AAAA,MAAe;AAAA,MAAmB;AAAA,MACpD;AAAA,MAAU;AAAA,MAAiB;AAAA,MAC3B;AAAA,MAAsB;AAAA,MAAsB;AAAA,MAA4B;AAAA,MACxE;AAAA,MAAkB;AAAA,IACpB;AAEA,UAAM,mBAAmB;AACzB,UAAM,mBAAmB,CAAC,YAAqB,MAAM,KAAK,QAAQ,UAAU,EACzE,OAAO,CAAC,cAAc,CAAC,iBAAiB,KAAK,UAAU,IAAI,CAAC,EAC5D,IAAI,CAAC,cAAc,GAAG,UAAU,IAAI,IAAI,UAAU,KAAK,EAAE,EACzD,KAAK,EACL,KAAK,GAAG;AAEX,UAAM,qBAAqB,CAAC,aAAqB;AAC/C,YAAM,kBAAkB,CAAC,YAAY,SAAS;AAC9C,UAAI,SAAS,SAAS,aAAa,EAAG,iBAAgB,KAAK,eAAe;AAC1E,UAAI,SAAS,SAAS,WAAW,GAAG;AAClC,wBAAgB;AAAA,UACd;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAKA,UAAM,mBAAmB,MAAM;AAC7B,YAAM,QAAQ,CAAC,SAAS,GAAG,SAAS,iBAA8B,iBAAiB,CAAC;AACpF,aAAO,MAAM,QAAQ,CAACA,UAAS,CAACA,OAAM,GAAGA,MAAK,iBAA8B,GAAG,CAAC,CAAC;AAAA,IACnF;AAEA,UAAM,kBAAkB,CAAC,SAAsB,OAAe,oBAA8B;AAC1F,YAAM,QAAQ,iBAAiB,OAAO;AACtC,YAAM,OAAO,QAAQ,sBAAsB;AAC3C,YAAM,SAAS,WAAW,IAAI,CAAC,aAAa,MAAM,QAAQ,CAAC,EAAE,KAAK,GAAG;AACrE,YAAM,eAAe,gBAAgB,IAAI,CAAC,aAAa;AACrD,cAAM,SAAS,iBAAiB,SAAS,QAAQ;AACjD,eAAO,WAAW,IAAI,CAAC,aAAa,OAAO,QAAQ,CAAC,EAAE,KAAK,GAAG;AAAA,MAChE,CAAC,EAAE,KAAK,GAAG;AACX,aAAO;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,MAAM;AAAA,QAChD,GAAG,QAAQ,WAAW,IAAI,QAAQ,YAAY;AAAA,QAC9C,iBAAiB,OAAO;AAAA,MAC1B,EAAE,KAAK,GAAG;AAAA,IACZ;AAEA,UAAM,cAAc,CAAC,aAAqB;AACxC,YAAM,kBAAkB,mBAAmB,QAAQ;AACnD,aAAO,iBAAiB,EAAE,IAAI,CAAC,SAAS,UACtC,gBAAgB,SAAS,OAAO,eAAe,CAAC;AAAA,IACpD;AAOA,UAAM,YAAY,CAAC,UAAkB,aAAuB;AAC1D,YAAM,kBAAkB,mBAAmB,QAAQ;AACnD,YAAM,QAAQ,iBAAiB;AAC/B,UAAI,MAAM,WAAW,SAAS,OAAQ,QAAO;AAC7C,eAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;AACjD,YAAI,gBAAgB,MAAM,KAAK,GAAG,OAAO,eAAe,MAAM,SAAS,KAAK,EAAG,QAAO;AAAA,MACxF;AACA,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB,CAAC,UAAkB,YAA8B;AACvE,YAAM,SAAmB,CAAC;AAC1B,YAAM,MAAM,IAAI,eAAyB;AACvC,mBAAW,aAAa,YAAY;AAClC,cAAI,cAAc,WAAW,CAAC,OAAO,SAAS,SAAS,EAAG,QAAO,KAAK,SAAS;AAAA,QACjF;AAAA,MACF;AACA,UAAI,6DAA6D,KAAK,QAAQ,GAAG;AAC/E,YAAI,gBAAgB,kBAAkB;AAAA,MACxC;AACA,UAAI,SAAS,SAAS,aAAa,EAAG,KAAI,aAAa,OAAO;AAC9D,UAAI,SAAS,SAAS,aAAa,EAAG,KAAI,OAAO,KAAK;AACtD,UAAI,SAAS,SAAS,aAAa,EAAG,KAAI,QAAQ,MAAM;AACxD,UAAI,SAAS,SAAS,gBAAgB,EAAG,KAAI,OAAO,MAAM;AAC1D,UAAI,SAAS,SAAS,QAAQ,EAAG,KAAI,8BAA8B,MAAM;AACzE,UAAI,SAAS,SAAS,MAAM,EAAG,KAAI,aAAa,MAAM;AACtD,UAAI,SAAS,SAAS,UAAU,GAAG;AACjC,YAAI,0DAA0D,MAAM;AAAA,MACtE;AACA,UAAI,SAAS,SAAS,UAAU,KAAK,SAAS,SAAS,YAAY,EAAG,KAAI,MAAM,IAAI;AACpF,UAAI,SAAS,SAAS,SAAS,EAAG,KAAI,QAAQ,MAAM;AACpD,UAAI,SAAS,SAAS,SAAS,EAAG,KAAI,YAAY,SAAS,UAAU,QAAQ,UAAU;AACvF,UAAI,SAAS,SAAS,OAAO,EAAG,KAAI,SAAS,UAAU,UAAU;AACjE,UAAI,SAAS,SAAS,UAAU,EAAG,KAAI,eAAe,qBAAqB,QAAQ;AACnF,UAAI,SAAS,SAAS,gBAAgB,EAAG,KAAI,UAAU,SAAS;AAChE,UAAI,SAAS,SAAS,SAAS,GAAG;AAChC,YAAI,4EAA4E,MAAM;AAAA,MACxF;AACA,UAAI,uEAAuE,KAAK,QAAQ,GAAG;AACzF,YAAI,QAAQ,KAAK;AAAA,MACnB;AACA,UAAI,SAAS,SAAS,OAAO,EAAG,KAAI,QAAQ,MAAM;AAClD,UAAI,iCAAiC,QAAQ,gBAAgB,QAAQ,GAAG;AACxE,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,SAAS;AACtB,UAAM,UAAoB,CAAC;AAC3B,UAAM,YAAsB,CAAC;AAK7B,UAAM,SAAS,YAAY;AACzB,YAAM,IAAI,QAAc,CAAC,YAAY,sBAAsB,MAAM,QAAQ,CAAC,CAAC;AAC3E,iBAAW,aAAa,SAAS,cAAc,EAAG,WAAU,OAAO;AAAA,IACrE;AAIA,UAAM,SAAS,SAAS,cAAc,OAAO;AAC7C,WAAO,QAAQ,kBAAkB;AACjC,WAAO,cAAc;AACrB,aAAS,KAAK,YAAY,MAAM;AAChC,UAAM,SAAS,OAAO;AACtB,UAAM,OAAO;AAEb,eAAW,YAAY,kBAAkB;AAKvC,YAAM,mBAAmB,CAAC,QAAQ;AAClC,UAAI,SAAS,SAAS,UAAU,GAAG;AACjC,mBAAW,QAAQ,CAAC,OAAO,SAAS,UAAU,MAAM,GAAG;AACrD,gBAAM,eAAe,GAAG,QAAQ,IAAI,IAAI;AACxC,cAAI,WAAW,SAAS,YAAY,EAAG,kBAAiB,KAAK,YAAY;AAAA,QAC3E;AAAA,MACF;AACA,YAAM,WAAW,iBAAiB,IAAI,CAAC,UAAU;AAAA,QAC/C;AAAA,QACA,OAAO,KAAK,MAAM,iBAAiB,IAAI;AAAA,QACvC,UAAU,KAAK,MAAM,oBAAoB,IAAI;AAAA,MAC/C,EAAE;AACF,YAAM,UAAU,iBAAiB,IAAI,EAAE,iBAAiB,QAAQ,EAAE,KAAK;AACvE,YAAM,WAAW,YAAY,QAAQ;AACrC,UAAI,UAAU;AACd,iBAAW,aAAa,gBAAgB,UAAU,OAAO,GAAG;AAC1D,mBAAW,QAAQ,iBAAkB,MAAK,MAAM,YAAY,MAAM,WAAW,WAAW;AAGxF,cAAM,OAAO;AACb,YAAI,UAAU,UAAU,QAAQ,GAAG;AACjC,oBAAU;AACV;AAAA,QACF;AAAA,MACF;AACA,iBAAW,SAAS,UAAU;AAC5B,YAAI,MAAM,MAAO,MAAK,MAAM,YAAY,MAAM,MAAM,MAAM,OAAO,MAAM,QAAQ;AAAA,YAC1E,MAAK,MAAM,eAAe,MAAM,IAAI;AAAA,MAC3C;AACA,YAAM,OAAO;AACb,OAAC,UAAU,UAAU,WAAW,KAAK,QAAQ;AAAA,IAC/C;AAEA,WAAO,OAAO;AACd,WAAO,EAAE,SAAS,UAAU;AAAA,EAC9B,GAAG,EAAE,YAAY,kBAAkB,QAAQ,iBAAiB,QAAQ,gBAAgB,CAAC;AACvF;AAIA,eAAe,UAAU,KAA6B;AACpD,QAAM,IAAI,MAAM,EAAE,OAAO,KAAK,CAAC;AACjC;AAEA,eAAe,gBAAgB,MAAY,WAAkC;AAC3E,QAAM,KAAK,SAAS,OAAO,OAAO;AAChC,UAAM,SAAS,OAAO;AACtB,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,kEAAkE;AAC/F,WAAO,gBAAgB,EAAE;AACzB,UAAM,IAAI,QAAc,CAAC,YAAY,sBAAsB,MACzD,sBAAsB,MAAM,QAAQ,CAAC,CAAC,CAAC;AAAA,EAC3C,GAAG,SAAS;AACZ,QAAM,KAAK,QAAQ,gBAAgB,EAAE,OAAO,EAAE,SAAS,KAAK,CAAC,EAAE,QAAQ;AACzE;AAEA,WAAW,CAAC,WAAW,OAAO,KAAK,oBAAoB;AACrD,OAAK,GAAG,SAAS,gEAAgE,OAAO,EAAE,KAAK,MAAM;AACnG,SAAK,WAAW,GAAO;AACvB,UAAM,qBAAqB,IAAI;AAC/B,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,YAAY,oBAAI,IAAY;AAClC,UAAM,mBAAmB,oBAAI,IAAY;AACzC,UAAM,QAAsB,EAAE,YAAY,MAAM;AAEhD,UAAM,QAAQ,OAAO,kBAA4B,SAAmB,CAAC,MAAM;AACzE,YAAM,YAAY,OAAO,SAAS,IAC9B,OAAO,OAAO,CAAC,aAAa,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAClD,CAAC;AACL,UAAI,OAAO,SAAS,KAAK,UAAU,WAAW,EAAG;AAIjD,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,YAAY,KAAK;AAAA,UACrB;AAAA,QAEF;AACA,iBAAS,QAAQ,GAAG,QAAQ,MAAM,UAAU,MAAM,GAAG,SAAS;AAC5D,gBAAM,UAAU,IAAI,KAAK,EAAE,MAAM,EAAE,OAAO,KAAK,CAAC;AAAA,QAClD;AAAA,MACF;AAOA,YAAM,eAAe,KAAK;AAAA,QACxB;AAAA,MACF,EAAE,MAAM;AACR,UAAI,MAAM,aAAa,MAAM,EAAG,OAAM,aAAa,MAAM,EAAE,OAAO,KAAK,CAAC;AAExE,YAAM,6BAA6B,MAAM,kBAAkB,kBAAkB,KAAK;AAClF,YAAM,QAAQ,MAAM,iCAAiC,MAAM,kBAAkB,gBAAgB;AAE7F,YAAM,6BAA6B,MAAM,kBAAkB,kBAAkB,KAAK;AAClF,YAAM,oCAAoC,MAAM,kBAAkB,kBAAkB,KAAK;AACzF,YAAM,gCAAgC,MAAM,kBAAkB,gBAAgB;AAC9E,YAAM,SAAS,MAAM,iBAAiB,MAAM,kBAAkB,WAAW,CAAC,GAAG,OAAO,CAAC;AACrF,iBAAW,QAAQ,OAAO;AACxB,YAAI,MAAM,KAAK,MAAM,EAAG,OAAM,KAAK,MAAM;AAAA,MAC3C;AACA,aAAO,QAAQ,QAAQ,CAAC,aAAa,QAAQ,IAAI,QAAQ,CAAC;AAC1D,aAAO,QAAQ,QAAQ,CAAC,aAAa,KAAK,IAAI,QAAQ,CAAC;AACvD,aAAO,UAAU,QAAQ,CAAC,aAAa;AACrC,aAAK,IAAI,QAAQ;AACjB,YAAI,CAAC,QAAQ,IAAI,QAAQ,EAAG,WAAU,IAAI,QAAQ;AAAA,MACpD,CAAC;AAAA,IACH;AAEA,UAAM,oBAAoB,OACxB,aACA,kBACA,SAAmB,CAAC,MACjB;AACH,YAAM,gBAAgB,MAAM,WAAW;AAEvC,YAAM,aAAa,YAAY;AAC7B,YAAI,OAAO,SAAS,KAAK,OAAO,MAAM,CAAC,aAAa,QAAQ,IAAI,QAAQ,CAAC,EAAG;AAC5E,cAAM,aAAa,KAAK,QAAQ,gDAAgD,EAAE,MAAM;AACxF,cAAM,aAAa,MAAM,WAAW,MAAM,IACtC,MAAM,WAAW,QAAQ,QAAQ,EAAE,YAAY,CAAC,YAC9C,QAAQ,IAAI,CAAC,WAAY,OAA6B,KAAK,CAAC,IAC9D,CAAC,EAAE;AAEP,mBAAW,aAAa,YAAY;AAClC,gBAAM,oBAAoB,KAAK,QAAQ,gDAAgD,EAAE,MAAM;AAC/F,cAAI,aAAa,MAAM,kBAAkB,MAAM,EAAG,OAAM,kBAAkB,aAAa,SAAS;AAEhG,gBAAM,cAAc,KAAK,QAAQ,uDAAuD;AACxF,gBAAM,gBAAgB,MAAM,YAAY,MAAM,IAC1C,MAAM,YAAY,gBAAgB,IAClC,CAAC,EAAE;AAEP,mBAAS,eAAe,GAAG,eAAe,cAAc,QAAQ,gBAAgB;AAC9E,gBAAI,cAAc,YAAY,GAAG;AAC/B,oBAAM,UAAU,KAAK,QAAQ,uDAAuD,EACjF,IAAI,YAAY,CAAC;AAAA,YACtB;AAEA,kBAAM,MAAM,kBAAkB,MAAM;AACpC,kBAAM,cAAc,KAAK;AAAA,cACvB;AAAA,YACF;AACA,kBAAM,gBAAgB,MAAM,YAAY,gBAAgB;AACxD,qBAAS,eAAe,GAAG,eAAe,cAAc,QAAQ,gBAAgB;AAC9E,oBAAM,UAAU,KAAK;AAAA,gBACnB;AAAA,cACF,EAAE,IAAI,YAAY,CAAC;AACnB,oBAAM,MAAM,kBAAkB,MAAM;AAEpC,oBAAM,gBAAgB,KAAK;AAAA,gBACzB;AAAA,cACF;AACA,oBAAM,kBAAkB,MAAM,cAAc,gBAAgB;AAC5D,uBAAS,iBAAiB,GAAG,iBAAiB,gBAAgB,QAAQ,kBAAkB;AACtF,sBAAM,UAAU,KAAK;AAAA,kBACnB;AAAA,gBACF,EAAE,IAAI,cAAc,CAAC;AACrB,sBAAM,MAAM,kBAAkB,MAAM;AAAA,cACtC;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,WAAW;AACjB,UAAI,OAAO,WAAW,KAAK,OAAO,MAAM,CAAC,aAAa,QAAQ,IAAI,QAAQ,CAAC,EAAG;AAG9E,YAAM,gBAAgB,KAAK;AAAA,QACzB;AAAA,MACF,EAAE,MAAM;AACR,UAAI,MAAM,cAAc,MAAM,GAAG;AAC/B,cAAM,cAAc,MAAM,EAAE,OAAO,KAAK,CAAC;AACzC,cAAM,KAAK,QAAQ,iBAAiB,EAAE,QAAQ;AAC9C,cAAM,WAAW;AAAA,MACnB;AAKA,YAAM,gBAAgB,KAAK,QAAQ,6DAA6D;AAChG,eAAS,cAAc,GAAG,cAAc,MAAM,cAAc,MAAM,GAAG,eAAe;AAClF,cAAM,SAAS,MAAM,cAAc,IAAI,WAAW,EAAE,QAAQ,QAAQ,EAAE,YAAY,CAAC,YACjF,QAAQ,IAAI,CAAC,WAAY,OAA6B,KAAK,CAAC;AAC9D,mBAAW,SAAS,QAAQ;AAC1B,cAAI,OAAO,MAAM,CAAC,aAAa,QAAQ,IAAI,QAAQ,CAAC,EAAG;AACvD,gBAAM,cAAc,IAAI,WAAW,EAAE,aAAa,KAAK;AACvD,gBAAM,WAAW;AAAA,QACnB;AAAA,MACF;AAIA,YAAM,YAAY,KAAK;AAAA,QACrB;AAAA,MACF;AACA,eAAS,QAAQ,GAAG,QAAQ,MAAM,UAAU,MAAM,GAAG,SAAS;AAC5D,YAAI,OAAO,MAAM,CAAC,aAAa,QAAQ,IAAI,QAAQ,CAAC,EAAG;AACvD,cAAM,UAAU,IAAI,KAAK,EAAE,MAAM,EAAE,OAAO,KAAK,CAAC;AAChD,cAAM,WAAW;AAAA,MACnB;AAQA,YAAM,gBAAgB,KAAK;AAAA,QACzB;AAAA,MACF,EAAE,MAAM;AACR,UAAI,MAAM,cAAc,MAAM,EAAG,OAAM,UAAU,aAAa;AAC9D,YAAM,eAAe,KAAK,QAAQ,gDAAgD;AAClF,eAAS,QAAQ,GAAG,QAAQ,MAAM,aAAa,MAAM,GAAG,SAAS;AAC/D,YAAI,OAAO,MAAM,CAAC,aAAa,QAAQ,IAAI,QAAQ,CAAC,EAAG;AAEvD,YAAI;AACF,gBAAM,aAAa,IAAI,KAAK,EAAE,MAAM,EAAE,OAAO,MAAM,SAAS,IAAM,CAAC;AAAA,QACrE,QAAQ;AACN;AAAA,QACF;AACA,cAAM,MAAM,kBAAkB,MAAM;AAAA,MACtC;AAAA,IACF;AAEA,UAAM,kBAAkB,WAAW,OAAO;AAM1C,UAAM,aAAa,QAAQ,OAAO,CAAC,aAAa,CAAC,QAAQ,IAAI,QAAQ,CAAC;AACtE,QAAI,WAAW,SAAS,EAAG,OAAM,kBAAkB,WAAW,SAAS,UAAU;AAEjF,UAAM,aAAa,QAAQ,OAAO,CAAC,aAAa,CAAC,KAAK,IAAI,QAAQ,CAAC;AACnE,UAAM,cAAc,QAAQ,OAAO,CAAC,aAAa,KAAK,IAAI,QAAQ,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC;AAC7F,UAAM,sBAAsB,QAAQ,OAAO,CAAC,aAAa,CAAC,iBAAiB,IAAI,QAAQ,CAAC;AAExF,WAAO,YAAY;AAAA,EAA6D,WAAW,KAAK,IAAI,CAAC,EAAE,EACpG,QAAQ,CAAC,CAAC;AACb,WAAO,aAAa;AAAA,EAAsD,YAAY,KAAK,IAAI,CAAC,EAAE,EAC/F,QAAQ,CAAC,CAAC;AACb,WAAO,qBAAqB;AAAA,EAAuE,oBAAoB,KAAK,IAAI,CAAC,EAAE,EAChI,QAAQ,CAAC,CAAC;AACb,WAAO,MAAM,YAAY,8CAA8C,EAAE,KAAK,IAAI;AAClF,WAAO,QAAQ,IAAI,EAAE,KAAK,QAAQ,MAAM;AAAA,EAC1C,CAAC;AACH;AAEA,KAAK,uDAAuD,MAAM;AAChE,QAAM,eAAe,CAAC,GAAG,mBAAmB,OAAO,CAAC,EAAE,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ,CAAC;AAC1F,SAAO,WAAW,MAAM,EAAE,gBAAgB,CAAC;AAC3C,SAAO,YAAY,EAAE,KAAK,WAAW,MAAM;AAC7C,CAAC;AAKD,WAAW,YAAY,MAAM,kBAAkB,GAAG;AAChD,OAAK,GAAG,SAAS,EAAE,uDAAuD,OAAO,EAAE,KAAK,MAAM;AAC5F,SAAK,WAAW,IAAO;AACvB,UAAM,UAAU,MAAM,gBAAgB,KAAK,MAAM,QAAQ;AACzD,WAAO,MAAM,QAAQ,iBAAiB,CAAC,EAAE,gBAAgB,CAAC;AAAA,EAC5D,CAAC;AACH;","names":["root"]}
@@ -162,22 +162,17 @@ interface ThemeExpectation extends View {
162
162
  /** Variables whose root value the theme must move. */
163
163
  changed: string[];
164
164
  /**
165
- * Variables the theme must leave exactly as they were. Two theme JSON files
166
- * can name the identical design token (e.g. both `--border-neutral`) and
167
- * still resolve to different rendered colors, because many color primitives
168
- * are computed per theme from a palette/seed even when the alias string is
169
- * unchanged — comparing the two files' alias *names* does not establish
170
- * invariance. Pick `unchanged` candidates from token families a theme never
171
- * recolors: `--shadow-*`, `--icon-size-*`, `--font-size-*`,
172
- * `--line-height-*`, `--font-family`/`--font-mono`, and the spacing/radius/
173
- * border-width scale steps (`--space-*`, `--radius-*`, `--border-width-*`)
174
- * are all fixed constants, not palette-derived — verify a candidate's
175
- * *resolved* value is identical between the two theme files before trusting
176
- * it, not just that the alias name matches.
165
+ * Variables the theme must leave exactly as they were. A theme moves colors,
166
+ * shadows, font families, and type sizes, and it resolves many color tokens
167
+ * from its own palette even where two theme files name the same alias, so
168
+ * compare a candidate's resolved value under both themes before trusting
169
+ * it. The spacing, radius, and border-width steps (`--space-*`, `--radius-*`,
170
+ * `--border-width-*`) hold one value in every theme, and a theme assigns
171
+ * them only to the components it holds a block for, so a new component's
172
+ * geometry stays put.
177
173
  */
178
174
  unchanged: string[];
179
- /** Variables the theme's own component config aliases, and the design token
180
- * each must resolve to under it. */
175
+ /** Variables, and the design token each must resolve to under the theme. */
181
176
  aliasedTo: Record<string, string>;
182
177
  /** Where the theme's value must land in the rendered preview. */
183
178
  observe: {
@@ -186,9 +181,12 @@ interface ThemeExpectation extends View {
186
181
  variable: string;
187
182
  };
188
183
  }
189
- type InteractionAction = {
184
+ type InteractionAction =
185
+ /** Without a part the key goes to the element holding focus, such as an
186
+ * overlay that took focus as it opened. */
187
+ {
190
188
  kind: 'press';
191
- part: string;
189
+ part?: string;
192
190
  key: string;
193
191
  } | {
194
192
  kind: 'click';
@@ -229,11 +227,29 @@ type InteractionOutcome = {
229
227
  kind: 'focused';
230
228
  part: string;
231
229
  value: boolean;
230
+ }
231
+ /** Whether the action fired a click on the part, the event a native button
232
+ * sends when Enter or Space activates it. A preview that never feeds a
233
+ * controlled component's callback back into its props shows activation
234
+ * only this way. */
235
+ | {
236
+ kind: 'activated';
237
+ part: string;
238
+ }
239
+ /** Whether the part is in the document, for an overlay a key closes. */
240
+ | {
241
+ kind: 'present';
242
+ part: string;
243
+ value: boolean;
232
244
  };
233
245
  interface InteractionCase extends View {
234
246
  name: string;
235
247
  action: InteractionAction;
236
248
  expect: InteractionOutcome;
249
+ /** `a11y-keyboard` records a failure as a keyboard finding at `warn` and
250
+ * lets the test pass. Without it a failure is a `contract-interaction`
251
+ * error. */
252
+ rule?: 'a11y-keyboard';
237
253
  }
238
254
  interface InteractionExpectation {
239
255
  /** The part carrying the interactive role. */
@@ -291,6 +307,13 @@ interface SketchExpectation extends View {
291
307
  style: string;
292
308
  parts: SketchPartExpectation[];
293
309
  }
310
+ interface BoundaryExpectation {
311
+ part: string;
312
+ label: string;
313
+ /** A selector the part's element must also match to be measured, such as a
314
+ * state class a part shared across states carries in one of them. */
315
+ when?: string;
316
+ }
294
317
  interface ComponentContract {
295
318
  id: string;
296
319
  origin: 'system' | 'custom';
@@ -317,6 +340,11 @@ interface ComponentContract {
317
340
  persistence: PersistenceExpectation;
318
341
  theme: ThemeExpectation;
319
342
  interaction: InteractionExpectation | Inapplicable;
343
+ /** The parts whose border, outline or surface draws the control's visible
344
+ * edge or marks its selected state. The accessibility suite measures each
345
+ * against the backdrop behind it, at 3:1 under WCAG 2.2 SC 1.4.11. `label`
346
+ * names the part in a finding. */
347
+ boundaries?: BoundaryExpectation[];
320
348
  /** What the component does when it is driven, proven under happy-dom. */
321
349
  behavior: BehaviorExpectation | Inapplicable;
322
350
  sketch: SketchExpectation | Inapplicable;
@@ -1,12 +1,6 @@
1
- import {
2
- ContractViolation,
3
- isInapplicable,
4
- partLocator,
5
- requiresInteraction
6
- } from "./chunk-3UKGXCDL.js";
7
1
  import {
8
2
  createVitestConfig
9
- } from "./chunk-GKO27NGN.js";
3
+ } from "./chunk-R54I7YL6.js";
10
4
  import {
11
5
  COMPONENTS_PATH_ENV,
12
6
  COMPONENT_ENV,
@@ -17,13 +11,19 @@ import {
17
11
  defineTestingConfig,
18
12
  devServerCommand,
19
13
  resolveTestingConfig
20
- } from "./chunk-NB3NZRBM.js";
14
+ } from "./chunk-7CM5D7PF.js";
15
+ import {
16
+ ContractViolation,
17
+ isInapplicable,
18
+ partLocator,
19
+ requiresInteraction
20
+ } from "./chunk-YVVR3GJZ.js";
21
21
  import {
22
22
  CONTRACTS_MODULE_ENV,
23
23
  allContracts,
24
24
  selectedContracts,
25
25
  shippedContracts
26
- } from "./chunk-SHBYZUPD.js";
26
+ } from "./chunk-5HNZHIHG.js";
27
27
 
28
28
  // src/testing/playwright.ts
29
29
  import path2 from "path";