Repository navigation
Chota v1.0 execution tracking #121
Description
Purpose
Coordinator-only program record for Chota v1. This issue is the source of truth for current release readiness and accepted evidence. It remains open until the final release is complete.
Authority and branch policy
v1is the sole long-lived integration branch. Work branches usework/*orfix/*, targetv1, and never usev1/*.mainremains unchanged by v1 implementation until the owner-approvedv1 -> mainrelease PR.- Authority order: accepted evidence on this issue decides release readiness; each individual card decides its scope and acceptance; Project Does it support ie9 #2 reflects the current queue/status.
PLAN.mdis local control guidance only and does not record dynamic status or evidence. - A card is Done only after its evidence is attached, reviewed, and merged to
v1. Code or a merged branch alone is not evidence.
Current integration snapshot
- Integration branch:
v1 - Current remote
v1tip checked 2026-07-30:d2512454f74893df14225db9fcfcc43556d3b5f0. This is the accepted merge commit for v1: validate candidate issue #102 mobile grid overflow #132; release readiness still requires the remaining Week 2 evidence contract. - Owner: repository owner
- Week 1 foundation is accepted. Week 2 acceptance is governed by the cards below; do not infer it from a historical project status.
Accepted Week 1 evidence
| Card | Evidence | Status |
|---|---|---|
| #122 | Support policy matches browserslist, MIGRATION.md, and browser-support baseline. |
Accepted |
| #123 | Isolated v1@9ee307b archive passed yarn install --frozen-lockfile && yarn test && yarn build using Volta Node 24.18.0 and Yarn 1.22.22. |
Accepted |
| #125 | Current build baseline: 3310 gzip bytes; ceiling: 4096 bytes. | Accepted |
| #126 | Architecture and contributor docs match the build, public API, Volta workflow, and branch policy. | Accepted |
| #127 | zlib size gate passes at 3310 bytes; deliberate incompressible artifact reached 14904 bytes and correctly failed the 4096-byte ceiling. | Accepted |
| #128 | Dependabot proposes monthly updates; maintainers review/batch quarterly. | Accepted |
Week 2 acceptance contract
- v1: add pull request CI quality gate #129 CI: required install, lint, build, API, VRT, and a11y checks fail closed on PRs to
v1; Firefox/WebKit smoke results are required for Week 2 exit. - v1: establish Chromium visual regression testing #124 VRT:
yarn test:vrtruns only screenshot tests, has reviewed Chromium references for both fixtures/viewports, and has a recorded deliberate visual-regression failure. - v1: establish fixture accessibility baseline #130 a11y: findings are structured and each known finding has an owner-approved disposition; a new or worsened finding fails the a11y command unless its baseline change is reviewed on v1: establish fixture accessibility baseline #130.
- v1: add built CSS public API contract check #131 API:
yarn test:apivalidates only the owner-reviewed public selector/custom-property surface; it must not promote incidental generated CSS to public API. - v1: validate candidate issue #102 mobile grid overflow #132–v1: validate candidate issue #61 spacing utilities #136 are validation only. They become v1 fixes only after reproducibility on the support matrix, material impact, a bounded compatible fix, and regression coverage. Otherwise they record close/defer.
Coordination
- A worker executes one card and returns changed files, commands/results, artifact links, API impact, and unresolved risk.
- The coordinator owns branches, commits, PRs, board state, and this evidence record.
- Public API changes, VRT baseline updates, size exceptions, scope decisions, and release actions require owner review.
- A failed card stays In Progress. Its retry, re-scope, cancellation, or defer decision is recorded on the card; it is never silently removed.
Final exit criteria
Close this issue only after #145 has completed: owner-approved v1 -> main release PR merged; matching v1.0.0 tag and package published; package/CDN verification recorded; and #146 contains post-v1 dispositions.
Evidence control addendum
This issue is coordinator-only. Dynamic status and accepted evidence must be updated here only after the coordinator verifies the linked card's exact diff, current command output, artifact paths, and commit SHA.
For every accepted card, record: card/PR, merged SHA, changed files, required commands and exit statuses, browser/OS matrix where relevant, artifact links, disposition, owner decision, and unresolved risk. “Done,” a green unrelated workflow, a screenshot, or a stale plan snapshot is not acceptance evidence.
When a card fails or evidence is incomplete, keep it In Progress and record retry, re-scope, defer, or cancel. Do not close an issue or promote a fix based only on a worker recommendation.
\n
Accepted Week 2 evidence — #132
- Card: v1: validate candidate issue #102 mobile grid overflow #132 — mobile grid overflow validation
- PR: #165, merged into
v1 - Merge SHA:
d2512454f74893df14225db9fcfcc43556d3b5f0 - Validation: Chromium card-specific test passed 4/4 with 0px overflow at 320, 375, 414, and 1280px
- Disposition: Col overflow in mobile devices #102 closed as not reproducible under the support policy
- Changed files: fixture, validation spec, and two evidence screenshots only
- Risk: exact reporter device/browser remains unverified
Accepted Week 2 evidence — #129
- Card: v1: add pull request CI quality gate #129 — pull request CI quality gate
- PR: #153 (initial), #166 (Firefox/WebKit smoke follow-up), merged into
v1 - Merge SHAs:
84fde2fc48(ci: add pull request quality gate #153),695c6a651f(feat(ci): add Firefox/WebKit smoke coverage with named projects #166) - Workflow:
.github/workflows/ci.yml,pull_requesttrigger onv1 - Required steps (all fail-closed, no
continue-on-error): Install (yarn install --frozen-lockfile), Lint (stylelint), Build + size gate, CSS Public API Contract, Install Chromium, Visual Regression Tests (Chromium), Accessibility (axe-core), Browser smoke coverage (Firefox + WebKit) - Acceptance: every required step appears as a named gate; failure artifacts upload only after a failing step and do not convert failure to success
- Verification: CI run 31239828832 (PR test: harden Week 2 regression coverage (#177) #178 final pre-merge commit
5c589e5c93) — all required steps SUCCESS on Linux - Disposition: accepted
- Risk: none
Accepted Week 2 evidence — #124
- Card: v1: establish Chromium visual regression testing #124 — establish Chromium visual regression testing
- PR: #154 (initial macOS baselines), #158 (Linux Chromium baselines), merged into
v1 - Merge SHAs:
cd117d1418(vrt: establish Chromium visual regression testing #154),6e2e139025(chore(vrt): add Linux Chromium baseline screenshots for #124 #158) - Coverage:
index.htmlandcomponents.htmlat desktop 1280×720 and mobile 375×667 - Baselines: 4 macOS (
*-darwin.png) + 4 Linux (*-linux.png) Chromium references; platform suffixes preserved (separate rendering environments) - Command:
yarn test:vrtruns screenshot specs only, Chromium-pinned - Deliberate regression: a temporary local visual change produced a screenshot failure and reviewable diff (restored before handoff)
- VRT output: not published in the npm package
- Owner decision: reviewed macOS vs Linux screenshot pairs; approved visual equivalence (minor font-rendering difference on sun emoji only)
- Disposition: accepted
- Risk: none
Accepted Week 2 evidence — #130
- Card: v1: establish fixture accessibility baseline #130 — fixture accessibility baseline
- PR: #156, merged into
v1 - Merge SHA:
be9f1c7e84 - Baseline: reviewed finding inventory (not a zero-violation claim); 9 real axe-core findings documented with owner-approved dispositions (fix in v1 via v1: restore visible keyboard focus #139, documented limitation, or defer post-v1)
- Command:
yarn test:a11yfails on a new finding, severity increase, or changed affected node unless the owner reviews the baseline update on v1: establish fixture accessibility baseline #130 - Keyboard observations: recorded separately for visible focus, links, native
<details>disclosure, and form controls - Deliberate violation: a temporary violation proved the checker detects a regression and was restored before handoff
- CI: a11y step runs against built fixtures, required and fail-closed
- Disposition: accepted
- Risk: none
Accepted Week 2 evidence — #131
- Card: v1: add built CSS public API contract check #131 — built CSS public API contract check
- PR: #157 (manifest approval), #168 (enforce built-CSS contract), merged into
v1 - Merge SHAs:
44b4273856(fix(a11y): #131 review and approve public API manifest #157),6340e831e4(fix: enforce built CSS public API contract #168) - Manifest:
test/vrt/api-manifest.json— 14 owner-approved custom properties, 185 owner-approved selectors - Command:
yarn test:api— parser-based check of builtdist/chota.css(not substring matching); insensitive to declaration order, whitespace, and minifier formatting - Deliberate-failure demonstrations: removing
.cardfrom a built-CSS copy and removing--grid-maxWidthfrom:rootboth reported missing through the real contract assertion; state restored, no committeddist/artifact - CI: API contract step required and fail-closed; green on PR test: harden Week 2 regression coverage (#177) #178 pre-merge commit
5c589e5c93 - Owner decision: 14 custom properties and 185 selectors approved as the public v1 CSS API; future manifest changes require explicit review
- Disposition: accepted
- Risk: none
Accepted Week 2 evidence — #134
- Card: v1: validate candidate issue #111 full-height nav logo #134 — validate Is full height logo image support available in Chota? #111 (full-height nav logo)
- PR: #167 (validation), #169 (wire nav-logo VRT through
test:vrt), merged intov1 - Merge SHAs:
0ead1da741(chore(vrt): validate #111 full-height nav logo (card #134) #167),f710672425(fix(vrt): wire nav-logo-full-height through test:vrt with VRT baselines and a11y #169) - Current rule verified:
.nav imghasmax-height: 3remin built CSS - Validation: fixture with default and opt-in (
.is-full-height) cases across aspect ratios and nav heights; default behavior proven unchanged - Disposition:
promote— separate implementation card authorized (opt-in.nav img.is-full-heightwithmax-height: none; height: 100%; object-fit: contain); no production CSS in this validation card - Follow-up: fix(vrt): clean up duplicate nav logo baselines #172 cleaned up duplicate nav-logo baselines from the v1: validate candidate issue #111 full-height nav logo #134/fix(vrt): wire nav-logo-full-height through test:vrt with VRT baselines and a11y #169 merge
- Risk: none
Accepted Week 2 evidence — #135
- Card: v1: validate candidate issue #114 grouped controls #135 — validate responsive grouped #114 (grouped controls)
- PR: #170 (implementation, merged into
v1), with validation evidence on the card - Merge SHA:
e73c782914(fix(grouped): scope flex-wrap to narrow viewports (fixes #114) #170) - Reproduction: confirmed narrow-viewport overflow reported in responsive grouped #114 against built CSS
- Implementation: scoped
flex-wrapto narrow viewports only; preserves desktop grouped controls, gapless behavior, focus outlines, and disabled controls - Regression coverage: behavioral assertions for horizontal gap, narrow wrap + rowGap, gapless border-radius, and mixed-controls no-overflow; 480/481
.groupedflex-wrap boundary test - Disposition:
promote— validation confirmed the defect; PR fix(grouped): scope flex-wrap to narrow viewports (fixes #114) #170 shipped the compatible fix with its own regression evidence - Risk: none
Accepted Week 2 evidence — #136
- Card: v1: validate candidate issue #61 spacing utilities #136 — validate no margin and padding #61 (spacing utilities)
- PR: #176, merged into
v1 - Merge SHA:
fd2a7ccfec - Coverage:
test/spacing-utilities.html+test/vrt/validations/spacing-utilities.spec.js, loaded via<link rel="stylesheet" href="/dist/chota.css"> - Assertions: computed-style checks for default 10px half gutter, -10px row gutters, and zeroed spacing from
.is-marginless/.is-paddinglesson container, row, column, numbered column, and nested grid markup; stabledata-test-idlocators - Command:
npx playwright test test/vrt/validations/spacing-utilities.spec.js --project=chromiumandyarn test:vrtboth exit 0 - VRT policy: no screenshot baseline added — computed-style assertions are the regression proof for this spacing contract
- Disposition:
close— utilities deliver their documented semantics; no production CSS change - Risk: none
Accepted Week 2 evidence — #177
- Card: test: harden Week 2 regression coverage #177 — harden Week 2 regression coverage
- PR: #178, merged into
v1 - Merge SHA:
bf82373315; final pre-merge commit5c589e5c93 - Linux CI proof: CI run 31239828832 — all required steps SUCCESS on
ubuntu-latest: Lint, Build + size gate, API Contract, VRT (Chromium), a11y, Firefox + WebKit smoke (artifact-upload steps correctlyskipped— no failures) - Completed work: mobile-grid spec converted to
toMatchSnapshot(); 7 direct-screenshot calls classified (6 orphaned removed);test/vrt/dark-mode.spec.js(2 tests) andtest/vrt/breakpoints.spec.js(32 tests at 480/481, 599/600, 899/900, 1199/1200px) added;package.jsontest:vrtwhitelist updated 4→6 specs with owner-approved impact matrix; suites remain Chromium-pinned - Local results: 62 VRT + 7 a11y + 5 API tests pass
- Changed files: 10 total (4 added, 2 modified, 4 deleted) —
test/**andpackage.jsononly; nosrc/ordist/changes - Disposition: accepted
- Risk: none
Accepted Week 2 evidence — #172, #173 (test-harness follow-ups)
- fix(vrt): clean up duplicate nav logo baselines #172 — clean up duplicate nav-logo baselines (follow-up to v1: validate candidate issue #111 full-height nav logo #134/fix(vrt): wire nav-logo-full-height through test:vrt with VRT baselines and a11y #169). PR #174, merge SHA
6a804ee173. Removed stale root-level screenshots, generic duplicates, and unsupportedsnapshotIdFormatconfig; preserved resolved intentional v1: validate candidate issue #111 full-height nav logo #134 baselines and real Linux CI Chromium baselines. No production CSS,dist/,package.json, or CI-workflow changes. - test(vrt): normalize Chromium snapshot layout and platform policy #173 — normalize Chromium snapshot layout and platform policy. PR #175, merge SHA
98a9c6e368. Deleted 11 stale snapshot files (no active consumer); updatedtest/vrt/README.mdwith Playwright resolution rules, Linux vs macOS platform policy, and artifact vs. baseline distinction.yarn test:vrt19 passed; CI quality-gate pass. - Disposition: both accepted; no production CSS, public API, or shared-config changes
- Risk: none
Week 2 closeout note — #133
- v1: validate candidate issue #77 WordPress tag collision #133 — validate Rename .tag Class as it breaks WordPress Tags Archives #77 (WordPress tag collision). Investigated and closed out-of-scope: the
.tagpublic API is preserved and no v1 fix is shipped. Tracked as a closed validation, not counted in the plan total. (Card statusDoneon the board reflects the closed validation decision, not a shipped fix.)
Accepted Week 2 evidence — #180
- Card: test(vrt): full-page and per-section docs-page coverage before #137/#138 #180 — full-page and per-section docs-page VRT coverage before v1: migrate root font sizing without visual regression #137/v1: normalize existing hardcoded design tokens #138
- PR: #181, merged into
v1(squash) - Merge SHA:
39659b8e57a04094b0562f515327918989d09270 - Problem solved: VRT captured only the first fold (
fullPage: false) ofindex.htmlandcomponents.html; 22 of 23 sub-sections onindex.htmland all 7 sections oncomponents.htmlhad no screenshot baseline. Arem-derived regression from v1: migrate root font sizing without visual regression #137/v1: normalize existing hardcoded design tokens #138 could shift.cardpadding,.tagfont-size,.buttonheight, or.col-*widths without being caught. - Added coverage:
- 4 full-page screenshots (
fullPage: true, desktop + mobile × both pages) - 8 per-section element screenshots (desktop only; 5 on
components.html, 3 onindex.html) - 4 focused computed-style assertions pinning exact
rem-derived values:.cardpadding10px 20pxand border-radius4px;.tagfont-size16pxand padding5px;.buttonheight38px;.col-6width580pxat 1280px
- 4 full-page screenshots (
- Section locators:
index.htmluses existingidattributes;components.htmlgot additivedata-test-idon 7<section>blocks (no visible/behavior change) index.html#embeddeddeterminism: native<audio>/<video>controls,<canvas>,<meter>,<progress>, recursive<iframe>render non-deterministically when scroll-stitched and carry no Chota CSS contract; full-page tests inject#embedded { visibility: hidden }viapage.addStyleTag(test-only, fixture unchanged, layout box preserved)- Linux baselines: generated from CI failure artifacts (run 31319866165); all 12 failures were "snapshot doesn't exist, writing actual" — no real visual diffs. 12
-chromium-linux.pngbaselines committed in the same PR. - CI: run 31319995485 on
bde8c33— all required steps SUCCESS onubuntu-latest: Lint, Build + size gate, API Contract, VRT (Chromium), a11y, Firefox + WebKit smoke - Local:
yarn build3321 bytes (no production CSS change);yarn test:vrt88 passed (was 62; +26 new tests) - Scope: 4 files modified (
test/components.html,test/vrt/index.spec.js,test/vrt/components.spec.js,test/vrt/README.md) + 24 new baselines (12 darwin + 12 linux); nosrc/,dist/,playwright.config.js,.github/,test/index.html,AGENTS.md,test/AGENTS.md,PLAN.md, orpackage.jsonchanges - Disposition: accepted
- Risk:
components.htmlfull-page capture includes external images (Google logo, icongr.am icons); if those hosts are down/slow on CI, the full-page baseline could fail. The per-section captures and computed-style assertions cover the actual Chota contracts and are deterministic. Pre-existing risk (first-fold capture already included the nav's Google logo).
Accepted Week 3 evidence — #139
- Card: v1: restore visible keyboard focus #139 — restore visible keyboard focus via
:focus-visible - PR: #182, merged into
v1(squash) - Merge SHA:
78fbcf4e6f6e907b2acc8f11e73e3fecdf292e62 - This is the first production CSS change in v1 touching shared form CSS. Reviewed via a 4-developer subagent workflow (D1 investigate, D2 CSS, D3 tests, D4 review) before merge.
- CSS change (
src/_form.css): removedoutline: none+ subtle 1px box-shadow:focusrule; added grouped:focus-visiblerule ona, button, input, select, textarea, summary, [tabindex]withoutline: 2px solid var(--color-primary); outline-offset: 2px;; added form-control:focus-visiblerule preservingborder-color+box-shadow(switched from:focusto:focus-visibleso it no longer fires on mouse click — fixes a latent bug). Two rules split to satisfy stylelintno-descending-specificity. - Browser support:
:focus-visiblesupported across the entire browserslist (Safari 15.4+, iOS 15.4+, latest Chrome/Firefox/Edge); no:focusfallback needed. - a11y baseline fixes:
.icon-onlybuttons gotaria-label="Search"+ imgalt="Search"(resolvesbutton-name+image-alt);.brandlink with decorative img gotaria-label="Brand"(resolveslink-name).test/vrt/a11y-baseline.jsonuntouched — disappearing nodes auto-pass. - Tests:
test/vrt/keyboard-focus.spec.js(NEW, 12 tests: 9 computed-style:focus-visibleassertions on real Tab navigation + 3 focus-state VRT baselines);test/vrt/a11y-keyboard.spec.js(DELETED, was observation-only);package.jsonupdated to wirekeyboard-focus.spec.jsintotest:vrtand remove stalea11y-keyboard.spec.jsfromtest:a11y. - Size: 3326 → 3372 gzip bytes (+46, within 4096 ceiling).
baselines/size-baseline.jsonbumped with rationale citing v1: restore visible keyboard focus #139. - Linux baselines: 3 focus-state
-chromium-linux.pngbaselines generated from CI failure artifacts (run 31321260633); all 3 failures were "snapshot doesn't exist, writing actual" — no real visual diffs. - CI: run 31321382755 on
da4f650— all required steps SUCCESS onubuntu-latest: Lint, Build + size gate (3372 bytes), CSS Public API Contract, Visual Regression Tests (Chromium), Accessibility (axe-core — button-name/image-alt/link-name gone), Browser smoke coverage (Firefox + WebKit) - Local:
yarn buildPASS;yarn test:vrt100 passed (was 88; +12 new);yarn test:a11y4 passed;yarn test:api5 passed - Scope: 13 files changed (src/_form.css, dist/chota.css, dist/chota.min.css, baselines/size-baseline.json, test/index.html, test/components.html, test/vrt/keyboard-focus.spec.js, test/vrt/a11y-keyboard.spec.js deleted, test/vrt/README.md, package.json, 6 focus-state baselines darwin+linux); no other source partials, a11y-baseline.json, playwright.config.js, .github/, AGENTS.md, test/AGENTS.md, or PLAN.md changes
- Disposition: accepted
- Risk: behavior change —
:focus-visibleshows outline on keyboard focus only, not mouse click (intended). Form-control border+box-shadow now keyboard-only (previously fired on mouse click too — latent bug fixed). No unresolved risk.
Accepted Week 3 evidence — #140
- Card: v1: document dark-mode customization convention #140 — document dark-mode customization convention
- PR: #184, merged into
v1(squash) - Merge SHA:
9ceb7707c3c930a17fc216980170871b715b262e - Problem solved:
docs/index.htmlCustomizingsection showed abody.darkexample that conflated the selector withprefers-color-schemeand implied adding the class alone activates dark mode. The truth: Chota ships NObody.darkrule; it is a consumer-owned convention where the consumer supplies the custom-property overrides AND decides when to apply the class. - Documentation changes:
docs/index.htmllines 120–192: replaced the misleading block with a correctedDark modesubsection (anchor#dark-mode) that (a) explicitly states Chota ships no built-in dark theme and nobody.darkrule, (b) separates the two independent consumer decisions — "what overrides to apply" (thebody.darkcustom-property block, any selector works) and "when to apply it" (media query, JS toggle, stored preference, manual class), (c) makes clear the class does nothing without the overrides, (d) provides two alternative "when to apply" mechanisms (Option A media-query-only, Option B JS-adds-class).docs/examples/dark-mode.html(NEW, 196 lines): standalone runnable side-by-side example using a deterministic checkbox toggle (no OS-preference dependency). Light pane never gets.dark; dark pane toggled via a demo-only.demo-pane.darkmirror (clearly labeled as NOT part of the contract; a page has only one<body>). Uses only the 14 documented Chota custom properties. Includes a "What this example proves" section.
- Evidence verification:
grep -rn "body.dark" src/*.css→ NONE (proves consumer convention)grep "body.dark" dist/chota.css dist/chota.min.css→ NONE in dist/- Example custom properties ⊆
test/vrt/api-manifest.json(14-token API): YES test/vrt/dark-mode.spec.js(unchanged) is the contract evidence: fixture inline<style>supplies overrides,body.classList.add('dark'), asserts.card/.tagreflect--bg-color/--color-grey
- No production changes: no
src/*.css, nodist/, no test files, nobaselines/, nopackage.json, noplaywright.config.js. Size unchanged (3372/3372). - Consistency:
README.mdreviewed (no dark-mode mention, no contradiction);MIGRATION.mdline 25 listsbody.darkas preserved non-breaking contract (consistent with corrected docs). - CI: run 31321903880 — all required steps SUCCESS on
ubuntu-latest: Lint, Build + size gate (3372), API Contract, VRT (Chromium), a11y, Firefox + WebKit smoke - Scope: 2 files (1 modified
docs/index.html, 1 addeddocs/examples/dark-mode.html); noAGENTS.md,PLAN.md,test/AGENTS.md,src/,dist/, or test changes - Disposition: accepted
- Risk: none — documentation only
Accepted Week 3 evidence — #141
- Card: v1: document CSS-only interaction boundaries #141 — document CSS-only interaction boundaries
- PR: #183, merged into
v1(squash) - Merge SHA:
3e1f65e0d9b13ccdbe1a50e2385969083b9c766d - Problem solved: Chota styles
<details>/<summary>(.dropdown) and<a>links inside.tabs, but ships no JavaScript widget behavior. Users could mistake the visual styles for managed widgets (ARIA menus / tabpanels). The docs did not state the boundary. - Documentation changes:
docs/_includes/utilities.htmllines 120–153: added "CSS-only interaction boundary" subsection to the Details section. States<details>/<summary>provides native disclosure (Tab focus, Enter/Space toggle — browser-native, not Chota). Lists what Chota does NOT provide: roving focus,role="menu"/role="menuitem"/aria-haspopupmanagement, focus trapping/restoration, Escape-to-close, dismiss-on-blur, app ARIA state. Notes:focus-visiblering on<summary>(and all interactive elements). Links to WAI-ARIA APG Menu & Menubar for the contract Chota does not own.docs/_includes/navs.htmllines 97–124: added "CSS-only interaction boundary" subsection to the.tabssection. States.tabsstyles visual nav links, NOT an ARIA Tabs widget (norole="tablist"/role="tab"/role="tabpanel"). Lists what Chota does NOT provide: arrow-key switching, panel management, focus movement semantics. Notes:focus-visiblering on tab links (keyboard only, not mouse-click). Links to WAI-ARIA APG Tabs.
- Evidence verification:
- Native
<details>keyboard behavior verified via one-off Playwright script: afterTab,document.activeElement.tagName === "SUMMARY";Enter→open=true;Enteragain →open=false;Space→open=true. Browser-native. grep -n "role=|aria-|haspopup|tablist|roving|focus-trap" src/*.css→ only[aria-current="page"]selectors in_nav.css:57,_tab.css:18,25(active-link styling hook, not widget roles). Norole="*", noaria-haspopup, notablist, no roving-focus, no focus-trap.:focus-visiblerule atsrc/_form.csslines 84–92:a, button, input, select, textarea, summary, [tabindex]→outline: 2px solid var(--color-primary); outline-offset: 2px;. Evidence:test/vrt/keyboard-focus.spec.jsuses real Tab navigation, asserts:focus-visiblematches + visible outline.
- Native
- No production changes: no
src/*.css, nodist/, no test files, nobaselines/, nopackage.json, noplaywright.config.js. Size unchanged (3372/3372). - Consistency:
README.mdreviewed (no JS-widget claims, "Good Semantics" bullet consistent);MIGRATION.mdlines 25–26 reviewed (no contradiction). No edits to either. - CI: run 31321803912 — all required steps SUCCESS on
ubuntu-latest: Lint, Build + size gate (3372), API Contract, VRT (Chromium), a11y, Firefox + WebKit smoke - Scope: 2 files modified (
docs/_includes/navs.html,docs/_includes/utilities.html); noAGENTS.md,PLAN.md,test/AGENTS.md,src/,dist/, or test changes - Disposition: accepted
- Risk: none — documentation only
Accepted Week 3 evidence — #137
- Card: v1: migrate root font sizing without visual regression #137 — migrate root font sizing without visual regression
- PR: #188, merged into
v1(squash) - Merge SHA:
9b9aee08961a113417892518df0105fe9561a27b - This is the first production CSS change touching shared base/token CSS (root font-size + all rem-derived values). Reviewed via a 4-developer subagent workflow (D1 investigate → D2 CSS implement → D3 tests/fixtures → D4 review) before merge.
- Problem solved: Chota set
html { font-size: 62.5% }(making1rem = 10px), which hijacked the consumer's root font-size. The migration removes the override and divides all 35 Chota-owned rem tokens by 1.6, so at a 16px consumer root the rendered pixels are identical to before, while respecting the consumer's root (accessibility zoom, consumer overrides). - CSS changes (D2):
src/_base.cssremovedfont-size: 62.5%fromhtml, added a source comment ("Chota does not set the root font-size. All rem values are relative to the consumer's html font-size..."), converted 9 rem tokens including--grid-maxWidth: 120rem→75rem,--grid-gutter: 2rem→1.25rem,--font-size: 1.6rem→1rem.src/_card.css,_form.css,_nav.css,_tab.css,_tag.cssconverted the remaining 26 rem tokens (all ÷1.6).em/%/px/vhvalues unchanged._dropdown.css,_grid.css,_util.css,chota.cssuntouched (no rem / import-only)..container/.row/.col-*consume--grid-gutterviavar(), so the value change propagates without source edits. - Tests & fixtures (D3 + coordinator fix):
test/vrt/root-font-scaling.spec.js(NEW, 3 tests): (1) 16px root rendered pixels match design intent (.cardpadding10px 20px,.tagfont-size16px,.col-6width580px,.buttonheight38px); (2) 10px root scales proportionally by 0.625 (.cardpadding6.25px 12.5px,.tagfont-size10px,.col-6width362.5px); (3) 10px/16px ratio = 0.625 for rem-derived properties. NotoMatchSnapshot(no second baseline, per card requirement). Not wired intotest:vrt(shared-config change requires owner approval — follow-up).test/mobile-grid-overflow.html,test/nav-logo-full-height.html: converted fixture-authored inline rem values (÷1.6) including.demo-label(0.8rem→0.5rem, 0.5rem→0.3125rem) and 14 navmin-height/marginvalues in nav-logo-full-height (3rem→1.875rem ×7, 4rem→2.5rem ×3, 6rem→3.75rem ×3, 0.5rem→0.3125rem ×1). The nav-logo conversions were a coordinator scope correction — D3's brief limited the fixture edit to.demo-label, but the full inline-rem conversion was necessary for VRT to be green.test/vrt/index.spec.js,components.spec.js: comment blocks updated to reflect new source rem values; assertion VALUES unchanged (rendered pixels still correct at 16px root).test/vrt/README.md: documented the new spec.
- Docs:
MIGRATION.mdnew "Root Font-Size Migration" section with consumer impact (3 cases: no override, 62.5% override, different root) and reference table for--grid-maxWidth/--grid-gutter/--font-size.docs/index.htmlCustomizing code blocks updated (75rem,1.25rem,1rem,67.5rem) + explanatory sentence. - Size: 3372 → 3373 gzip bytes (+1, longer decimal tokens partially offset by removing the 62.5% declaration).
baselines/size-baseline.jsonbumped with v1: migrate root font sizing without visual regression #137 rationale. Ceiling 4096 unchanged. - VRT baselines: NO regeneration needed — the rendered pixels at 16px root are identical (the key invariant:
0.625rem × 16px = 10px= old1rem × 10px). All 100 existing VRT tests pass unchanged. - API contract:
test/vrt/api-manifest.jsonNOT modified — custom property names unchanged; only values changed (values not in the manifest).yarn test:api5 passed. - CI: run 31323976666 — all required steps SUCCESS on
ubuntu-latest: Lint, Build + size gate (3373), CSS Public API Contract, Visual Regression Tests (Chromium), Accessibility (axe-core), Browser smoke coverage (Firefox + WebKit) - Local:
yarn buildPASS;yarn test:vrt100 passed (no baseline regeneration);yarn test:a11y4 passed;yarn test:api5 passed;npx playwright test test/vrt/root-font-scaling.spec.js3 passed - D4 review: APPROVE WITH NOTES — merge as-is. All card requirements met, all Done-checklist items pass with evidence, no excluded files touched.
- Scope: 17 files changed (6 src CSS, 2 dist, 1 size-baseline, 2 docs, 2 fixtures, 3 test specs, 1 README); no
AGENTS.md,PLAN.md,test/AGENTS.md,playwright.config.js,package.json,.stylelintrc,postcss.config.js,api-manifest.json,a11y-baseline.jsonchanges - Disposition: accepted
- Risk: none — the migration is mathematically pixel-preserving at a 16px consumer root (verified by 100 VRT tests passing without baseline regeneration). Consumers who set
html { font-size: 62.5% }will see Chota render at 0.625× scale (proportional, documented in MIGRATION.md). Follow-up: wireroot-font-scaling.spec.jsintotest:vrt(requires shared-test-config impact matrix).
Activity
test(vrt): full-page and per-section docs-page coverage (#180) (#181)
jenil commentedon Aug 18, 2026
Week 3 — COMPLETE (7/7)
Card #142 (write migration guide and public API reference) is merged and marked Done. Week 3 is now 7/7 (100%).
#142 acceptance
a695d40d61225793470518d87d4239d4b1bf48d6CHANGELOG.md(new),MIGRATION.md,README.md,docs/architecture.md(4 files, +292/-6)yarn build(3409/4096),yarn test,yarn test:api(5),yarn test:vrt(101),yarn test:a11y(4) — all exit 0Week 3 summary
9b9aee03efaa0078fbcf49ceb7703e1f65e7d2da71a695d40Follow-up cards filed (not blocking Week 4)
docs/examples/dark-mode.html:13should reflect the 17-token API after v1: normalize existing hardcoded design tokens #138.test/vrt/README.md:82a11y coverage row says "index.html" but the spec runs on bothindex.htmlandcomponents.html. Pre-existing; test(vrt): full-page and per-section docs-page coverage before #137/#138 #180 touched the same table.Next: Week 4
Feature scope freezes at #143 except owner-approved release blockers. #145 is the sole
v1→mainintegration path.