-
-
+
+
+
+
+
-
-
+
+
+
+
+
+
+ isCommandPaletteOpen = value" />
+
+
-
-
-
-
- isCommandPaletteOpen = value" />
-
-
-
+
+
+
+
+
diff --git a/src/devtools/runtime/examples/AvatarGroupExample.vue b/src/devtools/runtime/examples/AvatarGroupExample.vue
new file mode 100644
index 00000000..805b964a
--- /dev/null
+++ b/src/devtools/runtime/examples/AvatarGroupExample.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/devtools/runtime/examples/ButtonGroupExample.vue b/src/devtools/runtime/examples/ButtonGroupExample.vue
new file mode 100644
index 00000000..54d04c97
--- /dev/null
+++ b/src/devtools/runtime/examples/ButtonGroupExample.vue
@@ -0,0 +1,8 @@
+
+
+
+
+ Button
+
+
+
diff --git a/src/devtools/runtime/examples/CardExample.vue b/src/devtools/runtime/examples/CardExample.vue
new file mode 100644
index 00000000..24fc5401
--- /dev/null
+++ b/src/devtools/runtime/examples/CardExample.vue
@@ -0,0 +1,13 @@
+
+
+
diff --git a/src/devtools/runtime/examples/CarouselExample.vue b/src/devtools/runtime/examples/CarouselExample.vue
new file mode 100644
index 00000000..f038abd5
--- /dev/null
+++ b/src/devtools/runtime/examples/CarouselExample.vue
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/src/devtools/runtime/examples/ChipExample.vue b/src/devtools/runtime/examples/ChipExample.vue
new file mode 100644
index 00000000..c0c05fdc
--- /dev/null
+++ b/src/devtools/runtime/examples/ChipExample.vue
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/devtools/runtime/examples/CollapsibleExample.vue b/src/devtools/runtime/examples/CollapsibleExample.vue
new file mode 100644
index 00000000..8ec689ed
--- /dev/null
+++ b/src/devtools/runtime/examples/CollapsibleExample.vue
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/devtools/runtime/examples/CommandPaletteExample.vue b/src/devtools/runtime/examples/CommandPaletteExample.vue
new file mode 100644
index 00000000..7601845e
--- /dev/null
+++ b/src/devtools/runtime/examples/CommandPaletteExample.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
diff --git a/src/devtools/runtime/examples/ContainerExample.vue b/src/devtools/runtime/examples/ContainerExample.vue
new file mode 100644
index 00000000..8a1b2932
--- /dev/null
+++ b/src/devtools/runtime/examples/ContainerExample.vue
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/devtools/runtime/examples/ContextMenuExample.vue b/src/devtools/runtime/examples/ContextMenuExample.vue
new file mode 100644
index 00000000..fd17434b
--- /dev/null
+++ b/src/devtools/runtime/examples/ContextMenuExample.vue
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/devtools/runtime/examples/DrawerExample.vue b/src/devtools/runtime/examples/DrawerExample.vue
new file mode 100644
index 00000000..125804e6
--- /dev/null
+++ b/src/devtools/runtime/examples/DrawerExample.vue
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/devtools/runtime/examples/DropdownMenuExample.vue b/src/devtools/runtime/examples/DropdownMenuExample.vue
new file mode 100644
index 00000000..49cc937e
--- /dev/null
+++ b/src/devtools/runtime/examples/DropdownMenuExample.vue
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/devtools/runtime/examples/FormExample.vue b/src/devtools/runtime/examples/FormExample.vue
new file mode 100644
index 00000000..199afddd
--- /dev/null
+++ b/src/devtools/runtime/examples/FormExample.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+ Submit
+
+
+
diff --git a/src/devtools/runtime/examples/FormFieldExample.vue b/src/devtools/runtime/examples/FormFieldExample.vue
new file mode 100644
index 00000000..a0be07b1
--- /dev/null
+++ b/src/devtools/runtime/examples/FormFieldExample.vue
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/devtools/runtime/examples/LinkExample.vue b/src/devtools/runtime/examples/LinkExample.vue
new file mode 100644
index 00000000..e5cbd6bc
--- /dev/null
+++ b/src/devtools/runtime/examples/LinkExample.vue
@@ -0,0 +1,5 @@
+
+
+ Link
+
+
diff --git a/src/devtools/runtime/examples/ModalExample.vue b/src/devtools/runtime/examples/ModalExample.vue
new file mode 100644
index 00000000..d4c6ef2c
--- /dev/null
+++ b/src/devtools/runtime/examples/ModalExample.vue
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/devtools/runtime/examples/PopoverExample.vue b/src/devtools/runtime/examples/PopoverExample.vue
new file mode 100644
index 00000000..aac4e502
--- /dev/null
+++ b/src/devtools/runtime/examples/PopoverExample.vue
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/devtools/runtime/examples/SkeletonExample.vue b/src/devtools/runtime/examples/SkeletonExample.vue
new file mode 100644
index 00000000..5b2fab1e
--- /dev/null
+++ b/src/devtools/runtime/examples/SkeletonExample.vue
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/devtools/runtime/examples/SlideoverExample.vue b/src/devtools/runtime/examples/SlideoverExample.vue
new file mode 100644
index 00000000..79a07dc7
--- /dev/null
+++ b/src/devtools/runtime/examples/SlideoverExample.vue
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/devtools/runtime/examples/ToasterExample.vue b/src/devtools/runtime/examples/ToasterExample.vue
new file mode 100644
index 00000000..96e97536
--- /dev/null
+++ b/src/devtools/runtime/examples/ToasterExample.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/src/devtools/runtime/examples/TooltipExample.vue b/src/devtools/runtime/examples/TooltipExample.vue
new file mode 100644
index 00000000..f014c154
--- /dev/null
+++ b/src/devtools/runtime/examples/TooltipExample.vue
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/module.ts b/src/module.ts
index 648af9de..7c0d6849 100644
--- a/src/module.ts
+++ b/src/module.ts
@@ -1,6 +1,10 @@
import { defu } from 'defu'
-import { createResolver, defineNuxtModule, addComponentsDir, addImportsDir, addVitePlugin, addPlugin, installModule, hasNuxtModule } from '@nuxt/kit'
-import { addTemplates } from './templates'
+import { createResolver, defineNuxtModule, addComponentsDir, addImportsDir, addVitePlugin, addPlugin, installModule, extendPages, hasNuxtModule } from '@nuxt/kit'
+import { addTemplates, buildTemplates } from './templates'
+import { addCustomTab, startSubprocess } from '@nuxt/devtools-kit'
+import sirv from 'sirv'
+import { getPort } from 'get-port-please'
+import { devtoolsMetaPlugin } from './devtools/meta'
import { defaultOptions, getDefaultUiConfig, resolveColors } from './defaults'
export type * from './runtime/types'
@@ -46,6 +50,17 @@ export interface ModuleOptions {
*/
transitions?: boolean
}
+
+ /**
+ * Configuration for the Nuxt UI devtools.
+ */
+ devtools?: {
+ /**
+ * Enable or disable Nuxt UI devtools.
+ * @defaultValue `true`
+ */
+ enabled?: boolean
+ }
}
export default defineNuxtModule
({
@@ -58,6 +73,7 @@ export default defineNuxtModule({
docs: 'https://ui3.nuxt.dev/getting-started/installation'
},
defaults: defaultOptions,
+
async setup(options, nuxt) {
const { resolve } = createResolver(import.meta.url)
@@ -110,5 +126,77 @@ export default defineNuxtModule({
addImportsDir(resolve('./runtime/composables'))
addTemplates(options, nuxt)
+
+ if (nuxt.options.dev && nuxt.options.devtools.enabled && options.devtools?.enabled) {
+ const templates = buildTemplates(options)
+ nuxt.options.vite = defu(nuxt.options?.vite, { plugins: [devtoolsMetaPlugin({ resolve, templates, options })] })
+
+ // Runs UI devtools in a subprocess for local development
+ if (process.env.NUXT_UI_DEVTOOLS_LOCAL) {
+ const PORT = await getPort({ port: 42124 })
+ nuxt.hook('app:resolve', () => {
+ startSubprocess(
+ {
+ command: 'pnpm',
+ args: ['nuxi', 'dev'],
+ cwd: './devtools',
+ stdio: 'pipe',
+ env: {
+ PORT: PORT.toString()
+ }
+ },
+ {
+ id: 'ui:devtools:local',
+ name: 'Nuxt UI DevTools Local',
+ icon: 'logos-nuxt-icon'
+ },
+ nuxt
+ )
+ })
+
+ nuxt.hook('vite:extendConfig', (config) => {
+ config.server ||= {}
+ config.server.proxy ||= {}
+ config.server.proxy['/__nuxt_ui__/devtools'] = {
+ target: `http://localhost:${PORT}`,
+ changeOrigin: true,
+ followRedirects: true,
+ ws: true,
+ rewriteWsOrigin: true
+ }
+ })
+ } else {
+ nuxt.hook('vite:serverCreated', async (server) => {
+ server.middlewares.use('/__nuxt_ui__/devtools', sirv(resolve('../dist/client/devtools'), {
+ single: true,
+ dev: true
+ }))
+ })
+ }
+
+ nuxt.options.routeRules = defu(nuxt.options.routeRules, { '/__nuxt_ui__/**': { ssr: false } })
+ extendPages((pages) => {
+ pages.unshift({
+ name: 'ui-devtools',
+ path: '/__nuxt_ui__/components/:slug',
+ file: resolve('./devtools/runtime/DevtoolsRenderer.vue'),
+ meta: {
+ // https://github.com/nuxt/nuxt/pull/29366
+ // isolate: true
+ layout: false
+ }
+ })
+ })
+
+ addCustomTab({
+ name: 'nuxt-ui',
+ title: 'Nuxt UI',
+ icon: '/__nuxt_ui__/devtools/favicon.svg',
+ view: {
+ type: 'iframe',
+ src: '/__nuxt_ui__/devtools'
+ }
+ })
+ }
}
})
diff --git a/src/runtime/components/Accordion.vue b/src/runtime/components/Accordion.vue
index aad29603..42bf4fe4 100644
--- a/src/runtime/components/Accordion.vue
+++ b/src/runtime/components/Accordion.vue
@@ -1,10 +1,10 @@
-
diff --git a/src/runtime/components/Breadcrumb.vue b/src/runtime/components/Breadcrumb.vue
index cf30af62..075882cb 100644
--- a/src/runtime/components/Breadcrumb.vue
+++ b/src/runtime/components/Breadcrumb.vue
@@ -1,9 +1,9 @@
-