Added
feat-
New hooks -
useFocusContainment(trap Tab inside a custom modal and restore focus on close) anduseEventCallback(stable callback that always calls the latest closure). Registry items import them from@vllnt/ui. -
Props types exported from the barrel -
BreadcrumbProps,CommandDialogProps,SheetContentProps,CarouselProps,CodeBlockProps,MDXContentProps,SidebarProps,TableOfContentsProps,CategoryFilterProps,SearchBarProps,ShareSectionProps,SearchDialogProps,LangProviderProps,ThemeToggleProps,ProfileSectionProps,TLDRSectionProps,AreaChartProps,BarChartProps,LineChartPropsandThemePresetProviderProps. -
Source-only React Native renderer and shared design contracts (
@vllnt/ui-core,@vllnt/ui-native). They are experimental and not published with this release; installing@vllnt/uiis unchanged. -
Localized Native catalog discovery, dependency/capability comparison, and extensible React/React Native source tabs in a single component preview surface.
-
Accessibility gate - the Storybook test-runner runs axe-core (WCAG 2.0, 2.1 and 2.2, levels A and AA) on every story in the light and dark theme and fails on any violation. A story can turn a rule off only through
parameters.a11y.config.ruleswith a writtenreason. (#543) -
Optional accessibility props (English defaults, nothing required):
popoverLabelon Combobox, MultiSelect, DatePicker, DateRangePicker, TimePicker and ColorPicker;aria-label/aria-labelledby/aria-describedby/idon Combobox;aria-label/aria-labelledbyon InlineInput and ScrollArea; NumberInputincrementLabel/decrementLabel; Marquee and TickerTapepauseControl+labels; TabsContenttabIndex; GanttChartLabelsregion; CompletionDialogmodal; Paginationlabels; AIArtifactLabelscontent; ModelSelectorlistLabel; DataTableFilterariaLabel; VideoEmbedplayLabel. (#543) -
New exports -
moveRovingFocus(+RovingFocusOptions,RovingOrientation),useReturnFocus(+ReturnFocusHandlers),focusCalendarDay,CHECKLIST_PROGRESS_EVENT,parseChecklistStorageValue,MarqueeLabels,TickerTapeLabels,PaginationLabels. Registry items now import these from@vllnt/ui, so installing them needs a@vllnt/uirelease that contains them (the registry pins^0.3.0, which does not).registry:integritynow fails when a registry item imports a name that@vllnt/uidoes not export. (#543)
Changed
all-
Colour tokens meet WCAG AA (#538). The default light theme uses a darker
--muted-foreground,--destructiveand--input; in the dark theme--destructiveis lighter with a dark foreground and--inputis lighter, so input borders are easier to see in both. Presets adjust--primary,--destructive,--inputand--ringthe same way. Visual snapshots change. -
Font tokens on
:root-styles.cssnow defines--font-sans,--font-displayand--font-monoon:root. If your app sets variables with these names, declare them later in the cascade or onbodyso yours win. -
Lighter imports (#541) - CodeBlock renders its code as plain text first and highlights it once the Prism build loads on the client; TutorialMDX loads the MDX compiler only for content with JSX, and FlowDiagram loads
html-to-imageonly when copied. Apps that use neithertoastnorToasterno longer bundle sonner. -
Smaller package - the tarball has 361 files instead of 659: the per-component re-export stubs and
dist/test-setup.jsare gone. Only theexportsentry points are public, so imports do not change. -
Peer dependency ranges now match what the package needs.
nextis>=15.0.0(Next 14 peers React 18, which the React 19 build cannot use),tailwindcssis^3.4.0(components usesize-*,text-balanceandhas-[], and the preset and CSS are Tailwind v3 only), andnext-themesis now a required peer because the root entry imports it.nextstays optional in metadata, but the root entry still importsnext/link,next/imageandnext/navigation, so non-Next apps must alias them (see the README workaround).reactandreact-domstay>=19.0.0: SearchBar and Slideshow no longer call React 19.2'suseEffectEvent, so 19.0 and 19.1 work. -
Accessibility behaviour changes (#543):
- Drawer moves focus into its content on open (
autoFocusnow defaults totrue; passautoFocus={false}for vaul's previous behaviour). - CompletionDialog is built on the Radix dialog: it traps focus, closes on
Escape and returns focus to the opener.
modal(defaulttrue) maps to Radixmodal;modal={false}leaves the page behind it interactive. Shortcuts work only while focus is inside the dialog, an empty string turns one off, and Enter no longer confirms from any focused element. - Marquee and TickerTape show a 24px pause/play button by default
(
pauseControl={false}hides it). It overlays the top-right corner of the Marquee and the right edge of the TickerTape, and hides under reduced motion, when nothing moves. - Pagination renders a
navlandmark of single links styled as buttons, witharia-current="page"on the current page (it used to nest a button in each link). - CodeBlock syntax colours come from the
--vllnt-code-*CSS variables (OKLCH channels) instead of JS theme detection. The defaults reach 4.5:1 on the background in light and dark mode for the default theme and every preset; override the variables to restyle. - CommandSeparator renders an
aria-hiddendivider. - Under
prefers-reduced-motion, components stop their own decorative animation and AnimatedText shows its final text at once; loaders markeddata-motion="essential"keep spinning, slower. The stylesheet changes motion only on library components, never on your own elements. - TabsContent is a tab stop only when the panel holds no focusable element; the ScrollArea viewport is a tab stop only while its content scrolls.
- TreeView supports Home / End, ArrowRight to the first child and ArrowLeft to the parent, and keeps the active row in view.
- Drawer moves focus into its content on open (
Fixed
fix-
Setup docs - the Tailwind config in both READMEs, the installation page and the agent skill now lists
./node_modules/@vllnt/ui/dist/**/*.jsincontent. Tailwind 3 ignores a preset'scontentonce the app sets its own, so the documented config generated no component styles. The agent skill's peer ranges and colour format (OKLCH) are corrected too. -
Tailwind preset dependency -
tailwindcss-animate, which@vllnt/ui/tailwind-presetimports, is now a runtime dependency. With 0.3.0 the preset failed to load unless the app installed it. -
Duplicate React keys - Terminal, FileUpload, AvatarGroup, Breadcrumb and about 20 other list renderers no longer key rows by content or label alone, so repeated or blank entries stop triggering duplicate-key errors. FileUpload adds an identical file (same name, size and lastModified) once, so removal removes one entry, and a selection that adds nothing new does not call
onFilesChange. -
"use client"directives - Toolbar, Stepper, AIChatInput, ObjectCard, OverviewBoard and ZoomHUD use event handlers or browser globals and now carry the directive.check:use-clientalso flags handler props and browser globals. -
Focus in custom dialogs - KeyboardShortcutsHelp, TableOfContentsPanel, the FlowDiagram fullscreen view and the Slideshow contents panel keep Tab and Shift+Tab inside the dialog and return focus to the opener on close.
-
DataTable sortable headers expose
aria-sort. -
Contrast - Rating stars and the green success icons in Checklist, Curriculum and LearningObjectives reach 3:1 against the background in light and dark themes.
-
Decorative inline
<svg>icons are hidden from assistive technology. -
Preserve nested scrolling, reduced-motion behavior and sidebar keyboard focus in the affected Web components.
-
Forward explicit tab accessibility relationships and label/keyboard handlers without changing default tab navigation.
-
Emit JSON-LD graph documents and localized Native discovery metadata without advertising unpublished npm packages.
-
Accessible names, ARIA structure, APG keyboard patterns (tabs, radio groups, listbox, tree, dialogs and focus return), reduced motion and hard-coded palette contrast across the Web components flagged by the #535 audit. (#543)