@ranimontagna/agent-toolkit 0.3.6 → 0.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +1 -1
  3. package/package.json +1 -1
  4. package/skills/backend/fastify-best-practices/NOTICE.md +1 -1
  5. package/skills/backend/fastify-best-practices/rules/authentication.md +13 -0
  6. package/skills/backend/fastify-best-practices/rules/configuration.md +9 -0
  7. package/skills/backend/fastify-best-practices/rules/content-type.md +16 -0
  8. package/skills/backend/fastify-best-practices/rules/cors-security.md +18 -0
  9. package/skills/backend/fastify-best-practices/rules/database.md +12 -0
  10. package/skills/backend/fastify-best-practices/rules/decorators.md +14 -0
  11. package/skills/backend/fastify-best-practices/rules/deployment.md +16 -0
  12. package/skills/backend/fastify-best-practices/rules/error-handling.md +16 -0
  13. package/skills/backend/fastify-best-practices/rules/hooks.md +20 -0
  14. package/skills/backend/fastify-best-practices/rules/http-proxy.md +11 -0
  15. package/skills/backend/fastify-best-practices/rules/logging.md +18 -0
  16. package/skills/backend/fastify-best-practices/rules/performance.md +20 -0
  17. package/skills/backend/fastify-best-practices/rules/plugins.md +14 -0
  18. package/skills/backend/fastify-best-practices/rules/routes.md +18 -0
  19. package/skills/backend/fastify-best-practices/rules/schemas.md +20 -0
  20. package/skills/backend/fastify-best-practices/rules/serialization.md +19 -0
  21. package/skills/backend/fastify-best-practices/rules/testing.md +17 -0
  22. package/skills/backend/fastify-best-practices/rules/typescript.md +15 -0
  23. package/skills/backend/fastify-best-practices/rules/websockets.md +15 -0
  24. package/skills/backend/go/golang-patterns/NOTICE.md +1 -1
  25. package/skills/backend/go/golang-patterns/SKILL.md +2 -1
  26. package/skills/devops/docker-patterns/NOTICE.md +1 -1
  27. package/skills/devops/docker-patterns/SKILL.md +3 -3
  28. package/skills/frontend/design/revenue-centric-design/NOTICE.md +1 -1
  29. package/skills/frontend/design/revenue-centric-design/SKILL.md +6 -4
  30. package/skills/frontend/design/revenue-centric-design/assets/1985681720104903142__1.jpg +0 -0
  31. package/skills/frontend/design/revenue-centric-design/assets/1999584679247134761__1.jpg +0 -0
  32. package/skills/frontend/design/revenue-centric-design/assets/2000930776636940333__1.jpg +0 -0
  33. package/skills/frontend/design/revenue-centric-design/assets/2018693884449009956__3.jpg +0 -0
  34. package/skills/frontend/design/revenue-centric-design/assets/2081714430811730162__1.jpg +0 -0
  35. package/skills/frontend/design/revenue-centric-design/assets/2092692547244007852__q__1.jpg +0 -0
  36. package/skills/frontend/design/revenue-centric-design/assets/2092692547244007852__q__2.jpg +0 -0
  37. package/skills/frontend/design/revenue-centric-design/assets/2092692547244007852__q__3.jpg +0 -0
  38. package/skills/frontend/design/revenue-centric-design/references/checkout-and-forms.md +39 -0
  39. package/skills/frontend/design/revenue-centric-design/references/churn-and-retention.md +25 -0
  40. package/skills/frontend/design/revenue-centric-design/references/conversion-and-landing-pages.md +52 -1
  41. package/skills/frontend/design/revenue-centric-design/references/dashboards-and-data-viz.md +23 -0
  42. package/skills/frontend/design/revenue-centric-design/references/metrics-and-experimentation.md +13 -0
  43. package/skills/frontend/design/revenue-centric-design/references/onboarding-and-activation.md +7 -1
  44. package/skills/frontend/design/revenue-centric-design/references/pricing-and-monetization.md +35 -8
  45. package/skills/frontend/design/revenue-centric-design/references/product-strategy-and-features.md +37 -0
  46. package/skills/frontend/design/revenue-centric-design/references/revenue-centric-design.md +2 -2
  47. package/skills/frontend/design/ui-ux-pro-max/NOTICE.md +6 -4
  48. package/skills/frontend/design/ui-ux-pro-max/SKILL.md +103 -573
  49. package/skills/frontend/design/ui-ux-pro-max/data/app-interface.csv +29 -27
  50. package/skills/frontend/design/ui-ux-pro-max/data/catalog-summary.json +78 -0
  51. package/skills/frontend/design/ui-ux-pro-max/data/charts.csv +26 -26
  52. package/skills/frontend/design/ui-ux-pro-max/data/colors.csv +191 -160
  53. package/skills/frontend/design/ui-ux-pro-max/data/data-provenance.json +1348 -0
  54. package/skills/frontend/design/ui-ux-pro-max/data/google-font-licenses.json +20185 -0
  55. package/skills/frontend/design/ui-ux-pro-max/data/google-fonts.csv +1934 -1923
  56. package/skills/frontend/design/ui-ux-pro-max/data/icons.csv +106 -106
  57. package/skills/frontend/design/ui-ux-pro-max/data/landing.csv +35 -35
  58. package/skills/frontend/design/ui-ux-pro-max/data/motion.csv +18 -0
  59. package/skills/frontend/design/ui-ux-pro-max/data/phosphor-icons-upstream.json +32582 -0
  60. package/skills/frontend/design/ui-ux-pro-max/data/products.csv +192 -161
  61. package/skills/frontend/design/ui-ux-pro-max/data/react-performance.csv +37 -37
  62. package/skills/frontend/design/ui-ux-pro-max/data/stacks/angular.csv +51 -51
  63. package/skills/frontend/design/ui-ux-pro-max/data/stacks/astro.csv +54 -54
  64. package/skills/frontend/design/ui-ux-pro-max/data/stacks/avalonia.csv +57 -0
  65. package/skills/frontend/design/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
  66. package/skills/frontend/design/ui-ux-pro-max/data/stacks/html-tailwind.csv +60 -56
  67. package/skills/frontend/design/ui-ux-pro-max/data/stacks/javafx.csv +76 -0
  68. package/skills/frontend/design/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
  69. package/skills/frontend/design/ui-ux-pro-max/data/stacks/laravel.csv +51 -51
  70. package/skills/frontend/design/ui-ux-pro-max/data/stacks/nextjs.csv +62 -53
  71. package/skills/frontend/design/ui-ux-pro-max/data/stacks/nuxt-ui.csv +77 -51
  72. package/skills/frontend/design/ui-ux-pro-max/data/stacks/nuxtjs.csv +68 -59
  73. package/skills/frontend/design/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
  74. package/skills/frontend/design/ui-ux-pro-max/data/stacks/react.csv +67 -54
  75. package/skills/frontend/design/ui-ux-pro-max/data/stacks/shadcn.csv +69 -61
  76. package/skills/frontend/design/ui-ux-pro-max/data/stacks/svelte.csv +56 -54
  77. package/skills/frontend/design/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
  78. package/skills/frontend/design/ui-ux-pro-max/data/stacks/threejs.csv +54 -54
  79. package/skills/frontend/design/ui-ux-pro-max/data/stacks/uno.csv +60 -0
  80. package/skills/frontend/design/ui-ux-pro-max/data/stacks/uwp.csv +56 -0
  81. package/skills/frontend/design/ui-ux-pro-max/data/stacks/vue.csv +50 -50
  82. package/skills/frontend/design/ui-ux-pro-max/data/stacks/winui.csv +60 -0
  83. package/skills/frontend/design/ui-ux-pro-max/data/stacks/wpf.csv +57 -0
  84. package/skills/frontend/design/ui-ux-pro-max/data/styles.csv +89 -85
  85. package/skills/frontend/design/ui-ux-pro-max/data/typography.csv +74 -73
  86. package/skills/frontend/design/ui-ux-pro-max/data/ui-reasoning.csv +193 -162
  87. package/skills/frontend/design/ui-ux-pro-max/data/ux-guidelines.csv +30 -10
  88. package/skills/frontend/design/ui-ux-pro-max/references/pro-rules.md +117 -0
  89. package/skills/frontend/design/ui-ux-pro-max/references/quick-reference.md +256 -0
  90. package/skills/frontend/design/ui-ux-pro-max/scripts/core.py +800 -69
  91. package/skills/frontend/design/ui-ux-pro-max/scripts/design_system.py +700 -180
  92. package/skills/frontend/design/ui-ux-pro-max/scripts/reasoning_contract.py +123 -0
  93. package/skills/frontend/design/ui-ux-pro-max/scripts/search.py +105 -42
  94. package/skills/frontend/design/ui-ux-pro-max/scripts/validate_data.py +1095 -0
  95. package/skills/frontend/react-native/react-native-unistyles-v3/NOTICE.md +1 -1
  96. package/skills/frontend/react-native/react-native-unistyles-v3/SKILL.md +33 -24
  97. package/skills/frontend/react-native/react-native-unistyles-v3/references/api-reference.md +135 -78
  98. package/skills/frontend/react-native/react-native-unistyles-v3/references/common-issues.md +48 -31
  99. package/skills/frontend/react-native/react-native-unistyles-v3/references/setup-guide.md +76 -34
  100. package/skills/frontend/react-native/react-native-unistyles-v3/references/styling-patterns.md +145 -52
  101. package/skills/frontend/react-native/react-native-unistyles-v3/references/third-party-integration.md +76 -27
  102. package/skills/media/brag-slim/NOTICE.md +3 -3
  103. package/skills/media/brag-slim/SKILL.md +4 -0
  104. package/skills/frontend/design/revenue-centric-design/assets/2018693884449009956__1.jpg +0 -0
  105. package/skills/frontend/design/ui-ux-pro-max/data/_sync_all.py +0 -414
  106. package/skills/frontend/design/ui-ux-pro-max/data/design.csv +0 -1776
  107. package/skills/frontend/design/ui-ux-pro-max/data/draft.csv +0 -1779
