Viet Tran a38d04c3d5
feat(search): overhaul relevance and curated design data
Overhaul BM25 relevance, reasoning and data-quality contracts; refresh UI styles and framework guidance; add resilient text, chip, badge and micro-interaction guidance; strengthen release, provenance and catalog refresh gates; update bilingual documentation.
2026-08-14 00:08:23 +07:00

24 KiB

1NoCategoryGuidelineDescriptionDoDon'tCode GoodCode BadSeverityDocs URLApplies ToStatusVerified At
21InstallationAdd Nuxt UI moduleInstall and configure Nuxt UI in your Nuxt projectpnpm add @nuxt/ui and add to modulesManual component importsmodules: ['@nuxt/ui']import { UButton } from '@nuxt/ui'Highhttps://ui.nuxt.com/docs/getting-started/installation/nuxtnuxt-ui 4.10active2026-08-13
32InstallationImport Tailwind and Nuxt UI CSSRequired CSS imports in main.css file@import tailwindcss and @import @nuxt/uiSkip CSS imports@import "tailwindcss"; @import "@nuxt/ui";No CSS importsHighhttps://ui.nuxt.com/docs/getting-started/installation/nuxtnuxt-ui 4.10active2026-08-13
43InstallationWrap app with UApp componentUApp provides global configs for Toast Tooltip and overlays<UApp> wrapper in app.vueSkip UApp wrapper<UApp><NuxtPage/></UApp><NuxtPage/> without wrapperHighhttps://ui.nuxt.com/docs/components/appnuxt-ui 4.10active2026-08-13
54ComponentsUse U prefix for componentsAll Nuxt UI components use U prefix by defaultUButton UInput UModalButton Input Modal<UButton>Click</UButton><Button>Click</Button>Mediumhttps://ui.nuxt.com/docs/getting-started/installation/nuxtnuxt-ui 4.10active2026-08-13
65ComponentsUse semantic color propsUse semantic colors like primary secondary errorcolor="primary" color="error"Hardcoded colors<UButton color="primary"><UButton class="bg-green-500">Mediumhttps://ui.nuxt.com/docs/getting-started/theme/design-systemnuxt-ui 4.10active2026-08-13
76ComponentsUse variant prop for stylingNuxt UI provides solid outline soft subtle ghost link variantsvariant="soft" variant="outline"Custom button classes<UButton variant="soft"><UButton class="border bg-transparent">Mediumhttps://ui.nuxt.com/docs/components/buttonnuxt-ui 4.10active2026-08-13
87ComponentsUse size prop consistentlyComponents support xs sm md lg xl sizessize="sm" size="lg"Arbitrary sizing classes<UButton size="lg"><UButton class="text-xl px-6">Lowhttps://ui.nuxt.com/docs/components/buttonnuxt-ui 4.10active2026-08-13
98IconsUse i-{collection}-{name} format for iconsNuxt UI v4 uses Iconify i-prefix format — lucide:home is v3 legacyi-lucide-home i-heroicons-user formatlucide:home format (v3 syntax)<UButton icon="i-lucide-home"><UButton icon="lucide:home">Highhttps://ui.nuxt.com/docs/getting-started/installation/nuxtnuxt-ui 4.10active2026-08-13
109IconsUse leadingIcon and trailingIcon propsPosition icons with dedicated props for clarityleadingIcon="i-lucide-plus" trailingIcon="i-lucide-arrow-right"Manual icon positioning or slots<UButton leadingIcon="i-lucide-plus" label="Add"><UButton><UIcon name="i-lucide-plus"/>Add</UButton>Lowhttps://ui.nuxt.com/docs/components/buttonnuxt-ui 4.10active2026-08-13
1110ThemingConfigure colors in app.config.tsRuntime color configuration without restartui.colors.primary in app.config.tsHardcoded colors in componentsdefineAppConfig({ ui: { colors: { primary: 'blue' } } })<UButton class="bg-blue-500">Highhttps://ui.nuxt.com/docs/getting-started/theme/design-systemnuxt-ui 4.10active2026-08-13
1211ThemingUse @theme directive for custom colorsDefine design tokens in CSS with Tailwind @theme@theme { --color-brand-500: #xxx }Inline color definitions@theme { --color-brand-500: #ef4444; }:style="{ color: '#ef4444' }"Mediumhttps://ui.nuxt.com/docs/getting-started/theme/design-systemnuxt-ui 4.10active2026-08-13
1312ThemingRegister and map semantic colorsRegister extra semantic color names at build time then map them to a palette in app.confignuxt.config ui.theme.colors plus app.config ui.colorsUse an unregistered semantic colorui: { theme: { colors: ['primary', 'tertiary'] } } then ui.colors.tertiary = 'violet'<UButton color="tertiary"> without configMediumhttps://ui.nuxt.com/docs/getting-started/theme/design-systemnuxt-ui 4.10active2026-08-13
1413FormsUse UForm with schema validationUForm supports Zod Yup Joi Valibot schemas:schema prop with validation schemaManual form validation<UForm :schema="schema" :state="state">Manual @blur validationHighhttps://ui.nuxt.com/docs/components/formnuxt-ui 4.10active2026-08-13
1514FormsUse UFormField for field wrapperProvides label error message and validation displayUFormField with name propManual error handling<UFormField name="email" label="Email"><div><label>Email</label><UInput/><span>error</span></div>Mediumhttps://ui.nuxt.com/docs/components/form-fieldnuxt-ui 4.10active2026-08-13
1615FormsHandle form submit with @submitUForm emits submit event with validated data@submit handler on UForm@click on submit button<UForm @submit="onSubmit"><UButton @click="onSubmit">Mediumhttps://ui.nuxt.com/docs/components/formnuxt-ui 4.10active2026-08-13
1716FormsChoose validation timing deliberatelyUForm validates on input blur and change by default; input is delayed and begins after blur unless eagerSet validateOn and eager to match the interactionAssume the default validates every keystroke immediately<UForm :validateOn="['blur', 'change']">Describe default UForm as eager input-only validationLowhttps://ui.nuxt.com/docs/components/formnuxt-ui 4.10active2026-08-13
1817OverlaysUse v-model:open for overlay controlModal Slideover Drawer use v-model:openv-model:open for controlled stateManual show/hide logic<UModal v-model:open="isOpen"><UModal v-if="isOpen">Mediumhttps://ui.nuxt.com/docs/components/modalnuxt-ui 4.10active2026-08-13
1918OverlaysUse useOverlay composable for programmatic overlaysOpen overlays programmatically — v4 API is create().open() not open(Component)overlay.create(Component).open({ props }) patternv3 overlay.open(Component) pattern (removed in v4)const modal = overlay.create(MyModal); const { result } = modal.open({ title: 'Confirm' })overlay.open(MyModal, { props: { title: 'Confirm' } })Highhttps://ui.nuxt.com/docs/components/modalnuxt-ui 4.10active2026-08-13
2019OverlaysUse title and description propsBuilt-in header support for overlaystitle="Confirm" description="Are you sure?"Manual header content<UModal title="Confirm" description="Are you sure?"><UModal><template #header><h2>Confirm</h2></template>Lowhttps://ui.nuxt.com/docs/components/modalnuxt-ui 4.10active2026-08-13
2120DashboardUse UDashboardSidebar for navigationProvides collapsible resizable sidebar with mobile supportUDashboardSidebar with header default footer slotsCustom sidebar implementation<UDashboardSidebar><template #header>...</template></UDashboardSidebar><aside class="w-64 border-r">Mediumhttps://ui.nuxt.com/docs/components/dashboard-sidebarnuxt-ui 4.10active2026-08-13
2221DashboardUse UDashboardGroup for layoutWraps dashboard components with sidebar state managementUDashboardGroup > UDashboardSidebar + UDashboardPanelManual layout flex containers<UDashboardGroup><UDashboardSidebar/><UDashboardPanel/></UDashboardGroup><div class="flex"><aside/><main/></div>Mediumhttps://ui.nuxt.com/docs/components/dashboard-groupnuxt-ui 4.10active2026-08-13
2322DashboardUse UDashboardNavbar for top navigationResponsive navbar with mobile menu supportUDashboardNavbar in dashboard layoutCustom navbar implementation<UDashboardNavbar :links="navLinks"/><nav class="border-b">Lowhttps://ui.nuxt.com/docs/components/dashboard-navbarnuxt-ui 4.10active2026-08-13
2423TablesUse UTable with data and columns propsPowered by TanStack Table with built-in features:data and :columns propsManual table markup<UTable :data="users" :columns="columns"/><table><tr v-for="user in users">Highhttps://ui.nuxt.com/docs/components/tablenuxt-ui 4.10active2026-08-13
2524TablesDefine columns with accessorKeyColumn definitions use accessorKey for data bindingaccessorKey: 'email' in column defString column names only{ accessorKey: 'email', header: 'Email' }['name', 'email']Mediumhttps://ui.nuxt.com/docs/components/tablenuxt-ui 4.10active2026-08-13
2625TablesUse column cell slotsCustomize cell content with the documented column-id slot pattern#status-cell for a status columnUse the obsolete #cell-status name<template #status-cell="{ row }"><template #cell-status="{ row }">Mediumhttps://ui.nuxt.com/docs/components/tablenuxt-ui 4.10active2026-08-13
2726TablesEnable sorting with TanStack column APIsRender a header control that calls column.toggleSortingUse getCanSort and toggleSortingInvent a sortable property not in the column contractheader: ({ column }) => h(UButton, { onClick: () => column.toggleSorting() }){ accessorKey: 'name', sortable: true }Lowhttps://ui.nuxt.com/docs/components/tablenuxt-ui 4.10active2026-08-13
2827NavigationUse UNavigationMenu for nav linksHorizontal or vertical navigation with dropdown supportUNavigationMenu with items arrayManual nav with v-for<UNavigationMenu :items="navItems"/><nav><a v-for="item in items">Mediumhttps://ui.nuxt.com/docs/components/navigation-menunuxt-ui 4.10active2026-08-13
2928NavigationUse UBreadcrumb for page hierarchyAutomatic breadcrumb with NuxtLink support:items array with label and toManual breadcrumb links<UBreadcrumb :items="breadcrumbs"/><nav><span v-for="crumb in crumbs">Lowhttps://ui.nuxt.com/docs/components/breadcrumbnuxt-ui 4.10active2026-08-13
3029NavigationUse UTabs for tabbed contentTab navigation with content panelsUTabs with items containing slot contentManual tab state<UTabs :items="tabs"/><div><button @click="tab=1">Mediumhttps://ui.nuxt.com/docs/components/tabsnuxt-ui 4.10active2026-08-13
3130FeedbackUse useToast for notificationsComposable for toast notificationsuseToast().add({ title description })Alert components for toastsconst toast = useToast(); toast.add({ title: 'Saved' })<UAlert v-if="showSuccess">Highhttps://ui.nuxt.com/docs/components/toastnuxt-ui 4.10active2026-08-13
3231FeedbackUse UAlert for inline messagesStatic alert messages with icon and actionsUAlert with title description colorToast for static messages<UAlert title="Warning" color="warning"/>useToast for inline alertsMediumhttps://ui.nuxt.com/docs/components/alertnuxt-ui 4.10active2026-08-13
3332FeedbackUse USkeleton for loading statesPlaceholder content during data loadingUSkeleton with appropriate sizeSpinner for content loading<USkeleton class="h-4 w-32"/><UIcon name="lucide:loader" class="animate-spin"/>Lowhttps://ui.nuxt.com/docs/components/skeletonnuxt-ui 4.10active2026-08-13
3433Color ModeUse UColorModeButton for theme toggleBuilt-in light/dark mode toggle buttonUColorModeButton componentManual color mode logic<UColorModeButton/><button @click="toggleColorMode">Lowhttps://ui.nuxt.com/docs/components/color-mode-buttonnuxt-ui 4.10active2026-08-13
3534Color ModeUse UColorModeSelect for theme pickerDropdown to select system light or dark modeUColorModeSelect componentCustom select for theme<UColorModeSelect/><USelect v-model="colorMode" :items="modes"/>Lowhttps://ui.nuxt.com/docs/components/color-mode-selectnuxt-ui 4.10active2026-08-13
3635CustomizationUse ui prop for component stylingOverride component styles via ui propui prop with slot class overridesGlobal CSS overrides<UButton :ui="{ base: 'rounded-full' }"/><UButton class="!rounded-full"/>Mediumhttps://ui.nuxt.com/docs/getting-started/theme/componentsnuxt-ui 4.10active2026-08-13
3736CustomizationConfigure default variants in app.configSet component default variants under ui component keysapp.config ui.button.defaultVariantsPut component defaults in nuxt.configdefineAppConfig({ ui: { button: { defaultVariants: { color: 'neutral' } } } })ui.theme.defaultVariants in nuxt.configMediumhttps://ui.nuxt.com/docs/getting-started/theme/componentsnuxt-ui 4.10active2026-08-13
3837CustomizationUse app.config.ts for theme overridesRuntime theme customizationdefineAppConfig with ui keynuxt.config for runtime valuesdefineAppConfig({ ui: { button: { defaultVariants: { size: 'sm' } } } })nuxt.config ui.button.size: 'sm'Mediumhttps://ui.nuxt.com/docs/getting-started/theme/componentsnuxt-ui 4.10active2026-08-13
3938PerformanceEnable component detectionTree-shake unused component CSSexperimental.componentDetection: trueInclude all component CSSui: { experimental: { componentDetection: true } }ui: {} (includes all CSS)Lowhttps://ui.nuxt.com/docs/getting-started/installation/nuxtnuxt-ui 4.10active2026-08-13
4039PerformanceUse UTable virtualize for large dataEnable virtualization for 1000+ rows:virtualize prop on UTableRender all rows<UTable :data="largeData" virtualize/><UTable :data="largeData"/>Mediumhttps://ui.nuxt.com/docs/components/tablenuxt-ui 4.10active2026-08-13
4140AccessibilityUse semantic component propsComponents have built-in ARIA supportUse title description label propsSkip accessibility props<UModal title="Settings"><UModal><h2>Settings</h2>Mediumhttps://ui.nuxt.com/docs/components/modalnuxt-ui 4.10active2026-08-13
4241AccessibilityAssociate labels with controlsUse UFormField or correct native id and for attributesUFormField for convenience or explicit label associationUse placeholders as labels<UFormField label="Email"><UInput/></UFormField><UInput placeholder="Email"/>Highhttps://ui.nuxt.com/docs/components/form-fieldnuxt-ui 4.10active2026-08-13
4342ContentUse UContentToc for table of contentsAutomatic TOC with active heading highlightUContentToc with :linksManual TOC implementation<UContentToc :links="toc"/><nav><a v-for="heading in headings">Lowhttps://ui.nuxt.com/docs/components/content-tocnuxt-ui 4.10active2026-08-13
4443ContentUse UContentSearch for docs searchCommand palette for documentation searchUContentSearch with Nuxt ContentCustom search implementation<UContentSearch/><UCommandPalette :groups="searchResults"/>Lowhttps://ui.nuxt.com/docs/components/content-searchnuxt-ui 4.10active2026-08-13
4544AI/ChatUse UChatMessages for chat UIDesigned for Vercel AI SDK integrationUChatMessages with messages arrayCustom chat message list<UChatMessages :messages="messages"/><div v-for="msg in messages">Mediumhttps://ui.nuxt.com/docs/components/chat-messagesnuxt-ui 4.10active2026-08-13
4645AI/ChatUse UChatPrompt for inputEnhanced textarea for AI promptsUChatPrompt with v-modelBasic textarea<UChatPrompt v-model="prompt"/><UTextarea v-model="prompt"/>Mediumhttps://ui.nuxt.com/docs/components/chat-promptnuxt-ui 4.10active2026-08-13
4746EditorUse UEditor for rich textTipTap-based editor binds its document with v-modelUEditor with v-modelUse the undocumented v-model:content binding<UEditor v-model="content"/><UEditor v-model:content="content"/>Mediumhttps://ui.nuxt.com/docs/components/editornuxt-ui 4.10active2026-08-13
4847LinksUse to prop for navigationUButton and ULink support NuxtLink to propto="/dashboard" for internal linkshref for internal navigation<UButton to="/dashboard"><UButton href="/dashboard">Mediumhttps://ui.nuxt.com/docs/components/buttonnuxt-ui 4.10active2026-08-13
4948LinksUse to for external URLsULink and link-enabled components detect absolute URLs and support target when a new tab is intendedto="https://example.com" target="_blank"Use href inconsistently or claim an external prop is required<UButton to="https://example.com" target="_blank"><UButton href="https://...">Lowhttps://ui.nuxt.com/docs/components/linknuxt-ui 4.10active2026-08-13
5049LoadingUse loadingAuto on buttonsAutomatic loading state from @click promiseloadingAuto prop on UButtonManual loading state<UButton loadingAuto @click="async () => await save()"><UButton :loading="isLoading" @click="save">Lowhttps://ui.nuxt.com/docs/components/buttonnuxt-ui 4.10active2026-08-13
5150LoadingUse UForm loadingAutoAuto-disable form during submitloadingAuto on UForm (default true)Manual form disabled state<UForm @submit="handleSubmit"><UForm :disabled="isSubmitting">Lowhttps://ui.nuxt.com/docs/components/formnuxt-ui 4.10active2026-08-13
5251InstallationLet Nuxt UI declare module dependenciesNuxt UI uses Nuxt moduleDependencies for Icon Fonts and Color Mode ordering and registrationConfigure dependency options at their root keysAdd duplicate module entries without a documented needicon: { /* opts */ } in nuxt.configmodules: ['@nuxt/ui', '@nuxt/icon']Highhttps://ui.nuxt.com/docs/getting-started/installation/nuxtnuxt-ui 4.10active2026-08-13
5352InstallationUse official templates to bootstrap projectsCreate a Nuxt project from an official Nuxt UI templatenpm create nuxt@latest -- -t ui/dashboardManually reconstruct a templatenpm create nuxt@latest -- -t ui/dashboardpnpm create nuxt app then copy dashboard filesMediumhttps://ui.nuxt.com/docs/getting-started/installation/nuxtnuxt-ui 4.10active2026-08-13
5453IconsInstall required icon collections locallyInstall Iconify JSON collections used by the app; Nuxt UI 4.10 can bundle icons from installed collectionspnpm i @iconify-json/lucide for lucide iconsRely on an unavailable collection at runtimepnpm i @iconify-json/lucideUse i-custom-* without installing its collectionMediumhttps://ui.nuxt.com/docs/getting-started/icons/nuxtnuxt-ui 4.10active2026-08-13
5554IconsOverride default component icons globallyComponents use default icons configurable via appConfig.ui.iconsSet loading close check icons in app.config.tsAccept default icons for all componentsdefineAppConfig({ ui: { icons: { loading: 'i-lucide-refresh-cw', close: 'i-lucide-x' } } })<UModal :close-icon="'i-lucide-x'"> on every usageLowhttps://ui.nuxt.com/docs/getting-started/installation/nuxtnuxt-ui 4.10active2026-08-13
5655FormsUse UFileUpload for file inputBuilt-in drag-drop and preview supportUFileUpload with v-model and accept propCustom input type=file<UFileUpload v-model="files" accept="image/*" multiple/><input type="file" @change="handleFiles">Mediumhttps://ui.nuxt.com/docs/components/file-uploadnuxt-ui 4.10active2026-08-13
5756FormsUse UInputDate for date selectionLocale-aware date picker built on UCalendarUInputDate with v-model and locale propThird-party date picker libraries<UInputDate v-model="date" /><DatePicker v-model="date" />Mediumhttps://ui.nuxt.com/docs/components/input-datenuxt-ui 4.10active2026-08-13
5857FormsUse UInputTags for tag inputMulti-value tag input with keyboard supportUInputTags with v-model and max propCustom chip input implementation<UInputTags v-model="tags" :max="5" /><UInput @keydown.enter="addTag">Lowhttps://ui.nuxt.com/docs/components/input-tagsnuxt-ui 4.10active2026-08-13
5958FormsUse UColorPicker for color selectionFull-featured color picker with multiple format supportUColorPicker with v-model and format propNative input type=color<UColorPicker v-model="color" format="hex" /><input type="color" v-model="color">Lowhttps://ui.nuxt.com/docs/components/color-pickernuxt-ui 4.10active2026-08-13
6059DataUse UTree for hierarchical dataBuilt-in tree component with expand/collapseUTree with items prop containing nested childrenCustom recursive component<UTree :items="treeItems" /><TreeNode v-for="item in items" :key="item.id">Lowhttps://ui.nuxt.com/docs/components/treenuxt-ui 4.10active2026-08-13
6160DataUse UMarquee for infinite scroll contentAnimated infinite scroll band for logos or testimonialsUMarquee with repeat and pauseOnHover propsCSS animation keyframes loop<UMarquee :repeat="3" pause-on-hover><div class="animate-marquee">Lowhttps://ui.nuxt.com/docs/components/marqueenuxt-ui 4.10active2026-08-13
6261OverlaysUse UContextMenu for right-click menusContext menu triggered by right-click on childrenUContextMenu wrapping target elementBrowser default context menu<UContextMenu :items="menuItems"><div>Right-click me</div></UContextMenu><div @contextmenu.prevent="showMenu">Mediumhttps://ui.nuxt.com/docs/components/context-menunuxt-ui 4.10active2026-08-13
6362OverlaysAwait overlay result for confirmation dialogsuseOverlay returns a result Promise resolving to user actionawait instance.result to get confirm/cancelEmit events from overlay componentsconst { result } = modal.open(); if (await result) { deleteItem() }overlay.open(Confirm, { onConfirm: deleteItem })Mediumhttps://ui.nuxt.com/docs/components/modalnuxt-ui 4.10active2026-08-13
6463NavigationUse UCommandPalette with grouped itemsCommand palette supports grouped search with icons and kbdsgroups array with id label itemsFlat list without categories<UCommandPalette :groups="[{ id: 'actions', label: 'Actions', items }]"/><UCommandPalette :items="flatList"/>Mediumhttps://ui.nuxt.com/docs/components/command-palettenuxt-ui 4.10active2026-08-13
6564NavigationUse defineShortcuts with extractShortcutsWire keyboard shortcuts from menu item kbds automaticallyextractShortcuts(items) + defineShortcuts to sync keybindingsManually duplicate shortcuts from menu itemsdefineShortcuts(extractShortcuts(items))defineShortcuts({ meta_n: () => newFile() }) // duplicated from itemsLowhttps://ui.nuxt.com/docs/composables/define-shortcutsnuxt-ui 4.10active2026-08-13
6665LayoutUse UHeader and UFooter for page layoutResponsive header/footer with built-in mobile menuUHeader with #default slot for nav UFooter with columnsCustom header/footer from scratch<UHeader><template #right><UNavigationMenu/></template></UHeader><header class="sticky top-0">Lowhttps://ui.nuxt.com/docs/components/headernuxt-ui 4.10active2026-08-13
6766LayoutUse UPageAside for sidebar contentSidebar that hides below lg breakpoint automaticallyUPageAside for docs and landing page sidebarsManual hidden lg: classes<UPageAside><UNavigationMenu orientation="vertical"/></UPageAside><aside class="hidden lg:block">Lowhttps://ui.nuxt.com/docs/components/page-asidenuxt-ui 4.10active2026-08-13
6867Color ModeWrap custom color mode toggles in ClientOnlyPrevents hydration mismatch on server-rendered color modeClientOnly with fallback placeholderDirect useColorMode in template without ClientOnly<ClientOnly><USwitch v-model="isDark"/><template #fallback><div class="size-8"/></template></ClientOnly><USwitch v-model="isDark"/> directly in templateMediumhttps://ui.nuxt.com/docs/getting-started/installation/nuxtnuxt-ui 4.10active2026-08-13
6968ThemingRead generated theme file to find slot namesNuxt UI generates theme files listing all component slots and variantsCheck .nuxt/ui/<component>.ts for slot namesGuess slot names or use trial-and-error.nuxt/ui/button.ts for UButton slot names<UButton :ui="{ base: 'rounded-full' }"/> without checking slotsMediumhttps://ui.nuxt.com/docs/getting-started/theme/componentsnuxt-ui 4.10active2026-08-13
7069ComposablesUse defineShortcuts whenever keyword shortcutwhenever array condition prevents shortcut firing when inactivewhenever: [isFormValid] to guard shortcut executionAlways-on shortcuts that fire in wrong contextdefineShortcuts({ meta_enter: { handler: submit, whenever: [isFormValid] } })defineShortcuts({ meta_enter: () => submit() }) // fires even when invalidLowhttps://ui.nuxt.com/docs/composables/define-shortcutsnuxt-ui 4.10active2026-08-13
7170i18nUse UApp locale prop for internationalizationNuxt UI supports 50+ built-in locales via locale prop on UAppImport locale from @nuxt/ui/locale and pass to UAppManual translation of component UI stringsimport { fr } from '@nuxt/ui/locale'; // <UApp :locale="fr"><UModal title="Fermer"> manually for each componentLowhttps://ui.nuxt.com/docs/composables/define-localenuxt-ui 4.10active2026-08-13