Overview
🔧 Bug Fixes
- Breadcrumbs: collapsed crumbs no longer strand focusable links in the accessibility tree, and the ellipsis can opt into a disclosure toggle (#614)
- utilities:
isArraynow preserves element types, tuples andreadonlywhen narrowing (#744) - utilities:
isObjectnarrows toRecord<string, any>so interfaces and negative branches work (#723) - Button,Toggle,Pagination: activate non-native
aselements on Enter/Space (#645) - useProxyModel: keep a v-model value whose item has not rendered yet (#727)
- v0: accept Vue 3.6 prereleases and surface npm discovery metadata (#720)
- useResizeObserver: report border-box measurements so the
boxoption is no longer a silent no-op (#724)
Other Commits
- Collapsible: cover keyboard toggle for non-native activator elements (#641)
Patch Changes
-
#634
b8ae3beThanks @sridhar-3009! - fix(Breadcrumbs): collapsed crumbs no longer strand focusable links in the accessibility tree, and the ellipsis can opt into a disclosure toggle (#614)Truncated crumbs are now marked
inertrather than relying ondisplay: nonealone. Renderless consumers who bindattrsonto their own markup were shipping links that assistive technology could not see but the keyboard could still reach.A new
Breadcrumbs.Activatorreveals the collapsed crumbs. Place one insideBreadcrumbs.Ellipsisand the ellipsis becomes a disclosure — the ellipsis stays the list item and the Activator is the control, so the trail keeps a valid list structure. It shipsaria-expanded, a count-aware label, and adata-statehook for styling.The default is unchanged — an ellipsis with no Activator stays hidden from assistive technology, so opt in where the collapsed levels matter.
-
#745
560c6f5Thanks @johnleider! - fix(utilities):isArraynow preserves element types, tuples andreadonlywhen narrowing (#744)isArraynarrowed everything tounknown[], which erased the element type of arrays whose elements involveany, turnedreadonlyarray unions into an intersection that is not an array of anything, and left the array constituent in place in theelsebranch. Guarding areadonly string[] | stringgave you neitherreadonly string[]in theifnorstringin theelse.Narrowing is now exact: element types, tuple arity and
readonlysurvive the guard, and theelsebranch drops exactly the array constituents.unknownandanyinputs narrow as before (unknown[]andany[]), so mutation and assignment tounknown[]keep compiling.Not breaking — runtime is unchanged, and every input either narrows identically or more precisely than before.
-
#746
b6a90b6Thanks @johnleider! - fix(utilities):isObjectnarrows toRecord<string, any>so interfaces and negative branches work (#723)isObjectpreviously narrowed toRecord<string, unknown>. That destroyed known property types on interface-typed values (TypeScript never grants interfaces an implicit index signature) and leftRecord<string, any>members alive in theelsebranch of a union. Both are incorrect narrowing, not a strictness win.The predicate is now
Record<string, any>. Runtime is unchanged. Not breaking — the widened predicate is assignable from the old one for any program that already typechecked. -
#645
1cf1ce3Thanks @sridhar-3009! - fix(Button,Toggle,Pagination): activate non-nativeaselements on Enter/Space (#645)ButtonRoot,ToggleRoot, andPaginationItemexposerole="button"andtabindexwhen rendered with a non-nativeaselement (e.g.as="div"), but browsers only synthesize a click from Enter/Space for native<button>elements — for everything else those were dead keys. All three now wire anonKeydownhandler (only whenas !== 'button') so keyboard users can activate them. -
#727
adaace9Thanks @johnleider! - fix(useProxyModel): keep a v-model value whose item has not rendered yetSetting a v-model to a value whose item registers later — selecting a tab that is only rendered once it becomes active, or an option in a list that has not mounted — was immediately reverted to the previous selection.
useProxyModelalready defers such values so late-registering items resolve them, but the same tick wrote the old selection back over the model, discarding the value before its item could register. When the model is a writablecomputed, that write ran the setter, so the revert also fired the consumer's own side effects.Values with no registered item are now held until their item registers; a value whose item exists but was refused (disabled, or blocked by
mandatory) still reverts as before. -
#720
6c157ffThanks @johnleider! - fix(v0): accept Vue 3.6 prereleases and surface npm discovery metadata@vuetify/v0now installs cleanly alongsidevue@3.6.0-rc.x. The previousvuepeer range of>=3.5.0excluded prereleases per semver, so any project on a 3.6 release candidate hitERESOLVE; the range is now>=3.5.0 || >=3.6.0-0. No change for projects on stable Vue.The package also publishes
keywords,homepage, andbugsfor the first time, and thedescriptionnow leads with what the package is — headless, unstyled, accessible Vue 3 primitives and composables. -
#725
6791e7bThanks @johnleider! - fix(useResizeObserver): report border-box measurements so theboxoption is no longer a silent no-op (#724)useResizeObserveracceptedbox: 'border-box'but every entry it reported was content-box, so any element with padding or a border measured short by exactly that amount — with no type error and no warning. Entries now also carryborderBoxSizeandcontentBoxSize, matching the nativeResizeObserverEntry:useResizeObserver( el, ([entry]) => { entry.contentRect.height; // 30 — content box, as before entry.borderBoxSize[0].blockSize; // 40 — with 4px padding and a 1px border }, { box: "border-box" } );
Both arrays are present on every entry regardless of
box, so you can read the border box without changing any option. UnlikegetBoundingClientRect(), they are layout values and are not scaled by CSS transforms.contentRectis unchanged — existing callbacks keep working as-is. -
#641
497b328Thanks @sridhar-3009! - test(Collapsible): cover keyboard toggle for non-native activator elements (#641)CollapsibleActivatoralready handles Enter/Space and setsrole="button"for non-nativeaselements, but no test asserted that a non-native activator actually toggles the collapsible on Enter/Space. Adds two tests covering that gap.