@nuxt/ui
4.12.0 · 15 Oct 2026MIT412.4k / weekRepositoryHomepagenpmAtom feed
Latest releases
All 85 releases4.12.0
15 Oct 2026App: follow the
@nuxtjs/i18nlocaleCalendar: add
yearsPerPagepropChart: new component
:sparkles: Highlights
:bar_chart: Chart component
A new
Chartcomponent built on TanStack Charts rendersline,area,baranddonutcharts as an SVG on the server. Series colors follow your theme and color mode through the new--ui-chart-*CSS variables:<script setup lang="ts"> const data = [ { month: 'January', desktop: 186, mobile: 80 }, { month: 'February', desktop: 305, mobile: 200 }, { month: 'March', desktop: 237, mobile: 120 } ] </script> <template> <UChart type="bar" :data="data" index="month" :categories="[{ key: 'desktop', label: 'Desktop' }, { key: 'mobile', label: 'Mobile' }]" stacked /> </template>[!NOTE]
@tanstack/chartsis an optional peer dependency, install it to use the component. When the props are not enough, thedefinitionprop takes a full TanStack chart definition.:globe_with_meridians: Automatic locale with
@nuxtjs/i18nWhen
@nuxtjs/i18nis installed, theAppcomponent now follows the current i18n locale, and only the Nuxt UI locales matching youri18n.localesare bundled. You can drop theimport * as localespattern, which shipped every locale in the entry chunk:- <script setup lang="ts"> - import * as locales from '@nuxt/ui/locale' - - const { locale } = useI18n() - </script> - <template> - <UApp :locale="locales[locale]"> + <UApp> <NuxtPage /> </UApp> </template>[!TIP]
An explicitlocaleprop still wins, see the i18n guide.:zap: Lighter and faster pages
Pages now load up to 27% less JavaScript. A page no longer loads the code of components only other pages use, and overlays are lazy loaded: the menu of
Header,SidebarandDashboardSidebar, the command palette ofDashboardSearchandContentSearch, and the toasts ofToaster.v4.11.3 v4.12.0 JS 871.6 kB 549.6 kB JS (gzip) 251.9 kB 183.9 kB [!NOTE]
UButtonalso mounts about 38% faster and each item of an openDropdownMenuabout 30% faster, since link props are now picked without a reactive proxy.:rocket: Features
App: follow the
@nuxtjs/i18nlocaleCalendar: add
yearsPerPagepropChart: new component
ChatReasoning: add
autoOpenpropCheckboxGroup: add
maxpropcomponents: add
looppropcomponents: allow controlling heading element via
aspropContextMenu: add
openandpressOpenDelaypropsFileUpload: add
rejectevent for dropped filesFileUpload: support custom file items in
v-modelInputMenu: add default slot
InputNumber: add
startingValueandallowInvalidpropsmodule: export prose components from
@nuxt/ui/components/proseNavigationMenu: add
viewportpropProsePrompt: add
promptpropSidebar: add
breakpointpropToast: add
closeOnClickto actions
:bug: Bug Fixes
App: forward
noncepropChart: render tooltip above center slot
ChatMessages/ChatPromptSubmit: add accessible names to icon buttons
ColorModeButton: resolve label after mount
components: localize hardcoded accessibility labels
components: prevent empty trailing slot when loading
components: spin trailing loading icon with avatar
ContentSearch/DashboardSearch: handle
undefinedselection when an item is toggled offContentToc: raise list min height
Drawer: don't disable body pointer events with
noBodyStylesDrawer: emit
after:leaveandafter:enterwhen the animation endsEditor: align link styles with prose
FileUpload: make the
dropzoneprop reactiveForm: accept empty values in
statetypeKbd: avoid hydration mismatch for platform-specific keys
Link: promote queued prefetch on interaction
Listbox: add accessible name to listbox
Pagination: localize
aria-labelof controls and pagesProseA: hide underline on focus and around inline code
SelectMenu: keep controls outside the listbox
SelectMenu: keep menu open when focus moves outside
Slideover: only cap width from
smbreakpointTable: measure virtualized rows with variable heights
Table: respect
defaultColumncell and headertheme: remove unknown and conflicting classes
Tree: pass
disabledto tree itemuseToast: skip pulse while toast is animating
useTour: accept any CSS selector as step target
:fire: Performances
components: import Reka UI primitives by name instead of from
reka-ui/namespacedcomponents: pick link props without a reactive proxy
DashboardSearch/ContentSearch: lazy load modal and command palette
Header/DashboardSidebar/Sidebar: lazy load menu overlay
Toaster: lazy load toast component
useComponentProps: skip prop resolution for Vue internal flags
:green_heart: Contributors
4.11.3
1 Oct 2026- security
utils: prevent prototype pollution in
setandsetAtPath App: apply the
dirprop to the provided localeChatPrompt: add
method="post"to prevent input leaking via GET before hydration
:bug: Bug Fixes
App: apply the
dirprop to the provided localeChatPrompt: add
method="post"to prevent input leaking via GET before hydrationCheckboxGroup/RadioGroup: lift a hovered table item above its neighbors
ContentSearch/DashboardSearch: use translated search label as dialog title
DashboardSidebar/Header: use translated toggle label as menu dialog title
EditorToolbar: use tooltip text as
aria-labelon icon-only buttonsForm: include nested forms in parent
dirtystateForm: keep dirty state and validation in sync with input
Form: merge unnamed nested forms into a parent without schema
module: detect kebab-case components in Pug templates
module: generate classes prefixed by
usePrefixmodule: use
@custom-variantforlightanddarkvariantsProseA: only round corners on focus
Select/SelectMenu: keep focus moved on selection
Table: keep footer separator above pinned columns
theme: drop double quotes from class strings
useFilter: keep labels and separators in place while sorting
useOverlay: resolve every pending promise when reopened
- security
utils: prevent prototype pollution in
setandsetAtPath
:green_heart: Contributors
4.11.2
22 Sep 2026components: allow partial
uioverrides on itemscomponents: fall back to
mdfor custom sizes in virtualizerDashboardNavbar: render title only when defined
:bug: Bug Fixes
components: allow partial
uioverrides on itemscomponents: fall back to
mdfor custom sizes in virtualizerDashboardNavbar: render title only when defined
FieldGroup: add
defaultVariantsin themeForm: clear only the targeted field inside a nested form
Input/Textarea: keep
0withnullableandoptionalmodifiersInputDate/InputTime: emit focus and blur when focus enters or leaves the field
InputMenu: ignore
multiplein autocomplete modeInputMenu: prevent tags input from adding the search term on enter
InputMenu: round corners inside a FieldGroup in multiple mode
Link: propagate click handler errors to Vue error handling
PinInput: emit blur whenever focus leaves the group
SelectMenu/InputMenu: ignore clear button when disabled
SelectMenu: open menu on arrow keys
SelectMenu: remove the inherited "Show popup" aria-label (aab2d10), closes #6962
Table: emit
aria-sorton sortable th elementsTable: inset row focus outline
Table: make rows with a select event keyboard accessible
Toaster: prevent
onClickfrom being called twicevue: resolve explicit component imports to their Vue overrides
:green_heart: Contributors
4.11.1
7 Sep 2026ChatMessages: add missing
colortouserandassistantpropsCheckbox/RadioGroup: add
flex-wraponlistandcardvariantsCheckbox/RadioGroup: use
border-defaultoncardandtablevariants
:bug: Bug Fixes
ChatMessages: add missing
colortouserandassistantpropsCheckbox/RadioGroup: add
flex-wraponlistandcardvariantsCheckbox/RadioGroup: use
border-defaultoncardandtablevariantsCommandPalette: keep astral characters intact when truncating search results
Form: omit method attribute on nested forms
InputNumber: work uncontrolled with only a default value
Link: restore prefetching with Nuxt 4.5 custom slot
Link: wait for
onNuxtReadybefore observing visibilityNavigationMenu: avoid duplicate accordion trigger on items without
toProseCodeTree: invoke default slot from render
Select/SelectMenu: add responsive text size
SelectMenu: prevent search input focus on open with
autofocus: falseSlider: emit a number for a single thumb
Table: exclude hidden columns from colspan
:green_heart: Contributors
4.11.0
21 Aug 2026- security
CommandPalette: always escape search highlight to prevent XSS
CheckboxGroup/RadioGroup: support
iconin itemsProgressGroup: new component
:sparkles: Highlights
:left_right_arrow: Splitter component
A new
Splittercomponent lets you build layouts with resizable panels separated by draggable handles, with min/max sizes, collapsible panels, nesting and vertical orientation:<script setup lang="ts"> import type { SplitterItem } from '@nuxt/ui' const items: SplitterItem[] = [ { slot: 'sidebar', minSize: 15, maxSize: 40, defaultSize: 25 }, { slot: 'main', defaultSize: 75 } ] </script> <template> <USplitter id="layout" :items="items" class="h-96"> <template #sidebar> Sidebar </template> <template #main> Main </template> </USplitter> </template>[!TIP]
Set theidprop when rendering on the server so ids match on hydration, andauto-save-idto persist the layout tolocalStorage.:bar_chart: ProgressGroup component
A new
ProgressGroupcomponent displays multiple values as segments of a single progress bar, with a legend listing each item. Items take any theme color or a CSS color, and thestatusprop shows the total:<script setup lang="ts"> import type { ProgressGroupItem } from '@nuxt/ui' const items: ProgressGroupItem[] = [ { label: 'System', value: 24, color: 'neutral', icon: 'i-lucide-cog' }, { label: 'Apps', value: 8, color: 'error', icon: 'i-lucide-app-window' }, { label: 'Multimedia', value: 42, color: 'success', icon: 'i-lucide-film' } ] </script> <template> <UProgressGroup :items="items" :max="128" status /> </template>:art: Snappier motion
Animations and movement transitions now all run on
--ease-out, exits included. Override the token in your@themeto retime the whole library, see the Motion section:@theme { --ease-out: cubic-bezier(0.16, 1, 0.3, 1); }[!NOTE]
prefers-reduced-motionnow covers overlays too, they fade in place, and movement transitions like theTabsindicator stop.:package: Component detection for Vue
The
@nuxt/ui/viteplugin now supportsexperimental.componentDetectionlike the Nuxt module. It scans your source and only generates the theme CSS for the components you use:import ui from '@nuxt/ui/vite' export default defineConfig({ plugins: [ ui({ experimental: { componentDetection: true } }) ] })[!NOTE]
Pass an array of component names instead to include components rendered with<component :is>that can't be detected.:rocket: Features
CheckboxGroup/RadioGroup: support
iconin itemsProgressGroup: new component
Splitter: new component
locale: validate locales against CLDR in CLI and tests
vue: support
experimental.componentDetection
:bug: Bug Fixes
AuthForm: type submit payload with the schema output
Calendar: correct size scale
- security
CommandPalette: always escape search highlight to prevent XSS
components: resolve theme props consistently in form controls
ContentToc: prevent list from collapsing
Editor: ignore updates without document changes
Icon: render bundled icons during SSR in Vue
locale: correct native names and tajik language code
locale: correct slide placeholder casing in lb
Marquee: use logical properties and drop broken vertical RTL animation
Modal: emit transition events from overlay when
scrollableSlider: bind form aria attributes on thumbs instead of root
Slider: forward aria attributes to the thumb
theme: blank top-level
baseinapplyUnstyledtheme: keep variants when replacing slot classes in app config
Theme: merge
classfrompropswith the component classtheme: replace deprecated bare tailwind aliases
theme: respect reduced motion on remaining movement transitions
theme: unify motion easing and respect
prefers-reduced-motionTree: use logical padding for indentation
:fire: Performances
Button/Select/SelectMenu/InputMenu: narrow reactive dependencies
components: memoize tv slot invocations with simple args
:globe_with_meridians: Locales
locale: add Austrian language
:green_heart: Contributors
Dependency tracking · free for 3 projects
Know when your own dependencies move
@nuxt/ui had 1 security advisory in the last 12 months. Inlinr emails you the day one touches a project of yours, with the version that fixes it.
Advisories reach you
An email when a critical or high advisory affects a project, before the next install.
Upgrades checked first
Peer ranges, Node, ESM-only and types changes read before you bump.
Only what matters
Majors and breaking notes stay; patches and sibling bumps fold into one line.
Registry facts last checked 22 Oct 2026. Releases and advisories last read 22 Oct 2026.