diff --git a/.actrc b/.actrc deleted file mode 100644 index 85449b12..00000000 --- a/.actrc +++ /dev/null @@ -1,4 +0,0 @@ -# nektos/act: run .github/workflows locally (bun run ci:local [-j ]). -# Same Ubuntu toolchain image GitHub uses; browser jobs use their own Playwright container. --P ubuntu-latest=catthehacker/ubuntu:act-latest ---artifact-server-path=/tmp/act-artifacts diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml new file mode 100644 index 00000000..2a3a7072 --- /dev/null +++ b/.github/actions/setup/action.yml @@ -0,0 +1,29 @@ +name: Setup +description: Bun + dependencies (cached), optionally Playwright browsers. +inputs: + browsers: + description: "Playwright browsers to install (empty = none)" + default: "" +runs: + using: composite + steps: + - uses: oven-sh/setup-bun@v2 + with: + bun-version-file: package.json + - uses: actions/cache@v6 + with: + path: ~/.bun/install/cache + key: bun-${{ runner.os }}-${{ hashFiles('bun.lock') }} + restore-keys: bun-${{ runner.os }}- + # No postinstall: it would download browsers and install git hooks. + - run: bun install --frozen-lockfile --ignore-scripts && node scripts/fix-ts-symlink.js + shell: bash + # site/package.json pins @playwright/test: the only place the version lives. + - if: inputs.browsers != '' + uses: actions/cache@v6 + with: + path: ~/.cache/ms-playwright + key: pw-${{ runner.os }}-${{ hashFiles('site/package.json') }}-${{ inputs.browsers }} + - if: inputs.browsers != '' + run: cd site && bunx playwright install --with-deps ${{ inputs.browsers }} + shell: bash diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dd0dd611..7b0b679d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,11 +1,13 @@ name: CI -# Fast path: one build shared through artifacts, browser suites sharded across jobs and -# using every core, jobs skipped when the files they cover did not change. Branch rules -# require only "CI ok", so shards can change without touching repository settings. +# PAUSED while the project is pre-stable: disabled in GitHub (gh workflow enable ci.yml to resume, +# then re-add "CI ok" as a required check in the main ruleset). See CONTRIBUTING.md. +# Runner-native (ubuntu-24.04, no containers): one build shared through artifacts, browser suites +# sharded, jobs skipped when the files they cover did not change. Branch rules require only +# "CI ok", so shards can change without touching repository settings. Runs on fork PRs too. on: pull_request: push: - branches: [main, beta, alpha] + branches: [main] workflow_dispatch: inputs: update-snapshots: @@ -23,7 +25,8 @@ permissions: jobs: changes: name: Changed areas - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 + timeout-minutes: 15 permissions: pull-requests: read outputs: @@ -48,9 +51,10 @@ jobs: site: - 'site/**' - secrets: - name: Secret scan - runs-on: ubuntu-latest + build: + name: Validate + build + runs-on: ubuntu-24.04 + timeout-minutes: 15 steps: - uses: actions/checkout@v7 with: @@ -59,44 +63,10 @@ jobs: run: | curl -sSfL https://github.com/gitleaks/gitleaks/releases/download/v8.30.1/gitleaks_8.30.1_linux_x64.tar.gz | tar -xz gitleaks ./gitleaks git --no-banner --redact --config .gitleaks.toml . - - validate: - name: Types, lint, unit, size - if: ${{ !inputs.update-snapshots }} - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v7 - - uses: oven-sh/setup-bun@v2 - with: - bun-version-file: package.json - - uses: actions/cache@v6 - with: - path: ~/.bun/install/cache - key: bun-${{ runner.os }}-${{ hashFiles('bun.lock') }} - restore-keys: bun-${{ runner.os }}- - # No postinstall in CI: it would download browsers and install git hooks. Only the - # TypeScript link svelte-package needs is required. - - run: bun install --frozen-lockfile --ignore-scripts && node scripts/fix-ts-symlink.js - - run: bun run build:pkg + - uses: ./.github/actions/setup + # Builds the package first (phase 0), then types, lint, unit, size. - run: bun run validate - - build: - name: Build package + site - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v7 - - uses: oven-sh/setup-bun@v2 - with: - bun-version-file: package.json - - uses: actions/cache@v6 - with: - path: ~/.bun/install/cache - key: bun-${{ runner.os }}-${{ hashFiles('bun.lock') }} - restore-keys: bun-${{ runner.os }}- - # No postinstall in CI: it would download browsers and install git hooks. Only the - # TypeScript link svelte-package needs is required. - - run: bun install --frozen-lockfile --ignore-scripts && node scripts/fix-ts-symlink.js - - run: bun run build + - run: bun run --cwd site build - uses: actions/upload-artifact@v7 with: name: build @@ -107,32 +77,22 @@ jobs: site/dist/ components: - name: Component tests (${{ matrix.shard }}/4) + name: Component tests (${{ matrix.shard }}/2) needs: changes if: ${{ !inputs.update-snapshots && needs.changes.outputs.package == 'true' }} - runs-on: ubuntu-latest - container: - image: mcr.microsoft.com/playwright:v1.64.0-noble - options: --ipc=host --init - env: - HOME: /root + runs-on: ubuntu-24.04 + timeout-minutes: 15 strategy: fail-fast: false matrix: - shard: [1, 2, 3, 4] + shard: [1, 2] steps: - uses: actions/checkout@v7 - - run: npm i -g --allow-scripts=bun "$(node -p 'require("./package.json").packageManager')" - - uses: actions/cache@v6 + - uses: ./.github/actions/setup with: - path: /root/.bun/install/cache - key: bun-container-${{ hashFiles('bun.lock') }} - restore-keys: bun-container- - # No postinstall in CI: it would download browsers and install git hooks. Only the - # TypeScript link svelte-package needs is required. - - run: bun install --frozen-lockfile --ignore-scripts && node scripts/fix-ts-symlink.js + browsers: chromium - run: bun run build:pkg - - run: bun run --cwd packages/ui test:browser --shard=${{ matrix.shard }}/4 + - run: bun run --cwd packages/ui test:browser --shard=${{ matrix.shard }}/2 - uses: actions/upload-artifact@v7 if: ${{ failure() }} with: @@ -142,17 +102,14 @@ jobs: packages/ui/.vitest/ packages/ui/src/**/__traces__/ - e2e: + site: name: Site ${{ matrix.suite }} (${{ matrix.shard }}/${{ matrix.total }}) needs: [changes, build] # Docs-only or repo-meta changes (AGENTS.md, skills, issue templates) skip the browser suites. if: ${{ !inputs.update-snapshots && (needs.changes.outputs.package == 'true' || needs.changes.outputs.site == 'true') }} - runs-on: ubuntu-latest - container: - image: mcr.microsoft.com/playwright:v1.64.0-noble - options: --ipc=host --init + runs-on: ubuntu-24.04 + timeout-minutes: 15 env: - HOME: /root E2E_PREBUILT: "1" strategy: fail-fast: false @@ -160,24 +117,17 @@ jobs: # Playwright splits shards by test count, not cost: the per-route a11y tests (3 axe # passes each) get their own shards so no job collects all of them. include: - - { suite: e2e, projects: "--project=desktop --project=mobile --project=iphone", shard: 1, total: 3 } - - { suite: e2e, projects: "--project=desktop --project=mobile --project=iphone", shard: 2, total: 3 } - - { suite: e2e, projects: "--project=desktop --project=mobile --project=iphone", shard: 3, total: 3 } - - { suite: a11y, projects: "--project=a11y", shard: 1, total: 4 } - - { suite: a11y, projects: "--project=a11y", shard: 2, total: 4 } - - { suite: a11y, projects: "--project=a11y", shard: 3, total: 4 } - - { suite: a11y, projects: "--project=a11y", shard: 4, total: 4 } + - { suite: e2e, projects: "--project=desktop --project=mobile --project=iphone", browsers: chromium webkit, shard: 1, total: 2 } + - { suite: e2e, projects: "--project=desktop --project=mobile --project=iphone", browsers: chromium webkit, shard: 2, total: 2 } + - { suite: a11y, projects: "--project=a11y", browsers: chromium, shard: 1, total: 3 } + - { suite: a11y, projects: "--project=a11y", browsers: chromium, shard: 2, total: 3 } + - { suite: a11y, projects: "--project=a11y", browsers: chromium, shard: 3, total: 3 } steps: - uses: actions/checkout@v7 - - run: npm i -g --allow-scripts=bun "$(node -p 'require("./package.json").packageManager')" - - uses: actions/cache@v6 + # The iphone project runs on WebKit. + - uses: ./.github/actions/setup with: - path: /root/.bun/install/cache - key: bun-container-${{ hashFiles('bun.lock') }} - restore-keys: bun-container- - # No postinstall in CI: it would download browsers and install git hooks. Only the - # TypeScript link svelte-package needs is required. - - run: bun install --frozen-lockfile --ignore-scripts && node scripts/fix-ts-symlink.js + browsers: ${{ matrix.browsers }} - uses: actions/download-artifact@v8 with: name: build @@ -196,15 +146,13 @@ jobs: name: Visual regression (${{ matrix.suite }}) needs: [changes, build] # Pixels only change when code, styles or the site change; always run when regenerating. + # Baselines are rendered only here (ubuntu-24.04 pinned: fonts/libs come from the image). if: ${{ inputs.update-snapshots || needs.changes.outputs.package == 'true' || needs.changes.outputs.site == 'true' }} - runs-on: ubuntu-latest - container: - image: mcr.microsoft.com/playwright:v1.64.0-noble - options: --ipc=host --init + runs-on: ubuntu-24.04 + timeout-minutes: 15 permissions: contents: write env: - HOME: /root E2E_PREBUILT: "1" strategy: fail-fast: false @@ -212,15 +160,9 @@ jobs: suite: [components, site] steps: - uses: actions/checkout@v7 - - run: npm i -g --allow-scripts=bun "$(node -p 'require("./package.json").packageManager')" - - uses: actions/cache@v6 + - uses: ./.github/actions/setup with: - path: /root/.bun/install/cache - key: bun-container-${{ hashFiles('bun.lock') }} - restore-keys: bun-container- - # No postinstall in CI: it would download browsers and install git hooks. Only the - # TypeScript link svelte-package needs is required. - - run: bun install --frozen-lockfile --ignore-scripts && node scripts/fix-ts-symlink.js + browsers: chromium - uses: actions/download-artifact@v8 with: name: build @@ -241,7 +183,6 @@ jobs: - name: Commit updated baselines if: ${{ inputs.update-snapshots }} run: | - git config --global --add safe.directory "$GITHUB_WORKSPACE" git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" git add -A '**/__screenshots__/**' @@ -252,22 +193,15 @@ jobs: # Fork PRs get no secrets; they still get the full test matrix above. if: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository }} needs: build - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 + timeout-minutes: 15 permissions: contents: read pull-requests: write steps: - uses: actions/checkout@v7 - - uses: oven-sh/setup-bun@v2 - with: - bun-version-file: package.json - - uses: actions/cache@v6 - with: - path: ~/.bun/install/cache - key: bun-${{ runner.os }}-${{ hashFiles('bun.lock') }} - restore-keys: bun-${{ runner.os }}- # Puts the pinned wrangler (site devDependency) on the path; the action would try npm. - - run: bun install --frozen-lockfile --ignore-scripts + - uses: ./.github/actions/setup - uses: actions/download-artifact@v8 with: name: build @@ -290,8 +224,9 @@ jobs: name: CI ok # The single required check. Skipped jobs (path filters) count as passing; failures don't. if: ${{ always() }} - needs: [secrets, validate, build, components, e2e, visual] - runs-on: ubuntu-latest + needs: [build, components, site, visual] + runs-on: ubuntu-24.04 + timeout-minutes: 15 steps: - name: All required jobs passed or were skipped run: | diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml new file mode 100644 index 00000000..0be5edc6 --- /dev/null +++ b/.github/workflows/pr-title.yml @@ -0,0 +1,36 @@ +name: PR title +# Squash merges use the PR title as the commit subject on main, so it must follow +# Conventional Commits. Separate from CI so editing a title doesn't rerun the test suites. +on: + pull_request: + types: [opened, edited, synchronize, reopened] + +permissions: + contents: read + +jobs: + pr-title: + name: PR title + runs-on: ubuntu-24.04 + timeout-minutes: 15 + permissions: + pull-requests: read + steps: + - uses: amannn/action-semantic-pull-request@v6 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + types: | + feat + fix + docs + style + refactor + perf + test + build + ci + chore + revert + requireScope: false + subjectPattern: ^(?![A-Z]).+$ diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 04d51010..3bc91ee5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,20 +1,11 @@ name: Release -# Release channels (npm dist-tags), one branch each: -# main → latest 1.2.0 docs: https://ui.codeatlas.com.br -# beta → beta 1.3.0-beta.0 docs: https://beta.codeatlas-ui.pages.dev -# alpha → alpha 2.0.0-alpha.0 docs: https://alpha.codeatlas-ui.pages.dev -# beta/alpha run in Changesets prerelease mode (.changeset/pre.json, tag = branch name). -# On every push to a channel branch: -# - pending changesets → opens/updates the "Version Packages ()" PR; -# - that PR merged → publishes to npm under the channel's dist-tag, with provenance via -# Trusted Publishing (OIDC, no token), tags, creates the GitHub Release; -# - always, in parallel → deploys that channel's docs. -# Only commits that passed CI reach these branches (ruleset requires "CI ok"), so nothing -# here re-runs lint/types/tests. The tarball smoke test runs only right before a publish. +# A tag @codeatlasdev/ui@X.Y.Z (pushed by `bun run release:tag`) publishes that exact version to +# npm with provenance (Trusted Publishing, OIDC) and deploys the docs. Stable → dist-tag latest + +# ui.codeatlas.com.br; X.Y.Z-beta.N → dist-tag beta + beta.codeatlas-ui.pages.dev (same for any +# prerelease id). Nothing runs on branch pushes. Keep this filename: npm trusts release.yml. on: push: - branches: [main, beta, alpha] - workflow_dispatch: + tags: ["@codeatlasdev/ui@*"] concurrency: group: release-${{ github.ref_name }} @@ -24,74 +15,59 @@ permissions: contents: read jobs: - release: - runs-on: ubuntu-latest + publish: + runs-on: ubuntu-24.04 + timeout-minutes: 15 environment: npm permissions: contents: write - pull-requests: write id-token: write # npm Trusted Publishing + provenance + outputs: + channel: ${{ steps.meta.outputs.channel }} steps: - uses: actions/checkout@v7 - - uses: oven-sh/setup-bun@v2 - with: - bun-version-file: package.json - - uses: actions/cache@v6 - with: - path: ~/.bun/install/cache - key: bun-${{ runner.os }}-${{ hashFiles('bun.lock') }} - restore-keys: bun-${{ runner.os }}- - - run: bun install --frozen-lockfile --ignore-scripts && node scripts/fix-ts-symlink.js + - uses: ./.github/actions/setup # After install: setup-node's registry-url writes an .npmrc with a placeholder token - # that bun also reads, which stalled the install for 13 minutes. + # that bun also reads, which stalled the install. Trusted Publishing needs npm >= 11.5.1. - uses: actions/setup-node@v7 with: node-version: 24 registry-url: https://registry.npmjs.org - # Trusted Publishing needs npm >= 11.5.1. - run: npm i -g npm@latest - # A prerelease must never reach `latest`, and a channel branch must be in its pre mode. - - name: Channel guard + - id: meta run: | - channel="${GITHUB_REF_NAME}" - tag=$(node -p 'try { require("./.changeset/pre.json").tag } catch { "" }') - if [ "$channel" = "main" ] && [ -n "$tag" ]; then - echo "::error::.changeset/pre.json (tag $tag) is on main. Run 'bunx changeset pre exit' on the channel branch before merging it."; exit 1 + v=$(node -p 'require("./packages/ui/package.json").version') + [ "$GITHUB_REF_NAME" = "@codeatlasdev/ui@$v" ] || { echo "::error::tag $GITHUB_REF_NAME != package version $v"; exit 1; } + case "$v" in *-*) channel=$(echo "$v" | sed -E 's/^[^-]+-([A-Za-z]+).*$/\1/');; *) channel=latest;; esac + if [ "$channel" = latest ]; then + git fetch -q origin main + git merge-base --is-ancestor "$GITHUB_SHA" origin/main || { echo "::error::stable tag must point to a commit on main"; exit 1; } fi - if [ "$channel" != "main" ] && [ "$tag" != "$channel" ]; then - echo "::error::Branch $channel must be in prerelease mode: bunx changeset pre enter $channel"; exit 1 - fi - - id: changesets - uses: changesets/action@v2 - with: - pr-title: "chore: version packages (${{ github.ref_name }})" - commit-message: "chore: version packages (${{ github.ref_name }})" - version-script: bun run version - publish-script: bun run release:ci - create-github-releases: true - env: - NPM_CONFIG_PROVENANCE: "true" + echo "channel=$channel" >> "$GITHUB_OUTPUT" + - run: bun run build:pkg && node scripts/release.js --smoke + - working-directory: packages/ui + run: npm publish --provenance --access public --tag ${{ steps.meta.outputs.channel }} + - env: + GH_TOKEN: ${{ github.token }} + run: | + v=${GITHUB_REF_NAME#@codeatlasdev/ui@} + bun scripts/changelog-notes.ts "$v" > /tmp/notes.md + gh release create "$GITHUB_REF_NAME" --title "$GITHUB_REF_NAME" --notes-file /tmp/notes.md $([ "${{ steps.meta.outputs.channel }}" = latest ] || echo --prerelease) site: - runs-on: ubuntu-latest + needs: publish + runs-on: ubuntu-24.04 + timeout-minutes: 15 environment: - name: ${{ github.ref_name == 'main' && 'production' || github.ref_name }} - url: ${{ github.ref_name == 'main' && 'https://ui.codeatlas.com.br' || format('https://{0}.codeatlas-ui.pages.dev', github.ref_name) }} + name: ${{ needs.publish.outputs.channel == 'latest' && 'production' || needs.publish.outputs.channel }} + url: ${{ needs.publish.outputs.channel == 'latest' && 'https://ui.codeatlas.com.br' || format('https://{0}.codeatlas-ui.pages.dev', needs.publish.outputs.channel) }} steps: - uses: actions/checkout@v7 - - uses: oven-sh/setup-bun@v2 - with: - bun-version-file: package.json - - uses: actions/cache@v6 - with: - path: ~/.bun/install/cache - key: bun-${{ runner.os }}-${{ hashFiles('bun.lock') }} - restore-keys: bun-${{ runner.os }}- - - run: bun install --frozen-lockfile --ignore-scripts && node scripts/fix-ts-symlink.js + - uses: ./.github/actions/setup - run: bun run build - uses: cloudflare/wrangler-action@v4 with: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} workingDirectory: site - command: pages deploy dist --project-name codeatlas-ui --branch ${{ github.ref_name }} + command: pages deploy dist --project-name codeatlas-ui --branch ${{ needs.publish.outputs.channel == 'latest' && 'main' || needs.publish.outputs.channel }} diff --git a/.github/workflows/version.yml b/.github/workflows/version.yml new file mode 100644 index 00000000..7504c602 --- /dev/null +++ b/.github/workflows/version.yml @@ -0,0 +1,37 @@ +name: Version +# Pending changesets on main → "chore: version packages" PR. Merging it only bumps +# packages/ui/package.json + CHANGELOG.md; publishing happens when a maintainer pushes the tag +# (bun run release:tag). The PR is opened with GITHUB_TOKEN, which starts no CI run, so CI is +# dispatched explicitly on its branch; the check attaches to the head commit and satisfies "CI ok". +on: + push: + branches: [main] + +concurrency: + group: version-main + cancel-in-progress: false + +permissions: + contents: read + +jobs: + version: + runs-on: ubuntu-24.04 + timeout-minutes: 10 + permissions: + contents: write + pull-requests: write + actions: write + steps: + - uses: actions/checkout@v7 + - uses: ./.github/actions/setup + - id: changesets + uses: changesets/action@v2 + with: + pr-title: "chore: version packages" + commit-message: "chore: version packages" + version-script: bun run version + - if: steps.changesets.outputs.pr-number != '' + env: + GH_TOKEN: ${{ github.token }} + run: gh workflow run ci.yml --ref changeset-release/main diff --git a/AGENTS.md b/AGENTS.md index 5bb8ed42..7a7b8c55 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -36,6 +36,7 @@ site/ → Astro site (landing + MDX docs + templates) at ui.code - **Contributor PRs come first:** if an issue already has an open PR (a fork included), `issue:start` refuses and names it. Review it, approve its CI run (first-time contributors need approval), suggest changes on the PR, and land theirs. Never open a competing PR, and never push to a contributor's branch without saying so on the PR. - **Check first:** `bun run issue:status`. Skip issues labeled `in progress` by someone else. Re-read the issue against current `main`: if it is already fixed, prove it with a passing test, comment the evidence and close it. - **Test first** (critical rule 0): failing regression test, then the fix, then the passing run. Both outputs go in the PR body. A test you did not run proves nothing: run every test you add or change (Playwright included) before pushing. +- **CI is paused** (pre-stable): `ci.yml` is disabled and `CI ok` is not required on `main`; the pre-push `validate` is the gate, and run the browser suites locally when you touch them. Resume: `gh workflow enable ci.yml` + re-add `CI ok` to the `main` ruleset. - **Gates are real:** never push with `--no-verify` or `LEFTHOOK=0`. A gate that fails only under load is a bug to fix (#73 was exponential regex backtracking; #75, #76, #81 were real races), not to bypass. Open an issue for it. - **Done:** `bun run validate`, changeset when the package changes, docs when behavior changes; leave the PR as draft. A maintainer lands it with `sh scripts/issue-land.sh `: rebase on `main` (generated files are rebuilt, real conflicts stop it), validate, regenerate visual baselines on CI, wait until every check on the final head passed (`scripts/pr-gate.ts`), squash-merge, `issue:done`. @@ -51,8 +52,7 @@ Unit tests run on `bun test` (repo root, `bunfig.toml`); component and visual te | `bun run test:unit` | `bun test` on `packages/ui/tests/*.test.ts` (fails any test without an `expect`) | | `bun run test:browser` | Vitest `browser` project (real Chromium, axe) | | `bun run test:e2e` / `test:a11y` | Playwright against the static site (build + preview) | -| `bun run test:vrt` | visual regression via Docker (Linux-only baselines, compare only) | -| `bun run test:vrt:update` | regenerate baselines on CI (native amd64) for the pushed branch and pull the bot commit; `test:vrt:update:local` does it in Docker (slow on Apple Silicon) | +| `bun run test:vrt:update` | regenerate baselines on CI (the only place they are rendered, no Docker) for the pushed branch and pull the bot commit | | `bun run test:status` | live and dead test runs of this repo, with their browser count | | `bun run test:reap` | kill the browsers of runs whose runner died (this repo only) | @@ -61,7 +61,7 @@ Unit tests run on `bun test` (repo root, `bunfig.toml`); component and visual te - tears down the whole test process group on exit, Ctrl+C, SIGTERM or SIGHUP; - at the start of every run, kills browsers left by runs whose runner died (SIGKILL, closed terminal, killed agent job). -Ownership is explicit: only processes carrying the tag of a dead run of this repo are touched. Other projects on the machine (`../ac`, …) share `~/Library/Caches/ms-playwright`; never kill Playwright browsers by name or path. To pass extra args: `bun run test:browser -- src/lib/components/Button`. Local runs use half the cores (`maxWorkers`, Playwright `workers: "50%"`); behavior tests use the headless shell, VRT uses full Chromium so pixels match the Docker baselines. +Ownership is explicit: only processes carrying the tag of a dead run of this repo are touched. Other projects on the machine (`../ac`, …) share `~/Library/Caches/ms-playwright`; never kill Playwright browsers by name or path. To pass extra args: `bun run test:browser -- src/lib/components/Button`. Local runs use a quarter of the cores (`maxWorkers`, Playwright `workers: "25%"`); behavior tests use the headless shell, VRT uses full Chromium so pixels match the CI baselines. Naming conventions: - `*.test.ts` in `packages/ui/tests/`: unit test on `bun:test` (`mock`/`spyOn`/`jest.useFakeTimers`; DOM only through happy-dom's `GlobalRegistrator` inside that file; fresh module via `import("…?fresh=n")`). Types checked by `bun --check`. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 510bea99..504273b8 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,48 +1,90 @@ -# Contributor Covenant Code of Conduct +# Contributor Covenant 3.0 Code of Conduct ## Our Pledge -We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socioeconomic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. +We pledge to make our community welcoming, safe, and equitable for all. -We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. +We are committed to fostering an environment that respects and promotes the dignity, rights, and contributions of all individuals, regardless of characteristics including race, ethnicity, caste, color, age, physical characteristics, neurodiversity, disability, sex or gender, gender identity or expression, sexual orientation, language, philosophy or religion, national or social origin, socio-economic position, level of education, or other status. The same privileges of participation are extended to everyone who participates in good faith and in accordance with this Covenant. -## Our Standards -Examples of behavior that contributes to a positive environment: +## Encouraged Behaviors -- Demonstrating empathy and kindness toward other people -- Being respectful of differing opinions, viewpoints, and experiences -- Giving and gracefully accepting constructive feedback -- Accepting responsibility and apologizing to those affected by our mistakes -- Focusing on what is best not just for us as individuals, but for the overall community +While acknowledging differences in social norms, we all strive to meet our community's expectations for positive behavior. We also understand that our words and actions may be interpreted differently than we intend based on culture, background, or native language. -Examples of unacceptable behavior: +With these considerations in mind, we agree to behave mindfully toward each other and act in ways that center our shared values, including: -- The use of sexualized language or imagery, and sexual attention or advances of any kind -- Trolling, insulting or derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information without their explicit permission -- Other conduct which could reasonably be considered inappropriate in a professional setting +1. Respecting the **purpose of our community**, our activities, and our ways of gathering. +2. Engaging **kindly and honestly** with others. +3. Respecting **different viewpoints** and experiences. +4. **Taking responsibility** for our actions and contributions. +5. Gracefully giving and accepting **constructive feedback**. +6. Committing to **repairing harm** when it occurs. +7. Behaving in other ways that promote and sustain the **well-being of our community**. -## Engineering Standards -Quality is part of how we treat each other: shipping a "fix" that does not fix anything costs everyone time. In this project: +## Restricted Behaviors -- Every bug fix starts with a regression test that reproduces the problem and fails on the current code. The fix is done when that test passes. -- Tests prove behavior. We do not write tests to pad coverage, and we remove tests that cannot fail for a plausible bug. +We agree to restrict the following behaviors in our community. Instances, threats, and promotion of these behaviors are violations of this Code of Conduct. -## Enforcement Responsibilities +1. **Harassment.** Violating explicitly expressed boundaries or engaging in unnecessary personal attention after any clear request to stop. +2. **Character attacks.** Making insulting, demeaning, or pejorative comments directed at a community member or group of people. +3. **Stereotyping or discrimination.** Characterizing anyone’s personality or behavior on the basis of immutable identities or traits. +4. **Sexualization.** Behaving in a way that would generally be considered inappropriately intimate in the context or purpose of the community. +5. **Violating confidentiality**. Sharing or acting on someone's personal or private information without their permission. +6. **Endangerment.** Causing, encouraging, or threatening violence or other harm toward any person or group. +7. Behaving in other ways that **threaten the well-being** of our community. -Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. +### Other Restrictions -## Scope +1. **Misleading identity.** Impersonating someone else for any reason, or pretending to be someone else to evade enforcement actions. +2. **Failing to credit sources.** Not properly crediting the sources of content you contribute. +3. **Promotional materials**. Sharing marketing or other commercial content in a way that is outside the norms of the community. +4. **Irresponsible communication.** Failing to responsibly present content which includes, links or describes any other restricted behaviors. + + +## Reporting an Issue + +Tensions can occur between community members even when they are trying their best to collaborate. Not every conflict represents a code of conduct violation, and this Code of Conduct reinforces encouraged behaviors and norms that can help avoid conflicts and minimize harm. + +When an incident does occur, it is important to report it promptly. To report a possible violation, email **contato@codeatlas.com.br**. The maintainers of codeatlasdev/ui review and investigate every report. + +Community Moderators take reports of violations seriously and will make every effort to respond in a timely manner. They will investigate all reports of code of conduct violations, reviewing messages, logs, and recordings, or interviewing witnesses and other participants. Community Moderators will keep investigation and enforcement actions as transparent as possible while prioritizing safety and confidentiality. In order to honor these values, enforcement actions are carried out in private with the involved parties, but communicating to the whole community may be part of a mutually agreed upon resolution. + + +## Addressing and Repairing Harm -This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. +If an investigation by the Community Moderators finds that this Code of Conduct has been violated, the following enforcement ladder may be used to determine how best to repair harm, based on the incident's impact on the individuals involved and the community as a whole. Depending on the severity of a violation, lower rungs on the ladder may be skipped. -## Enforcement +1) Warning + 1) Event: A violation involving a single incident or series of incidents. + 2) Consequence: A private, written warning from the Community Moderators. + 3) Repair: Examples of repair include a private written apology, acknowledgement of responsibility, and seeking clarification on expectations. +2) Temporarily Limited Activities + 1) Event: A repeated incidence of a violation that previously resulted in a warning, or the first incidence of a more serious violation. + 2) Consequence: A private, written warning with a time-limited cooldown period designed to underscore the seriousness of the situation and give the community members involved time to process the incident. The cooldown period may be limited to particular communication channels or interactions with particular community members. + 3) Repair: Examples of repair may include making an apology, using the cooldown period to reflect on actions and impact, and being thoughtful about re-entering community spaces after the period is over. +3) Temporary Suspension + 1) Event: A pattern of repeated violation which the Community Moderators have tried to address with warnings, or a single serious violation. + 2) Consequence: A private written warning with conditions for return from suspension. In general, temporary suspensions give the person being suspended time to reflect upon their behavior and possible corrective actions. + 3) Repair: Examples of repair include respecting the spirit of the suspension, meeting the specified conditions for return, and being thoughtful about how to reintegrate with the community when the suspension is lifted. +4) Permanent Ban + 1) Event: A pattern of repeated code of conduct violations that other steps on the ladder have failed to resolve, or a violation so serious that the Community Moderators determine there is no way to keep the community safe with this person as a member. + 2) Consequence: Access to all community spaces, tools, and communication channels is removed. In general, permanent bans should be rarely used, should have strong reasoning behind them, and should only be resorted to if working through other remedies has failed to change the behavior. + 3) Repair: There is no possible repair in cases of this severity. + +This enforcement ladder is intended as a guideline. It does not limit the ability of Community Managers to use their discretion and judgment, in keeping with the best interests of our community. + + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public or other spaces. Examples of representing our community include using an official email address, posting via an official social media account, or acting as an appointed representative at an online or offline event. -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported at **contato@codeatlas.com.br**. All complaints will be reviewed and investigated promptly and fairly. ## Attribution -This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 2.1. +This Code of Conduct is adapted from the Contributor Covenant, version 3.0, permanently available at [https://www.contributor-covenant.org/version/3/0/](https://www.contributor-covenant.org/version/3/0/). + +Contributor Covenant is stewarded by the Organization for Ethical Source and licensed under CC BY-SA 4.0. To view a copy of this license, visit [https://creativecommons.org/licenses/by-sa/4.0/](https://creativecommons.org/licenses/by-sa/4.0/) + +For answers to common questions about Contributor Covenant, see the FAQ at [https://www.contributor-covenant.org/faq](https://www.contributor-covenant.org/faq). Translations are provided at [https://www.contributor-covenant.org/translations](https://www.contributor-covenant.org/translations). Additional enforcement and community guideline resources can be found at [https://www.contributor-covenant.org/resources](https://www.contributor-covenant.org/resources). The enforcement ladder was inspired by the work of [Mozilla’s code of conduct team](https://github.com/mozilla/inclusion). + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 653f7809..01eae14a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,11 +23,11 @@ git clone https://github.com/codeatlasdev/ui.git cd ui bun install -# Start the docs site (predev builds the package dist first) +# Package watcher + docs site in one command (builds dist/ once if missing) bun dev ``` -> The site consumes `@codeatlasdev/ui` from `packages/ui/dist`, so `build:pkg` is required at least once. `predev` runs it automatically on every `bun dev`. To pick up library edits while the dev server runs, keep `bun run --cwd packages/ui build:watch` open in a second terminal. +> The site consumes `@codeatlasdev/ui` from `packages/ui/dist`; `bun dev` keeps it current with `svelte-package --watch`, so library edits reach the running site. ## Project structure @@ -89,7 +89,9 @@ If you find the issue is already fixed or obsolete, prove it with a test that pa **Test first.** A bug fix starts with a regression test that reproduces the problem: run it, watch it fail on the current code, then fix until it passes, and put that fail-before/pass-after evidence in the PR. Tests prove behavior; tests that only pad coverage (wiring, copies, mock echoes, incidental defaults) are rejected. -CI (`.github/workflows/ci.yml`) runs the same gates. Locally, both must exit with code 0: +> **CI is paused** while the project is pre-stable: the `CI` workflow is disabled (`gh workflow disable ci.yml`) and `CI ok` is no longer a required check on `main`. The local gates are the gate: the pre-push hook runs `bun run validate`; run the browser suites (`bun run test:browser`, `test:e2e`) yourself when a change touches them. PR titles are still checked (`pr-title.yml`), and releases still run on tags. To turn CI back on: `gh workflow enable ci.yml` and add `CI ok` back as a required status check in the `main` ruleset. + +CI (`.github/workflows/ci.yml`, when enabled) runs the same gates. Locally, both must exit with code 0: ```bash bun run validate # generated themes, bun --check + svelte-check + astro check, Biome, unit tests, size budget @@ -100,13 +102,15 @@ Unit tests run on `bun test` (`bunfig.toml` points it at `packages/ui/tests`); c Browser tests always run through the package scripts (`bun run test:browser`, `test:e2e`, …), never a bare `vitest` or `playwright test`. The scripts go through `scripts/test-run.ts`, which tags this repo's browsers, tears them down on exit or Ctrl+C, and cleans up after runs that were killed hard. `bun run test:status` shows runs, `bun run test:reap` cleans dead ones. It never touches other projects' Playwright browsers. -Visual regression baselines are Linux-only, rendered in `mcr.microsoft.com/playwright:v1.64.0-noble` on amd64. `bun run test:vrt` compares locally in Docker. To regenerate, push your branch and run `bun run test:vrt:update`: it dispatches the CI job with `update-snapshots`, which renders on native amd64, commits the `__screenshots__/` changes to your branch and pulls them back (a few minutes, nothing runs locally). `bun run test:vrt:update:local` does the same in local Docker, much slower on Apple Silicon (amd64 emulation). Review the changed images before merging. +Git hooks (lefthook, installed by `bun install`): pre-commit formats staged files with Biome, commit-msg checks the message, pre-push runs `bun run validate`. Browser suites (`bun run test:browser`, `test:e2e`) run on CI and on demand. + +Visual regression baselines are rendered only on CI (`ubuntu-24.04`); no Docker. To regenerate, push your branch and run `bun run test:vrt:update`: it dispatches the CI job with `update-snapshots`, which commits the `__screenshots__/` changes to your branch and pulls them back. Review the changed images before merging. Fix any errors before opening a pull request. PRs with failing checks will not be merged. ## Commit style -This project uses [Conventional Commits](https://www.conventionalcommits.org): +This project uses [Conventional Commits v1.0.0](https://www.conventionalcommits.org/en/v1.0.0/), checked by the commit-msg hook. Allowed types: `feat` `fix` `docs` `style` `refactor` `perf` `test` `build` `ci` `chore` `revert`, optional `(scope)`, `!` for breaking changes. PRs are squash-merged and the PR title becomes the commit on `main`, so CI checks PR titles with the same rules. ``` feat: add GlassChip component @@ -120,38 +124,18 @@ Use the imperative mood in the subject line. Keep it under 72 characters. ## Release flow -Releases are fully automated with Changesets and GitHub Actions (`.github/workflows/release.yml`). Nobody publishes from a laptop. +Publishing happens only in CI (`.github/workflows/release.yml`), triggered by a version tag. Nobody publishes from a laptop. 1. Every PR that changes the published package adds a changeset: `bun changeset`, pick the bump, write the user-facing note. -2. Merging to a channel branch makes the Release workflow open (or update) a **Version Packages** PR with the bumped version and CHANGELOG. -3. Merging that PR publishes to npm with [provenance](https://docs.npmjs.com/generating-provenance-statements) through Trusted Publishing (OIDC, no npm token stored anywhere), pushes the git tag, creates the GitHub Release and deploys the docs. - -`bun run release` runs the same gate locally: lint, type check, build, tarball smoke test (packs the library into a fresh SvelteKit app and builds it) and `changeset status`. +2. On `main`, the Version workflow opens (or updates) a **chore: version packages** PR with the bumped version and CHANGELOG. +3. Merge it. +4. On an up-to-date, clean `main`, run `bun run release:tag`: it pushes the tag `@codeatlasdev/ui@X.Y.Z`. +5. The Release workflow publishes to npm with [provenance](https://docs.npmjs.com/generating-provenance-statements) through Trusted Publishing (OIDC, no npm token), creates the GitHub Release from the CHANGELOG and deploys the docs to ui.codeatlas.com.br. -### Release channels +Prereleases: on a branch run `bunx changeset pre enter beta`, `bun run version`, commit, push and tag `@codeatlasdev/ui@X.Y.Z-beta.N`. It publishes under the `beta` dist-tag (never `latest`) and deploys the docs to beta.codeatlas-ui.pages.dev. -| Branch | npm dist-tag | Example | Install | Docs | -|---|---|---|---|---| -| `main` | `latest` | `1.2.0` | `bun add @codeatlasdev/ui` | ui.codeatlas.com.br | -| `beta` | `beta` | `1.3.0-beta.2` | `bun add @codeatlasdev/ui@beta` | beta.codeatlas-ui.pages.dev | -| `alpha` | `alpha` | `2.0.0-alpha.0` | `bun add @codeatlasdev/ui@alpha` | alpha.codeatlas-ui.pages.dev | - -- **alpha:** breaking or experimental work for the next major. **beta:** feature-complete, API frozen, hunting bugs. **latest:** stable. -- Open a channel by branching from `main` and entering prerelease mode once: `git switch -c beta && bunx changeset pre enter beta`, commit `.changeset/pre.json`, push. -- Promote a channel by exiting prerelease mode on it (`bunx changeset pre exit`), then merging it into `main`. The workflow refuses to run on `main` while `.changeset/pre.json` exists, so a prerelease can never become `latest` by accident. -- Fixes land on `main` first and are merged forward into `beta`/`alpha`. +`bun run release` runs the local gate: lint, type check, build, tarball smoke test (packs the library into a fresh SvelteKit app and builds it) and `changeset status`. ## Thank you Every contribution matters, whether it's a typo fix, a new component, or a performance improvement. We appreciate it. - -## Docs site deploy - -The site is static and hosted on Cloudflare Pages (project `codeatlas-ui`, domain `ui.codeatlas.com.br`). Maintainers deploy from their machine: - -```bash -bun run site:deploy # production -bun run site:deploy --branch my-pr # preview at https://my-pr.codeatlas-ui.pages.dev -``` - -It needs `CLOUDFLARE_API_TOKEN` (Pages: Edit) and `CLOUDFLARE_ACCOUNT_ID` in your environment. Never commit them. diff --git a/lefthook.yml b/lefthook.yml index 8569a078..a17fc9c8 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -1,16 +1,16 @@ -# Git hooks. Commits are never blocked; only `git push` runs the gate. -# Same checks as CI (.github/workflows/ci.yml), scoped to what the push changes. -# Skip once with `LEFTHOOK=0 git push` or `git push --no-verify`. +# Git hooks. pre-commit formats staged files, commit-msg enforces Conventional Commits, +# pre-push runs `bun run validate` (types, lint, unit, build, size). Browser suites run on CI. +pre-commit: + jobs: + - name: biome (staged) + glob: "*.{ts,js,json}" + run: bunx biome check --write --no-errors-on-unmatched {staged_files} + stage_fixed: true +commit-msg: + jobs: + - name: conventional commit + run: bun scripts/commit-msg.ts {1} pre-push: - parallel: false jobs: - name: validate (themes, types, lint, unit, build, size) run: bun run validate - - name: component tests (Chromium) - # Only when the pushed commits touch the package or shared tooling. - files: bun scripts/push-files.ts - glob: - - "packages/**" - - "package.json" - - "bun.lock" - run: bun run test:browser diff --git a/package.json b/package.json index aac37f16..8647d0af 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "site" ], "scripts": { - "dev": "bun run --cwd site dev", + "dev": "bun scripts/dev.ts", "build": "bun run --cwd packages/ui build && bun run --cwd site build", "build:pkg": "bun run --cwd packages/ui build", "preview": "bun run --cwd site preview", @@ -25,10 +25,10 @@ "changeset": "changeset", "version": "changeset version && bun install --lockfile-only", "release": "node scripts/release.js", + "release:tag": "bun scripts/release-tag.ts", "clean": "rm -rf packages/ui/dist site/dist site/.astro", "lint:fix": "biome check --write .", "validate": "bun scripts/validate.ts", - "predev": "bun run build:pkg", "postinstall": "node scripts/fix-ts-symlink.js && node scripts/install-hooks.js && bunx playwright install chromium", "test": "bun run test:unit && bun run test:browser && bun run test:e2e", "test:unit": "bun run --cwd packages/ui test:unit", @@ -39,12 +39,7 @@ "issue:start": "bun scripts/issue.ts start", "issue:status": "bun scripts/issue.ts status", "issue:done": "bun scripts/issue.ts done", - "test:vrt": "sh scripts/vrt.sh", "test:vrt:update": "sh scripts/vrt-update-ci.sh", - "test:vrt:update:local": "sh scripts/vrt.sh --update", - "site:deploy": "sh scripts/deploy-site.sh", - "release:ci": "bun run build:pkg && node scripts/release.js --smoke && changeset publish", - "ci:local": "act pull_request", "test:reap": "bun scripts/test-run.ts --reap", "test:status": "bun scripts/test-run.ts --status" }, diff --git a/packages/ui/src/lib/components/Kbd/__screenshots__/Kbd.vrt.test.ts/Kbd-dark-glass-chromium-linux.png b/packages/ui/src/lib/components/Kbd/__screenshots__/Kbd.vrt.test.ts/Kbd-dark-glass-chromium-linux.png index fb061898..5ff0aec8 100644 Binary files a/packages/ui/src/lib/components/Kbd/__screenshots__/Kbd.vrt.test.ts/Kbd-dark-glass-chromium-linux.png and b/packages/ui/src/lib/components/Kbd/__screenshots__/Kbd.vrt.test.ts/Kbd-dark-glass-chromium-linux.png differ diff --git a/packages/ui/src/lib/components/Kbd/__screenshots__/Kbd.vrt.test.ts/Kbd-dark-solid-chromium-linux.png b/packages/ui/src/lib/components/Kbd/__screenshots__/Kbd.vrt.test.ts/Kbd-dark-solid-chromium-linux.png index 485595f1..8ad262b8 100644 Binary files a/packages/ui/src/lib/components/Kbd/__screenshots__/Kbd.vrt.test.ts/Kbd-dark-solid-chromium-linux.png and b/packages/ui/src/lib/components/Kbd/__screenshots__/Kbd.vrt.test.ts/Kbd-dark-solid-chromium-linux.png differ diff --git a/packages/ui/src/lib/components/Kbd/__screenshots__/Kbd.vrt.test.ts/Kbd-light-glass-chromium-linux.png b/packages/ui/src/lib/components/Kbd/__screenshots__/Kbd.vrt.test.ts/Kbd-light-glass-chromium-linux.png index 48e386e0..c9981fcd 100644 Binary files a/packages/ui/src/lib/components/Kbd/__screenshots__/Kbd.vrt.test.ts/Kbd-light-glass-chromium-linux.png and b/packages/ui/src/lib/components/Kbd/__screenshots__/Kbd.vrt.test.ts/Kbd-light-glass-chromium-linux.png differ diff --git a/packages/ui/src/lib/components/Kbd/__screenshots__/Kbd.vrt.test.ts/Kbd-light-solid-chromium-linux.png b/packages/ui/src/lib/components/Kbd/__screenshots__/Kbd.vrt.test.ts/Kbd-light-solid-chromium-linux.png index c2d75dfc..8c48e43d 100644 Binary files a/packages/ui/src/lib/components/Kbd/__screenshots__/Kbd.vrt.test.ts/Kbd-light-solid-chromium-linux.png and b/packages/ui/src/lib/components/Kbd/__screenshots__/Kbd.vrt.test.ts/Kbd-light-solid-chromium-linux.png differ diff --git a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-apple-dark-chromium-linux.png b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-apple-dark-chromium-linux.png index 464bebf1..a0278a7a 100644 Binary files a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-apple-dark-chromium-linux.png and b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-apple-dark-chromium-linux.png differ diff --git a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-apple-light-chromium-linux.png b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-apple-light-chromium-linux.png index d75948ce..46aa2c4f 100644 Binary files a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-apple-light-chromium-linux.png and b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-apple-light-chromium-linux.png differ diff --git a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-brutalism-dark-chromium-linux.png b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-brutalism-dark-chromium-linux.png index df28fafa..4a9f92d8 100644 Binary files a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-brutalism-dark-chromium-linux.png and b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-brutalism-dark-chromium-linux.png differ diff --git a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-brutalism-light-chromium-linux.png b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-brutalism-light-chromium-linux.png index 69646e49..3016a677 100644 Binary files a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-brutalism-light-chromium-linux.png and b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-brutalism-light-chromium-linux.png differ diff --git a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-claymorphism-dark-chromium-linux.png b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-claymorphism-dark-chromium-linux.png index 0e600890..0da3518b 100644 Binary files a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-claymorphism-dark-chromium-linux.png and b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-claymorphism-dark-chromium-linux.png differ diff --git a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-claymorphism-light-chromium-linux.png b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-claymorphism-light-chromium-linux.png index e3033089..3ad60eb0 100644 Binary files a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-claymorphism-light-chromium-linux.png and b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-claymorphism-light-chromium-linux.png differ diff --git a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-fluent-dark-chromium-linux.png b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-fluent-dark-chromium-linux.png index 84ad76be..9290e5ff 100644 Binary files a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-fluent-dark-chromium-linux.png and b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-fluent-dark-chromium-linux.png differ diff --git a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-fluent-light-chromium-linux.png b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-fluent-light-chromium-linux.png index 684f9718..ad06af6b 100644 Binary files a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-fluent-light-chromium-linux.png and b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-fluent-light-chromium-linux.png differ diff --git a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-material-dark-chromium-linux.png b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-material-dark-chromium-linux.png index aa1216f8..5eaec7f3 100644 Binary files a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-material-dark-chromium-linux.png and b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-material-dark-chromium-linux.png differ diff --git a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-material-light-chromium-linux.png b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-material-light-chromium-linux.png index b96343f8..088095ea 100644 Binary files a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-material-light-chromium-linux.png and b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-material-light-chromium-linux.png differ diff --git a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-terminal-dark-chromium-linux.png b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-terminal-dark-chromium-linux.png index 13948196..b2137de2 100644 Binary files a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-terminal-dark-chromium-linux.png and b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-terminal-dark-chromium-linux.png differ diff --git a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-terminal-light-chromium-linux.png b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-terminal-light-chromium-linux.png index bfc560a9..d6fbbf9a 100644 Binary files a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-terminal-light-chromium-linux.png and b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-terminal-light-chromium-linux.png differ diff --git a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-y2k-dark-chromium-linux.png b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-y2k-dark-chromium-linux.png index c2f4f8a0..8072a3d4 100644 Binary files a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-y2k-dark-chromium-linux.png and b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-y2k-dark-chromium-linux.png differ diff --git a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-y2k-light-chromium-linux.png b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-y2k-light-chromium-linux.png index ab9c3b16..eb7290ce 100644 Binary files a/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-y2k-light-chromium-linux.png and b/packages/ui/src/lib/theme/__screenshots__/DesignStyles.vrt.test.ts/style-y2k-light-chromium-linux.png differ diff --git a/packages/ui/tests/setup.vrt.ts b/packages/ui/tests/setup.vrt.ts index e034c59b..c0ee0e05 100644 --- a/packages/ui/tests/setup.vrt.ts +++ b/packages/ui/tests/setup.vrt.ts @@ -3,7 +3,7 @@ import "@fontsource-variable/jetbrains-mono"; import { beforeEach } from "vitest"; // Same typefaces the docs site self-hosts (site/src/layouts/Base.astro), so baselines don't depend on -// whatever fallback fonts the Docker image ships. +// whatever fallback fonts the CI runner ships. const style = document.createElement("style"); style.textContent = ` :root{--ca-font-sans:"Inter Variable",Inter,system-ui,sans-serif;--ca-font-mono:"JetBrains Mono Variable","JetBrains Mono",monospace} diff --git a/packages/ui/vite.config.ts b/packages/ui/vite.config.ts index e0846e24..06231825 100644 --- a/packages/ui/vite.config.ts +++ b/packages/ui/vite.config.ts @@ -29,8 +29,8 @@ export default defineConfig({ optimizeDeps: { include: ["echarts", "@tanstack/svelte-table", "shiki", "axe-core"] }, test: { expect: { requireAssertions: true }, - // Locally: half the cores (each worker is a browser tab in one Chromium). CI keeps the default. - maxWorkers: process.env.CI ? undefined : Math.max(2, Math.floor(availableParallelism() / 2)), + // Locally: a quarter of the cores (each worker is a browser tab in one Chromium). CI keeps the default. + maxWorkers: process.env.CI ? undefined : Math.max(2, Math.floor(availableParallelism() / 4)), reporters: process.env.CI ? ["default", "github-actions", ["html", { singleFile: true }]] : ["default"], @@ -63,7 +63,7 @@ export default defineConfig({ test: { name: "vrt", include: [vrtPattern], - // Baselines are Linux-only (scripts/vrt.sh runs Docker). An empty `include` would fall + // Baselines are rendered only on CI (ubuntu-24.04). An empty `include` would fall // back to Vitest's defaults, so exclude everything elsewhere instead. exclude: process.platform === "linux" ? defaultExclude : ["**/*"], passWithNoTests: true, diff --git a/scripts/changelog-notes.ts b/scripts/changelog-notes.ts new file mode 100644 index 00000000..9d541edb --- /dev/null +++ b/scripts/changelog-notes.ts @@ -0,0 +1,13 @@ +// Prints the CHANGELOG section of one version (GitHub Release notes): bun scripts/changelog-notes.ts 2.3.1 +import { readFileSync } from "node:fs"; + +const version = process.argv[2]; +const lines = readFileSync("packages/ui/CHANGELOG.md", "utf8").split("\n"); +const start = lines.indexOf(`## ${version}`); +if (start === -1) { + console.log("See packages/ui/CHANGELOG.md."); +} else { + const rest = lines.slice(start + 1); + const end = rest.findIndex((l) => l.startsWith("## ")); + console.log((end === -1 ? rest : rest.slice(0, end)).join("\n").trim()); +} diff --git a/scripts/commit-msg.ts b/scripts/commit-msg.ts new file mode 100644 index 00000000..7eddc5a6 --- /dev/null +++ b/scripts/commit-msg.ts @@ -0,0 +1,17 @@ +// commit-msg hook: the first non-comment line must follow Conventional Commits v1.0.0. +import { readFileSync } from "node:fs"; + +const line = + readFileSync(process.argv[2] ?? "", "utf8") + .split("\n") + .find((l) => l.trim() !== "" && !l.startsWith("#")) ?? ""; +const types = "feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert"; +const ok = + /^(Merge |Revert "|fixup! |squash! )/.test(line) || + new RegExp(`^(${types})(\\([a-z0-9./-]+\\))?!?: \\S.{0,71}$`).test(line); +if (!ok) { + console.error( + `Commit message must follow Conventional Commits (https://www.conventionalcommits.org/en/v1.0.0/):\n ()?: types: ${types.replaceAll("|", " ")}\n got: "${line}"` + ); + process.exit(1); +} diff --git a/scripts/deploy-site.sh b/scripts/deploy-site.sh deleted file mode 100755 index 8d30cf8f..00000000 --- a/scripts/deploy-site.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env sh -# Build the package and the docs site, then deploy site/dist to Cloudflare Pages -# (project codeatlas-ui → https://ui.codeatlas.com.br). -# bun run site:deploy production (branch main) -# bun run site:deploy --branch pr-12 preview at https://pr-12.codeatlas-ui.pages.dev -# Needs CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID in the environment (never commit them). -set -e -BRANCH=main -if [ "$1" = "--branch" ] && [ -n "$2" ]; then BRANCH="$2"; fi -if [ -z "$CLOUDFLARE_API_TOKEN" ] || [ -z "$CLOUDFLARE_ACCOUNT_ID" ]; then - echo "CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID must be set (Pages: Edit permission)." >&2 - exit 1 -fi -bun run build:pkg -bun run --cwd site build -cd site && bunx wrangler pages deploy dist --project-name codeatlas-ui --branch "$BRANCH" --commit-dirty=true diff --git a/scripts/dev.ts b/scripts/dev.ts new file mode 100644 index 00000000..6361d339 --- /dev/null +++ b/scripts/dev.ts @@ -0,0 +1,23 @@ +// `bun dev`: package watcher (svelte-package --watch) + docs site. The site resolves +// @codeatlasdev/ui from packages/ui/dist, so library edits need the watcher running. +import { existsSync } from "node:fs"; + +const io = ["inherit", "inherit", "inherit"] as const; +if (!existsSync("packages/ui/dist/index.js")) { + const build = Bun.spawnSync(["bun", "run", "build:pkg"], { stdio: io }); + if (build.exitCode !== 0) process.exit(build.exitCode ?? 1); +} +const procs = [ + Bun.spawn(["bun", "run", "--cwd", "packages/ui", "build:watch"], { stdio: io }), + // --ignore-lock keeps Astro in the foreground (it auto-backgrounds under AI agents) so this + // script owns its lifetime. + Bun.spawn(["bun", "run", "--cwd", "site", "dev", "--ignore-lock"], { stdio: io }), +]; +const stop = (code: number) => { + for (const p of procs) p.kill(); + process.exit(code); +}; +process.on("SIGINT", () => stop(0)); +process.on("SIGTERM", () => stop(0)); +const code = await Promise.race(procs.map((p) => p.exited)); +stop(code ?? 1); diff --git a/scripts/push-files.ts b/scripts/push-files.ts deleted file mode 100644 index 18532af8..00000000 --- a/scripts/push-files.ts +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bun -/** - * Files the pending push changes, for the `files:` of a lefthook pre-push job. - * bun scripts/push-files.ts - * Diffs against the push destination when Git can resolve it, else against origin/main (first push - * of a branch, a fork remote, a branch tracking main). Lefthook runs `files:` without a shell on - * Windows, so a `cmd 2>/dev/null || fallback` line there exits 128 instead of falling back. - */ -import { $ } from "bun"; - -const push = await $`git rev-parse --verify -q @{push}`.nothrow().quiet(); -const range = push.exitCode === 0 ? "@{push}..HEAD" : "origin/main...HEAD"; -process.stdout.write(await $`git diff --name-only ${range}`.text()); diff --git a/scripts/release-tag.ts b/scripts/release-tag.ts new file mode 100644 index 00000000..0824ee59 --- /dev/null +++ b/scripts/release-tag.ts @@ -0,0 +1,29 @@ +// `bun run release:tag`: tags the current package version on main and pushes the tag, which +// starts the Release workflow (npm publish with provenance + GitHub Release + docs deploy). +import { readdirSync, readFileSync } from "node:fs"; + +const git = (...args: string[]) => { + const p = Bun.spawnSync(["git", ...args], { stderr: "inherit" }); + if (p.exitCode !== 0) fail(`git ${args.join(" ")} failed`); + return p.stdout.toString().trim(); +}; +function fail(msg: string): never { + console.error(`release:tag: ${msg}`); + process.exit(1); +} + +const v = JSON.parse(readFileSync("packages/ui/package.json", "utf8")).version as string; +const tag = `@codeatlasdev/ui@${v}`; +if (git("rev-parse", "--abbrev-ref", "HEAD") !== "main") fail("must be on main"); +if (git("status", "--porcelain") !== "") fail("working tree is not clean"); +git("fetch", "-q", "origin", "main"); +if (git("rev-parse", "HEAD") !== git("rev-parse", "origin/main")) + fail("HEAD differs from origin/main"); +const pending = readdirSync(".changeset").filter((f) => f.endsWith(".md") && f !== "README.md"); +if (pending.length) fail(`pending changesets (${pending.join(", ")}): merge the Version PR first`); +if (git("tag", "-l", tag) !== "") fail(`tag ${tag} already exists locally`); +if (git("ls-remote", "--tags", "origin", `refs/tags/${tag}`) !== "") + fail(`tag ${tag} already exists on origin`); +git("tag", "-a", tag, "-m", tag); +git("push", "origin", `refs/tags/${tag}`); +console.log(`Tagged ${tag} → https://github.com/codeatlasdev/ui/actions/workflows/release.yml`); diff --git a/scripts/release.js b/scripts/release.js index 704fe150..b9e5c813 100755 --- a/scripts/release.js +++ b/scripts/release.js @@ -1,7 +1,7 @@ #!/usr/bin/env node /** * Release check for @codeatlasdev/ui. Publishing happens in CI (.github/workflows/release.yml): - * merge the "Version Packages" PR and Actions publishes to npm with provenance. + * merge the Version PR, then `bun run release:tag` pushes the tag that publishes with provenance. * * bun run release lint + type check + build + tarball smoke test + pending changesets * bun run release --keep keep the smoke-test temp dir @@ -54,9 +54,7 @@ if (args.has("--smoke")) { smokeTest(); step("Pending changesets"); tryRun("changeset status", "bunx", ["changeset", "status", "--verbose"]); - console.log( - "\n✔ ready: push to main; the Release workflow opens the version PR, merging it publishes." - ); + console.log("\n✔ ready: merge the Version PR, then bun run release:tag"); } /** Packs the library, installs the tarball into a fresh SvelteKit app with npm and prerenders it. */ diff --git a/scripts/validate.ts b/scripts/validate.ts index 9732f900..861bf992 100644 --- a/scripts/validate.ts +++ b/scripts/validate.ts @@ -1,18 +1,23 @@ // `bun run validate`: every gate CI's validate job runs, in parallel where they don't depend // on each other. Output of each step is buffered and printed only if it fails. // -// phase 1 (parallel): generated themes, token lint, Biome, unit tests, package type check, package build +// phase 0: package build (svelte-check self-imports resolve to dist/) +// phase 1 (parallel): generated themes, token lint, Biome, unit tests, package type check // phase 2 (parallel, needs dist/): site type check, size budget +// Locally at most 4 steps run at once; CI runs each phase fully in parallel. type Step = { name: string; cmd: string[]; cwd?: string }; +const phase0: Step[] = [ + { name: "build package", cmd: ["bun", "run", "build"], cwd: "packages/ui" }, +]; + const phase1: Step[] = [ { name: "themes up to date", cmd: ["bun", "run", "themes:check"], cwd: "packages/ui" }, { name: "token lint", cmd: ["bun", "run", "lint:tokens"], cwd: "packages/ui" }, { name: "biome", cmd: ["bun", "run", "lint"] }, { name: "unit tests", cmd: ["bun", "run", "test:unit"] }, { name: "types (package)", cmd: ["bun", "run", "check"], cwd: "packages/ui" }, - { name: "build package", cmd: ["bun", "run", "build"], cwd: "packages/ui" }, ]; const phase2: Step[] = [ { name: "types (site)", cmd: ["bun", "run", "check"], cwd: "site" }, @@ -42,8 +47,18 @@ async function run(step: Step): Promise { } const start = performance.now(); -for (const phase of [phase1, phase2]) { - const results = await Promise.all(phase.map(run)); - if (results.includes(false)) process.exit(1); +async function runPhase(phase: Step[]): Promise { + let next = 0; + let ok = true; + const worker = async () => { + while (next < phase.length) if (!(await run(phase[next++]))) ok = false; + }; + const limit = process.env.CI ? phase.length : 4; + await Promise.all(Array.from({ length: Math.min(limit, phase.length) }, worker)); + return ok; +} + +for (const phase of [phase0, phase1, phase2]) { + if (!(await runPhase(phase))) process.exit(1); } console.log(`validate ok in ${((performance.now() - start) / 1000).toFixed(1)}s`); diff --git a/scripts/vrt-update-ci.sh b/scripts/vrt-update-ci.sh index 25a2c92f..8af02ac4 100755 --- a/scripts/vrt-update-ci.sh +++ b/scripts/vrt-update-ci.sh @@ -1,6 +1,5 @@ #!/usr/bin/env sh -# Regenerate visual baselines on CI (native linux/amd64, same image as the check) and pull them. -# Local Docker on Apple Silicon emulates amd64 and takes 10x longer; use test:vrt:update:local offline. +# Regenerate visual baselines on CI (ubuntu-24.04, the only place they are rendered) and pull them. # Needs: gh (authenticated), the current branch pushed with no unpushed commits. set -e command -v gh >/dev/null 2>&1 || { echo "gh CLI is required (https://cli.github.com)." >&2; exit 1; } diff --git a/scripts/vrt.sh b/scripts/vrt.sh deleted file mode 100644 index 3dcf5156..00000000 --- a/scripts/vrt.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env sh -# Visual baselines are Linux-only. On any OS, this runs VRT inside the pinned Playwright image. -set -e -if ! command -v docker >/dev/null 2>&1; then - echo "Docker is required for VRT (baselines are generated on Linux). Install Docker Desktop and retry." >&2 - exit 1 -fi -IMG=mcr.microsoft.com/playwright:v1.64.0-noble -UPDATE=""; UPDATE_PW="" -if [ "$1" = "--update" ]; then UPDATE="--update"; UPDATE_PW="--update-snapshots"; fi -# linux/amd64 always: CI runs x86_64, and glyph rasterization differs on arm64 (Apple Silicon), -# so baselines made natively on an M-series Mac fail in CI. Emulated, slower, but identical. -# Same Bun as CI (package.json packageManager); no postinstall (git hooks, browser download). -BUN_PKG=$(node -p 'require("./package.json").packageManager') -docker run --rm --init --ipc=host --platform linux/amd64 -v "$PWD":/work -v /work/node_modules -v /work/packages/ui/node_modules -v /work/site/node_modules -w /work "$IMG" sh -c "\ - npm i -g --allow-scripts=bun $BUN_PKG >/dev/null && bun install --frozen-lockfile --ignore-scripts && node scripts/fix-ts-symlink.js && \ - bun run --cwd packages/ui test:vrt $UPDATE && bun run build:pkg && \ - bun run --cwd site test:e2e --project=visual-desktop --project=visual-mobile $UPDATE_PW" diff --git a/site/playwright.config.ts b/site/playwright.config.ts index 5651fdf3..251c94aa 100644 --- a/site/playwright.config.ts +++ b/site/playwright.config.ts @@ -10,8 +10,8 @@ export default defineConfig({ forbidOnly: !!process.env.CI, failOnFlakyTests: !!process.env.CI, retries: process.env.CI ? 1 : 0, - // Every core on CI runners (4 vCPU); shards split the suite across jobs. - workers: process.env.CI ? "100%" : "50%", + // Every core on CI runners (4 vCPU); shards split the suite across jobs. Locally a quarter. + workers: process.env.CI ? "100%" : "25%", snapshotPathTemplate: "{testDir}/__screenshots__/{projectName}/{testFilePath}/{arg}{ext}", expect: { timeout: 5_000, diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/command-palette-light.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/command-palette-light.webp index 09e2fa07..29a8637b 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/command-palette-light.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/command-palette-light.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/dialog-dark.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/dialog-dark.webp index 22c3f758..e2b4fda1 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/dialog-dark.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/dialog-dark.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/dialog-light.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/dialog-light.webp index 41e7804b..07f7e6d0 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/dialog-light.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/dialog-light.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-dark.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-dark.webp index d9086f59..2501911c 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-dark.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-dark.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-display-data-table-dark.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-display-data-table-dark.webp index 912eadf8..0149b903 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-display-data-table-dark.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-display-data-table-dark.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-display-data-table-light.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-display-data-table-light.webp index 8097cbe9..6916a375 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-display-data-table-light.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-display-data-table-light.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-display-table-dark.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-display-table-dark.webp index 4deda812..72385160 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-display-table-dark.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-display-table-dark.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-display-table-light.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-display-table-light.webp index 6bcc60d3..636ed6c5 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-display-table-light.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-display-table-light.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-feedback-dialog-dark.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-feedback-dialog-dark.webp index 1871abb9..890a0361 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-feedback-dialog-dark.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-feedback-dialog-dark.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-feedback-dialog-light.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-feedback-dialog-light.webp index 267691bd..2ff032ae 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-feedback-dialog-light.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-feedback-dialog-light.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-foundation-colors-dark.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-foundation-colors-dark.webp index b03e5a64..ca4ad8aa 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-foundation-colors-dark.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-foundation-colors-dark.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-foundation-colors-light.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-foundation-colors-light.webp index eea08acc..3cc4ead4 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-foundation-colors-light.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-foundation-colors-light.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-button-dark.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-button-dark.webp index 6fead2f9..29c28999 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-button-dark.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-button-dark.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-button-light.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-button-light.webp index 15b382f2..96d7ea38 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-button-light.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-button-light.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-date-picker-dark.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-date-picker-dark.webp index 62cf62d6..01d803bf 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-date-picker-dark.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-date-picker-dark.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-date-picker-light.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-date-picker-light.webp index 2601eaa8..74cc4c6b 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-date-picker-light.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-date-picker-light.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-text-field-dark.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-text-field-dark.webp index d1be1c95..8b2f44ce 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-text-field-dark.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-text-field-dark.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-text-field-light.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-text-field-light.webp index e7a1687c..298e4661 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-text-field-light.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-inputs-text-field-light.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-layout-app-shell-dark.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-layout-app-shell-dark.webp index c1f9eb5b..d026b298 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-layout-app-shell-dark.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-layout-app-shell-dark.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-layout-app-shell-light.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-layout-app-shell-light.webp index d7dec6d5..5a9e7ae7 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-layout-app-shell-light.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-layout-app-shell-light.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-light.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-light.webp index fd2fa38c..5a9a4c23 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-light.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-light.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-navigation-app-bar-dark.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-navigation-app-bar-dark.webp index b35bdc91..8c6cac56 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-navigation-app-bar-dark.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-navigation-app-bar-dark.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-navigation-app-bar-light.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-navigation-app-bar-light.webp index d82711ca..076f9c29 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-navigation-app-bar-light.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/docs-navigation-app-bar-light.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/home-dark.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/home-dark.webp index 36028417..303b28c8 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/home-dark.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/home-dark.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/home-light.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/home-light.webp index 093b00d9..49f2b791 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/home-light.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/home-light.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/sheet-dark.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/sheet-dark.webp index 30f727d8..c107f87f 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/sheet-dark.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/sheet-dark.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/sheet-light.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/sheet-light.webp index f89afeca..53324a21 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/sheet-light.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/sheet-light.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-app-dashboard-dark.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-app-dashboard-dark.webp index 8ae38e34..79fa1628 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-app-dashboard-dark.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-app-dashboard-dark.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-app-dashboard-light.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-app-dashboard-light.webp index ddef8777..9568391b 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-app-dashboard-light.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-app-dashboard-light.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-auth-sign-in-dark.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-auth-sign-in-dark.webp index bc1b68ca..dd341af7 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-auth-sign-in-dark.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-auth-sign-in-dark.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-auth-sign-in-light.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-auth-sign-in-light.webp index f81688b4..0d0a6905 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-auth-sign-in-light.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-auth-sign-in-light.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-dark.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-dark.webp index b3405b04..dce8d388 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-dark.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-dark.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-light.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-light.webp index 48947bb8..b7a84d90 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-light.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/templates-light.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/theme-dark.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/theme-dark.webp index d972fcc4..3d8a3cd4 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/theme-dark.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/theme-dark.webp differ diff --git a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/theme-light.webp b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/theme-light.webp index 42aec9ab..bb8d0539 100644 Binary files a/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/theme-light.webp and b/site/tests/__screenshots__/visual-desktop/pages.visual.spec.ts/theme-light.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/command-palette-dark.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/command-palette-dark.webp index 662fae4e..36bc3093 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/command-palette-dark.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/command-palette-dark.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/command-palette-light.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/command-palette-light.webp index d6e15230..62248f53 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/command-palette-light.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/command-palette-light.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/dialog-dark.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/dialog-dark.webp index 089132d3..e682a81f 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/dialog-dark.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/dialog-dark.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/dialog-light.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/dialog-light.webp index e054223e..2b292e02 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/dialog-light.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/dialog-light.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-dark.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-dark.webp index cd68c9b2..0f8927e0 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-dark.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-dark.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-display-data-table-dark.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-display-data-table-dark.webp index a9d036ac..b9d36fc1 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-display-data-table-dark.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-display-data-table-dark.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-display-data-table-light.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-display-data-table-light.webp index c6348d8a..f2f531ef 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-display-data-table-light.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-display-data-table-light.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-display-table-dark.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-display-table-dark.webp index 8f4f6908..90078b76 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-display-table-dark.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-display-table-dark.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-display-table-light.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-display-table-light.webp index 4d56b972..78467058 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-display-table-light.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-display-table-light.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-feedback-dialog-dark.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-feedback-dialog-dark.webp index 8f3e75ba..8e5cd871 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-feedback-dialog-dark.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-feedback-dialog-dark.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-feedback-dialog-light.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-feedback-dialog-light.webp index 81370293..ef3e3380 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-feedback-dialog-light.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-feedback-dialog-light.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-foundation-colors-dark.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-foundation-colors-dark.webp index f0604b47..ad0721d7 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-foundation-colors-dark.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-foundation-colors-dark.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-foundation-colors-light.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-foundation-colors-light.webp index 73275082..4bccf19b 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-foundation-colors-light.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-foundation-colors-light.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-button-dark.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-button-dark.webp index 14656d41..59205d90 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-button-dark.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-button-dark.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-button-light.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-button-light.webp index 54c1efe4..1c126f9d 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-button-light.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-button-light.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-date-picker-dark.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-date-picker-dark.webp index 29102634..5f710421 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-date-picker-dark.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-date-picker-dark.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-date-picker-light.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-date-picker-light.webp index 9b3e37a8..55c26d97 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-date-picker-light.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-date-picker-light.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-text-field-dark.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-text-field-dark.webp index eb0acae7..975e0a56 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-text-field-dark.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-text-field-dark.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-text-field-light.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-text-field-light.webp index e96c2ff4..25d3099c 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-text-field-light.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-inputs-text-field-light.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-layout-app-shell-dark.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-layout-app-shell-dark.webp index ad91d3ab..173d8caf 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-layout-app-shell-dark.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-layout-app-shell-dark.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-layout-app-shell-light.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-layout-app-shell-light.webp index df9619d3..89599306 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-layout-app-shell-light.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-layout-app-shell-light.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-light.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-light.webp index a65fa479..ef27e504 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-light.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-light.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-navigation-app-bar-dark.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-navigation-app-bar-dark.webp index 0ed6d9e4..447f6428 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-navigation-app-bar-dark.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-navigation-app-bar-dark.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-navigation-app-bar-light.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-navigation-app-bar-light.webp index 9781eb25..86ce650c 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-navigation-app-bar-light.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/docs-navigation-app-bar-light.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/home-dark.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/home-dark.webp index 7626436d..fdadeed9 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/home-dark.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/home-dark.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/home-light.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/home-light.webp index 1e651b44..819ae3c8 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/home-light.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/home-light.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/sheet-dark.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/sheet-dark.webp index b008ecf9..2b34db12 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/sheet-dark.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/sheet-dark.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/sheet-light.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/sheet-light.webp index 2b7be728..62091717 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/sheet-light.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/sheet-light.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-app-dashboard-dark.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-app-dashboard-dark.webp index 42bd43c2..ca7a3832 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-app-dashboard-dark.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-app-dashboard-dark.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-app-dashboard-light.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-app-dashboard-light.webp index 70e26cb0..4aa225ce 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-app-dashboard-light.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-app-dashboard-light.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-auth-sign-in-dark.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-auth-sign-in-dark.webp index b3ba4437..9b61d684 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-auth-sign-in-dark.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-auth-sign-in-dark.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-auth-sign-in-light.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-auth-sign-in-light.webp index d5173712..80c32cde 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-auth-sign-in-light.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-auth-sign-in-light.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-dark.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-dark.webp index 04c25643..5cf9379b 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-dark.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-dark.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-light.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-light.webp index a70ee800..b437e02a 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-light.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/templates-light.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/theme-dark.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/theme-dark.webp index 917b7c5d..bf6c9976 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/theme-dark.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/theme-dark.webp differ diff --git a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/theme-light.webp b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/theme-light.webp index 78c3142e..7c229913 100644 Binary files a/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/theme-light.webp and b/site/tests/__screenshots__/visual-mobile/pages.visual.spec.ts/theme-light.webp differ