Skip to content

chore(release): promote dev to main - #1081

Merged
JOY (JOY) merged 7 commits into
mainfrom
dev
Oct 25, 2026
Merged

JOY (JOY) merged 7 commits into
mainfrom
dev

Conversation

@JOY

@JOY JOY (JOY) commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Promotes dev to main:

No supabase/ changes.

🤖 Generated with Claude Code


📌 TL;DR

This PR significantly enhances accessibility (WCAG compliance) by replacing tablist roles with group/aria-pressed patterns, adding missing labels to form inputs, and fixing duplicate SVG IDs. It also updates CI/CD documentation to reflect new required checks (E2E, Secret scan) and adds comprehensive Playwright E2E tests to enforce these accessibility standards.

🎯 Type of Change

  • 🚀 New feature
  • 🐛 Bugfix
  • 🧹 Refactor
  • ⚡ Performance
  • 📚 Documentation
  • ⚙️ CI / Configuration

🔍 Changes Walkthrough

File Summary of Changes
AGENTS.md Updated documentation to include E2E (Playwright) and Secret scan (gitleaks) as required checks for merging.
Docs/Resources/RELEASE.md Updated release workflow docs to reflect the new required CI checks and ruleset configurations.
Docs/Resources/ROADMAP.md Marked Branch Rulesets task as complete, noting the addition of E2E and Secret scan checks.
apps/web/e2e/input-labels.spec.ts New: E2E test ensuring all visible inputs have proper labels (not just placeholders) across key pages.
apps/web/e2e/leaderboard.spec.ts Updated selectors to use role="group" and aria-pressed instead of tablist/tab.
apps/web/e2e/pill-group-state.spec.ts New: E2E test verifying single-select pill groups expose pressed state and handle interactions correctly.
apps/web/e2e/review-bars.spec.ts New: E2E test using Axe to ensure review authenticity bars are decorative (no invalid ARIA).
apps/web/e2e/selector-state.spec.ts New: E2E test verifying leaderboard and compare selectors use correct ARIA group/pressed patterns.
apps/web/e2e/touch-targets.spec.ts Added test to ensure the catalog deal-radar link meets the 24px minimum touch target size.
apps/web/e2e/unique-ids.spec.ts New: E2E test verifying no duplicate HTML IDs exist on pages (specifically targeting the locale switcher).
apps/web/locales/*.json Added new translation keys for ARIA labels (priceSegmentAria, platformFilterAria, etc.) and removed obsolete authenticityProgressAria.
apps/web/src/app/[locale]/components/list-sidebar-one.tsx Added aria-labelledby to the keyword search input, linking it to the visible heading.
apps/web/src/app/[locale]/smartphones/page.tsx Converted <span> captions to <label> elements with htmlFor for search and brand inputs.
apps/web/src/app/style/scss/_custom.scss Added min-height: 24px to the deal-radar link to meet WCAG 2.2 target size requirements.
apps/web/src/components/compare/CompareWorkspace.tsx Changed category switcher from role="tablist" to role="group" with aria-pressed buttons.
apps/web/src/components/compare/VersusInteractiveScoreboard.tsx Added role="group", aria-pressed, aria-expanded, and aria-controls to persona and slider controls.
apps/web/src/components/deals/DealFinderWorkspace.tsx Added role="group" and aria-pressed to category and persona filters; added aria-label to search input.
apps/web/src/components/developers/ApiPlaygroundClient.tsx Added role="group" and aria-pressed to preset selectors and code snippet mode toggles.
apps/web/src/components/elementary/LocaleSwitcher.tsx Refactored FlagEN component to use useId() for SVG clipPath IDs, preventing duplicate ID conflicts.
apps/web/src/components/leaderboard/LeaderboardExplorer.tsx Refactored category, criterion, persona, and price filters to use role="group" and aria-pressed.
apps/web/src/components/leaderboard/ProductValueCalculator.tsx Added aria-pressed to month selection buttons.
apps/web/src/components/merchants/MerchantDirectoryExplorer.tsx Wrapped platform filters in role="group" and added aria-pressed to all filter buttons.
apps/web/src/components/price-history/PriceHistorySection.tsx Added role="group" and aria-pressed to merchant filter buttons.

📊 Architectural Flow

flowchart TD
    subgraph "Accessibility Refactor"
        A[Components] -->|Replace tablist with group| B[ARIA Patterns]
        B -->|aria-pressed| C[Single-Select State]
        B -->|aria-labelledby/label| D[Form Inputs]
        E[LocaleSwitcher] -->|useId| F[Unique SVG IDs]
    end

    subgraph "CI/CD & Docs"
        G[AGENTS.md / RELEASE.md] -->|Update Required Checks| H[CI Pipeline]
        H -->|Enforce| I[E2E Playwright]
        H -->|Enforce| J[Secret Scan]
    end

    subgraph "E2E Validation"
        I -->|Test| K[input-labels.spec.ts]
        I -->|Test| L[pill-group-state.spec.ts]
        I -->|Test| M[unique-ids.spec.ts]
        I -->|Test| N[selector-state.spec.ts]
    end

    A -.->|Validated by| I
    F -.->|Validated by| M
Loading

JOY (JOY) and others added 7 commits October 25, 2026 22:06
…tors (#1067) (#1068)

* fix(a11y): expose the selected state of leaderboard and compare selectors (#1067)

The category switchers used tab roles without panels, arrow keys or a
roving tab stop, and the leaderboard's criterion, persona and price
pills showed the selection only by colour. Each selector is now a
named button group with aria-pressed, and the customize button gets
aria-expanded and aria-controls for its weight panel.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(a11y): name custom leaderboard weights on the customize button (#1067)

Custom weights select no persona pill and are shown only by colouring
the customize button; its name now says so too, so a screen reader
gets the same cue.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: JOY <anh@metados.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
The stacked bar was a plain div with an aria-label, which no role
supports (axe aria-prohibited-attr). Its percentages are already text
in the badges above, so it is aria-hidden like the other score bars,
and the unused authenticityProgressAria string is removed.

Co-authored-by: JOY <anh@metados.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* docs: record E2E and gitleaks as required checks (#1073)

The dev-main-light ruleset now requires E2E (Playwright) as well as
Typecheck & Build Monorepo and Secret scan (gitleaks) on dev and main.
Update AGENTS.md, RELEASE.md and the roadmap checkbox to match.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs: list every required check for feature PRs (#1073)

Review P3: RELEASE.md step 1 still named only Typecheck & Build
Monorepo. PRs into dev also need E2E, gitleaks and task-claim.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: JOY <anh@metados.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…1069) (#1070)

* fix(a11y): expose the pressed choice of pill groups across the site (#1069)

Product price history (store, range), the value calculator's months,
compare weight presets, the deals category row, the merchant platform
and review-risk filters and the API playground's presets and code
language showed the selection only by colour. Each is now a named group
with aria-pressed buttons; the merchants Official Mall toggle gets
aria-pressed and the compare sliders toggle aria-expanded.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(a11y): name compare custom weights and the deals persona group (#1069)

Fresh-context review of #1070:
- Compare custom weights were shown only by colouring the sliders
  toggle; its name now says so (new compare.customWeightsActive), and
  it points at the slider panel with aria-controls, as on the
  leaderboard (#1067).
- The developers click test retries until hydration handles the click.
- The deals persona pills, already aria-pressed, get a named group.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: JOY <anh@metados.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
)

The "view all deals" link in the catalog radar was 21px tall next to
other targets, the only WCAG 2.2 target-size failure on the main pages
at 375px. Give the radar header link a 24px minimum height.

Co-authored-by: JOY <anh@metados.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
The catalog q and brands inputs, the catalog sidebar keyword input and
the /deals quick search were named only by their placeholder. Associate
the visible captions with <label htmlFor>, point the sidebar input at
its heading and give the deals search an aria-label.

Co-authored-by: JOY <anh@metados.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
The navbar renders the locale switcher twice, so the fixed flag-en-s and
flag-en-t clipPath ids were duplicated on every English page. Derive
them from useId per instance.

Co-authored-by: JOY <anh@metados.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Code review skipped — your organization has no extra usage available to pay for this review.

If your organization's extra usage balance is empty, an organization admin can add extra usage credits at claude.ai/admin-settings/usage. If its monthly spend limit was reached, an admin can raise it on the same page. If neither applies, contact Anthropic support.

Once extra usage is available, someone with write access to this repository can comment @claude review on this pull request to trigger a review.

@vercel

vercel Bot commented Oct 25, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
rate Ready Ready Preview Oct 25, 2026 4:53pm UTC

Request Review

@coderabbitai

coderabbitai Bot commented Oct 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: fede9edb-9116-4bbb-adcf-24c725baf148

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added docs Documentation changes area:frontend Frontend / Next.js / UI labels Oct 25, 2026
dos[bot]
dos Bot approved these changes Oct 25, 2026

@dos dos Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⏱️ Code Review completed (26 eligible files · 61,189 chars · 1 model call(s) · 3 PR unit(s))

Whole diff with bounded context at base e227cc7 / head 435b067.

✅ CLEAN_PASS: Complete diff reviewed

@JOY
JOY (JOY) merged commit 0c13c65 into main Oct 25, 2026
27 checks passed

This branch was successfully deployed

1 active deployment
Preview — 435b0679 Deployed Oct 25, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:frontend Frontend / Next.js / UI docs Documentation changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant