Changelog

Discover the latest releases from Nuxt and the official modules.
@nuxt/ui

v4.3.0

✨ Highlights

:pencil: New Editor components

We're introducing a suite of 6 new components to build rich text editors, powered by TipTap:

  • Editor: The root component supporting JSON, HTML, and Markdown content types.
  • EditorToolbar: A customizable toolbar with formatting actions, link editing, and extensible item groups.
  • EditorSuggestionMenu: A command menu (/) to insert headings, lists, code blocks, images, and more.
  • EditorMentionMenu: A mention menu (@) to reference users or other entities.
  • EditorEmojiMenu: An emoji picker (:) to insert emojis inline.
  • EditorDragHandle: A drag handle to reorder blocks with a dropdown menu for block actions.

The Editor is fully extensible through TipTap's extension system and exposes the editor instance for advanced use cases.

We've also released a new Editor template that showcases all the Editor components in a production-ready setup with real-time collaboration via PartyKit and AI autocompletion using AI SDK and Vercel AI Gateway.

https://github.com/user-attachments/assets/e4a799a3-8de1-4c85-b7f0-ca24789a6d98

📜 New ScrollArea component

The ScrollArea component provides a flexible scroll container with built-in virtualization support through TanStack Virtual.

https://github.com/user-attachments/assets/8d3bcb2c-f5b4-4412-99b1-f33e1b53dd8e

🚀 Features

