To ensure newly added components integrate seamlessly and are properly visualized within the application, all steps below are mandatory. The steps may be completed in any order; however, each step must be followed for a successful contribution.
Use playground.vue as a sandbox to validate components under development without modifying the production configuration.
Important: Avoid merging or pushing changes to
playground.vue, as it is intended solely for testing.
playground.vueBuild and validate your component’s functionality and styling in playground.vue before wiring it into the component hub.
headers, your component should be 6.vue).app/components/Elements/<Category>/N.vue..vue file:
primary-*, dark-* tokens).UButton, UContainer, UMarquee, etc.).<style> unless animation cannot be done with Tailwind (rare).<script setup> only when the demo needs interactivity (forms, carousels, lists)..md Metadata Filecontent/<category>/, create a Markdown file with the same number as the Vue file (e.g., 6.md for 6.vue)..md file.---
title: string # unique slug used in templates.ts and index.vue
description: string
dark: boolean # supports color mode
animated: boolean # uses motion or transitions
parent: string # category folder name, e.g. hero, logos
component: number # file number, e.g. 6 for 6.vue
preview: true
copied: false
---
The component hub reads live source from app/components/Elements/<Category>/N.vue for preview and copy-to-clipboard. The .md file is the metadata index for Nuxt Content.
types/templates.tsAdd the title slug to the appropriate union type:
export type LogosTemplates = "simple" | "animated" | "..." | "your-new-slug";
index.vueIn app/pages/components/<category>/index.vue:
item.title.types/templates.ts.<LazyElementsLogos6 v-if="item.title === ('your-new-slug' as LogosTemplates)" />
If the section background is bg-dark-50 dark:bg-dark-950, match the edge fade inline on each UMarquee (do not use shared utils):
<UMarquee
pause-on-hover
:ui="{
root: 'before:!from-dark-50 after:!from-dark-50 dark:before:!from-dark-950 dark:after:!from-dark-950',
}"
>
The ! prefix overrides Nuxt UI’s default from-default overlay color.
After completing these steps, verify that:
/components/<category>.app/components/Elements/<Category>/N.vue.dark-* / primary-* tokens, not white, black, or palette names like gray-*, blue-*).Following this process keeps each section self-contained and copy-paste ready while the hub handles discovery and documentation.