@@ -1,51 +1,77 @@
1
- No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
2
- 1,Installation,Add Nuxt UI module,Install and configure Nuxt UI in your Nuxt project,pnpm add @nuxt/ui and add to modules,Manual component imports,"modules: ['@nuxt/ui']","import { UButton } from '@nuxt/ui'",High,https://ui.nuxt.com/docs/getting-started/installation/nuxt
3
- 2,Installation,Import Tailwind and Nuxt UI CSS,Required CSS imports in main.css file,@import tailwindcss and @import @nuxt/ui,Skip CSS imports,"@import ""tailwindcss""; @import ""@nuxt/ui"";",No CSS imports,High,https://ui.nuxt.com/docs/getting-started/installation/nuxt
4
- 3,Installation,Wrap app with UApp component,UApp provides global configs for Toast Tooltip and overlays,<UApp> wrapper in app.vue,Skip UApp wrapper,<UApp><NuxtPage/></UApp>,<NuxtPage/> without wrapper,High,https://ui.nuxt.com/docs/components/app
5
- 4,Components,Use U prefix for components,All Nuxt UI components use U prefix by default,UButton UInput UModal,Button Input Modal,<UButton>Click</UButton>,<Button>Click</Button>,Medium,https://ui.nuxt.com/docs/getting-started/installation/nuxt
6
- 5,Components,Use semantic color props,Use semantic colors like primary secondary error,color="primary" color="error",Hardcoded colors,"<UButton color=""primary"">","<UButton class=""bg-green-500"">",Medium,https://ui.nuxt.com/docs/getting-started/theme/design-system
7
- 6,Components,Use variant prop for styling,Nuxt UI provides solid outline soft subtle ghost link variants,variant="soft" variant="outline",Custom button classes,"<UButton variant=""soft"">","<UButton class=""border bg-transparent"">",Medium,https://ui.nuxt.com/docs/components/button
8
- 7,Components,Use size prop consistently,Components support xs sm md lg xl sizes,size="sm" size="lg",Arbitrary sizing classes,"<UButton size=""lg"">","<UButton class=""text-xl px-6"">",Low,https://ui.nuxt.com/docs/components/button
9
- 8,Icons,Use icon prop with Iconify format,Nuxt UI supports Iconify icons via icon prop,icon="lucide:home" icon="heroicons:user",i-lucide-home format,"<UButton icon=""lucide:home"">","<UButton icon=""i-lucide-home"">",Medium,https://ui.nuxt.com/docs/getting-started/integrations/icons/nuxt
10
- 9,Icons,Use leadingIcon and trailingIcon,Position icons with dedicated props for clarity,leadingIcon="lucide:plus" trailingIcon="lucide:arrow-right",Manual icon positioning,"<UButton leadingIcon=""lucide:plus"">","<UButton><Icon name=""lucide:plus""/>Add</UButton>",Low,https://ui.nuxt.com/docs/components/button
11
- 10,Theming,Configure colors in app.config.ts,Runtime color configuration without restart,ui.colors.primary in app.config.ts,Hardcoded colors in components,"defineAppConfig({ ui: { colors: { primary: 'blue' } } })","<UButton class=""bg-blue-500"">",High,https://ui.nuxt.com/docs/getting-started/theme/design-system
12
- 11,Theming,Use @theme directive for custom colors,Define design tokens in CSS with Tailwind @theme,@theme { --color-brand-500: #xxx },Inline color definitions,@theme { --color-brand-500: #ef4444; },:style="{ color: '#ef4444' }",Medium,https://ui.nuxt.com/docs/getting-started/theme/design-system
13
- 12,Theming,Extend semantic colors in nuxt.config,Register new colors like tertiary in theme.colors,theme.colors array in ui config,Use undefined colors,"ui: { theme: { colors: ['primary', 'tertiary'] } }","<UButton color=""tertiary""> without config",Medium,https://ui.nuxt.com/docs/getting-started/theme/design-system
14
- 13,Forms,Use UForm with schema validation,UForm supports Zod Yup Joi Valibot schemas,:schema prop with validation schema,Manual form validation,"<UForm :schema=""schema"" :state=""state"">",Manual @blur validation,High,https://ui.nuxt.com/docs/components/form
15
- 14,Forms,Use UFormField for field wrapper,Provides label error message and validation display,UFormField with name prop,Manual error handling,"<UFormField name=""email"" label=""Email"">",<div><label>Email</label><UInput/><span>error</span></div>,Medium,https://ui.nuxt.com/docs/components/form-field
16
- 15,Forms,Handle form submit with @submit,UForm emits submit event with validated data,@submit handler on UForm,@click on submit button,"<UForm @submit=""onSubmit"">","<UButton @click=""onSubmit"">",Medium,https://ui.nuxt.com/docs/components/form
17
- 16,Forms,Use validateOn prop for validation timing,Control when validation triggers (blur change input),validateOn="['blur']" for performance,Always validate on input,"<UForm :validateOn=""['blur', 'change']"">","<UForm> (validates on every keystroke)",Low,https://ui.nuxt.com/docs/components/form
18
- 17,Overlays,Use v-model:open for overlay control,Modal Slideover Drawer use v-model:open,v-model:open for controlled state,Manual show/hide logic,"<UModal v-model:open=""isOpen"">",<UModal v-if="isOpen">,Medium,https://ui.nuxt.com/docs/components/modal
19
- 18,Overlays,Use useOverlay composable for programmatic overlays,Open overlays programmatically without template refs,useOverlay().open(MyModal),Template ref and manual control,"const overlay = useOverlay(); overlay.open(MyModal, { props })","const modal = ref(); modal.value.open()",Medium,https://ui.nuxt.com/docs/components/modal
20
- 19,Overlays,Use title and description props,Built-in header support for overlays,title="Confirm" description="Are you sure?",Manual header content,"<UModal title=""Confirm"" description=""Are you sure?"">","<UModal><template #header><h2>Confirm</h2></template>",Low,https://ui.nuxt.com/docs/components/modal
21
- 20,Dashboard,Use UDashboardSidebar for navigation,Provides collapsible resizable sidebar with mobile support,UDashboardSidebar with header default footer slots,Custom sidebar implementation,<UDashboardSidebar><template #header>...</template></UDashboardSidebar>,<aside class="w-64 border-r">,Medium,https://ui.nuxt.com/docs/components/dashboard-sidebar
22
- 21,Dashboard,Use UDashboardGroup for layout,Wraps dashboard components with sidebar state management,UDashboardGroup > UDashboardSidebar + UDashboardPanel,Manual layout flex containers,<UDashboardGroup><UDashboardSidebar/><UDashboardPanel/></UDashboardGroup>,"<div class=""flex""><aside/><main/></div>",Medium,https://ui.nuxt.com/docs/components/dashboard-group
23
- 22,Dashboard,Use UDashboardNavbar for top navigation,Responsive navbar with mobile menu support,UDashboardNavbar in dashboard layout,Custom navbar implementation,<UDashboardNavbar :links="navLinks"/>,<nav class="border-b">,Low,https://ui.nuxt.com/docs/components/dashboard-navbar
24
- 23,Tables,Use UTable with data and columns props,Powered by TanStack Table with built-in features,:data and :columns props,Manual table markup,"<UTable :data=""users"" :columns=""columns""/>","<table><tr v-for=""user in users"">",High,https://ui.nuxt.com/docs/components/table
25
- 24,Tables,Define columns with accessorKey,Column definitions use accessorKey for data binding,accessorKey: 'email' in column def,String column names only,"{ accessorKey: 'email', header: 'Email' }","['name', 'email']",Medium,https://ui.nuxt.com/docs/components/table
26
- 25,Tables,Use cell slot for custom rendering,Customize cell content with scoped slots,#cell-columnName slot,Override entire table,<template #cell-status="{ row }">,Manual column render function,Medium,https://ui.nuxt.com/docs/components/table
27
- 26,Tables,Enable sorting with sortable column option,Add sortable: true to column definition,sortable: true in column,Manual sort implementation,"{ accessorKey: 'name', sortable: true }",@click="sortBy('name')",Low,https://ui.nuxt.com/docs/components/table
28
- 27,Navigation,Use UNavigationMenu for nav links,Horizontal or vertical navigation with dropdown support,UNavigationMenu with items array,Manual nav with v-for,"<UNavigationMenu :items=""navItems""/>","<nav><a v-for=""item in items"">",Medium,https://ui.nuxt.com/docs/components/navigation-menu
29
- 28,Navigation,Use UBreadcrumb for page hierarchy,Automatic breadcrumb with NuxtLink support,:items array with label and to,Manual breadcrumb links,"<UBreadcrumb :items=""breadcrumbs""/>","<nav><span v-for=""crumb in crumbs"">",Low,https://ui.nuxt.com/docs/components/breadcrumb
30
- 29,Navigation,Use UTabs for tabbed content,Tab navigation with content panels,UTabs with items containing slot content,Manual tab state,"<UTabs :items=""tabs""/>","<div><button @click=""tab=1"">",Medium,https://ui.nuxt.com/docs/components/tabs
31
- 30,Feedback,Use useToast for notifications,Composable for toast notifications,useToast().add({ title description }),Alert components for toasts,"const toast = useToast(); toast.add({ title: 'Saved' })",<UAlert v-if="showSuccess">,High,https://ui.nuxt.com/docs/components/toast
32
- 31,Feedback,Use UAlert for inline messages,Static alert messages with icon and actions,UAlert with title description color,Toast for static messages,"<UAlert title=""Warning"" color=""warning""/>",useToast for inline alerts,Medium,https://ui.nuxt.com/docs/components/alert
33
- 32,Feedback,Use USkeleton for loading states,Placeholder content during data loading,USkeleton with appropriate size,Spinner for content loading,<USkeleton class="h-4 w-32"/>,<UIcon name="lucide:loader" class="animate-spin"/>,Low,https://ui.nuxt.com/docs/components/skeleton
34
- 33,Color Mode,Use UColorModeButton for theme toggle,Built-in light/dark mode toggle button,UColorModeButton component,Manual color mode logic,<UColorModeButton/>,"<button @click=""toggleColorMode"">",Low,https://ui.nuxt.com/docs/components/color-mode-button
35
- 34,Color Mode,Use UColorModeSelect for theme picker,Dropdown to select system light or dark mode,UColorModeSelect component,Custom select for theme,<UColorModeSelect/>,"<USelect v-model=""colorMode"" :items=""modes""/>",Low,https://ui.nuxt.com/docs/components/color-mode-select
36
- 35,Customization,Use ui prop for component styling,Override component styles via ui prop,ui prop with slot class overrides,Global CSS overrides,"<UButton :ui=""{ base: 'rounded-full' }""/>",<UButton class="!rounded-full"/>,Medium,https://ui.nuxt.com/docs/getting-started/theme/components
37
- 36,Customization,Configure default variants in nuxt.config,Set default color and size for all components,theme.defaultVariants in ui config,Repeat props on every component,"ui: { theme: { defaultVariants: { color: 'neutral' } } }","<UButton color=""neutral""> everywhere",Medium,https://ui.nuxt.com/docs/getting-started/installation/nuxt
38
- 37,Customization,Use app.config.ts for theme overrides,Runtime theme customization,defineAppConfig with ui key,nuxt.config for runtime values,"defineAppConfig({ ui: { button: { defaultVariants: { size: 'sm' } } } })","nuxt.config ui.button.size: 'sm'",Medium,https://ui.nuxt.com/docs/getting-started/theme/components
39
- 38,Performance,Enable component detection,Tree-shake unused component CSS,experimental.componentDetection: true,Include all component CSS,"ui: { experimental: { componentDetection: true } }","ui: {} (includes all CSS)",Low,https://ui.nuxt.com/docs/getting-started/installation/nuxt
40
- 39,Performance,Use UTable virtualize for large data,Enable virtualization for 1000+ rows,:virtualize prop on UTable,Render all rows,"<UTable :data=""largeData"" virtualize/>","<UTable :data=""largeData""/>",Medium,https://ui.nuxt.com/docs/components/table
41
- 40,Accessibility,Use semantic component props,Components have built-in ARIA support,Use title description label props,Skip accessibility props,"<UModal title=""Settings"">","<UModal><h2>Settings</h2>",Medium,https://ui.nuxt.com/docs/components/modal
42
- 41,Accessibility,Use UFormField for form accessibility,Automatic label-input association,UFormField wraps inputs,Manual id and for attributes,"<UFormField label=""Email""><UInput/></UFormField>","<label for=""email"">Email</label><UInput id=""email""/>",High,https://ui.nuxt.com/docs/components/form-field
43
- 42,Content,Use UContentToc for table of contents,Automatic TOC with active heading highlight,UContentToc with :links,Manual TOC implementation,"<UContentToc :links=""toc""/>","<nav><a v-for=""heading in headings"">",Low,https://ui.nuxt.com/docs/components/content-toc
44
- 43,Content,Use UContentSearch for docs search,Command palette for documentation search,UContentSearch with Nuxt Content,Custom search implementation,<UContentSearch/>,<UCommandPalette :groups="searchResults"/>,Low,https://ui.nuxt.com/docs/components/content-search
45
- 44,AI/Chat,Use UChatMessages for chat UI,Designed for Vercel AI SDK integration,UChatMessages with messages array,Custom chat message list,"<UChatMessages :messages=""messages""/>","<div v-for=""msg in messages"">",Medium,https://ui.nuxt.com/docs/components/chat-messages
46
- 45,AI/Chat,Use UChatPrompt for input,Enhanced textarea for AI prompts,UChatPrompt with v-model,Basic textarea,<UChatPrompt v-model="prompt"/>,<UTextarea v-model="prompt"/>,Medium,https://ui.nuxt.com/docs/components/chat-prompt
47
- 46,Editor,Use UEditor for rich text,TipTap-based editor with toolbar support,UEditor with v-model:content,Custom TipTap setup,"<UEditor v-model:content=""content""/>",Manual TipTap initialization,Medium,https://ui.nuxt.com/docs/components/editor
48
- 47,Links,Use to prop for navigation,UButton and ULink support NuxtLink to prop,to="/dashboard" for internal links,href for internal navigation,"<UButton to=""/dashboard"">","<UButton href=""/dashboard"">",Medium,https://ui.nuxt.com/docs/components/button
49
- 48,Links,Use external prop for outside links,Explicitly mark external links,target="_blank" with external URLs,Forget rel="noopener","<UButton to=""https://example.com"" target=""_blank"">","<UButton href=""https://..."">",Low,https://ui.nuxt.com/docs/components/link
50
- 49,Loading,Use loadingAuto on buttons,Automatic loading state from @click promise,loadingAuto prop on UButton,Manual loading state,"<UButton loadingAuto @click=""async () => await save()"">","<UButton :loading=""isLoading"" @click=""save"">",Low,https://ui.nuxt.com/docs/components/button
51
- 50,Loading,Use UForm loadingAuto,Auto-disable form during submit,loadingAuto on UForm (default true),Manual form disabled state,"<UForm @submit=""handleSubmit"">","<UForm :disabled=""isSubmitting"">",Low,https://ui.nuxt.com/docs/components/form
1
+ No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL,Applies To,Status,Verified At
2
+ 1,Installation,Add Nuxt UI module,"Install Nuxt UI and Tailwind CSS, then register the Nuxt module",pnpm add @nuxt/ui tailwindcss and add @nuxt/ui to modules,Manual component imports,modules: ['@nuxt/ui'] // after pnpm add @nuxt/ui tailwindcss,import { UButton } from '@nuxt/ui',High,https://ui.nuxt.com/docs/getting-started/installation/nuxt,nuxt-ui 4.11.1,active,2026-09-21
3
+ 2,Installation,Import Tailwind and Nuxt UI CSS,Required CSS imports in main.css file,@import tailwindcss and @import @nuxt/ui,Skip CSS imports,"@import ""tailwindcss""; @import ""@nuxt/ui"";",No CSS imports,High,https://ui.nuxt.com/docs/getting-started/installation/nuxt,nuxt-ui 4.11.1,active,2026-09-21
4
+ 3,Installation,Wrap app with UApp component,"UApp provides toast, tooltip, overlay, and locale context",Wrap NuxtPage or RouterView once at the app root,Mount pages outside UApp,<UApp><NuxtPage/></UApp>,<NuxtPage/> without wrapper,High,https://ui.nuxt.com/docs/components/app,nuxt-ui 4.11.1,active,2026-09-21
5
+ 4,Components,Use U prefix for components,All Nuxt UI components use U prefix by default,UButton UInput UModal,Button Input Modal,<UButton>Click</UButton>,<Button>Click</Button>,Medium,https://ui.nuxt.com/docs/getting-started/installation/nuxt,nuxt-ui 4.11.1,active,2026-09-21
6
+ 5,Components,Use semantic color props,"Style Nuxt UI components with meaning-based colors such as primary, success, and error","Use color props such as color=""primary"" or color=""error""",Hardcoded palette colors,"<UButton color=""primary"">","<UButton class=""bg-green-500"">",Medium,https://ui.nuxt.com/docs/getting-started/theme/design-system,nuxt-ui 4.11.1,active,2026-09-21
7
+ 6,Components,Use variant prop for styling,Nuxt UI provides solid outline soft subtle ghost link variants,Choose a built-in variant before adding custom classes,Recreate a built-in variant with custom classes,"<UButton variant=""soft"">","<UButton class=""border bg-transparent"">",Medium,https://ui.nuxt.com/docs/components/button,nuxt-ui 4.11.1,active,2026-09-21
8
+ 7,Components,Use size prop consistently,Components support xs sm md lg xl sizes,"size=""sm"" size=""lg""",Arbitrary sizing classes,"<UButton size=""lg"">","<UButton class=""text-xl px-6"">",Low,https://ui.nuxt.com/docs/components/button,nuxt-ui 4.11.1,active,2026-09-21
9
+ 8,Icons,Use i-{collection}-{name} format for icons,Nuxt UI v4 uses Iconify i-prefix format — lucide:home is v3 legacy,i-lucide-home i-heroicons-user format,lucide:home format (v3 syntax),"<UButton icon=""i-lucide-home"">","<UButton icon=""lucide:home"">",High,https://ui.nuxt.com/docs/getting-started/installation/nuxt,nuxt-ui 4.11.1,active,2026-09-21
10
+ 9,Icons,Use leadingIcon and trailingIcon props,Position icons with dedicated props for clarity,Use leadingIcon or trailingIcon for standard button icons,Build a custom icon slot when a standard icon prop is enough,"<UButton leadingIcon=""i-lucide-plus"" label=""Add"">","<UButton><UIcon name=""i-lucide-plus""/>Add</UButton>",Low,https://ui.nuxt.com/docs/components/button,nuxt-ui 4.11.1,active,2026-09-21
11
+ 10,Theming,Configure colors in app.config.ts,Runtime color configuration without restart,ui.colors.primary in app.config.ts,Hardcoded colors in components,defineAppConfig({ ui: { colors: { primary: 'blue' } } }),"<UButton class=""bg-blue-500"">",High,https://ui.nuxt.com/docs/getting-started/theme/design-system,nuxt-ui 4.11.1,active,2026-09-21
12
+ 11,Theming,Define complete custom palettes with @theme static,Nuxt UI custom colors require shades 50 through 950,Define every --color-brand-* shade in @theme static,Define only one shade for a custom palette,@theme static { --color-brand-50: #fff1f2; ... --color-brand-950: #4c0519; },@theme { --color-brand-500: #ef4444; },Medium,https://ui.nuxt.com/docs/getting-started/theme/design-system,nuxt-ui 4.11.1,active,2026-09-21
13
+ 12,Theming,Register and map semantic colors,Register extra semantic color names at build time then map them to a palette in app.config,nuxt.config ui.theme.colors plus app.config ui.colors,Use an unregistered semantic color,"ui: { theme: { colors: ['primary', 'tertiary'] } } then ui.colors.tertiary = 'violet'","<UButton color=""tertiary""> without config",Medium,https://ui.nuxt.com/docs/getting-started/theme/design-system,nuxt-ui 4.11.1,active,2026-09-21
14
+ 13,Forms,Use UForm with schema validation,"UForm accepts Standard Schema libraries such as Zod, Valibot, Yup, and Joi",Pass a Standard Schema with :schema and reactive state with :state,Manual form validation,"<UForm :schema=""schema"" :state=""state"">",Manual @blur validation,High,https://ui.nuxt.com/docs/components/form,nuxt-ui 4.11.1,active,2026-09-21
15
+ 14,Forms,Use UFormField for field wrapper,Provides label error message and validation display,UFormField with name prop,Manual error handling,"<UFormField name=""email"" label=""Email"">",<div><label>Email</label><UInput/><span>error</span></div>,Medium,https://ui.nuxt.com/docs/components/form-field,nuxt-ui 4.11.1,active,2026-09-21
16
+ 15,Forms,Handle form submit with @submit,UForm emits submit event with validated data,@submit handler on UForm,@click on submit button,"<UForm @submit=""onSubmit"">","<UButton @click=""onSubmit"">",Medium,https://ui.nuxt.com/docs/components/form,nuxt-ui 4.11.1,active,2026-09-21
17
+ 16,Forms,Choose validation timing deliberately,UForm validates on input blur and change by default; input is delayed and begins after blur unless eager,Set validateOn and eager to match the interaction,Assume the default validates every keystroke immediately,"<UForm :validateOn=""['blur', 'change']"">",Describe default UForm as eager input-only validation,Low,https://ui.nuxt.com/docs/components/form,nuxt-ui 4.11.1,active,2026-09-21
18
+ 17,Overlays,Use v-model:open for overlay control,Modal Slideover Drawer use v-model:open,v-model:open for controlled state,Manual show/hide logic,"<UModal v-model:open=""isOpen"">","<UModal v-if=""isOpen"">",Medium,https://ui.nuxt.com/docs/components/modal,nuxt-ui 4.11.1,active,2026-09-21
19
+ 18,Overlays,Use useOverlay composable for programmatic overlays,Open overlays programmatically — v4 API is create().open() not open(Component),"Create the overlay once, then pass component props directly to open()",v3 overlay.open(Component) pattern (removed in v4),const modal = overlay.create(MyModal); const { result } = modal.open({ title: 'Confirm' }),"overlay.open(MyModal, { props: { title: 'Confirm' } })",High,https://ui.nuxt.com/docs/composables/use-overlay,nuxt-ui 4.11.1,active,2026-09-21
20
+ 19,Overlays,Use title and description props,Built-in header support for overlays,Use title and description props for a standard overlay header,Rebuild a simple title and description with a custom header slot,"<UModal title=""Confirm"" description=""Are you sure?"">",<UModal><template #header><h2>Confirm</h2></template>,Low,https://ui.nuxt.com/docs/components/modal,nuxt-ui 4.11.1,active,2026-09-21
21
+ 20,Dashboard,Use UDashboardSidebar for navigation,Provides collapsible resizable sidebar with mobile support,UDashboardSidebar with header default footer slots,Custom sidebar implementation,<UDashboardSidebar><template #header>...</template></UDashboardSidebar>,"<aside class=""w-64 border-r"">",Medium,https://ui.nuxt.com/docs/components/dashboard-sidebar,nuxt-ui 4.11.1,active,2026-09-21
22
+ 21,Dashboard,Use UDashboardGroup for layout,Wraps dashboard components with sidebar state management,UDashboardGroup > UDashboardSidebar + UDashboardPanel,Manual layout flex containers,<UDashboardGroup><UDashboardSidebar/><UDashboardPanel/></UDashboardGroup>,"<div class=""flex""><aside/><main/></div>",Medium,https://ui.nuxt.com/docs/components/dashboard-group,nuxt-ui 4.11.1,active,2026-09-21
23
+ 22,Dashboard,Use UDashboardNavbar for top navigation,Responsive dashboard header with sidebar toggle and layout slots,Place UDashboardNavbar in a UDashboardPanel header and use its slots for actions,Pass unsupported links props or rebuild the responsive toggle,"<UDashboardNavbar title=""Dashboard""><template #right><UButton label=""Add""/></template></UDashboardNavbar>","<UDashboardNavbar :links=""navLinks""/>",Low,https://ui.nuxt.com/docs/components/dashboard-navbar,nuxt-ui 4.11.1,active,2026-09-21
24
+ 23,Tables,Use UTable with data and columns props,Powered by TanStack Table with built-in features,:data and :columns props,Manual table markup,"<UTable :data=""users"" :columns=""columns""/>","<table><tr v-for=""user in users"">",High,https://ui.nuxt.com/docs/components/table,nuxt-ui 4.11.1,active,2026-09-21
25
+ 24,Tables,Define columns with accessorKey,Column definitions use accessorKey for data binding,accessorKey: 'email' in column def,String column names only,"{ accessorKey: 'email', header: 'Email' }","['name', 'email']",Medium,https://ui.nuxt.com/docs/components/table,nuxt-ui 4.11.1,active,2026-09-21
26
+ 25,Tables,Use column cell slots,Customize cell content with the documented column-id slot pattern,#status-cell for a status column,Use the obsolete #cell-status name,"<template #status-cell=""{ row }"">","<template #cell-status=""{ row }"">",Medium,https://ui.nuxt.com/docs/components/table,nuxt-ui 4.11.1,active,2026-09-21
27
+ 26,Tables,Enable sorting with TanStack column APIs,Render a header control that calls column.toggleSorting,Use getCanSort and toggleSorting,Invent a sortable property not in the column contract,"header: ({ column }) => h(UButton, { onClick: () => column.toggleSorting() })","{ accessorKey: 'name', sortable: true }",Low,https://ui.nuxt.com/docs/components/table,nuxt-ui 4.11.1,active,2026-09-21
28
+ 27,Navigation,Use UNavigationMenu for nav links,Horizontal or vertical navigation with dropdown support,UNavigationMenu with items array,Manual nav with v-for,"<UNavigationMenu :items=""navItems""/>","<nav><a v-for=""item in items"">",Medium,https://ui.nuxt.com/docs/components/navigation-menu,nuxt-ui 4.11.1,active,2026-09-21
29
+ 28,Navigation,Use UBreadcrumb for page hierarchy,Render accessible page hierarchy from an items array with NuxtLink support,:items array with label and to,Manual breadcrumb links,"<UBreadcrumb :items=""breadcrumbs""/>","<nav><span v-for=""crumb in crumbs"">",Low,https://ui.nuxt.com/docs/components/breadcrumb,nuxt-ui 4.11.1,active,2026-09-21
30
+ 29,Navigation,Use UTabs for tabbed content,Tab navigation with content panels,UTabs with items containing slot content,Manual tab state,"<UTabs :items=""tabs""/>","<div><button @click=""tab=1"">",Medium,https://ui.nuxt.com/docs/components/tabs,nuxt-ui 4.11.1,active,2026-09-21
31
+ 30,Feedback,Use useToast for notifications,Composable notifications rendered by the UApp toast provider,Wrap the app in UApp and call useToast().add(),Alert components for toasts,const toast = useToast(); toast.add({ title: 'Saved' }),"<UAlert v-if=""showSuccess"">",High,https://ui.nuxt.com/docs/components/toast,nuxt-ui 4.11.1,active,2026-09-21
32
+ 31,Feedback,Use UAlert for inline messages,Static alert messages with icon and actions,UAlert with title description color,Toast for static messages,"<UAlert title=""Warning"" color=""warning""/>",useToast for inline alerts,Medium,https://ui.nuxt.com/docs/components/alert,nuxt-ui 4.11.1,active,2026-09-21
33
+ 32,Feedback,Use USkeleton for loading states,Placeholder content during data loading,USkeleton with appropriate size,Spinner for content loading,"<USkeleton class=""h-4 w-32""/>","<UIcon name=""i-lucide-loader-circle"" class=""animate-spin""/>",Low,https://ui.nuxt.com/docs/components/skeleton,nuxt-ui 4.11.1,active,2026-09-21
34
+ 33,Color Mode,Use UColorModeButton for theme toggle,Built-in light/dark mode toggle button,UColorModeButton component,Manual color mode logic,<UColorModeButton/>,"<button @click=""toggleColorMode"">",Low,https://ui.nuxt.com/docs/components/color-mode-button,nuxt-ui 4.11.1,active,2026-09-21
35
+ 34,Color Mode,Use UColorModeSelect for theme picker,Dropdown to select system light or dark mode,UColorModeSelect component,Custom select for theme,<UColorModeSelect/>,"<USelect v-model=""colorMode"" :items=""modes""/>",Low,https://ui.nuxt.com/docs/components/color-mode-select,nuxt-ui 4.11.1,active,2026-09-21
36
+ 35,Customization,Use class for the root and ui for named slots,class customizes the root slot; ui targets component slots,Use class for root-only changes and ui after checking generated slot names,Use !important or guess undocumented slot names,"<UButton class=""rounded-full"" :ui=""{ trailingIcon: 'size-3' }""/>","<UButton class=""!rounded-full""/>",Medium,https://ui.nuxt.com/docs/getting-started/theme/components,nuxt-ui 4.11.1,active,2026-09-21
37
+ 36,Customization,Configure default variants in app.config,Set component default variants under ui component keys,app.config ui.button.defaultVariants,Put button-specific defaults under global ui.theme.defaultVariants,defineAppConfig({ ui: { button: { defaultVariants: { color: 'neutral' } } } }),ui: { theme: { defaultVariants: { variant: 'outline' } } } // affects every component,Medium,https://ui.nuxt.com/docs/getting-started/theme/components,nuxt-ui 4.11.1,active,2026-09-21
38
+ 37,Customization,Use app.config.ts for theme overrides,Runtime theme customization,defineAppConfig with ui key,nuxt.config for runtime values,defineAppConfig({ ui: { button: { defaultVariants: { size: 'sm' } } } }),nuxt.config ui.button.size: 'sm',Medium,https://ui.nuxt.com/docs/getting-started/theme/components,nuxt-ui 4.11.1,active,2026-09-21
39
+ 38,Performance,Enable component detection for Nuxt,Generate CSS only for detected Nuxt UI components and their dependencies,Use true for static usage or include dynamic component names in an array,Enable detection and omit components rendered through dynamic :is values,ui: { experimental: { componentDetection: ['Modal'] } },"componentDetection: true with <component :is=""name""/> only",Low,https://ui.nuxt.com/docs/getting-started/installation/nuxt,nuxt-ui 4.11.1,active,2026-09-21
40
+ 39,Performance,Use UTable virtualize for large data,Enable row virtualization when rendering large datasets,Use the virtualize prop after row rendering becomes a measured bottleneck,Render a large dataset without pagination or virtualization,"<UTable :data=""largeData"" virtualize/>","<UTable :data=""largeData""/>",Medium,https://ui.nuxt.com/docs/components/table,nuxt-ui 4.11.1,active,2026-09-21
41
+ 40,Accessibility,Give overlays an accessible name and description,Overlay title and description props provide dialog labeling,Provide title and description unless custom slots supply equivalent semantics,Open an unlabeled modal,"<UModal title=""Settings"" description=""Update your preferences"">",<UModal><template #body>...</template></UModal>,High,https://ui.nuxt.com/docs/components/modal,nuxt-ui 4.11.1,active,2026-09-21
42
+ 41,Accessibility,Associate labels with controls,Use UFormField or correct native id and for attributes,UFormField for convenience or explicit label association,Use placeholders as labels,"<UFormField label=""Email""><UInput/></UFormField>","<UInput placeholder=""Email""/>",High,https://ui.nuxt.com/docs/components/form-field,nuxt-ui 4.11.1,active,2026-09-21
43
+ 42,Content,Use UContentToc for table of contents,Automatic TOC with active heading highlight,UContentToc with :links,Manual TOC implementation,"<UContentToc :links=""toc""/>","<nav><a v-for=""heading in headings"">",Low,https://ui.nuxt.com/docs/components/content-toc,nuxt-ui 4.11.1,active,2026-09-21
44
+ 43,Content,Use UContentSearch for docs search,Command palette for documentation search,UContentSearch with Nuxt Content,Custom search implementation,<UContentSearch/>,"<UCommandPalette :groups=""searchResults""/>",Low,https://ui.nuxt.com/docs/components/content-search,nuxt-ui 4.11.1,active,2026-09-21
45
+ 44,AI/Chat,Use UChatMessages for chat UI,Designed for Vercel AI SDK integration,UChatMessages with messages array,Custom chat message list,"<UChatMessages :messages=""messages""/>","<div v-for=""msg in messages"">",Medium,https://ui.nuxt.com/docs/components/chat-messages,nuxt-ui 4.11.1,active,2026-09-21
46
+ 45,AI/Chat,Use UChatPrompt for input,Enhanced textarea for AI prompts,UChatPrompt with v-model,Basic textarea,"<UChatPrompt v-model=""prompt""/>","<UTextarea v-model=""prompt""/>",Medium,https://ui.nuxt.com/docs/components/chat-prompt,nuxt-ui 4.11.1,active,2026-09-21
47
+ 46,Editor,Use UEditor for rich text,TipTap-based editor binds its document with v-model,UEditor with v-model,Use the undocumented v-model:content binding,"<UEditor v-model=""content""/>","<UEditor v-model:content=""content""/>",Medium,https://ui.nuxt.com/docs/components/editor,nuxt-ui 4.11.1,active,2026-09-21
48
+ 47,Links,Use to prop for navigation,UButton and ULink support NuxtLink to prop,"to=""/dashboard"" for internal links",href for internal navigation,"<UButton to=""/dashboard"">","<UButton href=""/dashboard"">",Medium,https://ui.nuxt.com/docs/components/button,nuxt-ui 4.11.1,active,2026-09-21
49
+ 48,Links,Use to for external URLs,ULink and link-enabled components detect absolute URLs and support target when a new tab is intended,"to=""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://..."">",Low,https://ui.nuxt.com/docs/components/link,nuxt-ui 4.11.1,active,2026-09-21
50
+ 49,Loading,Use loadingAuto on buttons,Automatic loading state from @click promise,loadingAuto prop on UButton,Manual loading state,"<UButton loadingAuto @click=""async () => await save()"">","<UButton :loading=""isLoading"" @click=""save"">",Low,https://ui.nuxt.com/docs/components/button,nuxt-ui 4.11.1,active,2026-09-21
51
+ 50,Loading,Use UForm loadingAuto,Auto-disable form during submit,loadingAuto on UForm (default true),Manual form disabled state,"<UForm @submit=""handleSubmit"">","<UForm :disabled=""isSubmitting"">",Low,https://ui.nuxt.com/docs/components/form,nuxt-ui 4.11.1,active,2026-09-21
52
+ 51,Installation,Let Nuxt UI declare module dependencies,Nuxt UI uses Nuxt moduleDependencies for Icon Fonts and Color Mode ordering and registration,Configure dependency options at their root keys,Add duplicate module entries without a documented need,icon: { /* opts */ } in nuxt.config,"modules: ['@nuxt/ui', '@nuxt/icon']",High,https://ui.nuxt.com/docs/getting-started/installation/nuxt,nuxt-ui 4.11.1,active,2026-09-21
53
+ 52,Installation,Use official templates to bootstrap projects,Create a Nuxt project from an official Nuxt UI template,npm create nuxt@latest -- -t ui/dashboard,Manually reconstruct a template,npm create nuxt@latest -- -t ui/dashboard,pnpm create nuxt app then copy dashboard files,Medium,https://ui.nuxt.com/docs/getting-started/installation/nuxt,nuxt-ui 4.11.1,active,2026-09-21
54
+ 53,Icons,Install required icon collections locally,Install the Iconify JSON collections used by the app for reliable SSR and bundling,pnpm i @iconify-json/lucide for lucide icons,Rely on an unavailable collection at runtime,pnpm i @iconify-json/lucide,Use i-custom-* without installing its collection,Medium,https://ui.nuxt.com/docs/getting-started/icons/nuxt,nuxt-ui 4.11.1,active,2026-09-21
55
+ 54,Icons,Override default component icons centrally when needed,appConfig.ui.icons keeps intentional icon overrides consistent,Set a global icon key when the product needs a different default,Repeat the same icon override on every component instance,"defineAppConfig({ ui: { icons: { loading: 'i-lucide-refresh-cw', close: 'i-lucide-x' } } })","<UModal close-icon=""i-lucide-circle-x""/> repeated everywhere",Low,https://ui.nuxt.com/docs/getting-started/installation/nuxt,nuxt-ui 4.11.1,active,2026-09-21
56
+ 55,Forms,Use UFileUpload for file input,Built-in drag-drop and preview support,UFileUpload with v-model and accept prop,Custom input type=file,"<UFileUpload v-model=""files"" accept=""image/*"" multiple/>","<input type=""file"" @change=""handleFiles"">",Medium,https://ui.nuxt.com/docs/components/file-upload,nuxt-ui 4.11.1,active,2026-09-21
57
+ 56,Forms,Use UInputDate for date selection,Date input supports single dates and ranges with locale inherited from UApp,Use range when needed and configure locale on UApp,Third-party date picker libraries,"<UApp :locale=""fr""><UInputDate v-model=""range"" range/></UApp>","<UInputDate locale=""fr""/>",Medium,https://ui.nuxt.com/docs/components/input-date,nuxt-ui 4.11.1,active,2026-09-21
58
+ 57,Forms,Use UInputTags for tag input,Multi-value tag input with keyboard support,UInputTags with v-model and max prop,Custom chip input implementation,"<UInputTags v-model=""tags"" :max=""5"" />","<UInput @keydown.enter=""addTag"">",Low,https://ui.nuxt.com/docs/components/input-tags,nuxt-ui 4.11.1,active,2026-09-21
59
+ 58,Forms,Use UColorPicker for color selection,Full-featured color picker with multiple format support,UColorPicker with v-model and format prop,Native input type=color,"<UColorPicker v-model=""color"" format=""hex"" />","<input type=""color"" v-model=""color"">",Low,https://ui.nuxt.com/docs/components/color-picker,nuxt-ui 4.11.1,active,2026-09-21
60
+ 59,Data,Use UTree for hierarchical data,Built-in tree component with expand/collapse,UTree with items prop containing nested children,Custom recursive component,"<UTree :items=""treeItems"" />","<TreeNode v-for=""item in items"" :key=""item.id"">",Low,https://ui.nuxt.com/docs/components/tree,nuxt-ui 4.11.1,active,2026-09-21
61
+ 60,Data,Use UMarquee for infinite scroll content,Animated infinite scroll band for logos or testimonials,UMarquee with repeat and pauseOnHover props,CSS animation keyframes loop,"<UMarquee :repeat=""3"" pause-on-hover>","<div class=""animate-marquee"">",Low,https://ui.nuxt.com/docs/components/marquee,nuxt-ui 4.11.1,active,2026-09-21
62
+ 61,Overlays,Use UContextMenu for right-click menus,Context menu triggered by right-click on children,UContextMenu wrapping target element,Browser default context menu,"<UContextMenu :items=""menuItems""><div>Right-click me</div></UContextMenu>","<div @contextmenu.prevent=""showMenu"">",Medium,https://ui.nuxt.com/docs/components/context-menu,nuxt-ui 4.11.1,active,2026-09-21
63
+ 62,Overlays,Await overlay result for confirmation dialogs,open() returns a Promise that resolves when the overlay component emits close,Emit a close value from the overlay component and await modal.open(),Expect a result from a component that never emits close,if (await modal.open()) { deleteItem() },modal.open(); deleteItem(),Medium,https://ui.nuxt.com/docs/composables/use-overlay,nuxt-ui 4.11.1,active,2026-09-21
64
+ 63,Navigation,Use UCommandPalette with identified groups,"Command palette accepts groups with an id, label, and items",Give every group a stable id and its own items,Pass a flat items prop that is not part of the component API,"<UCommandPalette :groups=""[{ id: 'actions', label: 'Actions', items }]""/>","<UCommandPalette :items=""flatList""/>",Medium,https://ui.nuxt.com/docs/components/command-palette,nuxt-ui 4.11.1,active,2026-09-21
65
+ 64,Navigation,Use defineShortcuts with extractShortcuts,Wire keyboard shortcuts from menu item kbds automatically,extractShortcuts(items) + defineShortcuts to sync keybindings,Manually duplicate shortcuts from menu items,defineShortcuts(extractShortcuts(items)),defineShortcuts({ meta_n: () => newFile() }) // duplicated from items,Low,https://ui.nuxt.com/docs/composables/define-shortcuts,nuxt-ui 4.11.1,active,2026-09-21
66
+ 65,Layout,Use UHeader and UFooter for page layout,Responsive header/footer with built-in mobile menu,UHeader with #default slot for nav UFooter with columns,Custom header/footer from scratch,<UHeader><template #right><UNavigationMenu/></template></UHeader>,"<header class=""sticky top-0"">",Low,https://ui.nuxt.com/docs/components/header,nuxt-ui 4.11.1,active,2026-09-21
67
+ 66,Layout,Use UPageAside for sidebar content,Sidebar that hides below lg breakpoint automatically,UPageAside for docs and landing page sidebars,Manual hidden lg: classes,"<UPageAside><UNavigationMenu orientation=""vertical""/></UPageAside>","<aside class=""hidden lg:block"">",Low,https://ui.nuxt.com/docs/components/page-aside,nuxt-ui 4.11.1,active,2026-09-21
68
+ 67,Color Mode,Wrap custom color mode toggles in ClientOnly,Prevents hydration mismatch on server-rendered color mode,ClientOnly with fallback placeholder,Direct useColorMode in template without ClientOnly,"<ClientOnly><USwitch v-model=""isDark""/><template #fallback><div class=""size-8""/></template></ClientOnly>","<USwitch v-model=""isDark""/> directly in template",Medium,https://ui.nuxt.com/docs/getting-started/integrations/color-mode/nuxt,nuxt-ui 4.11.1,active,2026-09-21
69
+ 68,Theming,Read generated theme file to find slot names,"Generated theme files list current slots, variants, and default classes",Check .nuxt/ui in Nuxt or node_modules/.nuxt-ui/ui in Vue before overriding slots,Guess slot names or use trial-and-error,.nuxt/ui/button.ts or node_modules/.nuxt-ui/ui/button.ts,"<UButton :ui=""{ base: 'rounded-full' }""/> without checking slots",Medium,https://ui.nuxt.com/docs/getting-started/theme/components,nuxt-ui 4.11.1,active,2026-09-21
70
+ 69,Composables,Use defineShortcuts whenever keyword shortcut,whenever array condition prevents shortcut firing when inactive,whenever: [isFormValid] to guard shortcut execution,Always-on shortcuts that fire in wrong context,"defineShortcuts({ meta_enter: { handler: submit, whenever: [isFormValid] } })",defineShortcuts({ meta_enter: () => submit() }) // fires even when invalid,Low,https://ui.nuxt.com/docs/composables/define-shortcuts,nuxt-ui 4.11.1,active,2026-09-21
71
+ 70,i18n,Use UApp locale prop for internationalization,"UApp locale configures component messages, formatting, and direction",Pass a locale object to UApp and propagate lang and dir to html,Translate built-in component strings instance by instance,"import { fr } from '@nuxt/ui/locale'; // <UApp :locale=""fr"">","<UModal title=""Fermer""> manually for each component",Low,https://ui.nuxt.com/docs/getting-started/integrations/i18n/nuxt,nuxt-ui 4.11.1,active,2026-09-21
72
+ 71,Layout,Use USplitter for resizable panel layouts,"Splitter provides horizontal, vertical, nested, and collapsible resizable panels",Define panel items with stable slots and size constraints,Reimplement drag resizing and keyboard behavior,"<USplitter id=""layout"" :items=""items"" class=""h-96"">","<div @mousemove=""resizePanels"">",Medium,https://ui.nuxt.com/docs/components/splitter,nuxt-ui 4.11.1,active,2026-09-21
73
+ 72,Layout,Stabilize server-rendered splitter layouts,Generated ids and mixed default sizes can cause hydration mismatches or panel jumps,Set id and give defaultSize to every item or to none; use auto-save-id for persistence,Mix items with and without defaultSize during SSR,"<USplitter id=""layout"" auto-save-id=""layout"" :items=""sizedItems"">","<USplitter :items=""mixedDefaultSizes"">",High,https://ui.nuxt.com/docs/components/splitter,nuxt-ui 4.11.1,active,2026-09-21
74
+ 73,Data,Use UProgressGroup for segmented totals,ProgressGroup displays multiple values as segments of one total with a legend,Pass labeled items and an explicit max when the total is not 100,Build a segmented progress bar from unrelated div widths,"<UProgressGroup :items=""usage"" :max=""128"" status/>","<div v-for=""item in usage"" :style=""{ width: item.value + '%' }"">",Low,https://ui.nuxt.com/docs/components/progress-group,nuxt-ui 4.11.1,active,2026-09-21
75
+ 74,Motion,Retune library motion with theme easing tokens,"Nuxt UI 4.11 uses --ease-out for enter, exit, and movement transitions",Override --ease-out in @theme to retime motion consistently,Override transition timing independently on every component,"@theme { --ease-out: cubic-bezier(0.16, 1, 0.3, 1); }",.modal { transition-timing-function: ... } repeated per component,Low,https://ui.nuxt.com/docs/getting-started/theme/design-system#motion,nuxt-ui 4.11.1,active,2026-09-21
76
+ 75,Performance,Enable component detection in Vue and Vite,The Nuxt UI Vite plugin can generate CSS only for detected components,Set experimental.componentDetection in the @nuxt/ui/vite plugin and restart after adding components,Expect newly detected component styles without restarting the dev server,ui({ experimental: { componentDetection: true } }),ui({}) // generates theme CSS for every component,Low,https://ui.nuxt.com/docs/getting-started/installation/vue#experimentalcomponentdetection,nuxt-ui 4.11.1,active,2026-09-21
77
+ 76,Security,Use Nuxt UI 4.11+ for CommandPalette search,Nuxt UI 4.11 escapes CommandPalette search highlights to prevent XSS,Upgrade @nuxt/ui to 4.11.1 or newer when rendering untrusted command labels,Render untrusted CommandPalette labels with a pre-4.11 release,pnpm add @nuxt/ui@^4.11.1,@nuxt/ui@4.10 with user-controlled command labels,High,https://ui.nuxt.com/docs/components/command-palette,nuxt-ui 4.11.1,active,2026-09-21
@@ -1,59 +1,68 @@
1
- No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
2
- 1,Routing,Use file-based routing,Create routes by adding files in pages directory,pages/ directory with index.vue,Manual route configuration,pages/dashboard/index.vue,Custom router setup,Medium,https://nuxt.com/docs/getting-started/routing
3
- 2,Routing,Use dynamic route parameters,Create dynamic routes with bracket syntax,[id].vue for dynamic params,Hardcoded routes for dynamic content,pages/posts/[id].vue,pages/posts/post1.vue,Medium,https://nuxt.com/docs/getting-started/routing
4
- 3,Routing,Use catch-all routes,Handle multiple path segments with [...slug],[...slug].vue for catch-all,Multiple nested dynamic routes,pages/[...slug].vue,pages/[a]/[b]/[c].vue,Low,https://nuxt.com/docs/getting-started/routing
5
- 4,Routing,Define page metadata with definePageMeta,Set page-level configuration and middleware,definePageMeta for layout middleware title,Manual route meta configuration,"definePageMeta({ layout: 'admin', middleware: 'auth' })",router.beforeEach for page config,High,https://nuxt.com/docs/api/utils/define-page-meta
6
- 5,Routing,Use validate for route params,Validate dynamic route parameters before rendering,validate function in definePageMeta,Manual validation in setup,"definePageMeta({ validate: (route) => /^\d+$/.test(route.params.id) })",if (!valid) navigateTo('/404'),Medium,https://nuxt.com/docs/api/utils/define-page-meta
7
- 6,Rendering,Use SSR by default,Server-side rendering is enabled by default,Keep ssr: true (default),Disable SSR unnecessarily,ssr: true (default),ssr: false for all pages,High,https://nuxt.com/docs/guide/concepts/rendering
8
- 7,Rendering,Use .client suffix for client-only components,Mark components to render only on client,ComponentName.client.vue suffix,v-if with process.client check,Comments.client.vue,<div v-if="process.client"><Comments/></div>,Medium,https://nuxt.com/docs/guide/directory-structure/components
9
- 8,Rendering,Use .server suffix for server-only components,Mark components to render only on server,ComponentName.server.vue suffix,Manual server check,HeavyMarkdown.server.vue,v-if="process.server",Low,https://nuxt.com/docs/guide/directory-structure/components
10
- 9,DataFetching,Use useFetch for simple data fetching,Wrapper around useAsyncData for URL fetching,useFetch for API calls,$fetch in onMounted,"const { data } = await useFetch('/api/posts')","onMounted(async () => { data.value = await $fetch('/api/posts') })",High,https://nuxt.com/docs/api/composables/use-fetch
11
- 10,DataFetching,Use useAsyncData for complex fetching,Fine-grained control over async data,useAsyncData for CMS or custom fetching,useFetch for non-URL data sources,"const { data } = await useAsyncData('posts', () => cms.getPosts())","const { data } = await useFetch(() => cms.getPosts())",Medium,https://nuxt.com/docs/api/composables/use-async-data
12
- 11,DataFetching,Use $fetch for non-reactive requests,$fetch for event handlers and non-component code,$fetch in event handlers or server routes,useFetch in click handlers,"async function submit() { await $fetch('/api/submit', { method: 'POST' }) }","async function submit() { await useFetch('/api/submit') }",High,https://nuxt.com/docs/api/utils/dollarfetch
13
- 12,DataFetching,Use lazy option for non-blocking fetch,Defer data fetching for better initial load,lazy: true for below-fold content,Blocking fetch for non-critical data,"useFetch('/api/comments', { lazy: true })",await useFetch('/api/comments') for footer,Medium,https://nuxt.com/docs/api/composables/use-fetch
14
- 13,DataFetching,Use server option to control fetch location,Choose where data is fetched,server: false for client-only data,Server fetch for user-specific client data,"useFetch('/api/user-preferences', { server: false })",useFetch for localStorage-dependent data,Medium,https://nuxt.com/docs/api/composables/use-fetch
15
- 14,DataFetching,Use pick to reduce payload size,Select only needed fields from response,pick option for large responses,Fetching entire objects when few fields needed,"useFetch('/api/user', { pick: ['id', 'name'] })",useFetch('/api/user') then destructure,Low,https://nuxt.com/docs/api/composables/use-fetch
16
- 15,DataFetching,Use transform for data manipulation,Transform data before storing in state,transform option for data shaping,Manual transformation after fetch,"useFetch('/api/posts', { transform: (posts) => posts.map(p => p.title) })",const titles = data.value.map(p => p.title),Low,https://nuxt.com/docs/api/composables/use-fetch
17
- 16,DataFetching,Handle loading and error states,Always handle pending and error states,Check status pending error refs,Ignoring loading states,"<div v-if=""status === 'pending'"">Loading...</div>",No loading indicator,High,https://nuxt.com/docs/getting-started/data-fetching
18
- 17,Lifecycle,Avoid side effects in script setup root,Move side effects to lifecycle hooks,Side effects in onMounted,setInterval in root script setup,"onMounted(() => { interval = setInterval(...) })","<script setup>setInterval(...)</script>",High,https://nuxt.com/docs/guide/concepts/nuxt-lifecycle
19
- 18,Lifecycle,Use onMounted for DOM access,Access DOM only after component is mounted,onMounted for DOM manipulation,Direct DOM access in setup,"onMounted(() => { document.getElementById('el') })","<script setup>document.getElementById('el')</script>",High,https://nuxt.com/docs/api/composables/on-mounted
20
- 19,Lifecycle,Use nextTick for post-render access,Wait for DOM updates before accessing elements,await nextTick() after state changes,Immediate DOM access after state change,"count.value++; await nextTick(); el.value.focus()","count.value++; el.value.focus()",Medium,https://nuxt.com/docs/api/utils/next-tick
21
- 20,Lifecycle,Use onPrehydrate for pre-hydration logic,Run code before Nuxt hydrates the page,onPrehydrate for client setup,onMounted for hydration-critical code,"onPrehydrate(() => { console.log(window) })",onMounted for pre-hydration needs,Low,https://nuxt.com/docs/api/composables/on-prehydrate
22
- 21,Server,Use server/api for API routes,Create API endpoints in server/api directory,server/api/users.ts for /api/users,Manual Express setup,server/api/hello.ts -> /api/hello,app.get('/api/hello'),High,https://nuxt.com/docs/guide/directory-structure/server
23
- 22,Server,Use defineEventHandler for handlers,Define server route handlers,defineEventHandler for all handlers,export default function,"export default defineEventHandler((event) => { return { hello: 'world' } })","export default function(req, res) {}",High,https://nuxt.com/docs/guide/directory-structure/server
24
- 23,Server,Use server/routes for non-api routes,Routes without /api prefix,server/routes for custom paths,server/api for non-api routes,server/routes/sitemap.xml.ts,server/api/sitemap.xml.ts,Medium,https://nuxt.com/docs/guide/directory-structure/server
25
- 24,Server,Use getQuery and readBody for input,Access query params and request body,getQuery(event) readBody(event),Direct event access,"const { id } = getQuery(event)",event.node.req.query,Medium,https://nuxt.com/docs/guide/directory-structure/server
26
- 25,Server,Validate server input,Always validate input in server handlers,Zod or similar for validation,Trust client input,"const body = await readBody(event); schema.parse(body)",const body = await readBody(event),High,https://nuxt.com/docs/guide/directory-structure/server
27
- 26,State,Use useState for shared reactive state,SSR-friendly shared state across components,useState for cross-component state,ref for shared state,"const count = useState('count', () => 0)",const count = ref(0) in composable,High,https://nuxt.com/docs/api/composables/use-state
28
- 27,State,Use unique keys for useState,Prevent state conflicts with unique keys,Descriptive unique keys for each state,Generic or duplicate keys,"useState('user-preferences', () => ({}))",useState('data') in multiple places,Medium,https://nuxt.com/docs/api/composables/use-state
29
- 28,State,Use Pinia for complex state,Pinia for advanced state management,@pinia/nuxt for complex apps,Custom state management,useMainStore() with Pinia,Custom reactive store implementation,Medium,https://nuxt.com/docs/getting-started/state-management
30
- 29,State,Use callOnce for one-time async operations,Ensure async operations run only once,callOnce for store initialization,Direct await in component,"await callOnce(store.fetch)",await store.fetch() on every render,Medium,https://nuxt.com/docs/api/utils/call-once
31
- 30,SEO,Use useSeoMeta for SEO tags,Type-safe SEO meta tag management,useSeoMeta for meta tags,useHead for simple meta,"useSeoMeta({ title: 'Home', ogTitle: 'Home', description: '...' })","useHead({ meta: [{ name: 'description', content: '...' }] })",High,https://nuxt.com/docs/api/composables/use-seo-meta
32
- 31,SEO,Use reactive values in useSeoMeta,Dynamic SEO tags with refs or getters,Computed getters for dynamic values,Static values for dynamic content,"useSeoMeta({ title: () => post.value.title })","useSeoMeta({ title: post.value.title })",Medium,https://nuxt.com/docs/api/composables/use-seo-meta
33
- 32,SEO,Use useHead for non-meta head elements,Scripts styles links in head,useHead for scripts and links,useSeoMeta for scripts,"useHead({ script: [{ src: '/analytics.js' }] })","useSeoMeta({ script: '...' })",Medium,https://nuxt.com/docs/api/composables/use-head
34
- 33,SEO,Include OpenGraph tags,Add OG tags for social sharing,ogTitle ogDescription ogImage,Missing social preview,"useSeoMeta({ ogImage: '/og.png', twitterCard: 'summary_large_image' })",No OG configuration,Medium,https://nuxt.com/docs/api/composables/use-seo-meta
35
- 34,Middleware,Use defineNuxtRouteMiddleware,Define route middleware properly,defineNuxtRouteMiddleware wrapper,export default function,"export default defineNuxtRouteMiddleware((to, from) => {})","export default function(to, from) {}",High,https://nuxt.com/docs/guide/directory-structure/middleware
36
- 35,Middleware,Use navigateTo for redirects,Redirect in middleware with navigateTo,return navigateTo('/login'),router.push in middleware,"if (!auth) return navigateTo('/login')","if (!auth) router.push('/login')",High,https://nuxt.com/docs/api/utils/navigate-to
37
- 36,Middleware,Reference middleware in definePageMeta,Apply middleware to specific pages,middleware array in definePageMeta,Global middleware for page-specific,definePageMeta({ middleware: ['auth'] }),Global auth check for one page,Medium,https://nuxt.com/docs/guide/directory-structure/middleware
38
- 37,Middleware,Use .global suffix for global middleware,Apply middleware to all routes,auth.global.ts for app-wide auth,Manual middleware on every page,middleware/auth.global.ts,middleware: ['auth'] on every page,Medium,https://nuxt.com/docs/guide/directory-structure/middleware
39
- 38,ErrorHandling,Use createError for errors,Create errors with proper status codes,createError with statusCode,throw new Error,"throw createError({ statusCode: 404, statusMessage: 'Not Found' })",throw new Error('Not Found'),High,https://nuxt.com/docs/api/utils/create-error
40
- 39,ErrorHandling,Use NuxtErrorBoundary for local errors,Handle errors within component subtree,NuxtErrorBoundary for component errors,Global error page for local errors,"<NuxtErrorBoundary @error=""log""><template #error=""{ error }"">",error.vue for component errors,Medium,https://nuxt.com/docs/getting-started/error-handling
41
- 40,ErrorHandling,Use clearError to recover from errors,Clear error state and optionally redirect,clearError({ redirect: '/' }),Manual error state reset,clearError({ redirect: '/home' }),error.value = null,Medium,https://nuxt.com/docs/api/utils/clear-error
42
- 41,ErrorHandling,Use short statusMessage,Keep statusMessage brief for security,Short generic messages,Detailed error info in statusMessage,"createError({ statusCode: 400, statusMessage: 'Bad Request' })","createError({ statusMessage: 'Invalid user ID: 123' })",High,https://nuxt.com/docs/getting-started/error-handling
43
- 42,Link,Use NuxtLink for internal navigation,Client-side navigation with prefetching,<NuxtLink to> for internal links,<a href> for internal links,<NuxtLink to="/about">About</NuxtLink>,<a href="/about">About</a>,High,https://nuxt.com/docs/api/components/nuxt-link
44
- 43,Link,Configure prefetch behavior,Control when prefetching occurs,prefetchOn for interaction-based,Default prefetch for low-priority,"<NuxtLink prefetch-on=""interaction"">",Always default prefetch,Low,https://nuxt.com/docs/api/components/nuxt-link
45
- 44,Link,Use useRouter for programmatic navigation,Navigate programmatically,useRouter().push() for navigation,Direct window.location,"const router = useRouter(); router.push('/dashboard')",window.location.href = '/dashboard',Medium,https://nuxt.com/docs/api/composables/use-router
46
- 45,Link,Use navigateTo in composables,Navigate outside components,navigateTo() in middleware or plugins,useRouter in non-component code,return navigateTo('/login'),router.push in middleware,Medium,https://nuxt.com/docs/api/utils/navigate-to
47
- 46,AutoImports,Leverage auto-imports,Use auto-imported composables directly,Direct use of ref computed useFetch,Manual imports for Nuxt composables,"const count = ref(0)","import { ref } from 'vue'; const count = ref(0)",Medium,https://nuxt.com/docs/guide/concepts/auto-imports
48
- 47,AutoImports,Use #imports for explicit imports,Explicit imports when needed,#imports for clarity or disabled auto-imports,"import from 'vue' when auto-import enabled","import { ref } from '#imports'","import { ref } from 'vue'",Low,https://nuxt.com/docs/guide/concepts/auto-imports
49
- 48,AutoImports,Configure third-party auto-imports,Add external package auto-imports,imports.presets in nuxt.config,Manual imports everywhere,"imports: { presets: [{ from: 'vue-i18n', imports: ['useI18n'] }] }",import { useI18n } everywhere,Low,https://nuxt.com/docs/guide/concepts/auto-imports
50
- 49,Plugins,Use defineNuxtPlugin,Define plugins properly,defineNuxtPlugin wrapper,export default function,"export default defineNuxtPlugin((nuxtApp) => {})","export default function(ctx) {}",High,https://nuxt.com/docs/guide/directory-structure/plugins
51
- 50,Plugins,Use provide for injection,Provide helpers across app,return { provide: {} } for type safety,nuxtApp.provide without types,"return { provide: { hello: (name) => `Hello ${name}!` } }","nuxtApp.provide('hello', fn)",Medium,https://nuxt.com/docs/guide/directory-structure/plugins
52
- 51,Plugins,Use .client or .server suffix,Control plugin execution environment,plugin.client.ts for client-only,if (process.client) checks,analytics.client.ts,"if (process.client) { // analytics }",Medium,https://nuxt.com/docs/guide/directory-structure/plugins
53
- 52,Environment,Use runtimeConfig for env vars,Access environment variables safely,runtimeConfig in nuxt.config,process.env directly,"runtimeConfig: { apiSecret: '', public: { apiBase: '' } }",process.env.API_SECRET in components,High,https://nuxt.com/docs/guide/going-further/runtime-config
54
- 53,Environment,Use NUXT_ prefix for env override,Override config with environment variables,NUXT_API_SECRET NUXT_PUBLIC_API_BASE,Custom env var names,NUXT_PUBLIC_API_BASE=https://api.example.com,API_BASE=https://api.example.com,High,https://nuxt.com/docs/guide/going-further/runtime-config
55
- 54,Environment,Access public config with useRuntimeConfig,Get public config in components,useRuntimeConfig().public,Direct process.env access,const config = useRuntimeConfig(); config.public.apiBase,process.env.NUXT_PUBLIC_API_BASE,High,https://nuxt.com/docs/api/composables/use-runtime-config
56
- 55,Environment,Keep secrets in private config,Server-only secrets in runtimeConfig root,runtimeConfig.apiSecret (server only),Secrets in public config,runtimeConfig: { dbPassword: '' },runtimeConfig: { public: { dbPassword: '' } },High,https://nuxt.com/docs/guide/going-further/runtime-config
57
- 56,Performance,Use Lazy prefix for code splitting,Lazy load components with Lazy prefix,<LazyComponent> for below-fold,Eager load all components,<LazyMountainsList v-if="show"/>,<MountainsList/> for hidden content,Medium,https://nuxt.com/docs/guide/directory-structure/components
58
- 57,Performance,Use useLazyFetch for non-blocking data,Alias for useFetch with lazy: true,useLazyFetch for secondary data,useFetch for all requests,"const { data } = useLazyFetch('/api/comments')",await useFetch for comments section,Medium,https://nuxt.com/docs/api/composables/use-lazy-fetch
59
- 58,Performance,Use lazy hydration for interactivity,Delay component hydration until needed,LazyComponent with hydration strategy,Immediate hydration for all,<LazyModal hydrate-on-visible/>,<Modal/> in footer,Low,https://nuxt.com/docs/guide/going-further/experimental-features
1
+ No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL,Applies To,Status,Verified At
2
+ 1,Routing,Use file-based routing,Create routes under the Nuxt 4 app pages directory,app/pages with index.vue,Configure ordinary routes manually,app/pages/dashboard/index.vue,Custom router setup,Medium,https://nuxt.com/docs/4.x/getting-started/routing,nuxtjs 4.5,active,2026-08-13
3
+ 2,Routing,Use dynamic route parameters,Create dynamic routes with bracket syntax under app/pages,[id].vue for dynamic params,Hardcode routes for dynamic content,app/pages/posts/[id].vue,app/pages/posts/post1.vue,Medium,https://nuxt.com/docs/4.x/getting-started/routing,nuxtjs 4.5,active,2026-08-13
4
+ 3,Routing,Use catch-all routes,Handle multiple path segments with [...slug] under app/pages,[...slug].vue for catch-all,Multiply nested dynamic files unnecessarily,app/pages/[...slug].vue,app/pages/[a]/[b]/[c].vue,Low,https://nuxt.com/docs/4.x/getting-started/routing,nuxtjs 4.5,active,2026-08-13
5
+ 4,Routing,Define page metadata with definePageMeta,Set page-level configuration and middleware,definePageMeta for layout middleware title,Manual route meta configuration,"definePageMeta({ layout: 'admin', middleware: 'auth' })",router.beforeEach for page config,High,https://nuxt.com/docs/4.x/api/utils/define-page-meta,nuxtjs 4.5,active,2026-08-13
6
+ 5,Routing,Use validate for route params,Validate dynamic route parameters before rendering,validate function in definePageMeta,Manual validation in setup,definePageMeta({ validate: (route) => /^\d+$/.test(route.params.id) }),if (!valid) navigateTo('/404'),Medium,https://nuxt.com/docs/4.x/api/utils/define-page-meta,nuxtjs 4.5,active,2026-08-13
7
+ 6,Rendering,Use SSR by default,Server-side rendering is enabled by default,Keep ssr: true (default),Disable SSR unnecessarily,ssr: true (default),ssr: false for all pages,High,https://nuxt.com/docs/4.x/guide/concepts/rendering,nuxtjs 4.5,active,2026-08-13
8
+ 7,Rendering,Use .client suffix for client-only components,Mark components to render only on client,ComponentName.client.vue suffix,v-if with process.client check,Comments.client.vue,"<div v-if=""process.client""><Comments/></div>",Medium,https://nuxt.com/docs/4.x/guide/directory-structure/components,nuxtjs 4.5,active,2026-08-13
9
+ 8,Rendering,Use .server suffix for server-only components,Mark components to render only on server,ComponentName.server.vue suffix,Manual server check,HeavyMarkdown.server.vue,"v-if=""process.server""",Low,https://nuxt.com/docs/4.x/guide/directory-structure/components,nuxtjs 4.5,active,2026-08-13
10
+ 9,DataFetching,Use useFetch for simple data fetching,Wrapper around useAsyncData for URL fetching,useFetch for API calls,$fetch in onMounted,const { data } = await useFetch('/api/posts'),onMounted(async () => { data.value = await $fetch('/api/posts') }),High,https://nuxt.com/docs/4.x/api/composables/use-fetch,nuxtjs 4.5,active,2026-08-13
11
+ 10,DataFetching,Use useAsyncData for complex fetching,Fine-grained control over async data,useAsyncData for CMS or custom fetching,useFetch for non-URL data sources,"const { data } = await useAsyncData('posts', () => cms.getPosts())",const { data } = await useFetch(() => cms.getPosts()),Medium,https://nuxt.com/docs/4.x/api/composables/use-async-data,nuxtjs 4.5,active,2026-08-13
12
+ 11,DataFetching,Use $fetch for non-reactive requests,$fetch for event handlers and non-component code,$fetch in event handlers or server routes,useFetch in click handlers,"async function submit() { await $fetch('/api/submit', { method: 'POST' }) }",async function submit() { await useFetch('/api/submit') },High,https://nuxt.com/docs/4.x/api/utils/dollarfetch,nuxtjs 4.5,active,2026-08-13
13
+ 12,DataFetching,Use lazy option for non-blocking fetch,Defer data fetching for better initial load,lazy: true for below-fold content,Blocking fetch for non-critical data,"useFetch('/api/comments', { lazy: true })",await useFetch('/api/comments') for footer,Medium,https://nuxt.com/docs/4.x/api/composables/use-fetch,nuxtjs 4.5,active,2026-08-13
14
+ 13,DataFetching,Use server option intentionally,Use server:false only when data depends on browser-only state,server:false for localStorage or browser APIs,Disable SSR merely because data is user-specific,"useFetch('/api/preferences', { server: false }) for browser-only input",server:false for any authenticated request,Medium,https://nuxt.com/docs/4.x/api/composables/use-fetch,nuxtjs 4.5,active,2026-08-13
15
+ 14,DataFetching,Use pick to reduce payload size,Select only needed fields from response,pick option for large responses,Fetching entire objects when few fields needed,"useFetch('/api/user', { pick: ['id', 'name'] })",useFetch('/api/user') then destructure,Low,https://nuxt.com/docs/4.x/api/composables/use-fetch,nuxtjs 4.5,active,2026-08-13
16
+ 15,DataFetching,Use transform for data manipulation,Transform data before storing in state,transform option for data shaping,Manual transformation after fetch,"useFetch('/api/posts', { transform: (posts) => posts.map(p => p.title) })",const titles = data.value.map(p => p.title),Low,https://nuxt.com/docs/4.x/api/composables/use-fetch,nuxtjs 4.5,active,2026-08-13
17
+ 16,DataFetching,Handle loading and error states,Always handle pending and error states,Check status pending error refs,Ignoring loading states,"<div v-if=""status === 'pending'"">Loading...</div>",No loading indicator,High,https://nuxt.com/docs/4.x/getting-started/data-fetching,nuxtjs 4.5,active,2026-08-13
18
+ 17,Lifecycle,Avoid side effects in script setup root,Move side effects to lifecycle hooks,Side effects in onMounted,setInterval in root script setup,onMounted(() => { interval = setInterval(...) }),<script setup>setInterval(...)</script>,High,https://nuxt.com/docs/4.x/guide/concepts/nuxt-lifecycle,nuxtjs 4.5,active,2026-08-13
19
+ 18,Lifecycle,Use onMounted for DOM access,Access DOM only after component is mounted,onMounted for DOM manipulation,Direct DOM access in setup,onMounted(() => { document.getElementById('el') }),<script setup>document.getElementById('el')</script>,High,https://nuxt.com/docs/4.x/api/composables/on-mounted,nuxtjs 4.5,active,2026-08-13
20
+ 19,Lifecycle,Use nextTick for post-render access,Wait for DOM updates before accessing elements,await nextTick() after state changes,Immediate DOM access after state change,count.value++; await nextTick(); el.value.focus(),count.value++; el.value.focus(),Medium,https://nuxt.com/docs/4.x/api/utils/next-tick,nuxtjs 4.5,active,2026-08-13
21
+ 20,Lifecycle,Use onPrehydrate for pre-hydration logic,Run code before Nuxt hydrates the page,onPrehydrate for client setup,onMounted for hydration-critical code,onPrehydrate(() => { console.log(window) }),onMounted for pre-hydration needs,Low,https://nuxt.com/docs/4.x/api/composables/on-prehydrate,nuxtjs 4.5,active,2026-08-13
22
+ 21,Server,Use server/api for API routes,Create API endpoints in server/api directory,server/api/users.ts for /api/users,Manual Express setup,server/api/hello.ts -> /api/hello,app.get('/api/hello'),High,https://nuxt.com/docs/4.x/guide/directory-structure/server,nuxtjs 4.5,active,2026-08-13
23
+ 22,Server,Use defineEventHandler for handlers,Define server route handlers,defineEventHandler for all handlers,export default function,export default defineEventHandler((event) => { return { hello: 'world' } }),"export default function(req, res) {}",High,https://nuxt.com/docs/4.x/guide/directory-structure/server,nuxtjs 4.5,active,2026-08-13
24
+ 23,Server,Use server/routes for non-api routes,Routes without /api prefix,server/routes for custom paths,server/api for non-api routes,server/routes/sitemap.xml.ts,server/api/sitemap.xml.ts,Medium,https://nuxt.com/docs/4.x/guide/directory-structure/server,nuxtjs 4.5,active,2026-08-13
25
+ 24,Server,Use getQuery and readBody for input,Access query params and request body,getQuery(event) readBody(event),Direct event access,const { id } = getQuery(event),event.node.req.query,Medium,https://nuxt.com/docs/4.x/guide/directory-structure/server,nuxtjs 4.5,active,2026-08-13
26
+ 25,Server,Validate server input,Always validate input in server handlers,Zod or similar for validation,Trust client input,const body = await readBody(event); schema.parse(body),const body = await readBody(event),High,https://nuxt.com/docs/4.x/guide/directory-structure/server,nuxtjs 4.5,active,2026-08-13
27
+ 26,State,Use useState for serializable shared state,Share SSR-safe values whose contents can be serialized,useState for JSON-serializable cross-component state,Store classes functions or symbols,"const count = useState('count', () => 0)",useState('service' () => new Service()),High,https://nuxt.com/docs/4.x/api/composables/use-state,nuxtjs 4.5,active,2026-08-13
28
+ 27,State,Use unique keys for useState,Prevent state conflicts with unique keys,Descriptive unique keys for each state,Generic or duplicate keys,"useState('user-preferences', () => ({}))",useState('data') in multiple places,Medium,https://nuxt.com/docs/4.x/api/composables/use-state,nuxtjs 4.5,active,2026-08-13
29
+ 28,State,Use Pinia for complex state,Pinia for advanced state management,@pinia/nuxt for complex apps,Custom state management,useMainStore() with Pinia,Custom reactive store implementation,Medium,https://nuxt.com/docs/4.x/getting-started/state-management,nuxtjs 4.5,active,2026-08-13
30
+ 29,State,Use callOnce for one-time async operations,Ensure async operations run only once,callOnce for store initialization,Direct await in component,await callOnce(store.fetch),await store.fetch() on every render,Medium,https://nuxt.com/docs/4.x/api/utils/call-once,nuxtjs 4.5,active,2026-08-13
31
+ 30,SEO,Use useSeoMeta for SEO tags,Type-safe SEO meta tag management,useSeoMeta for meta tags,useHead for simple meta,"useSeoMeta({ title: 'Home', ogTitle: 'Home', description: '...' })","useHead({ meta: [{ name: 'description', content: '...' }] })",High,https://nuxt.com/docs/4.x/api/composables/use-seo-meta,nuxtjs 4.5,active,2026-08-13
32
+ 31,SEO,Use reactive values in useSeoMeta,Dynamic SEO tags with refs or getters,Computed getters for dynamic values,Static values for dynamic content,useSeoMeta({ title: () => post.value.title }),useSeoMeta({ title: post.value.title }),Medium,https://nuxt.com/docs/4.x/api/composables/use-seo-meta,nuxtjs 4.5,active,2026-08-13
33
+ 32,SEO,Use useHead for non-meta head elements,Scripts styles links in head,useHead for scripts and links,useSeoMeta for scripts,useHead({ script: [{ src: '/analytics.js' }] }),useSeoMeta({ script: '...' }),Medium,https://nuxt.com/docs/4.x/api/composables/use-head,nuxtjs 4.5,active,2026-08-13
34
+ 33,SEO,Include OpenGraph tags,Add OG tags for social sharing,ogTitle ogDescription ogImage,Missing social preview,"useSeoMeta({ ogImage: '/og.png', twitterCard: 'summary_large_image' })",No OG configuration,Medium,https://nuxt.com/docs/4.x/api/composables/use-seo-meta,nuxtjs 4.5,active,2026-08-13
35
+ 34,Middleware,Use defineNuxtRouteMiddleware,Define route middleware under app/middleware,defineNuxtRouteMiddleware wrapper in app/middleware,Put route middleware in server/middleware,"export default defineNuxtRouteMiddleware((to, from) => {})","export default function(to, from) {}",High,https://nuxt.com/docs/4.x/guide/directory-structure/app/middleware,nuxtjs 4.5,active,2026-08-13
36
+ 35,Middleware,Use navigateTo for redirects,Redirect in middleware with navigateTo,return navigateTo('/login'),router.push in middleware,if (!auth) return navigateTo('/login'),if (!auth) router.push('/login'),High,https://nuxt.com/docs/4.x/api/utils/navigate-to,nuxtjs 4.5,active,2026-08-13
37
+ 36,Middleware,Reference middleware in definePageMeta,Apply app/middleware entries to specific pages,middleware array in definePageMeta,Use global middleware for a page-specific concern,definePageMeta({ middleware: ['auth'] }),Global auth check for one page,Medium,https://nuxt.com/docs/4.x/guide/directory-structure/app/middleware,nuxtjs 4.5,active,2026-08-13
38
+ 37,Middleware,Use .global suffix for global middleware,Apply named route middleware globally with .global and keep it idempotent because initial SSR middleware can run again during hydration,app/middleware/auth.global.ts with repeat-safe logic,Assume it runs exactly once,app/middleware/auth.global.ts,Increment state unconditionally on every middleware run,Medium,https://nuxt.com/docs/4.x/guide/directory-structure/app/middleware,nuxtjs 4.5,active,2026-08-13
39
+ 38,ErrorHandling,Use createError for errors,Create errors with proper status codes,createError with statusCode,throw new Error,"throw createError({ statusCode: 404, statusMessage: 'Not Found' })",throw new Error('Not Found'),High,https://nuxt.com/docs/4.x/api/utils/create-error,nuxtjs 4.5,active,2026-08-13
40
+ 39,ErrorHandling,Use NuxtErrorBoundary for local errors,Handle errors within component subtree,NuxtErrorBoundary for component errors,Global error page for local errors,"<NuxtErrorBoundary @error=""log""><template #error=""{ error }"">",error.vue for component errors,Medium,https://nuxt.com/docs/4.x/getting-started/error-handling,nuxtjs 4.5,active,2026-08-13
41
+ 40,ErrorHandling,Use clearError to recover from errors,Clear error state and optionally redirect,clearError({ redirect: '/' }),Manual error state reset,clearError({ redirect: '/home' }),error.value = null,Medium,https://nuxt.com/docs/4.x/api/utils/clear-error,nuxtjs 4.5,active,2026-08-13
42
+ 41,ErrorHandling,Use short statusMessage,Keep statusMessage brief for security,Short generic messages,Detailed error info in statusMessage,"createError({ statusCode: 400, statusMessage: 'Bad Request' })",createError({ statusMessage: 'Invalid user ID: 123' }),High,https://nuxt.com/docs/4.x/getting-started/error-handling,nuxtjs 4.5,active,2026-08-13
43
+ 42,Link,Use NuxtLink for internal navigation,Client-side navigation with prefetching,<NuxtLink to> for internal links,<a href> for internal links,"<NuxtLink to=""/about"">About</NuxtLink>","<a href=""/about"">About</a>",High,https://nuxt.com/docs/4.x/api/components/nuxt-link,nuxtjs 4.5,active,2026-08-13
44
+ 43,Link,Configure prefetch behavior,Control when prefetching occurs,prefetchOn for interaction-based,Default prefetch for low-priority,"<NuxtLink prefetch-on=""interaction"">",Always default prefetch,Low,https://nuxt.com/docs/4.x/api/components/nuxt-link,nuxtjs 4.5,active,2026-08-13
45
+ 44,Link,Use useRouter for programmatic navigation,Navigate programmatically,useRouter().push() for navigation,Direct window.location,const router = useRouter(); router.push('/dashboard'),window.location.href = '/dashboard',Medium,https://nuxt.com/docs/4.x/api/composables/use-router,nuxtjs 4.5,active,2026-08-13
46
+ 45,Link,Use navigateTo in composables,Navigate outside components,navigateTo() in middleware or plugins,useRouter in non-component code,return navigateTo('/login'),router.push in middleware,Medium,https://nuxt.com/docs/4.x/api/utils/navigate-to,nuxtjs 4.5,active,2026-08-13
47
+ 46,AutoImports,Use Nuxt auto-imports intentionally,Use auto-imported Nuxt composables and Vue APIs or explicit imports consistently,Direct use of useFetch and ref where auto-imports are enabled,Treat valid explicit Vue imports as an error,const count = ref(0),Mix unresolved globals after disabling imports,Medium,https://nuxt.com/docs/4.x/guide/concepts/auto-imports,nuxtjs 4.5,active,2026-08-13
48
+ 47,AutoImports,Use #imports for explicit Nuxt imports,Import Nuxt-provided composables from #imports when an explicit import is useful,import useRuntimeConfig from #imports,Import Nuxt virtual composables from arbitrary package paths,import { useRuntimeConfig } from '#imports',import { useRuntimeConfig } from 'nuxt',Low,https://nuxt.com/docs/4.x/guide/concepts/auto-imports,nuxtjs 4.5,active,2026-08-13
49
+ 48,AutoImports,Configure third-party auto-imports,Add external package auto-imports,imports.presets in nuxt.config,Manual imports everywhere,"imports: { presets: [{ from: 'vue-i18n', imports: ['useI18n'] }] }",import { useI18n } everywhere,Low,https://nuxt.com/docs/4.x/guide/concepts/auto-imports,nuxtjs 4.5,active,2026-08-13
50
+ 49,Plugins,Use defineNuxtPlugin,Define plugins properly,defineNuxtPlugin wrapper,export default function,export default defineNuxtPlugin((nuxtApp) => {}),export default function(ctx) {},High,https://nuxt.com/docs/4.x/guide/directory-structure/plugins,nuxtjs 4.5,active,2026-08-13
51
+ 50,Plugins,Use provide for injection,Provide helpers across app,return { provide: {} } for type safety,nuxtApp.provide without types,return { provide: { hello: (name) => `Hello ${name}!` } },"nuxtApp.provide('hello', fn)",Medium,https://nuxt.com/docs/4.x/guide/directory-structure/plugins,nuxtjs 4.5,active,2026-08-13
52
+ 51,Plugins,Use .client or .server suffix,Control plugin execution environment,plugin.client.ts for client-only,if (process.client) checks,analytics.client.ts,if (process.client) { // analytics },Medium,https://nuxt.com/docs/4.x/guide/directory-structure/plugins,nuxtjs 4.5,active,2026-08-13
53
+ 52,Environment,Use runtimeConfig for env vars,Access environment variables safely,runtimeConfig in nuxt.config,process.env directly,"runtimeConfig: { apiSecret: '', public: { apiBase: '' } }",process.env.API_SECRET in components,High,https://nuxt.com/docs/4.x/guide/going-further/runtime-config,nuxtjs 4.5,active,2026-08-13
54
+ 53,Environment,Declare keys before NUXT_ overrides,Declare every runtimeConfig key in nuxt.config before overriding it with a matching NUXT_ environment variable,Declared apiSecret and public.apiBase keys plus NUXT_API_SECRET or NUXT_PUBLIC_API_BASE,Expect an undeclared environment variable to create config,NUXT_PUBLIC_API_BASE=https://api.example.com after declaring public.apiBase,API_BASE=https://api.example.com,High,https://nuxt.com/docs/4.x/guide/going-further/runtime-config,nuxtjs 4.5,active,2026-08-13
55
+ 54,Environment,Access public config with useRuntimeConfig,Get public config in components,useRuntimeConfig().public,Direct process.env access,const config = useRuntimeConfig(); config.public.apiBase,process.env.NUXT_PUBLIC_API_BASE,High,https://nuxt.com/docs/4.x/api/composables/use-runtime-config,nuxtjs 4.5,active,2026-08-13
56
+ 55,Environment,Keep secrets in private config,Server-only secrets in runtimeConfig root,runtimeConfig.apiSecret (server only),Secrets in public config,runtimeConfig: { dbPassword: '' },runtimeConfig: { public: { dbPassword: '' } },High,https://nuxt.com/docs/4.x/guide/going-further/runtime-config,nuxtjs 4.5,active,2026-08-13
57
+ 56,Performance,Use Lazy prefix for code splitting,Lazy load components with Lazy prefix,<LazyComponent> for below-fold,Eager load all components,"<LazyMountainsList v-if=""show""/>",<MountainsList/> for hidden content,Medium,https://nuxt.com/docs/4.x/guide/directory-structure/components,nuxtjs 4.5,active,2026-08-13
58
+ 57,Performance,Use useLazyFetch for non-blocking data,Alias for useFetch with lazy: true,useLazyFetch for secondary data,useFetch for all requests,const { data } = useLazyFetch('/api/comments'),await useFetch for comments section,Medium,https://nuxt.com/docs/4.x/api/composables/use-lazy-fetch,nuxtjs 4.5,active,2026-08-13
59
+ 58,Performance,Use lazy hydration for interactivity,Delay component hydration until needed,LazyComponent with hydration strategy,Immediate hydration for all,<LazyModal hydrate-on-visible/>,<Modal/> in footer,Low,https://nuxt.com/docs/4.x/guide/going-further/experimental-features,nuxtjs 4.5,active,2026-08-13
60
+ 59,DataFetching,Use enabled for conditional async data,Gate execution reactively with the enabled option instead of branching around the composable,"enabled: computed(() => Boolean(userId.value))",Call useFetch conditionally after setup,"useFetch('/api/user', { enabled: () => Boolean(userId.value) })",if (userId.value) await useFetch('/api/user'),Medium,https://nuxt.com/docs/4.x/api/composables/use-async-data,nuxtjs 4.5,active,2026-08-13
61
+ 60,DataFetching,Keep async-data handlers pure,Keep useAsyncData handlers side-effect free and use stable explicit keys,Return a value from a pure handler with consistent options,Mutate shared state or vary options for one key,"useAsyncData('posts', () => $fetch('/api/posts'))","useAsyncData('posts', async () => { store.count++; })",High,https://nuxt.com/docs/4.x/api/composables/use-async-data,nuxtjs 4.5,active,2026-08-13
62
+ 61,DataFetching,Respect SSR request boundaries,Use relative useFetch URLs to proxy safe request headers and cookies; forward only an explicit allowlist to external origins,useFetch for an internal relative URL,Assume raw $fetch forwards request context or forward every incoming header,const { data } = await useFetch('/api/profile'),"$fetch(externalUrl, { headers: useRequestHeaders() })",High,https://nuxt.com/docs/4.x/api/utils/dollarfetch,nuxtjs 4.5,active,2026-08-13
63
+ 62,State,Use useCookie for SSR-safe cookies,Read and write cookies through the SSR-aware useCookie ref with explicit security options,useCookie with sameSite secure and httpOnly where server-only,Read document.cookie during SSR,"useCookie('session', { sameSite: 'lax', secure: true })",document.cookie,High,https://nuxt.com/docs/4.x/api/composables/use-cookie,nuxtjs 4.5,active,2026-08-13
64
+ 63,Rendering,Use routeRules for per-route rendering,Configure prerender SSR SPA redirects headers or cache behavior per route in nuxt.config,routeRules with explicit path patterns,Scatter rendering decisions through components,"routeRules: { '/blog/**': { isr: 3600 } }",process.client checks for route rendering,High,https://nuxt.com/docs/4.x/guide/concepts/rendering#route-rules,nuxtjs 4.5,active,2026-08-13
65
+ 64,Configuration,Separate app config from runtime config,Use app.config for public reactive build-time app values and runtimeConfig for environment or secrets,defineAppConfig for theme and runtimeConfig for API secrets,Put secrets in app.config,"defineAppConfig({ theme: { primary: 'blue' } })","defineAppConfig({ apiSecret: process.env.API_SECRET })",High,https://nuxt.com/docs/4.x/guide/directory-structure/app/app-config,nuxtjs 4.5,active,2026-08-13
66
+ 65,State,Refresh externally changed cookies,Call refreshCookie when a cookie changes outside the useCookie ref,refreshCookie after an external auth refresh,Assume the ref observes every external change,await refreshCookie('session'),Keep stale session.value after external refresh,Medium,https://nuxt.com/docs/4.x/api/utils/refresh-cookie,nuxtjs 4.5,active,2026-08-13
67
+ 66,State,Replace shallow-watched cookie values,When cookie watch is shallow replace the top-level value to trigger serialization,Assign a new object or array,Mutate a nested property in place with watch:'shallow',"prefs.value = { ...prefs.value, theme: 'dark' }",prefs.value.theme = 'dark',Medium,https://nuxt.com/docs/4.x/api/composables/use-cookie,nuxtjs 4.5,active,2026-08-13
68
+ 67,Migration,Migrate Nuxt 3 before adding Nuxt 4 features,Nuxt 3 is end-of-life; use Nuxt 4 compatibility mode to surface directory app-config runtime-config and API changes,Enable compatibilityVersion 4 and resolve migration warnings,Keep an unmaintained Nuxt 3 app while adopting Nuxt 4-only guidance,"future: { compatibilityVersion: 4 }","// Nuxt 3 retained without an upgrade plan",High,https://nuxt.com/blog/v4-5,nuxtjs legacy 3.x,deprecated,2026-08-13