diff --git a/.github/workflows/storybook.yml b/.github/workflows/storybook.yml index c1c8d043..63740127 100644 --- a/.github/workflows/storybook.yml +++ b/.github/workflows/storybook.yml @@ -15,8 +15,8 @@ env: TURBO_TELEMETRY_DISABLED: '1' jobs: - visual-tests: - name: visual-tests + component-tests: + name: component-tests runs-on: ubuntu-latest permissions: contents: read @@ -44,22 +44,16 @@ jobs: - name: Build package run: corepack pnpm build:packages - - name: Run Storybook visual tests - run: corepack pnpm --filter @luke-ui/react test - - - name: Upload visual diffs on failure - if: failure() - uses: actions/upload-artifact@v4 - with: - name: visual-diffs - path: packages/@luke-ui/react/**/__screenshots__/** - if-no-files-found: ignore - retention-days: 7 + - name: Run component tests + run: + corepack pnpm --filter @luke-ui/react run test:unit && corepack pnpm --filter + @luke-ui/react run test:browser && corepack pnpm --filter @luke-ui/react run + test:storybook deploy-pages: name: deploy-pages if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main' - needs: visual-tests + needs: component-tests runs-on: ubuntu-latest permissions: contents: read diff --git a/.github/workflows/update-visual-baselines.yml b/.github/workflows/update-visual-baselines.yml deleted file mode 100644 index db9b9663..00000000 --- a/.github/workflows/update-visual-baselines.yml +++ /dev/null @@ -1,62 +0,0 @@ -name: Update Visual Baselines - -on: - workflow_dispatch: - -concurrency: - group: ci-${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: false - -env: - TURBO_TELEMETRY_DISABLED: '1' - -jobs: - update-baselines: - name: update-baselines - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - name: Checkout repo - uses: actions/checkout@v6 - with: - ref: ${{ github.ref_name }} - fetch-depth: 0 - - - name: Setup tooling with mise - uses: jdx/mise-action@v4 - with: - install: true - cache: true - - - name: Enable Corepack - run: corepack enable - - - name: Install dependencies - run: corepack pnpm install --frozen-lockfile - - - name: Install Playwright Chromium - run: corepack pnpm --filter @luke-ui/react exec playwright install --with-deps chromium - - - name: Build package - run: corepack pnpm build:packages - - - name: Update visual baselines - run: corepack pnpm --filter @luke-ui/react exec vp test run --project=visual --update - - - name: Commit push updated baselines - run: | - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add "packages/@luke-ui/react/**/__screenshots__/**/*-linux.png" - if git diff --staged --quiet; then - echo "No baseline changes to commit." - else - git commit -m "Update visual regression baselines" - git push - # Pushes made by GITHUB_TOKEN do not re-trigger other - # workflows, so open PR's checks will not re-run automatically. - # Re-run failed checks on the PR (or push any commit) to pick up - # the new baselines. - echo "::notice::Baselines updated. Re-run PR checks to validate them." - fi diff --git a/.github/workflows/visual-regression.yml b/.github/workflows/visual-regression.yml new file mode 100644 index 00000000..dbc42fa9 --- /dev/null +++ b/.github/workflows/visual-regression.yml @@ -0,0 +1,63 @@ +name: Visual regression + +on: + pull_request: + paths: + - 'packages/@luke-ui/react/**' + - 'packages/@luke-ui/rainbow-sprinkles/**' + - 'pnpm-lock.yaml' + - 'pnpm-workspace.yaml' + - 'mise.toml' + - '.github/workflows/visual-regression.yml' + workflow_dispatch: + +concurrency: + group: visual-${{ github.ref }} + cancel-in-progress: true + +jobs: + compare: + runs-on: ubuntu-latest + permissions: + contents: read + outputs: + changed: ${{ steps.summary.outputs.changed }} + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + - uses: jdx/mise-action@v4 + with: + install: true + cache: true + - run: corepack enable + - run: corepack pnpm install --frozen-lockfile + - run: corepack pnpm --filter @luke-ui/react exec playwright install --with-deps chromium + - uses: actions/cache@v5 + with: + path: .artifacts/visual-regression/cache + key: + visual-main-${{ runner.os }}-${{ runner.arch }}-${{ github.event.pull_request.base.sha + || github.event.before }}-${{ hashFiles('pnpm-lock.yaml', + 'packages/@luke-ui/react/vitest.config.ts') }} + - name: Compare visual captures + run: corepack pnpm test:visual + env: + VISUAL_BASE_SHA: ${{ github.event.pull_request.base.sha || github.event.before }} + - id: summary + run: + echo "changed=$(jq '.counts.changed' .artifacts/visual-regression/report/summary.json)" >> + "$GITHUB_OUTPUT" + - uses: actions/upload-artifact@v4 + with: + name: visual-regression-report + path: .artifacts/visual-regression/report + retention-days: 14 + + review: + if: needs.compare.outputs.changed != '0' + needs: compare + runs-on: ubuntu-latest + environment: visual-review + steps: + - run: echo 'Visual changes approved for this commit.' diff --git a/.gitignore b/.gitignore index 52f0ad87..d23529f6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,10 @@ .tanstack/ .turbo/ .vitest-attachments/ +.artifacts/ +.visual-captures/ *.local *.log -**/__screenshots__/** apps/docs/.story/ apps/docs/src/generated/ apps/docs/src/routeTree.gen.ts @@ -22,7 +23,3 @@ packages/@luke-ui/react/src/generated/icons.tsx public/dist/ server/dist/ storybook-static/ - -!**/__screenshots__/ -!**/__screenshots__/**/ -!**/__screenshots__/**/*-linux.png diff --git a/docs/TESTING.md b/docs/TESTING.md index 0dc2e0c0..5329b566 100644 --- a/docs/TESTING.md +++ b/docs/TESTING.md @@ -113,29 +113,26 @@ play: async ({ canvasElement, step }) => { ## Visual regression tests -Visual tests capture a screenshot of a rendered component and compare it against a committed -baseline image. They catch unintended visual changes (spacing, colour, focus rings, open menus) that -behaviour assertions miss. They run in the `visual` Vitest project via `pnpm run test:visual`. +Visual tests capture a rendered component in the current checkout and compare it with the local +`origin/main` ref captured on the same device. They catch unintended visual changes (spacing, +colour, focus rings, open menus) that behaviour assertions miss. They run via `pnpm run test:visual` +and as part of the aggregate `pnpm test` development flow. Place them in `*.visual.test.tsx` beside the component. Render with the shared `renderVisual` helper, which wraps the subtree in the theme root and icon spritesheet provider and returns a locator: ```tsx -import { afterEach, expect, test } from 'vite-plus/test'; +import { test } from 'vite-plus/test'; import { page, userEvent } from 'vite-plus/test/context'; -import { cleanupVisual, renderVisual } from '../test-utils/render-visual.js'; +import { captureVisual, renderVisual } from '../test-utils/render-visual.js'; import { Button } from './index.js'; -afterEach(() => { - cleanupVisual(); -}); - test('keyboard focus ring', async () => { const locator = renderVisual(); // Tab so the browser applies `:focus-visible`; a programmatic `.focus()` would not. await userEvent.tab(); - await expect.element(locator).toMatchScreenshot('button-focus-visible'); + await captureVisual(locator, 'button/focus-visible'); }); ``` @@ -146,12 +143,15 @@ test('keyboard focus ring', async () => { rather than the container. - **Frame tightly.** Render a small kitchen-sink grid of the states under test, not a whole page, so a diff points at the component that changed. -- **Baselines are committed per OS.** Only Linux baselines (`*-chromium-linux.png`, generated in CI) - are tracked in git; screenshots you generate locally on macOS are gitignored. Regenerate baselines - through the **Update Visual Baselines** GitHub Actions workflow, then review the changed PNGs in - the pull request diff before merging. Do not commit local baselines. -- **The first run of a new test "fails".** Creating a missing baseline is reported as a failure by - design; run it again (or regenerate in CI) and it passes against the new reference. +- **Use explicit, globally unique IDs.** Namespace every capture by component, for example + `button/focus-visible`. Duplicate IDs fail before capture. Moving a test file does not change its + identity. +- **Added and removed captures are informational.** Matching IDs with pixel differences require CI + review; inventory changes are still visible in the report but do not block. +- **Keep responsive coverage explicit.** The default viewport is 1024 by 800. Change the viewport in + a test only when the component has a responsive state worth capturing, then restore it. + +The full workflow and report are documented in [`VISUAL_TESTING.md`](./VISUAL_TESTING.md). ## Style-contract tests for CSS recipes diff --git a/docs/VISUAL_TESTING.md b/docs/VISUAL_TESTING.md index 8795d1b4..5a50255b 100644 --- a/docs/VISUAL_TESTING.md +++ b/docs/VISUAL_TESTING.md @@ -1,80 +1,51 @@ # Visual regression testing -Visual regression tests render a component in a real browser (Chromium via Playwright), screenshot -it, and compare it against a committed baseline image. They replace the previous Argos setup with a -self-hosted approach built on Vitest's native `toMatchScreenshot` matcher — no external service, no -account, no upload quota. +Visual tests compare the current checkout with the latest `origin/main` on the same machine and in +the same Chromium installation. The repository does not store screenshots, baseline manifests, or +Git LFS objects. -For how to write a visual test, see [`TESTING.md`](./TESTING.md#visual-regression-tests). This -document covers the CI and baseline-management plumbing. +## Run the comparison -## How it works +```sh +pnpm run test:visual +``` -- Tests live in `packages/@luke-ui/react/src/**/*.visual.test.tsx` and run in the `visual` Vitest - project (`packages/@luke-ui/react/vitest.config.ts`). -- `pnpm --filter @luke-ui/react run test:visual` runs them; the aggregate `test` script includes it, - so CI runs visual tests alongside unit, browser, and Storybook tests. -- Baselines are committed to git as `__screenshots__//-chromium-.png`. -- Screenshot filenames encode the OS, so macOS (`darwin`) and CI (`linux`) baselines never collide. +The command captures the local `origin/main` ref in a disposable Git worktree, then captures the +current working tree, including uncommitted changes. Fetch before running when you need the latest +remote commit. Set `VISUAL_BASE_REF` to use another local ref, such as `upstream/main` in a fork. +The command compares matching capture IDs and writes a self-contained report to +`.artifacts/visual-regression/report/index.html`. -## Baselines are Linux-only +The first run installs and builds the comparison worktree. Later runs reuse its ignored cache while +the base SHA, platform, architecture, browser, lockfile, and visual configuration remain unchanged. +Delete `.artifacts/visual-regression` at any time to start clean. -Font and GPU rendering differ across operating systems, so a macOS baseline would spuriously fail on -CI's Linux runners. To keep one source of truth, **only `*-chromium-linux.png` baselines are tracked -in git** (see the `__screenshots__` rules in `.gitignore`). Screenshots you generate locally on -macOS are ignored — run visual tests locally for a fast sanity check, but treat CI as authoritative. +Local pixel differences are advisory: the command reports them but succeeds so intentional visual +work does not make the development loop permanently red. Capture failures, duplicate IDs, and other +infrastructure errors still fail. -## Updating baselines +## Read the report -When you intentionally change a component's appearance, regenerate the Linux baselines through CI: +The report classifies captures as unchanged, changed, added, or removed. Added and removed captures +are informational. A changed result means matching IDs differ by more than 0.1% of their pixels. Use +the filters, overlay slider, and main, current, and diff images to review each result. Run +`pnpm --filter @luke-ui/react run test:visual:report` to open the latest local report. -1. Push your branch. -2. Run the **Update Visual Baselines** workflow (`.github/workflows/update-visual-baselines.yml`) - from the Actions tab, selecting your branch. It runs `test:visual -u` on Linux and commits the - updated `*-linux.png` files back to your branch. -3. Re-run the pull request's checks so they validate against the new baselines (the workflow's push - uses `GITHUB_TOKEN`, which does not re-trigger them automatically). -4. Review the changed PNGs in the pull request's file diff. GitHub renders image diffs (2-up, swipe, - onion skin) so you can confirm the change is intentional before merging. +## CI review -## Coverage +Pull requests that can affect rendered components run the same comparison on Linux. CI uploads the +report as the `visual-regression-report` artifact. Added and removed captures do not require +approval. Before enabling this workflow, a repository administrator must create the `visual-review` +environment in GitHub settings and add a required reviewer. Self-review may remain enabled. Without +that protection rule, GitHub runs the review job immediately and visual approval is not enforced. +Once configured, matched visual changes pause the review job and tie approval to that workflow run +and commit. -Every public atom and composed component should have a `*.visual.test.tsx` beside it, covering its -meaningful states — at minimum its default rendering, size or tone variants, and any interactive -state that changes appearance (focus, open, pressed, invalid). +## Why screenshots are not committed -The source tree is the coverage record: a component is covered when a `.visual.test.tsx` -sits next to it, and that file's `test(...)` names say which states. To find gaps, compare the -public component exports against the existing `*.visual.test.tsx` files. Don't keep a coverage list -here — it would duplicate the file tree and fall out of date. +Rendering both revisions on the same device avoids platform-specific baselines and the usual +macOS-to-Linux update loop. It also keeps forks simple and avoids binary repository growth. The +tradeoff is that each comparison renders two revisions; the disposable base cache limits repeated +work. -## Reviewing failures - -When a visual test fails in CI, the `visual-tests` job uploads the actual and diff images as a -`visual-diffs` workflow artifact (see `.github/workflows/storybook.yml`). Download it from the run -summary to see what changed. - -## One-time bootstrap - -`workflow_dispatch` workflows are only available once the workflow file exists on the default -branch. Split the rollout across two pull requests so `main` never goes red: - -1. **PR 1 — workflows and docs only.** Merge `.github/workflows/update-visual-baselines.yml`, the - `visual-diffs` upload step in `storybook.yml`, the `.gitignore` rules, and these docs. Do **not** - include the `visual` Vitest project, the `test:visual` wiring in `package.json`, or any - `*.visual.test.tsx` files — otherwise `test:visual` runs with zero matching files and fails with - "no test files found". After this merges, the **Update Visual Baselines** workflow is available - on `main` and CI is still green. -2. **PR 2 — config, tests, and baselines.** Add the `visual` project config, the `test:visual` - wiring, the shared helper, and the `*.visual.test.tsx` files on a branch and push. Its first CI - run fails (no baselines yet) — but only on the PR, never on `main`. Run **Update Visual - Baselines** against the PR branch to generate and commit the Linux baselines, then re-run the - PR's checks (see the note below). With baselines committed, the PR goes green and merges cleanly. - -> **Note:** commits the workflow pushes use the default `GITHUB_TOKEN`, which does not re-trigger -> other workflows. After baselines are pushed to a branch, re-run the PR's checks (or push any -> commit) so they validate against the new baselines. - -(If you would rather ship everything in one PR, the only cost is a single red CI run on `main` after -merge, which the next **Update Visual Baselines** run clears.) After the bootstrap, `main` stays -green and baselines only change when you deliberately update them. +See [`TESTING.md`](./TESTING.md#visual-regression-tests) for how to write a visual test. diff --git a/knip.config.ts b/knip.config.ts index f30ded24..699dc1d6 100644 --- a/knip.config.ts +++ b/knip.config.ts @@ -1,6 +1,7 @@ import type { KnipConfig } from 'knip'; export default { + ignoreBinaries: ['open', 'xdg-open'], ignoreDependencies: ['eslint-plugin-react-hooks'], workspaces: { 'apps/docs': { diff --git a/packages/@luke-ui/react/package.json b/packages/@luke-ui/react/package.json index 36f84ab4..5315a594 100644 --- a/packages/@luke-ui/react/package.json +++ b/packages/@luke-ui/react/package.json @@ -69,7 +69,9 @@ "test:storybook": "vp test run --project=storybook", "test:ui": "vp test --project=storybook --ui", "test:unit": "vp test run --project=unit", - "test:visual": "vp test run --project=visual", + "test:visual": "tsx scripts/visual-regression.ts", + "test:visual:capture": "vp test run --project=visual --update", + "test:visual:report": "tsx scripts/open-visual-report.ts", "test:watch": "vp test --project=storybook" }, "dependencies": { @@ -89,6 +91,7 @@ "@storybook/addon-vitest": "catalog:", "@storybook/react-vite": "catalog:", "@types/node": "catalog:", + "@types/pngjs": "catalog:", "@types/react": "catalog:", "@types/react-dom": "catalog:", "@vanilla-extract/rollup-plugin": "catalog:", @@ -100,7 +103,9 @@ "babel-plugin-react-compiler": "catalog:", "colorjs.io": "catalog:", "node-html-parser": "catalog:", + "pixelmatch": "catalog:", "playwright": "catalog:", + "pngjs": "catalog:", "publint": "catalog:", "react": "catalog:", "react-dom": "catalog:", diff --git a/packages/@luke-ui/react/scripts/open-visual-report.ts b/packages/@luke-ui/react/scripts/open-visual-report.ts new file mode 100644 index 00000000..1bade8a5 --- /dev/null +++ b/packages/@luke-ui/react/scripts/open-visual-report.ts @@ -0,0 +1,14 @@ +import { execFileSync } from 'node:child_process'; +import { platform } from 'node:os'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { access } from 'node:fs/promises'; + +const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const report = path.resolve(packageRoot, '../../../.artifacts/visual-regression/report/index.html'); +await access(report); + +if (platform() === 'darwin') execFileSync('open', [report], { stdio: 'inherit' }); +else if (platform() === 'win32') + execFileSync('cmd', ['/c', 'start', '', report], { stdio: 'inherit' }); +else execFileSync('xdg-open', [report], { stdio: 'inherit' }); diff --git a/packages/@luke-ui/react/scripts/visual-regression-lib.test.ts b/packages/@luke-ui/react/scripts/visual-regression-lib.test.ts new file mode 100644 index 00000000..f51fbece --- /dev/null +++ b/packages/@luke-ui/react/scripts/visual-regression-lib.test.ts @@ -0,0 +1,56 @@ +import { tmpdir } from 'node:os'; +import path from 'node:path'; +import { mkdir, mkdtemp, readFile, writeFile } from 'node:fs/promises'; +import { PNG } from 'pngjs'; +import { expect, test } from 'vite-plus/test'; +import { compareCaptures, renderReport, validateCaptureIds } from './visual-regression-lib.js'; + +const png = (red: number) => { + const image = new PNG({ height: 1, width: 1 }); + image.data.set([red, 0, 0, 255]); + return PNG.sync.write(image); +}; + +test('classifies matched, changed, added, and removed captures', async () => { + const root = await mkdtemp(path.join(tmpdir(), 'visual-regression-')); + const base = path.join(root, 'base'); + const current = path.join(root, 'current'); + await Promise.all([base, current].map((directory) => mkdir(directory))); + await Promise.all([ + writeFile(path.join(base, 'same.png'), png(0)), + writeFile(path.join(current, 'same.png'), png(0)), + writeFile(path.join(base, 'changed.png'), png(0)), + writeFile(path.join(current, 'changed.png'), png(255)), + writeFile(path.join(base, 'removed.png'), png(0)), + writeFile(path.join(current, 'added.png'), png(0)), + ]); + const results = await compareCaptures(base, current, path.join(root, 'diff')); + expect(Object.fromEntries(results.map(({ id, status }) => [id, status]))).toEqual({ + added: 'added', + changed: 'changed', + removed: 'removed', + same: 'unchanged', + }); + const report = path.join(root, 'report.html'); + await renderReport(results, { base: 'abc', current: 'working tree', platform: 'test' }, report); + expect(await readFile(report, 'utf8')).toContain('Visual regression report'); +}); + +test('rejects duplicate explicit capture IDs', async () => { + const root = await mkdtemp(path.join(tmpdir(), 'visual-ids-')); + await writeFile(path.join(root, 'one.visual.test.tsx'), "captureVisual(scene, 'button/default')"); + await writeFile(path.join(root, 'two.visual.test.tsx'), "captureVisual(scene, 'button/default')"); + await expect(validateCaptureIds(root)).rejects.toThrow( + 'Duplicate visual capture ID button/default', + ); +}); + +test('accepts multiline calls with trailing commas', async () => { + const root = await mkdtemp(path.join(tmpdir(), 'visual-ids-')); + await writeFile( + path.join(root, 'one.visual.test.tsx'), + "captureVisual(\n\tpage.elementLocator(document.body),\n\t'button/multiline',\n)", + ); + const owners = await validateCaptureIds(root); + expect([...owners.keys()]).toEqual(['button/multiline']); +}); diff --git a/packages/@luke-ui/react/scripts/visual-regression-lib.ts b/packages/@luke-ui/react/scripts/visual-regression-lib.ts new file mode 100644 index 00000000..ac50f974 --- /dev/null +++ b/packages/@luke-ui/react/scripts/visual-regression-lib.ts @@ -0,0 +1,229 @@ +import path from 'node:path'; +import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises'; +import pixelmatch from 'pixelmatch'; +import { PNG } from 'pngjs'; + +export type VisualResult = { + id: string; + status: 'added' | 'changed' | 'removed' | 'unchanged'; + base?: string; + current?: string; + diff?: string; + mismatchedPixels?: number; + mismatchRatio?: number; + height?: number; + width?: number; + baseViewport?: string; + currentViewport?: string; +}; + +type CaptureFile = { file: string; viewport?: string }; + +export async function validateCaptureIds(sourceRoot: string) { + const owners = new Map(); + async function visit(directory: string) { + await Promise.all( + (await readdir(directory, { withFileTypes: true })).map(async (entry) => { + const file = path.join(directory, entry.name); + if (entry.isDirectory()) await visit(file); + else if (entry.name.endsWith('.visual.test.tsx')) { + const source = await readFile(file, 'utf8'); + const calls = [...source.matchAll(/captureVisual\(/g)]; + const matches = [...source.matchAll(/captureVisual\([\s\S]*?,\s*'([^']+)'\s*,?\s*\)/g)]; + if (calls.length !== matches.length) { + throw new Error(`Visual capture IDs must be string literals: ${file}`); + } + for (const match of matches) { + const id = match[1]; + if (!id || !/^[a-z0-9-]+\/[a-z0-9]+(?:-[a-z0-9]+)*$/.test(id)) { + throw new Error(`Visual capture ID must be namespaced: ${id}`); + } + const owner = owners.get(id); + if (owner) throw new Error(`Duplicate visual capture ID ${id}: ${owner} and ${file}`); + owners.set(id, file); + } + } + }), + ); + } + await visit(sourceRoot); + return owners; +} + +async function listPngs(root: string) { + const result = new Map(); + async function visit(directory: string) { + await Promise.all( + (await readdir(directory, { withFileTypes: true }).catch(() => [])).map(async (entry) => { + const file = path.join(directory, entry.name); + if (entry.isDirectory()) await visit(file); + else if (entry.name.endsWith('.png')) { + const captureName = path + .relative(root, file) + .replace(/\.png$/, '') + .split(path.sep) + .join('/'); + const metadata = captureName.match(/^(.*)__viewport-(\d+x\d+)$/); + const id = metadata?.[1] ?? captureName; + if (result.has(id)) throw new Error(`Duplicate visual capture ID: ${id}`); + result.set(id, { file, viewport: metadata?.[2] }); + } + }), + ); + } + await visit(root); + return result; +} + +export async function compareCaptures(baseDir: string, currentDir: string, diffDir: string) { + const [base, current] = await Promise.all([listPngs(baseDir), listPngs(currentDir)]); + const ids = [...new Set([...base.keys(), ...current.keys()])].sort(); + await mkdir(diffDir, { recursive: true }); + const results = await Promise.all( + ids.map(async (id): Promise => { + const baseCapture = base.get(id); + const currentCapture = current.get(id); + if (!baseCapture) { + return { + current: currentCapture?.file, + currentViewport: currentCapture?.viewport, + id, + status: 'added', + }; + } + if (!currentCapture) { + return { + base: baseCapture.file, + baseViewport: baseCapture.viewport, + id, + status: 'removed', + }; + } + + const [basePng, currentPng] = await Promise.all([ + readFile(baseCapture.file).then((data) => PNG.sync.read(data)), + readFile(currentCapture.file).then((data) => PNG.sync.read(data)), + ]); + const width = Math.max(basePng.width, currentPng.width); + const height = Math.max(basePng.height, currentPng.height); + const diffPng = new PNG({ height, width }); + let mismatchedPixels: number; + if (basePng.width !== currentPng.width || basePng.height !== currentPng.height) { + mismatchedPixels = width * height; + for (let index = 0; index < diffPng.data.length; index += 4) { + diffPng.data.set([255, 0, 0, 255], index); + } + } else { + mismatchedPixels = pixelmatch(basePng.data, currentPng.data, diffPng.data, width, height, { + threshold: 0.2, + }); + } + const mismatchRatio = mismatchedPixels / (width * height); + const hasViewportChange = baseCapture.viewport !== currentCapture.viewport; + const status = mismatchRatio > 0.001 || hasViewportChange ? 'changed' : 'unchanged'; + let diff: string | undefined; + if (status === 'changed') { + diff = path.join(diffDir, `${id}.png`); + await mkdir(path.dirname(diff), { recursive: true }); + await writeFile(diff, PNG.sync.write(diffPng)); + } + return { + base: baseCapture.file, + baseViewport: baseCapture.viewport, + current: currentCapture.file, + currentViewport: currentCapture.viewport, + diff, + height, + id, + mismatchedPixels, + mismatchRatio, + status, + width, + }; + }), + ); + return results; +} + +export async function renderReport( + results: Array, + metadata: { base: string; current: string; platform: string }, + outputFile: string, +) { + const counts = countResults(results); + const cards = await Promise.all(results.map(renderCard)); + const html = renderDocument(results, counts, cards, metadata); + await mkdir(path.dirname(outputFile), { recursive: true }); + await writeFile(outputFile, html); + return counts; +} + +function countResults(results: Array) { + return Object.fromEntries( + (['unchanged', 'changed', 'added', 'removed'] as const).map((status) => [ + status, + results.filter((result) => result.status === status).length, + ]), + ); +} + +async function renderCard(result: VisualResult) { + const [base, current, diff] = await Promise.all([ + loadImage(result.base), + loadImage(result.current), + loadImage(result.diff), + ]); + const ratio = result.mismatchRatio == null ? '' : `${(result.mismatchRatio * 100).toFixed(3)}%`; + const dimensions = result.width && result.height ? `${result.width} × ${result.height}` : ''; + const pixels = + result.mismatchedPixels == null ? '' : `${result.mismatchedPixels} mismatched pixels`; + const viewports = `main viewport ${result.baseViewport ?? 'unknown'} · current viewport ${result.currentViewport ?? 'unknown'}`; + const namespace = getNamespace(result.id); + const overlay = + base && current + ? `
overlay
maincurrent
` + : ''; + const images = `${overlay}${renderImage('main', base)}${renderImage('current', current)}${renderImage('diff', diff)}`; + + return `

