diff --git a/cli/templates.mjs b/cli/templates.mjs
index e6f28458..4fc11c96 100644
--- a/cli/templates.mjs
+++ b/cli/templates.mjs
@@ -31,13 +31,10 @@ const component = ({ name, primitive, pro, prose, content }) => {
? `
@@ -71,22 +73,16 @@ const ui = ${camelName}()
`
: `
diff --git a/docs/package.json b/docs/package.json
index b0c9dcf6..bcefadff 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -11,7 +11,7 @@
"@nuxt/content": "^3.4.0",
"@nuxt/image": "^1.10.0",
"@nuxt/ui": "latest",
- "@nuxt/ui-pro": "https://pkg.pr.new/@nuxt/ui-pro@6b838c4",
+ "@nuxt/ui-pro": "https://pkg.pr.new/@nuxt/ui-pro@655b0bd",
"@nuxthub/core": "^0.8.24",
"@nuxtjs/plausible": "^1.2.0",
"@octokit/rest": "^21.1.1",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 22be0c77..e12e5b8f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -246,8 +246,8 @@ importers:
specifier: workspace:*
version: link:..
'@nuxt/ui-pro':
- specifier: https://pkg.pr.new/@nuxt/ui-pro@6b838c4
- version: https://pkg.pr.new/@nuxt/ui-pro@6b838c4(@babel/parser@7.27.0)(joi@17.13.3)(magicast@0.3.5)(superstruct@2.0.2)(typescript@5.8.3)(valibot@1.0.0(typescript@5.8.3))(vue@3.5.13(typescript@5.8.3))(yup@1.6.1)(zod@3.24.2)
+ specifier: https://pkg.pr.new/@nuxt/ui-pro@655b0bd
+ version: https://pkg.pr.new/@nuxt/ui-pro@655b0bd(@babel/parser@7.27.0)(joi@17.13.3)(magicast@0.3.5)(superstruct@2.0.2)(typescript@5.8.3)(valibot@1.0.0(typescript@5.8.3))(vue@3.5.13(typescript@5.8.3))(yup@1.6.1)(zod@3.24.2)
'@nuxthub/core':
specifier: ^0.8.24
version: 0.8.24(db0@0.3.1(better-sqlite3@11.9.1))(ioredis@5.6.0)(magicast@0.3.5)(vite@6.2.6(@types/node@22.13.14)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))
@@ -1484,8 +1484,8 @@ packages:
vitest:
optional: true
- '@nuxt/ui-pro@https://pkg.pr.new/@nuxt/ui-pro@6b838c4':
- resolution: {tarball: https://pkg.pr.new/@nuxt/ui-pro@6b838c4}
+ '@nuxt/ui-pro@https://pkg.pr.new/@nuxt/ui-pro@655b0bd':
+ resolution: {tarball: https://pkg.pr.new/@nuxt/ui-pro@655b0bd}
version: 3.0.2
peerDependencies:
joi: ^17.13.0
@@ -8437,7 +8437,7 @@ snapshots:
- typescript
- yaml
- '@nuxt/ui-pro@https://pkg.pr.new/@nuxt/ui-pro@6b838c4(@babel/parser@7.27.0)(joi@17.13.3)(magicast@0.3.5)(superstruct@2.0.2)(typescript@5.8.3)(valibot@1.0.0(typescript@5.8.3))(vue@3.5.13(typescript@5.8.3))(yup@1.6.1)(zod@3.24.2)':
+ '@nuxt/ui-pro@https://pkg.pr.new/@nuxt/ui-pro@655b0bd(@babel/parser@7.27.0)(joi@17.13.3)(magicast@0.3.5)(superstruct@2.0.2)(typescript@5.8.3)(valibot@1.0.0(typescript@5.8.3))(vue@3.5.13(typescript@5.8.3))(yup@1.6.1)(zod@3.24.2)':
dependencies:
'@ai-sdk/vue': 1.2.7(vue@3.5.13(typescript@5.8.3))(zod@3.24.2)
'@nuxt/kit': 3.16.2(magicast@0.3.5)
diff --git a/src/runtime/components/Accordion.vue b/src/runtime/components/Accordion.vue
index 9c24dcf5..53062033 100644
--- a/src/runtime/components/Accordion.vue
+++ b/src/runtime/components/Accordion.vue
@@ -2,14 +2,10 @@
diff --git a/src/runtime/components/Alert.vue b/src/runtime/components/Alert.vue
index d90bd621..3ee90573 100644
--- a/src/runtime/components/Alert.vue
+++ b/src/runtime/components/Alert.vue
@@ -1,16 +1,10 @@
@@ -80,6 +74,7 @@ import { computed } from 'vue'
import { Primitive } from 'reka-ui'
import { useAppConfig } from '#imports'
import { useLocale } from '../composables/useLocale'
+import { tv } from '../utils/tv'
import UIcon from './Icon.vue'
import UAvatar from './Avatar.vue'
import UButton from './Button.vue'
@@ -91,9 +86,9 @@ const emits = defineEmits()
const slots = defineSlots()
const { t } = useLocale()
-const appConfig = useAppConfig()
+const appConfig = useAppConfig() as Alert['AppConfig']
-const ui = computed(() => alert({
+const ui = computed(() => tv({ extend: tv(theme), ...(appConfig.ui?.alert || {}) })({
color: props.color,
variant: props.variant,
orientation: props.orientation,
diff --git a/src/runtime/components/Avatar.vue b/src/runtime/components/Avatar.vue
index 67fabfc4..0afdc589 100644
--- a/src/runtime/components/Avatar.vue
+++ b/src/runtime/components/Avatar.vue
@@ -1,15 +1,9 @@
diff --git a/src/runtime/components/Button.vue b/src/runtime/components/Button.vue
index d9da929e..93e6e4a6 100644
--- a/src/runtime/components/Button.vue
+++ b/src/runtime/components/Button.vue
@@ -1,36 +1,29 @@
-
+
diff --git a/src/runtime/components/Calendar.vue b/src/runtime/components/Calendar.vue
index 04dd45a7..7aa357d8 100644
--- a/src/runtime/components/Calendar.vue
+++ b/src/runtime/components/Calendar.vue
@@ -1,19 +1,12 @@
diff --git a/src/runtime/components/Carousel.vue b/src/runtime/components/Carousel.vue
index 103dceb7..6014b262 100644
--- a/src/runtime/components/Carousel.vue
+++ b/src/runtime/components/Carousel.vue
@@ -1,6 +1,5 @@
diff --git a/src/runtime/components/ColorPicker.vue b/src/runtime/components/ColorPicker.vue
index 647f41e3..d13e4fc8 100644
--- a/src/runtime/components/ColorPicker.vue
+++ b/src/runtime/components/ColorPicker.vue
@@ -1,18 +1,12 @@
@@ -80,6 +74,8 @@ import { Primitive } from 'reka-ui'
import { useEventListener, useElementBounding, watchThrottled, watchPausable } from '@vueuse/core'
import { isClient } from '@vueuse/shared'
import { ColorTranslator } from 'colortranslator'
+import { useAppConfig } from '#imports'
+import { tv } from '../utils/tv'
const props = withDefaults(defineProps(), {
format: 'hex',
@@ -88,6 +84,12 @@ const props = withDefaults(defineProps(), {
})
const modelValue = defineModel(undefined)
+const appConfig = useAppConfig() as ColorPicker['AppConfig']
+
+const ui = computed(() => tv({ extend: tv(theme), ...(appConfig.ui?.colorPicker || {}) })({
+ size: props.size
+}))
+
const pickedColor = computed({
get() {
try {
@@ -258,10 +260,6 @@ const trackThumbStyle = computed(() => ({
backgroundColor: trackThumbColor.value,
top: `${trackThumbPosition.value.y}%`
}))
-
-const ui = computed(() => colorPicker({
- size: props.size
-}))
diff --git a/src/runtime/components/CommandPalette.vue b/src/runtime/components/CommandPalette.vue
index 6ad53ef2..64b3eb14 100644
--- a/src/runtime/components/CommandPalette.vue
+++ b/src/runtime/components/CommandPalette.vue
@@ -4,16 +4,12 @@ import type { ListboxRootProps, ListboxRootEmits } from 'reka-ui'
import type { FuseResult } from 'fuse.js'
import type { AppConfig } from '@nuxt/schema'
import type { UseFuseOptions } from '@vueuse/integrations/useFuse'
-import _appConfig from '#build/app.config'
import theme from '#build/ui/command-palette'
import type { UseComponentIconsProps } from '../composables/useComponentIcons'
-import { tv } from '../utils/tv'
import type { AvatarProps, ButtonProps, ChipProps, KbdProps, InputProps, LinkProps } from '../types'
-import type { PartialString } from '../types/utils'
+import type { ComponentConfig } from '../types/utils'
-const appConfigCommandPalette = _appConfig as AppConfig & { ui: { commandPalette: Partial } }
-
-const commandPalette = tv({ extend: tv(theme), ...(appConfigCommandPalette.ui?.commandPalette || {}) })
+type CommandPalette = ComponentConfig
export interface CommandPaletteItem extends Omit {
prefix?: string
@@ -115,7 +111,7 @@ export interface CommandPaletteProps extends Pick
+ ui?: CommandPalette['slots']
}
export type CommandPaletteEmits = ListboxRootEmits & {
@@ -126,7 +122,7 @@ type SlotProps = (props: { item: T, index: number }) => any
export type CommandPaletteSlots = {
'empty'(props: { searchTerm?: string }): any
- 'close'(props: { ui: ReturnType }): any
+ 'close'(props: { ui: { [K in keyof Required]: (props?: Record) => string } }): any
'item': SlotProps
'item-leading': SlotProps
'item-label': SlotProps
@@ -144,6 +140,7 @@ import { useFuse } from '@vueuse/integrations/useFuse'
import { useAppConfig } from '#imports'
import { useLocale } from '../composables/useLocale'
import { omit, get } from '../utils'
+import { tv } from '../utils/tv'
import { highlight } from '../utils/fuse'
import { pickLinkProps } from '../utils/link'
import UIcon from './Icon.vue'
@@ -166,13 +163,13 @@ const slots = defineSlots>()
const searchTerm = defineModel('searchTerm', { default: '' })
const { t } = useLocale()
-const appConfig = useAppConfig()
+const appConfig = useAppConfig() as CommandPalette['AppConfig']
const rootProps = useForwardPropsEmits(reactivePick(props, 'as', 'disabled', 'multiple', 'modelValue', 'defaultValue', 'highlightOnHover'), emits)
const inputProps = useForwardProps(reactivePick(props, 'loading', 'loadingIcon'))
// eslint-disable-next-line vue/no-dupe-keys
-const ui = commandPalette()
+const ui = computed(() => tv({ extend: tv(theme), ...(appConfig.ui?.commandPalette || {}) })())
const fuse = computed(() => defu({}, props.fuse, {
fuseOptions: {
diff --git a/src/runtime/components/Container.vue b/src/runtime/components/Container.vue
index 6d89a8e8..ee747eed 100644
--- a/src/runtime/components/Container.vue
+++ b/src/runtime/components/Container.vue
@@ -1,12 +1,9 @@
-
+
diff --git a/src/runtime/components/ContextMenu.vue b/src/runtime/components/ContextMenu.vue
index a51f6cd8..a23c92af 100644
--- a/src/runtime/components/ContextMenu.vue
+++ b/src/runtime/components/ContextMenu.vue
@@ -1,26 +1,12 @@
diff --git a/src/runtime/components/ContextMenuContent.vue b/src/runtime/components/ContextMenuContent.vue
index dae9efd6..43f40e12 100644
--- a/src/runtime/components/ContextMenuContent.vue
+++ b/src/runtime/components/ContextMenuContent.vue
@@ -1,11 +1,11 @@
diff --git a/src/runtime/components/DropdownMenuContent.vue b/src/runtime/components/DropdownMenuContent.vue
index 1cb9d526..bf9125dd 100644
--- a/src/runtime/components/DropdownMenuContent.vue
+++ b/src/runtime/components/DropdownMenuContent.vue
@@ -1,12 +1,12 @@
-
+
{{ getKbdKey(value) }}
diff --git a/src/runtime/components/Link.vue b/src/runtime/components/Link.vue
index 4c29f4a1..35e1aba7 100644
--- a/src/runtime/components/Link.vue
+++ b/src/runtime/components/Link.vue
@@ -1,10 +1,11 @@
diff --git a/src/runtime/components/PinInput.vue b/src/runtime/components/PinInput.vue
index dc8fbaf3..a0ac889b 100644
--- a/src/runtime/components/PinInput.vue
+++ b/src/runtime/components/PinInput.vue
@@ -1,18 +1,11 @@
-
+
diff --git a/src/runtime/components/Slideover.vue b/src/runtime/components/Slideover.vue
index 2db52c9f..268652fe 100644
--- a/src/runtime/components/Slideover.vue
+++ b/src/runtime/components/Slideover.vue
@@ -1,18 +1,11 @@
@@ -76,6 +69,7 @@ import { ToastRoot, ToastTitle, ToastDescription, ToastAction, ToastClose, useFo
import { reactivePick } from '@vueuse/core'
import { useAppConfig } from '#imports'
import { useLocale } from '../composables/useLocale'
+import { tv } from '../utils/tv'
import UIcon from './Icon.vue'
import UAvatar from './Avatar.vue'
import UButton from './Button.vue'
@@ -88,11 +82,11 @@ const emits = defineEmits()
const slots = defineSlots()
const { t } = useLocale()
-const appConfig = useAppConfig()
+const appConfig = useAppConfig() as Toast['AppConfig']
const rootProps = useForwardPropsEmits(reactivePick(props, 'as', 'defaultOpen', 'open', 'duration', 'type'), emits)
-const ui = computed(() => toast({
+const ui = computed(() => tv({ extend: tv(theme), ...(appConfig.ui?.toast || {}) })({
color: props.color,
orientation: props.orientation,
title: !!props.title || !!slots.title
diff --git a/src/runtime/components/Toaster.vue b/src/runtime/components/Toaster.vue
index 71fdfbde..95b69092 100644
--- a/src/runtime/components/Toaster.vue
+++ b/src/runtime/components/Toaster.vue
@@ -1,23 +1,17 @@
diff --git a/src/runtime/components/Tree.vue b/src/runtime/components/Tree.vue
index cffc3ab1..a801e5bb 100644
--- a/src/runtime/components/Tree.vue
+++ b/src/runtime/components/Tree.vue
@@ -1,25 +1,11 @@