diff --git a/apps/www/.vitepress/theme/config/docs.ts b/apps/www/.vitepress/theme/config/docs.ts
index f22bf81c..646cc85a 100644
--- a/apps/www/.vitepress/theme/config/docs.ts
+++ b/apps/www/.vitepress/theme/config/docs.ts
@@ -299,6 +299,12 @@ export const docsConfig: DocsConfig = {
href: '/docs/components/slider',
items: [],
},
+ {
+ title: 'Sonner',
+ href: '/docs/components/sonner',
+ label: 'New',
+ items: [],
+ },
{
title: 'Switch',
href: '/docs/components/switch',
diff --git a/apps/www/.vitepress/theme/layout/DocsLayout.vue b/apps/www/.vitepress/theme/layout/DocsLayout.vue
index c8cd7649..388301e0 100644
--- a/apps/www/.vitepress/theme/layout/DocsLayout.vue
+++ b/apps/www/.vitepress/theme/layout/DocsLayout.vue
@@ -6,6 +6,7 @@ import EditLink from '../components/EditLink.vue'
import { ScrollArea } from '@/lib/registry/default/ui/scroll-area'
import { Badge } from '@/lib/registry/default/ui/badge'
import RadixIconsCode from '~icons/radix-icons/code'
+import RadixIconsExternalLink from '~icons/radix-icons/external-link'
import ChevronRightIcon from '~icons/lucide/chevron-right'
const $route = useRoute()
@@ -81,6 +82,10 @@ const sourceLink = 'https://github.com/radix-vue/shadcn-vue/tree/dev/'
diff --git a/apps/www/__registry__/index.ts b/apps/www/__registry__/index.ts
index 2c7ae3aa..fa91bc27 100644
--- a/apps/www/__registry__/index.ts
+++ b/apps/www/__registry__/index.ts
@@ -576,6 +576,13 @@ export const Index = {
component: () => import('../src/lib/registry/default/example/SliderDemo.vue').then(m => m.default),
files: ['../src/lib/registry/default/example/SliderDemo.vue'],
},
+ SonnerDemo: {
+ name: 'SonnerDemo',
+ type: 'components:example',
+ registryDependencies: ['button'],
+ component: () => import('../src/lib/registry/default/example/SonnerDemo.vue').then(m => m.default),
+ files: ['../src/lib/registry/default/example/SonnerDemo.vue'],
+ },
SwitchDemo: {
name: 'SwitchDemo',
type: 'components:example',
@@ -1467,6 +1474,13 @@ export const Index = {
component: () => import('../src/lib/registry/new-york/example/SliderDemo.vue').then(m => m.default),
files: ['../src/lib/registry/new-york/example/SliderDemo.vue'],
},
+ SonnerDemo: {
+ name: 'SonnerDemo',
+ type: 'components:example',
+ registryDependencies: ['button'],
+ component: () => import('../src/lib/registry/new-york/example/SonnerDemo.vue').then(m => m.default),
+ files: ['../src/lib/registry/new-york/example/SonnerDemo.vue'],
+ },
SwitchDemo: {
name: 'SwitchDemo',
type: 'components:example',
diff --git a/apps/www/package.json b/apps/www/package.json
index cdc17e69..186171f7 100644
--- a/apps/www/package.json
+++ b/apps/www/package.json
@@ -37,6 +37,7 @@
"v-calendar": "^3.1.2",
"vee-validate": "4.12.4",
"vue": "^3.4.15",
+ "vue-sonner": "^1.0.2",
"vue-wrap-balancer": "^1.1.3",
"zod": "^3.22.4"
},
diff --git a/apps/www/src/content/docs/components/sonner.md b/apps/www/src/content/docs/components/sonner.md
new file mode 100644
index 00000000..0aa8298e
--- /dev/null
+++ b/apps/www/src/content/docs/components/sonner.md
@@ -0,0 +1,63 @@
+---
+title: Sonner
+description: An opinionated toast component for Vue.
+docs: https://vue-sonner.vercel.app
+source: apps/www/src/lib/registry/default/ui/sonner
+---
+
+
+
+## About
+
+The Sonner component is provided by [vue-sonner](https://vue-sonner.vercel.app/), which is a Vue port of Sonner, originally created by [Emil Kowalski](https://twitter.com/emilkowalski_) for React.
+
+## Installation
+
+
+
+### Run the following command
+
+```bash
+npx shadcn-vue@latest add sonner
+```
+
+### Add the Toaster component
+
+Add the following `Toaster` component to your `App.vue` file:
+
+```vue title="App.vue" {2,6}
+
+
+
+
+
+```
+
+
+
+## Usage
+
+```vue
+
+
+
+
+
+```
diff --git a/apps/www/src/lib/registry/default/example/SonnerDemo.vue b/apps/www/src/lib/registry/default/example/SonnerDemo.vue
new file mode 100644
index 00000000..da34f15c
--- /dev/null
+++ b/apps/www/src/lib/registry/default/example/SonnerDemo.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
diff --git a/apps/www/src/lib/registry/default/ui/sonner/Sonner.vue b/apps/www/src/lib/registry/default/ui/sonner/Sonner.vue
new file mode 100644
index 00000000..98201a1e
--- /dev/null
+++ b/apps/www/src/lib/registry/default/ui/sonner/Sonner.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
diff --git a/apps/www/src/lib/registry/default/ui/sonner/index.ts b/apps/www/src/lib/registry/default/ui/sonner/index.ts
new file mode 100644
index 00000000..0d4a6423
--- /dev/null
+++ b/apps/www/src/lib/registry/default/ui/sonner/index.ts
@@ -0,0 +1 @@
+export { default as Toaster } from './Sonner.vue'
diff --git a/apps/www/src/lib/registry/new-york/example/SonnerDemo.vue b/apps/www/src/lib/registry/new-york/example/SonnerDemo.vue
new file mode 100644
index 00000000..c46d9482
--- /dev/null
+++ b/apps/www/src/lib/registry/new-york/example/SonnerDemo.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
diff --git a/apps/www/src/lib/registry/new-york/ui/sonner/Sonner.vue b/apps/www/src/lib/registry/new-york/ui/sonner/Sonner.vue
new file mode 100644
index 00000000..98201a1e
--- /dev/null
+++ b/apps/www/src/lib/registry/new-york/ui/sonner/Sonner.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
diff --git a/apps/www/src/lib/registry/new-york/ui/sonner/index.ts b/apps/www/src/lib/registry/new-york/ui/sonner/index.ts
new file mode 100644
index 00000000..0d4a6423
--- /dev/null
+++ b/apps/www/src/lib/registry/new-york/ui/sonner/index.ts
@@ -0,0 +1 @@
+export { default as Toaster } from './Sonner.vue'
diff --git a/apps/www/src/public/registry/index.json b/apps/www/src/public/registry/index.json
index ee1339ec..2cae0d54 100644
--- a/apps/www/src/public/registry/index.json
+++ b/apps/www/src/public/registry/index.json
@@ -517,6 +517,16 @@
],
"type": "components:ui"
},
+ {
+ "name": "sonner",
+ "dependencies": [],
+ "registryDependencies": [],
+ "files": [
+ "ui/sonner/Sonner.vue",
+ "ui/sonner/index.ts"
+ ],
+ "type": "components:ui"
+ },
{
"name": "switch",
"dependencies": [],
diff --git a/apps/www/src/public/registry/styles/default/sonner.json b/apps/www/src/public/registry/styles/default/sonner.json
new file mode 100644
index 00000000..33827c77
--- /dev/null
+++ b/apps/www/src/public/registry/styles/default/sonner.json
@@ -0,0 +1,16 @@
+{
+ "name": "sonner",
+ "dependencies": [],
+ "registryDependencies": [],
+ "files": [
+ {
+ "name": "Sonner.vue",
+ "content": "\n\n\n \n\n"
+ },
+ {
+ "name": "index.ts",
+ "content": "export { default as Toaster } from './Sonner.vue'\n"
+ }
+ ],
+ "type": "components:ui"
+}
\ No newline at end of file
diff --git a/apps/www/src/public/registry/styles/new-york/sonner.json b/apps/www/src/public/registry/styles/new-york/sonner.json
new file mode 100644
index 00000000..33827c77
--- /dev/null
+++ b/apps/www/src/public/registry/styles/new-york/sonner.json
@@ -0,0 +1,16 @@
+{
+ "name": "sonner",
+ "dependencies": [],
+ "registryDependencies": [],
+ "files": [
+ {
+ "name": "Sonner.vue",
+ "content": "\n\n\n \n\n"
+ },
+ {
+ "name": "index.ts",
+ "content": "export { default as Toaster } from './Sonner.vue'\n"
+ }
+ ],
+ "type": "components:ui"
+}
\ No newline at end of file
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 68572cc4..e227bc8e 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -110,6 +110,9 @@ importers:
vue:
specifier: ^3.4.15
version: 3.4.15(typescript@5.3.3)
+ vue-sonner:
+ specifier: ^1.0.2
+ version: 1.0.2
vue-wrap-balancer:
specifier: ^1.1.3
version: 1.1.3(vue@3.4.15)
@@ -14611,6 +14614,10 @@ packages:
vue: 3.4.15(typescript@5.3.3)
dev: false
+ /vue-sonner@1.0.2:
+ resolution: {integrity: sha512-BXIyb9lGSMUjTpOukISp7oV9nrczgbfYz+TnDeoap3io3ayGXiWv+/3eQ9UKnmofwUlC4nh/H5jzBOO89lRItQ==}
+ dev: false
+
/vue-template-compiler@2.7.14:
resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==}
dependencies: