docs: add marketing pages (#3308)

Co-authored-by: Benjamin Canac <canacb1@gmail.com>
This commit is contained in:
Sébastien Chopin
2025-02-14 14:18:14 +01:00
committed by GitHub
parent d4bc9b3d0e
commit ba3ed86ae1
52 changed files with 1855 additions and 83 deletions

View File

@@ -1,5 +1,5 @@
<script setup lang="ts">
import { withoutTrailingSlash } from 'ufo'
// import { withoutTrailingSlash } from 'ufo'
import colors from 'tailwindcss/colors'
// import { debounce } from 'perfect-debounce'
@@ -22,32 +22,7 @@ const searchTerm = ref('')
// useTrackEvent('Search', { props: { query: `${query} - ${searchTerm.value?.commandPaletteRef.results.length} results` } })
// }, 500))
const links = computed(() => [{
label: 'Docs',
icon: 'i-lucide-square-play',
to: '/getting-started',
active: route.path.startsWith('/getting-started')
}, {
label: 'Components',
icon: 'i-lucide-square-code',
to: '/components',
active: route.path.startsWith('/components')
}, {
label: 'Roadmap',
icon: 'i-lucide-map',
to: '/roadmap'
}, {
label: 'Figma',
icon: 'i-lucide-figma',
to: 'https://www.figma.com/community/file/1288455405058138934',
target: '_blank'
}, {
label: 'Releases',
icon: 'i-lucide-rocket',
to: 'https://github.com/nuxt/ui/releases',
target: '_blank'
}].filter(Boolean))
const links = useLinks()
const color = computed(() => colorMode.value === 'dark' ? (colors as any)[appConfig.ui.colors.neutral][900] : 'white')
const radius = computed(() => `:root { --ui-radius: ${appConfig.theme.radius}rem; }`)
const blackAsPrimary = computed(() => appConfig.theme.blackAsPrimary ? `:root { --ui-primary: black; } .dark { --ui-primary: white; }` : ':root {}')
@@ -58,8 +33,8 @@ useHead({
{ key: 'theme-color', name: 'theme-color', content: color }
],
link: [
{ rel: 'icon', type: 'image/svg+xml', href: '/icon.svg' },
{ rel: 'canonical', href: `https://ui.nuxt.com${withoutTrailingSlash(route.path)}` }
{ rel: 'icon', type: 'image/svg+xml', href: '/icon.svg' }
// { rel: 'canonical', href: `https://ui.nuxt.com${withoutTrailingSlash(route.path)}` }
],
style: [
{ innerHTML: radius, id: 'nuxt-ui-radius', tagPriority: -2 },
@@ -83,7 +58,7 @@ provide('navigation', mappedNavigation)
<template>
<UApp :toaster="appConfig.toaster">
<NuxtLoadingIndicator color="#FFF" />
<NuxtLoadingIndicator color="var(--ui-primary)" :height="2" />
<template v-if="!route.path.startsWith('/examples')">
<!-- <Banner /> -->
@@ -96,7 +71,7 @@ provide('navigation', mappedNavigation)
</NuxtLayout>
<template v-if="!route.path.startsWith('/examples')">
<!-- <Footer /> -->
<Footer />
<ClientOnly>
<LazyUContentSearch

View File

@@ -1,21 +1,18 @@
<script setup lang="ts">
const route = useRoute()
// const items = [{
// label: 'Figma Kit',
// to: 'https://www.figma.com/community/file/1288455405058138934',
// target: '_blank'
// }, {
// label: 'Playground',
// to: 'https://stackblitz.com/edit/nuxt-ui',
// target: '_blank'
// }, {
// label: 'Roadmap',
// to: '/roadmap'
// }, {
// label: 'Releases',
// to: '/releases'
// }]
const links = [{
label: 'Figma',
to: '/figma'
}, {
label: 'Roadmap',
to: '/roadmap'
}, {
label: 'Terms',
to: '/pro/terms'
}, {
label: 'Releases',
to: 'https://github.com/nuxt/ui/releases',
target: '_blank'
}]
</script>
<template>
@@ -23,15 +20,12 @@ const route = useRoute()
<UFooter>
<template #left>
<NuxtLink v-if="route.path.startsWith('/pro')" to="https://ui.nuxt.com/pro/purchase" target="_blank" class="text-sm text-(--ui-text-muted)">
Purchase <span class="text-(--ui-text-highlighted)">Nuxt UI Pro</span>
</NuxtLink>
<NuxtLink v-else to="https://github.com/nuxt/ui" target="_blank" class="text-sm text-(--ui-text-muted)">
<NuxtLink to="https://github.com/nuxt/ui" target="_blank" class="text-sm text-(--ui-text-muted)">
Published under <span class="text-(--ui-text-highlighted)">MIT License</span>
</NuxtLink>
</template>
<!-- <UNavigationMenu :items="items" variant="link" color="neutral" /> -->
<UNavigationMenu :items="links" variant="link" color="neutral" />
<template #right>
<UButton
@@ -41,6 +35,7 @@ const route = useRoute()
target="_blank"
color="neutral"
variant="ghost"
size="sm"
/>
<UButton
aria-label="Nuxt UI on Discord"
@@ -49,6 +44,7 @@ const route = useRoute()
target="_blank"
color="neutral"
variant="ghost"
size="sm"
/>
<UButton
aria-label="Nuxt on X"
@@ -57,6 +53,16 @@ const route = useRoute()
target="_blank"
color="neutral"
variant="ghost"
size="sm"
/>
<UButton
aria-label="Nuxt on BlueSky"
icon="i-simple-icons-bluesky"
to="https://bsky.app/profile/nuxt.com"
target="_blank"
color="neutral"
variant="ghost"
size="sm"
/>
<UButton
aria-label="Nuxt UI on GitHub"
@@ -65,6 +71,7 @@ const route = useRoute()
target="_blank"
color="neutral"
variant="ghost"
size="sm"
/>
</template>
</UFooter>

View File

@@ -0,0 +1,28 @@
<template>
<div class="relative">
<UPageCard
variant="subtle"
class="rounded-[calc(var(--ui-radius)*6)]"
>
<video
class="rounded-[calc(var(--ui-radius)*2)]"
preload="none"
poster="https://res.cloudinary.com/nuxt/video/upload/so_3.3/v1708511800/ui-pro/video-nuxt-ui-pro_kwfbdh.jpg"
:controls="true"
>
<source
src="https://res.cloudinary.com/nuxt/video/upload/v1708511800/ui-pro/video-nuxt-ui-pro_kwfbdh.webm"
type="video/webm"
>
<source
src="https://res.cloudinary.com/nuxt/video/upload/v1708511800/ui-pro/video-nuxt-ui-pro_kwfbdh.mp4"
type="video/mp4"
>
<source
src="https://res.cloudinary.com/nuxt/video/upload/v1708511800/ui-pro/video-nuxt-ui-pro_kwfbdh.ogg"
type="video/ogg"
>
</video>
</UPageCard>
</div>
</template>

File diff suppressed because one or more lines are too long

View File

@@ -42,7 +42,8 @@ const radius = computed({
const modes = [
{ label: 'light', icon: appConfig.ui.icons.light },
{ label: 'dark', icon: appConfig.ui.icons.dark }
{ label: 'dark', icon: appConfig.ui.icons.dark },
{ label: 'system', icon: appConfig.ui.icons.system }
]
const mode = computed({
get() {
@@ -144,7 +145,7 @@ function setBlackAsPrimary(value: boolean) {
v-for="m in modes"
:key="m.label"
v-bind="m"
:selected="mode === m.label"
:selected="colorMode.preference === m.label"
@click="mode = m.label"
/>
</div>

View File

@@ -0,0 +1,56 @@
export function useLinks() {
const route = useRoute()
return computed(() => [{
label: 'Docs',
icon: 'i-lucide-square-play',
to: '/getting-started',
active: route.path.startsWith('/getting-started')
}, {
label: 'Components',
icon: 'i-lucide-square-code',
to: '/components',
active: route.path.startsWith('/components')
}, {
label: 'Pro',
icon: 'i-lucide-panels-top-left',
to: '/pro',
active: route.path.startsWith('/pro'),
orientation: 'vertical',
children: [{
icon: 'i-lucide-sparkles',
label: 'Features',
description: 'A collection of premium Vue components.',
to: '/pro'
}, {
icon: 'i-lucide-credit-card',
label: 'Pricing',
description: 'Free in development, buy when ready to launch.',
to: '/pro/pricing',
active: route.path.startsWith('/pro/pricing')
}, {
icon: 'i-lucide-panels-top-left',
label: 'Templates',
description: 'Official templates made with Nuxt UI Pro.',
to: '/pro/templates'
}, {
icon: 'i-lucide-circle-check',
label: 'Activate',
description: 'Enable Nuxt UI Pro in your production projects.',
to: '/pro/activate'
}]
}, {
label: 'Figma',
icon: 'i-lucide-figma',
to: '/figma'
}, {
label: 'Roadmap',
icon: 'i-lucide-map',
to: '/roadmap'
}, {
label: 'Releases',
icon: 'i-lucide-rocket',
to: 'https://github.com/nuxt/ui/releases',
target: '_blank'
}].filter(Boolean))
}

View File

@@ -7,7 +7,6 @@ const props = defineProps<{
error: NuxtError
}>()
const route = useRoute()
const appConfig = useAppConfig()
const colorMode = useColorMode()
@@ -26,32 +25,7 @@ const searchTerm = ref('')
// useTrackEvent('Search', { props: { query: `${query} - ${searchTerm.value?.commandPaletteRef.results.length} results` } })
// }, 500))
const links = computed(() => [{
label: 'Docs',
icon: 'i-lucide-square-play',
to: '/getting-started',
active: route.path.startsWith('/getting-started')
}, {
label: 'Components',
icon: 'i-lucide-square-code',
to: '/components',
active: route.path.startsWith('/components')
}, {
label: 'Roadmap',
icon: 'i-lucide-map',
to: '/roadmap'
}, {
label: 'Figma',
icon: 'i-lucide-figma',
to: 'https://www.figma.com/community/file/1288455405058138934',
target: '_blank'
}, {
label: 'Releases',
icon: 'i-lucide-rocket',
to: 'https://github.com/nuxt/ui/releases',
target: '_blank'
}].filter(Boolean))
const links = useLinks()
const color = computed(() => colorMode.value === 'dark' ? (colors as any)[appConfig.ui.colors.neutral][900] : 'white')
const radius = computed(() => `:root { --ui-radius: ${appConfig.theme.radius}rem; }`)
const blackAsPrimary = computed(() => appConfig.theme.blackAsPrimary ? `:root { --ui-primary: black; } .dark { --ui-primary: white; }` : ':root {}')

View File

@@ -0,0 +1,292 @@
title: Nuxt UI Figma Design Kits
description: Bridge the gap between designers and developers using professional-grade components. The official Nuxt UI & Nuxt UI Pro design kits for Figma mirrors the development library for perfect consistency.
headline: Used and loved by 2,000 designers and teams.
hero:
title: From [Figma]{#figma} to [Nuxt]{#nuxt}, faster.
description: From wireframe to production in no time with the official Nuxt UI & Nuxt UI Pro design kits for Figma. Start free with the Nuxt UI Kit, or upgrade to Nuxt UI Pro for premium components, layouts, and enhanced design-to-code efficiency.
image: /figma/hero.png
links:
- label: Purchase Pro Kit
to: 'https://nuxt.lemonsqueezy.com/buy/17213c49-621b-4c2c-9478-3a50a099003d'
trailing-icon: i-lucide-arrow-right
target: _blank
- label: Free Figma Kit
to: 'https://go.nuxt.com/figma'
icon: i-logos-figma
color: neutral
variant: outline
target: _blank
features1:
features:
- title: Advanced Figma Features
description: Components, Local Variables, Auto Layout, Variants and more.
icon: i-logos-figma
- title: Instant Theming
description: Customize your design system instantly using local variables and tokens.
icon: i-lucide-swatch-book
- title: Two Powerful Design Kits
description: Start with essential components, or unlock Pro for complete blocks and templates.
icon: i-lucide-files
cta1:
title: Everything you need in a [single file]{class="text-(--ui-primary)"}.
description: Design and development in perfect sync with our [Free](https://www.figma.com/community/file/1288455405058138934/nuxt-ui-v3-official-design-kit-free) and Pro files. Developers can implement designs faster, while designers work with production-ready components.
section1:
title: Customize in a few clicks to fit your needs
description: Control your entire design system with Figma Variables. Update primitive tokens once and watch your changes spread across the entire system.
reverse: true
features:
- title: Style with color variables powered by Tailwind CSS colors
icon: i-simple-icons-tailwindcss
- title: Apply over 500+ local variables across your entire file
icon: i-lucide-layers-2
- title: Build with unified tokens for consistency
icon: i-lucide-bolt
tabs:
- label: Define your tokens
src: /pro/figma/local-variables.png
width: 656
height: 342
alt: Define local variables in the Nuxt UI Figma design kit
- label: Use them in your design
src: /pro/figma/local-variables-result.png
width: 656
height: 342
alt: Use color variables in the Nuxt UI Figma design kit
links:
- label: Preview UI Pro Design Kit
to: 'https://go.nuxt.com/figma-pro'
target: _blank
icon: i-logos-figma
color: neutral
variant: outline
section2:
title: One component, endless possibilities
description: Create unlimited variations through nested components and swappable instances. Every element is fully themeable with props and slots, giving you complete control.
features:
- title: Choose between 17K+ components and variants
icon: i-lucide-component
- title: Customize designs with swap instance
icon: i-lucide-square-dashed-mouse-pointer
- title: Switch between light and dark modes in one click
icon: i-lucide-moon
image:
src: /pro/figma/component.png
width: 656
height: 374
alt: A component in the Nuxt UI Figma design kit
links:
- label: Preview UI Pro Design Kit
to: 'https://go.nuxt.com/figma-pro'
target: _blank
icon: i-logos-figma
color: neutral
variant: outline
section3:
title: Perfect match with development
description: Our Figma kit perfectly matches Nuxt UI Pro components, ensuring complete alignment between design and development.
reverse: true
features:
- title: Match development standards using the same props and tokens
icon: i-lucide-square-code
- title: Access Nuxt UI components through direct links
icon: i-lucide-link
- title: Work together as design and dev teams share one component language
icon: i-lucide-handshake
image:
src: /pro/figma/nuxt-ui-figma-to-code.png
width: 656
height: 370
alt: A screenshot of Nuxt UI Code & Figma Kit
links:
- label: Preview UI Pro Design Kit
to: 'https://go.nuxt.com/figma-pro'
icon: i-logos-figma
color: neutral
variant: outline
target: _blank
features2:
features:
- title: Ready-to-use Templates
description: Production-ready templates for marketing sites, documentation, and more included.
icon: i-lucide-panels-top-left
- title: Well-Documented System
description: Complete guides for designers and developers to master your design system.
icon: i-lucide-book-open-text
- title: Icons Pack
description: Complete Lucide icon library included - 1500+ ready components.
icon: i-lucide-smile
section4:
title: Start designing now.
description: '**From download to deployment in simple steps.** :br Get instant access to production-ready components and start creating.'
links:
- label: Get access now
to: 'https://nuxt.lemonsqueezy.com/buy/17213c49-621b-4c2c-9478-3a50a099003d'
trailing-icon: i-lucide-arrow-right
- label: Preview UI Pro Design Kit
to: 'https://go.nuxt.com/figma-pro'
icon: i-logos-figma
color: neutral
variant: outline
target: _blank
steps:
- title: Download & Import
description: After purchasing, just extract the ZIP file and drag & drop it directly into Figma.
image:
src: /pro/figma/step-1.png
alt: Import the Nuxt UI Pro Figma design kit
width: 314
height: 230
- title: Customize to your brand
description: Set your colors, typography, and styles to match your brand identity in minutes.
image:
src: /pro/figma/step-2.png
alt: Customize the Nuxt UI Pro Figma design kit
width: 314
height: 230
- title: Design your website
description: Design beautiful interfaces with production-ready components. Drag, drop, and customize.
image:
src: /pro/figma/step-3.png
alt: Design your website with the Nuxt UI Pro Figma design kit
width: 314
height: 230
- title: Share it with your developers
description: Perfect development handoff with components that match Nuxt UI's structure exactly.
image:
src: /pro/figma/step-4.png
alt: Share it with your developers with the Nuxt UI Pro Figma design kit
width: 314
height: 230
pricing:
title: Pricing plan that scale with you.
description: Start for free with Nuxt UI components, or unlock the complete Nuxt UI Pro design kit with a one-time purchase.
plans:
- title: Free Design Kit
description: Start with all Nuxt UI components and tokens.
price: FREE
features:
- '**Nuxt UI only components**'
- 40+ fully customizable components
- Figma Local Variables for colors, typography, and effects
- Light and Dark mode ready
- Lucide icons (1500+ icons) integration
- Regular updates
button:
label: Open in Figma
icon: i-logos-figma
to: https://go.nuxt.com/figma
color: neutral
terms: Used by 17,000+ designers.
- title: Solo License
description: Design faster with all Nuxt UI Pro components.
price: $149
billing_period: one-time payment
billing_cycle: plus local taxes
class: bg-(--ui-bg-elevated)/50
features:
- '**1 Designer**'
- Nuxt UI & Nuxt UI Pro Components
- 'Templates: Landing, Documentation, etc'
- Quick Start with Step-by-step Guides
- Use on Unlimited Projects
- Lifetime Free Updates
button:
label: Buy now
to: https://nuxt.lemonsqueezy.com/buy/17213c49-621b-4c2c-9478-3a50a099003d
extraButton:
label: Preview in Figma
to: 'https://go.nuxt.com/figma-pro'
target: _blank
icon: i-logos-figma
- title: Team License
description: Everything you need to deliver faster as a team.
price: $349
billing_period: one-time payment
billing_cycle: plus local taxes
class: bg-(--ui-bg-elevated)/50
features:
- '**Up to 20 Designers**'
- Nuxt UI & Nuxt UI Pro Components
- 'Templates: Landing, Documentation, etc'
- Step-by-step guides to help you start
- Use on unlimited projects
- Lifetime free updates
button:
label: Buy now
to: https://nuxt.lemonsqueezy.com/buy/2979099c-b7a0-4ba1-90e0-a0d60509b92d
extraButton:
label: Preview in Figma
to: 'https://go.nuxt.com/figma-pro'
target: _blank
icon: i-logos-figma
customers:
title: Used by 2,000+ developers & designers around the world.
items:
- src: /pro/logos/springfieldclinic.svg
alt: Springfield Clinic
- src: /pro/logos/churnkey.svg
alt: Churnkey
- src: /pro/logos/bosch.svg
alt: BOSCH
- src: /pro/logos/blizzard.svg
alt: Blizzard
- src: /pro/logos/bodet.svg
alt: Bodet
- src: /pro/logos/win.svg
alt: WinReality
- src: /pro/logos/tower.svg
alt: Tower Research
- src: /pro/logos/liegeairport.svg
alt: Liege Airport
- src: /pro/logos/wuniversity.svg
alt: University of Washington
- src: /pro/logos/funda.svg
alt: Funda
- src: /pro/logos/exxonmobil.svg
alt: ExxonMobil
- src: /pro/logos/mainpost.svg
alt: Main Post
- src: /pro/logos/insep.svg
alt: INSEP
- src: /pro/logos/applause.svg
alt: Applause
- src: /pro/logos/instadapp.svg
alt: Instadapp
faq:
title: Frequently Asked Questions
description: If you can't find what you're looking for, email our support team and if you're lucky someone will get back to you.
items:
- label: Can I use the UI kit on a free Figma account?
content: Yes. You don't need Figma's paid plan to use our UI kits.
defaultOpen: true
- label: Do you have a free trial?
content: We don't offer a free trial for the Pro Figma Kit, you can [preview it](https://go.nuxt.com/figma-pro).
- label: How do I access the files after purchasing?
content: After purchasing, just extract the ZIP file and drag & drop it directly into Figma.
- label: Can I upgrade my Solo license to the Team license?
content: Yes! Email us at design@nuxt.com with your details and we'll send you a discount code.
- label: Can I use the UI Kit license for commercial projects?
content: Yes, the license allows you to sell your designs that utilize the UI Kit implementations.
- label: Can I create multiple projects for multiple clients?
content: Yes, you can create multiple projects for multiple clients with the same license, there is no limit to the number of projects you can create.
- label: Can I include UI Kit in an open source project?
content: No, the license does not allow you to include the UI Kit in an open source project where the design files are publicly accessible.
- label: How do I contact you?
content: Email us at design@nuxt.com with your details and we'll help you out.
- label: What is your refund policy?
content: As the Figma Pro Kit is a digital product packaged as a zip file, we cannot offer refunds once the purchase is made.
- label: Do you have a Figma to Code plugin?
content: >
We recommend the open source [TeamPad Dev](https://github.com/ecomfe/tempad-dev) inspect panel with the [TeamPad Dev Nuxt UI Plugin](https://github.com/Justineo/tempad-dev-plugin-nuxt-ui):
1. Install the [TeamPad Dev Chrome Extension](https://chromewebstore.google.com/detail/tempad-dev/lgoeakbaikpkihoiphamaeopmliaimpc)
2. Open your Figma file with Nuxt UI components (reload the page if you don't see the TeamPad Dev panel)
3. Install the `@nuxt` in TeamPad Dev's plugins section
4. Select any Nuxt UI component and inspect the code it generates
![TeamPad Dev Nuxt UI Plugin](/pro/figma/teampad-dev-nuxt-ui-plugin.gif){.w-full .rounded .mb-2 .max-w-[636px]}
*Right now, only Nuxt UI components are supported, but the code of the plugin is [open source](https://github.com/Justineo/tempad-dev-plugin-nuxt-ui) and anyone can contribute to it.*

View File

@@ -0,0 +1,288 @@
<script setup lang="ts">
// @ts-expect-error yaml is not typed
import page from '.figma.yml'
import { animate } from 'motion'
import { joinURL } from 'ufo'
const { url } = useSiteConfig()
useSeoMeta({
title: page.title,
description: page.description,
ogTitle: page.title,
ogDescription: page.description,
ogImage: joinURL(url, '/pro/figma/og-image.png')
})
const video = ref<HTMLVideoElement | null>(null)
const played = ref(false)
onMounted(async () => {
// Animate cursors
await new Promise(resolve => setTimeout(resolve, 1000))
const figmaWordPosition = document.querySelector('#figma')?.getBoundingClientRect()
const nuxtWordPosition = document.querySelector('#nuxt')?.getBoundingClientRect()
const initialScrollX = window.scrollX
const initialScrollY = window.scrollY
if (figmaWordPosition && nuxtWordPosition) {
animate('#cursor1', { left: Math.round(Math.random() * window.outerWidth), top: Math.round(Math.random() * window.outerHeight) }, { duration: 0.1 })
.then(() => animate('#cursor1', { opacity: 1 }, { duration: 0.3 }))
.then(() => {
return animate('#cursor1', {
left: Math.round(figmaWordPosition.left + initialScrollX + figmaWordPosition.width / 2),
top: Math.round(figmaWordPosition.top + initialScrollY - figmaWordPosition.height / 4)
}, { duration: 1.5, delay: 0.2, ease: 'easeInOut' })
})
.then(() => animate('#cursor1', { scale: 0.8 }, { duration: 0.1, ease: 'easeOut' }))
.then(() => animate('#cursor1', { scale: 1 }, { duration: 0.1, ease: 'easeOut' }))
.then(() => animate('#figma', { color: 'var(--ui-info)' }, { duration: 0.3, ease: 'easeOut' }))
.then(() => animate('#cursor1', { left: Math.round(figmaWordPosition.left + initialScrollX + figmaWordPosition.width), top: Math.round(figmaWordPosition.top + initialScrollY) }, { duration: 0.6, ease: 'easeInOut' }))
animate('#cursor2', { left: Math.round(Math.random() * window.outerWidth), top: Math.round(Math.random() * window.outerHeight) }, { duration: 0.1, delay: 0.6 })
.then(() => animate('#cursor2', { opacity: 1 }, { duration: 0.3 }))
.then(() => {
return animate('#cursor2', {
left: Math.round(nuxtWordPosition.left + initialScrollX + nuxtWordPosition.width / 2),
top: Math.round(nuxtWordPosition.top + initialScrollY - nuxtWordPosition.height / 4)
}, { duration: 1.5, delay: 0.2, ease: 'easeInOut' })
})
.then(() => animate('#cursor2', { scale: 0.8 }, { duration: 0.1, ease: 'easeOut' }))
.then(() => animate('#cursor2', { scale: 1 }, { duration: 0.1, ease: 'easeOut' }))
.then(() => animate('#nuxt', { color: 'var(--ui-success)' }, { duration: 0.3, ease: 'easeOut' }))
.then(() => animate('#cursor2', { left: Math.round(nuxtWordPosition.left + initialScrollX + nuxtWordPosition.width), top: Math.round(nuxtWordPosition.top + initialScrollY) }, { duration: 0.6, ease: 'easeInOut' }))
}
})
</script>
<template>
<div class="relative">
<div id="cursor1" class="absolute z-10 pointer-events-none" :style="{ opacity: 0 }">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="26" viewBox="0 0 24 24" class="absolute top-0 left-0 drop-shadow-[0_1px_2px_rgb(0,0,0,0.25)] text-white dark:text-(--ui-bg)">
<path
fill="var(--ui-info)"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="1.5"
d="M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z"
/>
</svg>
<UBadge color="info" class="absolute top-[18px] left-[18px] py-1 px-1 rounded-sm font-semibold leading-none">
Sarah
</UBadge>
</div>
<div id="cursor2" class="absolute z-10 pointer-events-none" :style="{ opacity: 0 }">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="26" viewBox="0 0 24 24" class="absolute top-0 left-0 drop-shadow-[0_1px_2px_rgb(0,0,0,0.25)] text-white dark:text-(--ui-bg)">
<path
fill="var(--ui-success)"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="1.5"
d="M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z"
/>
</svg>
<UBadge color="success" class="absolute top-[18px] left-[18px] py-1 px-1 rounded-sm font-semibold leading-none">
Sebastien
</UBadge>
</div>
<UPageHero
:links="page.hero.links"
class="relative"
:ui="{
container: 'relative !pb-0'
}"
>
<template #title>
<MDC :value="page.hero.title" unwrap="p" />
</template>
<template #description>
<MDC :value="page.hero.description" unwrap="p" />
</template>
<!-- <img src="/pro/figma/nuxt-ui-figma.png" alt="Screnshot of the Nuxt UI Figma design kit" class="w-full h-auto border border-(--ui-border) border-b-0"> -->
<div class="relative">
<video
ref="video"
:controls="played"
playsinline
src="https://res.cloudinary.com/nuxt/video/upload/v1739267662/ui-pro/video4_aobki0.mp4"
poster="https://res.cloudinary.com/nuxt/video/upload/so_0/v1739267662/ui-pro/video4_aobki0.jpg"
:class="{ grayscale: !played }"
/>
<div v-if="!played" class="group cursor-pointer absolute inset-0 flex items-center justify-center backdrop-blur-xs" @click="video?.play(); played = true">
<UButton
icon="i-heroicons-play-20-solid"
size="xl"
color="neutral"
variant="solid"
class="group-hover:scale-105 transition-transform cursor-pointer drop-shadow-xl"
aria-label="Play video"
:ui="{
base: 'p-4'
}"
>
Watch 1 min demo
</UButton>
</div>
</div>
<div aria-hidden="true" class="absolute z-[-1] border-x border-(--ui-border) inset-0 mx-4 sm:mx-6 lg:mx-8" />
</UPageHero>
<UPageSection v-bind="page.features1" :ui="{ container: 'py-16 sm:py-16 lg:py-16', features: 'mt-0' }" class="border-y border-(--ui-border)" />
<UPageCTA
v-if="page.cta1"
variant="naked"
:ui="{
container: 'lg:grid-cols-0 !gap-0 px-4 sm:px-6 lg:px-8',
wrapper: 'grid grid-cols-1 lg:grid-cols-2',
description: 'lg:mt-0' }"
orientation="horizontal"
class="rounded-none bg-gradient-to-b from-(--ui-bg-muted) to-(--ui-bg)"
>
<template #title>
<MDC :value="page.cta1.title" unwrap="p" />
</template>
<template #description>
<MDC :value="page.cta1.description" unwrap="p" />
</template>
</UPageCTA>
<UPageSection v-bind="page.section1" orientation="horizontal" :ui="{ container: 'py-16 sm:py-16 lg:py-16' }">
<UTabs :items="(page.section1.tabs as any[])" size="sm" color="neutral" :unmount-on-hide="false">
<template #content="{ item }">
<NuxtImg
:width="item.width"
:height="item.height"
:src="item.src"
:alt="item.alt"
class="w-full h-auto rounded-[calc(var(--ui-radius)*2)]"
lazy
/>
</template>
</UTabs>
</UPageSection>
<UPageSection v-bind="page.section2" orientation="horizontal" :ui="{ container: 'py-16 sm:py-16 lg:py-16' }">
<NuxtImg
v-if="page.section2.image"
v-bind="page.section2.image"
class="w-full h-auto rounded-[calc(var(--ui-radius)*2)]"
lazy
/>
</UPageSection>
<UPageSection v-bind="page.section3" orientation="horizontal" :ui="{ container: 'py-16 sm:pt-16 lg:pt-16' }">
<NuxtImg
v-if="page.section3.image"
v-bind="page.section3.image"
class="w-full h-auto rounded-[calc(var(--ui-radius)*2)]"
lazy
/>
</UPageSection>
<USeparator />
<UPageSection
v-bind="page.section4"
orientation="vertical"
:ui="{
title: 'sm:text-left',
description: 'sm:text-left',
links: 'sm:justify-start',
container: 'relative !pb-0',
wrapper: 'sm:pl-8'
}"
>
<template #description>
<MDC :value="page.section4.description" unwrap="p" />
</template>
<div aria-hidden="true" class="absolute z-[-1] border-x border-(--ui-border) inset-0 mx-4 sm:mx-6 lg:mx-8" />
<ul class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 items-start justify-center border border-(--ui-border) border-b-0 sm:divide-x divide-y lg:divide-y-0 divide-(--ui-border)">
<li v-for="(step, index) in page?.section4.steps" :key="step.title" class="flex flex-col gap-y-4 justify-start group h-full p-4">
<NuxtImg
v-if="step.image"
v-bind="step.image"
class="rounded-(--ui-radius)"
lazy
/>
<div>
<h2 class="font-semibold inline-flex items-center gap-x-1">
<UBadge :label="index + 1" size="sm" color="neutral" variant="subtle" class="rounded-full tabular-nums" /> {{ step.title }}
</h2>
<p class="text-(--ui-text-muted) text-sm">
{{ step.description }}
</p>
</div>
</li>
</ul>
</UPageSection>
<UPageSection v-bind="page.features2" :ui="{ container: 'py-16 sm:py-16 lg:py-16', features: 'mt-0' }" class="border-y border-(--ui-border)" />
<UPageSection
v-if="page.pricing"
:title="page.pricing.title"
:description="page.pricing.description"
orientation="vertical"
:ui="{
title: 'sm:text-left',
description: 'sm:text-left',
links: 'sm:justify-start',
container: 'relative !pb-0',
wrapper: 'sm:pl-8'
}"
>
<div aria-hidden="true" class="absolute z-[-1] border-x border-(--ui-border) inset-0 mx-4 sm:mx-6 lg:mx-8" />
<UPricingPlans compact class="-space-x-px">
<UPricingPlan
v-for="(plan, index) in page.pricing.plans"
:key="index"
:title="plan.title"
:description="plan.description"
:price="plan.price"
:billing-period="plan.billing_period"
:billing-cycle="plan.billing_cycle"
:highlight="plan.highlight"
:features="plan.features"
:button="plan.button"
:terms="plan.terms"
class="rounded-none"
:class="plan.class"
>
<template #features>
<li v-for="(feature, i) in plan.features" :key="i" class="flex items-center gap-2 min-w-0">
<UIcon name="i-lucide-circle-check" class="size-5 shrink-0 text-(--ui-primary)" />
<MDC :value="feature" unwrap="p" tag="span" class="text-sm truncate text-(--ui-text-accented)" />
</li>
</template>
<template #button>
<div class="flex flex-col w-full items-center gap-2">
<UButton v-bind="plan.button" block size="lg" />
<UButton
v-if="plan.extraButton"
v-bind="plan.extraButton"
block
size="lg"
variant="outline"
color="neutral"
/>
</div>
</template>
</UPricingPlan>
</UPricingPlans>
</UPageSection>
<UPageCTA v-if="page.customers" :title="page.customers.title" :ui="{ title: '!text-base font-medium', container: 'sm:py-12 sm:gap-8' }" variant="outline" class="rounded-none">
<UPageMarquee pause-on-hover :ui="{ root: '[--duration:40s]' }">
<img
v-for="(logo, index) in page.customers.items"
:key="index"
v-bind="logo"
class="h-6 shrink-0 max-w-[140px] filter invert dark:invert-0"
>
</UPageMarquee>
</UPageCTA>
<UPageSection v-bind="page.faq" :ui="{ container: 'relative' }">
<div aria-hidden="true" class="hidden lg:block absolute z-[-1] border-x border-(--ui-border) inset-0 mx-4 sm:mx-6 lg:mx-8" />
<UPageAccordion
multiple
:items="(page.faq.items as any[])"
class="max-w-4xl mx-auto"
>
<template #body="{ item }">
<MDC :value="item.content" unwrap="p" />
</template>
</UPageAccordion>
</UPageSection>
</div>
</template>

View File

@@ -0,0 +1,217 @@
title: Nuxt UI Pro Pricing
description: Start for free in development mode, then upgrade to a paid plan to unlock the full features of Nuxt UI Pro when you are ready to launch.
pricing:
headline: Pricing
title: Upgrade to Nuxt UI [Pro]{class="text-(--ui-primary)"}.
description: On top of 40+ open source components from Nuxt UI, Pro gives you access to 50+ premium Vue components to create beautiful & responsive Nuxt applications in minutes. It includes all primitives to build landing pages, documentations, blogs, dashboards or entire SaaS products.
freePlan:
title: Free in development
description: Try Nuxt UI Pro for free in development, no credit card required. Upgrade when ready to deploy.
variant: soft
orientation: horizontal
button:
label: Get started for Free
to: '/getting-started/installation/pro/nuxt'
color: 'neutral'
variant: 'outline'
figma:
title: Figma Kit Pro
description: Get all Nuxt UI Pro components in a Figma kit to design your next application before coding. Everything you need, from wire-framing to high-fidelity web integration.
variant: soft
orientation: horizontal
price: $149 - $349
terms: Solo & Team licenses available.
features:
- 1700+ components & variants from Nuxt UI & UI Pro
- 'Variables: primary, neutral, fonts, rounded, shadows, etc.'
- Light & dark mode support
- 'Templates: Starter, Landing, Docs, SaaS and Dashboard'
- Auto-layout & responsive ready
- Tailwind CSS assets & icons included
- Free [preview available](https://www.figma.com/design/mxXR9binOSLU3rYKZZRPXs/PREVIEW---NuxtUIPro-V3-BETA?m=auto&t=c4598Wr0rZwKPs5M-1)
- Includes Nuxt UI [Figma Kit](https://www.figma.com/community/file/1288455405058138934)
button:
label: Explore Figma Kit Pricing
to: 'https://nuxt.lemonsqueezy.com/buy/17213c49-621b-4c2c-9478-3a50a099003d'
color: 'neutral'
plans:
- title: Solo
description: Tailored for indie hackers, freelancers and solo founders.
price: $249
billing_period: one-time payment
billing_cycle: plus local taxes
features:
- One developer
- Unlimited projects
- Access to the GitHub repository
- Unlimited minor & patch updates
- Lifetime access
button:
label: Buy now
to: https://nuxt.lemonsqueezy.com/buy/057dacb2-87ba-4dc1-9256-59ee5b3bd394
- title: Startup
description: Best suited for small teams, startups and agencies.
price: $499
billing_period: one-time payment
billing_cycle: plus local taxes
features:
- Up to 5 developers
- Unlimited projects
- Access to the GitHub repository
- Unlimited minor & patch updates
- Lifetime access
button:
label: Buy now
to: https://nuxt.lemonsqueezy.com/buy/2e042a33-7e76-4dda-bd68-e353c182e571
highlight: true
- title: Organization
description: Ideal for larger teams and organizations.
price: $999
billing_period: one-time payment
billing_cycle: plus local taxes
features:
- Up to 20 developers
- Unlimited projects
- Everything in Startup
- Prioritized feature requests
- Unlimited minor & patch updates
- Lifetime access
button:
label: Buy now
to: https://nuxt.lemonsqueezy.com/buy/2979099c-b7a0-4ba1-90e0-a0d60509b92d
logos:
- src: /pro/logos/springfieldclinic.svg
alt: Springfield Clinic
- src: /pro/logos/churnkey.svg
alt: Churnkey
- src: /pro/logos/bosch.svg
alt: BOSCH
- src: /pro/logos/blizzard.svg
alt: Blizzard
- src: /pro/logos/bodet.svg
alt: Bodet
- src: /pro/logos/win.svg
alt: WinReality
- src: /pro/logos/tower.svg
alt: Tower Research
- src: /pro/logos/liegeairport.svg
alt: Liege Airport
- src: /pro/logos/wuniversity.svg
alt: University of Washington
- src: /pro/logos/funda.svg
alt: Funda
- src: /pro/logos/exxonmobil.svg
alt: ExxonMobil
- src: /pro/logos/mainpost.svg
alt: Main Post
- src: /pro/logos/insep.svg
alt: INSEP
- src: /pro/logos/applause.svg
alt: Applause
- src: /pro/logos/instadapp.svg
alt: Instadapp
testimonials:
title: What people are saying
description: Nuxt UI Pro is already trusted by 2,000+ users and teams around the world.
items:
- quote: "We were using a SaaS service for the docs site, but were left unfulfilled. We put in the effort to do it in house, with UI Pro and not only did we get complimented by a prospect on our site, but they wanted to know our platform."
user:
name: 'Anthony Bettini'
description: 'CEO and founder of VulnCheck'
to: 'https://www.linkedin.com/in/anthonybettini/'
target: _blank
avatar:
src: 'https://media.licdn.com/dms/image/v2/C4E03AQEY3pmXsH8hDg/profile-displayphoto-shrink_200_200/profile-displayphoto-shrink_200_200/0/1519741249602?e=1743638400&v=beta&t=lw2K6vS0OOCZWGtHY1buJVkRItQCa4OQw0vzAhhpJk8'
- quote: "Wow, Nuxt UI Pro is a total game-changer! I'm seriously impressed with the quality, attention to detail, and the insane variety of components you get. It's like hitting the jackpot for any developer. I've saved countless hours that I would've spent stressing over making my apps look good, with amazing accessible UX, and instead, I've been able to focus on the real deal building the app itself. It's an instant buy for me, every single time. No second thoughts!"
user:
name: 'Yaz Jallad'
description: 'Founder Ninjaparade Digital'
to: 'https://twitter.com/ninjaparade/'
target: _blank
avatar:
src: 'https://pbs.twimg.com/profile_images/1824690890222485504/lQ7v1AGt_400x400.jpg'
- quote: "Nuxt UI Pro saves 100s of hours of dev and design time while delivering a clean professional look on any device."
user:
name: 'Kevin Olson'
description: 'Founder of Fume.app'
to: 'https://github.com/acidjazz'
target: _blank
avatar:
src: 'https://ipx.nuxt.com/f_auto,s_40x40/gh_avatar/acidjazz'
srcset: 'https://ipx.nuxt.com/f_auto,s_80x80/gh_avatar/acidjazz 2x'
- quote: "I decided to replace my custom-built components with a component library and chose Nuxt UI Pro. It only took me a few hours, and the new UI looks more professional. Integrating the library is easy; the components are well-documented and highly customizable. I can only recommend it; this library is my new choice for new SaaS products."
user:
name: 'Michael Hoffmann'
description: 'Senior Frontend Developer'
to: 'https://mokkapps.de/'
target: _blank
avatar:
src: 'https://ipx.nuxt.com/f_auto,s_40x40/gh_avatar/mokkapps'
srcset: 'https://ipx.nuxt.com/f_auto,s_80x80/gh_avatar/mokkapps 2x'
- quote: "Nuxt UI Pro is my go to component library. Out-of-the-box it handles all of the UI demands I throw at it while looking great. The customisation is really worth thought out, allowing you to override components in a breeze. Always amazed at the improvements dropped in each update as well, the team is doing an amazing job."
user:
name: 'Harlan Wilton'
description: 'Nuxt core team member'
to: 'https://github.com/harlan-zw'
target: _blank
avatar:
src: 'https://ipx.nuxt.com/f_auto,s_40x40/gh_avatar/harlan-zw'
srcset: 'https://ipx.nuxt.com/f_auto,s_80x80/gh_avatar/harlan-zw 2x'
- quote: "I jumped at the chance to buy the Nuxt team's new UI kit as soon as I saw it. While I'm already a fan of Nuxt UI, the pro version takes it to a whole new level and lets me paste entire blocks into all my projects, saving me a ton of time."
user:
name: 'Thomas Sanlis'
description: 'Freelance developer and designer'
to: 'https://twitter.com/T_Zahil'
target: _blank
avatar:
src: 'https://pbs.twimg.com/profile_images/1374040164180299791/ACw4G3nZ_400x400.jpg'
- quote: "Nuxt UI has allowed me to develop my SaaS without any prior mockups. The design quality of their components and the intelligence of the DX meant that I was able to try many different layouts for my application until I found the perfect UX for my users. Nuxt UI is the ui-kit I would have dreamed of building myself, and Nuxt UI Pro makes things even easier when you want to go further with your SaaS. Kudos to the team."
user:
name: 'Benjamin Code'
description: 'YouTuber and SaaS builder'
to: 'https://twitter.com/benjamincode'
target: _blank
avatar:
src: 'https://pbs.twimg.com/profile_images/1607353032420769793/I8qQSUfQ_400x400.jpg'
- quote: "Nuxt UI Pro is my preferred choice for everything, from a POC to a web platform. It's ready to use out-of-the-box and assists me in crafting pixel-perfect UIs. It saves me a significant amount of time while remaining highly customizable. Give it a try, and you won't be let down."
user:
name: 'Estéban Soubiran'
description: 'Web developer and UnJS member'
to: 'https://twitter.com/soubiran_'
target: _blank
avatar:
src: 'https://pbs.twimg.com/profile_images/1801649350319218689/aS_X_iTm_400x400.jpg'
- quote: "As someone who builds a lot of projects, Nuxt UI Pro has been a game-changer. It's not just about saving time it's about having components that are thoughtfully designed and just work. The developer experience is exceptional, and I can focus on building features instead of tweaking UI components."
user:
name: 'Hugo Richard'
description: 'Frontend Engineer at NuxtLabs'
to: 'https://twitter.com/hugorcd__'
target: _blank
avatar:
src: 'https://ipx.nuxt.com/f_auto,s_40x40/gh_avatar/hugorcd'
srcset: 'https://ipx.nuxt.com/f_auto,s_80x80/gh_avatar/hugorcd 2x'
faq:
title: Frequently Asked Questions
description: If you can't find what you're looking for, email our support team and if you're lucky someone will get back to you.
items:
- label: What is the difference between Nuxt UI Pro and Nuxt UI?
content: Nuxt UI Pro is a collection of premium Vue components, composables and utils built on top of Nuxt UI. It includes advanced responsive components ([Header](/components/header), [PageHero](/components/page-hero), [PricingPlan](/components/pricing-plan), [BlogPost](/components/blog-post), etc.) designed ot help you build web applications faster.
defaultOpen: true
- label: Do you have a free trial?
content: We have much better than a free trial, you can use Nuxt UI Pro for free in development mode. Once you are ready to deploy your application, you can purchase a license.
- label: What do I get with my license?
content: Once you purchase a license, you will receive a license key to [activate](/pro/activate) by inviting the team members to our private GitHub repository. On top of having access to the source code and private roadmap, the license key will allow you to [build your project to production](/getting-started/license#build) with the `nuxt build` command.
- label: Can I use Nuxt UI Pro for Open Source projects?
content: Yes, you can use Nuxt UI Pro for your open source projects as well as your commercial projects as long as you don't sell Nuxt UI Pro as a product and that you don't share your license key.
- label: What does “Unlimited minor & patch updates” include?
content: We add new components and improvements to Nuxt UI Pro as we get new ideas and feedback, you will receive these updates for the major version you purchased. :br **Your license key will work forever for the major version.** We may release a major version including more advanced components and features in the future, you will be able to upgrade to this version with a generous discount.
- label: I purchased Nuxt UI Pro previous versions, do I need to purchase the version 3?
content: '**The version 3 is a free upgrade**, so the license you bought on previous versions will be valid for v3.'
- label: What does “lifetime access” means?
content: Nuxt UI Pro is a one-time purchase, with no recurring subscription. You will have access to all assets of Nuxt UI Pro forever.
- label: Do you have discounts for students or non-profits?
content: Yes, we offer a 50% discount for students using Nuxt UI Pro purely for educational purposes. Contact us at ui-pro@nuxt.com with your details and we'll send you a discount code.
- label: Do you offer technical support?
content: Once you sign up you get access to our private GitHub repository, where you can ask questions, report bugs or feature requests and get help from other customers. If you require more specialised support or consultancy, contact us at ui-pro@nuxt.com.
- label: What is your refund policy?
content: If you are not satisfied with Nuxt UI Pro, let us know within 14 days of your purchase at ui-pro@nuxt.com and we'll refund your money.

View File

@@ -0,0 +1,174 @@
title: Build faster with Nuxt UI Pro.
description: A collection of premium Vue components, composables and utils built on top of Nuxt UI, oriented on structure and layout and designed to be used as building blocks for your application.
hero:
title: Build faster with Nuxt UI [Pro]{class="text-(--ui-primary)"}.
description: A collection of premium Vue components, composables and utils built on top of Nuxt UI. :br Focused on structure and layout, these **responsive components** are designed to be the perfect **building blocks for your next idea**.
links:
- label: Get started
icon: i-lucide-arrow-right
trailing: true
to: /getting-started/installation/pro/nuxt
size: xl
- label: Purchase a license
size: xl
color: neutral
variant: outline
to: /pro/pricing
features:
title: Create stunning Vue applications faster.
description: Nuxt UI Pro comes packed with powerful features to help you build modern, performant, accessible and responsive Nuxt applications at record speed. From pre-built UI sections to Figma design kits, every detail is crafted to speed up your development and deliver a polished user experience.
features:
- title: 40+ Ready-to-use Sections
description: Pre-built UI components for landing pages, documentation, blogs, dashboards, and more—ready to use out of the box.
icon: i-lucide-layout-grid
- title: Auto Dark Mode
description: Seamlessly adapts to user preferences with a built-in dark mode switch—no extra configuration needed.
icon: i-lucide-moon
- title: Blazing-fast Performance
description: Optimized for Nuxt 3 with minimal bundle size, lightning-fast rendering, and best practices in performance.
icon: i-lucide-zap
- title: SEO & Accessibility Ready
description: Built with proper semantic HTML, structured data, and accessibility in mind for better rankings and usability.
icon: i-lucide-search-check
- title: Fully Customizable UI
description: Modify colors, fonts, spacing, and layouts with Tailwind CSS and Nuxt UIs design tokens to match your brand identity.
icon: i-lucide-settings-2
- title: Nuxt Content Support
description: Write content with Markdown and MDC, making it easy to build documentation, blogs, and knowledge bases.
icon: i-simple-icons-markdown
- title: Vue-only mode
description: Enjoy the benefits of Nuxt UI Pro without Nuxt. Integrate it seamlessly into your Vue 3 + Vite projects and build modern UIs with ease.
icon: i-simple-icons-vuedotjs
- title: Built-in Internationalization (i18n)
description: Easily localize your site with built-in support for multiple languages and right-to-left (RTL) layouts.
icon: i-lucide-globe
- title: Figma Design Kits
description: Match your development workflow with Nuxt UI & UI Pro Figma UI kits, ensuring a fast transition from design to code.
icon: i-simple-icons-figma
authorQuote:
quote: Nuxt UI, born from a desire to improve Vue component development, is the go-to library for building modern web interfaces. We aim to provide you with a comprehensive set of tools to create and customize your next UI while maintaining the best developer experience.
user:
name: Benjamin Canac
description: Author of Nuxt UI
to: https://github.com/benjamincanac
avatar:
src: https://github.com/benjamincanac.png
sections:
- title: The freedom to build anything
description: Nuxt UI Pro ships with an extensive set of advanced components that cover a wide range of use-cases. Carefully crafted to reduce boilerplate code without sacrificing flexibility.
id: features
features:
- name: Fully customizable
description: Like Nuxt UI, change the style of any component from your App Config or customize them specifically through the ui prop.
icon: i-lucide-pencil-ruler
- name: Slots for everything
description: Each component leverages the power of Vue's slots to give you the flexibility to build anything.
icon: i-lucide-code
- name: Responsive by design
description: Nuxt UI Pro components aims to structure your content, they are responsive by design and will adapt to any screen size.
icon: i-lucide-layout
links:
- label: Explore components
to: /components
trailingIcon: i-lucide-arrow-right
code: |
```vue [app.vue]
<script setup lang="ts">
const links = [
{ to: '/', label: 'Home' },
{ to: '/about', label: 'About' },
{ to: '/contact', label: 'Contact' }
]
</script>
<template>
<UApp>
<UHeader :links="links" />
<UPageHero title="Hello World" />
<UPageSection title="Features">
<UPageGrid>
<UPageCard title="First Card" />
<UPageCard title="Second Card" />
<UPageCard title="Third Card" />
</UPageGrid>
</UPageSection>
<UFooter />
</UApp>
</template>
```
- title: The flexibility to control your data
description: Although you can use any data source you want, Nuxt UI Pro is fully integrated with Nuxt Content and provides additional features when the module is detected.
reverse: true
features:
- name: 'Write Markdown with ease'
description: Nuxt UI Pro overrides Nuxt Content prose components to make them awesome but also adds new ones like Callout, CodeGroup, Field, etc.
icon: i-simple-icons-markdown
- name: Full-Text Search out of the box
description: 'Nuxt UI Pro ships with a ready to use command palette component. No need to setup Algolia DocSearch anymore.'
icon: i-lucide-search
links:
- label: Nuxt Content integration
to: /getting-started/content
icon: i-lucide-arrow-right
trailing: true
code: |
```vue [pages/\[...slug\\].vue]
<script setup lang="ts">
const route = useRoute()
const { data: page } = await useAsyncData(route.path, () => queryCollection('content').path(route.path).first())
</script>
<template>
<UPage>
<UPageHeader :title="page.title" :description="page.description" :links="page.links" />
<UPageBody>
<ContentRenderer v-if="page.body" :value="page" />
</UPageBody>
<template #right>
<UContentToc :links="page.body.toc.links" />
</template>
</UPage>
</template>
```
templates:
headline: Templates
title: Kickstart with Nuxt UI Pro in seconds
description: Choose from a variety of templates to get started with Nuxt UI Pro in seconds. Each template is designed to help you build beautiful and responsive Nuxt applications in minutes.
items:
- title: Landing
description: A template for building a landing page with Nuxt UI Pro.
icon: i-lucide-layout
to: 'https://landing-template.nuxt.dev/'
image: '/pro/templates/landing.png'
- title: Saas
description: A template for building a SaaS application with Nuxt UI Pro.
icon: i-lucide-cloud
to: 'https://saas-template.nuxt.dev/'
image: '/pro/templates/saas.png'
- title: Docs
description: A template for building a documentation site with Nuxt UI Pro.
icon: i-lucide-book
to: 'https://docs-template.nuxt.dev/'
image: '/pro/templates/docs.png'
- title: Dashboard
description: A template for building a dashboard with Nuxt UI Pro.
icon: i-lucide-chart-bar
to: 'https://dashboard-template.nuxt.dev/'
image: '/pro/templates/dashboard.png'
cta:
title: Start with Nuxt UI Pro today!
description: Nuxt UI Pro is free in development, but you need a license to use it in production.
links:
- label: Purchase a license
to: '/pro/pricing'
icon: i-lucide-shopping-cart
- label: License
to: '/getting-started/license'
trailingIcon: i-lucide-circle-help
variant: subtle

View File

@@ -0,0 +1,111 @@
title: Official Nuxt UI [Pro]{.text-(--ui-primary)} Templates
description: 'Ready to use templates powered by our premium Vue components and Nuxt Content.<br class="hidden lg:block"> The templates are responsive, accessible and easy to customize so you can get started in no time.'
head.title: Templates
head.description: 'Ready to use templates powered by our premium Vue components and Nuxt Content. The templates are responsive, accessible and easy to customize so you can get started in no time.'
navigation: false
links:
- label: Get started
to: /getting-started/installation/pro/nuxt#use-an-official-template
color: neutral
size: xl
trailingIcon: i-lucide-arrow-right
- label: Purchase a license
size: xl
color: neutral
variant: outline
to: /pro/pricing
templates:
- title: 'Landing'
description: "A landing page template you can use as a starting point for your next idea. You can change the content easily in [`content/index.yml`](https://github.com/nuxt-ui-pro/landing/blob/v3/content/index.yml)."
thumbnail:
dark: https://assets.hub.nuxt.com/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1cmwiOiJodHRwczovL2xhbmRpbmctdGVtcGxhdGUubnV4dC5kZXYiLCJpYXQiOjE3Mzk0NjMzNzV9.ja2nUDVOoIFvyaMmg9Jn51uNMoYYt4WA1KWUQBWwUPo.jpg?theme=dark
light: https://assets.hub.nuxt.com/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1cmwiOiJodHRwczovL2xhbmRpbmctdGVtcGxhdGUubnV4dC5kZXYiLCJpYXQiOjE3Mzk0NjMzNzV9.ja2nUDVOoIFvyaMmg9Jn51uNMoYYt4WA1KWUQBWwUPo.jpg?theme=light
features:
- title: Full responsive
icon: i-lucide-smartphone
- title: Features, Pricing, Testimonials and FAQ sections
icon: i-lucide-rows-3
- title: Write content in YAML
icon: i-simple-icons-yaml
links:
- label: Live preview
to: https://v3.landing-template.nuxt.dev
target: _blank
trailingIcon: i-lucide-arrow-up-right
color: neutral
- label: Use this template
to: https://github.com/nuxt-ui-pro/landing/tree/v3
target: _blank
icon: i-simple-icons-github
color: neutral
variant: outline
- title: 'Docs'
description: "A ready-to-use documentation template integrated with [Nuxt Content](https://content.nuxt.com). You can start writing your docs right away inside the [`content/`](https://github.com/nuxt-ui-pro/docs/tree/v3/content) directory."
thumbnail:
dark: https://assets.hub.nuxt.com/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1cmwiOiJodHRwczovL2RvY3MtdGVtcGxhdGUubnV4dC5kZXYiLCJpYXQiOjE3Mzk0NjM0MTd9.ltVAqPgKG38O01X1zl6MXfrJc55nf9OewXNFjpZ_2JY.jpg?theme=dark
light: https://assets.hub.nuxt.com/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1cmwiOiJodHRwczovL2RvY3MtdGVtcGxhdGUubnV4dC5kZXYiLCJpYXQiOjE3Mzk0NjM0MTd9.ltVAqPgKG38O01X1zl6MXfrJc55nf9OewXNFjpZ_2JY.jpg?theme=light
features:
- title: Write pages in Markdown
icon: i-simple-icons-markdown
- title: Generated navigation & table of contents
icon: i-lucide-text
- title: Full-text search out of the box
icon: i-lucide-search
links:
- label: Live preview
to: https://v3.docs-template.nuxt.dev/
target: _blank
trailingIcon: i-lucide-arrow-up-right
color: neutral
- label: Use this template
to: https://github.com/nuxt-ui-pro/docs/tree/v3
target: _blank
variant: outline
icon: i-simple-icons-github
color: neutral
- title: 'SaaS'
description: "A fully built SaaS application to launch your next project. It includes a landing page, a pricing page, a documentation and a blog which can customized easily from the `content/` directory."
features:
- title: Includes Landing & Docs sections
icon: i-lucide-grid-2x2-plus
- title: Customizable command palette
icon: i-lucide-command
- title: Authentication pages (login, register)
icon: i-lucide-user-round-check
links:
- label: Live preview (soon)
to: https://v3.saas-template.nuxt.dev
target: _blank
trailingIcon: i-lucide-arrow-up-right
color: neutral
disabled: true
- label: Use this template (soon)
to: https://github.com/nuxt-ui-pro/saas/tree/v3
target: _blank
variant: outline
icon: i-simple-icons-github
color: neutral
disabled: true
- title: 'Dashboard'
description: "A template to illustrate how to build your own dashboard with the 15+ latest Nuxt UI Pro components, designed specifically to create a consistent look and feel."
features:
- title: Mix with SaaS template for a complete solution
icon: i-lucide-puzzle
- title: Includes custom components for charts, date pickers, etc.
icon: i-lucide-bar-chart-big
- title: Resizable multi-column layout
icon: i-lucide-columns-3
links:
- label: Live preview (soon)
to: https://v3.dashboard-template.nuxt.dev
target: _blank
trailingIcon: i-lucide-arrow-up-right
color: neutral
disabled: true
- label: Use this template (soon)
to: https://github.com/nuxt-ui-pro/dashboard/tree/v3
target: _blank
icon: i-simple-icons-github
color: neutral
variant: outline
disabled: true

View File

@@ -0,0 +1,115 @@
<script setup lang="ts">
import { z } from 'zod'
import type { FormSubmitEvent } from '@nuxt/ui'
const title = 'Activate your Nuxt UI Pro License'
const description = 'Enable Nuxt UI Pro in your production projects by activating your license key received by email and get invited to the GitHub private repository.'
const route = useRoute()
useSeoMeta({
title,
description,
ogTitle: `${title} - Nuxt UI Pro`,
ogDescription: description
})
defineOgImageComponent('Docs', {
headline: 'Pro'
})
const schema = z.object({
license: z.string().length(36, 'Invalid license key'),
username: z.string().min(1, 'Required')
})
type Schema = z.output<typeof schema>
const state = reactive<Partial<Schema>>({
license: '',
username: ''
})
const activating = ref(false)
const successMessage = ref()
const errorMessage = ref('')
async function submit(event: FormSubmitEvent<any>) {
activating.value = true
errorMessage.value = ''
successMessage.value = ''
try {
const res: { activationsLeft: number, activationsTotal: number } = await $fetch<{ activationsLeft: number, activationsTotal: number }>('https://api.nuxtlabs.com/ui-pro/activate', {
method: 'POST',
body: {
key: event.data.license,
username: event.data.username
}
})
successMessage.value = 'License activated!'
if (res.activationsTotal > 1) {
successMessage.value += ` ${res.activationsLeft} activation${res.activationsLeft > 1 ? 's' : ''} left.`
}
state.username = ''
} catch (err) {
// @ts-expect-error this is not properly typed
errorMessage.value = err.data?.message || err.message
}
activating.value = false
}
onMounted(() => {
if (route.query.license_key && !state.license) {
state.license = route.query.license_key as string
}
})
</script>
<template>
<UPageHero headline="License Activation" :title="title" :description="description">
<template #top>
<div class="absolute z-[-1] rounded-full bg-[var(--ui-primary)] blur-[300px] size-60 sm:size-80 transform -translate-x-1/2 left-1/2 -translate-y-80" />
<StarsBg />
</template>
<div>
<UCard class="lg:w-1/2 m-auto backdrop-blur-sm">
<UForm
:schema="schema"
:validate-on="['blur']"
:state="state"
class="space-y-4"
@submit="submit"
>
<UFormField label="License Key" name="license">
<UInput v-model="state.license" autocomplete="off" :ui="{ root: 'flex' }" />
</UFormField>
<UFormField label="GitHub Username" name="username">
<UInput v-model="state.username" autocomplete="off" :ui="{ root: 'flex' }" />
</UFormField>
<UButton type="submit" :loading="activating" :disabled="state.license.length !== 36 || !state.username">
Activate the license
</UButton>
<UAlert v-if="successMessage" color="success" variant="subtle" :title="successMessage">
<template #description>
The GitHub invitation to <NuxtLink to="https://github.com/nuxt/ui-pro/invitations" external target="_blank" class="font-bold text-primary hover:underline">
Nuxt UI Pro repository
</NuxtLink> has been sent and
you can now use your license key in your projects, checkout the
<NuxtLink class="font-bold underline" to="/pro/getting-started/installation">
installation guide
</NuxtLink>
</template>
</UAlert>
<UAlert v-else-if="errorMessage" color="error" variant="subtle" :title="errorMessage" />
</UForm>
</UCard>
<p class="text-sm text-center text-neutral-500 dark:text-neutral-400 my-4">
If you purchased a license with multiple seats, activate the license key for each of your team members.
</p>
</div>
</UPageHero>
</template>

View File

@@ -0,0 +1,111 @@
<script setup lang="ts">
// @ts-expect-error yaml is not typed
import page from '.content/pro.yml'
useSeoMeta({
title: page.title,
ogTitle: page.title,
description: page.description,
ogDescription: page.description
})
defineOgImageComponent('Docs', {
headline: 'Pro'
})
</script>
<template>
<div class="relative">
<UPageHero
:links="page.hero.links"
class="relative"
orientation="horizontal"
>
<template #title>
<MDC :value="page.hero.title" unwrap="p" />
</template>
<template #description>
<MDC :value="page.hero.description" unwrap="p" />
</template>
<template #top>
<div class="absolute z-[-1] rounded-full bg-[var(--ui-primary)] blur-[300px] size-60 sm:size-80 transform -translate-x-1/2 left-1/2 -translate-y-80" />
<StarsBg />
</template>
<PromotionalVideo />
</UPageHero>
<UPageSection
v-bind="page.features"
:ui="{ title: 'text-left', description: 'text-left' }"
/>
<UPageCTA
:description="page.authorQuote.quote"
variant="soft"
class="rounded-none"
:ui="{ container: 'sm:py-12 lg:py-12 sm:gap-8', description: 'before:content-[open-quote] after:content-[close-quote]' }"
>
<UUser
v-bind="page.authorQuote.user"
size="xl"
class="justify-center"
/>
</UPageCTA>
<UPageSection
v-for="(section, index) in page.sections"
:key="index"
v-bind="section"
orientation="horizontal"
>
<MDC :value="section.code" />
</UPageSection>
<UPageSection
id="templates"
v-bind="page.templates"
class="overflow-hidden"
>
<UCarousel
v-slot="{ item }"
loop
arrows
dots
:autoplay="{ delay: 3000 }"
:items="(page.templates.items as any[])"
:ui="{ item: 'basis-1/2', container: 'py-2' }"
>
<UPageCard
:to="item.to"
:description="item.description"
class="group"
:ui="{ container: 'p-4 sm:p-4', title: 'flex items-center gap-1' }"
>
<template #title>
<UIcon :name="item.icon" />
<span>
{{ item.title }}
</span>
</template>
<img
:src="item.image"
:alt="item.title"
class="rounded-lg grayscale group-hover:grayscale-0 transition-all duration-200 ease-in-out"
>
</UPageCard>
</UCarousel>
</UPageSection>
<USeparator />
<UPageCTA
v-bind="page.cta"
variant="naked"
class="overflow-hidden"
>
<div class="absolute rounded-full dark:bg-[var(--ui-primary)] blur-[250px] size-40 sm:size-50 transform -translate-x-1/2 left-1/2 -translate-y-80" />
<StarsBg />
</UPageCTA>
</div>
</template>

View File

@@ -0,0 +1,114 @@
<script setup lang="ts">
// @ts-expect-error yaml is not typed
import page from '.content/pricing.yml'
useSeoMeta({
title: page.title,
ogTitle: page.title,
description: page.description,
ogDescription: page.description
})
defineOgImageComponent('Docs', {
headline: 'Pro'
})
</script>
<template>
<div class="relative">
<UPageHero
class="relative"
:description="page.pricing.description"
>
<template #title>
<MDC :value="page.pricing.title" unwrap="p" />
</template>
<template #top>
<div class="absolute z-[-1] rounded-full bg-[var(--ui-primary)] blur-[300px] size-60 sm:size-80 transform -translate-x-1/2 left-1/2 -translate-y-80" />
<StarsBg />
</template>
<UContainer>
<UPricingPlan
v-bind="page.pricing.freePlan"
class="mb-16"
/>
<UPricingPlans
class="mb-16"
scale
>
<UPricingPlan
v-for="(plan, index) in page.pricing.plans"
:key="index"
:title="plan.title"
:description="plan.description"
:price="plan.price"
:billing-period="plan.billing_period"
:billing-cycle="plan.billing_cycle"
:highlight="plan.highlight"
:scale="plan.highlight"
variant="soft"
:features="plan.features"
:button="plan.button"
/>
</UPricingPlans>
<UPricingPlan
v-bind="page.pricing.figma"
>
<template #features>
<li v-for="(feature, index) in page.pricing.figma.features" :key="index" class="flex items-center gap-2 min-w-0">
<UIcon name="i-lucide-circle-check" class="size-5 text-(--ui-primary) shrink-0" />
<MDC :value="feature" unwrap="p" class="text-sm truncate text-(--ui-text-toned)" />
</li>
</template>
</UPricingPlan>
</UContainer>
</UPageHero>
<UPageSection
id="testimonials"
v-bind="page.testimonials"
>
<UPageMarquee pause-on-hover :ui="{ root: '[--duration:40s]' }">
<img
v-for="(logo, index) in page.logos"
:key="index"
v-bind="logo"
class="h-6 shrink-0 max-w-[140px] filter invert dark:invert-0"
>
</UPageMarquee>
<UContainer>
<UPageColumns class="xl:columns-4">
<UPageCard
v-for="(testimonial, index) in page.testimonials.items"
:key="index"
variant="subtle"
:description="testimonial.quote"
:ui="{ description: 'before:content-[open-quote] after:content-[close-quote]' }"
>
<template #footer>
<UUser
v-bind="testimonial.user"
size="xl"
/>
</template>
</UPageCard>
</UPageColumns>
</UContainer>
</UPageSection>
<UPageSection
id="faq"
v-bind="page.faq"
class="scroll-mt-[var(--header-height)]"
>
<UPageAccordion
multiple
:items="(page.faq.items as any[])"
class="max-w-4xl mx-auto"
>
<template #body="{ item }">
<MDC :value="item.content" unwrap="p" />
</template>
</UPageAccordion>
</UPageSection>
</div>
</template>

View File

@@ -0,0 +1,69 @@
<script setup lang="ts">
// @ts-expect-error yaml is not typed
import page from '.content/templates.yml'
const title = page.head?.title || page.title
const description = page.head?.description || page.description
useSeoMeta({
title,
description,
ogTitle: `${title} - Nuxt UI Pro`,
ogDescription: description
})
defineOgImageComponent('Docs', {
headline: 'Pro'
})
</script>
<!-- eslint-disable vue/no-v-html -->
<template>
<div class="relative">
<UPageHero :links="page.links">
<template #top>
<div class="absolute z-[-1] rounded-full bg-[var(--ui-primary)] blur-[300px] size-60 sm:size-80 transform -translate-x-1/2 left-1/2 -translate-y-80" />
<StarsBg />
</template>
<template #title>
<MDC :value="page.title" unwrap="p" />
</template>
<template #description>
<MDC :value="page.description" unwrap="p" />
</template>
</UPageHero>
<UPageSection
v-for="(template, index) in page.templates"
:key="index"
:title="template.title"
:links="template.links"
:features="template.features"
orientation="horizontal"
reverse
class="*:!pt-0"
:ui="{ title: 'lg:text-4xl' }"
>
<template #description>
<MDC :value="template.description" unwrap="p" />
</template>
<UColorModeImage
v-if="template.thumbnail"
v-bind="template.thumbnail"
class="w-full h-auto rounded-(--ui-radius) border border-(--ui-border)"
width="656"
height="369"
/>
<UCarousel
v-else-if="template.images"
v-slot="{ item }"
:items="(template.images as any[])"
dots
>
<NuxtImg v-bind="item" class="w-full h-full object-cover" width="576" height="360" />
</UCarousel>
<Placeholder v-else class="w-full h-full aspect-video" />
</UPageSection>
</div>
</template>

View File

@@ -0,0 +1,31 @@
<script setup lang="ts">
const { data: page } = await useAsyncData('terms', () => queryCollection('content').path('/pro/terms').first())
if (!page.value) {
throw createError({ statusCode: 404, statusMessage: 'Page not found', fatal: true })
}
const title = page.value.title
const description = page.value.description
useSeoMeta({
title,
description,
ogTitle: `${title} - Nuxt UI Pro`,
ogDescription: description
})
defineOgImageComponent('Docs', {
headline: 'Pro'
})
</script>
<template>
<UContainer>
<UPage v-if="page">
<UPageHeader :title="page.title" :description="page.description" />
<UPageBody prose>
<ContentRenderer v-if="page.body" :value="page" />
</UPageBody>
</UPage>
</UContainer>
</template>