Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Reference for Nuxt UI v4 (125+ components built on Reka UI + Tailwind CSS v4) including forms, overlays, and theming.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/composables.md
1# Composables23## useToast45Show notifications. Requires `<UApp>` wrapper.67```ts8const toast = useToast()910// Add toast11toast.add({12title: 'Success',13description: 'Item saved',14color: 'success',15icon: 'i-heroicons-check-circle',16timeout: 500017})1819// Remove specific toast20toast.remove('toast-id')2122// Clear all toasts23toast.clear()24```2526See overlays.md for full toast options.2728## useOverlay2930Programmatically create modals, slidelovers, drawers.3132```ts33const overlay = useOverlay()3435// Create modal36const modal = overlay.create(MyModalComponent, {37props: { title: 'Confirm' },38modal: true // Default: true39})4041// Wait for result42const result = await modal.result4344// Close programmatically45modal.close(returnValue)46```4748### Confirm Dialog Pattern4950```vue51<!-- ConfirmDialog.vue -->52<script setup>53const props = defineProps<{ title: string; message: string }>()54const emit = defineEmits(['confirm', 'cancel'])55</script>5657<template>58<UModal :open="true">59<template #header>{{ title }}</template>60<p>{{ message }}</p>61<template #footer>62<UButton variant="ghost" @click="emit('cancel')">Cancel</UButton>63<UButton color="error" @click="emit('confirm')">Confirm</UButton>64</template>65</UModal>66</template>67```6869```ts70// Usage71const overlay = useOverlay()7273async function confirmDelete() {74const modal = overlay.create(ConfirmDialog, {75props: { title: 'Delete?', message: 'This cannot be undone.' },76events: {77confirm: () => modal.close(true),78cancel: () => modal.close(false)79}80})8182if (await modal.result) {83// Delete item84}85}86```8788## defineShortcuts8990Define keyboard shortcuts.9192```ts93defineShortcuts({94// Single key95escape: () => closeModal(),9697// Modifier + key (meta = Cmd on Mac, Ctrl on Windows)98meta_k: () => openSearch(),99meta_shift_p: () => openCommandPalette(),100101// Ctrl specific102ctrl_s: () => save(),103104// Alt/Option105alt_n: () => newItem(),106107// Arrow keys108arrowup: () => navigateUp(),109arrowdown: () => navigateDown(),110111// With condition112meta_enter: {113handler: () => submit(),114whenever: [isFormValid]115}116}, {117layoutIndependent: true // Ignore keyboard layout (v4.3+)118})119```120121### Shortcut Syntax122123| Key | Meaning |124| ------- | -------------------------- |125| `meta` | Cmd (Mac) / Ctrl (Windows) |126| `ctrl` | Ctrl key |127| `alt` | Alt / Option key |128| `shift` | Shift key |129| `_` | Key separator |130131### Extract Shortcuts (for display)132133```ts134const shortcuts = extractShortcuts({135meta_k: () => {},136escape: () => {}137})138// Returns: { meta_k: { key: 'K', metaKey: true }, ... }139```140141## useKbd142143Detect current keyboard state.144145```ts146const kbd = useKbd()147148// Reactive state149kbd.meta // true if Cmd/Ctrl pressed150kbd.ctrl // true if Ctrl pressed151kbd.shift // true if Shift pressed152kbd.alt // true if Alt/Option pressed153```154155## useScrollspy156157Track scroll position for anchor navigation.158159```ts160const { activeId } = useScrollspy({161ids: ['section-1', 'section-2', 'section-3'],162offset: 100 // Pixels from top163})164165// activeId.value = 'section-2' (currently visible)166```167168### With Table of Contents169170```vue171<script setup>172const sections = ['intro', 'features', 'pricing']173const { activeId } = useScrollspy({ ids: sections })174</script>175176<template>177<nav>178<a179v-for="id in sections"180:href="`#${id}`"181:class="{ 'font-bold': activeId === id }"182>183{{ id }}184</a>185</nav>186</template>187```188189## useFileUpload190191Handle file uploads.192193```ts194const { files, open, reset, remove } = useFileUpload({195accept: 'image/*',196multiple: true,197maxFiles: 5,198maxSize: 5 * 1024 * 1024 // 5MB199})200201// Open file picker202open()203204// Files selected205files.value // FileList206207// Reset selection208reset()209210// Remove specific file211remove(index)212```213214### With UFileUpload215216```vue217<script setup>218const { files, open, reset } = useFileUpload()219</script>220221<template>222<UFileUpload v-model="files" accept="image/*" @change="handleFiles">223<template #default="{ dragover }">224<div :class="{ 'border-primary': dragover }">225Drop files here or <UButton @click="open">Browse</UButton>226</div>227</template>228</UFileUpload>229</template>230```231232## defineLocale233234Define/extend locale for i18n.235236```ts237// locales/es.ts238export default defineLocale({239name: 'Español',240code: 'es',241messages: {242select: {243placeholder: 'Seleccionar...',244noResults: 'Sin resultados'245},246pagination: {247previous: 'Anterior',248next: 'Siguiente'249}250}251})252```253254### Extend Existing Locale255256```ts257import en from '@nuxt/ui/locale/en'258259export default extendLocale(en, {260messages: {261select: {262placeholder: 'Choose an option...'263}264}265})266```267268### Use in App269270```vue271<script setup>272import es from '~/locales/es'273</script>274275<template>276<UApp :locale="es">277<NuxtPage />278</UApp>279</template>280```281282## useFormField283284Access form field context in custom components.285286```ts287// Inside custom form component288const { name, error, disabled } = useFormField()289290// name: field name from UFormField291// error: validation error message292// disabled: if field is disabled293```294295### Custom Input Component296297```vue298<script setup>299const props = defineProps<{ modelValue: string }>()300const emit = defineEmits(['update:modelValue'])301302const { error } = useFormField()303</script>304305<template>306<input307:value="modelValue"308:class="{ 'border-error': error }"309@input="emit('update:modelValue', $event.target.value)"310/>311<span v-if="error" class="text-error">{{ error }}</span>312</template>313```314315## Quick Reference316317| Composable | Purpose |318| ------------------ | ------------------------------- |319| `useToast` | Show notifications |320| `useOverlay` | Programmatic modals/slidelovers |321| `defineShortcuts` | Keyboard shortcuts |322| `useKbd` | Keyboard state detection |323| `useScrollspy` | Track scroll for TOC |324| `useFileUpload` | File upload handling |325| `defineLocale` | i18n locale definition |326| `extendLocale` | Extend existing locale |327| `useFormField` | Form field context |328| `extractShortcuts` | Parse shortcut definitions |329