🐛 Bug Fixes

  • BlogPost/ChangelogVersion/PageFeature/User: allow tab focus (47d93d3), closes #5635
  • Carousel: consistent stopOnInteraction behavior (#5489) (36a7861)
  • Carousel: improve dots focus styles (cc90fb8)
  • ColorModeButton: improve icon class merging (2ce9af2)
  • ContentSearch/DasboardSearch: set full height on mobile to prevent jump (70317e5)
  • DashboardResizeHandle: allow hover over panel with z-index (07147f1)
  • FormField: hide error if error prop is false (#5599) (6b7fe25)
  • InputDate/InputTime: add missing field group variant (#5596) (cb3cec2)
  • PageCard/PageCTA/PageSection: handle reverse prop under lg screens (#5545) (60b430c)
  • ProseA/ProseCallout/ProseCard: improve focus styles (df5f8c2)
  • Slider: add aria-label to thumb (#5313) (f99ec46)
  • Table: only forward necessary props (#5527) (b0b209e)
  • Table: properly position pinned columns based on size (e885b0e), closes #4721 #3927

🌐 Locales

👋 New Contributors

Full Changelog: https://github.com/nuxt/ui/compare/v4.2.1...v4.3.0

@nuxt/hints

v1.0.0-alpha.4

🚀 Enhancements

  • Hydration issues across tabs and reloads (#149)

🩹 Fixes

  • deps: Update all non-major dependencies (#147)
  • Skip hydration components transformation (#164)
  • third-party: Use eventlisteners for load event (#165)
  • Remove import specifiers with correct end offset (#162)
  • Search through all matching import declaration for findImportSpecifier (#167)
  • deps: Update all non-major dependencies (#160)
  • deps: Update all non-major dependencies (#168)
  • Use code.include and code.exclude instead of pure regex (#171)

🏡 Chore

❤️ Contributors

nuxt

v4.2.2

4.2.2 is the next patch release.

✅ Upgrading

Our recommendation for upgrading is to run:

npx nuxt upgrade --dedupe

This will deduplicate your lockfile as well, and help ensure that you pull in updates from other dependencies that Nuxt relies on, particularly in the unjs ecosystem.

👉 Changelog

compare changes

🩹 Fixes

  • nitro: Do not show pretty error handler when testing (243261edb)
  • nuxt: Generate valid references for component declaration items (#33388)
  • nuxt: Sync internal route before calling page:finish hook (#33707)
  • kit: Add TypeScript path alias support for test files (#33672)
  • nitro: Ensure html is a string before injecting error handler (f70b70c97)
  • nitro: Include layer server directories in tsconfig.server.json (#33510)
  • nuxt: Ensure deduped async data executions return latest promise (#33740)
  • kit,nuxt: Type + respect moduleDependencies by meta name (#33774)
  • nuxt,schema: Ignore .d.vue.ts declarations (1c73525a2)
  • kit,nuxt: Protect against resolved nuxt module subpath (#33767)
  • nuxt: Re-execute callOnce during HMR (#33810)
  • nuxt: Resolve watch callback after reactive key change in useAsyncData (#33802)
  • nuxt: Escape HTML in development error page stack trace (#33820)
  • kit: Do not add resolved rootDir to cached layer config (#33779)
  • kit,schema: Add moduleDependencies -> installModule (#33689)

💅 Refactors

  • nuxt: Improve type safety within callOnce function (#33825)

📖 Documentation

  • Split directory structure and re-order guides (v4) (#33691)
  • Add hints release (#33701)
  • Fix link to vitest globals config (#33702)
  • Add mcp server and llms.txt (#33371)
  • Fix 404 link (98c2f1397)
  • Text consistency (#33709)
  • Type error as non-optional prop (#33763)
  • Reformat tables (#33813)

🏡 Chore

  • Update pnpm to 10.21 and enable trust policy (d2c9711c0)
  • Revert pnpm trust policy and restore provenance action (f9d0e0a3d)
  • Update markdownlint config to ignore mdc issues (e7fff7132)
  • Pin to single version of unstorage (ec316eae8)

✅ Tests

  • Add patchProp and nodeOps to excluded Vue helpers (#33754)
  • Use fake timers for watch params test (08d9d2f3b)

🤖 CI

  • Add --pnpm flag to correctly publish prerelease (#33688)
  • Update action lint config (#33710)

❤️ Contributors

  • Daniel Roe (@danielroe)
  • Florian Heuberger (@Flo0806)
  • Konstantin Telyakov (@kTelyakov)
  • abeer0 (@iiio2)
  • Julien Huang (@huang-julien)
  • Matej Černý (@cernymatej)
  • Robin (@OrbisK)
  • Dheeraj Joshi (@dheeraj3587)
  • Alexander Lichter (@TheAlexLichter)
  • Edwin Samodra (@edwinsamodra)
  • edison (@edison1105)
  • 山吹色御守 (@KazariEX)
  • Sébastien Chopin (@atinux)
  • Hugo (@HugoRCD)
  • pierreoa (@pierreoa)
  • Maxime Pauvert (@maximepvrt)
nuxt

v3.20.2

3.20.2 is the next patch release.

✅ Upgrading

Our recommendation for upgrading is to run:

npx nuxt upgrade --dedupe --channel=v3

This will deduplicate your lockfile as well, and help ensure that you pull in updates from other dependencies that Nuxt relies on, particularly in the unjs ecosystem.

!NOTE This will only work if you already have a version of @nuxt/cli which has the --channel flag. If this does not work, you can instead run npx nuxi@latest for the initial upgrade.

👉 Changelog

compare changes

🩹 Fixes

  • nitro: Do not show pretty error handler when testing (cc75ce409)
  • nuxt: Generate valid references for component declaration items (#33388)
  • nuxt: Sync internal route before calling page:finish hook (#33707)
  • nitro: Ensure html is a string before injecting error handler (6f51a25e9)
  • nitro: Include layer server directories in tsconfig.server.json (#33510)
  • nuxt: Ensure deduped async data executions return latest promise (#33740)
  • kit,nuxt: Type + respect moduleDependencies by meta name (#33774)
  • nuxt,schema: Ignore .d.vue.ts declarations (9a6a770ab)
  • kit,nuxt: Protect against resolved nuxt module subpath (#33767)
  • nuxt: Re-execute callOnce during HMR (#33810)
  • nuxt: Resolve watch callback after reactive key change in useAsyncData (#33802)
  • nuxt: Escape HTML in development error page stack trace (#33820)
  • kit: Do not add resolved rootDir to cached layer config (#33779)
  • kit,schema: Add moduleDependencies -> installModule (#33689)

💅 Refactors

  • nuxt: Improve type safety within callOnce function (#33825)

📖 Documentation

🏡 Chore

  • Update pnpm to 10.21 and enable trust policy (1cb55efc0)
  • Revert pnpm trust policy and restore provenance action (103ae1351)
  • Update markdownlint config to ignore mdc issues (d4933e26e)
  • Pin to single version of unstorage (619956e7f)

✅ Tests

  • Add patchProp and nodeOps to excluded Vue helpers (#33754)
  • Use fake timers for watch params test (58607fbea)
  • Update test for v3 defaults (daa002638)

🤖 CI

  • Add --pnpm flag to correctly publish prerelease (#33688)
  • Update action lint config (#33710)

❤️ Contributors

  • Daniel Roe (@danielroe)
  • Alexander Lichter (@TheAlexLichter)
  • Florian Heuberger (@Flo0806)
  • Konstantin Telyakov (@kTelyakov)
  • abeer0 (@iiio2)
  • Julien Huang (@huang-julien)
  • Robin (@OrbisK)
  • Dheeraj Joshi (@dheeraj3587)
  • Edwin Samodra (@edwinsamodra)
  • edison (@edison1105)
  • 山吹色御守 (@KazariEX)
  • Sébastien Chopin (@atinux)
  • pierreoa (@pierreoa)
  • Maxime Pauvert (@maximepvrt)
@nuxt/test-utils

v3.21.0

3.21.0 is the next minor release.

👉 Changelog

compare changes

🚀 Enhancements

  • runtime-utils: Support rerender behavior in renderSuspended (#1466)
  • runtime-utils: Support once option in registerEndpoint (#1475)
  • runtime-utils: Support css modules in mount + render helpers (#1464)
  • runtime-utils: Pass app context across in mount + render helpers (#1477)
  • runtime-utils: Support mocked target arguments in mockNuxtImport (#1492)

🩹 Fixes

  • runtime: Remove redefinition of $fetch.create (#1471)
  • runtime-utils: Pass non-enumerable globalProperties in mount + render helpers (#1476)
  • module: Include vitest config in node project (#1497)
  • runtime-utils: Improve mount + render helpers (#1483)
  • Revert to @nuxt/kit v3 for bridge support (#1498)

🏡 Chore

  • Move built dep configuration -> workspace file (d936cb465)
  • Update pnpm to 10.21 and enable trust policy (ed6ff050d)
  • Revert pnpm trust policy and restore provenance action (b034f0a5e)
  • Remove spurious globby dependency (eba19d16b)
  • Remove export (2a88683bd)
  • Remove @nuxt/kit from peer dependencies (b80ca5ea8)
  • Add back @nuxt/kit as peer dep (5c126e1af)
  • Bump vite-node to v5 (3322919c2)

🤖 CI

  • Rebuild better-sqlite3 on windows (9fdaf3824)

❤️ Contributors

  • Daniel Roe (@danielroe)
  • yamachi4416 (@yamachi4416)
  • Ryota Watanabe (@wattanx)
@nuxt/content

v3.9.0

🚀 Enhancements

  • amplity: Usenode:sqlite on AWS Amplify if Node.js > 22 (#3598)

🩹 Fixes

  • fs-watcher: Add timeout to deal with race-condition (c07336e1)
  • Respect app.baseURL in Cloudflare database handler (#3608)
  • Prepare for NuxtHub 0.10 with hub.db (#3624)

📖 Documentation

  • studio: Update to match alpha 2 version (90403eb5)
  • studio: Move from GitHub to agnostic git provider approach (1a3259cd)
  • studio: I18n of the UI (82a325cf)
  • Simplify usage for studio setup (0167bd00)
  • Add markdown.build.contentHeading option (#3612)
  • Grammar fixes in global components docs (#3615)
  • Update nuxthub section (5b5747ce)
  • studio: Document de locale availability (#3618)
  • Clarify Cloudflare Pages and D1 (#3587)
  • Fix Nuxt badge icon (#3623)
  • Update watch option docs (67a84776)
  • Fix docker deployment typo (#3629)
  • studio: Add visual editor info (0adecb22)

🏡 Chore

❤️ Contributors

@nuxt/ui

v4.2.1

🐛 Bug Fixes

  • ChatPromptSubmit: proxy event to stop and reload emits (#5400) 736a547
  • ColorModeButton: missing icon import 5f30ccf, closes #5486
  • Icon: improve name type (#5498) b654a77
  • Link: define NuxtLinkProps instead of importing from #app (#5491) da8daaa
  • Link: ensure consistency across Nuxt, Vue and Inertia a9ed10d, closes #5012
  • module: put back #build/ui.css alias (#5499) d9aadc7

👋 New Contributors

Full Changelog: https://github.com/nuxt/ui/compare/v4.2.0...v4.2.1

@nuxt/ui

v4.2.0

✨ Highlights

📅 New InputDate & InputTime components

Two new components are now available to handle date and time inputs: InputDate (#5387) and InputTime (#5302).

<script setup lang="ts">
const date = ref(new CalendarDate(2022, 2, 3))
const time = ref(new Time(12, 30, 0))
</script>

<template>
  <UInputDate v-model="date" />

  <UInputTime v-model="time" />
</template>

🎨 Tailwind CSS prefix

You can now use Tailwind CSS's prefix option (#5341) to prefix all utilities generated by Nuxt UI and avoid conflicts with your own styles or other libraries.

export default defineNuxtConfig({
  modules: ['@nuxt/ui'],
  css: ['~/assets/css/main.css'],
  ui: {
    theme: {
      prefix: 'tw'
    }
  }
})
@import "tailwindcss" prefix(tw);
@import "@nuxt/ui";

🚨 Breaking Changes

Exposed refs now consistently return the HTML element directly instead of the component instance. This affects InputMenu, InputNumber, InputTags, Select, and SelectMenu.

<script setup lang="ts">
const inputMenu = useTemplateRef('inputMenu')

- inputMenu.value.inputRef.$el // Component instance
+ inputMenu.value.inputRef // HTML element directly
</script>
  • module: properly export composables from module (cb25902)

There was an issue with how composables were exported, you no longer need the .js extension:

<script setup lang="ts">
- import { useToast } from '@nuxt/ui/composables/useToast.js'
+ import { useToast } from '@nuxt/ui/composables/useToast'
// or
+ import { useToast } from '@nuxt/ui/composables'
</script>

The Vite plugin now properly generates theme files as real files instead of incorrectly shipping them inside .nuxt/ on NPM. This ensures the #build/ui.css import and custom theme configuration work correctly.

When using the Vite plugin, update your tsconfig.node.json alias:

{
  "compilerOptions": {
    "paths": {
      "#build/ui": [
-       "./node_modules/@nuxt/ui/.nuxt/ui"
+       "./node_modules/.nuxt-ui/ui"
      ]
    }
  }
}

🚀 Features

🐛 Bug Fixes

  • AuthForm: ensure header is shown with leading slot (#5405) (b61127a)
  • AuthForm: use password input id for aria-controls (#5312) (55ea9be)
  • ChatPrompt: proxy disabled prop (a8f2156), closes #5300
  • CheckboxGroup/RadioGroup/Switch: consistent disabled styles (ddd8faf), closes #5391
  • ColorModeButton: use css to display color mode icon (#5394) (1d1c638)
  • CommandPalette/ContentSearch: improve performances and filtering logic (#5433) (e751b37)
  • components: calc virtualizer estimateSize based on item description (56ae8e7)
  • components: consistent exposed refs (#5385) (fce2df4)
  • components: remove locale / dir props proxy (#5432) (a6efa7a)
  • ContentNavigation/NavigationMenu/Tabs: ensure proper badge display (e5c11e6)
  • ContentSearchButton/DashboardSearchButton: hide label and trailing with css when collapsed (3e72bf8)
  • FileUpload: ensure native validation works with required (#5358) (eb491e1)
  • Form: refine nested prop type handling and simplify logic (#5360) (8d5c26f)
  • inertia: set serverRendered dynamically to prevent SSR crash (#5396) (c0da1b2)
  • Input/InputNumber/Textarea: make modelModifiers generic (#5361) (5c347af)
  • InputMenu: prevent change event when selecting create item (418c87b), closes #4664
  • Link: partial extend for vue-router and inertia (637ef58)
  • Marquee: move keyframes into global css (1e6242e)
  • module: detect lazy components when using experimental.componentDetection (5a5ac45)
  • module: properly export composables from module (cb25902), closes #5370
  • module: scan layers when using experimental.componentDetection (9872740), closes #5389
  • NavigationMenu: hide label and trailing with css when collapsed (f004031), closes #4254
  • NavigationMenu: proxy modelValue / defaultValue in vertical orientation (cffaaaa), closes #5392
  • ProseCallout: add inline-block class to icon (#5317) (fc36f69)
  • RadioGroup: update update:modelValue emit type (#5349) (4cb0638)
  • Table: apply styles to th based on column meta (#5418) (620defa)
  • types: export missing utils types (#5448) (5f0a107)
  • vite: write theme templates (#5355) (411ebcc)
  • vue: check import.meta.env.SSR to support vite-ssg (#5347) (8f38c04)

🌐 Locales

👋 New Contributors

Full Changelog: https://github.com/nuxt/ui/compare/v4.1.0...v4.2.0

@nuxt/content

v3.8.2

fix: downgrade @sqlite.org/sqlite-wasm (5438131643)

@nuxt/content

v3.8.1

🔥 Performance

  • Use moduleDependencies to install mdc module (#3597)
  • Replace internal object records with maps (#3591)

🩹 Fixes

  • docs: Docs collection prefix (72cc17d5)
  • deps: Nuxt 4.2 patch (91a1de73)
  • Make sure last char of column is not special char (#3610)

📖 Documentation

  • studio: New module alpha release (#3601)
  • studio: Change installation to alpha version (#3602)
  • studio: Working with staging (2aa18b6b)
  • studio: Move back to main (87a2530e)
  • markdown: Add info to the complete MDC docs (#3605)
  • deps: Studio latest (c4a1d4e7)

❤️ Contributors

@nuxt/hints

v1.0.0-alpha.1

@nuxt/hints 1.0.0 alpha 1

We’re excited to introduce the first alpha release of @nuxt/hints, a new Nuxt module that gives developers actionable performance insights right inside their projects.

@nuxt/hints automatically analyzes your Nuxt app at runtime to highlight issues that could impact performance, security, or hydration — and guides you with clear, contextual hints.

Key features

🚀 Performance Analysis

  • LCP Optimization: Detects images that could benefit from better formats (WebP, AVIF), sizing, and preload priority
  • CLS Detection: Warns about layout shifts caused by images without defined dimensions
  • Loading Performance: Tracks elements that take longer than 2.5s to load
  • Image Best Practices: Validates width, height, loading, and fetchPriority attributes

📦 Third-Party Script Monitoring

  • Automatic Script Detection: Finds external scripts on your pages
  • Performance Tracking: Measures load time and timing breakdowns for third-party scripts
  • Security Recommendations: Suggests adding crossorigin="anonymous"
  • Integration with @nuxt/scripts: Discover and improve management of third-party scripts

💧 Hydration Insights

  • Detects SSR/client mismatches to help debug hydration issues early

Future ideas and roadmap

While this is an alpha release, we are still figuring out the best way to improve the developer experience for you. Any ideas and recommandations are welcomed in the ideas section of the discussions.