-
+
+
{{ child.label }}
-
+
{{ child.description }}
diff --git a/docs/app/components/content/examples/navigation-menu/NavigationMenuCustomSlotExample.vue b/docs/app/components/content/examples/navigation-menu/NavigationMenuCustomSlotExample.vue
index cfcd007d..dded998b 100644
--- a/docs/app/components/content/examples/navigation-menu/NavigationMenuCustomSlotExample.vue
+++ b/docs/app/components/content/examples/navigation-menu/NavigationMenuCustomSlotExample.vue
@@ -19,7 +19,7 @@ const items = [
-
+
diff --git a/docs/app/components/content/examples/navigation-menu/NavigationMenuModelValueExample.vue b/docs/app/components/content/examples/navigation-menu/NavigationMenuModelValueExample.vue
index 2820b6e6..1e88eb4a 100644
--- a/docs/app/components/content/examples/navigation-menu/NavigationMenuModelValueExample.vue
+++ b/docs/app/components/content/examples/navigation-menu/NavigationMenuModelValueExample.vue
@@ -111,5 +111,5 @@ defineShortcuts({
-
+
diff --git a/docs/app/components/content/examples/popover/PopoverDismissibleExample.vue b/docs/app/components/content/examples/popover/PopoverDismissibleExample.vue
new file mode 100644
index 00000000..cbef33e2
--- /dev/null
+++ b/docs/app/components/content/examples/popover/PopoverDismissibleExample.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+ Popover non-dismissible
+
+
+
+
+
+
+
+
+
diff --git a/docs/app/components/content/examples/select-menu/SelectMenuCreateItemExample.vue b/docs/app/components/content/examples/select-menu/SelectMenuCreateItemExample.vue
new file mode 100644
index 00000000..151b82b8
--- /dev/null
+++ b/docs/app/components/content/examples/select-menu/SelectMenuCreateItemExample.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
diff --git a/docs/app/components/content/examples/select-menu/SelectMenuFilterFieldsExample.vue b/docs/app/components/content/examples/select-menu/SelectMenuFilterFieldsExample.vue
index 290294d9..ed2c6c4e 100644
--- a/docs/app/components/content/examples/select-menu/SelectMenuFilterFieldsExample.vue
+++ b/docs/app/components/content/examples/select-menu/SelectMenuFilterFieldsExample.vue
@@ -16,7 +16,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
{{ item.label }}
-
+
{{ item.email }}
diff --git a/docs/app/components/content/examples/select-menu/SelectMenuFilterExample.vue b/docs/app/components/content/examples/select-menu/SelectMenuIgnoreFilterExample.vue
similarity index 97%
rename from docs/app/components/content/examples/select-menu/SelectMenuFilterExample.vue
rename to docs/app/components/content/examples/select-menu/SelectMenuIgnoreFilterExample.vue
index 5778ca08..e16f131e 100644
--- a/docs/app/components/content/examples/select-menu/SelectMenuFilterExample.vue
+++ b/docs/app/components/content/examples/select-menu/SelectMenuIgnoreFilterExample.vue
@@ -20,7 +20,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
v-model:search-term="searchTerm"
:items="users || []"
:loading="status === 'pending'"
- :filter="false"
+ ignore-filter
icon="i-lucide-user"
placeholder="Select user"
class="w-48"
diff --git a/docs/app/components/content/examples/select/SelectFetchExample.vue b/docs/app/components/content/examples/select/SelectFetchExample.vue
index f331fc03..42de0e06 100644
--- a/docs/app/components/content/examples/select/SelectFetchExample.vue
+++ b/docs/app/components/content/examples/select/SelectFetchExample.vue
@@ -26,7 +26,7 @@ function getUserAvatar(value: string) {
diff --git a/docs/app/components/content/examples/select/SelectItemsChipExample.vue b/docs/app/components/content/examples/select/SelectItemsChipExample.vue
index ced4c4d1..ec7069c8 100644
--- a/docs/app/components/content/examples/select/SelectItemsChipExample.vue
+++ b/docs/app/components/content/examples/select/SelectItemsChipExample.vue
@@ -34,7 +34,7 @@ function getChip(value: string) {
()
+
+const emit = defineEmits(['success'])
+
+function onSuccess() {
+ emit('success')
+}
@@ -13,7 +19,10 @@ defineProps<{
-
+
+
+
+
diff --git a/docs/app/components/content/examples/slideover/SlideoverProgrammaticExample.vue b/docs/app/components/content/examples/slideover/SlideoverProgrammaticExample.vue
index 4c681d68..f68d3385 100644
--- a/docs/app/components/content/examples/slideover/SlideoverProgrammaticExample.vue
+++ b/docs/app/components/content/examples/slideover/SlideoverProgrammaticExample.vue
@@ -3,6 +3,7 @@ import { LazySlideoverExample } from '#components'
const count = ref(0)
+const toast = useToast()
const slideover = useSlideover()
function open() {
@@ -10,7 +11,13 @@ function open() {
slideover.open(LazySlideoverExample, {
title: 'Slideover',
- count: count.value
+ count: count.value,
+ onSuccess() {
+ toast.add({
+ title: 'Success !',
+ id: 'modal-success'
+ })
+ }
})
}
diff --git a/docs/app/components/content/examples/stepper/StepperContentSlotExample.vue b/docs/app/components/content/examples/stepper/StepperContentSlotExample.vue
new file mode 100644
index 00000000..2836a63f
--- /dev/null
+++ b/docs/app/components/content/examples/stepper/StepperContentSlotExample.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+ This is the {{ item?.title }} step.
+
+
+
+
diff --git a/docs/app/components/content/examples/stepper/StepperCustomSlotExample.vue b/docs/app/components/content/examples/stepper/StepperCustomSlotExample.vue
new file mode 100644
index 00000000..a16ae362
--- /dev/null
+++ b/docs/app/components/content/examples/stepper/StepperCustomSlotExample.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+ Address
+
+
+
+
+
+ Shipping
+
+
+
+
+
+ Checkout
+
+
+
+
diff --git a/docs/app/components/content/examples/stepper/StepperModelValueExample.vue b/docs/app/components/content/examples/stepper/StepperModelValueExample.vue
new file mode 100644
index 00000000..cfd921cf
--- /dev/null
+++ b/docs/app/components/content/examples/stepper/StepperModelValueExample.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+ This is the {{ item?.title }} step.
+
+
+
+
diff --git a/docs/app/components/content/examples/stepper/StepperWithControlsExample.vue b/docs/app/components/content/examples/stepper/StepperWithControlsExample.vue
new file mode 100644
index 00000000..faee67c7
--- /dev/null
+++ b/docs/app/components/content/examples/stepper/StepperWithControlsExample.vue
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+ Prev
+
+
+
+ Next
+
+
+
+
diff --git a/docs/app/components/content/examples/table/TableColumnFiltersExample.vue b/docs/app/components/content/examples/table/TableColumnFiltersExample.vue
index 0176b414..1bda2f85 100644
--- a/docs/app/components/content/examples/table/TableColumnFiltersExample.vue
+++ b/docs/app/components/content/examples/table/TableColumnFiltersExample.vue
@@ -100,7 +100,7 @@ const columnFilters = ref([{
-
+
, label: string) {
variant: 'ghost',
label,
icon: isSorted ? (isSorted === 'asc' ? 'i-lucide-arrow-up-narrow-wide' : 'i-lucide-arrow-down-wide-narrow') : 'i-lucide-arrow-up-down',
- class: '-mx-2.5 data-[state=open]:bg-[var(--ui-bg-elevated)]'
+ class: '-mx-2.5 data-[state=open]:bg-(--ui-bg-elevated)'
}))
}
diff --git a/docs/app/components/content/examples/table/TableColumnVisibilityExample.vue b/docs/app/components/content/examples/table/TableColumnVisibilityExample.vue
index e5854eb8..abcd5afd 100644
--- a/docs/app/components/content/examples/table/TableColumnVisibilityExample.vue
+++ b/docs/app/components/content/examples/table/TableColumnVisibilityExample.vue
@@ -100,7 +100,7 @@ const columnVisibility = ref({
-
+
+
-
+
{{ table?.tableApi?.getFilteredSelectedRowModel().rows.length || 0 }} of
{{ table?.tableApi?.getFilteredRowModel().rows.length || 0 }} row(s) selected.
diff --git a/docs/app/components/content/examples/table/TableFetchExample.vue b/docs/app/components/content/examples/table/TableFetchExample.vue
index 7b7f1dfc..4168f925 100644
--- a/docs/app/components/content/examples/table/TableFetchExample.vue
+++ b/docs/app/components/content/examples/table/TableFetchExample.vue
@@ -35,7 +35,7 @@ const columns: TableColumn
[] = [{
size: 'lg'
}),
h('div', undefined, [
- h('p', { class: 'font-medium text-[var(--ui-text-highlighted)]' }, row.original.name),
+ h('p', { class: 'font-medium text-(--ui-text-highlighted)' }, row.original.name),
h('p', { class: '' }, `@${row.original.username}`)
])
])
diff --git a/docs/app/components/content/examples/table/TableGlobalFilterExample.vue b/docs/app/components/content/examples/table/TableGlobalFilterExample.vue
index ac784651..fe7e1306 100644
--- a/docs/app/components/content/examples/table/TableGlobalFilterExample.vue
+++ b/docs/app/components/content/examples/table/TableGlobalFilterExample.vue
@@ -90,14 +90,12 @@ const columns: TableColumn[] = [{
}
}]
-const table = useTemplateRef('table')
-
const globalFilter = ref('45')
-
+
+import { getPaginationRowModel } from '@tanstack/vue-table'
+import type { TableColumn } from '@nuxt/ui'
+
+const table = useTemplateRef('table')
+
+type Payment = {
+ id: string
+ date: string
+ email: string
+ amount: number
+}
+const data = ref([{
+ id: '4600',
+ date: '2024-03-11T15:30:00',
+ email: 'james.anderson@example.com',
+ amount: 594
+}, {
+ id: '4599',
+ date: '2024-03-11T10:10:00',
+ email: 'mia.white@example.com',
+ amount: 276
+}, {
+ id: '4598',
+ date: '2024-03-11T08:50:00',
+ email: 'william.brown@example.com',
+ amount: 315
+}, {
+ id: '4597',
+ date: '2024-03-10T19:45:00',
+ email: 'emma.davis@example.com',
+ amount: 529
+}, {
+ id: '4596',
+ date: '2024-03-10T15:55:00',
+ email: 'ethan.harris@example.com',
+ amount: 639
+}, {
+ id: '4595',
+ date: '2024-03-10T13:20:00',
+ email: 'sophia.miller@example.com',
+ amount: 428
+}, {
+ id: '4594',
+ date: '2024-03-10T11:05:00',
+ email: 'noah.wilson@example.com',
+ amount: 673
+}, {
+ id: '4593',
+ date: '2024-03-09T22:15:00',
+ email: 'olivia.jones@example.com',
+ amount: 382
+}, {
+ id: '4592',
+ date: '2024-03-09T20:30:00',
+ email: 'liam.taylor@example.com',
+ amount: 547
+}, {
+ id: '4591',
+ date: '2024-03-09T18:45:00',
+ email: 'ava.thomas@example.com',
+ amount: 291
+}, {
+ id: '4590',
+ date: '2024-03-09T16:20:00',
+ email: 'lucas.martin@example.com',
+ amount: 624
+}, {
+ id: '4589',
+ date: '2024-03-09T14:10:00',
+ email: 'isabella.clark@example.com',
+ amount: 438
+}, {
+ id: '4588',
+ date: '2024-03-09T12:05:00',
+ email: 'mason.rodriguez@example.com',
+ amount: 583
+}, {
+ id: '4587',
+ date: '2024-03-09T10:30:00',
+ email: 'sophia.lee@example.com',
+ amount: 347
+}, {
+ id: '4586',
+ date: '2024-03-09T08:15:00',
+ email: 'ethan.walker@example.com',
+ amount: 692
+}, {
+ id: '4585',
+ date: '2024-03-08T23:40:00',
+ email: 'amelia.hall@example.com',
+ amount: 419
+}, {
+ id: '4584',
+ date: '2024-03-08T21:25:00',
+ email: 'oliver.young@example.com',
+ amount: 563
+}, {
+ id: '4583',
+ date: '2024-03-08T19:50:00',
+ email: 'aria.king@example.com',
+ amount: 328
+}, {
+ id: '4582',
+ date: '2024-03-08T17:35:00',
+ email: 'henry.wright@example.com',
+ amount: 647
+}, {
+ id: '4581',
+ date: '2024-03-08T15:20:00',
+ email: 'luna.lopez@example.com',
+ amount: 482
+}])
+const columns: TableColumn[] = [{
+ accessorKey: 'id',
+ header: '#',
+ cell: ({ row }) => `#${row.getValue('id')}`
+}, {
+ accessorKey: 'date',
+ header: 'Date',
+ cell: ({ row }) => {
+ return new Date(row.getValue('date')).toLocaleString('en-US', {
+ day: 'numeric',
+ month: 'short',
+ hour: '2-digit',
+ minute: '2-digit',
+ hour12: false
+ })
+ }
+}, {
+ accessorKey: 'email',
+ header: 'Email'
+}, {
+ accessorKey: 'amount',
+ header: () => h('div', { class: 'text-right' }, 'Amount'),
+ cell: ({ row }) => {
+ const amount = Number.parseFloat(row.getValue('amount'))
+ const formatted = new Intl.NumberFormat('en-US', {
+ style: 'currency',
+ currency: 'EUR'
+ }).format(amount)
+ return h('div', { class: 'text-right font-medium' }, formatted)
+ }
+}]
+
+const pagination = ref({
+ pageIndex: 0,
+ pageSize: 5
+})
+
+
+
+
+
+
+
+ table?.tableApi?.setPageIndex(p - 1)"
+ />
+
+
+
diff --git a/docs/app/components/content/examples/table/TableRowExpandableExample.vue b/docs/app/components/content/examples/table/TableRowExpandableExample.vue
index a837b9d2..cbaf7cc4 100644
--- a/docs/app/components/content/examples/table/TableRowExpandableExample.vue
+++ b/docs/app/components/content/examples/table/TableRowExpandableExample.vue
@@ -111,7 +111,7 @@ const expanded = ref({ 1: true })
v-model:expanded="expanded"
:data="data"
:columns="columns"
- :ui="{ tr: 'data-[expanded=true]:bg-[var(--ui-bg-elevated)]/50' }"
+ :ui="{ tr: 'data-[expanded=true]:bg-(--ui-bg-elevated)/50' }"
class="flex-1"
>
diff --git a/docs/app/components/content/examples/table/TableRowSelectionExample.vue b/docs/app/components/content/examples/table/TableRowSelectionExample.vue
index 69980edd..a29a459e 100644
--- a/docs/app/components/content/examples/table/TableRowSelectionExample.vue
+++ b/docs/app/components/content/examples/table/TableRowSelectionExample.vue
@@ -48,14 +48,13 @@ const data = ref([{
const columns: TableColumn[] = [{
id: 'select',
header: ({ table }) => h(UCheckbox, {
- 'modelValue': table.getIsAllPageRowsSelected(),
- 'indeterminate': table.getIsSomePageRowsSelected(),
- 'onUpdate:modelValue': (value: boolean) => table.toggleAllPageRowsSelected(!!value),
+ 'modelValue': table.getIsSomePageRowsSelected() ? 'indeterminate' : table.getIsAllPageRowsSelected(),
+ 'onUpdate:modelValue': (value: boolean | 'indeterminate') => table.toggleAllPageRowsSelected(!!value),
'ariaLabel': 'Select all'
}),
cell: ({ row }) => h(UCheckbox, {
'modelValue': row.getIsSelected(),
- 'onUpdate:modelValue': (value: boolean) => row.toggleSelected(!!value),
+ 'onUpdate:modelValue': (value: boolean | 'indeterminate') => row.toggleSelected(!!value),
'ariaLabel': 'Select row'
})
}, {
@@ -114,7 +113,7 @@ const rowSelection = ref({ 1: true })
:columns="columns"
/>
-
+
{{ table?.tableApi?.getFilteredSelectedRowModel().rows.length || 0 }} of
{{ table?.tableApi?.getFilteredRowModel().rows.length || 0 }} row(s) selected.
diff --git a/docs/app/components/content/examples/table/TableSlotsExample.vue b/docs/app/components/content/examples/table/TableSlotsExample.vue
index 54a39fe9..3a4b5a97 100644
--- a/docs/app/components/content/examples/table/TableSlotsExample.vue
+++ b/docs/app/components/content/examples/table/TableSlotsExample.vue
@@ -97,7 +97,7 @@ function getDropdownActions(user: User): DropdownMenuItem[][] {
-
+
{{ row.original.name }}
diff --git a/docs/app/components/content/examples/tabs/TabsCustomSlotExample.vue b/docs/app/components/content/examples/tabs/TabsCustomSlotExample.vue
index 36e7bc13..af6073fb 100644
--- a/docs/app/components/content/examples/tabs/TabsCustomSlotExample.vue
+++ b/docs/app/components/content/examples/tabs/TabsCustomSlotExample.vue
@@ -26,7 +26,7 @@ const state = reactive({
-
+
{{ item.description }}
@@ -43,7 +43,7 @@ const state = reactive({
-
+
{{ item.description }}
diff --git a/docs/app/components/content/examples/toast/ToastActionsExample.vue b/docs/app/components/content/examples/toast/ToastActionsExample.vue
index aa3dc7fe..577192a3 100644
--- a/docs/app/components/content/examples/toast/ToastActionsExample.vue
+++ b/docs/app/components/content/examples/toast/ToastActionsExample.vue
@@ -10,7 +10,7 @@ function showToast() {
title: 'Uh oh! Something went wrong.',
description: props.description,
actions: [{
- icon: 'i-lucide-refresh-ccw',
+ icon: 'i-lucide-refresh-cw',
label: 'Retry',
color: 'neutral',
variant: 'outline',
diff --git a/docs/app/components/content/examples/toast/ToastOrientationExample.vue b/docs/app/components/content/examples/toast/ToastOrientationExample.vue
new file mode 100644
index 00000000..3ec85118
--- /dev/null
+++ b/docs/app/components/content/examples/toast/ToastOrientationExample.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
diff --git a/docs/app/components/content/examples/toaster/ToasterDurationExample.vue b/docs/app/components/content/examples/toaster/ToasterDurationExample.vue
index fe42c10c..9d311fa0 100644
--- a/docs/app/components/content/examples/toaster/ToasterDurationExample.vue
+++ b/docs/app/components/content/examples/toaster/ToasterDurationExample.vue
@@ -7,10 +7,10 @@ const appConfig = useAppConfig()
@@ -18,7 +18,7 @@ const appConfig = useAppConfig()
v-model="appConfig.toaster.duration"
color="neutral"
variant="soft"
- :ui="{ base: 'rounded-[var(--ui-radius)] rounded-l-none min-w-12' }"
+ :ui="{ base: 'rounded-(--ui-radius) rounded-l-none min-w-12' }"
/>
diff --git a/docs/app/components/content/examples/toaster/ToasterExpandExample.vue b/docs/app/components/content/examples/toaster/ToasterExpandExample.vue
index 2e606082..4a33bc61 100644
--- a/docs/app/components/content/examples/toaster/ToasterExpandExample.vue
+++ b/docs/app/components/content/examples/toaster/ToasterExpandExample.vue
@@ -7,10 +7,10 @@ const appConfig = useAppConfig()
@@ -19,7 +19,7 @@ const appConfig = useAppConfig()
:items="[true, false]"
color="neutral"
variant="soft"
- class="rounded-[var(--ui-radius)] rounded-l-none min-w-12"
+ class="rounded-(--ui-radius) rounded-l-none min-w-12"
:search-input="false"
/>
diff --git a/docs/app/components/content/examples/toaster/ToasterPositionExample.vue b/docs/app/components/content/examples/toaster/ToasterPositionExample.vue
index 7fa747e9..f7e0c566 100644
--- a/docs/app/components/content/examples/toaster/ToasterPositionExample.vue
+++ b/docs/app/components/content/examples/toaster/ToasterPositionExample.vue
@@ -10,10 +10,10 @@ const appConfig = useAppConfig()
@@ -22,7 +22,7 @@ const appConfig = useAppConfig()
:items="positions"
color="neutral"
variant="soft"
- class="rounded-[var(--ui-radius)] rounded-l-none min-w-12"
+ class="rounded-(--ui-radius) rounded-l-none min-w-12"
:search-input="false"
/>
diff --git a/docs/app/components/og-image/OgImageDocs.vue b/docs/app/components/og-image/OgImageDocs.vue
index 35bcf51c..f9f31bfd 100644
--- a/docs/app/components/og-image/OgImageDocs.vue
+++ b/docs/app/components/og-image/OgImageDocs.vue
@@ -56,7 +56,7 @@ defineProps({
{{ title }}
-
+
{{ description.slice(0, 200) }}
diff --git a/docs/app/components/theme-picker/ThemePicker.vue b/docs/app/components/theme-picker/ThemePicker.vue
index 9c49c276..fd3e06cf 100644
--- a/docs/app/components/theme-picker/ThemePicker.vue
+++ b/docs/app/components/theme-picker/ThemePicker.vue
@@ -1,3 +1,65 @@
+
+
@@ -7,7 +69,7 @@
:variant="open ? 'soft' : 'ghost'"
square
aria-label="Color picker"
- :ui="{ leadingIcon: 'text-[var(--ui-primary)]' }"
+ :ui="{ leadingIcon: 'text-(--ui-primary)' }"
/>
@@ -18,12 +80,22 @@
+
+
+
+
+
@@ -68,12 +140,12 @@
Theme
-
+
@@ -81,60 +153,3 @@
-
-
diff --git a/docs/app/components/theme-picker/ThemePickerButton.vue b/docs/app/components/theme-picker/ThemePickerButton.vue
index bc010431..7dc4a49e 100644
--- a/docs/app/components/theme-picker/ThemePickerButton.vue
+++ b/docs/app/components/theme-picker/ThemePickerButton.vue
@@ -1,25 +1,3 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/app/composables/useContentNavigation.ts b/docs/app/composables/useContentNavigation.ts
new file mode 100644
index 00000000..df0c0ebe
--- /dev/null
+++ b/docs/app/composables/useContentNavigation.ts
@@ -0,0 +1,58 @@
+import type { ContentNavigationItem } from '@nuxt/content'
+
+function processNavigationItem(item: ContentNavigationItem, parent?: ContentNavigationItem): any {
+ if (item.shadow) {
+ return item.children?.flatMap(child => processNavigationItem(child, item))
+ }
+
+ return {
+ ...item,
+ title: parent?.title && parent.title !== 'Pro' ? parent.title : item.title,
+ badge: parent?.badge || item.badge,
+ class: [item.framework && `${item.framework}-only`, item.module && `${item.module}-only`].filter(Boolean),
+ children: item.children?.length ? item.children?.flatMap(child => processNavigationItem(child)) : undefined
+ }
+}
+
+function processNavigationItemIcon(item: ContentNavigationItem) {
+ let icon = item.icon
+ if (item.path.startsWith('/components')) {
+ icon = item.module === 'ui-pro' ? 'i-lucide-panels-top-left' : 'i-lucide-box'
+ }
+ if (item.path.startsWith('/composables')) {
+ icon = 'i-lucide-square-function'
+ }
+ return {
+ ...item,
+ icon
+ }
+}
+
+export const useContentNavigation = (navigation: Ref
) => {
+ const { framework, module } = useSharedData()
+
+ const mappedNavigation = computed(() => navigation.value?.map(item => processNavigationItem(item)))
+
+ const filteredNavigation = computed(() => mappedNavigation.value?.map((item) => {
+ return {
+ ...item,
+ children: item.children?.filter((child: any) => {
+ if (child.framework && child.framework !== framework.value) {
+ return false
+ }
+ if (child.module && child.module !== module.value) {
+ return false
+ }
+ return true
+ })?.map(processNavigationItemIcon)
+ }
+ }))
+
+ return {
+ mappedNavigation: computed(() => mappedNavigation.value?.map(item => ({
+ ...item,
+ children: item.children?.map((child: any) => ({ ...child, icon: undefined }))
+ }))),
+ filteredNavigation
+ }
+}
diff --git a/docs/app/composables/useLinks.ts b/docs/app/composables/useLinks.ts
new file mode 100644
index 00000000..0500c11a
--- /dev/null
+++ b/docs/app/composables/useLinks.ts
@@ -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))
+}
diff --git a/docs/app/composables/useSharedData.ts b/docs/app/composables/useSharedData.ts
new file mode 100644
index 00000000..a70408a2
--- /dev/null
+++ b/docs/app/composables/useSharedData.ts
@@ -0,0 +1,48 @@
+export function useSharedData() {
+ const framework = useCookie('nuxt-ui-framework', { default: () => 'nuxt' })
+ const frameworks = computed(() => [{
+ label: 'Nuxt',
+ icon: 'i-simple-icons-nuxtdotjs',
+ value: 'nuxt',
+ onSelect: () => framework.value = 'nuxt'
+ }, {
+ label: 'Vue',
+ icon: 'i-simple-icons-vuedotjs',
+ value: 'vue',
+ disabled: module.value === 'ui-pro',
+ onSelect: () => {
+ if (module.value === 'ui-pro') {
+ return
+ }
+
+ framework.value = 'vue'
+ }
+ }].map(f => ({ ...f, active: framework.value === f.value })))
+
+ const module = useCookie('nuxt-ui-module', { default: () => 'ui' })
+ const modules = computed(() => [{
+ label: 'UI',
+ icon: 'i-lucide-box',
+ value: 'ui',
+ onSelect: () => module.value = 'ui'
+ }, {
+ label: 'UI Pro',
+ icon: 'i-lucide-panels-top-left',
+ value: 'ui-pro',
+ disabled: framework.value === 'vue',
+ onSelect: () => {
+ if (framework.value === 'vue') {
+ return
+ }
+
+ module.value = 'ui-pro'
+ }
+ }].map(m => ({ ...m, active: module.value === m.value })))
+
+ return {
+ framework,
+ frameworks,
+ module,
+ modules
+ }
+}
diff --git a/docs/app/error.vue b/docs/app/error.vue
index 791fef1b..bdef3f32 100644
--- a/docs/app/error.vue
+++ b/docs/app/error.vue
@@ -1,46 +1,34 @@
-
+
-
+
-
+
diff --git a/docs/app/layouts/docs.vue b/docs/app/layouts/docs.vue
index 41e98939..876c57c1 100644
--- a/docs/app/layouts/docs.vue
+++ b/docs/app/layouts/docs.vue
@@ -10,7 +10,22 @@ const navigation = inject[>('navigation')
-
+
+ ]
+
+
+
+
+
+
+
+
+ {{ link.title }}
+
+ PRO
+
+
+
diff --git a/docs/app/pages/[...slug].vue b/docs/app/pages/[...slug].vue
index bacadaaa..afc556e4 100644
--- a/docs/app/pages/[...slug].vue
+++ b/docs/app/pages/[...slug].vue
@@ -3,6 +3,7 @@ import type { ContentNavigationItem } from '@nuxt/content'
import { findPageBreadcrumb, mapContentNavigation } from '#ui-pro/utils/content'
const route = useRoute()
+const { framework, module } = useSharedData()
definePageMeta({
layout: 'docs'
@@ -13,18 +14,60 @@ if (!page.value) {
throw createError({ statusCode: 404, statusMessage: 'Page not found', fatal: true })
}
-const { data: surround } = await useAsyncData(`${route.path}-surround`, () => queryCollectionItemSurroundings('content', route.path, {
- fields: ['description']
-}))
+// Update the framework/module if the page has different ones
+watch(page, () => {
+ if (page.value?.framework && page.value?.framework !== framework.value) {
+ framework.value = page.value?.framework as string
+ }
+ if (page.value?.module && page.value?.module !== module.value) {
+ module.value = page.value?.module as string
+ }
+}, { immediate: true })
+
+const { data: surround } = await useAsyncData(`${route.path}-surround`, () => {
+ return queryCollectionItemSurroundings('content', route.path, {
+ fields: ['description']
+ }).orWhere(group => group.where('framework', '=', framework.value).where('framework', 'IS NULL'))
+ .orWhere(group => group.where('module', '=', module.value).where('module', 'IS NULL'))
+}, {
+ watch: [framework, module]
+})
const navigation = inject[>('navigation')
const breadcrumb = computed(() => mapContentNavigation(findPageBreadcrumb(navigation?.value, page.value)).map(({ icon, ...link }) => link))
+if (!import.meta.prerender) {
+ // Redirect to the correct framework version if the page is not the current framework
+ watch(framework, () => {
+ if (page.value?.framework && page.value?.framework !== framework.value) {
+ if (route.path.endsWith(`/${page.value?.framework}`)) {
+ navigateTo(`${route.path.split('/').slice(0, -1).join('/')}/${framework.value}`)
+ } else {
+ navigateTo(`/getting-started`)
+ }
+ }
+ })
+
+ // Redirect to the correct module version if the page is not the current module
+ watch(module, () => {
+ if (page.value?.module && page.value?.module !== module.value) {
+ if (page.value?.module === 'ui-pro' && route.path.includes('/pro')) {
+ navigateTo(`${route.path.replace('/pro', '')}`)
+ } else if (page.value?.module === 'ui' && !route.path.includes('/pro')) {
+ navigateTo(`${route.path.replace(`/${framework.value}`, '')}/pro/${framework.value}`)
+ } else {
+ navigateTo(`/getting-started`)
+ }
+ }
+ })
+}
+
+const type = page.value?.path.includes('components') ? 'Vue Component ' : page.value?.path.includes('composables') ? 'Vue Composable ' : ''
useSeoMeta({
- titleTemplate: '%s - Nuxt UI v3',
- title: typeof page.value.navigation === 'object' ? page.value.navigation.title : page.value.title,
- ogTitle: `${typeof page.value.navigation === 'object' ? page.value.navigation.title : page.value.title} - Nuxt UI v3`,
+ titleTemplate: `%s ${type}- Nuxt UI ${page.value.module === 'ui-pro' ? 'Pro' : ''} v3${page.value.framework === 'vue' ? ' for Vue' : ''}`,
+ title: page.value.navigation?.title ? page.value.navigation.title : page.value.title,
+ ogTitle: `${page.value.navigation?.title ? page.value.navigation.title : page.value.title} ${type}- Nuxt UI ${page.value.module === 'ui-pro' ? 'Pro' : ''} v3${page.value.framework === 'vue' ? ' for Vue' : ''}`,
description: page.value.description,
ogDescription: page.value.description
})
@@ -36,13 +79,21 @@ defineOgImageComponent('Docs', {
const communityLinks = computed(() => [{
icon: 'i-lucide-file-pen',
label: 'Edit this page',
- to: `https://github.com/nuxt/ui/edit/v3/docs/content/${page?.value?.stem}.md`,
+ to: `https://github.com/nuxt/${page.value?.module === 'ui-pro' ? 'ui-pro' : 'ui'}/edit/v3/docs/content/${page?.value?.stem}.md`,
target: '_blank'
}, {
icon: 'i-lucide-star',
label: 'Star on GitHub',
- to: 'https://github.com/nuxt/ui',
+ to: `https://github.com/nuxt/${page.value?.module === 'ui-pro' ? 'ui-pro' : 'ui'}`,
target: '_blank'
+}, {
+ icon: 'i-lucide-life-buoy',
+ label: 'Contribution',
+ to: '/getting-started/contribution'
+}, {
+ label: 'Roadmap',
+ icon: 'i-lucide-map',
+ to: '/roadmap'
}])
// const resourcesLinks = [{
@@ -74,27 +125,13 @@ const communityLinks = computed(() => [{
-
-
-
-
-
+
@@ -107,7 +144,7 @@ const communityLinks = computed(() => [{
-
+
diff --git a/docs/app/pages/examples/[...slug].vue b/docs/app/pages/examples/[...slug].vue
index b2dd857d..71fe2be3 100644
--- a/docs/app/pages/examples/[...slug].vue
+++ b/docs/app/pages/examples/[...slug].vue
@@ -2,10 +2,20 @@
const route = useRoute()
const name = route.params.slug?.[0]
+
+const width = computed(() => route.query.width && Number.parseInt(route.query.width as string) > 0 ? `${Number.parseInt(route.query.width as string) - 2}px` : '864px')
- ]
-
+
+
+
+
diff --git a/docs/app/pages/figma/.figma.yml b/docs/app/pages/figma/.figma.yml
new file mode 100644
index 00000000..60f33929
--- /dev/null
+++ b/docs/app/pages/figma/.figma.yml
@@ -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
+
+ {.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.*
diff --git a/docs/app/pages/figma/index.vue b/docs/app/pages/figma/index.vue
new file mode 100644
index 00000000..c22dcb28
--- /dev/null
+++ b/docs/app/pages/figma/index.vue
@@ -0,0 +1,288 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Watch 1 min demo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+ {{ step.title }}
+
+
+ {{ step.description }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/app/pages/pro/.content/pricing.yml b/docs/app/pages/pro/.content/pricing.yml
new file mode 100644
index 00000000..89277c37
--- /dev/null
+++ b/docs/app/pages/pro/.content/pricing.yml
@@ -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.
diff --git a/docs/app/pages/pro/.content/pro.yml b/docs/app/pages/pro/.content/pro.yml
new file mode 100644
index 00000000..54491b5a
--- /dev/null
+++ b/docs/app/pages/pro/.content/pro.yml
@@ -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 UI’s 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]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ```
+ - 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]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ```
+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
diff --git a/docs/app/pages/pro/.content/templates.yml b/docs/app/pages/pro/.content/templates.yml
new file mode 100644
index 00000000..eeb3d537
--- /dev/null
+++ b/docs/app/pages/pro/.content/templates.yml
@@ -0,0 +1,112 @@
+title: Official Nuxt UI Pro Templates
+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.'
+hero:
+ title: Official Nuxt UI [Pro]{.text-(--ui-primary)} Templates
+ 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://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://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://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://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
diff --git a/docs/app/pages/pro/activate.vue b/docs/app/pages/pro/activate.vue
new file mode 100644
index 00000000..a0877a26
--- /dev/null
+++ b/docs/app/pages/pro/activate.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Activate the license
+
+
+
+ The GitHub invitation to
+ Nuxt UI Pro repository
+ has been sent and
+ you can now use your license key in your projects, checkout the
+
+ installation guide
+
+
+
+
+
+
+
+ If you purchased a license with multiple seats, activate the license key for each of your team members.
+
+
+
+
diff --git a/docs/app/pages/pro/index.vue b/docs/app/pages/pro/index.vue
new file mode 100644
index 00000000..a109abd2
--- /dev/null
+++ b/docs/app/pages/pro/index.vue
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/app/pages/pro/pricing.vue b/docs/app/pages/pro/pricing.vue
new file mode 100644
index 00000000..457ae033
--- /dev/null
+++ b/docs/app/pages/pro/pricing.vue
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/app/pages/pro/templates.vue b/docs/app/pages/pro/templates.vue
new file mode 100644
index 00000000..bfaf2e21
--- /dev/null
+++ b/docs/app/pages/pro/templates.vue
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/app/pages/pro/terms.vue b/docs/app/pages/pro/terms.vue
new file mode 100644
index 00000000..4b120369
--- /dev/null
+++ b/docs/app/pages/pro/terms.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/app/pages/roadmap.vue b/docs/app/pages/roadmap.vue
index f17095c1..7c034380 100644
--- a/docs/app/pages/roadmap.vue
+++ b/docs/app/pages/roadmap.vue
@@ -20,7 +20,7 @@ const src = computed(() => `https://volta.net/embed/${token}?theme=${colorMode.v
-