@motion-proto/live-tokens 0.89.1 → 0.89.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../testing/component-render.contract.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { expect, test, type Locator, type Page } from '@playwright/test';\nimport { openComponentsEditor } from './support/editor';\nimport { selectedContracts } from './contracts';\nimport { ContractHarness } from './support/contractHarness';\n\n// Each test boots its own editor and asserts only over its own component's\n// aliases, so the 25 component tests carry no shared state between them.\ntest.describe.configure({ mode: 'parallel' });\n\ninterface AliasCase {\n component: string;\n variable: string;\n}\n\nfunction discoverDefaultAliases(): AliasCase[] {\n const root = path.resolve(process.env.LIVE_TOKENS_DATA_DIR ?? 'src/live-tokens/data', 'component-configs');\n const cases: AliasCase[] = [];\n for (const directory of fs.readdirSync(root).sort()) {\n const file = path.join(root, directory, 'default.json');\n if (!fs.existsSync(file)) continue;\n const data = JSON.parse(fs.readFileSync(file, 'utf8')) as {\n component?: string;\n aliases?: Record<string, unknown>;\n };\n const component = data.component ?? directory;\n for (const variable of Object.keys(data.aliases ?? {}).sort()) {\n cases.push({ component, variable });\n }\n }\n return cases;\n}\n\nconst requestedComponent = process.env.LIVE_TOKENS_COMPONENT;\nconst aliasCases = discoverDefaultAliases()\n .filter(({ component }) => !requestedComponent || component === requestedComponent);\nconst aliasesByComponent = new Map<string, string[]>();\nfor (const { component, variable } of aliasCases) {\n const variables = aliasesByComponent.get(component) ?? [];\n variables.push(variable);\n aliasesByComponent.set(component, variables);\n}\n\ninterface ProbeResult {\n covered: string[];\n unchanged: string[];\n}\n\n/**\n * Exercise each standard token selector through the same click path a designer\n * uses. The rendered-property probe below deliberately writes root variables\n * directly so it can try arbitrary CSS values; this companion gate proves the\n * editor control itself reaches the store and the document root.\n */\nasync function exerciseVisibleTokenControls(\n page: Page,\n componentAliases: string[],\n exercised: Set<string>,\n): Promise<void> {\n const group = page.locator('.variant-group:visible');\n const settle = () => page.evaluate(() => new Promise<void>((resolve) =>\n requestAnimationFrame(() => requestAnimationFrame(() => resolve()))));\n await settle();\n // A disabled or locked selector (a hover surface stood down while the tint\n // is on) opens a dropdown with nothing to pick from.\n const variables = await group.locator('.ui-token-selector:visible[data-token-variable]:not(.disabled):not(.locked)')\n .evaluateAll((elements) => [...new Set(elements\n .map((element) => (element as HTMLElement).dataset.tokenVariable)\n .filter((value): value is string => !!value))]);\n\n for (const variable of variables) {\n if (!componentAliases.includes(variable) || exercised.has(variable)) continue;\n const selector = group.locator(`.ui-token-selector:visible[data-token-variable=\"${variable}\"]:not(.disabled):not(.locked)`).first();\n if (await selector.count() === 0) continue;\n const before = await page.evaluate((name) =>\n document.documentElement.style.getPropertyValue(name).trim(), variable);\n\n const optionSelector = [\n '.ui-ts-dropdown .static-chip:not(.active):not(:disabled)',\n '.ui-ts-dropdown .ui-option-item:not(.active):not(:disabled)',\n '.ui-ts-dropdown .font-size-row:not(.active):not(:disabled)',\n ].join(', ');\n let after = before;\n let foundOption = false;\n // Some semantic options can resolve to the same CSS as the current alias.\n // Try several distinct visible choices before treating the control as dead.\n for (let attempt = 0; attempt < 4 && after === before; attempt++) {\n await settle();\n await selector.locator('.ui-ts-trigger').click();\n const options = selector.locator(optionSelector);\n const count = await options.count();\n if (count === 0) {\n // Close an unsupported dropdown before the traversal moves on. The\n // final coverage assertion reports its precise variable.\n await selector.locator('.ui-ts-trigger').click();\n break;\n }\n foundOption = true;\n await options.nth(attempt % count).click();\n await settle();\n after = await page.evaluate((name) =>\n document.documentElement.style.getPropertyValue(name).trim(), variable);\n }\n if (!foundOption) continue;\n expect(after, `${variable} did not write through its editor control`).not.toBe(before);\n exercised.add(variable);\n }\n}\n\n/** Split padding exposes four side selectors and a merge action instead of a\n * selector for the fallback parent value. Merge each visible composite, then\n * exercise the newly rendered parent selector through the standard path. */\nasync function exerciseVisibleSplitPaddingControls(\n page: Page,\n componentAliases: string[],\n exercised: Set<string>,\n): Promise<void> {\n const group = page.locator('.variant-group:visible');\n const variables = await group.locator('.merge-btn:visible[data-padding-parent-variable]')\n .evaluateAll((elements) => [...new Set(elements\n .map((element) => (element as HTMLElement).dataset.paddingParentVariable)\n .filter((value): value is string => !!value))]);\n\n for (const variable of variables) {\n if (!componentAliases.includes(variable) || exercised.has(variable)) continue;\n const merge = group.locator(`.merge-btn:visible[data-padding-parent-variable=\"${variable}\"]`).first();\n if (await merge.count()) await merge.click();\n }\n if (variables.length > 0) {\n await page.evaluate(() => new Promise<void>((resolve) =>\n requestAnimationFrame(() => requestAnimationFrame(() => resolve()))));\n await exerciseVisibleTokenControls(page, componentAliases, exercised);\n }\n}\n\n/** A single semantic control may intentionally own several CSS variables.\n * Every listed variable must change before the component traversal can\n * advance. */\n/** Returns the gate inputs it toggled, so the caller can put each one back\n * after probing: a gate left on locks rows behind it (a hover surface stood\n * down behind a tint), and those rows still have to be exercised in the\n * views that follow. */\nasync function exerciseVisibleCompositeControls(\n page: Page,\n componentAliases: string[],\n exercised: Set<string>,\n): Promise<Locator[]> {\n const toggled: Locator[] = [];\n const group = page.locator('.variant-group:visible');\n const controls = group.locator('[data-token-variables]:visible');\n for (let index = 0; index < await controls.count(); index++) {\n const control = controls.nth(index);\n const variables = ((await control.getAttribute('data-token-variables')) ?? '')\n .split(/\\s+/)\n .filter((variable) => componentAliases.includes(variable) && !exercised.has(variable));\n if (variables.length === 0) continue;\n const before = await page.evaluate((names) => Object.fromEntries(names.map((name) => [name,\n document.documentElement.style.getPropertyValue(name).trim(),\n ])), variables);\n // A gate is a checkbox, a radio, or a Toggle, which is a `role=\"switch\"`.\n const input = control.locator('input[type=\"checkbox\"], input[type=\"radio\"], [role=\"switch\"]').first();\n if (await input.count() === 0) continue;\n await input.click();\n toggled.push(input);\n await page.evaluate(() => new Promise<void>((resolve) =>\n requestAnimationFrame(() => requestAnimationFrame(() => resolve()))));\n const after = await page.evaluate((names) => Object.fromEntries(names.map((name) => [name,\n document.documentElement.style.getPropertyValue(name).trim(),\n ])), variables);\n for (const variable of variables) {\n expect(after[variable], `${variable} did not write through its composite control`)\n .not.toBe(before[variable]);\n exercised.add(variable);\n }\n }\n return toggled;\n}\n\n/** Component-owned gradients use a composite editor instead of a token\n * selector. Pick a real stop colour through its nested palette control and\n * assert the owning component variable—not the scratch stop variable—writes. */\nasync function exerciseVisibleGradientControls(\n page: Page,\n componentAliases: string[],\n exercised: Set<string>,\n): Promise<void> {\n const group = page.locator('.variant-group:visible');\n const editors = group.locator('.gradient-editor:visible[data-token-variable]');\n for (let index = 0; index < await editors.count(); index++) {\n const editor = editors.nth(index);\n const variable = await editor.getAttribute('data-token-variable');\n if (!variable || !componentAliases.includes(variable) || exercised.has(variable)) continue;\n const before = await page.evaluate((name) =>\n document.documentElement.style.getPropertyValue(name).trim(), variable);\n\n // Promote an empty/flat background to Solid so its stop picker is present,\n // then select a non-active invariant colour through the real palette UI.\n const solid = editor.getByRole('radio', { name: 'Solid' });\n if (await solid.count() && !await solid.isChecked()) await solid.check({ force: true });\n const picker = editor.locator('.picker-slot .ui-token-selector').first();\n await picker.locator('.ui-ts-trigger').click({ force: true });\n const swatch = picker.locator('.static-chip:not(.active):not(:disabled)').first();\n if (await swatch.count() === 0) continue;\n await swatch.click({ force: true });\n\n await expect.poll(() => page.evaluate((name) =>\n document.documentElement.style.getPropertyValue(name).trim(), variable),\n { message: `${variable} did not write through its gradient editor` })\n .not.toMatch(new RegExp(`^${escapeRegExp(before)}$`));\n exercised.add(variable);\n }\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Exercise every property control visible for the current standardized\n * VariantGroup view. The preview and property panel are deliberately siblings:\n * only `.tabs-preview` is fingerprinted, so a selector repaint cannot satisfy\n * the runtime-component contract.\n */\nasync function probeCurrentView(\n page: Page,\n componentAliases: string[],\n forcedVariables: string[] = [],\n provenVariables: string[] = [],\n): Promise<ProbeResult> {\n return page.evaluate(async ({ allAliases, forced, proven }) => {\n const group = Array.from(document.querySelectorAll<HTMLElement>('.variant-group'))\n .find((element) => element.offsetParent !== null);\n const preview = group?.querySelector<HTMLElement>('.tabs-preview');\n if (!group || !preview) return { covered: [], unchanged: [] };\n\n const visibleVariables = new Set<string>();\n if (forced.length > 0) {\n for (const variable of forced) {\n if (allAliases.includes(variable)) visibleVariables.add(variable);\n }\n } else {\n for (const element of group.querySelectorAll<HTMLElement>('[data-token-variable]')) {\n const variable = element.dataset.tokenVariable;\n if (element.offsetParent !== null && variable && allAliases.includes(variable)) {\n visibleVariables.add(variable);\n }\n }\n for (const element of group.querySelectorAll<HTMLElement>('[data-token-variables]')) {\n if (element.offsetParent === null) continue;\n for (const variable of (element.dataset.tokenVariables ?? '').split(/\\s+/)) {\n if (allAliases.includes(variable)) visibleVariables.add(variable);\n }\n }\n }\n\n // Split padding's four override slots are intentionally hidden controls.\n // The standardized padding control owns them, so include their default-file\n // variables whenever their base padding row is visible.\n for (const variable of [...visibleVariables]) {\n if (!variable.endsWith('-padding')) continue;\n for (const side of ['top', 'right', 'bottom', 'left']) {\n const sideVariable = `${variable}-${side}`;\n if (allAliases.includes(sideVariable)) visibleVariables.add(sideVariable);\n }\n }\n\n // A property already observed repainting cannot become less reactive in a\n // later view, and it is already recorded as both seen and covered. Probing\n // it again in every remaining view is the traversal's dominant cost: a\n // component with 47 views pays for its whole alias set 47 times over.\n for (const variable of proven) visibleVariables.delete(variable);\n if (visibleVariables.size === 0) return { covered: [], unchanged: [] };\n const properties = [\n 'display', 'visibility', 'opacity', 'position', 'zIndex',\n 'color', 'background', 'backgroundColor', 'backgroundImage', 'backgroundSize', 'backgroundPosition',\n 'border', 'borderColor', 'borderWidth', 'borderStyle',\n 'borderTopColor', 'borderRightColor', 'borderBottomColor', 'borderLeftColor',\n 'borderTopWidth', 'borderRightWidth', 'borderBottomWidth', 'borderLeftWidth',\n 'borderRadius', 'borderTopLeftRadius', 'borderTopRightRadius',\n 'borderBottomRightRadius', 'borderBottomLeftRadius',\n 'outline', 'outlineColor', 'outlineWidth', 'boxShadow',\n 'filter', 'backdropFilter', 'mixBlendMode',\n 'fontFamily', 'fontSize', 'fontWeight', 'fontStyle', 'lineHeight', 'letterSpacing',\n 'textAlign', 'textDecoration', 'textTransform', 'textShadow', 'whiteSpace',\n 'padding', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft',\n 'margin', 'marginTop', 'marginRight', 'marginBottom', 'marginLeft',\n 'gap', 'rowGap', 'columnGap',\n 'width', 'minWidth', 'maxWidth', 'height', 'minHeight', 'maxHeight',\n 'top', 'right', 'bottom', 'left',\n 'transform', 'transformOrigin', 'translate', 'rotate', 'scale',\n 'justifyContent', 'justifyItems', 'justifySelf', 'alignContent', 'alignItems', 'alignSelf',\n 'gridTemplateColumns', 'gridTemplateRows', 'gridColumn', 'gridRow', 'flex', 'flexDirection',\n 'overflow', 'overflowX', 'overflowY', 'clipPath', 'objectFit', 'objectPosition',\n 'fill', 'stroke', 'strokeWidth', 'strokeDasharray', 'strokeDashoffset',\n 'cursor', 'pointerEvents', 'content',\n 'transitionProperty', 'transitionDuration', 'transitionTimingFunction', 'transitionDelay',\n 'scrollbarColor', 'scrollbarWidth',\n ] as const;\n\n const ignoredAttribute = /^(class|style|data-|aria-)/;\n const stableAttributes = (element: Element) => Array.from(element.attributes)\n .filter((attribute) => !ignoredAttribute.test(attribute.name))\n .map((attribute) => `${attribute.name}=${attribute.value}`)\n .sort()\n .join(';');\n\n const pseudoSelectorsFor = (variable: string) => {\n const pseudoSelectors = ['::before', '::after'];\n if (variable.includes('placeholder')) pseudoSelectors.push('::placeholder');\n if (variable.includes('scrollbar')) {\n pseudoSelectors.push(\n '::-webkit-scrollbar',\n '::-webkit-scrollbar-track',\n '::-webkit-scrollbar-thumb',\n );\n }\n return pseudoSelectors;\n };\n\n // Fixed overlays are portaled to body and are therefore outside the\n // preview subtree. Dialog roles let the harness include them without a\n // component-specific selector or fixture.\n const fingerprintNodes = () => {\n const roots = [preview, ...document.querySelectorAll<HTMLElement>('[role=\"dialog\"]')];\n return roots.flatMap((root) => [root, ...root.querySelectorAll<HTMLElement>('*')]);\n };\n\n const nodeFingerprint = (element: HTMLElement, index: number, pseudoSelectors: string[]) => {\n const style = getComputedStyle(element);\n const rect = element.getBoundingClientRect();\n const values = properties.map((property) => style[property]).join('|');\n const pseudoValues = pseudoSelectors.map((selector) => {\n const pseudo = getComputedStyle(element, selector);\n return properties.map((property) => pseudo[property]).join('|');\n }).join('~');\n return [\n index,\n element.tagName,\n values,\n pseudoValues,\n `${rect.x},${rect.y},${rect.width},${rect.height}`,\n `${element.scrollWidth},${element.scrollHeight}`,\n stableAttributes(element),\n ].join('~');\n };\n\n const fingerprint = (variable: string) => {\n const pseudoSelectors = pseudoSelectorsFor(variable);\n return fingerprintNodes().map((element, index) =>\n nodeFingerprint(element, index, pseudoSelectors));\n };\n\n /** Proving a repaint takes one difference, so stop at the node that moved\n * instead of reading every remaining node's computed style. Each node\n * costs 58 properties across the element and its pseudo-elements, and this\n * walk runs once per candidate value per alias, so it is the probe's\n * dominant cost. Only the negative case has to read everything. */\n const movedFrom = (variable: string, baseline: string[]) => {\n const pseudoSelectors = pseudoSelectorsFor(variable);\n const nodes = fingerprintNodes();\n if (nodes.length !== baseline.length) return true;\n for (let index = 0; index < nodes.length; index++) {\n if (nodeFingerprint(nodes[index], index, pseudoSelectors) !== baseline[index]) return true;\n }\n return false;\n };\n\n const alternateValues = (variable: string, current: string): string[] => {\n const values: string[] = [];\n const add = (...candidates: string[]) => {\n for (const candidate of candidates) {\n if (candidate !== current && !values.includes(candidate)) values.push(candidate);\n }\n };\n if (/(surface|color|text|border)(?!-width)|-icon$|outline-color/.test(variable)) {\n add('rgb(1, 2, 3)', 'rgb(253, 127, 3)');\n }\n if (variable.includes('font-family')) add('monospace', 'serif');\n if (variable.includes('font-weight')) add('900', '200');\n if (variable.includes('line-height')) add('2.75', '0.75');\n if (variable.includes('letter-spacing')) add('7px', '-2px');\n if (variable.includes('shadow')) add('rgb(1, 2, 3) 7px 9px 0 3px', 'none');\n if (variable.includes('blur')) add('blur(7px)', 'none');\n if (variable.includes('gradient')) {\n add('linear-gradient(90deg, rgb(1, 2, 3), rgb(253, 127, 3))', 'none');\n }\n if (variable.includes('duration') || variable.includes('transition')) add('9s', '0s');\n if (variable.includes('opacity')) add('0.17', '0.83');\n if (variable.includes('display')) add(current === 'none' ? 'block' : 'none', 'contents');\n if (variable.includes('align')) add('right', 'center', 'flex-end');\n if (variable.includes('position')) add('above-label', 'below-description', 'center');\n if (variable.includes('button-variant')) add('danger', 'outline');\n if (variable.includes('shimmer')) {\n add('linear-gradient(90deg, transparent, rgb(255 255 255 / 80%), transparent)', 'none');\n }\n if (/(padding|margin|radius|width|height|size|gap|offset|inset|thickness)/.test(variable)) {\n add('37px', '3px');\n }\n if (variable.includes('scale')) add('1.73', '0.53');\n add('__live_tokens_invalid_probe__', '37px', 'rgb(1, 2, 3)', 'none', '2');\n return values;\n };\n\n const root = document.documentElement;\n const covered: string[] = [];\n const unchanged: string[] = [];\n // Fast-forward in-flight transitions so the fingerprint samples end states.\n // Reading mid-interpolation makes consecutive samples differ on their own,\n // which reports a dead property as covered. Transition shorthands stay\n // untouched so the duration and easing aliases remain observable.\n const settle = async () => {\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));\n for (const animation of document.getAnimations()) animation.finish();\n };\n\n // Remove animation noise from the fingerprint. The contract concerns the\n // end-state projection, not interpolation frames.\n const freeze = document.createElement('style');\n freeze.dataset.reactivityProbe = 'true';\n freeze.textContent = '*,*::before,*::after{animation:none!important;caret-color:transparent!important}';\n document.head.appendChild(freeze);\n await document.fonts?.ready;\n await settle();\n\n for (const variable of visibleVariables) {\n // A split padding control edits its base plus all materialized sides as\n // one standardized transformation. Probe that same transformation so a\n // base fallback is not incorrectly reported dead merely because the\n // active theme already contains side overrides.\n const mutatedVariables = [variable];\n if (variable.endsWith('-padding')) {\n for (const side of ['top', 'right', 'bottom', 'left']) {\n const sideVariable = `${variable}-${side}`;\n if (allAliases.includes(sideVariable)) mutatedVariables.push(sideVariable);\n }\n }\n const previous = mutatedVariables.map((name) => ({\n name,\n value: root.style.getPropertyValue(name),\n priority: root.style.getPropertyPriority(name),\n }));\n const current = getComputedStyle(root).getPropertyValue(variable).trim();\n const baseline = fingerprint(variable);\n let changed = false;\n for (const candidate of alternateValues(variable, current)) {\n for (const name of mutatedVariables) root.style.setProperty(name, candidate, 'important');\n // CSS updates synchronously. One animation frame also gives the few\n // JavaScript-backed components (SVG/filter bridges) time to reconcile.\n await settle();\n if (movedFrom(variable, baseline)) {\n changed = true;\n break;\n }\n }\n for (const prior of previous) {\n if (prior.value) root.style.setProperty(prior.name, prior.value, prior.priority);\n else root.style.removeProperty(prior.name);\n }\n await settle();\n (changed ? covered : unchanged).push(variable);\n }\n\n freeze.remove();\n return { covered, unchanged };\n }, { allAliases: componentAliases, forced: forcedVariables, proven: provenVariables });\n}\n\n/** A forced click skips actionability but still lands at the tab's centre, so\n * chrome sitting over a tab hits the chrome and fails the run. */\nasync function selectTab(tab: Locator): Promise<void> {\n await tab.click({ force: true });\n}\n\nasync function selectComponent(page: Page, component: string): Promise<void> {\n await page.evaluate(async (id) => {\n const editor = window.__liveTokensEditor;\n if (!editor) throw new Error('window.__liveTokensEditor is not present on the components route');\n editor.selectComponent(id);\n await new Promise<void>((resolve) => requestAnimationFrame(() =>\n requestAnimationFrame(() => resolve())));\n }, component);\n await page.locator('.variant-group').filter({ visible: true }).waitFor();\n}\n\nfor (const [component, aliases] of aliasesByComponent) {\n test(`${component} repaints every property in its standardized runtime preview`, async ({ page }) => {\n test.setTimeout(600_000);\n await openComponentsEditor(page);\n const covered = new Set<string>();\n const seen = new Set<string>();\n const unchanged = new Set<string>();\n const controlExercised = new Set<string>();\n\n const probe = async (componentAliases: string[], forced: string[] = []) => {\n const remaining = forced.length > 0\n ? forced.filter((variable) => !covered.has(variable))\n : [];\n if (forced.length > 0 && remaining.length === 0) return;\n\n // Exercise standardized preview toggles (zoom, hover enablement, optional\n // content) when retrying a property that is dormant in the default mode.\n if (forced.length > 0) {\n const unchecked = page.locator(\n '.variant-group:visible .tabs-preview input[type=\"checkbox\"]:not(:checked):not(:disabled), '\n + '.variant-group:visible .properties-header input[type=\"checkbox\"]:not(:checked):not(:disabled)',\n );\n for (let index = 0; index < await unchecked.count(); index++) {\n await unchecked.nth(index).click({ force: true });\n }\n }\n\n // Portaled dialogs sit outside `.tabs-preview`; hover their first action\n // so hover-only chrome aliases are painted too. Role-based discovery keeps\n // this independent of any component name or DOM implementation class.\n const dialogAction = page.locator('[role=\"dialog\"] button:not(:disabled)').first();\n if (await dialogAction.count()) await dialogAction.hover({ force: true });\n\n await exerciseVisibleTokenControls(page, componentAliases, controlExercised);\n const gates = await exerciseVisibleCompositeControls(page, componentAliases, controlExercised);\n // A gate that just opened may have revealed a row (the tint colour).\n await exerciseVisibleTokenControls(page, componentAliases, controlExercised);\n await exerciseVisibleSplitPaddingControls(page, componentAliases, controlExercised);\n await exerciseVisibleGradientControls(page, componentAliases, controlExercised);\n const result = await probeCurrentView(page, componentAliases, remaining, [...covered]);\n for (const gate of gates) {\n if (await gate.count()) await gate.click();\n }\n result.covered.forEach((variable) => covered.add(variable));\n result.covered.forEach((variable) => seen.add(variable));\n result.unchanged.forEach((variable) => {\n seen.add(variable);\n if (!covered.has(variable)) unchanged.add(variable);\n });\n };\n\n const traverseComponent = async (\n componentId: string,\n componentAliases: string[],\n forced: string[] = [],\n ) => {\n await selectComponent(page, componentId);\n\n const visitViews = async () => {\n if (forced.length > 0 && forced.every((variable) => covered.has(variable))) return;\n const sizeSelect = page.locator('.variant-group:visible .preview-actions select').first();\n const sizeValues = await sizeSelect.count()\n ? await sizeSelect.locator('option').evaluateAll((options) =>\n options.map((option) => (option as HTMLOptionElement).value))\n : [''];\n\n for (const sizeValue of sizeValues) {\n const currentSizeSelect = page.locator('.variant-group:visible .preview-actions select').first();\n if (sizeValue && await currentSizeSelect.count()) await currentSizeSelect.selectOption(sizeValue);\n\n const variantTabs = page.locator('.variant-group:visible .variant-tabs .variant-tab-btn');\n const variantLabels = await variantTabs.count()\n ? await variantTabs.allTextContents()\n : [''];\n\n for (let variantIndex = 0; variantIndex < variantLabels.length; variantIndex++) {\n if (variantLabels[variantIndex]) {\n await selectTab(page.locator('.variant-group:visible .variant-tabs .variant-tab-btn')\n .nth(variantIndex));\n }\n\n await probe(componentAliases, forced);\n const primaryTabs = page.locator(\n '.variant-group:visible .tabs-states-block > .tabs-selectors:first-of-type .state-tab-btn',\n );\n const primaryLabels = await primaryTabs.allTextContents();\n for (let primaryIndex = 0; primaryIndex < primaryLabels.length; primaryIndex++) {\n await selectTab(page.locator(\n '.variant-group:visible .tabs-states-block > .tabs-selectors:first-of-type .state-tab-btn',\n ).nth(primaryIndex));\n await probe(componentAliases, forced);\n\n const secondaryTabs = page.locator(\n '.variant-group:visible .tabs-states-block > .tabs-selectors.substrip .state-tab-btn',\n );\n const secondaryLabels = await secondaryTabs.allTextContents();\n for (let secondaryIndex = 0; secondaryIndex < secondaryLabels.length; secondaryIndex++) {\n await selectTab(page.locator(\n '.variant-group:visible .tabs-states-block > .tabs-selectors.substrip .state-tab-btn',\n ).nth(secondaryIndex));\n await probe(componentAliases, forced);\n }\n }\n }\n }\n };\n\n await visitViews();\n if (forced.length === 0 || forced.every((variable) => covered.has(variable))) return;\n\n // Open any dialog-capable preview and repeat the same registry traversal.\n const dialogTrigger = page.locator(\n '.variant-group:visible .tabs-preview [aria-haspopup=\"dialog\"][aria-expanded=\"false\"]',\n ).first();\n if (await dialogTrigger.count()) {\n await dialogTrigger.click({ force: true });\n await page.locator('[role=\"dialog\"]').waitFor();\n await visitViews();\n }\n\n // Exercise every option of standardized canvas selects. This covers modes\n // such as Input type and optional Notification actions without any\n // per-component fixture or test case.\n const canvasSelects = page.locator('.variant-group:visible .tabs-preview .canvas-toolbar select');\n for (let selectIndex = 0; selectIndex < await canvasSelects.count(); selectIndex++) {\n const values = await canvasSelects.nth(selectIndex).locator('option').evaluateAll((options) =>\n options.map((option) => (option as HTMLOptionElement).value));\n for (const value of values) {\n if (forced.every((variable) => covered.has(variable))) return;\n await canvasSelects.nth(selectIndex).selectOption(value);\n await visitViews();\n }\n }\n\n // Expanded/collapsed previews expose motion aliases whose computed style\n // is different in each direction.\n const expanders = page.locator(\n '.variant-group:visible .tabs-preview [aria-expanded]:not([aria-haspopup=\"dialog\"])',\n );\n for (let index = 0; index < await expanders.count(); index++) {\n if (forced.every((variable) => covered.has(variable))) return;\n await expanders.nth(index).click({ force: true });\n await visitViews();\n }\n\n // A default-off hover gate only paints while the runtime element itself\n // matches :hover. Forced preview classes intentionally bypass that gate,\n // so retry unresolved properties while hovering each visible preview node.\n // This stays component-agnostic and runs only for the small unresolved set.\n // The traversal above leaves a forced state selected, and its preview\n // class outranks the gated `:hover` rule, so return to the first state.\n const firstStateTab = page.locator(\n '.variant-group:visible .tabs-states-block > .tabs-selectors:first-of-type .state-tab-btn',\n ).first();\n if (await firstStateTab.count()) await selectTab(firstStateTab);\n const hoverTargets = page.locator('.variant-group:visible .tabs-preview *:visible');\n for (let index = 0; index < await hoverTargets.count(); index++) {\n if (forced.every((variable) => covered.has(variable))) return;\n // The node list was read once; a probe above may have re-rendered it.\n try {\n await hoverTargets.nth(index).hover({ force: true, timeout: 2_000 });\n } catch {\n continue;\n }\n await probe(componentAliases, forced);\n }\n };\n\n await traverseComponent(component, aliases);\n\n // Retry every property not yet observed repainting. Composite controls,\n // pseudo-elements, optional content, interaction modes and portaled dialogs\n // are all discovered from standard DOM semantics; there is no component\n // exception table.\n const unresolved = aliases.filter((variable) => !covered.has(variable));\n if (unresolved.length > 0) await traverseComponent(component, aliases, unresolved);\n\n const notExposed = aliases.filter((variable) => !seen.has(variable));\n const notReactive = aliases.filter((variable) => seen.has(variable) && !covered.has(variable));\n const notControlExercised = aliases.filter((variable) => !controlExercised.has(variable));\n\n expect(notExposed, `Properties not exposed by a standardized component view:\\n${notExposed.join('\\n')}`)\n .toEqual([]);\n expect(notReactive, `Properties whose rendered preview did not change:\\n${notReactive.join('\\n')}`)\n .toEqual([]);\n expect(notControlExercised, `Properties not exercised through a rendered editor control:\\n${notControlExercised.join('\\n')}`)\n .toEqual([]);\n expect(covered.size).toBe(aliases.length);\n });\n}\n\ntest('component discovery covers every alias exactly once', () => {\n const perComponent = [...aliasesByComponent.values()].reduce((sum, a) => sum + a.length, 0);\n expect(aliasCases.length).toBeGreaterThan(0);\n expect(perComponent).toBe(aliasCases.length);\n});\n\n// Obligation 6. The traversal above proves every property repaints something in\n// the preview; these pin the mapping, so a repaint elsewhere cannot stand in for\n// the part and CSS property the property is meant to drive.\nfor (const contract of await selectedContracts()) {\n test(`${contract.id} paints each declared property on its declared part`, async ({ page }) => {\n test.setTimeout(180_000);\n const harness = await ContractHarness.open(page, contract);\n expect(await harness.assertProperties()).toBeGreaterThan(0);\n });\n}\n"],"mappings":"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","names":["root"]}
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"]}
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-3UKGXCDL.js";
7
7
  import {
8
8
  createVitestConfig
9
- } from "./chunk-YFNMYU54.js";
9
+ } from "./chunk-GKO27NGN.js";
10
10
  import {
11
11
  COMPONENTS_PATH_ENV,
12
12
  COMPONENT_ENV,
@@ -23,7 +23,7 @@ import {
23
23
  allContracts,
24
24
  selectedContracts,
25
25
  shippedContracts
26
- } from "./chunk-7VSUGI2C.js";
26
+ } from "./chunk-SHBYZUPD.js";
27
27
 
28
28
  // src/testing/playwright.ts
29
29
  import path2 from "path";
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-NB3NZRBM.js";
9
9
  import {
10
10
  allContracts
11
- } from "./chunk-7VSUGI2C.js";
11
+ } from "./chunk-SHBYZUPD.js";
12
12
 
13
13
  // src/testing/page-compliance.contract.ts
14
14
  import { test } from "@playwright/test";
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createVitestConfig
3
- } from "./chunk-YFNMYU54.js";
3
+ } from "./chunk-GKO27NGN.js";
4
4
  import {
5
5
  defineTestingConfig,
6
6
  resolveTestingConfig
7
7
  } from "./chunk-NB3NZRBM.js";
8
- import "./chunk-7VSUGI2C.js";
8
+ import "./chunk-SHBYZUPD.js";
9
9
  export {
10
10
  createVitestConfig,
11
11
  defineTestingConfig,