From fa79e9b07ea62ff9c3e715017902337628e507e8 Mon Sep 17 00:00:00 2001
From: LOG1997 <2694233102@qq.com>
Date: Wed, 10 Dec 2025 22:12:42 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=8D=A2=E5=AD=97=E4=BD=93v?=
=?UTF-8?q?=EF=BC=8C=E4=BB=A5=E5=8F=8A=E9=A1=B5=E9=9D=A2=E5=8A=A0=E8=BD=BD?=
=?UTF-8?q?=E4=B9=8B=E5=89=8D=E5=B0=B1=E8=AE=BE=E7=BD=AE=E5=AD=97=E4=BD=93?=
=?UTF-8?q?=20#96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
package.json | 5 +-
pnpm-lock.yaml | 30 ++++
src/App.vue | 12 +-
src/components.d.ts | 23 +++
src/components/ui/button/Button.vue | 29 ++++
src/components/ui/button/index.ts | 38 +++++
src/components/ui/command/Command.vue | 87 ++++++++++
src/components/ui/command/CommandDialog.vue | 31 ++++
src/components/ui/command/CommandEmpty.vue | 27 +++
src/components/ui/command/CommandGroup.vue | 45 +++++
src/components/ui/command/CommandInput.vue | 39 +++++
src/components/ui/command/CommandItem.vue | 76 +++++++++
src/components/ui/command/CommandList.vue | 25 +++
.../ui/command/CommandSeparator.vue | 21 +++
src/components/ui/command/CommandShortcut.vue | 17 ++
src/components/ui/command/index.ts | 25 +++
src/components/ui/dialog/Dialog.vue | 19 +++
src/components/ui/dialog/DialogClose.vue | 15 ++
src/components/ui/dialog/DialogContent.vue | 53 ++++++
.../ui/dialog/DialogDescription.vue | 23 +++
src/components/ui/dialog/DialogFooter.vue | 15 ++
src/components/ui/dialog/DialogHeader.vue | 17 ++
src/components/ui/dialog/DialogOverlay.vue | 21 +++
.../ui/dialog/DialogScrollContent.vue | 59 +++++++
src/components/ui/dialog/DialogTitle.vue | 23 +++
src/components/ui/dialog/DialogTrigger.vue | 15 ++
src/components/ui/dialog/index.ts | 10 ++
src/components/ui/popover/Popover.vue | 19 +++
src/components/ui/popover/PopoverAnchor.vue | 15 ++
src/components/ui/popover/PopoverContent.vue | 45 +++++
src/components/ui/popover/PopoverTrigger.vue | 15 ++
src/components/ui/popover/index.ts | 4 +
src/hooks/useLocalFonts.ts | 4 -
src/main.ts | 29 ++++
src/style.css | 1 +
.../FaceConfig/components/SelectFont.vue | 118 +++++++++++++
src/views/Config/Global/FaceConfig/index.vue | 11 +-
src/views/Demo/index.vue | 160 +++++++++++-------
.../Home/components/HeaderTitle/index.vue | 2 +-
39 files changed, 1135 insertions(+), 88 deletions(-)
create mode 100644 src/components/ui/button/Button.vue
create mode 100644 src/components/ui/button/index.ts
create mode 100644 src/components/ui/command/Command.vue
create mode 100644 src/components/ui/command/CommandDialog.vue
create mode 100644 src/components/ui/command/CommandEmpty.vue
create mode 100644 src/components/ui/command/CommandGroup.vue
create mode 100644 src/components/ui/command/CommandInput.vue
create mode 100644 src/components/ui/command/CommandItem.vue
create mode 100644 src/components/ui/command/CommandList.vue
create mode 100644 src/components/ui/command/CommandSeparator.vue
create mode 100644 src/components/ui/command/CommandShortcut.vue
create mode 100644 src/components/ui/command/index.ts
create mode 100644 src/components/ui/dialog/Dialog.vue
create mode 100644 src/components/ui/dialog/DialogClose.vue
create mode 100644 src/components/ui/dialog/DialogContent.vue
create mode 100644 src/components/ui/dialog/DialogDescription.vue
create mode 100644 src/components/ui/dialog/DialogFooter.vue
create mode 100644 src/components/ui/dialog/DialogHeader.vue
create mode 100644 src/components/ui/dialog/DialogOverlay.vue
create mode 100644 src/components/ui/dialog/DialogScrollContent.vue
create mode 100644 src/components/ui/dialog/DialogTitle.vue
create mode 100644 src/components/ui/dialog/DialogTrigger.vue
create mode 100644 src/components/ui/dialog/index.ts
create mode 100644 src/components/ui/popover/Popover.vue
create mode 100644 src/components/ui/popover/PopoverAnchor.vue
create mode 100644 src/components/ui/popover/PopoverContent.vue
create mode 100644 src/components/ui/popover/PopoverTrigger.vue
create mode 100644 src/components/ui/popover/index.ts
create mode 100644 src/views/Config/Global/FaceConfig/components/SelectFont.vue
diff --git a/package.json b/package.json
index 1fbc2fd..402a81e 100644
--- a/package.json
+++ b/package.json
@@ -100,5 +100,6 @@
"vite-plugin-vue-devtools": "^8.0.2",
"vitest": "^4.0.15",
"vue-tsc": "^3.0.7"
- }
-}
\ No newline at end of file
+ },
+ "packageManager": "pnpm@10.8.1+sha1.a4eff733d0c4ccc179997f0ef4986f6e92427781"
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 375e128..f80f2e6 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1430,36 +1430,42 @@ packages:
engines: {node: '>= 10.0.0'}
cpu: [arm]
os: [linux]
+ libc: [glibc]
'@parcel/watcher-linux-arm-musl@2.5.0':
resolution: {integrity: sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==}
engines: {node: '>= 10.0.0'}
cpu: [arm]
os: [linux]
+ libc: [musl]
'@parcel/watcher-linux-arm64-glibc@2.5.0':
resolution: {integrity: sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@parcel/watcher-linux-arm64-musl@2.5.0':
resolution: {integrity: sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@parcel/watcher-linux-x64-glibc@2.5.0':
resolution: {integrity: sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@parcel/watcher-linux-x64-musl@2.5.0':
resolution: {integrity: sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@parcel/watcher-win32-arm64@2.5.0':
resolution: {integrity: sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==}
@@ -1530,56 +1536,67 @@ packages:
resolution: {integrity: sha512-aL6hRwu0k7MTUESgkg7QHY6CoqPgr6gdQXRJI1/VbFlUMwsSzPGSR7sG5d+MCbYnJmJwThc2ol3nixj1fvI/zQ==}
cpu: [arm]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-arm-musleabihf@4.52.0':
resolution: {integrity: sha512-BTs0M5s1EJejgIBJhCeiFo7GZZ2IXWkFGcyZhxX4+8usnIo5Mti57108vjXFIQmmJaRyDwmV59Tw64Ap1dkwMw==}
cpu: [arm]
os: [linux]
+ libc: [musl]
'@rollup/rollup-linux-arm64-gnu@4.52.0':
resolution: {integrity: sha512-uj672IVOU9m08DBGvoPKPi/J8jlVgjh12C9GmjjBxCTQc3XtVmRkRKyeHSmIKQpvJ7fIm1EJieBUcnGSzDVFyw==}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-arm64-musl@4.52.0':
resolution: {integrity: sha512-/+IVbeDMDCtB/HP/wiWsSzduD10SEGzIZX2945KSgZRNi4TSkjHqRJtNTVtVb8IRwhJ65ssI56krlLik+zFWkw==}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@rollup/rollup-linux-loong64-gnu@4.52.0':
resolution: {integrity: sha512-U1vVzvSWtSMWKKrGoROPBXMh3Vwn93TA9V35PldokHGqiUbF6erSzox/5qrSMKp6SzakvyjcPiVF8yB1xKr9Pg==}
cpu: [loong64]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-ppc64-gnu@4.52.0':
resolution: {integrity: sha512-X/4WfuBAdQRH8cK3DYl8zC00XEE6aM472W+QCycpQJeLWVnHfkv7RyBFVaTqNUMsTgIX8ihMjCvFF9OUgeABzw==}
cpu: [ppc64]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-riscv64-gnu@4.52.0':
resolution: {integrity: sha512-xIRYc58HfWDBZoLmWfWXg2Sq8VCa2iJ32B7mqfWnkx5mekekl0tMe7FHpY8I72RXEcUkaWawRvl3qA55og+cwQ==}
cpu: [riscv64]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-riscv64-musl@4.52.0':
resolution: {integrity: sha512-mbsoUey05WJIOz8U1WzNdf+6UMYGwE3fZZnQqsM22FZ3wh1N887HT6jAOjXs6CNEK3Ntu2OBsyQDXfIjouI4dw==}
cpu: [riscv64]
os: [linux]
+ libc: [musl]
'@rollup/rollup-linux-s390x-gnu@4.52.0':
resolution: {integrity: sha512-qP6aP970bucEi5KKKR4AuPFd8aTx9EF6BvutvYxmZuWLJHmnq4LvBfp0U+yFDMGwJ+AIJEH5sIP+SNypauMWzg==}
cpu: [s390x]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-x64-gnu@4.52.0':
resolution: {integrity: sha512-nmSVN+F2i1yKZ7rJNKO3G7ZzmxJgoQBQZ/6c4MuS553Grmr7WqR7LLDcYG53Z2m9409z3JLt4sCOhLdbKQ3HmA==}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-x64-musl@4.52.0':
resolution: {integrity: sha512-2d0qRo33G6TfQVjaMR71P+yJVGODrt5V6+T0BDYH4EMfGgdC/2HWDVjSSFw888GSzAZUwuska3+zxNUCDco6rQ==}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@rollup/rollup-openharmony-arm64@4.52.0':
resolution: {integrity: sha512-A1JalX4MOaFAAyGgpO7XP5khquv/7xKzLIyLmhNrbiCxWpMlnsTYr8dnsWM7sEeotNmxvSOEL7F65j0HXFcFsw==}
@@ -1667,24 +1684,28 @@ packages:
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@tailwindcss/oxide-linux-arm64-musl@4.1.13':
resolution: {integrity: sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@tailwindcss/oxide-linux-x64-gnu@4.1.13':
resolution: {integrity: sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@tailwindcss/oxide-linux-x64-musl@4.1.13':
resolution: {integrity: sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@tailwindcss/oxide-wasm32-wasi@4.1.13':
resolution: {integrity: sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA==}
@@ -1755,30 +1776,35 @@ packages:
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@tauri-apps/cli-linux-arm64-musl@2.9.5':
resolution: {integrity: sha512-/gRBMnphS9E8riZ0LIbBhZ9Oy16A2rx/g3DGR0DcDBvUtkLfbL0lMu4s+sY85nkn9An15+cZ1ZK6d7AIqWahLA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@tauri-apps/cli-linux-riscv64-gnu@2.9.5':
resolution: {integrity: sha512-NOzjPF9YIBodjdkFcJmqINT0k3YDoR5ANM/jg6Z6s3Zmk8ScN6inI60jTxcfgfWyITiKsPy7GJyYou3Cm2XNzw==}
engines: {node: '>= 10'}
cpu: [riscv64]
os: [linux]
+ libc: [glibc]
'@tauri-apps/cli-linux-x64-gnu@2.9.5':
resolution: {integrity: sha512-SfGbwgvTphM5y+J91NyU/psleMUlyyPkZyDCFg8WU1HX8DpKUT3Vwhb/W1xpUBGb56tJgGCO46FCVkr8w4Areg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@tauri-apps/cli-linux-x64-musl@2.9.5':
resolution: {integrity: sha512-ZfeoiASAOGDzyvN+TDAg8A1pCeS082h4uc0vZKvtWUN+9QBIMfz0yJwltAv+SN/afap6NS6DVkbPV3UVuI9V5A==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@tauri-apps/cli-win32-arm64-msvc@2.9.5':
resolution: {integrity: sha512-ulg7irow+ekjaK4inFHVq7m1KQebDSYNb17DFKV+h+x7qnLZymz2gHK7df2u4YyEjqvzwRd3AJpU3HNxRurSFQ==}
@@ -3959,24 +3985,28 @@ packages:
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
lightningcss-linux-arm64-musl@1.30.1:
resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
lightningcss-linux-x64-gnu@1.30.1:
resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
lightningcss-linux-x64-musl@1.30.1:
resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
+ libc: [musl]
lightningcss-win32-arm64-msvc@1.30.1:
resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==}
diff --git a/src/App.vue b/src/App.vue
index c7b1087..1af3e37 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,19 +1,9 @@
diff --git a/src/components.d.ts b/src/components.d.ts
index c507676..5fa85c9 100644
--- a/src/components.d.ts
+++ b/src/components.d.ts
@@ -11,8 +11,27 @@ export {}
/* prettier-ignore */
declare module 'vue' {
export interface GlobalComponents {
+ Button: typeof import('./components/ui/button/Button.vue')['default']
+ Command: typeof import('./components/ui/command/Command.vue')['default']
+ CommandDialog: typeof import('./components/ui/command/CommandDialog.vue')['default']
+ CommandEmpty: typeof import('./components/ui/command/CommandEmpty.vue')['default']
+ CommandGroup: typeof import('./components/ui/command/CommandGroup.vue')['default']
+ CommandInput: typeof import('./components/ui/command/CommandInput.vue')['default']
+ CommandItem: typeof import('./components/ui/command/CommandItem.vue')['default']
+ CommandList: typeof import('./components/ui/command/CommandList.vue')['default']
+ CommandSeparator: typeof import('./components/ui/command/CommandSeparator.vue')['default']
+ CommandShortcut: typeof import('./components/ui/command/CommandShortcut.vue')['default']
DaiysuiTable: typeof import('./components/DaiysuiTable/index.vue')['default']
Dialog: typeof import('./components/Dialog/index.vue')['default']
+ DialogClose: typeof import('./components/ui/dialog/DialogClose.vue')['default']
+ DialogContent: typeof import('./components/ui/dialog/DialogContent.vue')['default']
+ DialogDescription: typeof import('./components/ui/dialog/DialogDescription.vue')['default']
+ DialogFooter: typeof import('./components/ui/dialog/DialogFooter.vue')['default']
+ DialogHeader: typeof import('./components/ui/dialog/DialogHeader.vue')['default']
+ DialogOverlay: typeof import('./components/ui/dialog/DialogOverlay.vue')['default']
+ DialogScrollContent: typeof import('./components/ui/dialog/DialogScrollContent.vue')['default']
+ DialogTitle: typeof import('./components/ui/dialog/DialogTitle.vue')['default']
+ DialogTrigger: typeof import('./components/ui/dialog/DialogTrigger.vue')['default']
DropdownMenu: typeof import('./components/ui/dropdown-menu/DropdownMenu.vue')['default']
DropdownMenuCheckboxItem: typeof import('./components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue')['default']
DropdownMenuContent: typeof import('./components/ui/dropdown-menu/DropdownMenuContent.vue')['default']
@@ -33,6 +52,10 @@ declare module 'vue' {
ImageSync: typeof import('./components/ImageSync/index.vue')['default']
Loading: typeof import('./components/Loading/index.vue')['default']
PageHeader: typeof import('./components/PageHeader/index.vue')['default']
+ Popover: typeof import('./components/ui/popover/Popover.vue')['default']
+ PopoverAnchor: typeof import('./components/ui/popover/PopoverAnchor.vue')['default']
+ PopoverContent: typeof import('./components/ui/popover/PopoverContent.vue')['default']
+ PopoverTrigger: typeof import('./components/ui/popover/PopoverTrigger.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
SvgIcon: typeof import('./components/SvgIcon/index.vue')['default']
diff --git a/src/components/ui/button/Button.vue b/src/components/ui/button/Button.vue
new file mode 100644
index 0000000..374320b
--- /dev/null
+++ b/src/components/ui/button/Button.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
diff --git a/src/components/ui/button/index.ts b/src/components/ui/button/index.ts
new file mode 100644
index 0000000..26e2c55
--- /dev/null
+++ b/src/components/ui/button/index.ts
@@ -0,0 +1,38 @@
+import type { VariantProps } from "class-variance-authority"
+import { cva } from "class-variance-authority"
+
+export { default as Button } from "./Button.vue"
+
+export const buttonVariants = cva(
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
+ {
+ variants: {
+ variant: {
+ default:
+ "bg-primary text-primary-foreground hover:bg-primary/90",
+ destructive:
+ "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
+ outline:
+ "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
+ secondary:
+ "bg-secondary text-secondary-foreground hover:bg-secondary/80",
+ ghost:
+ "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
+ link: "text-primary underline-offset-4 hover:underline",
+ },
+ size: {
+ "default": "h-9 px-4 py-2 has-[>svg]:px-3",
+ "sm": "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
+ "lg": "h-10 rounded-md px-6 has-[>svg]:px-4",
+ "icon": "size-9",
+ "icon-sm": "size-8",
+ "icon-lg": "size-10",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+ },
+)
+export type ButtonVariants = VariantProps
diff --git a/src/components/ui/command/Command.vue b/src/components/ui/command/Command.vue
new file mode 100644
index 0000000..dcdf9d6
--- /dev/null
+++ b/src/components/ui/command/Command.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
diff --git a/src/components/ui/command/CommandDialog.vue b/src/components/ui/command/CommandDialog.vue
new file mode 100644
index 0000000..7439736
--- /dev/null
+++ b/src/components/ui/command/CommandDialog.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
diff --git a/src/components/ui/command/CommandEmpty.vue b/src/components/ui/command/CommandEmpty.vue
new file mode 100644
index 0000000..489c406
--- /dev/null
+++ b/src/components/ui/command/CommandEmpty.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
diff --git a/src/components/ui/command/CommandGroup.vue b/src/components/ui/command/CommandGroup.vue
new file mode 100644
index 0000000..a5dd55e
--- /dev/null
+++ b/src/components/ui/command/CommandGroup.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+ {{ heading }}
+
+
+
+
diff --git a/src/components/ui/command/CommandInput.vue b/src/components/ui/command/CommandInput.vue
new file mode 100644
index 0000000..653141e
--- /dev/null
+++ b/src/components/ui/command/CommandInput.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
diff --git a/src/components/ui/command/CommandItem.vue b/src/components/ui/command/CommandItem.vue
new file mode 100644
index 0000000..2ae4827
--- /dev/null
+++ b/src/components/ui/command/CommandItem.vue
@@ -0,0 +1,76 @@
+
+
+
+ {
+ filterState.search = ''
+ }"
+ >
+
+
+
diff --git a/src/components/ui/command/CommandList.vue b/src/components/ui/command/CommandList.vue
new file mode 100644
index 0000000..928d2f0
--- /dev/null
+++ b/src/components/ui/command/CommandList.vue
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/ui/command/CommandSeparator.vue b/src/components/ui/command/CommandSeparator.vue
new file mode 100644
index 0000000..6def19e
--- /dev/null
+++ b/src/components/ui/command/CommandSeparator.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/src/components/ui/command/CommandShortcut.vue b/src/components/ui/command/CommandShortcut.vue
new file mode 100644
index 0000000..e1d0e07
--- /dev/null
+++ b/src/components/ui/command/CommandShortcut.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
diff --git a/src/components/ui/command/index.ts b/src/components/ui/command/index.ts
new file mode 100644
index 0000000..af18933
--- /dev/null
+++ b/src/components/ui/command/index.ts
@@ -0,0 +1,25 @@
+import type { Ref } from "vue"
+import { createContext } from "reka-ui"
+
+export { default as Command } from "./Command.vue"
+export { default as CommandDialog } from "./CommandDialog.vue"
+export { default as CommandEmpty } from "./CommandEmpty.vue"
+export { default as CommandGroup } from "./CommandGroup.vue"
+export { default as CommandInput } from "./CommandInput.vue"
+export { default as CommandItem } from "./CommandItem.vue"
+export { default as CommandList } from "./CommandList.vue"
+export { default as CommandSeparator } from "./CommandSeparator.vue"
+export { default as CommandShortcut } from "./CommandShortcut.vue"
+
+export const [useCommand, provideCommandContext] = createContext<{
+ allItems: Ref