@nuxt/ui
4.12.0 · 15 Oct 2026MIT412.4k / weekRepositoryHomepagenpmAtom feed
85 stable releases, newest first, by release line. Notes are quoted as the maintainers published them.
- 4.x · latest line
4.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
4.10.0
16 Jul 2026Reading the note…
4.9.0
17 Jun 2026Reading the note…
4.8.2
4 Jun 2026Reading the note…
4.8.1
28 May 2026Reading the note…
4.8.0
21 May 2026Reading the note…
4.7.1
28 Apr 2026Reading the note…
4.7.0
24 Apr 2026Reading the note…
4.6.1
3 Apr 2026Reading the note…
4.6.0
23 Mar 2026Reading the note…
4.5.1
2 Mar 2026Reading the note…
4.5.0
24 Feb 2026Reading the note…
4.4.0
21 Jan 2026Reading the note…
4.3.0
17 Dec 2025Reading the note…
4.2.1
21 Nov 2025Reading the note…
4.2.0
18 Nov 2025Reading the note…
4.1.0
23 Oct 2025Reading the note…
4.0.1
2 Oct 2025Reading the note…
4.0.0
23 Sep 2025Reading the note…
- 3.x
3.3.7
23 Oct 2025Reading the note…
3.3.6
3 Oct 2025Reading the note…
3.3.5
23 Sep 2025Reading the note…
3.3.4
15 Sep 2025Reading the note…
3.3.3
1 Sep 2025Reading the note…
3.3.2
14 Aug 2025Reading the note…
3.3.1
14 Aug 2025Reading the note…
3.3.0
24 Jul 2025Reading the note…
3.2.0
25 Jun 2025Reading the note…
3.1.3
26 May 2025Reading the note…
3.1.2
15 May 2025Reading the note…
3.1.1
2 May 2025Reading the note…
3.1.0
24 Apr 2025Reading the note…
3.0.2
28 Mar 2025Reading the note…
3.0.1
21 Mar 2025Reading the note…
3.0.0
12 Mar 2025Reading the note…
- 2.x
2.22.3
1 Sep 2025Reading the note…
2.22.2
1 Sep 2025Reading the note…
2.22.1
16 Jul 2025Reading the note…
2.22.0
22 Apr 2025Reading the note…
2.21.1
8 Mar 2025Reading the note…
2.21.0
14 Jan 2025Reading the note…
2.20.0
9 Dec 2024Reading the note…
2.19.2
5 Nov 2024Reading the note…
2.19.1
5 Nov 2024Reading the note…
2.19.0
5 Nov 2024Reading the note…
2.18.7
9 Oct 2024Reading the note…