Skip to content

chore(maturity): promote the 1.0 component spine (13 components) to stable#655

Merged
johnleider merged 2 commits into
masterfrom
worktree-v0-stable-spine
Jul 20, 2026
Merged

chore(maturity): promote the 1.0 component spine (13 components) to stable#655
johnleider merged 2 commits into
masterfrom
worktree-v0-stable-spine

Conversation

@johnleider

@johnleider johnleider commented Jul 20, 2026

Copy link
Copy Markdown
Member

What

Promotes the 1.0 stable component spine in packages/0/src/maturity.json: 13 headless components graduate preview → stable, along with the 3 composables they rest on.

Components → stable (13): Atom · AspectRatio · Theme · Group · Selection · Single · Step · Tabs · Toggle · Collapsible · Checkbox · Radio · Switch

Composables → stable (3): useProxyModel · toElement · toArray

This takes the stable component count from 0 → 13 — a 1.0 shipping with zero stable components was the optics problem the spine solves.

Gating rule

A component cannot be more stable than any composable it imports. Every promoted component was verified to rest only on stable logic (the already-stable selection family, useTheme, createContext) plus the three composables promoted here.

Browser-test migration (Collapsible, AspectRatio)

These two shipped only happy-dom index.test.ts, while all 11 other spine components are tested browser-only in real Chromium. To meet the "browser tests cover failure modes" promotion gate — and to match the sibling convention — both were migrated to index.browser.test.ts (35 cases total, all green). The browser suites exercise real rendered DOM the happy-dom tests could not: native <button> vs role="button" activators, real click/keydown dispatch, native disabled inertness (including that the createSingle disabled guard blocks a non-button activator), the applied hidden attribute, focus, computed aspect-ratio resolution, invalid-ratio handling, and SSR.

Two deviations from the original plan (please sanity-check)

  1. since is left untouched. The handoff said set since: "1.0.0". That contradicts the maturity contract — since tracks first-ship version, not stability, and is permanent across promotions. Each entry keeps its existing since (e.g. Theme 0.1.11, useProxyModel 0.1.0). Only level changed.

  2. toElement and toArray were added to the promotion. The handoff's linchpin analysis found only useProxyModel. It missed that Tabs and Radio runtime-import toElement (preview), and useProxyModel itself imports toArray (preview). Leaving those preview would either force-drop Tabs + Radio from the spine or leave a stable API resting on preview internals. Both are trivial, settled, #__NO_SIDE_EFFECTS__ pure transformers with tests + docs + examples and no signature churn in git — so they were promoted to complete the transitive closure honestly. If you'd rather hold them, the alternative is dropping Tabs + Radio.

Verification

  • maturity.json validates as JSON; 13 stable components + 19 stable composables. Every since preserved.
  • New browser tests: pnpm exec vitest run --project v0:browser35 passed.
  • pnpm --filter @vuetify/v0 typecheck clean; pre-push lint + sherif green.
  • pnpm build:docs green (roadmap <DocsMaturity /> + index tables regenerate from this JSON — not hand-edited).

Note

The test-artifact dirs (.vitest-attachments/, __screenshots__/) generated on a failing browser run are not gitignored in this repo — a minor hygiene gap, worth a follow-up .gitignore entry. Removed manually here; not committed.

Promote 11 headless components to level: stable for the 1.0 release —
Atom; the Theme/Group/Selection/Single/Step providers; Tabs; Toggle; and
the Checkbox/Radio/Switch form controls. Promote the three supporting
composables they rest on (useProxyModel, toElement, toArray) so the
stable label never sits on a preview logic layer.

Only the 'level' field changes; every 'since' is left at each entry's
first-ship version per the maturity contract (since tracks first release,
not stability). No source, behavior, or signature changes.

Collapsible and AspectRatio stay preview pending browser-test coverage.
@johnleider johnleider added this to the v1.0.0 milestone Jul 20, 2026
@johnleider johnleider added the documentation Improvements or additions to documentation label Jul 20, 2026
@johnleider johnleider self-assigned this Jul 20, 2026
Migrate both components from happy-dom index.test.ts to real-Chromium
index.browser.test.ts, matching the browser-only convention of the other
11 spine components. The browser tests exercise real rendered DOM: native
button vs role=button activators, real click/keydown dispatch, native
disabled inertness, the applied hidden attribute, focus, computed
aspect-ratio resolution, invalid-ratio handling, and SSR.

With their failure-mode gate now met, promote Collapsible and AspectRatio
to level: stable, completing the 13-component 1.0 spine. since untouched.
@johnleider johnleider changed the title chore(maturity): promote the 1.0 component spine to stable chore(maturity): promote the 1.0 component spine (13 components) to stable Jul 20, 2026
@johnleider
johnleider marked this pull request as ready for review July 20, 2026 17:59
@johnleider
johnleider merged commit 65952f2 into master Jul 20, 2026
20 checks passed
@johnleider
johnleider deleted the worktree-v0-stable-spine branch July 20, 2026 17:59
This was referenced Jul 20, 2026
sridhar-3009 added a commit to sridhar-3009/0 that referenced this pull request Jul 24, 2026
… elements

CollapsibleActivator correctly implements onKeydown for Enter/Space and
sets role=button when as is not 'button'. The 'non-button activator'
describe block already covers role=button/tag/no-type-attribute and a
click-based toggle, but nothing verified that a non-native activator
actually toggles on Enter/Space — only the default button activator had
keyboard coverage.

Add two tests to the existing 'non-button activator' block, matching
the style already used by the 'open via keyboard' block: mount with
activatorAs: 'div', trigger a real keydown event on the role=button
element, and assert the content unhides.

Rebased onto master's post-vuetifyjs#655 test layout: index.test.ts was
consolidated into index.browser.test.ts as part of the 1.0 promotion,
and the test style moved from capturing render-prop handlers to
triggering real DOM events via @vue/test-utils. Rewrote both new tests
in that style rather than reintroducing the old render-prop pattern.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant