chore(maturity): promote the 1.0 component spine (13 components) to stable#655
Merged
Conversation
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.
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
marked this pull request as ready for review
July 20, 2026 17:59
This was referenced Jul 20, 2026
Merged
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.
3 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Promotes the 1.0 stable component spine in
packages/0/src/maturity.json: 13 headless components graduatepreview → stable, along with the 3 composables they rest on.Components →
stable(13):Atom·AspectRatio·Theme·Group·Selection·Single·Step·Tabs·Toggle·Collapsible·Checkbox·Radio·SwitchComposables →
stable(3):useProxyModel·toElement·toArrayThis 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
stablelogic (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 toindex.browser.test.ts(35 cases total, all green). The browser suites exercise real rendered DOM the happy-dom tests could not: native<button>vsrole="button"activators, real click/keydown dispatch, nativedisabledinertness (including that thecreateSingledisabled guard blocks a non-button activator), the appliedhiddenattribute, focus, computedaspect-ratioresolution, invalid-ratio handling, and SSR.Two deviations from the original plan (please sanity-check)
sinceis left untouched. The handoff said setsince: "1.0.0". That contradicts the maturity contract —sincetracks first-ship version, not stability, and is permanent across promotions. Each entry keeps its existingsince(e.g.Theme0.1.11,useProxyModel0.1.0). Onlylevelchanged.toElementandtoArraywere added to the promotion. The handoff's linchpin analysis found onlyuseProxyModel. It missed thatTabsandRadioruntime-importtoElement(preview), anduseProxyModelitself importstoArray(preview). Leaving thosepreviewwould 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.jsonvalidates as JSON; 13 stable components + 19 stable composables. Everysincepreserved.pnpm exec vitest run --project v0:browser→ 35 passed.pnpm --filter @vuetify/v0 typecheckclean; pre-push lint + sherif green.pnpm build:docsgreen (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.gitignoreentry. Removed manually here; not committed.