${escapeHtml(result.id)}

${result.status} ${ratio} · ${dimensions} · ${pixels}
${viewports}

${images}
`; +} + +function renderDocument( + results: Array, + counts: Record, + cards: Array, + metadata: { base: string; current: string; platform: string }, +) { + const statusButtons = Object.entries(counts) + .map( + ([status, count]) => + ``, + ) + .join(''); + const namespaces = [...new Set(results.map((result) => getNamespace(result.id)))].sort(); + const namespaceOptions = namespaces + .map((namespace) => ``) + .join(''); + const filterScript = + "for(const card of document.querySelectorAll('article'))card.hidden=this.value!==''&&card.dataset.namespace!==this.value"; + + return `Visual regression report

Visual regression report

base ${escapeHtml(metadata.base)} · current ${escapeHtml(metadata.current)} · ${escapeHtml(metadata.platform)}

${cards.join('')}
`; +} + +async function loadImage(file?: string) { + return file ? `data:image/png;base64,${(await readFile(file)).toString('base64')}` : ''; +} + +function renderImage(label: string, image: string) { + return image + ? `
${label}
${label}
` + : ''; +} + +function escapeHtml(value: string) { + return value.replaceAll('&', '&').replaceAll('<', '<').replaceAll('"', '"'); +} + +function getNamespace(id: string) { + return id.includes('/') ? (id.split('/')[0] ?? 'legacy') : 'legacy'; +} diff --git a/packages/@luke-ui/react/scripts/visual-regression.ts b/packages/@luke-ui/react/scripts/visual-regression.ts new file mode 100644 index 00000000..67008f24 --- /dev/null +++ b/packages/@luke-ui/react/scripts/visual-regression.ts @@ -0,0 +1,108 @@ +import { execFileSync } from 'node:child_process'; +import { createHash } from 'node:crypto'; +import { arch, platform } from 'node:os'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { copyFile, mkdir, readFile, rm, writeFile } from 'node:fs/promises'; +import { compareCaptures, renderReport, validateCaptureIds } from './visual-regression-lib.js'; + +const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const repoRoot = path.resolve(packageRoot, '../../..'); +const artifacts = path.join(repoRoot, '.artifacts/visual-regression'); + +async function main() { + const configuredBaseSha = process.env.VISUAL_BASE_SHA?.trim(); + const baseRef = process.env.VISUAL_BASE_REF?.trim() || 'origin/main'; + const baseSha = configuredBaseSha || output(['rev-parse', baseRef]); + const current = process.env.GITHUB_SHA ?? 'working tree'; + const signature = createHash('sha256') + .update(await readFile(path.join(repoRoot, 'pnpm-lock.yaml'))) + .update(await readFile(path.join(packageRoot, 'vitest.config.ts'))) + .digest('hex') + .slice(0, 12); + const cache = path.join( + artifacts, + 'cache', + `${baseSha}-${platform()}-${arch()}-chromium-${signature}`, + ); + const baseCaptures = path.join(cache, 'captures'); + const currentCaptures = path.join(artifacts, 'current'); + const worktree = path.join(artifacts, 'worktree'); + + try { + await readFile(path.join(cache, 'complete')); + } catch { + await rm(worktree, { force: true, recursive: true }); + run('git', ['worktree', 'add', '--detach', worktree, baseSha]); + try { + await capture(worktree, baseCaptures); + await writeFile(path.join(cache, 'complete'), ''); + } finally { + run('git', ['worktree', 'remove', '--force', worktree]); + } + } + + await capture(repoRoot, currentCaptures); + const reportDir = path.join(artifacts, 'report'); + const results = await compareCaptures( + baseCaptures, + currentCaptures, + path.join(reportDir, 'diffs'), + ); + const counts = await renderReport( + results, + { base: baseSha, current, platform: `${platform()} ${arch()} Chromium` }, + path.join(reportDir, 'index.html'), + ); + await writeFile( + path.join(reportDir, 'summary.json'), + JSON.stringify({ counts, results }, null, 2), + ); + // CLI output is the entry point to the generated report. + // oxlint-disable-next-line no-console + console.log(`Visual report: ${path.join(reportDir, 'index.html')}`); + // oxlint-disable-next-line no-console + console.log(`${counts.changed} changed, ${counts.added} added, ${counts.removed} removed`); +} + +async function capture(worktree: string, target: string) { + if (worktree !== repoRoot) { + await copyFile( + path.join(packageRoot, 'vitest.config.ts'), + path.join(worktree, 'packages/@luke-ui/react/vitest.config.ts'), + ); + } + await validateCaptureIds(path.join(worktree, 'packages/@luke-ui/react/src')); + await rm(target, { force: true, recursive: true }); + await mkdir(target, { recursive: true }); + if (worktree !== repoRoot) { + run('corepack', ['pnpm', 'install', '--frozen-lockfile'], worktree); + } + run('corepack', ['pnpm', 'build:packages'], worktree); + run( + 'corepack', + [ + 'pnpm', + '--filter', + '@luke-ui/react', + 'exec', + 'vp', + 'test', + 'run', + '--project=visual', + '--update', + ], + worktree, + { ...process.env, VISUAL_CAPTURE_DIR: target }, + ); +} + +function run(command: string, args: Array, cwd = repoRoot, env = process.env) { + return execFileSync(command, args, { cwd, env, stdio: 'inherit' }); +} + +function output(args: Array, cwd = repoRoot) { + return execFileSync('git', args, { cwd, encoding: 'utf8' }).trim(); +} + +await main(); diff --git a/packages/@luke-ui/react/src/button/__screenshots__/button.visual.test.tsx/button-focus-visible-chromium-linux.png b/packages/@luke-ui/react/src/button/__screenshots__/button.visual.test.tsx/button-focus-visible-chromium-linux.png deleted file mode 100644 index 4196d45b7fb52ec01f652f03b18b58add8f3ef86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2661 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 diff --git a/packages/@luke-ui/react/src/button/__screenshots__/button.visual.test.tsx/button-states-chromium-linux.png b/packages/@luke-ui/react/src/button/__screenshots__/button.visual.test.tsx/button-states-chromium-linux.png deleted file mode 100644 index 45473dca8d3efae5502f4493a0a1cd734112ef34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5848 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 diff --git a/packages/@luke-ui/react/src/button/__screenshots__/button.visual.test.tsx/button-tones-chromium-linux.png b/packages/@luke-ui/react/src/button/__screenshots__/button.visual.test.tsx/button-tones-chromium-linux.png deleted file mode 100644 index 0817ed62a382f5ed595fc4ed8df5891d5253e927..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8836 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 { , ); - await expect.element(locator).toMatchScreenshot('button-tones'); + await captureVisual(locator, 'button/tones'); }); test('states: disabled, pending, with icons', async () => { @@ -49,7 +50,7 @@ test('states: disabled, pending, with icons', async () => { , ); - await expect.element(locator).toMatchScreenshot('button-states'); + await captureVisual(locator, 'button/states'); }); test('keyboard focus ring', async () => { @@ -60,5 +61,5 @@ test('keyboard focus ring', async () => { ); await focusViaKeyboard(page.getByRole('button', { name: 'Focus me' })); - await expect.element(scene).toMatchScreenshot('button-focus-visible'); + await captureVisual(scene, 'button/focus-visible'); }); diff --git a/packages/@luke-ui/react/src/combobox-field/__screenshots__/combobox-field.visual.test.tsx/combobox-field-default-chromium-linux.png b/packages/@luke-ui/react/src/combobox-field/__screenshots__/combobox-field.visual.test.tsx/combobox-field-default-chromium-linux.png deleted file mode 100644 index c70f49a9d118df1a8cac9203957ecdcdd1418492..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7443 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 diff --git a/packages/@luke-ui/react/src/combobox-field/__screenshots__/combobox-field.visual.test.tsx/combobox-field-open-chromium-linux.png b/packages/@luke-ui/react/src/combobox-field/__screenshots__/combobox-field.visual.test.tsx/combobox-field-open-chromium-linux.png deleted file mode 100644 index 42ad7bceaaea6992f4bda85f2a5deca38ac2c53b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15894 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 D6dvM> diff --git a/packages/@luke-ui/react/src/combobox-field/__screenshots__/combobox-field.visual.test.tsx/combobox-field-sizes-chromium-linux.png b/packages/@luke-ui/react/src/combobox-field/__screenshots__/combobox-field.visual.test.tsx/combobox-field-sizes-chromium-linux.png deleted file mode 100644 index 3c8eac3ab33dd8cdc01c4a40876d2c19af0286eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4960 zcmeAS@N?(olHy`uVBq!ia0y~yV4lUmz%ZSIje&uoq*>(z1B0--r;B4q1>@U;wK-GT z8y`HB*MFaqlfd?-YS~)b18tcsr8=@~~ zLH%#;uG^d?>NM45%_|SqTT>0JPPK>SnF)SqPi{>4XW(~ZFDK(oldl`fjGtM}yP?9q z(DSm%Ue#w$Pyeo-rzs!XpyD}6#Z!=T0*KahVw?n`T{Rp)^b!tM4-hS~kO8D?nB1`iDUzPpkyx#Bf7q4d!`IWJ|o-_N~vxy*+?^-ym^O!eJR{z4a zebe8SyLnvENh!Q+6t-pEGEHH3kc+;&_dn4x^~BqXS)sX=v##eSUf#P^<#X+x$_@QB zj375&+8?Ya9JXM+wR_D+HnTN(N=I2&s>!X$eI)#Mci6{*>Mqf*f8X4>>Z`bU%GB9r z8=Ls%-P_Upj&a8J9NY8u+h_d}2{^Iw`&03Z`_&VYnN?TqyLn`>wAsd8n$9v{)6Xg- z9Ga9OzDz?l=kd$4)-T?i4t~@xde6$E{8M0D<=g2wnT@g8a%opjvqo)u^DN-FT2`_C z=E{6|RXweMRZ*vYg~va>vG8tAmez%Rg~oILs)Bs&Y2H48vpabAuh6<_w;Ze8*=N7M z@1h;5larTvdD+z~%YQ`F#2K$$d-jT2BYW6}isx=zx@&C$<}(^?G26a*nYDXjsqV@Y zTmCico=+0_zHQy|-w)jQo^sup?WqWI@~)4qF%wm`eqZ9)o+ewII!{om-&!8?}sWPdSu&eBOc-!*Y&Dfj)K$9S^#hqbAA zPST4%A^PJzd)?73H$>k3OPjP))KDdJ6UTBknY!mP^}l~9{4ezs<=wno(R0$0)51oM zd*AmKtt*+gt=h=rQp%V3e}{F%u1)!D{@=voaP#E}DxQ~~a?V(=uKd4#`8j_D&&fA) zLklOR23!7IFRuVL!N4({EBQ=^zw4xROYi^tw!NpXuSmD{%SHD;%PQnNC#l5FWANP7 z`RCX5{b?B)9G;U@?(QIvQxk+FUu8aDU%z91u^Kb7kJ0Ev%}T-X=IPo{uE@Ty?J)s`jC!vbsy8)SF$U9=8J=s7Q){^ks)-*o+l z8+oN8u5!3<&rgg_pV-Q8d(_zfp6}TQiQi;o6MDLjNv@A@_`HhO=J%PXcc=S`b|mv3 zZ#y<&$$4!NuAIBOrcPG(|J3>JU0&U<%kw`SWCuseYUL-ZIs=Q3KembdXw}{?xAgJR zcmt=VSG)2r7u^qfrnXZ-CCqSs{{29AU&{?ECgxn1?CL$Mb1F<|ag%CkY>vID$3&^5 zr^T5OR@1#FT`@PGT>bm`6Si)X5RkoI%P+5q+dFIipC{@z-)4wkULJaB#gj|JD1v$*yevB^#GNX1LA2r1H~39r4yqlgDyPN+(KuIwI_EQ2fkC z#dA{0*OnOVjYXGAdv#vEP5S*n((U-BmKw=q9@)Ex^{Y;2)@A7Shb;Fjm}MKi&A3P9 zZ|2RMY3lPTnl^1RnsicSl8Wc9T~6y}8Tyr$UhnppG$GNi{O!XV|7;E~R!m)) z^=jYVE_P}0fO8VA`+6i^-ku#DCPQ<_#yHas`=oU-TjOItE8?~v14=I=U5#dErPLesy?^L?Mo-;&C&aX+$X7ZGg#DolKK6c>rZO1 z6ewfwo1pz+|GR%y|G(6q`*_Q~zo6(v{KO?ElfJEqo)KKgJ$qVh@6VSOpx~-e3{N;E z^5b2uF$jah;pHN-%0OrVN@m@EXThhruOo`Sr&Vz|EbQO*d-{g7d{7zXd8t?T3D*xJd7?at}d%&N7I_RgK-{fWKu*FX1{5}yApg8eC0Hl+;;BQoK;D|PL^}Gw z)Ll!vX8nubw0`{o^-s3HUo32MY3f)K@#lcotj(T~8g$zPZ6Wn}tCm(4HkyC`8n`0f zXHwn0JJ;Qpt?W!m=bx|j)bhvV-Yr|@pRC;+@L4{5)61W{Ch3o2LQcI+{e0}~n^$(; ze`cSK*tvsc$&ZMI{o6vbPuT979sbVu()UY;*SySon7)3EiZHuZ?Vc|mr25wWkX&yw zVPXAsExA1Zjf?ippSydPX3DfpMVHmWE*!ipU4Frq;q$b$&woA-3!d);DltVCHfRSi zP11?k)>CobuIf|3sl6xn#Z0T7c1_^9Fe~4-wMnt=bEZB2ez`WoTso`z#-4Yqpx|p4 zzn1$XVbj!b{?g6WwbSOswo7OjCbn+pyEM0EN_gCF)##{%>$BP;zZNx4)7@=(Wn<^9 zJEwE*-FD{$)%-zIn3M$8=RTU3!vDMK*Gbts?)7hNbB9%IdRD-2TR^zL7yQ zqu%Alo_}=7@!MBXjW2H(8^@pj#j71T$8%zC-1%kKT2*H3_^~G~Dth+HvniQX39Q}0 z6EZWOHvZC?`KvlJ*KgwcbAjMSqsY<;8b>yp+?|~G{9M^BZ`N1QuRV|c{^_!Eg8F=W z@9)2so{2u6t`ad#Kd|e$rmFFhphCUQ$)}ch9GkhJVpChn9PdYklRm0^44LGw`Y1pv zK#Q>u9JPX+oi20EJgPpiW$kk1pBl1XHBWqASz+X=W!x`1yX&frWB3_dFJZ$9Jg{J(N8`QYDRS43|x*qKiVszH#dltLw`Zde#PRe`frnweR zYS!O!ai(^mXJd>%|4t^A?Dq>bZyrB4*H)w<=)YrGnM`tvzL5IVvqI;~FHe8o#8kUG zF73KC)Wmp?lt)XlUVDCYouqT`16Op}mW`EH=U=uma9Wfmck`B*nN7IAS?KvT-Pt$x ze9YYU`?>0)lR96wa<4q~v2~K~>&kWc#<|(=p0zqPro2sh_55h3GAQD9-2;_hpmd|+ zssavMq8sEpnVz4Y|9tQFdyn7T+$_@Vs*<^BhFz`I$BH?tR%vNzYfl6m;?s zt5#_(^Phh%I)AS#Oi4mhTYJ0b^2;8VQo`cm&TYxOY*GGB22>*1FbaogP334}@SOGL z*zx0*_5W-j!VsTfb~SdLtNT3r{)czF-z#}eT5?j+VbZ$IA3qklxx0g${X_uVIK=FP z%;@3TyXAj^^6fqzL$;o|x6bpM|I@AZ6P*Z3Ke4fj*L@oAy|sUIHCegk=I@GE8<#Fg zu32^Avfu5#$31P4a(6aNYx7zZJa1W59`DOf0-y-EbXBzAY-_#fy*b89v9sSAZzx&5c{ zQ3C(mYAefWr;Ux`+>Xw%niW0mazOAo)nuN%wKMu`*B2|gMkv7dW42LG-s zjMl$-{QAb4Jj>R5Z~we_u6*a~l_)8#ol7n_|L(6l_#@W;Q-!mtNY%}Mi{~3}S~2s= z%fm9Kd7ZVqor}58aw~lQRcF;N_xwym*U#S5nVE48sXU(79XCci`SbJhnHh%7=dH`% z$pkO=Te@cts6P`c&3HX(&7@Y|VhQ_;uImo4x}KA3%I)_b9N`d@P`zF{ z<>GDmM=R6KFBolixNe`5e0#P1bB{{p{y$fZZLZCDaz*<8fkt6gm00<`d-wkNaom1c zfX0W&R;R|b(c3RwzuvCmIceS8hHO2RiMcA$&n$|PIyN5C+;vZGVO5~)ONse`Prh8# zV-xD#q7#3rX_nWdsl_Yv_w^q;!r`O;b(Lo*a@k{X)_8no}Ka zu6JYaY&Y>vHS(=3HvW7#k?pipF41B za?igX>*C?y%&N(^D(vM0;B9 z51ywoQDd>uTs6VRlMEcK1dEcEoUjmZzV!9NrAvqA*;e1!RjREWzAoi>pX`;ZS2x!D zECRL7a$95g6D^CybeB9@>Sx8KxaV)+CQpq|l7@C-=XUllzow@u`?$ZC_v6M1=Q%ld z$|O7V^!FaNNdB{N!hP<}!oZFt(&s-tJ*}y&o&5UR+B=oc=judn;{o}rn(?})POQ80 zS&PHUQ?HnwSvcps_k?xpS`I#b(sulZ)5apL%bds9{S70Y1Rp&p)4ceP=f+P)PF+1B zKSK(im^izt+#cTpC1rp>q-`3?<+_+Z`k(p@+s|2 zA;;M)FHK#1fb}S2-`={OKNgeJ8rRqVeeE$x<>fEVosCDeURM;nO_s4MXt;j+_6v#D zO)g!hx}>C@f8H43tK4s6q;4_3SVc<@rTDySfu5)Q;XB}M=xf#@)#9hEG*tE&W?#~Bj zmCQ}EtxB~LB|zolX<-A$&1q+q=AT#goE*6^BBi8c%FD~kmBBqmBS+)(b5Fj!y!@od z^3qF_r%#`HTuL!AF*&ln?yGj%`FXvdW@!8g(H(!k-L8DU_q#>qCzYc~f}XQI5^1B2I0PZ!6K3dT1FxeKm7 zZT$Z6{eR2|SR2@^|mv zye-|mcw=2RW!V;wgprpfL4&p7Y?mg#wyG-j7c#_#-l`ifhVgZ|n7W$fR#-9K>m{@zK8 z6!wcN|N0SIQ(mfCey`U0vQg5TA3x{b*_z1|KlA3%Rm;r_H`upsIv;!T?e_a;TwQCg z+^<%*zj=lC5AXIh&%U49@$moMv%Iz6i;v$8)Z4pr(p>*5o44AYXnGoc;aB%ppWpZH z-m%kd-hQORu1>uEtBYRwom%y+J3Bh&gxASFU*E5N{?l^%=dt}Y&4=!#$?f{C ze&_drhSIt(uw!b@cb@z_H(ceGa<=n}V{MP3F zhFQnw-9O2DSx;&D{chLHnEmZ{X5LTE(o<4;E_>KrNfDw@Zbh zv0FN3ZuwC2S#ZJhxus`IT=kw_I>qDSa?ZW2Uqg9&)1oPMeKIeVj#Ya<4AI=<+!K7H zqp(ZlU%&)oVV+5ogr4v}@kMq~d5WQ8ZLM|>(_N4q+QMBB!Jc(6zn{*YDOEjFzV3DOpTB?m zKgZM>pFR84ruP5cKUcTETlSCR$+D_ct@UfKP)GR(BBcoM(T+(nB@lHLa1s?oVqnesxxSNm9|gx5m#47 z7ngJ4cIl38Pv;k0-zzw;?g67*)YteuXQGRa)%CfW-#K$esV-m1y#D*{g8$5aZqMz% z=qr_aS?}?=_q8*-izM4a{Jmqn(z?(0#+Ci~Q+?;EMepu+ z`{s5^c67|y&g1mvgqmFSKaPp6+$+yGxIEeOtT^uVqJQuAAKkx)CwTpixz_7esC0Ck z_<8pEo@uA|yth4Izi*H}`+R$WQR2YH`%$blkTqGUHRdpRo>nz!Mn}VBJLEeP(LTvr7Q-d=d;%0AC{;@t5 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 A1ONa4 diff --git a/packages/@luke-ui/react/src/combobox-field/__screenshots__/combobox-field.visual.test.tsx/combobox-field-tray-short-chromium-linux.png b/packages/@luke-ui/react/src/combobox-field/__screenshots__/combobox-field.visual.test.tsx/combobox-field-tray-short-chromium-linux.png deleted file mode 100644 index 1ee2d48716d5ad7f71f97717119602d6aca288a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14523 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 diff --git a/packages/@luke-ui/react/src/combobox-field/combobox-field.visual.test.tsx b/packages/@luke-ui/react/src/combobox-field/combobox-field.visual.test.tsx index f77c81bf..ee92c57d 100644 --- a/packages/@luke-ui/react/src/combobox-field/combobox-field.visual.test.tsx +++ b/packages/@luke-ui/react/src/combobox-field/combobox-field.visual.test.tsx @@ -1,6 +1,6 @@ import { expect, test } from 'vite-plus/test'; import { page, userEvent } from 'vite-plus/test/context'; -import { renderVisual, Stack } from '../test-utils/render-visual.js'; +import { captureVisual, renderVisual, Stack } from '../test-utils/render-visual.js'; import { ComboboxField } from './index.js'; import { ComboboxItem } from './primitive/index.js'; @@ -34,7 +34,7 @@ test('default closed combobox', async () => { , ); - await expect.element(locator).toMatchScreenshot('combobox-field-default'); + await captureVisual(locator, 'combobox-field/default'); }); test('open menu', async () => { @@ -60,7 +60,7 @@ test('open menu', async () => { // whole viewport (fixed by the visual project config) rather than the listbox // alone. This captures the popover's alignment to the trigger and its layering, // not just the listbox's own styling. - await expect.element(page.elementLocator(document.body)).toMatchScreenshot('combobox-field-open'); + await captureVisual(page.elementLocator(document.body), 'combobox-field/open'); }); test('mobile tray', async () => { @@ -85,9 +85,7 @@ test('mobile tray', async () => { // Below the `small` breakpoint the popover renders as a bottom tray; screenshot // document.body (the popover portals there) to capture it pinned to the viewport edge. - await expect - .element(page.elementLocator(document.body)) - .toMatchScreenshot('combobox-field-tray'); + await captureVisual(page.elementLocator(document.body), 'combobox-field/tray'); } finally { // Restore the viewport fixed by the visual project config (vitest.config.ts) so later // tests in this file/run aren't affected. @@ -119,9 +117,7 @@ test('mobile tray short list', async () => { // Below the `small` breakpoint the popover renders as a bottom tray; screenshot // document.body (the popover portals there) to capture it pinned to the viewport edge. - await expect - .element(page.elementLocator(document.body)) - .toMatchScreenshot('combobox-field-tray-short'); + await captureVisual(page.elementLocator(document.body), 'combobox-field/tray-short'); } finally { // Restore the viewport fixed by the visual project config (vitest.config.ts) so later // tests in this file/run aren't affected. @@ -153,5 +149,5 @@ test('sizes', async () => { , ); - await expect.element(locator).toMatchScreenshot('combobox-field-sizes'); + await captureVisual(locator, 'combobox-field/sizes'); }); diff --git a/packages/@luke-ui/react/src/emoji/__screenshots__/emoji.visual.test.tsx/emoji-sizes-colors-chromium-linux.png b/packages/@luke-ui/react/src/emoji/__screenshots__/emoji.visual.test.tsx/emoji-sizes-colors-chromium-linux.png deleted file mode 100644 index a9069b36911b080b9f177f9269299526709fc424..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4347 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 diff --git a/packages/@luke-ui/react/src/emoji/emoji.visual.test.tsx b/packages/@luke-ui/react/src/emoji/emoji.visual.test.tsx index 8428595b..7140ac1f 100644 --- a/packages/@luke-ui/react/src/emoji/emoji.visual.test.tsx +++ b/packages/@luke-ui/react/src/emoji/emoji.visual.test.tsx @@ -1,6 +1,11 @@ import type { CSSProperties } from 'react'; -import { expect, test } from 'vite-plus/test'; -import { renderVisual, Stack, variantValuesFor } from '../test-utils/render-visual.js'; +import { test } from 'vite-plus/test'; +import { + captureVisual, + renderVisual, + Stack, + variantValuesFor, +} from '../test-utils/render-visual.js'; import { Emoji } from './index.js'; const rowStyle = { @@ -27,5 +32,5 @@ test('sizes and colors', async () => { , ); - await expect.element(locator).toMatchScreenshot('emoji-sizes-colors'); + await captureVisual(locator, 'emoji/sizes-colors'); }); diff --git a/packages/@luke-ui/react/src/heading/__screenshots__/heading.visual.test.tsx/heading-levels-chromium-linux.png b/packages/@luke-ui/react/src/heading/__screenshots__/heading.visual.test.tsx/heading-levels-chromium-linux.png deleted file mode 100644 index 44bad800117d5db8f9c533d20d3e4a451ce96559..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18739 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 diff --git a/packages/@luke-ui/react/src/heading/__screenshots__/heading.visual.test.tsx/heading-truncated-chromium-linux.png b/packages/@luke-ui/react/src/heading/__screenshots__/heading.visual.test.tsx/heading-truncated-chromium-linux.png deleted file mode 100644 index bf04f6b77f346ee447c4b2fb6133fcfb59417315..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4070 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 MPgg&ebxsLQ02OC%U;qFB diff --git a/packages/@luke-ui/react/src/heading/heading.visual.test.tsx b/packages/@luke-ui/react/src/heading/heading.visual.test.tsx index 5a3995f7..1a36077d 100644 --- a/packages/@luke-ui/react/src/heading/heading.visual.test.tsx +++ b/packages/@luke-ui/react/src/heading/heading.visual.test.tsx @@ -1,5 +1,10 @@ -import { expect, test } from 'vite-plus/test'; -import { renderVisual, Stack, variantValuesFor } from '../test-utils/render-visual.js'; +import { test } from 'vite-plus/test'; +import { + captureVisual, + renderVisual, + Stack, + variantValuesFor, +} from '../test-utils/render-visual.js'; import { Heading } from './index.js'; const levels = variantValuesFor()([1, 2, 3, 4, 5, 6]); @@ -15,7 +20,7 @@ test('levels', async () => { , ); - await expect.element(locator).toMatchScreenshot('heading-levels'); + await captureVisual(locator, 'heading/levels'); }); test('truncated heading', async () => { @@ -27,5 +32,5 @@ test('truncated heading', async () => { , ); - await expect.element(locator).toMatchScreenshot('heading-truncated'); + await captureVisual(locator, 'heading/truncated'); }); diff --git a/packages/@luke-ui/react/src/icon-button/__screenshots__/icon-button.visual.test.tsx/icon-button-focus-visible-chromium-linux.png b/packages/@luke-ui/react/src/icon-button/__screenshots__/icon-button.visual.test.tsx/icon-button-focus-visible-chromium-linux.png deleted file mode 100644 index 726ee8cced2e0734ae59de6da58e3690f593243e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1440 zcmeAS@N?(olHy`uVBq!ia0y~yV4lUmz~IQi#=yX^;mPe^3=FL4o-U3d6^w5W`gS}k zWn};G{{8nq^V8$zCDulkhqaf)9^4+foiAxyJD-zg3y0$uCk01y>ypkFmk#F1E_xv( zyNl(b=0vL!fv#z%_##(ltXp?z)2{5~$GhHH7@t4$ImlliqU1*8zcZWl=AU2g^G}t5 zf#Jd=DFz0Hj6hxn28JywKrV?2VP;@p&|SsIz|bIem4Si5p*xF#fnkBGDMrd&?4wr)Am9De<27<6!X5r}A-U&K1l#sZza4rSjKz z{b#%F|L4y8bLw#ApNYSVpMQ!0dFt7pvb??f#2FYEzQvu@TN5XfwlI2Ak+1ps`PJ(C ze?9iTDcNTn>J>y5oHVKawp`z*x%2HNue9bnlb%&tD*+0h#m|It`_*<@NId^_R4v$F zwqEhJ_2L-LW0O7S)xInd+of9Ud-ByU0|o|$Gj3;9qvU&xO|MV!nOl{tJK1v`$Ki(- z%kRaUzT&h!ExB3-Y#!0Ef0jr0%dDE0!Qa^#7#dc)pXHI=`&aqrv+4G8mmb~8z`#&Y zx?<+SD6eH!TR{=O+8LBQpo!~BO8=Sfv+k7N_Og4?H+#DA*NeCF&pmsl@ZV6%|I;1q zbS4Id1MU8kZ9jcD{{H0T_`g2?=F8XpE&drl|L?W_&$n*YgG}U~u2%iz!YO3Kad6!RKyd7p#T9`d$DLA8S4lM4hnmg%e-r1jL1DDBJm#K6Y-;Lp% zCicAO{95+Sb`t3(p6jCDfIND0#m&}iaqF9szMpR0D*G0H`TY0&-y)`oRlO{=zL`DQ z)98NorkcA!bswKRo>}#A?OLDM-4{S9dGo~-@pn=4PT%CV{`q-k@0V)RemUz&?)|bS zH|x(mx6=Ijrs-C5CoSH-_Q||x{W)3?Th^FU)toU-olP zL7w*h>Rj7$z4K4cJ^g7@@gzXbrbuIRL1Oll=jZc48P`YF`p)^9U{KWMnA}{toBv$; zzUa@>&CQC6N+(QS-K=x=s!mDvw_CesFMiXbHuKf@EV&)2hV0WorJsSduioK@ud5?( zUO#*C>e@N?WuD$W8+eWV@SCkih!zx}=P*^$g? z;o5F5ugRK!+!%lF^t!j^MwzQtC6$&=jaz?QW9bx))05IRd%7riPEyG<@lrc7{r^*r z`M*vrUQ@Q)MZSn-v53s`?*D&m?TWs~);#pDpX~YZR`&XfZ_6Y*INWkmQ(KQ7bzQc6 zx#nphkmn9hpCK^+=dHyhyKS2qL|hzLh(rPx-hTagY+>@Aif>Aj6H-%K^R|1t2ng

#oqhXWkssTz7q8vN}go;f7mle|-Bs@2P*?Yv-8tbBqrQ2wq7n zEuGqtAoJySZP7Uw7EoZft$tz^vt!GN=llP~^4a~g@z%C|wJr5Bo7Gx1`M)3H>i*xW zU30bHFMh%8*M@vW=l;C^KlgFfmnz$7)26Lh)s@)6(Y0v7<(CtJlGgtEYiF6R)KnM{ zDw-Op1PZeqUh598|NHa)=Sw@oC8z!L?&h&6e#FCldUeeobGrjeUYG5T*;Ue+xO!Dr z-1_5Z&hTief@1$=mg=<^_I>|4=Fi!GM5Clyl)wJ5LDSNus%}f~zu&xRQxiy0Z1)kV zzpp1ge;F#eI7p;(vHqVH&uPVK&(COlt+E9vcp0T~?Zu(&ZU+OcyKzUewkKWs`n%R` z<^A`{pvbtc1WjRHOAJFoML&Q39JBIn-sZ%^Y#_b8+l4ZDbaZt$ZrE@jb-CZ%M^8>p zj#+v6<%aV2aeCTaO}?|uK-x3+OnI@Y_DlG^^UC-C%1;ZgUJ;#P#5nD=XSo0abJGdvQ_PsV-5`s z3>5|26yJI8%D(s?m0cn++ZNg$Jut64Z{aGfbzhpr{We}&E1@oU&|&-SrMKT2ZP>7( z0TlGS(I+QtT`pzwr}O^PO|kE9oOxHC^X%)=P&T>xZz}PBt|=Znxz>JrtN#D1%zI|~ z|GU>-xp@Dd-T5Eq{;y&K1+vf-o|~77rrX!N$d37TLH_=E`@g?0+m!xMJ$9A9zNYWH z&5y`+Cc77&O|JjUY4>ku{geIkZ5u%rzdQ?0e4eWUla3Uf`|?|oH~iepM!)5UbGP3; zc3@xa?+GApCu&P>-2eAk{ijcVR83+uRnN_{J^ksE5%cqNbCVxT4Uc>H=xBG&{e5!_ zMFe?FX8U$6O32FUYV=#~y!)=(Bo)s~KeQz`PCs{Uv)tM+QRdUDW3M&OwJx6oO1IK) zZ)|MVjoxO^S9FfYM2h#_?)P?jvuDqC25I{huxRzB9eYl_|MS(p;Lp*`YuML@b=y{d z+c3|Cg`1muj(z>S?L`j{v9g`oVk~5F3n(-^O}*A!ymt2TlR1)88S-`|GEde~ z>fmrweeM$|0#bKrtH+v)f93bgb(<+MwQTi4P|^9aYf(aoQj^87bS86IXZFfF5vtxk< zms#GO4p7p%s4-LE{jEab`~NSgS3Wx;**Dk1IrOXK(&+M>XUyB*r(D`{JNMRGv%7iI z>-L{tF*Vf_5))E$Cvg@(UzdAlXSTG|T1en8IXMB8T2)rMae@MFQq~mebN}=2=5zaG UaI9q?0|Nttr>mdKI;Vst0M|(q%>V!Z diff --git a/packages/@luke-ui/react/src/icon-button/icon-button.visual.test.tsx b/packages/@luke-ui/react/src/icon-button/icon-button.visual.test.tsx index 10b75bc0..f2beea41 100644 --- a/packages/@luke-ui/react/src/icon-button/icon-button.visual.test.tsx +++ b/packages/@luke-ui/react/src/icon-button/icon-button.visual.test.tsx @@ -1,6 +1,11 @@ -import { expect, test } from 'vite-plus/test'; +import { test } from 'vite-plus/test'; import { page } from 'vite-plus/test/context'; -import { focusViaKeyboard, Grid, renderVisual } from '../test-utils/render-visual.js'; +import { + captureVisual, + focusViaKeyboard, + Grid, + renderVisual, +} from '../test-utils/render-visual.js'; import { IconButton } from './index.js'; test('sizes and states', async () => { @@ -13,7 +18,7 @@ test('sizes and states', async () => { , ); - await expect.element(locator).toMatchScreenshot('icon-button-sizes-states'); + await captureVisual(locator, 'icon-button/sizes-states'); }); test('keyboard focus ring', async () => { @@ -24,5 +29,5 @@ test('keyboard focus ring', async () => { ); await focusViaKeyboard(page.getByRole('button', { name: 'Focus add' })); - await expect.element(scene).toMatchScreenshot('icon-button-focus-visible'); + await captureVisual(scene, 'icon-button/focus-visible'); }); diff --git a/packages/@luke-ui/react/src/icon/__screenshots__/icon.visual.test.tsx/icon-sizes-glyphs-chromium-linux.png b/packages/@luke-ui/react/src/icon/__screenshots__/icon.visual.test.tsx/icon-sizes-glyphs-chromium-linux.png deleted file mode 100644 index 518d10a5acde32d52da7e3995e78acd423864791..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3419 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 My85}Sb4q9e08ShAn*aa+ diff --git a/packages/@luke-ui/react/src/icon/icon.visual.test.tsx b/packages/@luke-ui/react/src/icon/icon.visual.test.tsx index f26f9424..fc5e34ac 100644 --- a/packages/@luke-ui/react/src/icon/icon.visual.test.tsx +++ b/packages/@luke-ui/react/src/icon/icon.visual.test.tsx @@ -1,6 +1,11 @@ import type { CSSProperties } from 'react'; -import { expect, test } from 'vite-plus/test'; -import { renderVisual, Stack, variantValuesFor } from '../test-utils/render-visual.js'; +import { test } from 'vite-plus/test'; +import { + captureVisual, + renderVisual, + Stack, + variantValuesFor, +} from '../test-utils/render-visual.js'; import { Icon } from './index.js'; const rowStyle = { @@ -34,5 +39,5 @@ test('sizes and glyphs', async () => { , ); - await expect.element(locator).toMatchScreenshot('icon-sizes-glyphs'); + await captureVisual(locator, 'icon/sizes-glyphs'); }); diff --git a/packages/@luke-ui/react/src/link/__screenshots__/link.visual.test.tsx/link-focus-visible-chromium-linux.png b/packages/@luke-ui/react/src/link/__screenshots__/link.visual.test.tsx/link-focus-visible-chromium-linux.png deleted file mode 100644 index 1b4b4f1b33206f58e95960aec0ae32aa318812b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1762 zcmeAS@N?(olHy`uVBq!ia0y~yV4lUmz+lY5#=yYvjj!B*fq`wMr;B4q1>@U;xj9o> z84rB4KY#bK?D5mGTYIz{gIt!fT{v{aY|UverMY>ANlKjWxNje7|H^&h&w|)Z63Lrh zv8O%Zj$Fj~rg_K44&#TZEgUIn7bb)*%eI)UxrI^FyK%R{E9d^^g9(1=$D`$^?fCt_ zE?FKX(zm5u3=RuA``7zd-P^$M z@FiB`%Cwt4QiqxJ_kGaYKkw?1eWH^+3nOPX&%Xa~;ycZppEqkwmY;sIyQ-q@dEvJj znbKOPhabB|~7f1EtMY-92-mRZkzA8%Y1CAZGoQ0k`7teg{}oSRG)d0a)j zYL*!kOp*V`^eS3>)8F60CtJbMaMar%Q^$ zC06D#fjv{gxZT_8>|fJ@CHqe}bgn+d^F>@z;ppF)6GGISovj`v{Cn@xqoOjq?a&2F zrFB}aGM06H9p^cZU%XSoe|}xX1l_s(AD=Zd{@%@I8T4qI*V5yglb$MFJFj(V-!}&7 zU!a^gX^EG3!S0sGY1@4jr`jKxHFy35eYYpO`7i#vrn!mxU1DV{Q&v{wU8BZ7=j<=; z`^@t5kpc5x^&1<$8vO2dkho-_?W=hIc;7#xfHZ~sr?r0yJ>Q}9>iy%RXWMTU*UUJ* z=%8cW{dlG5$!gL?zn5;-iQn1rb#vF6$m#~(zlXsgr|MlK{dAVthPiUra^9u=%l9@g zJ9}8SHz(4nS7v(X#XTj0w~gOl-uRi}v-wmD_A@hT&1XmLSkiUuz3Hc-kF{}C4|D5E zH^I!QP%e3_|EbISG{I-?7V_w{e z{@1HOg~k#ulV^`q?=%EErhx%R`l4{y(43 zCpN>x?BJxE!V^?HFP)flXVIa6PJgcXi}Yv5*@}T9D#SDI;^JOQx!f~~ApWK21PZuG zvrFFnarLW@as!t=6IFJ49`91^6ZHm#$|RFXD&`tfWe(3R4^i}-nimraDwY53Rx#Iz v75#AFiwQ`NN~||XRK*isR#Q~a|7Qs5I--54l!b$Vfq}u()z4*}Q$iB}GQm5y diff --git a/packages/@luke-ui/react/src/link/__screenshots__/link.visual.test.tsx/link-tones-states-chromium-linux.png b/packages/@luke-ui/react/src/link/__screenshots__/link.visual.test.tsx/link-tones-states-chromium-linux.png deleted file mode 100644 index 113787d732454c159277dcec6103d5a392e9e115..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9153 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

sL>q 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 N!PC{xWt~$(69CEdPhkK6 diff --git a/packages/@luke-ui/react/src/link/link.visual.test.tsx b/packages/@luke-ui/react/src/link/link.visual.test.tsx index 7917d639..52e10005 100644 --- a/packages/@luke-ui/react/src/link/link.visual.test.tsx +++ b/packages/@luke-ui/react/src/link/link.visual.test.tsx @@ -1,7 +1,12 @@ import type { CSSProperties } from 'react'; -import { expect, test } from 'vite-plus/test'; +import { test } from 'vite-plus/test'; import { page } from 'vite-plus/test/context'; -import { focusViaKeyboard, renderVisual, Stack } from '../test-utils/render-visual.js'; +import { + captureVisual, + focusViaKeyboard, + renderVisual, + Stack, +} from '../test-utils/render-visual.js'; import { Link } from './index.js'; const darkPanelStyle = { @@ -33,7 +38,7 @@ test('tones and states', async () => { , ); - await expect.element(locator).toMatchScreenshot('link-tones-states'); + await captureVisual(locator, 'link/tones-states'); }); test('keyboard focus ring', async () => { @@ -44,5 +49,5 @@ test('keyboard focus ring', async () => { ); await focusViaKeyboard(page.getByRole('link', { name: 'Focus link' })); - await expect.element(scene).toMatchScreenshot('link-focus-visible'); + await captureVisual(scene, 'link/focus-visible'); }); diff --git a/packages/@luke-ui/react/src/loading-skeleton/__screenshots__/loading-skeleton.visual.test.tsx/loading-skeleton-loaded-chromium-linux.png b/packages/@luke-ui/react/src/loading-skeleton/__screenshots__/loading-skeleton.visual.test.tsx/loading-skeleton-loaded-chromium-linux.png deleted file mode 100644 index b0dce786fcad9f7c4642d6f32026320ff9b2e090..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1913 zcmeAS@N?(olHy`uVBq!ia0y~yV4lUmz~IQi#=yX^;mPe^3=HfJo-U3d6^w5W#^%gr zl|AtA{{Od@Z(m#!eS6W#eV0S)RJFN@JyUr-A{-9#sH>fkFyF)xlOq)n)1iEDVuv`h zNs#_F=>un8BpFSybdgZ~&`N@iwlELoebI0-{d^G=XVJuL&Sp)0q>bNF`On5kxQH zQ6)Q8JEv%rT=SvUU>Ox@ybJ=TRuiX0lFej zA(jBG-i>LGg(0q)Y~UDOzQ<){iHz@^jS~aos*PPiVY6&f3uo2avr`I7)Q%m0m~fu~ zBxo{~ywHC5KXzZ+)9n4n=fBHXrssd`R7TvUN#Eq}pD1lL0>z7`yzX(8Rjc;T2sPJB zC`{JfyzF_!^S4u&*{d_NZ=apEPD$Bk-@!)=>{b5{I%M)_EUvuCWwu2ma(kV2t|rJ` zOZZP3dY(GJw?%&4PoZ!g*@V-R=gN5W8%1a>UYBTAdezcS@>oUf@%KA(*}=*$Pf4C6 z@=8A;@9Axuy)QH6-dLR4U%Kbi{wdevk11!1Ps+P>WNvlWoGJfx?#JwI5`7tb=g)`L zUp~$|6*X;b+<{BaqPU(OmU;DNNolck?%(7I>l1&@ntCVbRl@B6X7A@$gEW@DxpVOx zb9A-l7M--K;`)y^Sy_CU&L?-{&bf6ZAm^XtGSkufwD@cNgRhmRE1tAPh8T3W*IhcY z`_i}LJDxqv1Bc1-Co@!e71UL{m+~*qXGit4 zFGZi1$+1=JH{`SVoSnBe?qJ(ArPtT;m+FG!{fnZd+Q|q1?&jPHJZ*cucJ6aA{$dN= zOV_I>-B4w-n=5ZEb!cJH%TA< z$$W)gFD00dCf<9*WYf^f1udW;e3^X8@T6N?S4nB<#j973p8tF` zW_y(?|CX3Ti_-Zv_5ROIn|Iml(C;Y;E&narKpHf&Ip?b^O=P>2c;ftmRYvU2hnFms z3B4*hrP!;ol(+Qik?4R^~N}$E|dAt4?)V?%OPDxMcn0!jp8SJV1MLv^e zRbDUh=YI40#nSahI8#IB-ahb2n|ngpg{gAMOG;YKiG;;lPXAeb>xQXG^UwI01B*5% zw($S-5x)QPm|$P-+q4B2j;u=Mo$`I#=iSZjjhQLQJqNd(NJ!=FZI!uw*%0JVPx&dy zlX$*;+pxJ%@4EiZX_lMMr>Uv$sco5CJ@3&qb?ckqPg?eWyz$Jw=-;N*6))1cS0v0h z_q=TL-(D%P&vlEJtS{SST+hkB_CJ#-Pw|Rk{nuvimu7REm^^deU)h}Z`#YoG#U0jl zxb;usy3L(lkcBU&NZ2=WM*O{e|5L?pZNFBh-Gf* z#P*McCWW3Xg5ZK_$|M8Fv(M)<3uZiW>+k>gv&{*W+r=V3xFXpFe XUyHHzy6}pDfq}u()z4*}Q$iB}+xA&? diff --git a/packages/@luke-ui/react/src/loading-skeleton/__screenshots__/loading-skeleton.visual.test.tsx/loading-skeleton-placeholders-chromium-linux.png b/packages/@luke-ui/react/src/loading-skeleton/__screenshots__/loading-skeleton.visual.test.tsx/loading-skeleton-placeholders-chromium-linux.png deleted file mode 100644 index 1bc520bcfb0c50f6a709ee922821da9e86f8ab5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2042 zcmeAS@N?(olHy`uVBq!ia0y~yV4lUm!0?NMje&vTz)K4s1_t(no-U3d6^w5WI{M#X zm1BEQeot~m$$|wR9eUP^|NS?AC42Rzl}jx|IM2LGOHQiVaMymnZArzv^sWE5gUpx! zGKtNUfq}tb1tSAPgCj2k0|QSM0|P@s05byvL$eeE1B1jBkkSRXm0nQmFDNdad^b=0 zN7UST^Pb(@oX*I=@GNK3g|A;r@9n7+{xNHB?QgU7aeGgh->(s7U`TM=eBtWV&<6rB zv9YWS3^Ok4Y>8XX+@7#Ejvd4!U>ylA!%&*G@cq8udg|)xjq7ig?LK?-s4D|QgXL_U zl9G}s)Ai#)e*CwN{E)z~4`d))?xqWe4?Ex6TRr`5o_NKY^z-wc-p=2D_Tt4r28M?9 zx7E1!*8jK5zrT;yXUEQ+Cl4QX*3;K#W?-nfJFE5IpU>wHEV+IAHUk4g{C==$l*U%T z<_n*npJ$%D?RGB6`ul3!bLY-|`sR%e0|Uc{a;ynp%SosDKOf!e{(imA5dZABeEk`a z2@DMF>mpzL`ek)s`tJ`9of#M&Xl9U@a+9h1+)S*>mRU(^Liqh6noSE;p-enLT^FJHb4vVQAHlp!3=9@7XPs7G)dKlrCAIxQs3gLXo)G2RS*O=ut#r0Wt%bVV&(H5r(emZXq3*t4 z|G)ND+yA>4F9x1Ff1VlSH?zu?`St%S_y7M_otKwaR9`Ru?`GQOlV!Wl-n<#fz`($F zRjt3IuyA5`cQ>fqsy9JchMppcDoi0>FpGTg_4W0gd-w8wI3Kn;wC?BA=?n}9f-mZ9 zx&Iy%t@BAOqantU-~xzJuzfZ6>h|+9FxaS`b^8AOJEPtEhYuAQ7(Prf;kLE0VPRlk zu)E6eKm7M!JFp;C{134m6rgzO9U}cC7PU5v(Jp^$6e|P6yh&*bw;^-BR>?m2e2Wbv z<11!mXLs)I-PmuxYvttRHr;>E{O5YsR { , ); - await expect.element(locator).toMatchScreenshot('loading-skeleton-placeholders'); + await captureVisual(locator, 'loading-skeleton/placeholders'); }); test('loaded content', async () => { @@ -35,5 +35,5 @@ test('loaded content', async () => { , ); - await expect.element(locator).toMatchScreenshot('loading-skeleton-loaded'); + await captureVisual(locator, 'loading-skeleton/loaded'); }); diff --git a/packages/@luke-ui/react/src/loading-spinner/__screenshots__/loading-spinner.visual.test.tsx/loading-spinner-sizes-colors-modes-chromium-linux.png b/packages/@luke-ui/react/src/loading-spinner/__screenshots__/loading-spinner.visual.test.tsx/loading-spinner-sizes-colors-modes-chromium-linux.png deleted file mode 100644 index d8459214532fd314c2d54b726463611714683450..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5334 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 diff --git a/packages/@luke-ui/react/src/loading-spinner/loading-spinner.visual.test.tsx b/packages/@luke-ui/react/src/loading-spinner/loading-spinner.visual.test.tsx index e31c4bb9..c01f2534 100644 --- a/packages/@luke-ui/react/src/loading-spinner/loading-spinner.visual.test.tsx +++ b/packages/@luke-ui/react/src/loading-spinner/loading-spinner.visual.test.tsx @@ -1,6 +1,11 @@ import type { CSSProperties } from 'react'; -import { expect, test } from 'vite-plus/test'; -import { renderVisual, Stack, variantValuesFor } from '../test-utils/render-visual.js'; +import { test } from 'vite-plus/test'; +import { + captureVisual, + renderVisual, + Stack, + variantValuesFor, +} from '../test-utils/render-visual.js'; import { LoadingSpinner } from './index.js'; const rowStyle = { @@ -36,5 +41,5 @@ test('sizes colors and modes', async () => { , ); - await expect.element(locator).toMatchScreenshot('loading-spinner-sizes-colors-modes'); + await captureVisual(locator, 'loading-spinner/sizes-colors-modes'); }); diff --git a/packages/@luke-ui/react/src/numeral/__screenshots__/numeral.visual.test.tsx/numeral-formats-alignment-chromium-linux.png b/packages/@luke-ui/react/src/numeral/__screenshots__/numeral.visual.test.tsx/numeral-formats-alignment-chromium-linux.png deleted file mode 100644 index 7cc1911fa65f03da5a64f2d7e2795a6a26da46d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8625 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 C6Ko~` diff --git a/packages/@luke-ui/react/src/numeral/numeral.visual.test.tsx b/packages/@luke-ui/react/src/numeral/numeral.visual.test.tsx index 9ab236d7..f2afeb55 100644 --- a/packages/@luke-ui/react/src/numeral/numeral.visual.test.tsx +++ b/packages/@luke-ui/react/src/numeral/numeral.visual.test.tsx @@ -1,6 +1,6 @@ import type { CSSProperties } from 'react'; -import { expect, test } from 'vite-plus/test'; -import { renderVisual, Stack } from '../test-utils/render-visual.js'; +import { test } from 'vite-plus/test'; +import { captureVisual, renderVisual, Stack } from '../test-utils/render-visual.js'; import { Numeral } from './index.js'; const rowStyle = { @@ -27,5 +27,5 @@ test('formats and alignment', async () => { , ); - await expect.element(locator).toMatchScreenshot('numeral-formats-alignment'); + await captureVisual(locator, 'numeral/formats-alignment'); }); diff --git a/packages/@luke-ui/react/src/test-utils/render-visual.tsx b/packages/@luke-ui/react/src/test-utils/render-visual.tsx index 5763bf60..76819fb5 100644 --- a/packages/@luke-ui/react/src/test-utils/render-visual.tsx +++ b/packages/@luke-ui/react/src/test-utils/render-visual.tsx @@ -22,7 +22,7 @@ const mounted: Array<{ container: HTMLElement; root: Root }> = []; /** * Renders `node` inside the same theme root and icon spritesheet provider the * app (and Storybook) wrap components with, then returns a Vitest locator for - * the mounted subtree ready to pass to `toMatchScreenshot`. + * the mounted subtree ready to pass to `captureVisual`. */ export function renderVisual(node: ReactNode) { const container = document.body.appendChild(document.createElement('div')); @@ -37,6 +37,15 @@ export function renderVisual(node: ReactNode) { return page.elementLocator(container); } +/** Captures a named scene into the revision output selected by the visual runner. */ +export async function captureVisual(locator: Locator, id: string) { + if (!/^[a-z0-9-]+\/[a-z0-9]+(?:-[a-z0-9]+)*$/.test(id)) { + throw new Error(`Visual capture IDs must use a component namespace: ${id}`); + } + const viewport = `${window.innerWidth}x${window.innerHeight}`; + await expect.element(locator).toMatchScreenshot(`${id}__viewport-${viewport}`); +} + /** Unmounts everything rendered by `renderVisual`. Registered globally in `visual-setup.ts`. */ export function cleanupVisual() { for (const { container, root } of mounted) { @@ -125,7 +134,7 @@ export function Grid({ children, columns }: { children: ReactNode; columns: numb /** * Moves keyboard focus to `target` by tabbing, so the browser applies * `:focus-visible` (which a programmatic `.focus()` would not), and asserts focus - * landed. Follow with `toMatchScreenshot` on the scene to capture the focus ring. + * landed. Follow with `captureVisual` on the scene to capture the focus ring. */ export async function focusViaKeyboard(target: Locator) { await userEvent.tab(); diff --git a/packages/@luke-ui/react/src/text-field/__screenshots__/text-field.visual.test.tsx/text-field-adornments-chromium-linux.png b/packages/@luke-ui/react/src/text-field/__screenshots__/text-field.visual.test.tsx/text-field-adornments-chromium-linux.png deleted file mode 100644 index 877393606644feb9b2d894b622e2d2b0faea16c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5552 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 P7#KWV{an^LB{Ts58SCr_ diff --git a/packages/@luke-ui/react/src/text-field/__screenshots__/text-field.visual.test.tsx/text-field-states-chromium-linux.png b/packages/@luke-ui/react/src/text-field/__screenshots__/text-field.visual.test.tsx/text-field-states-chromium-linux.png deleted file mode 100644 index cce357c949aa7c634b7be8598b50c0fbecff1812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14762 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 aY&t5t%eDA6KW1QHVDNPHb6Mw<&;$Vbpz^^0 diff --git a/packages/@luke-ui/react/src/text-field/text-field.visual.test.tsx b/packages/@luke-ui/react/src/text-field/text-field.visual.test.tsx index 6283c400..ad44ba69 100644 --- a/packages/@luke-ui/react/src/text-field/text-field.visual.test.tsx +++ b/packages/@luke-ui/react/src/text-field/text-field.visual.test.tsx @@ -1,6 +1,11 @@ -import { expect, test } from 'vite-plus/test'; +import { test } from 'vite-plus/test'; import { page } from 'vite-plus/test/context'; -import { focusViaKeyboard, renderVisual, Stack } from '../test-utils/render-visual.js'; +import { + captureVisual, + focusViaKeyboard, + renderVisual, + Stack, +} from '../test-utils/render-visual.js'; import { TextField } from './index.js'; test('sizes', async () => { @@ -23,7 +28,7 @@ test('sizes', async () => { , ); - await expect.element(locator).toMatchScreenshot('text-field-sizes'); + await captureVisual(locator, 'text-field/sizes'); }); test('states: default, disabled, read-only, invalid', async () => { @@ -42,7 +47,7 @@ test('states: default, disabled, read-only, invalid', async () => { , ); - await expect.element(locator).toMatchScreenshot('text-field-states'); + await captureVisual(locator, 'text-field/states'); }); test('adornments', async () => { @@ -53,7 +58,7 @@ test('adornments', async () => { , ); - await expect.element(locator).toMatchScreenshot('text-field-adornments'); + await captureVisual(locator, 'text-field/adornments'); }); test('keyboard focus ring', async () => { @@ -64,5 +69,5 @@ test('keyboard focus ring', async () => { ); await focusViaKeyboard(page.getByRole('textbox', { name: 'Focus me' })); - await expect.element(scene).toMatchScreenshot('text-field-focus'); + await captureVisual(scene, 'text-field/focus'); }); diff --git a/packages/@luke-ui/react/src/text/__screenshots__/text.visual.test.tsx/text-line-clamp-transforms-chromium-linux.png b/packages/@luke-ui/react/src/text/__screenshots__/text.visual.test.tsx/text-line-clamp-transforms-chromium-linux.png deleted file mode 100644 index f24471ff4453ad7912a87c9b90f202c005ebb375..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8452 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 { , ); - await expect.element(locator).toMatchScreenshot('text-typography-variants'); + await captureVisual(locator, 'text/typography-variants'); }); test('line clamp and transforms', async () => { @@ -45,5 +45,5 @@ test('line clamp and transforms', async () => { , ); - await expect.element(locator).toMatchScreenshot('text-line-clamp-transforms'); + await captureVisual(locator, 'text/line-clamp-transforms'); }); diff --git a/packages/@luke-ui/react/vitest.config.ts b/packages/@luke-ui/react/vitest.config.ts index 4dcf4c31..ad57728f 100644 --- a/packages/@luke-ui/react/vitest.config.ts +++ b/packages/@luke-ui/react/vitest.config.ts @@ -78,6 +78,11 @@ export default defineConfig({ enabled: true, expect: { toMatchScreenshot: { + resolveScreenshotPath: ({ arg, ext, root }) => + path.join( + process.env.VISUAL_CAPTURE_DIR ?? path.join(root, '.visual-captures'), + `${arg}${ext}`, + ), comparatorName: 'pixelmatch', comparatorOptions: { // Baselines are captured on the same OS/browser as CI, and diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d5a0b8ba..155d6db5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -69,6 +69,9 @@ catalogs: '@types/node': specifier: ^26.0.1 version: 26.0.1 + '@types/pngjs': + specifier: ^6.0.5 + version: 6.0.5 '@types/react': specifier: ^19.2.17 version: 19.2.17 @@ -147,9 +150,15 @@ catalogs: node-html-parser: specifier: ^8.0.4 version: 8.0.4 + pixelmatch: + specifier: ^7.1.0 + version: 7.2.0 playwright: specifier: '*' version: 1.61.1 + pngjs: + specifier: ^7.0.0 + version: 7.0.0 publint: specifier: ^0.3.21 version: 0.3.21 @@ -423,6 +432,9 @@ importers: '@types/node': specifier: 'catalog:' version: 26.0.1 + '@types/pngjs': + specifier: 'catalog:' + version: 6.0.5 '@types/react': specifier: 'catalog:' version: 19.2.17 @@ -456,9 +468,15 @@ importers: node-html-parser: specifier: 'catalog:' version: 8.0.4 + pixelmatch: + specifier: 'catalog:' + version: 7.2.0 playwright: specifier: 'catalog:' version: 1.61.1 + pngjs: + specifier: 'catalog:' + version: 7.0.0 publint: specifier: 'catalog:' version: 0.3.21 @@ -3461,6 +3479,9 @@ packages: '@types/node@26.0.1': resolution: {integrity: sha512-fc3KiUoBt6kie0N9bIW3E47vZsuaMf0PM2AaUpLCLT0s/LvX1nxAim6Fc049cNxODPpGm6qRAuUOB86SkRuPQw==} + '@types/pngjs@6.0.5': + resolution: {integrity: sha512-0k5eKfrA83JOZPppLtS2C7OUtyNAl2wKNxfyYl9Q5g9lPkgBl/9hNyAu6HuEH2J4XmIv2znEpkDd0SaZVxW6iQ==} + '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: @@ -5505,6 +5526,10 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} + pixelmatch@7.2.0: + resolution: {integrity: sha512-xhcb4yHu9sM/G7foGzoLtXYcC0zHEaOXXjRKhGup0fw78Nf2Tkiapv4EQyMzrbcmQPsllAI7DbFY2UT7PlI9Pg==} + hasBin: true + pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} @@ -9038,6 +9063,10 @@ snapshots: dependencies: undici-types: 8.3.0 + '@types/pngjs@6.0.5': + dependencies: + '@types/node': 26.0.1 + '@types/react-dom@19.2.3(@types/react@19.2.17)': dependencies: '@types/react': 19.2.17 @@ -11604,6 +11633,10 @@ snapshots: pirates@4.0.7: {} + pixelmatch@7.2.0: + dependencies: + pngjs: 7.0.0 + pkg-types@1.3.1: dependencies: confbox: 0.1.8 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 87cd48c5..5dbe3478 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -66,6 +66,7 @@ catalog: '@turbo/gen': ^2.10.1 '@types/mdx': ^2.0.14 '@types/node': ^26.0.1 + '@types/pngjs': ^6.0.5 '@types/react': ^19.2.17 '@types/react-dom': ^19.2.3 '@vanilla-extract/css': ^1.21.1 @@ -93,6 +94,8 @@ catalog: nitro: npm:nitro-nightly@3.0.1-20260128-211656-ae83c97e node-html-parser: ^8.0.4 playwright: '*' + pixelmatch: ^7.1.0 + pngjs: ^7.0.0 publint: ^0.3.21 react: ^19.2.7 react-aria-components: ^1.19.0 diff --git a/vite.config.ts b/vite.config.ts index 487f290c..a7883034 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -85,6 +85,7 @@ export default defineConfig({ 'jsx-a11y/prefer-tag-over-role': 'off', 'no-console': 'warn', 'no-unused-vars': 'error', + 'vitest/expect-expect': ['error', { assertFunctionNames: ['captureVisual', 'expect'] }], 'react-hooks-js/config': 'error', 'react-hooks-js/error-boundaries': 'error', 'react-hooks-js/gating': 'error',