From 57d15972644efb58dc5a47e065a6cbf4bec92f4e Mon Sep 17 00:00:00 2001
From: mofeng-git
Date: Fri, 17 Jul 2026 01:33:44 +0800
Subject: [PATCH] =?UTF-8?q?update:=20=E6=9B=B4=E6=96=B0=E5=89=8D=E7=AB=AF?=
=?UTF-8?q?=E4=BE=9D=E8=B5=96=EF=BC=9B=E4=BF=AE=E6=94=B9=E5=89=8D=E7=AB=AF?=
=?UTF-8?q?=E6=A0=B7=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
web/components.json | 2 +-
web/package-lock.json | 1525 +++++++----------
web/package.json | 33 +-
web/src/App.vue | 25 +-
web/src/components/ActionBar.vue | 53 +-
web/src/components/AppLayout.vue | 17 +-
web/src/components/AtxPopover.vue | 28 +-
web/src/components/AudioConfigPopover.vue | 23 +-
web/src/components/ComputerUseSheet.vue | 30 +-
web/src/components/HelpTooltip.vue | 9 +-
web/src/components/HidConfigPopover.vue | 18 +-
web/src/components/InfoBar.vue | 57 +-
web/src/components/MsdDialog.vue | 58 +-
web/src/components/PasteModal.vue | 13 +-
web/src/components/StatsSheet.vue | 109 +-
web/src/components/StatusCard.vue | 105 +-
web/src/components/VideoConfigPopover.vue | 147 +-
web/src/components/VirtualKeyboard.vue | 165 +-
.../ui/alert-dialog/AlertDialog.vue | 15 +
.../ui/alert-dialog/AlertDialogAction.vue | 14 +-
.../ui/alert-dialog/AlertDialogCancel.vue | 21 +-
.../ui/alert-dialog/AlertDialogContent.vue | 38 +-
.../alert-dialog/AlertDialogDescription.vue | 20 +-
.../ui/alert-dialog/AlertDialogFooter.vue | 16 +-
.../ui/alert-dialog/AlertDialogHeader.vue | 11 +-
.../ui/alert-dialog/AlertDialogTitle.vue | 18 +-
web/src/components/ui/alert-dialog/index.ts | 19 +-
web/src/components/ui/alert/Alert.vue | 21 +
.../components/ui/alert/AlertDescription.vue | 17 +
web/src/components/ui/alert/AlertTitle.vue | 17 +
web/src/components/ui/alert/index.ts | 30 +
web/src/components/ui/badge/index.ts | 8 +-
.../ui/button-group/ButtonGroup.vue | 22 +
web/src/components/ui/button-group/index.ts | 23 +
web/src/components/ui/button/Button.vue | 2 +
web/src/components/ui/button/index.ts | 4 +-
.../components/ui/collapsible/Collapsible.vue | 19 +
.../ui/collapsible/CollapsibleContent.vue | 15 +
.../ui/collapsible/CollapsibleTrigger.vue | 15 +
web/src/components/ui/collapsible/index.ts | 3 +
.../components/ui/dialog/DialogContent.vue | 2 +-
web/src/components/ui/dialog/DialogFooter.vue | 14 +-
.../ui/dialog/DialogScrollContent.vue | 2 +-
.../DropdownMenuCheckboxItem.vue | 2 +-
.../ui/dropdown-menu/DropdownMenuItem.vue | 2 +-
.../dropdown-menu/DropdownMenuRadioItem.vue | 2 +-
.../dropdown-menu/DropdownMenuSubContent.vue | 2 +-
.../dropdown-menu/DropdownMenuSubTrigger.vue | 5 +-
web/src/components/ui/empty/Empty.vue | 20 +
.../components/ui/empty/EmptyDescription.vue | 20 +
web/src/components/ui/empty/EmptyHeader.vue | 20 +
web/src/components/ui/empty/EmptyMedia.vue | 21 +
web/src/components/ui/empty/index.ts | 24 +
web/src/components/ui/field/Field.vue | 25 +
web/src/components/ui/field/FieldGroup.vue | 20 +
web/src/components/ui/field/FieldLabel.vue | 23 +
web/src/components/ui/field/index.ts | 32 +
.../components/ui/hover-card/HoverCard.vue | 19 +
.../ui/hover-card/HoverCardContent.vue | 41 +-
.../ui/hover-card/HoverCardTrigger.vue | 15 +
web/src/components/ui/hover-card/index.ts | 8 +-
web/src/components/ui/input/Input.vue | 2 +-
web/src/components/ui/item/Item.vue | 29 +
web/src/components/ui/item/ItemContent.vue | 17 +
.../components/ui/item/ItemDescription.vue | 21 +
web/src/components/ui/item/ItemTitle.vue | 17 +
web/src/components/ui/item/index.ts | 48 +
web/src/components/ui/kbd/Kbd.vue | 21 +
web/src/components/ui/kbd/index.ts | 1 +
.../ui/native-select/NativeSelect.vue | 50 +
.../ui/native-select/NativeSelectOption.vue | 12 +
web/src/components/ui/native-select/index.ts | 2 +
web/src/components/ui/popover/Popover.vue | 19 +
.../components/ui/popover/PopoverContent.vue | 43 +-
.../components/ui/popover/PopoverTrigger.vue | 15 +
web/src/components/ui/popover/index.ts | 8 +-
.../components/ui/radio-group/RadioGroup.vue | 6 +-
.../ui/radio-group/RadioGroupItem.vue | 14 +-
.../components/ui/scroll-area/ScrollArea.vue | 43 +-
.../components/ui/scroll-area/ScrollBar.vue | 32 +
web/src/components/ui/scroll-area/index.ts | 3 +-
web/src/components/ui/select/Select.vue | 8 +-
.../components/ui/select/SelectContent.vue | 8 +-
web/src/components/ui/select/SelectGroup.vue | 12 +-
web/src/components/ui/select/SelectItem.vue | 11 +-
.../components/ui/select/SelectItemText.vue | 5 +-
web/src/components/ui/select/SelectLabel.vue | 5 +-
.../ui/select/SelectScrollDownButton.vue | 10 +-
.../ui/select/SelectScrollUpButton.vue | 10 +-
.../components/ui/select/SelectSeparator.vue | 6 +-
.../components/ui/select/SelectTrigger.vue | 16 +-
web/src/components/ui/select/SelectValue.vue | 5 +-
web/src/components/ui/sheet/Sheet.vue | 19 +
web/src/components/ui/sheet/SheetContent.vue | 85 +-
.../components/ui/sheet/SheetDescription.vue | 18 +-
web/src/components/ui/sheet/SheetHeader.vue | 13 +-
web/src/components/ui/sheet/SheetOverlay.vue | 21 +
web/src/components/ui/sheet/SheetTitle.vue | 18 +-
web/src/components/ui/sheet/index.ts | 14 +-
web/src/components/ui/sidebar/Sidebar.vue | 96 ++
.../components/ui/sidebar/SidebarContent.vue | 18 +
.../components/ui/sidebar/SidebarGroup.vue | 18 +
.../ui/sidebar/SidebarGroupLabel.vue | 25 +
.../components/ui/sidebar/SidebarHeader.vue | 18 +
.../components/ui/sidebar/SidebarInset.vue | 21 +
web/src/components/ui/sidebar/SidebarMenu.vue | 18 +
.../ui/sidebar/SidebarMenuButton.vue | 48 +
.../ui/sidebar/SidebarMenuButtonChild.vue | 36 +
.../components/ui/sidebar/SidebarMenuItem.vue | 18 +
.../components/ui/sidebar/SidebarProvider.vue | 86 +
.../components/ui/sidebar/SidebarTrigger.vue | 27 +
web/src/components/ui/sidebar/index.ts | 48 +
web/src/components/ui/sidebar/utils.ts | 19 +
web/src/components/ui/skeleton/Skeleton.vue | 17 +
web/src/components/ui/skeleton/index.ts | 1 +
web/src/components/ui/slider/Slider.vue | 18 +-
web/src/components/ui/stepper/Stepper.vue | 27 +
web/src/components/ui/stepper/StepperItem.vue | 23 +
.../ui/stepper/StepperSeparator.vue | 27 +
.../components/ui/stepper/StepperTitle.vue | 19 +
.../components/ui/stepper/StepperTrigger.vue | 22 +
web/src/components/ui/stepper/index.ts | 5 +
web/src/components/ui/switch/Switch.vue | 2 +-
web/src/components/ui/table/Table.vue | 16 +
web/src/components/ui/table/TableBody.vue | 17 +
web/src/components/ui/table/TableCell.vue | 22 +
web/src/components/ui/table/TableHead.vue | 17 +
web/src/components/ui/table/TableHeader.vue | 17 +
web/src/components/ui/table/TableRow.vue | 17 +
web/src/components/ui/table/index.ts | 6 +
web/src/components/ui/tabs/TabsList.vue | 2 +-
web/src/components/ui/tabs/TabsTrigger.vue | 2 +-
web/src/components/ui/textarea/Textarea.vue | 33 +-
web/src/components/ui/textarea/index.ts | 2 +-
.../ui/toggle-group/ToggleGroup.vue | 25 +-
.../ui/toggle-group/ToggleGroupItem.vue | 22 +-
web/src/components/ui/toggle/index.ts | 2 +-
.../components/ui/tooltip/TooltipContent.vue | 2 +-
web/src/composables/useTheme.ts | 54 +
web/src/i18n/en-US.ts | 261 +--
web/src/i18n/zh-CN.ts | 261 +--
web/src/style.css | 38 +-
web/src/views/ConsoleView.vue | 20 +-
web/src/views/LoginView.vue | 72 +-
web/src/views/SettingsView.vue | 1211 ++++++-------
web/src/views/SetupView.vue | 205 +--
146 files changed, 3790 insertions(+), 2982 deletions(-)
create mode 100644 web/src/components/ui/alert-dialog/AlertDialog.vue
create mode 100644 web/src/components/ui/alert/Alert.vue
create mode 100644 web/src/components/ui/alert/AlertDescription.vue
create mode 100644 web/src/components/ui/alert/AlertTitle.vue
create mode 100644 web/src/components/ui/alert/index.ts
create mode 100644 web/src/components/ui/button-group/ButtonGroup.vue
create mode 100644 web/src/components/ui/button-group/index.ts
create mode 100644 web/src/components/ui/collapsible/Collapsible.vue
create mode 100644 web/src/components/ui/collapsible/CollapsibleContent.vue
create mode 100644 web/src/components/ui/collapsible/CollapsibleTrigger.vue
create mode 100644 web/src/components/ui/collapsible/index.ts
create mode 100644 web/src/components/ui/empty/Empty.vue
create mode 100644 web/src/components/ui/empty/EmptyDescription.vue
create mode 100644 web/src/components/ui/empty/EmptyHeader.vue
create mode 100644 web/src/components/ui/empty/EmptyMedia.vue
create mode 100644 web/src/components/ui/empty/index.ts
create mode 100644 web/src/components/ui/field/Field.vue
create mode 100644 web/src/components/ui/field/FieldGroup.vue
create mode 100644 web/src/components/ui/field/FieldLabel.vue
create mode 100644 web/src/components/ui/field/index.ts
create mode 100644 web/src/components/ui/hover-card/HoverCard.vue
create mode 100644 web/src/components/ui/hover-card/HoverCardTrigger.vue
create mode 100644 web/src/components/ui/item/Item.vue
create mode 100644 web/src/components/ui/item/ItemContent.vue
create mode 100644 web/src/components/ui/item/ItemDescription.vue
create mode 100644 web/src/components/ui/item/ItemTitle.vue
create mode 100644 web/src/components/ui/item/index.ts
create mode 100644 web/src/components/ui/kbd/Kbd.vue
create mode 100644 web/src/components/ui/kbd/index.ts
create mode 100644 web/src/components/ui/native-select/NativeSelect.vue
create mode 100644 web/src/components/ui/native-select/NativeSelectOption.vue
create mode 100644 web/src/components/ui/native-select/index.ts
create mode 100644 web/src/components/ui/popover/Popover.vue
create mode 100644 web/src/components/ui/popover/PopoverTrigger.vue
create mode 100644 web/src/components/ui/scroll-area/ScrollBar.vue
create mode 100644 web/src/components/ui/sheet/Sheet.vue
create mode 100644 web/src/components/ui/sheet/SheetOverlay.vue
create mode 100644 web/src/components/ui/sidebar/Sidebar.vue
create mode 100644 web/src/components/ui/sidebar/SidebarContent.vue
create mode 100644 web/src/components/ui/sidebar/SidebarGroup.vue
create mode 100644 web/src/components/ui/sidebar/SidebarGroupLabel.vue
create mode 100644 web/src/components/ui/sidebar/SidebarHeader.vue
create mode 100644 web/src/components/ui/sidebar/SidebarInset.vue
create mode 100644 web/src/components/ui/sidebar/SidebarMenu.vue
create mode 100644 web/src/components/ui/sidebar/SidebarMenuButton.vue
create mode 100644 web/src/components/ui/sidebar/SidebarMenuButtonChild.vue
create mode 100644 web/src/components/ui/sidebar/SidebarMenuItem.vue
create mode 100644 web/src/components/ui/sidebar/SidebarProvider.vue
create mode 100644 web/src/components/ui/sidebar/SidebarTrigger.vue
create mode 100644 web/src/components/ui/sidebar/index.ts
create mode 100644 web/src/components/ui/sidebar/utils.ts
create mode 100644 web/src/components/ui/skeleton/Skeleton.vue
create mode 100644 web/src/components/ui/skeleton/index.ts
create mode 100644 web/src/components/ui/stepper/Stepper.vue
create mode 100644 web/src/components/ui/stepper/StepperItem.vue
create mode 100644 web/src/components/ui/stepper/StepperSeparator.vue
create mode 100644 web/src/components/ui/stepper/StepperTitle.vue
create mode 100644 web/src/components/ui/stepper/StepperTrigger.vue
create mode 100644 web/src/components/ui/stepper/index.ts
create mode 100644 web/src/components/ui/table/Table.vue
create mode 100644 web/src/components/ui/table/TableBody.vue
create mode 100644 web/src/components/ui/table/TableCell.vue
create mode 100644 web/src/components/ui/table/TableHead.vue
create mode 100644 web/src/components/ui/table/TableHeader.vue
create mode 100644 web/src/components/ui/table/TableRow.vue
create mode 100644 web/src/components/ui/table/index.ts
create mode 100644 web/src/composables/useTheme.ts
diff --git a/web/components.json b/web/components.json
index 903d0b97..8b4d60db 100644
--- a/web/components.json
+++ b/web/components.json
@@ -1,6 +1,6 @@
{
"$schema": "https://shadcn-vue.com/schema.json",
- "style": "new-york",
+ "style": "new-york-v4",
"typescript": true,
"tailwind": {
"config": "tailwind.config.js",
diff --git a/web/package-lock.json b/web/package-lock.json
index c4e99448..6273f71d 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -8,63 +8,62 @@
"name": "web",
"version": "0.2.4",
"dependencies": {
- "@vueuse/core": "^14.1.0",
+ "@vueuse/core": "^14.3.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lucide-vue-next": "^0.556.0",
"opus-decoder": "^0.7.11",
"pinia": "^3.0.4",
- "radix-vue": "^1.9.17",
- "reka-ui": "^2.6.1",
- "simple-keyboard": "^3.8.93",
- "tailwind-merge": "^3.4.0",
+ "reka-ui": "^2.10.1",
+ "simple-keyboard": "^3.8.163",
+ "tailwind-merge": "^3.6.0",
"tw-animate-css": "^1.4.0",
"uplot": "^1.6.32",
- "vue": "^3.5.24",
+ "vue": "^3.5.40",
"vue-i18n": "^9.14.5",
- "vue-router": "^4.6.3",
+ "vue-router": "^4.6.4",
"vue-sonner": "^2.0.9"
},
"devDependencies": {
- "@tailwindcss/forms": "^0.5.10",
- "@tailwindcss/typography": "^0.5.19",
- "@tailwindcss/vite": "^4.1.17",
- "@types/node": "^24.10.1",
- "@vitejs/plugin-vue": "^6.0.1",
+ "@tailwindcss/forms": "^0.5.11",
+ "@tailwindcss/typography": "^0.5.20",
+ "@tailwindcss/vite": "^4.3.3",
+ "@types/node": "^24.13.3",
+ "@vitejs/plugin-vue": "^6.0.8",
"@vue/tsconfig": "^0.8.1",
- "autoprefixer": "^10.4.22",
- "postcss": "^8.5.10",
- "tailwindcss": "^4.1.17",
+ "autoprefixer": "^10.5.4",
+ "postcss": "^8.5.19",
+ "tailwindcss": "^4.3.3",
"typescript": "~5.9.3",
- "vite": "^7.3.2",
- "vue-tsc": "^3.1.4"
+ "vite": "^7.3.6",
+ "vue-tsc": "^3.3.7"
}
},
"node_modules/@babel/helper-string-parser": {
- "version": "7.27.1",
- "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
- "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
+ "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.28.5",
- "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
- "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
- "version": "7.28.5",
- "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.5.tgz",
- "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.7.tgz",
+ "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==",
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.28.5"
+ "@babel/types": "^7.29.7"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -74,22 +73,22 @@
}
},
"node_modules/@babel/types": {
- "version": "7.28.5",
- "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz",
- "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.7.tgz",
+ "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-string-parser": "^7.27.1",
- "@babel/helper-validator-identifier": "^7.28.5"
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@esbuild/aix-ppc64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz",
- "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz",
+ "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==",
"cpu": [
"ppc64"
],
@@ -104,9 +103,9 @@
}
},
"node_modules/@esbuild/android-arm": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz",
- "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.28.1.tgz",
+ "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==",
"cpu": [
"arm"
],
@@ -121,9 +120,9 @@
}
},
"node_modules/@esbuild/android-arm64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz",
- "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz",
+ "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==",
"cpu": [
"arm64"
],
@@ -138,9 +137,9 @@
}
},
"node_modules/@esbuild/android-x64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz",
- "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.28.1.tgz",
+ "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==",
"cpu": [
"x64"
],
@@ -155,9 +154,9 @@
}
},
"node_modules/@esbuild/darwin-arm64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz",
- "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz",
+ "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==",
"cpu": [
"arm64"
],
@@ -172,9 +171,9 @@
}
},
"node_modules/@esbuild/darwin-x64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz",
- "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz",
+ "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==",
"cpu": [
"x64"
],
@@ -189,9 +188,9 @@
}
},
"node_modules/@esbuild/freebsd-arm64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz",
- "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz",
+ "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==",
"cpu": [
"arm64"
],
@@ -206,9 +205,9 @@
}
},
"node_modules/@esbuild/freebsd-x64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz",
- "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz",
+ "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==",
"cpu": [
"x64"
],
@@ -223,9 +222,9 @@
}
},
"node_modules/@esbuild/linux-arm": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz",
- "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz",
+ "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==",
"cpu": [
"arm"
],
@@ -240,9 +239,9 @@
}
},
"node_modules/@esbuild/linux-arm64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz",
- "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz",
+ "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==",
"cpu": [
"arm64"
],
@@ -257,9 +256,9 @@
}
},
"node_modules/@esbuild/linux-ia32": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz",
- "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz",
+ "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==",
"cpu": [
"ia32"
],
@@ -274,9 +273,9 @@
}
},
"node_modules/@esbuild/linux-loong64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz",
- "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz",
+ "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==",
"cpu": [
"loong64"
],
@@ -291,9 +290,9 @@
}
},
"node_modules/@esbuild/linux-mips64el": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz",
- "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz",
+ "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==",
"cpu": [
"mips64el"
],
@@ -308,9 +307,9 @@
}
},
"node_modules/@esbuild/linux-ppc64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz",
- "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz",
+ "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==",
"cpu": [
"ppc64"
],
@@ -325,9 +324,9 @@
}
},
"node_modules/@esbuild/linux-riscv64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz",
- "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz",
+ "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==",
"cpu": [
"riscv64"
],
@@ -342,9 +341,9 @@
}
},
"node_modules/@esbuild/linux-s390x": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz",
- "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz",
+ "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==",
"cpu": [
"s390x"
],
@@ -359,9 +358,9 @@
}
},
"node_modules/@esbuild/linux-x64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz",
- "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz",
+ "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==",
"cpu": [
"x64"
],
@@ -376,9 +375,9 @@
}
},
"node_modules/@esbuild/netbsd-arm64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz",
- "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz",
+ "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==",
"cpu": [
"arm64"
],
@@ -393,9 +392,9 @@
}
},
"node_modules/@esbuild/netbsd-x64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz",
- "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz",
+ "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==",
"cpu": [
"x64"
],
@@ -410,9 +409,9 @@
}
},
"node_modules/@esbuild/openbsd-arm64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz",
- "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz",
+ "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==",
"cpu": [
"arm64"
],
@@ -427,9 +426,9 @@
}
},
"node_modules/@esbuild/openbsd-x64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz",
- "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz",
+ "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==",
"cpu": [
"x64"
],
@@ -444,9 +443,9 @@
}
},
"node_modules/@esbuild/openharmony-arm64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz",
- "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz",
+ "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==",
"cpu": [
"arm64"
],
@@ -461,9 +460,9 @@
}
},
"node_modules/@esbuild/sunos-x64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz",
- "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz",
+ "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==",
"cpu": [
"x64"
],
@@ -478,9 +477,9 @@
}
},
"node_modules/@esbuild/win32-arm64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz",
- "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz",
+ "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==",
"cpu": [
"arm64"
],
@@ -495,9 +494,9 @@
}
},
"node_modules/@esbuild/win32-ia32": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz",
- "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz",
+ "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==",
"cpu": [
"ia32"
],
@@ -512,9 +511,9 @@
}
},
"node_modules/@esbuild/win32-x64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz",
- "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz",
+ "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==",
"cpu": [
"x64"
],
@@ -535,38 +534,38 @@
"license": "Apache-2.0"
},
"node_modules/@floating-ui/core": {
- "version": "1.7.3",
- "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.7.3.tgz",
- "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==",
+ "version": "1.8.0",
+ "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.8.0.tgz",
+ "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==",
"license": "MIT",
"dependencies": {
- "@floating-ui/utils": "^0.2.10"
+ "@floating-ui/utils": "^0.2.12"
}
},
"node_modules/@floating-ui/dom": {
- "version": "1.7.4",
- "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.7.4.tgz",
- "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==",
+ "version": "1.8.0",
+ "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.8.0.tgz",
+ "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==",
"license": "MIT",
"dependencies": {
- "@floating-ui/core": "^1.7.3",
- "@floating-ui/utils": "^0.2.10"
+ "@floating-ui/core": "^1.8.0",
+ "@floating-ui/utils": "^0.2.12"
}
},
"node_modules/@floating-ui/utils": {
- "version": "0.2.10",
- "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.10.tgz",
- "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==",
+ "version": "0.2.12",
+ "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.12.tgz",
+ "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==",
"license": "MIT"
},
"node_modules/@floating-ui/vue": {
- "version": "1.1.9",
- "resolved": "https://registry.npmmirror.com/@floating-ui/vue/-/vue-1.1.9.tgz",
- "integrity": "sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ==",
+ "version": "1.1.11",
+ "resolved": "https://registry.npmmirror.com/@floating-ui/vue/-/vue-1.1.11.tgz",
+ "integrity": "sha512-HzHKCNVxnGS35r9fCHBc3+uCnjw9IWIlCPL683cGgM9Kgj2BiAl8x1mS7vtvP6F9S/e/q4O6MApwSHj8hNLGfw==",
"license": "MIT",
"dependencies": {
- "@floating-ui/dom": "^1.7.4",
- "@floating-ui/utils": "^0.2.10",
+ "@floating-ui/dom": "^1.7.6",
+ "@floating-ui/utils": "^0.2.11",
"vue-demi": ">=0.13.0"
}
},
@@ -597,18 +596,18 @@
}
},
"node_modules/@internationalized/date": {
- "version": "3.10.0",
- "resolved": "https://registry.npmmirror.com/@internationalized/date/-/date-3.10.0.tgz",
- "integrity": "sha512-oxDR/NTEJ1k+UFVQElaNIk65E/Z83HK1z1WI3lQyhTtnNg4R5oVXaPzK3jcpKG8UHKDVuDQHzn+wsxSz8RP3aw==",
+ "version": "3.12.2",
+ "resolved": "https://registry.npmmirror.com/@internationalized/date/-/date-3.12.2.tgz",
+ "integrity": "sha512-FY1Y+H64NDs+HAF6omlnWxm3mEpfgaCSWtL5l551ZZfImA+kGjPFgrnJrGjH6lfmLL0g8Z/mBu1R3kufeCp6Jw==",
"license": "Apache-2.0",
"dependencies": {
"@swc/helpers": "^0.5.0"
}
},
"node_modules/@internationalized/number": {
- "version": "3.6.5",
- "resolved": "https://registry.npmmirror.com/@internationalized/number/-/number-3.6.5.tgz",
- "integrity": "sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==",
+ "version": "3.6.7",
+ "resolved": "https://registry.npmmirror.com/@internationalized/number/-/number-3.6.7.tgz",
+ "integrity": "sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg==",
"license": "Apache-2.0",
"dependencies": {
"@swc/helpers": "^0.5.0"
@@ -708,16 +707,16 @@
}
},
"node_modules/@rolldown/pluginutils": {
- "version": "1.0.0-beta.50",
- "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.50.tgz",
- "integrity": "sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
+ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
"dev": true,
"license": "MIT"
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz",
- "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz",
+ "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==",
"cpu": [
"arm"
],
@@ -729,9 +728,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz",
- "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz",
+ "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==",
"cpu": [
"arm64"
],
@@ -743,9 +742,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz",
- "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz",
+ "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==",
"cpu": [
"arm64"
],
@@ -757,9 +756,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz",
- "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz",
+ "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==",
"cpu": [
"x64"
],
@@ -771,9 +770,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz",
- "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz",
+ "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==",
"cpu": [
"arm64"
],
@@ -785,9 +784,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz",
- "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz",
+ "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==",
"cpu": [
"x64"
],
@@ -799,16 +798,13 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz",
- "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz",
+ "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==",
"cpu": [
"arm"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -816,16 +812,13 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz",
- "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz",
+ "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==",
"cpu": [
"arm"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -833,16 +826,13 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz",
- "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz",
+ "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==",
"cpu": [
"arm64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -850,16 +840,13 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz",
- "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz",
+ "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==",
"cpu": [
"arm64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -867,16 +854,13 @@
]
},
"node_modules/@rollup/rollup-linux-loong64-gnu": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz",
- "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz",
+ "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==",
"cpu": [
"loong64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -884,16 +868,13 @@
]
},
"node_modules/@rollup/rollup-linux-loong64-musl": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz",
- "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz",
+ "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==",
"cpu": [
"loong64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -901,16 +882,13 @@
]
},
"node_modules/@rollup/rollup-linux-ppc64-gnu": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz",
- "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz",
+ "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==",
"cpu": [
"ppc64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -918,16 +896,13 @@
]
},
"node_modules/@rollup/rollup-linux-ppc64-musl": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz",
- "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz",
+ "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==",
"cpu": [
"ppc64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -935,16 +910,13 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz",
- "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz",
+ "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==",
"cpu": [
"riscv64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -952,16 +924,13 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz",
- "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz",
+ "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==",
"cpu": [
"riscv64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -969,16 +938,13 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz",
- "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz",
+ "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==",
"cpu": [
"s390x"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -986,16 +952,13 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz",
- "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz",
+ "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==",
"cpu": [
"x64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1003,16 +966,13 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz",
- "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz",
+ "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==",
"cpu": [
"x64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1020,9 +980,9 @@
]
},
"node_modules/@rollup/rollup-openbsd-x64": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz",
- "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz",
+ "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==",
"cpu": [
"x64"
],
@@ -1034,9 +994,9 @@
]
},
"node_modules/@rollup/rollup-openharmony-arm64": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz",
- "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz",
+ "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==",
"cpu": [
"arm64"
],
@@ -1048,9 +1008,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz",
- "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz",
+ "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==",
"cpu": [
"arm64"
],
@@ -1062,9 +1022,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz",
- "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz",
+ "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==",
"cpu": [
"ia32"
],
@@ -1076,9 +1036,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-gnu": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz",
- "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz",
+ "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==",
"cpu": [
"x64"
],
@@ -1090,9 +1050,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz",
- "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz",
+ "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==",
"cpu": [
"x64"
],
@@ -1104,18 +1064,18 @@
]
},
"node_modules/@swc/helpers": {
- "version": "0.5.17",
- "resolved": "https://registry.npmmirror.com/@swc/helpers/-/helpers-0.5.17.tgz",
- "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==",
+ "version": "0.5.23",
+ "resolved": "https://registry.npmmirror.com/@swc/helpers/-/helpers-0.5.23.tgz",
+ "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.8.0"
}
},
"node_modules/@tailwindcss/forms": {
- "version": "0.5.10",
- "resolved": "https://registry.npmmirror.com/@tailwindcss/forms/-/forms-0.5.10.tgz",
- "integrity": "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==",
+ "version": "0.5.11",
+ "resolved": "https://registry.npmmirror.com/@tailwindcss/forms/-/forms-0.5.11.tgz",
+ "integrity": "sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1126,49 +1086,49 @@
}
},
"node_modules/@tailwindcss/node": {
- "version": "4.1.17",
- "resolved": "https://registry.npmmirror.com/@tailwindcss/node/-/node-4.1.17.tgz",
- "integrity": "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/@tailwindcss/node/-/node-4.3.3.tgz",
+ "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jridgewell/remapping": "^2.3.4",
- "enhanced-resolve": "^5.18.3",
- "jiti": "^2.6.1",
- "lightningcss": "1.30.2",
+ "@jridgewell/remapping": "^2.3.5",
+ "enhanced-resolve": "^5.24.1",
+ "jiti": "^2.7.0",
+ "lightningcss": "1.32.0",
"magic-string": "^0.30.21",
"source-map-js": "^1.2.1",
- "tailwindcss": "4.1.17"
+ "tailwindcss": "4.3.3"
}
},
"node_modules/@tailwindcss/oxide": {
- "version": "4.1.17",
- "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide/-/oxide-4.1.17.tgz",
- "integrity": "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide/-/oxide-4.3.3.tgz",
+ "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
},
"optionalDependencies": {
- "@tailwindcss/oxide-android-arm64": "4.1.17",
- "@tailwindcss/oxide-darwin-arm64": "4.1.17",
- "@tailwindcss/oxide-darwin-x64": "4.1.17",
- "@tailwindcss/oxide-freebsd-x64": "4.1.17",
- "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.17",
- "@tailwindcss/oxide-linux-arm64-gnu": "4.1.17",
- "@tailwindcss/oxide-linux-arm64-musl": "4.1.17",
- "@tailwindcss/oxide-linux-x64-gnu": "4.1.17",
- "@tailwindcss/oxide-linux-x64-musl": "4.1.17",
- "@tailwindcss/oxide-wasm32-wasi": "4.1.17",
- "@tailwindcss/oxide-win32-arm64-msvc": "4.1.17",
- "@tailwindcss/oxide-win32-x64-msvc": "4.1.17"
+ "@tailwindcss/oxide-android-arm64": "4.3.3",
+ "@tailwindcss/oxide-darwin-arm64": "4.3.3",
+ "@tailwindcss/oxide-darwin-x64": "4.3.3",
+ "@tailwindcss/oxide-freebsd-x64": "4.3.3",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.3.3",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.3.3",
+ "@tailwindcss/oxide-linux-x64-musl": "4.3.3",
+ "@tailwindcss/oxide-wasm32-wasi": "4.3.3",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.3.3"
}
},
"node_modules/@tailwindcss/oxide-android-arm64": {
- "version": "4.1.17",
- "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.17.tgz",
- "integrity": "sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz",
+ "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==",
"cpu": [
"arm64"
],
@@ -1179,13 +1139,13 @@
"android"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-darwin-arm64": {
- "version": "4.1.17",
- "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.17.tgz",
- "integrity": "sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz",
+ "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==",
"cpu": [
"arm64"
],
@@ -1196,13 +1156,13 @@
"darwin"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-darwin-x64": {
- "version": "4.1.17",
- "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.17.tgz",
- "integrity": "sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz",
+ "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==",
"cpu": [
"x64"
],
@@ -1213,13 +1173,13 @@
"darwin"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-freebsd-x64": {
- "version": "4.1.17",
- "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.17.tgz",
- "integrity": "sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz",
+ "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==",
"cpu": [
"x64"
],
@@ -1230,13 +1190,13 @@
"freebsd"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
- "version": "4.1.17",
- "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.17.tgz",
- "integrity": "sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz",
+ "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==",
"cpu": [
"arm"
],
@@ -1247,13 +1207,13 @@
"linux"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
- "version": "4.1.17",
- "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.17.tgz",
- "integrity": "sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz",
+ "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==",
"cpu": [
"arm64"
],
@@ -1264,13 +1224,13 @@
"linux"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-linux-arm64-musl": {
- "version": "4.1.17",
- "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.17.tgz",
- "integrity": "sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz",
+ "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==",
"cpu": [
"arm64"
],
@@ -1281,13 +1241,13 @@
"linux"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-linux-x64-gnu": {
- "version": "4.1.17",
- "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.17.tgz",
- "integrity": "sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz",
+ "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==",
"cpu": [
"x64"
],
@@ -1298,13 +1258,13 @@
"linux"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-linux-x64-musl": {
- "version": "4.1.17",
- "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.17.tgz",
- "integrity": "sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz",
+ "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==",
"cpu": [
"x64"
],
@@ -1315,13 +1275,13 @@
"linux"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-wasm32-wasi": {
- "version": "4.1.17",
- "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.17.tgz",
- "integrity": "sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz",
+ "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==",
"bundleDependencies": [
"@napi-rs/wasm-runtime",
"@emnapi/core",
@@ -1337,40 +1297,19 @@
"license": "MIT",
"optional": true,
"dependencies": {
- "@emnapi/core": "^1.6.0",
- "@emnapi/runtime": "^1.6.0",
- "@emnapi/wasi-threads": "^1.1.0",
- "@napi-rs/wasm-runtime": "^1.0.7",
- "@tybys/wasm-util": "^0.10.1",
- "tslib": "^2.4.0"
+ "@emnapi/core": "^1.11.1",
+ "@emnapi/runtime": "^1.11.1",
+ "@emnapi/wasi-threads": "^1.2.2",
+ "@napi-rs/wasm-runtime": "^1.1.4",
+ "@tybys/wasm-util": "^0.10.2",
+ "tslib": "^2.8.1"
},
"engines": {
"node": ">=14.0.0"
}
},
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": {
- "version": "1.6.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/wasi-threads": "1.1.0",
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": {
- "version": "1.6.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
"node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": {
- "version": "1.1.0",
+ "version": "1.2.2",
"dev": true,
"inBundle": true,
"license": "MIT",
@@ -1380,19 +1319,25 @@
}
},
"node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": {
- "version": "1.0.7",
+ "version": "1.1.4",
"dev": true,
"inBundle": true,
"license": "MIT",
"optional": true,
"dependencies": {
- "@emnapi/core": "^1.5.0",
- "@emnapi/runtime": "^1.5.0",
"@tybys/wasm-util": "^0.10.1"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "peerDependencies": {
+ "@emnapi/core": "^1.7.1",
+ "@emnapi/runtime": "^1.7.1"
}
},
"node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": {
- "version": "0.10.1",
+ "version": "0.10.2",
"dev": true,
"inBundle": true,
"license": "MIT",
@@ -1409,9 +1354,9 @@
"optional": true
},
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
- "version": "4.1.17",
- "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.17.tgz",
- "integrity": "sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz",
+ "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==",
"cpu": [
"arm64"
],
@@ -1422,13 +1367,13 @@
"win32"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-win32-x64-msvc": {
- "version": "4.1.17",
- "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.17.tgz",
- "integrity": "sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz",
+ "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==",
"cpu": [
"x64"
],
@@ -1439,41 +1384,41 @@
"win32"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/typography": {
- "version": "0.5.19",
- "resolved": "https://registry.npmmirror.com/@tailwindcss/typography/-/typography-0.5.19.tgz",
- "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==",
+ "version": "0.5.20",
+ "resolved": "https://registry.npmmirror.com/@tailwindcss/typography/-/typography-0.5.20.tgz",
+ "integrity": "sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw==",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-selector-parser": "6.0.10"
},
"peerDependencies": {
- "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1"
+ "tailwindcss": ">=3.0.0 || >=4.0.0 || insiders"
}
},
"node_modules/@tailwindcss/vite": {
- "version": "4.1.17",
- "resolved": "https://registry.npmmirror.com/@tailwindcss/vite/-/vite-4.1.17.tgz",
- "integrity": "sha512-4+9w8ZHOiGnpcGI6z1TVVfWaX/koK7fKeSYF3qlYg2xpBtbteP2ddBxiarL+HVgfSJGeK5RIxRQmKm4rTJJAwA==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/@tailwindcss/vite/-/vite-4.3.3.tgz",
+ "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@tailwindcss/node": "4.1.17",
- "@tailwindcss/oxide": "4.1.17",
- "tailwindcss": "4.1.17"
+ "@tailwindcss/node": "4.3.3",
+ "@tailwindcss/oxide": "4.3.3",
+ "tailwindcss": "4.3.3"
},
"peerDependencies": {
- "vite": "^5.2.0 || ^6 || ^7"
+ "vite": "^5.2.0 || ^6 || ^7 || ^8"
}
},
"node_modules/@tanstack/virtual-core": {
- "version": "3.13.12",
- "resolved": "https://registry.npmmirror.com/@tanstack/virtual-core/-/virtual-core-3.13.12.tgz",
- "integrity": "sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==",
+ "version": "3.17.4",
+ "resolved": "https://registry.npmmirror.com/@tanstack/virtual-core/-/virtual-core-3.17.4.tgz",
+ "integrity": "sha512-nGm5KteqxasUdThLc2izl6dHUqLv0LQj7Nuyo5gYalTPf/U8a9ermvsl7reT+6ioBW1l8WfpP/mcU338nLXpqw==",
"license": "MIT",
"funding": {
"type": "github",
@@ -1481,12 +1426,12 @@
}
},
"node_modules/@tanstack/vue-virtual": {
- "version": "3.13.12",
- "resolved": "https://registry.npmmirror.com/@tanstack/vue-virtual/-/vue-virtual-3.13.12.tgz",
- "integrity": "sha512-vhF7kEU9EXWXh+HdAwKJ2m3xaOnTTmgcdXcF2pim8g4GvI7eRrk2YRuV5nUlZnd/NbCIX4/Ja2OZu5EjJL06Ww==",
+ "version": "3.13.32",
+ "resolved": "https://registry.npmmirror.com/@tanstack/vue-virtual/-/vue-virtual-3.13.32.tgz",
+ "integrity": "sha512-E8OCutx7QnwZdvpJijz0Q2PHsYDWBWjnGr3TvgWiqxTU35jB1kVhtkd93scRV7tTFuId2tg3x2iFiw+IE4evjQ==",
"license": "MIT",
"dependencies": {
- "@tanstack/virtual-core": "3.13.12"
+ "@tanstack/virtual-core": "3.17.4"
},
"funding": {
"type": "github",
@@ -1497,20 +1442,21 @@
}
},
"node_modules/@types/estree": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
- "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "version": "1.0.9",
+ "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.9.tgz",
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "24.10.1",
- "resolved": "https://registry.npmmirror.com/@types/node/-/node-24.10.1.tgz",
- "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==",
+ "version": "24.13.3",
+ "resolved": "https://registry.npmmirror.com/@types/node/-/node-24.13.3.tgz",
+ "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
- "undici-types": "~7.16.0"
+ "undici-types": "~7.18.0"
}
},
"node_modules/@types/web-bluetooth": {
@@ -1520,117 +1466,117 @@
"license": "MIT"
},
"node_modules/@vitejs/plugin-vue": {
- "version": "6.0.2",
- "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-6.0.2.tgz",
- "integrity": "sha512-iHmwV3QcVGGvSC1BG5bZ4z6iwa1SOpAPWmnjOErd4Ske+lZua5K9TtAVdx0gMBClJ28DViCbSmZitjWZsWO3LA==",
+ "version": "6.0.8",
+ "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-6.0.8.tgz",
+ "integrity": "sha512-0ZjgOg7oO6farnNGup7yvoM/YXZV84OZxHAwtflItNa/6zzQyVb5LNxyea3FEKEX2XlagIKzrlH7wwxkKgtiew==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@rolldown/pluginutils": "1.0.0-beta.50"
+ "@rolldown/pluginutils": "^1.0.1"
},
"engines": {
"node": "^20.19.0 || >=22.12.0"
},
"peerDependencies": {
- "vite": "^5.0.0 || ^6.0.0 || ^7.0.0",
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0",
"vue": "^3.2.25"
}
},
"node_modules/@volar/language-core": {
- "version": "2.4.26",
- "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.26.tgz",
- "integrity": "sha512-hH0SMitMxnB43OZpyF1IFPS9bgb2I3bpCh76m2WEK7BE0A0EzpYsRp0CCH2xNKshr7kacU5TQBLYn4zj7CG60A==",
+ "version": "2.4.28",
+ "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.28.tgz",
+ "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@volar/source-map": "2.4.26"
+ "@volar/source-map": "2.4.28"
}
},
"node_modules/@volar/source-map": {
- "version": "2.4.26",
- "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.26.tgz",
- "integrity": "sha512-JJw0Tt/kSFsIRmgTQF4JSt81AUSI1aEye5Zl65EeZ8H35JHnTvFGmpDOBn5iOxd48fyGE+ZvZBp5FcgAy/1Qhw==",
+ "version": "2.4.28",
+ "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.28.tgz",
+ "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@volar/typescript": {
- "version": "2.4.26",
- "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.26.tgz",
- "integrity": "sha512-N87ecLD48Sp6zV9zID/5yuS1+5foj0DfuYGdQ6KHj/IbKvyKv1zNX6VCmnKYwtmHadEO6mFc2EKISiu3RDPAvA==",
+ "version": "2.4.28",
+ "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.28.tgz",
+ "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@volar/language-core": "2.4.26",
+ "@volar/language-core": "2.4.28",
"path-browserify": "^1.0.1",
"vscode-uri": "^3.0.8"
}
},
"node_modules/@vue/compiler-core": {
- "version": "3.5.25",
- "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.25.tgz",
- "integrity": "sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==",
+ "version": "3.5.40",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.40.tgz",
+ "integrity": "sha512-39E8IgOhTbVDnoJFMKc2DvYnypcZwUqgUhQkccva/0m6FUwtIKSGV7n1hpVmYcFaoRAwf9pBcwnKlCEsN63ZEQ==",
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.28.5",
- "@vue/shared": "3.5.25",
- "entities": "^4.5.0",
+ "@babel/parser": "^7.29.7",
+ "@vue/shared": "3.5.40",
+ "entities": "^7.0.1",
"estree-walker": "^2.0.2",
"source-map-js": "^1.2.1"
}
},
"node_modules/@vue/compiler-dom": {
- "version": "3.5.25",
- "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.25.tgz",
- "integrity": "sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==",
+ "version": "3.5.40",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.40.tgz",
+ "integrity": "sha512-pwkx4vqlqOspFstrcmzwkKLePVMD3PT65imRzLhanU2V1Fj4K13g6OXjanOyzw3aTAuRk84BOmY8f3rEHqPaVA==",
"license": "MIT",
"dependencies": {
- "@vue/compiler-core": "3.5.25",
- "@vue/shared": "3.5.25"
+ "@vue/compiler-core": "3.5.40",
+ "@vue/shared": "3.5.40"
}
},
"node_modules/@vue/compiler-sfc": {
- "version": "3.5.25",
- "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.25.tgz",
- "integrity": "sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==",
+ "version": "3.5.40",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.40.tgz",
+ "integrity": "sha512-gIf497P4kpuALcvs5n3AEg1Vdn0pSY4XbjASIfHNYF1/MP3T2Mf2STERTubysBxCRxzJGJYtF/O7vwJrxFB3Vw==",
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.28.5",
- "@vue/compiler-core": "3.5.25",
- "@vue/compiler-dom": "3.5.25",
- "@vue/compiler-ssr": "3.5.25",
- "@vue/shared": "3.5.25",
+ "@babel/parser": "^7.29.7",
+ "@vue/compiler-core": "3.5.40",
+ "@vue/compiler-dom": "3.5.40",
+ "@vue/compiler-ssr": "3.5.40",
+ "@vue/shared": "3.5.40",
"estree-walker": "^2.0.2",
"magic-string": "^0.30.21",
- "postcss": "^8.5.6",
+ "postcss": "^8.5.19",
"source-map-js": "^1.2.1"
}
},
"node_modules/@vue/compiler-ssr": {
- "version": "3.5.25",
- "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.25.tgz",
- "integrity": "sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==",
+ "version": "3.5.40",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.40.tgz",
+ "integrity": "sha512-rrE5xiXG663+vHCHa3J9p2z5OcBRjXmoqenprJxAFQxg5pSshzeBiCE6pu46axapRJ2Adk0YDA2BRZVjiHXnhg==",
"license": "MIT",
"dependencies": {
- "@vue/compiler-dom": "3.5.25",
- "@vue/shared": "3.5.25"
+ "@vue/compiler-dom": "3.5.40",
+ "@vue/shared": "3.5.40"
}
},
"node_modules/@vue/devtools-api": {
- "version": "7.7.9",
- "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.9.tgz",
- "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==",
+ "version": "7.7.10",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.10.tgz",
+ "integrity": "sha512-KxtEpUOOpFz/qOGRrAwA36QF7DqIA+FXgCYit9mk9wjbaZt0sXOFz81ElOZtKA4HbWHUdwNjZHBFsFFyp5BZiA==",
"license": "MIT",
"dependencies": {
- "@vue/devtools-kit": "^7.7.9"
+ "@vue/devtools-kit": "^7.7.10"
}
},
"node_modules/@vue/devtools-kit": {
- "version": "7.7.9",
- "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz",
- "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==",
+ "version": "7.7.10",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.10.tgz",
+ "integrity": "sha512-3WNi2Kq4tbpVbmhml7RiphmAt0279oh3fKNeWMQIrltfX8Q91b4i5PL8DtyNKdwmcsGrV4fg+erwWOmD05CLIw==",
"license": "MIT",
"dependencies": {
- "@vue/devtools-shared": "^7.7.9",
+ "@vue/devtools-shared": "^7.7.10",
"birpc": "^2.3.0",
"hookable": "^5.5.3",
"mitt": "^3.0.1",
@@ -1640,86 +1586,76 @@
}
},
"node_modules/@vue/devtools-shared": {
- "version": "7.7.9",
- "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz",
- "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==",
+ "version": "7.7.10",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.10.tgz",
+ "integrity": "sha512-wOPslzB8vTvpxwdaOcR2qAbwmuSP0L+rhpoC6Cf56V3Jip+HWb7PQQXOUPgBNQARpXsbQX/+mvi8kKucmBGRwQ==",
"license": "MIT",
"dependencies": {
"rfdc": "^1.4.1"
}
},
"node_modules/@vue/language-core": {
- "version": "3.1.6",
- "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-3.1.6.tgz",
- "integrity": "sha512-F3BIvDVyyj+6Sgl9Ev9zsb/DJ48rrH2EiI5NnIEpJKo7Yk8v0n2QjfG7/RYyFhYSMOJcsf6aAt5hx4JaNbhKbg==",
+ "version": "3.3.7",
+ "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-3.3.7.tgz",
+ "integrity": "sha512-LzmkKinXAMMoh8Jfi/jMUSDUjuPdv8mynH5WJGKfXyZtDw3hQ6GBaoI6Bcnl/Xqlu32q/0Z6i/trp4VXykzyLw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@volar/language-core": "2.4.26",
+ "@volar/language-core": "2.4.28",
"@vue/compiler-dom": "^3.5.0",
"@vue/shared": "^3.5.0",
- "alien-signals": "^3.0.0",
+ "alien-signals": "^3.2.1",
"muggle-string": "^0.4.1",
"path-browserify": "^1.0.1",
- "picomatch": "^4.0.2"
- },
- "peerDependencies": {
- "typescript": "*"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "picomatch": "^4.0.4"
}
},
"node_modules/@vue/reactivity": {
- "version": "3.5.25",
- "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.25.tgz",
- "integrity": "sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==",
+ "version": "3.5.40",
+ "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.40.tgz",
+ "integrity": "sha512-B7ot9UlUZOi1zbq61/LvE88ZLTV8IlajTdiZTAEiDQgrnIMIZoPr9kGw0Zw46ObW62O9+H/Be3kMbfb7kYPQZA==",
"license": "MIT",
"dependencies": {
- "@vue/shared": "3.5.25"
+ "@vue/shared": "3.5.40"
}
},
"node_modules/@vue/runtime-core": {
- "version": "3.5.25",
- "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.25.tgz",
- "integrity": "sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==",
+ "version": "3.5.40",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.40.tgz",
+ "integrity": "sha512-KAZLweuZ6uUJPK1PMSQPgBU5gCjgrrfjUhSglmU9NhH+Zjepa8cnwSydPWDWHDwOgY4g3VcZ+PljbiHlURNCbw==",
"license": "MIT",
"dependencies": {
- "@vue/reactivity": "3.5.25",
- "@vue/shared": "3.5.25"
+ "@vue/reactivity": "3.5.40",
+ "@vue/shared": "3.5.40"
}
},
"node_modules/@vue/runtime-dom": {
- "version": "3.5.25",
- "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.25.tgz",
- "integrity": "sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==",
+ "version": "3.5.40",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.40.tgz",
+ "integrity": "sha512-ZfrX8ssZQds900L9pr8AuK05ddnMsR4MPMZr8cPN9GoqoPWcXLhjvvbIA2SMv+7a97sJ1vv9pj/zxK0Cq/eEFQ==",
"license": "MIT",
"dependencies": {
- "@vue/reactivity": "3.5.25",
- "@vue/runtime-core": "3.5.25",
- "@vue/shared": "3.5.25",
- "csstype": "^3.1.3"
+ "@vue/reactivity": "3.5.40",
+ "@vue/runtime-core": "3.5.40",
+ "@vue/shared": "3.5.40",
+ "csstype": "^3.2.3"
}
},
"node_modules/@vue/server-renderer": {
- "version": "3.5.25",
- "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.25.tgz",
- "integrity": "sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==",
+ "version": "3.5.40",
+ "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.40.tgz",
+ "integrity": "sha512-XNJym9WpevhTVt1HuwOrCRJ5Q+9z4BjTMrDtjTrvx74SmUll8spNTw6whWJa9mEkO4PKn5TihI/bm/8ds2QVJw==",
"license": "MIT",
"dependencies": {
- "@vue/compiler-ssr": "3.5.25",
- "@vue/shared": "3.5.25"
- },
- "peerDependencies": {
- "vue": "3.5.25"
+ "@vue/compiler-ssr": "3.5.40",
+ "@vue/runtime-dom": "3.5.40",
+ "@vue/shared": "3.5.40"
}
},
"node_modules/@vue/shared": {
- "version": "3.5.25",
- "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.25.tgz",
- "integrity": "sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==",
+ "version": "3.5.40",
+ "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.40.tgz",
+ "integrity": "sha512-WxnBtruIqOoV3rA4jeKDWzrYI5h7Cp4+pjwDi8kWGHz+IslhiN+wguLVVhtv2l8VoU02rzDCVfDjgCl1lNpZVg==",
"license": "MIT"
},
"node_modules/@vue/tsconfig": {
@@ -1742,14 +1678,14 @@
}
},
"node_modules/@vueuse/core": {
- "version": "14.1.0",
- "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-14.1.0.tgz",
- "integrity": "sha512-rgBinKs07hAYyPF834mDTigH7BtPqvZ3Pryuzt1SD/lg5wEcWqvwzXXYGEDb2/cP0Sj5zSvHl3WkmMELr5kfWw==",
+ "version": "14.3.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-14.3.0.tgz",
+ "integrity": "sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==",
"license": "MIT",
"dependencies": {
"@types/web-bluetooth": "^0.0.21",
- "@vueuse/metadata": "14.1.0",
- "@vueuse/shared": "14.1.0"
+ "@vueuse/metadata": "14.3.0",
+ "@vueuse/shared": "14.3.0"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
@@ -1758,63 +1694,25 @@
"vue": "^3.5.0"
}
},
- "node_modules/@vueuse/core/node_modules/@vueuse/shared": {
- "version": "14.1.0",
- "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-14.1.0.tgz",
- "integrity": "sha512-EcKxtYvn6gx1F8z9J5/rsg3+lTQnvOruQd8fUecW99DCK04BkWD7z5KQ/wTAx+DazyoEE9dJt/zV8OIEQbM6kw==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- },
- "peerDependencies": {
- "vue": "^3.5.0"
- }
- },
"node_modules/@vueuse/metadata": {
- "version": "14.1.0",
- "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-14.1.0.tgz",
- "integrity": "sha512-7hK4g015rWn2PhKcZ99NyT+ZD9sbwm7SGvp7k+k+rKGWnLjS/oQozoIZzWfCewSUeBmnJkIb+CNr7Zc/EyRnnA==",
+ "version": "14.3.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-14.3.0.tgz",
+ "integrity": "sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/@vueuse/shared": {
- "version": "10.11.1",
- "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-10.11.1.tgz",
- "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==",
+ "version": "14.3.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-14.3.0.tgz",
+ "integrity": "sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==",
"license": "MIT",
- "dependencies": {
- "vue-demi": ">=0.14.8"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/@vueuse/shared/node_modules/vue-demi": {
- "version": "0.14.10",
- "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
- "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
- "hasInstallScript": true,
- "license": "MIT",
- "bin": {
- "vue-demi-fix": "bin/vue-demi-fix.js",
- "vue-demi-switch": "bin/vue-demi-switch.js"
- },
- "engines": {
- "node": ">=12"
- },
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
- "@vue/composition-api": "^1.0.0-rc.1",
- "vue": "^3.0.0-0 || ^2.6.0"
- },
- "peerDependenciesMeta": {
- "@vue/composition-api": {
- "optional": true
- }
+ "vue": "^3.5.0"
}
},
"node_modules/@wasm-audio-decoders/common": {
@@ -1828,9 +1726,9 @@
}
},
"node_modules/alien-signals": {
- "version": "3.1.1",
- "resolved": "https://registry.npmmirror.com/alien-signals/-/alien-signals-3.1.1.tgz",
- "integrity": "sha512-ogkIWbVrLwKtHY6oOAXaYkAxP+cTH7V5FZ5+Tm4NZFd8VDZ6uNMDrfzqctTZ42eTMCSR3ne3otpcxmqSnFfPYA==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmmirror.com/alien-signals/-/alien-signals-3.2.1.tgz",
+ "integrity": "sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g==",
"dev": true,
"license": "MIT"
},
@@ -1847,9 +1745,9 @@
}
},
"node_modules/autoprefixer": {
- "version": "10.4.22",
- "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.22.tgz",
- "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==",
+ "version": "10.5.4",
+ "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.5.4.tgz",
+ "integrity": "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==",
"dev": true,
"funding": [
{
@@ -1867,10 +1765,9 @@
],
"license": "MIT",
"dependencies": {
- "browserslist": "^4.27.0",
- "caniuse-lite": "^1.0.30001754",
+ "browserslist": "^4.28.6",
+ "caniuse-lite": "^1.0.30001806",
"fraction.js": "^5.3.4",
- "normalize-range": "^0.1.2",
"picocolors": "^1.1.1",
"postcss-value-parser": "^4.2.0"
},
@@ -1885,13 +1782,16 @@
}
},
"node_modules/baseline-browser-mapping": {
- "version": "2.9.4",
- "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.4.tgz",
- "integrity": "sha512-ZCQ9GEWl73BVm8bu5Fts8nt7MHdbt5vY9bP6WGnUh+r3l8M7CgfyTlwsgCbMC66BNxPr6Xoce3j66Ms5YUQTNA==",
+ "version": "2.10.43",
+ "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.43.tgz",
+ "integrity": "sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==",
"dev": true,
"license": "Apache-2.0",
"bin": {
- "baseline-browser-mapping": "dist/cli.js"
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
}
},
"node_modules/birpc": {
@@ -1904,9 +1804,9 @@
}
},
"node_modules/browserslist": {
- "version": "4.28.1",
- "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.1.tgz",
- "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
+ "version": "4.28.6",
+ "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.6.tgz",
+ "integrity": "sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==",
"dev": true,
"funding": [
{
@@ -1923,12 +1823,13 @@
}
],
"license": "MIT",
+ "peer": true,
"dependencies": {
- "baseline-browser-mapping": "^2.9.0",
- "caniuse-lite": "^1.0.30001759",
- "electron-to-chromium": "^1.5.263",
- "node-releases": "^2.0.27",
- "update-browserslist-db": "^1.2.0"
+ "baseline-browser-mapping": "^2.10.42",
+ "caniuse-lite": "^1.0.30001803",
+ "electron-to-chromium": "^1.5.389",
+ "node-releases": "^2.0.51",
+ "update-browserslist-db": "^1.2.3"
},
"bin": {
"browserslist": "cli.js"
@@ -1938,9 +1839,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001759",
- "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001759.tgz",
- "integrity": "sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==",
+ "version": "1.0.30001806",
+ "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz",
+ "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==",
"dev": true,
"funding": [
{
@@ -2015,7 +1916,7 @@
},
"node_modules/defu": {
"version": "6.1.7",
- "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz",
+ "resolved": "https://registry.npmmirror.com/defu/-/defu-6.1.7.tgz",
"integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==",
"license": "MIT"
},
@@ -2030,30 +1931,30 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.266",
- "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.266.tgz",
- "integrity": "sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg==",
+ "version": "1.5.392",
+ "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.392.tgz",
+ "integrity": "sha512-1yQq3VQCZRwsnYc67Oc+1fge6Lwtn0hzi6zmEVkB61Zx21kTbwJAW4dFLadl5Rc1tKhG/kSpYXnfiAhu0f0a1g==",
"dev": true,
"license": "ISC"
},
"node_modules/enhanced-resolve": {
- "version": "5.18.3",
- "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
- "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
+ "version": "5.24.2",
+ "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.24.2.tgz",
+ "integrity": "sha512-rpsZEGT1jFuve6QlpyRp9ckQ+kN61hvF9BzCPyMdaKTm8UJce96KBn3sorXOFXlzjPrs3Vc4T1NsSroZ3PxlFw==",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
+ "tapable": "^2.3.3"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/entities": {
- "version": "4.5.0",
- "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
- "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz",
+ "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.12"
@@ -2063,9 +1964,9 @@
}
},
"node_modules/esbuild": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz",
- "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==",
+ "version": "0.28.1",
+ "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.28.1.tgz",
+ "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -2076,32 +1977,32 @@
"node": ">=18"
},
"optionalDependencies": {
- "@esbuild/aix-ppc64": "0.27.7",
- "@esbuild/android-arm": "0.27.7",
- "@esbuild/android-arm64": "0.27.7",
- "@esbuild/android-x64": "0.27.7",
- "@esbuild/darwin-arm64": "0.27.7",
- "@esbuild/darwin-x64": "0.27.7",
- "@esbuild/freebsd-arm64": "0.27.7",
- "@esbuild/freebsd-x64": "0.27.7",
- "@esbuild/linux-arm": "0.27.7",
- "@esbuild/linux-arm64": "0.27.7",
- "@esbuild/linux-ia32": "0.27.7",
- "@esbuild/linux-loong64": "0.27.7",
- "@esbuild/linux-mips64el": "0.27.7",
- "@esbuild/linux-ppc64": "0.27.7",
- "@esbuild/linux-riscv64": "0.27.7",
- "@esbuild/linux-s390x": "0.27.7",
- "@esbuild/linux-x64": "0.27.7",
- "@esbuild/netbsd-arm64": "0.27.7",
- "@esbuild/netbsd-x64": "0.27.7",
- "@esbuild/openbsd-arm64": "0.27.7",
- "@esbuild/openbsd-x64": "0.27.7",
- "@esbuild/openharmony-arm64": "0.27.7",
- "@esbuild/sunos-x64": "0.27.7",
- "@esbuild/win32-arm64": "0.27.7",
- "@esbuild/win32-ia32": "0.27.7",
- "@esbuild/win32-x64": "0.27.7"
+ "@esbuild/aix-ppc64": "0.28.1",
+ "@esbuild/android-arm": "0.28.1",
+ "@esbuild/android-arm64": "0.28.1",
+ "@esbuild/android-x64": "0.28.1",
+ "@esbuild/darwin-arm64": "0.28.1",
+ "@esbuild/darwin-x64": "0.28.1",
+ "@esbuild/freebsd-arm64": "0.28.1",
+ "@esbuild/freebsd-x64": "0.28.1",
+ "@esbuild/linux-arm": "0.28.1",
+ "@esbuild/linux-arm64": "0.28.1",
+ "@esbuild/linux-ia32": "0.28.1",
+ "@esbuild/linux-loong64": "0.28.1",
+ "@esbuild/linux-mips64el": "0.28.1",
+ "@esbuild/linux-ppc64": "0.28.1",
+ "@esbuild/linux-riscv64": "0.28.1",
+ "@esbuild/linux-s390x": "0.28.1",
+ "@esbuild/linux-x64": "0.28.1",
+ "@esbuild/netbsd-arm64": "0.28.1",
+ "@esbuild/netbsd-x64": "0.28.1",
+ "@esbuild/openbsd-arm64": "0.28.1",
+ "@esbuild/openbsd-x64": "0.28.1",
+ "@esbuild/openharmony-arm64": "0.28.1",
+ "@esbuild/sunos-x64": "0.28.1",
+ "@esbuild/win32-arm64": "0.28.1",
+ "@esbuild/win32-ia32": "0.28.1",
+ "@esbuild/win32-x64": "0.28.1"
}
},
"node_modules/escalade": {
@@ -2120,12 +2021,6 @@
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"license": "MIT"
},
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "license": "MIT"
- },
"node_modules/fdir": {
"version": "6.5.0",
"resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz",
@@ -2160,7 +2055,7 @@
},
"node_modules/fsevents": {
"version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"dev": true,
"hasInstallScript": true,
@@ -2199,9 +2094,9 @@
}
},
"node_modules/jiti": {
- "version": "2.6.1",
- "resolved": "https://registry.npmmirror.com/jiti/-/jiti-2.6.1.tgz",
- "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
+ "version": "2.7.0",
+ "resolved": "https://registry.npmmirror.com/jiti/-/jiti-2.7.0.tgz",
+ "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
"dev": true,
"license": "MIT",
"bin": {
@@ -2209,9 +2104,9 @@
}
},
"node_modules/lightningcss": {
- "version": "1.30.2",
- "resolved": "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.30.2.tgz",
- "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.32.0.tgz",
+ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
"dev": true,
"license": "MPL-2.0",
"dependencies": {
@@ -2225,23 +2120,23 @@
"url": "https://opencollective.com/parcel"
},
"optionalDependencies": {
- "lightningcss-android-arm64": "1.30.2",
- "lightningcss-darwin-arm64": "1.30.2",
- "lightningcss-darwin-x64": "1.30.2",
- "lightningcss-freebsd-x64": "1.30.2",
- "lightningcss-linux-arm-gnueabihf": "1.30.2",
- "lightningcss-linux-arm64-gnu": "1.30.2",
- "lightningcss-linux-arm64-musl": "1.30.2",
- "lightningcss-linux-x64-gnu": "1.30.2",
- "lightningcss-linux-x64-musl": "1.30.2",
- "lightningcss-win32-arm64-msvc": "1.30.2",
- "lightningcss-win32-x64-msvc": "1.30.2"
+ "lightningcss-android-arm64": "1.32.0",
+ "lightningcss-darwin-arm64": "1.32.0",
+ "lightningcss-darwin-x64": "1.32.0",
+ "lightningcss-freebsd-x64": "1.32.0",
+ "lightningcss-linux-arm-gnueabihf": "1.32.0",
+ "lightningcss-linux-arm64-gnu": "1.32.0",
+ "lightningcss-linux-arm64-musl": "1.32.0",
+ "lightningcss-linux-x64-gnu": "1.32.0",
+ "lightningcss-linux-x64-musl": "1.32.0",
+ "lightningcss-win32-arm64-msvc": "1.32.0",
+ "lightningcss-win32-x64-msvc": "1.32.0"
}
},
"node_modules/lightningcss-android-arm64": {
- "version": "1.30.2",
- "resolved": "https://registry.npmmirror.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz",
- "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmmirror.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
+ "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
"cpu": [
"arm64"
],
@@ -2260,9 +2155,9 @@
}
},
"node_modules/lightningcss-darwin-arm64": {
- "version": "1.30.2",
- "resolved": "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz",
- "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
+ "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
"cpu": [
"arm64"
],
@@ -2281,9 +2176,9 @@
}
},
"node_modules/lightningcss-darwin-x64": {
- "version": "1.30.2",
- "resolved": "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz",
- "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
+ "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
"cpu": [
"x64"
],
@@ -2302,9 +2197,9 @@
}
},
"node_modules/lightningcss-freebsd-x64": {
- "version": "1.30.2",
- "resolved": "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz",
- "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
+ "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
"cpu": [
"x64"
],
@@ -2323,9 +2218,9 @@
}
},
"node_modules/lightningcss-linux-arm-gnueabihf": {
- "version": "1.30.2",
- "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz",
- "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
+ "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
"cpu": [
"arm"
],
@@ -2344,9 +2239,9 @@
}
},
"node_modules/lightningcss-linux-arm64-gnu": {
- "version": "1.30.2",
- "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz",
- "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
+ "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
"cpu": [
"arm64"
],
@@ -2365,9 +2260,9 @@
}
},
"node_modules/lightningcss-linux-arm64-musl": {
- "version": "1.30.2",
- "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz",
- "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
+ "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
"cpu": [
"arm64"
],
@@ -2386,9 +2281,9 @@
}
},
"node_modules/lightningcss-linux-x64-gnu": {
- "version": "1.30.2",
- "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz",
- "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
+ "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
"cpu": [
"x64"
],
@@ -2407,9 +2302,9 @@
}
},
"node_modules/lightningcss-linux-x64-musl": {
- "version": "1.30.2",
- "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz",
- "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
+ "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
"cpu": [
"x64"
],
@@ -2428,9 +2323,9 @@
}
},
"node_modules/lightningcss-win32-arm64-msvc": {
- "version": "1.30.2",
- "resolved": "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz",
- "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
+ "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
"cpu": [
"arm64"
],
@@ -2449,9 +2344,9 @@
}
},
"node_modules/lightningcss-win32-x64-msvc": {
- "version": "1.30.2",
- "resolved": "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz",
- "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
+ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
"cpu": [
"x64"
],
@@ -2511,9 +2406,9 @@
"license": "MIT"
},
"node_modules/nanoid": {
- "version": "3.3.12",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
- "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
+ "version": "3.3.16",
+ "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.16.tgz",
+ "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==",
"funding": [
{
"type": "github",
@@ -2529,20 +2424,13 @@
}
},
"node_modules/node-releases": {
- "version": "2.0.27",
- "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.27.tgz",
- "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/normalize-range": {
- "version": "0.1.2",
- "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz",
- "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "version": "2.0.51",
+ "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.51.tgz",
+ "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=18"
}
},
"node_modules/ohash": {
@@ -2584,11 +2472,12 @@
"license": "ISC"
},
"node_modules/picomatch": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
- "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "version": "4.0.5",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
"dev": true,
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=12"
},
@@ -2618,9 +2507,9 @@
}
},
"node_modules/postcss": {
- "version": "8.5.15",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz",
- "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==",
+ "version": "8.5.19",
+ "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.19.tgz",
+ "integrity": "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==",
"funding": [
{
"type": "opencollective",
@@ -2636,6 +2525,7 @@
}
],
"license": "MIT",
+ "peer": true,
"dependencies": {
"nanoid": "^3.3.12",
"picocolors": "^1.1.1",
@@ -2666,106 +2556,10 @@
"dev": true,
"license": "MIT"
},
- "node_modules/radix-vue": {
- "version": "1.9.17",
- "resolved": "https://registry.npmmirror.com/radix-vue/-/radix-vue-1.9.17.tgz",
- "integrity": "sha512-mVCu7I2vXt1L2IUYHTt0sZMz7s1K2ZtqKeTIxG3yC5mMFfLBG4FtE1FDeRMpDd+Hhg/ybi9+iXmAP1ISREndoQ==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/dom": "^1.6.7",
- "@floating-ui/vue": "^1.1.0",
- "@internationalized/date": "^3.5.4",
- "@internationalized/number": "^3.5.3",
- "@tanstack/vue-virtual": "^3.8.1",
- "@vueuse/core": "^10.11.0",
- "@vueuse/shared": "^10.11.0",
- "aria-hidden": "^1.2.4",
- "defu": "^6.1.4",
- "fast-deep-equal": "^3.1.3",
- "nanoid": "^5.0.7"
- },
- "peerDependencies": {
- "vue": ">= 3.2.0"
- }
- },
- "node_modules/radix-vue/node_modules/@types/web-bluetooth": {
- "version": "0.0.20",
- "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
- "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==",
- "license": "MIT"
- },
- "node_modules/radix-vue/node_modules/@vueuse/core": {
- "version": "10.11.1",
- "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-10.11.1.tgz",
- "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==",
- "license": "MIT",
- "dependencies": {
- "@types/web-bluetooth": "^0.0.20",
- "@vueuse/metadata": "10.11.1",
- "@vueuse/shared": "10.11.1",
- "vue-demi": ">=0.14.8"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/radix-vue/node_modules/@vueuse/core/node_modules/vue-demi": {
- "version": "0.14.10",
- "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
- "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
- "hasInstallScript": true,
- "license": "MIT",
- "bin": {
- "vue-demi-fix": "bin/vue-demi-fix.js",
- "vue-demi-switch": "bin/vue-demi-switch.js"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- },
- "peerDependencies": {
- "@vue/composition-api": "^1.0.0-rc.1",
- "vue": "^3.0.0-0 || ^2.6.0"
- },
- "peerDependenciesMeta": {
- "@vue/composition-api": {
- "optional": true
- }
- }
- },
- "node_modules/radix-vue/node_modules/@vueuse/metadata": {
- "version": "10.11.1",
- "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-10.11.1.tgz",
- "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/radix-vue/node_modules/nanoid": {
- "version": "5.1.6",
- "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-5.1.6.tgz",
- "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "bin": {
- "nanoid": "bin/nanoid.js"
- },
- "engines": {
- "node": "^18 || >=20"
- }
- },
"node_modules/reka-ui": {
- "version": "2.6.1",
- "resolved": "https://registry.npmmirror.com/reka-ui/-/reka-ui-2.6.1.tgz",
- "integrity": "sha512-XK7cJDQoNuGXfCNzBBo/81Yg/OgjPwvbabnlzXG2VsdSgNsT6iIkuPBPr+C0Shs+3bb0x0lbPvgQAhMSCKm5Ww==",
+ "version": "2.10.1",
+ "resolved": "https://registry.npmmirror.com/reka-ui/-/reka-ui-2.10.1.tgz",
+ "integrity": "sha512-drcOQ4rQtDYAcGCsyQBqQg8QQ+H3B+zDaMJU0h8KPEPMa7g9BHu3zcOi4OB39XJSWizceFoNO0Z9tctSGLOXqg==",
"license": "MIT",
"dependencies": {
"@floating-ui/dom": "^1.6.13",
@@ -2773,50 +2567,18 @@
"@internationalized/date": "^3.5.0",
"@internationalized/number": "^3.5.0",
"@tanstack/vue-virtual": "^3.12.0",
- "@vueuse/core": "^12.5.0",
- "@vueuse/shared": "^12.5.0",
+ "@vueuse/core": "^14.1.0",
+ "@vueuse/shared": "^14.1.0",
"aria-hidden": "^1.2.4",
- "defu": "^6.1.4",
+ "defu": "^6.1.5",
"ohash": "^2.0.11"
},
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/zernonia"
+ },
"peerDependencies": {
- "vue": ">= 3.2.0"
- }
- },
- "node_modules/reka-ui/node_modules/@vueuse/core": {
- "version": "12.8.2",
- "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-12.8.2.tgz",
- "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==",
- "license": "MIT",
- "dependencies": {
- "@types/web-bluetooth": "^0.0.21",
- "@vueuse/metadata": "12.8.2",
- "@vueuse/shared": "12.8.2",
- "vue": "^3.5.13"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/reka-ui/node_modules/@vueuse/metadata": {
- "version": "12.8.2",
- "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-12.8.2.tgz",
- "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/reka-ui/node_modules/@vueuse/shared": {
- "version": "12.8.2",
- "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-12.8.2.tgz",
- "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==",
- "license": "MIT",
- "dependencies": {
- "vue": "^3.5.13"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
+ "vue": ">= 3.4.0"
}
},
"node_modules/rfdc": {
@@ -2826,13 +2588,13 @@
"license": "MIT"
},
"node_modules/rollup": {
- "version": "4.60.4",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz",
- "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.62.2.tgz",
+ "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/estree": "1.0.8"
+ "@types/estree": "1.0.9"
},
"bin": {
"rollup": "dist/bin/rollup"
@@ -2842,38 +2604,38 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.60.4",
- "@rollup/rollup-android-arm64": "4.60.4",
- "@rollup/rollup-darwin-arm64": "4.60.4",
- "@rollup/rollup-darwin-x64": "4.60.4",
- "@rollup/rollup-freebsd-arm64": "4.60.4",
- "@rollup/rollup-freebsd-x64": "4.60.4",
- "@rollup/rollup-linux-arm-gnueabihf": "4.60.4",
- "@rollup/rollup-linux-arm-musleabihf": "4.60.4",
- "@rollup/rollup-linux-arm64-gnu": "4.60.4",
- "@rollup/rollup-linux-arm64-musl": "4.60.4",
- "@rollup/rollup-linux-loong64-gnu": "4.60.4",
- "@rollup/rollup-linux-loong64-musl": "4.60.4",
- "@rollup/rollup-linux-ppc64-gnu": "4.60.4",
- "@rollup/rollup-linux-ppc64-musl": "4.60.4",
- "@rollup/rollup-linux-riscv64-gnu": "4.60.4",
- "@rollup/rollup-linux-riscv64-musl": "4.60.4",
- "@rollup/rollup-linux-s390x-gnu": "4.60.4",
- "@rollup/rollup-linux-x64-gnu": "4.60.4",
- "@rollup/rollup-linux-x64-musl": "4.60.4",
- "@rollup/rollup-openbsd-x64": "4.60.4",
- "@rollup/rollup-openharmony-arm64": "4.60.4",
- "@rollup/rollup-win32-arm64-msvc": "4.60.4",
- "@rollup/rollup-win32-ia32-msvc": "4.60.4",
- "@rollup/rollup-win32-x64-gnu": "4.60.4",
- "@rollup/rollup-win32-x64-msvc": "4.60.4",
+ "@rollup/rollup-android-arm-eabi": "4.62.2",
+ "@rollup/rollup-android-arm64": "4.62.2",
+ "@rollup/rollup-darwin-arm64": "4.62.2",
+ "@rollup/rollup-darwin-x64": "4.62.2",
+ "@rollup/rollup-freebsd-arm64": "4.62.2",
+ "@rollup/rollup-freebsd-x64": "4.62.2",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.62.2",
+ "@rollup/rollup-linux-arm-musleabihf": "4.62.2",
+ "@rollup/rollup-linux-arm64-gnu": "4.62.2",
+ "@rollup/rollup-linux-arm64-musl": "4.62.2",
+ "@rollup/rollup-linux-loong64-gnu": "4.62.2",
+ "@rollup/rollup-linux-loong64-musl": "4.62.2",
+ "@rollup/rollup-linux-ppc64-gnu": "4.62.2",
+ "@rollup/rollup-linux-ppc64-musl": "4.62.2",
+ "@rollup/rollup-linux-riscv64-gnu": "4.62.2",
+ "@rollup/rollup-linux-riscv64-musl": "4.62.2",
+ "@rollup/rollup-linux-s390x-gnu": "4.62.2",
+ "@rollup/rollup-linux-x64-gnu": "4.62.2",
+ "@rollup/rollup-linux-x64-musl": "4.62.2",
+ "@rollup/rollup-openbsd-x64": "4.62.2",
+ "@rollup/rollup-openharmony-arm64": "4.62.2",
+ "@rollup/rollup-win32-arm64-msvc": "4.62.2",
+ "@rollup/rollup-win32-ia32-msvc": "4.62.2",
+ "@rollup/rollup-win32-x64-gnu": "4.62.2",
+ "@rollup/rollup-win32-x64-msvc": "4.62.2",
"fsevents": "~2.3.2"
}
},
"node_modules/simple-keyboard": {
- "version": "3.8.93",
- "resolved": "https://registry.npmmirror.com/simple-keyboard/-/simple-keyboard-3.8.93.tgz",
- "integrity": "sha512-NSQ10MyNRRyfyLZv01hySpm37fxZzwDHsmy0d9pP9xP8ZHa/MfjUuwvYK+S7Cb1iqwiRQMCYy2CM8+1K+97CMw==",
+ "version": "3.8.163",
+ "resolved": "https://registry.npmmirror.com/simple-keyboard/-/simple-keyboard-3.8.163.tgz",
+ "integrity": "sha512-nPneUpP8U4mY2sPM+B6P49vb2NIqPPEo3/9iqiw7ZS1LE4YtzmEHAXw0DFQ5/Aob12msgKiVkTfx7XYPDJyMLA==",
"license": "MIT"
},
"node_modules/simple-yenc": {
@@ -2917,9 +2679,9 @@
}
},
"node_modules/tailwind-merge": {
- "version": "3.4.0",
- "resolved": "https://registry.npmmirror.com/tailwind-merge/-/tailwind-merge-3.4.0.tgz",
- "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==",
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/tailwind-merge/-/tailwind-merge-3.6.0.tgz",
+ "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==",
"license": "MIT",
"funding": {
"type": "github",
@@ -2927,16 +2689,17 @@
}
},
"node_modules/tailwindcss": {
- "version": "4.1.17",
- "resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-4.1.17.tgz",
- "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-4.3.3.tgz",
+ "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/tapable": {
- "version": "2.3.0",
- "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.3.0.tgz",
- "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
+ "version": "2.3.3",
+ "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.3.3.tgz",
+ "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2948,14 +2711,14 @@
}
},
"node_modules/tinyglobby": {
- "version": "0.2.15",
- "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.15.tgz",
- "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "version": "0.2.17",
+ "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
"dev": true,
"license": "MIT",
"dependencies": {
"fdir": "^6.5.0",
- "picomatch": "^4.0.3"
+ "picomatch": "^4.0.4"
},
"engines": {
"node": ">=12.0.0"
@@ -2985,6 +2748,7 @@
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"devOptional": true,
"license": "Apache-2.0",
+ "peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -2994,16 +2758,16 @@
}
},
"node_modules/undici-types": {
- "version": "7.16.0",
- "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.16.0.tgz",
- "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "version": "7.18.2",
+ "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.18.2.tgz",
+ "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
"dev": true,
"license": "MIT"
},
"node_modules/update-browserslist-db": {
- "version": "1.2.2",
- "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz",
- "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==",
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
"dev": true,
"funding": [
{
@@ -3045,13 +2809,14 @@
"license": "MIT"
},
"node_modules/vite": {
- "version": "7.3.3",
- "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.3.tgz",
- "integrity": "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==",
+ "version": "7.3.6",
+ "resolved": "https://registry.npmmirror.com/vite/-/vite-7.3.6.tgz",
+ "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
- "esbuild": "^0.27.0",
+ "esbuild": "^0.27.0 || ^0.28.0",
"fdir": "^6.5.0",
"picomatch": "^4.0.3",
"postcss": "^8.5.6",
@@ -3127,16 +2892,17 @@
"license": "MIT"
},
"node_modules/vue": {
- "version": "3.5.25",
- "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.25.tgz",
- "integrity": "sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==",
+ "version": "3.5.40",
+ "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.40.tgz",
+ "integrity": "sha512-+8PJ4SJXdn/cHGImF4CKdxlWHIN5Dkt7DoufRREM6h6uVCx2m7QxgcEQmmzyOK8A9mcafg7sFbJFYsdFVubTig==",
"license": "MIT",
+ "peer": true,
"dependencies": {
- "@vue/compiler-dom": "3.5.25",
- "@vue/compiler-sfc": "3.5.25",
- "@vue/runtime-dom": "3.5.25",
- "@vue/server-renderer": "3.5.25",
- "@vue/shared": "3.5.25"
+ "@vue/compiler-dom": "3.5.40",
+ "@vue/compiler-sfc": "3.5.40",
+ "@vue/runtime-dom": "3.5.40",
+ "@vue/server-renderer": "3.5.40",
+ "@vue/shared": "3.5.40"
},
"peerDependencies": {
"typescript": "*"
@@ -3151,6 +2917,7 @@
"version": "9.14.5",
"resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-9.14.5.tgz",
"integrity": "sha512-0jQ9Em3ymWngyiIkj0+c/k7WgaPO+TNzjKSNq9BvBQaKJECqn9cd9fL4tkDhB5G1QBskGl9YxxbDAhgbFtpe2g==",
+ "deprecated": "v9 and v10 no longer supported. please migrate to v11. about maintenance status, see https://vue-i18n.intlify.dev/guide/maintenance.html",
"license": "MIT",
"dependencies": {
"@intlify/core-base": "9.14.5",
@@ -3174,9 +2941,9 @@
"license": "MIT"
},
"node_modules/vue-router": {
- "version": "4.6.3",
- "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.6.3.tgz",
- "integrity": "sha512-ARBedLm9YlbvQomnmq91Os7ck6efydTSpRP3nuOKCvgJOHNrhRoJDSKtee8kcL1Vf7nz6U+PMBL+hTvR3bTVQg==",
+ "version": "4.6.4",
+ "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.6.4.tgz",
+ "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==",
"license": "MIT",
"dependencies": {
"@vue/devtools-api": "^6.6.4"
@@ -3217,14 +2984,14 @@
}
},
"node_modules/vue-tsc": {
- "version": "3.1.6",
- "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-3.1.6.tgz",
- "integrity": "sha512-h5mMNGIDI+WMZxTeuYcpfSeDtBIiHXAg3qsrt65H4vcFTYmuM1THNHMzlnDvD8kX0fwLuf6auxWP340bH/zcpw==",
+ "version": "3.3.7",
+ "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-3.3.7.tgz",
+ "integrity": "sha512-+C+rgD49wAQ5bUTl2sp5a8Bzg4YoldMNXM+g7CFe604MYcQ8PrZPMQhIjJSzKXtPBCa+C5ayMipqjbA7splekQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@volar/typescript": "2.4.26",
- "@vue/language-core": "3.1.6"
+ "@volar/typescript": "2.4.28",
+ "@vue/language-core": "3.3.7"
},
"bin": {
"vue-tsc": "bin/vue-tsc.js"
diff --git a/web/package.json b/web/package.json
index 9370b882..89905898 100644
--- a/web/package.json
+++ b/web/package.json
@@ -9,36 +9,35 @@
"preview": "vite preview"
},
"dependencies": {
- "@vueuse/core": "^14.1.0",
+ "@vueuse/core": "^14.3.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lucide-vue-next": "^0.556.0",
"opus-decoder": "^0.7.11",
"pinia": "^3.0.4",
- "radix-vue": "^1.9.17",
- "reka-ui": "^2.6.1",
- "simple-keyboard": "^3.8.93",
- "tailwind-merge": "^3.4.0",
+ "reka-ui": "^2.10.1",
+ "simple-keyboard": "^3.8.163",
+ "tailwind-merge": "^3.6.0",
"tw-animate-css": "^1.4.0",
"uplot": "^1.6.32",
- "vue": "^3.5.24",
+ "vue": "^3.5.40",
"vue-i18n": "^9.14.5",
- "vue-router": "^4.6.3",
+ "vue-router": "^4.6.4",
"vue-sonner": "^2.0.9"
},
"devDependencies": {
- "@tailwindcss/forms": "^0.5.10",
- "@tailwindcss/typography": "^0.5.19",
- "@tailwindcss/vite": "^4.1.17",
- "@types/node": "^24.10.1",
- "@vitejs/plugin-vue": "^6.0.1",
+ "@tailwindcss/forms": "^0.5.11",
+ "@tailwindcss/typography": "^0.5.20",
+ "@tailwindcss/vite": "^4.3.3",
+ "@types/node": "^24.13.3",
+ "@vitejs/plugin-vue": "^6.0.8",
"@vue/tsconfig": "^0.8.1",
- "autoprefixer": "^10.4.22",
- "postcss": "^8.5.10",
- "tailwindcss": "^4.1.17",
+ "autoprefixer": "^10.5.4",
+ "postcss": "^8.5.19",
+ "tailwindcss": "^4.3.3",
"typescript": "~5.9.3",
- "vite": "^7.3.2",
- "vue-tsc": "^3.1.4"
+ "vite": "^7.3.6",
+ "vue-tsc": "^3.3.7"
},
"overrides": {
"defu": "^6.1.5",
diff --git a/web/src/App.vue b/web/src/App.vue
index 1268b2f0..a4da8b42 100644
--- a/web/src/App.vue
+++ b/web/src/App.vue
@@ -1,12 +1,13 @@
@@ -75,7 +58,7 @@ watch(
expand
position="top-center"
close-button-position="top-right"
- theme="system"
+ :theme="isDark ? 'dark' : 'light'"
:duration="4000"
:gap="14"
:offset="{ top: '1rem', right: '1rem', left: '1rem', bottom: '1rem' }"
diff --git a/web/src/components/ActionBar.vue b/web/src/components/ActionBar.vue
index f95c2de5..1e4adb23 100644
--- a/web/src/components/ActionBar.vue
+++ b/web/src/components/ActionBar.vue
@@ -4,6 +4,7 @@ import { useI18n } from 'vue-i18n'
import { useRouter } from 'vue-router'
import { useSystemStore } from '@/stores/system'
import { Button } from '@/components/ui/button'
+import { ButtonGroup } from '@/components/ui/button-group'
import {
PopoverContent,
PopoverTrigger,
@@ -276,10 +277,10 @@ const hasRightOverflow = computed(() => {
-
+
+
-
+
@@ -393,25 +394,6 @@ const hasRightOverflow = computed(() => {
-
-
-
-
-
-
-
-
- {{ t('actionbar.settingsTip') }}
-
-
-
-
-
-
-
@@ -432,6 +414,29 @@ const hasRightOverflow = computed(() => {
+
+
+
+
+
+
+
+
+ {{ t('actionbar.settingsTip') }}
+
+
+
+
+
+
+
@@ -523,7 +528,7 @@ const hasRightOverflow = computed(() => {
-
+
diff --git a/web/src/components/AppLayout.vue b/web/src/components/AppLayout.vue
index 61c1c86b..2cefd7db 100644
--- a/web/src/components/AppLayout.vue
+++ b/web/src/components/AppLayout.vue
@@ -6,6 +6,7 @@ import { useSystemStore } from '@/stores/system'
import LanguageToggleButton from '@/components/LanguageToggleButton.vue'
import BrandMark from '@/components/BrandMark.vue'
import { Button } from '@/components/ui/button'
+import { useTheme } from '@/composables/useTheme'
import {
DropdownMenu,
DropdownMenuContent,
@@ -23,12 +24,7 @@ const { t } = useI18n()
const router = useRouter()
const authStore = useAuthStore()
const systemStore = useSystemStore()
-
-function toggleTheme() {
- const isDark = document.documentElement.classList.contains('dark')
- document.documentElement.classList.toggle('dark', !isDark)
- localStorage.setItem('theme', isDark ? 'light' : 'dark')
-}
+const { toggleTheme } = useTheme()
async function handleLogout() {
await authStore.logout()
@@ -40,11 +36,12 @@ async function handleLogout() {
-
+
-
-
- One-KVM
+
+
+
+ One-KVM
diff --git a/web/src/components/AtxPopover.vue b/web/src/components/AtxPopover.vue
index 37bcbaca..eb2b091c 100644
--- a/web/src/components/AtxPopover.vue
+++ b/web/src/components/AtxPopover.vue
@@ -46,15 +46,15 @@ const actionBusy = computed(() => activeAction.value !== null)
const powerStateIconColor = computed(() => {
switch (powerState.value) {
- case 'on': return 'text-green-600'
- case 'off': return 'text-slate-500'
- default: return 'text-yellow-600'
+ case 'on': return 'text-success'
+ case 'off': return 'text-muted-foreground'
+ default: return 'text-warning'
}
})
const powerStateTextColor = computed(() => {
switch (powerState.value) {
- case 'on': return 'text-green-600'
+ case 'on': return 'text-success'
default: return ''
}
})
@@ -69,15 +69,15 @@ const powerStateText = computed(() => {
const hddStateIconColor = computed(() => {
switch (hddState.value) {
- case 'active': return 'text-green-600'
- case 'inactive': return 'text-slate-500'
- default: return 'text-yellow-600'
+ case 'active': return 'text-success'
+ case 'inactive': return 'text-muted-foreground'
+ default: return 'text-warning'
}
})
const hddStateTextColor = computed(() => {
switch (hddState.value) {
- case 'active': return 'text-green-600'
+ case 'active': return 'text-success'
default: return ''
}
})
@@ -254,7 +254,7 @@ watch(
size="sm"
:disabled="actionBusy"
:class="[
- 'w-full justify-start gap-2 h-7 text-xs text-orange-600 hover:text-orange-700 hover:bg-orange-50 dark:hover:bg-orange-950',
+ 'h-7 w-full justify-start gap-2 text-xs text-warning hover:bg-warning/10 hover:text-warning',
activeAction === 'long' ? 'bg-muted text-muted-foreground hover:text-muted-foreground hover:bg-muted dark:hover:bg-muted' : '',
]"
@click="handleAction('long')"
@@ -268,7 +268,7 @@ watch(
size="sm"
:disabled="actionBusy"
:class="[
- 'w-full justify-start gap-2 h-7 text-xs text-red-600 hover:text-red-700 hover:bg-red-50 dark:hover:bg-red-950',
+ 'h-7 w-full justify-start gap-2 text-xs text-destructive hover:bg-destructive/10 hover:text-destructive',
activeAction === 'reset' ? 'bg-muted text-muted-foreground hover:text-muted-foreground hover:bg-muted dark:hover:bg-muted' : '',
]"
@click="handleAction('reset')"
@@ -318,14 +318,16 @@ watch(
-
+
diff --git a/web/src/components/AudioConfigPopover.vue b/web/src/components/AudioConfigPopover.vue
index f2ce1b6b..56306c23 100644
--- a/web/src/components/AudioConfigPopover.vue
+++ b/web/src/components/AudioConfigPopover.vue
@@ -10,13 +10,7 @@ import {
PopoverContent,
PopoverTrigger,
} from '@/components/ui/popover'
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from '@/components/ui/select'
+import { NativeSelect, NativeSelectOption } from '@/components/ui/native-select'
import { Volume2, RefreshCw, Loader2 } from 'lucide-vue-next'
import { audioApi, configApi } from '@/api'
import { useConfigStore } from '@/stores/config'
@@ -232,25 +226,22 @@ watch(() => props.open, (isOpen) => {
-
+
+
diff --git a/web/src/components/ComputerUseSheet.vue b/web/src/components/ComputerUseSheet.vue
index 6d918861..25725a28 100644
--- a/web/src/components/ComputerUseSheet.vue
+++ b/web/src/components/ComputerUseSheet.vue
@@ -10,7 +10,7 @@ import { Label } from '@/components/ui/label'
import { Textarea } from '@/components/ui/textarea'
import { Badge } from '@/components/ui/badge'
import { Switch } from '@/components/ui/switch'
-import { Tabs, TabsContent } from '@/components/ui/tabs'
+import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'
const props = defineProps<{
open: boolean
@@ -192,28 +192,10 @@ onMounted(loadConfig)
-
-
-
-
+
+ 对话
+ 设置
+
@@ -248,7 +230,7 @@ onMounted(loadConfig)
-
+
已执行
diff --git a/web/src/components/HelpTooltip.vue b/web/src/components/HelpTooltip.vue
index 842b5d2c..e9a272b0 100644
--- a/web/src/components/HelpTooltip.vue
+++ b/web/src/components/HelpTooltip.vue
@@ -6,6 +6,7 @@ import {
TooltipTrigger,
} from '@/components/ui/tooltip'
import { HelpCircle } from 'lucide-vue-next'
+import { Button } from '@/components/ui/button'
defineProps<{
content: string
@@ -19,13 +20,15 @@ defineProps<{
-
+
props.open, (isOpen) => {
:model-value="hidBackend"
@update:model-value="handleBackendChange"
>
-
+
@@ -343,25 +344,22 @@ watch(() => props.open, (isOpen) => {
-
+
+
diff --git a/web/src/components/InfoBar.vue b/web/src/components/InfoBar.vue
index 2c39fb81..aea5ffa7 100644
--- a/web/src/components/InfoBar.vue
+++ b/web/src/components/InfoBar.vue
@@ -2,7 +2,9 @@
import { computed } from 'vue'
import { useI18n } from 'vue-i18n'
import type { CanonicalKey } from '@/types/generated'
-import { cn } from '@/lib/utils'
+import { Badge } from '@/components/ui/badge'
+import { Kbd } from '@/components/ui/kbd'
+import { Separator } from '@/components/ui/separator'
const props = defineProps<{
pressedKeys?: CanonicalKey[]
@@ -40,20 +42,20 @@ const keysDisplay = computed(() => {
-
+
- C
- N
- S
+
+ C
+
+
+ N
+
+
+ S
+
{{ t('infobar.keyboardLedUnavailable') }}
@@ -71,7 +73,7 @@ const keysDisplay = computed(() => {
{{ t('infobar.keys') }}:
- {{ keysDisplay || '-' }}
+ {{ keysDisplay || '-' }}
@@ -82,25 +84,20 @@ const keysDisplay = computed(() => {
+
- {{ t('infobar.caps') }}
- {{ t('infobar.num') }}
- {{ t('infobar.scroll') }}
+
+
+ {{ t('infobar.caps') }}
+
+
+
+ {{ t('infobar.num') }}
+
+
+
+ {{ t('infobar.scroll') }}
+
{{ t('infobar.keyboardLedUnavailable') }}
diff --git a/web/src/components/MsdDialog.vue b/web/src/components/MsdDialog.vue
index c1836efc..4c187e93 100644
--- a/web/src/components/MsdDialog.vue
+++ b/web/src/components/MsdDialog.vue
@@ -29,6 +29,8 @@ import { Label } from '@/components/ui/label'
import { ToggleGroup, ToggleGroupItem } from '@/components/ui/toggle-group'
import { Slider } from '@/components/ui/slider'
import { Separator } from '@/components/ui/separator'
+import { Empty, EmptyDescription, EmptyHeader, EmptyMedia } from '@/components/ui/empty'
+import { Skeleton } from '@/components/ui/skeleton'
import {
HardDrive,
Upload,
@@ -151,9 +153,9 @@ const downloadProgress = ref<{
} | null>(null)
const TWO_POINT_TWO_GB = 2.2 * 1024 * 1024 * 1024
-const tabTriggerClass = 'h-9 rounded-md border border-transparent bg-transparent text-center text-muted-foreground shadow-none hover:text-foreground data-[state=active]:border-border data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm'
-const segmentedGroupClass = 'grid w-full grid-cols-2 items-center gap-1 rounded-md bg-muted p-1'
-const segmentedItemClass = 'h-8 w-full justify-center rounded-md border border-transparent bg-transparent px-3 text-center text-xs text-muted-foreground shadow-none hover:bg-background/60 hover:text-foreground data-[state=on]:border-border data-[state=on]:bg-background data-[state=on]:text-foreground data-[state=on]:shadow-sm'
+const tabTriggerClass = 'h-9 rounded-md border-0 bg-transparent text-center text-muted-foreground shadow-none hover:text-foreground data-[state=active]:border-0 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm'
+const segmentedGroupClass = 'grid w-full grid-cols-2 items-center gap-1 rounded-md border border-border bg-muted p-1'
+const segmentedItemClass = 'h-8 w-full justify-center rounded-md border-0 bg-transparent px-3 text-center text-xs text-muted-foreground shadow-none hover:bg-transparent hover:text-foreground data-[state=on]:border-0 data-[state=on]:bg-background data-[state=on]:text-foreground data-[state=on]:shadow-sm data-[state=on]:hover:bg-background'
const diskMode = computed(() => systemStore.msd?.diskMode ?? 'single')
const slotCapacity = computed(() => systemStore.msd?.slotCapacity ?? 1)
@@ -684,10 +686,10 @@ onUnmounted(() => {
-
+
-
-
+
+
{{ msdConnected ? t('common.connected') : t('common.disconnected') }}
@@ -696,11 +698,11 @@ onUnmounted(() => {
{{ t('msd.mediaSlotsFull') }}
-
+
{{ t('msd.reenumerating') }}
@@ -722,6 +724,7 @@ onUnmounted(() => {
:model-value="diskMode"
type="single"
size="sm"
+ :spacing="1"
:class="[segmentedGroupClass, 'min-w-0 flex-1 sm:w-[200px] sm:flex-none']"
:disabled="operationInProgress"
@update:model-value="changeDiskMode"
@@ -783,9 +786,13 @@ onUnmounted(() => {
-
- {{ t('msd.noImages') }}
-
+
+
+
+
+ {{ t('msd.noImages') }}
+
+
-
- {{ t('stats.frameRateDesc') }}
-
-
+
{
:style="{ left: `${activeTooltip.left + 60}px`, top: `${activeTooltip.top - 40}px` }"
>
{{ activeTooltip.time }}
-
{{ activeTooltip.value }} {{ activeTooltip.unit }}
+
{{ activeTooltip.value }} {{ activeTooltip.unit }}
-
+
-
-
-
{{ t('stats.additional') }}
+
+
+
{{ t('stats.connection') }}
-
-
{{ t('stats.resolution') }}
-
{{ currentStats.resolution }}
-
-
-
{{ t('stats.bitrate') }}
-
{{ currentStats.bitrate }} Mbps
-
-
-
-
-
{{ t('stats.connection') }}
-
-
-
{{ t('stats.connectionType') }}
-
+ - {{ t('stats.connectionType') }}
{{ currentStats.isRelay ? t('stats.relay') : t('stats.p2p') }}
-
-
-
-
{{ t('stats.transport') }}
-
{{ currentStats.transport }}
-
-
-
{{ t('stats.localCandidate') }}
-
{{ currentStats.localType }}
-
-
-
{{ t('stats.remoteCandidate') }}
-
{{ currentStats.remoteType }}
-
+
+
- {{ t('stats.transport') }}{{ currentStats.transport }}
+
- {{ t('stats.localCandidate') }}{{ currentStats.localType }}
+
- {{ t('stats.remoteCandidate') }}{{ currentStats.remoteType }}
diff --git a/web/src/components/StatusCard.vue b/web/src/components/StatusCard.vue
index 8a6527e8..1d961532 100644
--- a/web/src/components/StatusCard.vue
+++ b/web/src/components/StatusCard.vue
@@ -13,6 +13,7 @@ import {
PopoverTrigger,
} from '@/components/ui/popover'
import { Badge } from '@/components/ui/badge'
+import { Button } from '@/components/ui/button'
import { Separator } from '@/components/ui/separator'
import { Monitor, Video, Usb, AlertCircle, CheckCircle, Loader2, Volume2, HardDrive } from 'lucide-vue-next'
@@ -50,15 +51,15 @@ onMounted(() => {
const statusColor = computed(() => {
switch (props.status) {
case 'connected':
- return 'bg-green-500'
+ return 'bg-success'
case 'connecting':
- return 'bg-yellow-500 animate-pulse'
+ return 'bg-warning animate-pulse'
case 'disconnected':
- return 'bg-slate-400'
+ return 'bg-muted-foreground'
case 'error':
- return 'bg-red-500'
+ return 'bg-destructive'
default:
- return 'bg-slate-400'
+ return 'bg-muted-foreground'
}
})
@@ -127,15 +128,14 @@ const statusBadgeText = computed(() => {
-
-
+
@@ -164,10 +164,10 @@ const statusBadgeText = computed(() => {
@@ -179,14 +179,14 @@ const statusBadgeText = computed(() => {
:is="statusIcon"
:class="cn(
'h-3.5 w-3.5',
- status === 'connected' ? 'text-green-500' :
- status === 'connecting' ? 'text-yellow-500 animate-spin' :
- status === 'error' ? 'text-red-500' :
- 'text-slate-400'
+ status === 'connected' ? 'text-success' :
+ status === 'connecting' ? 'text-warning animate-spin' :
+ status === 'error' ? 'text-destructive' :
+ 'text-muted-foreground'
)"
/>
{{ statusBadgeText }}
@@ -198,24 +198,14 @@ const statusBadgeText = computed(() => {
-
+
- {{ detail.label }}
-
- {{ detail.value }}
-
+ {{ detail.label }}
+ {{ detail.value }}
@@ -226,15 +216,14 @@ const statusBadgeText = computed(() => {
-
-
+
@@ -263,10 +252,10 @@ const statusBadgeText = computed(() => {
@@ -278,14 +267,14 @@ const statusBadgeText = computed(() => {
:is="statusIcon"
:class="cn(
'h-3.5 w-3.5',
- status === 'connected' ? 'text-green-500' :
- status === 'connecting' ? 'text-yellow-500 animate-spin' :
- status === 'error' ? 'text-red-500' :
- 'text-slate-400'
+ status === 'connected' ? 'text-success' :
+ status === 'connecting' ? 'text-warning animate-spin' :
+ status === 'error' ? 'text-destructive' :
+ 'text-muted-foreground'
)"
/>
{{ statusBadgeText }}
@@ -297,24 +286,14 @@ const statusBadgeText = computed(() => {
-
+
- {{ detail.label }}
-
- {{ detail.value }}
-
+ {{ detail.label }}
+ {{ detail.value }}
diff --git a/web/src/components/VideoConfigPopover.vue b/web/src/components/VideoConfigPopover.vue
index b253f4b7..3d9a0402 100644
--- a/web/src/components/VideoConfigPopover.vue
+++ b/web/src/components/VideoConfigPopover.vue
@@ -5,6 +5,7 @@ import { toast } from 'vue-sonner'
import { Button } from '@/components/ui/button'
import { Label } from '@/components/ui/label'
import { Separator } from '@/components/ui/separator'
+import { NativeSelect, NativeSelectOption } from '@/components/ui/native-select'
import {
Popover,
PopoverContent,
@@ -15,9 +16,8 @@ import {
SelectContent,
SelectItem,
SelectTrigger,
- SelectValue,
} from '@/components/ui/select'
-import { Monitor, RefreshCw, Loader2, Settings, Zap, Scale, Image, AlertTriangle } from 'lucide-vue-next'
+import { Monitor, RefreshCw, Loader2, Zap, Scale, Image } from 'lucide-vue-next'
import HelpTooltip from '@/components/HelpTooltip.vue'
import {
configApi,
@@ -31,7 +31,6 @@ import { getVideoFormatState, isVideoFormatSelectable } from '@/lib/video-format
import { formatFpsLabel, toConfigFps } from '@/lib/fps'
import { formatVideoDeviceLabel } from '@/lib/video-device-label'
import { useConfigStore } from '@/stores/config'
-import { useRouter } from 'vue-router'
export type VideoMode = 'mjpeg' | 'h264' | 'h265' | 'vp8' | 'vp9'
@@ -63,7 +62,6 @@ const emit = defineEmits<{
const { t } = useI18n()
const configStore = useConfigStore()
-const router = useRouter()
// Device list
const devices = ref
([])
@@ -239,6 +237,14 @@ const selectedFps = ref(30)
const selectedBitratePreset = ref<'Speed' | 'Balanced' | 'Quality'>('Balanced')
const isDirty = ref(false)
+const selectedFormatStatus = computed<'recommended' | 'not_recommended' | 'unsupported' | null>(() => {
+ if (!selectedFormat.value) return null
+ if (isFormatUnsupported(selectedFormat.value)) return 'unsupported'
+ if (isFormatRecommended(selectedFormat.value)) return 'recommended'
+ if (isFormatNotRecommended(selectedFormat.value)) return 'not_recommended'
+ return null
+})
+
const applying = ref(false)
const applyingBitrate = ref(false)
@@ -317,10 +323,9 @@ const availableFps = computed(() => {
return resolution?.fps || []
})
-const selectedFormatInfo = computed(() => {
- const format = availableFormatOptions.value.find(f => f.format === selectedFormat.value)
- return format
-})
+const selectedFormatInfo = computed(() =>
+ availableFormatOptions.value.find(format => format.format === selectedFormat.value) ?? null
+)
const selectedCodecInfo = computed(() => {
const codec = availableCodecs.value.find(c => c.id === props.videoMode)
@@ -367,10 +372,6 @@ async function loadConstraints() {
}
}
-function goToSettings() {
- router.push('/settings?tab=video')
-}
-
function initializeFromCurrent() {
const config = currentConfig.value
selectedDevice.value = config.device
@@ -619,21 +620,24 @@ watch(
-
+
+
+
+
-
-
-
-
- {{ videoParamWarningMessage }}
-
-
+
+ {{ videoParamWarningMessage }}
+
{{ t('actionbar.deviceSettings') }}
@@ -768,25 +754,22 @@ watch(
-
+
+
@@ -797,27 +780,27 @@ watch(
@update:model-value="handleFormatChange"
:disabled="!selectedDevice || availableFormats.length === 0"
>
-
-
+
+
{{ selectedFormatInfo.description }}
- {{ t('common.notSupportedYet') }}
-
-
{{ t('actionbar.recommended') }}
{{ t('actionbar.notRecommended') }}
+
+ {{ t('common.notSupportedYet') }}
+
{{ t('actionbar.selectFormat') }}
@@ -827,25 +810,19 @@ watch(
:key="format.format"
:value="format.format"
:disabled="format.disabled"
- :class="['text-xs', { 'opacity-50': format.disabled }]"
+ class="text-xs"
>
{{ format.description }}
-
- {{ t('common.notSupportedYet') }}
-
{{ t('actionbar.recommended') }}
{{ t('actionbar.notRecommended') }}
@@ -858,49 +835,43 @@ watch(
-
+
+
-
+
+
diff --git a/web/src/components/VirtualKeyboard.vue b/web/src/components/VirtualKeyboard.vue
index e79d02a9..9fc2e99e 100644
--- a/web/src/components/VirtualKeyboard.vue
+++ b/web/src/components/VirtualKeyboard.vue
@@ -4,6 +4,7 @@ import { useI18n } from 'vue-i18n'
import Keyboard from 'simple-keyboard'
import 'simple-keyboard/build/css/index.css'
import { hidApi } from '@/api'
+import { Button } from '@/components/ui/button'
import { CanonicalKey } from '@/types/generated'
import {
keys,
@@ -608,39 +609,43 @@ onUnmounted(() => {
@touchstart="startDrag"
>
{{ t('virtualKeyboard.title') }}
-
-
{{ mediaKeyLabels[key] || key }}
-
+
@@ -660,12 +665,12 @@ onUnmounted(() => {
.vkb .simple-keyboard .hg-button {
height: 36px;
- border-radius: 6px;
- background: var(--keyboard-button-bg, white);
- color: var(--keyboard-button-color, #1f2937);
- border: 1px solid var(--keyboard-button-border, #e5e7eb);
+ border-radius: var(--radius-md);
+ background: var(--keyboard-button-bg);
+ color: var(--keyboard-button-color);
+ border: 1px solid var(--keyboard-button-border);
border-bottom-width: 2px;
- box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
+ box-shadow: 0 1px 2px 0 color-mix(in oklch, var(--foreground) 5%, transparent);
font-size: 12px;
font-weight: 500;
padding: 0 6px;
@@ -678,12 +683,12 @@ onUnmounted(() => {
}
.vkb .simple-keyboard .hg-button:hover {
- background: var(--keyboard-button-hover-bg, #f3f4f6);
+ background: var(--keyboard-button-hover-bg);
}
.vkb .simple-keyboard .hg-button:active {
- background: #3b82f6;
- color: white;
+ background: var(--primary);
+ color: var(--primary-foreground);
border-bottom-width: 1px;
margin-top: 1px;
}
@@ -706,10 +711,10 @@ onUnmounted(() => {
/* Pressed keys */
.vkb .simple-keyboard .hg-button.down-key {
- background: #3b82f6;
- color: white;
+ background: var(--primary);
+ color: var(--primary-foreground);
font-weight: 600;
- border-color: #2563eb;
+ border-color: var(--primary);
}
/* Space bar */
@@ -843,17 +848,17 @@ onUnmounted(() => {
:root.dark .hg-theme-default .hg-button,
html.dark .hg-theme-default .hg-button,
.dark .hg-theme-default .hg-button {
- background: #374151 !important;
- color: #f9fafb !important;
- border-color: #4b5563 !important;
- border-bottom-color: #4b5563 !important;
+ background: var(--keyboard-button-bg) !important;
+ color: var(--keyboard-button-color) !important;
+ border-color: var(--keyboard-button-border) !important;
+ border-bottom-color: var(--keyboard-button-border) !important;
box-shadow: none !important;
}
:root.dark .hg-theme-default .hg-button:hover,
html.dark .hg-theme-default .hg-button:hover,
.dark .hg-theme-default .hg-button:hover {
- background: #4b5563 !important;
+ background: var(--keyboard-button-hover-bg) !important;
}
:root.dark .hg-theme-default .hg-button:active,
@@ -862,17 +867,17 @@ html.dark .hg-theme-default .hg-button:active,
:root.dark .hg-theme-default .hg-button.hg-activeButton,
html.dark .hg-theme-default .hg-button.hg-activeButton,
.dark .hg-theme-default .hg-button.hg-activeButton {
- background: #3b82f6 !important;
- color: white !important;
+ background: var(--primary) !important;
+ color: var(--primary-foreground) !important;
}
:root.dark .hg-theme-default .hg-button.down-key,
html.dark .hg-theme-default .hg-button.down-key,
.dark .hg-theme-default .hg-button.down-key {
- background: #3b82f6 !important;
- color: white !important;
- border-color: #2563eb !important;
- border-bottom-color: #2563eb !important;
+ background: var(--primary) !important;
+ color: var(--primary-foreground) !important;
+ border-color: var(--primary) !important;
+ border-bottom-color: var(--primary) !important;
}
@@ -880,13 +885,13 @@ html.dark .hg-theme-default .hg-button.down-key,
.vkb {
z-index: 100;
user-select: none;
- background: white;
- border: 1px solid #e5e7eb;
+ background: var(--background);
+ border: 1px solid var(--border);
}
:global(.dark .vkb) {
- background: #1f2937;
- border-color: #374151;
+ background: var(--background);
+ border-color: var(--border);
}
.vkb--attached {
@@ -904,8 +909,8 @@ html.dark .hg-theme-default .hg-button.down-key,
min-width: 1200px;
max-width: 1600px;
width: auto;
- border-radius: 8px;
- box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);
+ border-radius: var(--radius-lg);
+ box-shadow: 0 25px 50px -12px color-mix(in oklch, var(--foreground) 25%, transparent);
}
.vkb--dragging {
@@ -918,20 +923,20 @@ html.dark .hg-theme-default .hg-button.down-key,
align-items: center;
justify-content: space-between;
padding: 4px 8px;
- border-bottom: 1px solid #e5e7eb;
- background: #f9fafb;
+ border-bottom: 1px solid var(--border);
+ background: var(--muted);
min-height: 28px;
position: relative;
}
:global(.dark .vkb-header) {
- background: #111827;
- border-color: #374151;
+ background: var(--muted);
+ border-color: var(--border);
}
.vkb--floating .vkb-header {
cursor: move;
- border-radius: 8px 8px 0 0;
+ border-radius: var(--radius-lg) var(--radius-lg) 0 0;
}
.vkb-header-left {
@@ -946,84 +951,84 @@ html.dark .hg-theme-default .hg-button.down-key,
transform: translateX(-50%);
font-size: 12px;
font-weight: 500;
- color: #374151;
+ color: var(--foreground);
}
:global(.dark .vkb-title) {
- color: #d1d5db;
+ color: var(--foreground);
}
.vkb-btn {
padding: 2px 8px;
font-size: 11px;
font-weight: 500;
- color: #374151;
- background: white;
- border: 1px solid #d1d5db;
- border-radius: 4px;
+ color: var(--foreground);
+ background: var(--background);
+ border: 1px solid var(--border);
+ border-radius: var(--radius-sm);
cursor: pointer;
line-height: 1.4;
}
.vkb-btn:hover {
- background: #f3f4f6;
+ background: var(--accent);
}
:global(.dark .vkb-btn) {
- color: #d1d5db;
- background: #374151;
- border-color: #4b5563;
+ color: var(--foreground);
+ background: var(--background);
+ border-color: var(--border);
}
:global(.dark .vkb-btn:hover) {
- background: #4b5563;
+ background: var(--accent);
}
/* OS selector */
.vkb-os-selector {
display: flex;
gap: 2px;
- background: #e5e7eb;
- border-radius: 4px;
+ background: var(--muted);
+ border-radius: var(--radius-sm);
padding: 2px;
}
:global(.dark .vkb-os-selector) {
- background: #374151;
+ background: var(--muted);
}
.vkb-os-btn {
padding: 2px 8px;
font-size: 10px;
font-weight: 500;
- color: #6b7280;
+ color: var(--muted-foreground);
background: transparent;
border: none;
- border-radius: 3px;
+ border-radius: var(--radius-sm);
cursor: pointer;
}
.vkb-os-btn:hover {
- color: #374151;
+ color: var(--foreground);
}
.vkb-os-btn--active {
- background: white;
- color: #374151;
- box-shadow: 0 1px 2px rgb(0 0 0 / 0.1);
+ background: var(--background);
+ color: var(--foreground);
+ box-shadow: 0 1px 2px color-mix(in oklch, var(--foreground) 10%, transparent);
}
:global(.dark .vkb-os-btn) {
- color: #9ca3af;
+ color: var(--muted-foreground);
}
:global(.dark .vkb-os-btn:hover) {
- color: #d1d5db;
+ color: var(--foreground);
}
:global(.dark .vkb-os-btn--active) {
- background: #4b5563;
- color: #f9fafb;
+ background: var(--background);
+ color: var(--foreground);
}
/* Keyboard body */
@@ -1032,15 +1037,15 @@ html.dark .hg-theme-default .hg-button.down-key,
flex-direction: column;
padding: 8px;
gap: 8px;
- background: #f3f4f6;
+ background: color-mix(in oklch, var(--muted) 65%, var(--background));
}
:global(.dark .vkb-body) {
- background: #111827;
+ background: color-mix(in oklch, var(--muted) 65%, var(--background));
}
.vkb--floating .vkb-body {
- border-radius: 0 0 8px 8px;
+ border-radius: 0 0 var(--radius-lg) var(--radius-lg);
}
/* Media keys row */
@@ -1049,40 +1054,40 @@ html.dark .hg-theme-default .hg-button.down-key,
gap: 4px;
justify-content: center;
padding-bottom: 4px;
- border-bottom: 1px solid #e5e7eb;
+ border-bottom: 1px solid var(--border);
}
:global(.dark .vkb-media-row) {
- border-color: #374151;
+ border-color: var(--border);
}
.vkb-media-btn {
padding: 4px 12px;
font-size: 16px;
- background: white;
- border: 1px solid #d1d5db;
- border-radius: 6px;
+ background: var(--background);
+ border: 1px solid var(--border);
+ border-radius: var(--radius-md);
cursor: pointer;
min-width: 40px;
}
.vkb-media-btn:hover {
- background: #f3f4f6;
+ background: var(--accent);
}
.vkb-media-btn:active {
- background: #3b82f6;
- color: white;
+ background: var(--primary);
+ color: var(--primary-foreground);
}
:global(.dark .vkb-media-btn) {
- background: #374151;
- border-color: #4b5563;
- color: #f9fafb;
+ background: var(--background);
+ border-color: var(--border);
+ color: var(--foreground);
}
:global(.dark .vkb-media-btn:hover) {
- background: #4b5563;
+ background: var(--accent);
}
/* Keyboards container */
diff --git a/web/src/components/ui/alert-dialog/AlertDialog.vue b/web/src/components/ui/alert-dialog/AlertDialog.vue
new file mode 100644
index 00000000..b6e6b4bf
--- /dev/null
+++ b/web/src/components/ui/alert-dialog/AlertDialog.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/alert-dialog/AlertDialogAction.vue b/web/src/components/ui/alert-dialog/AlertDialogAction.vue
index 177b3b09..09cf6fcb 100644
--- a/web/src/components/ui/alert-dialog/AlertDialogAction.vue
+++ b/web/src/components/ui/alert-dialog/AlertDialogAction.vue
@@ -1,14 +1,18 @@
-
+
diff --git a/web/src/components/ui/alert-dialog/AlertDialogCancel.vue b/web/src/components/ui/alert-dialog/AlertDialogCancel.vue
index 6acf2d7c..e261894e 100644
--- a/web/src/components/ui/alert-dialog/AlertDialogCancel.vue
+++ b/web/src/components/ui/alert-dialog/AlertDialogCancel.vue
@@ -1,14 +1,25 @@
-
+
diff --git a/web/src/components/ui/alert-dialog/AlertDialogContent.vue b/web/src/components/ui/alert-dialog/AlertDialogContent.vue
index 7b98c8e3..4597f0dc 100644
--- a/web/src/components/ui/alert-dialog/AlertDialogContent.vue
+++ b/web/src/components/ui/alert-dialog/AlertDialogContent.vue
@@ -1,30 +1,42 @@
diff --git a/web/src/components/ui/alert-dialog/AlertDialogDescription.vue b/web/src/components/ui/alert-dialog/AlertDialogDescription.vue
index 22d87f5b..69642c9a 100644
--- a/web/src/components/ui/alert-dialog/AlertDialogDescription.vue
+++ b/web/src/components/ui/alert-dialog/AlertDialogDescription.vue
@@ -1,13 +1,23 @@
-
+
diff --git a/web/src/components/ui/alert-dialog/AlertDialogFooter.vue b/web/src/components/ui/alert-dialog/AlertDialogFooter.vue
index 42335805..50d4098e 100644
--- a/web/src/components/ui/alert-dialog/AlertDialogFooter.vue
+++ b/web/src/components/ui/alert-dialog/AlertDialogFooter.vue
@@ -1,14 +1,22 @@
-
+
diff --git a/web/src/components/ui/alert-dialog/AlertDialogHeader.vue b/web/src/components/ui/alert-dialog/AlertDialogHeader.vue
index 48d4be0c..dbe72a76 100644
--- a/web/src/components/ui/alert-dialog/AlertDialogHeader.vue
+++ b/web/src/components/ui/alert-dialog/AlertDialogHeader.vue
@@ -1,14 +1,17 @@
-
+
diff --git a/web/src/components/ui/alert-dialog/AlertDialogTitle.vue b/web/src/components/ui/alert-dialog/AlertDialogTitle.vue
index b69d7174..bb97e4d4 100644
--- a/web/src/components/ui/alert-dialog/AlertDialogTitle.vue
+++ b/web/src/components/ui/alert-dialog/AlertDialogTitle.vue
@@ -1,13 +1,21 @@
-
+
diff --git a/web/src/components/ui/alert-dialog/index.ts b/web/src/components/ui/alert-dialog/index.ts
index 2754fd02..0008cae0 100644
--- a/web/src/components/ui/alert-dialog/index.ts
+++ b/web/src/components/ui/alert-dialog/index.ts
@@ -1,11 +1,8 @@
-export {
- AlertDialogRoot as AlertDialog,
- AlertDialogTrigger,
-} from 'reka-ui'
-export { default as AlertDialogContent } from './AlertDialogContent.vue'
-export { default as AlertDialogHeader } from './AlertDialogHeader.vue'
-export { default as AlertDialogFooter } from './AlertDialogFooter.vue'
-export { default as AlertDialogTitle } from './AlertDialogTitle.vue'
-export { default as AlertDialogDescription } from './AlertDialogDescription.vue'
-export { default as AlertDialogAction } from './AlertDialogAction.vue'
-export { default as AlertDialogCancel } from './AlertDialogCancel.vue'
+export { default as AlertDialog } from "./AlertDialog.vue"
+export { default as AlertDialogAction } from "./AlertDialogAction.vue"
+export { default as AlertDialogCancel } from "./AlertDialogCancel.vue"
+export { default as AlertDialogContent } from "./AlertDialogContent.vue"
+export { default as AlertDialogDescription } from "./AlertDialogDescription.vue"
+export { default as AlertDialogFooter } from "./AlertDialogFooter.vue"
+export { default as AlertDialogHeader } from "./AlertDialogHeader.vue"
+export { default as AlertDialogTitle } from "./AlertDialogTitle.vue"
diff --git a/web/src/components/ui/alert/Alert.vue b/web/src/components/ui/alert/Alert.vue
new file mode 100644
index 00000000..a9d336ff
--- /dev/null
+++ b/web/src/components/ui/alert/Alert.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/alert/AlertDescription.vue b/web/src/components/ui/alert/AlertDescription.vue
new file mode 100644
index 00000000..652f332a
--- /dev/null
+++ b/web/src/components/ui/alert/AlertDescription.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/alert/AlertTitle.vue b/web/src/components/ui/alert/AlertTitle.vue
new file mode 100644
index 00000000..b2183843
--- /dev/null
+++ b/web/src/components/ui/alert/AlertTitle.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/alert/index.ts b/web/src/components/ui/alert/index.ts
new file mode 100644
index 00000000..f1f47159
--- /dev/null
+++ b/web/src/components/ui/alert/index.ts
@@ -0,0 +1,30 @@
+import type { VariantProps } from "class-variance-authority"
+import { cva } from "class-variance-authority"
+
+export { default as Alert } from "./Alert.vue"
+export { default as AlertDescription } from "./AlertDescription.vue"
+export { default as AlertTitle } from "./AlertTitle.vue"
+
+export const alertVariants = cva(
+ "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",
+ {
+ variants: {
+ variant: {
+ default: "bg-card text-card-foreground",
+ destructive:
+ "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90",
+ success:
+ "border-success/35 bg-success/10 text-success [&>svg]:text-current *:data-[slot=alert-description]:text-success/90",
+ warning:
+ "border-warning/35 bg-warning/10 text-warning [&>svg]:text-current *:data-[slot=alert-description]:text-warning/90",
+ info:
+ "border-info/35 bg-info/10 text-info [&>svg]:text-current *:data-[slot=alert-description]:text-info/90",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ },
+)
+
+export type AlertVariants = VariantProps
diff --git a/web/src/components/ui/badge/index.ts b/web/src/components/ui/badge/index.ts
index bbc0dfa3..93dfdd01 100644
--- a/web/src/components/ui/badge/index.ts
+++ b/web/src/components/ui/badge/index.ts
@@ -4,7 +4,7 @@ import { cva } from "class-variance-authority"
export { default as Badge } from "./Badge.vue"
export const badgeVariants = cva(
- "inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-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 transition-[color,box-shadow] overflow-hidden",
+ "inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
{
variants: {
variant: {
@@ -14,6 +14,12 @@ export const badgeVariants = cva(
"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
destructive:
"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
+ success:
+ "border-transparent bg-success text-success-foreground [a&]:hover:bg-success/90 focus-visible:ring-success/20",
+ warning:
+ "border-transparent bg-warning text-warning-foreground [a&]:hover:bg-warning/90 focus-visible:ring-warning/20",
+ info:
+ "border-transparent bg-info text-info-foreground [a&]:hover:bg-info/90 focus-visible:ring-info/20",
outline:
"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
},
diff --git a/web/src/components/ui/button-group/ButtonGroup.vue b/web/src/components/ui/button-group/ButtonGroup.vue
new file mode 100644
index 00000000..9dbef6ac
--- /dev/null
+++ b/web/src/components/ui/button-group/ButtonGroup.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/button-group/index.ts b/web/src/components/ui/button-group/index.ts
new file mode 100644
index 00000000..6f51b47b
--- /dev/null
+++ b/web/src/components/ui/button-group/index.ts
@@ -0,0 +1,23 @@
+import type { VariantProps } from "class-variance-authority"
+import { cva } from "class-variance-authority"
+
+export { default as ButtonGroup } from "./ButtonGroup.vue"
+
+export const buttonGroupVariants = cva(
+ "flex w-fit items-stretch [&>*]:focus-visible:z-10 [&>*]:focus-visible:relative [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md has-[>[data-slot=button-group]]:gap-2",
+ {
+ variants: {
+ orientation: {
+ horizontal:
+ "[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none",
+ vertical:
+ "flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none",
+ },
+ },
+ defaultVariants: {
+ orientation: "horizontal",
+ },
+ },
+)
+
+export type ButtonGroupVariants = VariantProps
diff --git a/web/src/components/ui/button/Button.vue b/web/src/components/ui/button/Button.vue
index 374320b7..3763470a 100644
--- a/web/src/components/ui/button/Button.vue
+++ b/web/src/components/ui/button/Button.vue
@@ -20,6 +20,8 @@ const props = withDefaults(defineProps(), {
svg]:px-3",
+ "xs": "h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-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-xs": "size-6 rounded-md [&_svg:not([class*='size-'])]:size-3",
"icon-sm": "size-8",
"icon-lg": "size-10",
},
diff --git a/web/src/components/ui/collapsible/Collapsible.vue b/web/src/components/ui/collapsible/Collapsible.vue
new file mode 100644
index 00000000..70a94978
--- /dev/null
+++ b/web/src/components/ui/collapsible/Collapsible.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/collapsible/CollapsibleContent.vue b/web/src/components/ui/collapsible/CollapsibleContent.vue
new file mode 100644
index 00000000..8be0a113
--- /dev/null
+++ b/web/src/components/ui/collapsible/CollapsibleContent.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/collapsible/CollapsibleTrigger.vue b/web/src/components/ui/collapsible/CollapsibleTrigger.vue
new file mode 100644
index 00000000..33bec783
--- /dev/null
+++ b/web/src/components/ui/collapsible/CollapsibleTrigger.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/collapsible/index.ts b/web/src/components/ui/collapsible/index.ts
new file mode 100644
index 00000000..86a031d5
--- /dev/null
+++ b/web/src/components/ui/collapsible/index.ts
@@ -0,0 +1,3 @@
+export { default as Collapsible } from "./Collapsible.vue"
+export { default as CollapsibleContent } from "./CollapsibleContent.vue"
+export { default as CollapsibleTrigger } from "./CollapsibleTrigger.vue"
diff --git a/web/src/components/ui/dialog/DialogContent.vue b/web/src/components/ui/dialog/DialogContent.vue
index 7f86b477..b2512c6f 100644
--- a/web/src/components/ui/dialog/DialogContent.vue
+++ b/web/src/components/ui/dialog/DialogContent.vue
@@ -1,8 +1,8 @@
@@ -11,5 +18,10 @@ const props = defineProps<{ class?: HTMLAttributes["class"] }>()
:class="cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', props.class)"
>
+
+
+ Close
+
+
diff --git a/web/src/components/ui/dialog/DialogScrollContent.vue b/web/src/components/ui/dialog/DialogScrollContent.vue
index f2475dba..d56eaa12 100644
--- a/web/src/components/ui/dialog/DialogScrollContent.vue
+++ b/web/src/components/ui/dialog/DialogScrollContent.vue
@@ -1,8 +1,8 @@
+
+
+
+
+
+
diff --git a/web/src/components/ui/empty/EmptyDescription.vue b/web/src/components/ui/empty/EmptyDescription.vue
new file mode 100644
index 00000000..e4ed5fb7
--- /dev/null
+++ b/web/src/components/ui/empty/EmptyDescription.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/empty/EmptyHeader.vue b/web/src/components/ui/empty/EmptyHeader.vue
new file mode 100644
index 00000000..ac21d8c8
--- /dev/null
+++ b/web/src/components/ui/empty/EmptyHeader.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/empty/EmptyMedia.vue b/web/src/components/ui/empty/EmptyMedia.vue
new file mode 100644
index 00000000..c68397c0
--- /dev/null
+++ b/web/src/components/ui/empty/EmptyMedia.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/empty/index.ts b/web/src/components/ui/empty/index.ts
new file mode 100644
index 00000000..554c6551
--- /dev/null
+++ b/web/src/components/ui/empty/index.ts
@@ -0,0 +1,24 @@
+import type { VariantProps } from "class-variance-authority"
+import { cva } from "class-variance-authority"
+
+export { default as Empty } from "./Empty.vue"
+export { default as EmptyDescription } from "./EmptyDescription.vue"
+export { default as EmptyHeader } from "./EmptyHeader.vue"
+export { default as EmptyMedia } from "./EmptyMedia.vue"
+
+export const emptyMediaVariants = cva(
+ "mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0",
+ {
+ variants: {
+ variant: {
+ default: "bg-transparent",
+ icon: "bg-muted text-foreground flex size-10 shrink-0 items-center justify-center rounded-lg [&_svg:not([class*='size-'])]:size-6",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ },
+)
+
+export type EmptyMediaVariants = VariantProps
diff --git a/web/src/components/ui/field/Field.vue b/web/src/components/ui/field/Field.vue
new file mode 100644
index 00000000..5519d370
--- /dev/null
+++ b/web/src/components/ui/field/Field.vue
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/field/FieldGroup.vue b/web/src/components/ui/field/FieldGroup.vue
new file mode 100644
index 00000000..834d8ced
--- /dev/null
+++ b/web/src/components/ui/field/FieldGroup.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/field/FieldLabel.vue b/web/src/components/ui/field/FieldLabel.vue
new file mode 100644
index 00000000..ce6c4985
--- /dev/null
+++ b/web/src/components/ui/field/FieldLabel.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
diff --git a/web/src/components/ui/field/index.ts b/web/src/components/ui/field/index.ts
new file mode 100644
index 00000000..6e945e12
--- /dev/null
+++ b/web/src/components/ui/field/index.ts
@@ -0,0 +1,32 @@
+import type { VariantProps } from "class-variance-authority"
+import { cva } from "class-variance-authority"
+
+export const fieldVariants = cva(
+ "group/field flex w-full gap-3 data-[invalid=true]:text-destructive",
+ {
+ variants: {
+ orientation: {
+ vertical: ["flex-col [&>*]:w-full [&>.sr-only]:w-auto"],
+ horizontal: [
+ "flex-row items-center",
+ "[&>[data-slot=field-label]]:flex-auto",
+ "has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px",
+ ],
+ responsive: [
+ "flex-col [&>*]:w-full [&>.sr-only]:w-auto @md/field-group:flex-row @md/field-group:items-center @md/field-group:[&>*]:w-auto",
+ "@md/field-group:[&>[data-slot=field-label]]:flex-auto",
+ "@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px",
+ ],
+ },
+ },
+ defaultVariants: {
+ orientation: "vertical",
+ },
+ },
+)
+
+export type FieldVariants = VariantProps
+
+export { default as Field } from "./Field.vue"
+export { default as FieldGroup } from "./FieldGroup.vue"
+export { default as FieldLabel } from "./FieldLabel.vue"
diff --git a/web/src/components/ui/hover-card/HoverCard.vue b/web/src/components/ui/hover-card/HoverCard.vue
new file mode 100644
index 00000000..07d11e60
--- /dev/null
+++ b/web/src/components/ui/hover-card/HoverCard.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/hover-card/HoverCardContent.vue b/web/src/components/ui/hover-card/HoverCardContent.vue
index 7e3e3926..2a3c5533 100644
--- a/web/src/components/ui/hover-card/HoverCardContent.vue
+++ b/web/src/components/ui/hover-card/HoverCardContent.vue
@@ -1,28 +1,41 @@
diff --git a/web/src/components/ui/hover-card/HoverCardTrigger.vue b/web/src/components/ui/hover-card/HoverCardTrigger.vue
new file mode 100644
index 00000000..0a090019
--- /dev/null
+++ b/web/src/components/ui/hover-card/HoverCardTrigger.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/hover-card/index.ts b/web/src/components/ui/hover-card/index.ts
index dc0de51b..49b2930d 100644
--- a/web/src/components/ui/hover-card/index.ts
+++ b/web/src/components/ui/hover-card/index.ts
@@ -1,5 +1,3 @@
-export {
- HoverCardRoot as HoverCard,
- HoverCardTrigger,
-} from 'reka-ui'
-export { default as HoverCardContent } from './HoverCardContent.vue'
+export { default as HoverCard } from "./HoverCard.vue"
+export { default as HoverCardContent } from "./HoverCardContent.vue"
+export { default as HoverCardTrigger } from "./HoverCardTrigger.vue"
diff --git a/web/src/components/ui/input/Input.vue b/web/src/components/ui/input/Input.vue
index e5135c14..9db9e85f 100644
--- a/web/src/components/ui/input/Input.vue
+++ b/web/src/components/ui/input/Input.vue
@@ -25,7 +25,7 @@ const modelValue = useVModel(props, "modelValue", emits, {
data-slot="input"
:class="cn(
'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',
- 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',
+ 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3',
'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',
props.class,
)"
diff --git a/web/src/components/ui/item/Item.vue b/web/src/components/ui/item/Item.vue
new file mode 100644
index 00000000..267ddb42
--- /dev/null
+++ b/web/src/components/ui/item/Item.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/item/ItemContent.vue b/web/src/components/ui/item/ItemContent.vue
new file mode 100644
index 00000000..212d64f8
--- /dev/null
+++ b/web/src/components/ui/item/ItemContent.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/item/ItemDescription.vue b/web/src/components/ui/item/ItemDescription.vue
new file mode 100644
index 00000000..278e6b84
--- /dev/null
+++ b/web/src/components/ui/item/ItemDescription.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/item/ItemTitle.vue b/web/src/components/ui/item/ItemTitle.vue
new file mode 100644
index 00000000..81c0827c
--- /dev/null
+++ b/web/src/components/ui/item/ItemTitle.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/item/index.ts b/web/src/components/ui/item/index.ts
new file mode 100644
index 00000000..3adc0436
--- /dev/null
+++ b/web/src/components/ui/item/index.ts
@@ -0,0 +1,48 @@
+import type { VariantProps } from "class-variance-authority"
+import { cva } from "class-variance-authority"
+
+export { default as Item } from "./Item.vue"
+export { default as ItemContent } from "./ItemContent.vue"
+export { default as ItemDescription } from "./ItemDescription.vue"
+export { default as ItemTitle } from "./ItemTitle.vue"
+
+export const itemVariants = cva(
+ "group/item flex items-center border border-transparent text-sm rounded-md transition-colors [a]:hover:bg-accent/50 [a]:transition-colors duration-100 flex-wrap outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3",
+ {
+ variants: {
+ variant: {
+ default: "bg-transparent",
+ outline: "border-border",
+ muted: "bg-muted/50",
+ },
+ size: {
+ default: "p-4 gap-4 ",
+ sm: "py-3 px-4 gap-2.5",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+ },
+)
+
+export const itemMediaVariants = cva(
+ "flex shrink-0 items-center justify-center gap-2 group-has-[[data-slot=item-description]]/item:self-start [&_svg]:pointer-events-none group-has-[[data-slot=item-description]]/item:translate-y-0.5",
+ {
+ variants: {
+ variant: {
+ default: "bg-transparent",
+ icon: "size-8 border rounded-sm bg-muted [&_svg:not([class*='size-'])]:size-4",
+ image:
+ "size-10 rounded-sm overflow-hidden [&_img]:size-full [&_img]:object-cover",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ },
+)
+
+export type ItemVariants = VariantProps
+export type ItemMediaVariants = VariantProps
diff --git a/web/src/components/ui/kbd/Kbd.vue b/web/src/components/ui/kbd/Kbd.vue
new file mode 100644
index 00000000..e71b4949
--- /dev/null
+++ b/web/src/components/ui/kbd/Kbd.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/kbd/index.ts b/web/src/components/ui/kbd/index.ts
new file mode 100644
index 00000000..7c6b8b64
--- /dev/null
+++ b/web/src/components/ui/kbd/index.ts
@@ -0,0 +1 @@
+export { default as Kbd } from "./Kbd.vue"
diff --git a/web/src/components/ui/native-select/NativeSelect.vue b/web/src/components/ui/native-select/NativeSelect.vue
new file mode 100644
index 00000000..3d18dc59
--- /dev/null
+++ b/web/src/components/ui/native-select/NativeSelect.vue
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/native-select/NativeSelectOption.vue b/web/src/components/ui/native-select/NativeSelectOption.vue
new file mode 100644
index 00000000..5fe52c6a
--- /dev/null
+++ b/web/src/components/ui/native-select/NativeSelectOption.vue
@@ -0,0 +1,12 @@
+
+
+
+
+
diff --git a/web/src/components/ui/native-select/index.ts b/web/src/components/ui/native-select/index.ts
new file mode 100644
index 00000000..cf632e5f
--- /dev/null
+++ b/web/src/components/ui/native-select/index.ts
@@ -0,0 +1,2 @@
+export { default as NativeSelect } from "./NativeSelect.vue"
+export { default as NativeSelectOption } from "./NativeSelectOption.vue"
diff --git a/web/src/components/ui/popover/Popover.vue b/web/src/components/ui/popover/Popover.vue
new file mode 100644
index 00000000..4efdb98a
--- /dev/null
+++ b/web/src/components/ui/popover/Popover.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/popover/PopoverContent.vue b/web/src/components/ui/popover/PopoverContent.vue
index 00284f71..27ebbc87 100644
--- a/web/src/components/ui/popover/PopoverContent.vue
+++ b/web/src/components/ui/popover/PopoverContent.vue
@@ -1,28 +1,43 @@
diff --git a/web/src/components/ui/popover/PopoverTrigger.vue b/web/src/components/ui/popover/PopoverTrigger.vue
new file mode 100644
index 00000000..fd3b4974
--- /dev/null
+++ b/web/src/components/ui/popover/PopoverTrigger.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/popover/index.ts b/web/src/components/ui/popover/index.ts
index 720bfb99..24909089 100644
--- a/web/src/components/ui/popover/index.ts
+++ b/web/src/components/ui/popover/index.ts
@@ -1,5 +1,3 @@
-export {
- PopoverRoot as Popover,
- PopoverTrigger,
-} from 'reka-ui'
-export { default as PopoverContent } from './PopoverContent.vue'
+export { default as Popover } from "./Popover.vue"
+export { default as PopoverContent } from "./PopoverContent.vue"
+export { default as PopoverTrigger } from "./PopoverTrigger.vue"
diff --git a/web/src/components/ui/radio-group/RadioGroup.vue b/web/src/components/ui/radio-group/RadioGroup.vue
index 3869f85e..54045c42 100644
--- a/web/src/components/ui/radio-group/RadioGroup.vue
+++ b/web/src/components/ui/radio-group/RadioGroup.vue
@@ -15,9 +15,11 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits)
-
+
diff --git a/web/src/components/ui/radio-group/RadioGroupItem.vue b/web/src/components/ui/radio-group/RadioGroupItem.vue
index 142bb374..04a83a81 100644
--- a/web/src/components/ui/radio-group/RadioGroupItem.vue
+++ b/web/src/components/ui/radio-group/RadioGroupItem.vue
@@ -1,8 +1,8 @@
-
-
+
+
-
-
-
-
-
-
+
diff --git a/web/src/components/ui/scroll-area/ScrollBar.vue b/web/src/components/ui/scroll-area/ScrollBar.vue
new file mode 100644
index 00000000..a0b6f9b7
--- /dev/null
+++ b/web/src/components/ui/scroll-area/ScrollBar.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/scroll-area/index.ts b/web/src/components/ui/scroll-area/index.ts
index 82a7ce7d..c416759c 100644
--- a/web/src/components/ui/scroll-area/index.ts
+++ b/web/src/components/ui/scroll-area/index.ts
@@ -1 +1,2 @@
-export { default as ScrollArea } from './ScrollArea.vue'
+export { default as ScrollArea } from "./ScrollArea.vue"
+export { default as ScrollBar } from "./ScrollBar.vue"
diff --git a/web/src/components/ui/select/Select.vue b/web/src/components/ui/select/Select.vue
index 416fefd7..c94bbe88 100644
--- a/web/src/components/ui/select/Select.vue
+++ b/web/src/components/ui/select/Select.vue
@@ -9,7 +9,11 @@ const forwarded = useForwardPropsEmits(props, emits)
-
-
+
+
diff --git a/web/src/components/ui/select/SelectContent.vue b/web/src/components/ui/select/SelectContent.vue
index 06359306..1dc29a04 100644
--- a/web/src/components/ui/select/SelectContent.vue
+++ b/web/src/components/ui/select/SelectContent.vue
@@ -31,8 +31,10 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits)
-
+
diff --git a/web/src/components/ui/select/SelectGroup.vue b/web/src/components/ui/select/SelectGroup.vue
index 5e089454..e981c6c5 100644
--- a/web/src/components/ui/select/SelectGroup.vue
+++ b/web/src/components/ui/select/SelectGroup.vue
@@ -1,17 +1,15 @@
-
+
diff --git a/web/src/components/ui/select/SelectItem.vue b/web/src/components/ui/select/SelectItem.vue
index f5d2e2f6..79ba4b59 100644
--- a/web/src/components/ui/select/SelectItem.vue
+++ b/web/src/components/ui/select/SelectItem.vue
@@ -1,8 +1,8 @@
-
+
diff --git a/web/src/components/ui/select/SelectLabel.vue b/web/src/components/ui/select/SelectLabel.vue
index 058d2196..5b6650cb 100644
--- a/web/src/components/ui/select/SelectLabel.vue
+++ b/web/src/components/ui/select/SelectLabel.vue
@@ -8,7 +8,10 @@ const props = defineProps
-
+
diff --git a/web/src/components/ui/select/SelectScrollDownButton.vue b/web/src/components/ui/select/SelectScrollDownButton.vue
index 9e18a33c..4f1056fa 100644
--- a/web/src/components/ui/select/SelectScrollDownButton.vue
+++ b/web/src/components/ui/select/SelectScrollDownButton.vue
@@ -1,8 +1,8 @@
-
+
-
+
diff --git a/web/src/components/ui/select/SelectScrollUpButton.vue b/web/src/components/ui/select/SelectScrollUpButton.vue
index df987e9f..c190782e 100644
--- a/web/src/components/ui/select/SelectScrollUpButton.vue
+++ b/web/src/components/ui/select/SelectScrollUpButton.vue
@@ -1,8 +1,8 @@
-
+
-
+
diff --git a/web/src/components/ui/select/SelectSeparator.vue b/web/src/components/ui/select/SelectSeparator.vue
index 89c12ea2..4b5c8857 100644
--- a/web/src/components/ui/select/SelectSeparator.vue
+++ b/web/src/components/ui/select/SelectSeparator.vue
@@ -11,5 +11,9 @@ const delegatedProps = reactiveOmit(props, "class")
-
+
diff --git a/web/src/components/ui/select/SelectTrigger.vue b/web/src/components/ui/select/SelectTrigger.vue
index 3f291240..2676a7fe 100644
--- a/web/src/components/ui/select/SelectTrigger.vue
+++ b/web/src/components/ui/select/SelectTrigger.vue
@@ -1,29 +1,33 @@
-
+
diff --git a/web/src/components/ui/select/SelectValue.vue b/web/src/components/ui/select/SelectValue.vue
index d8bba4d6..d5ce58b5 100644
--- a/web/src/components/ui/select/SelectValue.vue
+++ b/web/src/components/ui/select/SelectValue.vue
@@ -6,7 +6,10 @@ const props = defineProps()
-
+
diff --git a/web/src/components/ui/sheet/Sheet.vue b/web/src/components/ui/sheet/Sheet.vue
new file mode 100644
index 00000000..8522f84d
--- /dev/null
+++ b/web/src/components/ui/sheet/Sheet.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/sheet/SheetContent.vue b/web/src/components/ui/sheet/SheetContent.vue
index 0e189c8c..8e1887b8 100644
--- a/web/src/components/ui/sheet/SheetContent.vue
+++ b/web/src/components/ui/sheet/SheetContent.vue
@@ -1,69 +1,60 @@
-
+
+
-
+
Close
diff --git a/web/src/components/ui/sheet/SheetDescription.vue b/web/src/components/ui/sheet/SheetDescription.vue
index 2e769319..6c8ba0a9 100644
--- a/web/src/components/ui/sheet/SheetDescription.vue
+++ b/web/src/components/ui/sheet/SheetDescription.vue
@@ -1,13 +1,21 @@
-
+
diff --git a/web/src/components/ui/sheet/SheetHeader.vue b/web/src/components/ui/sheet/SheetHeader.vue
index 48d4be0c..b6305ab6 100644
--- a/web/src/components/ui/sheet/SheetHeader.vue
+++ b/web/src/components/ui/sheet/SheetHeader.vue
@@ -1,14 +1,15 @@
-
+
diff --git a/web/src/components/ui/sheet/SheetOverlay.vue b/web/src/components/ui/sheet/SheetOverlay.vue
new file mode 100644
index 00000000..220452a7
--- /dev/null
+++ b/web/src/components/ui/sheet/SheetOverlay.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/sheet/SheetTitle.vue b/web/src/components/ui/sheet/SheetTitle.vue
index dedf2f48..889ae54a 100644
--- a/web/src/components/ui/sheet/SheetTitle.vue
+++ b/web/src/components/ui/sheet/SheetTitle.vue
@@ -1,13 +1,21 @@
-
+
diff --git a/web/src/components/ui/sheet/index.ts b/web/src/components/ui/sheet/index.ts
index 5190948b..d0524e20 100644
--- a/web/src/components/ui/sheet/index.ts
+++ b/web/src/components/ui/sheet/index.ts
@@ -1,9 +1,5 @@
-export {
- DialogRoot as Sheet,
- DialogTrigger as SheetTrigger,
- DialogClose as SheetClose,
-} from 'reka-ui'
-export { default as SheetContent } from './SheetContent.vue'
-export { default as SheetHeader } from './SheetHeader.vue'
-export { default as SheetTitle } from './SheetTitle.vue'
-export { default as SheetDescription } from './SheetDescription.vue'
+export { default as Sheet } from "./Sheet.vue"
+export { default as SheetContent } from "./SheetContent.vue"
+export { default as SheetDescription } from "./SheetDescription.vue"
+export { default as SheetHeader } from "./SheetHeader.vue"
+export { default as SheetTitle } from "./SheetTitle.vue"
diff --git a/web/src/components/ui/sidebar/Sidebar.vue b/web/src/components/ui/sidebar/Sidebar.vue
new file mode 100644
index 00000000..eb251566
--- /dev/null
+++ b/web/src/components/ui/sidebar/Sidebar.vue
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/sidebar/SidebarContent.vue b/web/src/components/ui/sidebar/SidebarContent.vue
new file mode 100644
index 00000000..bb6d9f1d
--- /dev/null
+++ b/web/src/components/ui/sidebar/SidebarContent.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/sidebar/SidebarGroup.vue b/web/src/components/ui/sidebar/SidebarGroup.vue
new file mode 100644
index 00000000..fbb48873
--- /dev/null
+++ b/web/src/components/ui/sidebar/SidebarGroup.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/sidebar/SidebarGroupLabel.vue b/web/src/components/ui/sidebar/SidebarGroupLabel.vue
new file mode 100644
index 00000000..f5da1300
--- /dev/null
+++ b/web/src/components/ui/sidebar/SidebarGroupLabel.vue
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/sidebar/SidebarHeader.vue b/web/src/components/ui/sidebar/SidebarHeader.vue
new file mode 100644
index 00000000..79cf8833
--- /dev/null
+++ b/web/src/components/ui/sidebar/SidebarHeader.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/sidebar/SidebarInset.vue b/web/src/components/ui/sidebar/SidebarInset.vue
new file mode 100644
index 00000000..f46b43a8
--- /dev/null
+++ b/web/src/components/ui/sidebar/SidebarInset.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/sidebar/SidebarMenu.vue b/web/src/components/ui/sidebar/SidebarMenu.vue
new file mode 100644
index 00000000..e1dd39eb
--- /dev/null
+++ b/web/src/components/ui/sidebar/SidebarMenu.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
diff --git a/web/src/components/ui/sidebar/SidebarMenuButton.vue b/web/src/components/ui/sidebar/SidebarMenuButton.vue
new file mode 100644
index 00000000..502d3959
--- /dev/null
+++ b/web/src/components/ui/sidebar/SidebarMenuButton.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ tooltip }}
+
+
+
+
+
diff --git a/web/src/components/ui/sidebar/SidebarMenuButtonChild.vue b/web/src/components/ui/sidebar/SidebarMenuButtonChild.vue
new file mode 100644
index 00000000..4b4ca3ba
--- /dev/null
+++ b/web/src/components/ui/sidebar/SidebarMenuButtonChild.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/sidebar/SidebarMenuItem.vue b/web/src/components/ui/sidebar/SidebarMenuItem.vue
new file mode 100644
index 00000000..e2fda5b4
--- /dev/null
+++ b/web/src/components/ui/sidebar/SidebarMenuItem.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/sidebar/SidebarProvider.vue b/web/src/components/ui/sidebar/SidebarProvider.vue
new file mode 100644
index 00000000..36606c4c
--- /dev/null
+++ b/web/src/components/ui/sidebar/SidebarProvider.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/sidebar/SidebarTrigger.vue b/web/src/components/ui/sidebar/SidebarTrigger.vue
new file mode 100644
index 00000000..d934ccab
--- /dev/null
+++ b/web/src/components/ui/sidebar/SidebarTrigger.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
+ Toggle Sidebar
+
+
diff --git a/web/src/components/ui/sidebar/index.ts b/web/src/components/ui/sidebar/index.ts
new file mode 100644
index 00000000..f68a35ad
--- /dev/null
+++ b/web/src/components/ui/sidebar/index.ts
@@ -0,0 +1,48 @@
+import type { VariantProps } from "class-variance-authority"
+import type { HTMLAttributes } from "vue"
+import { cva } from "class-variance-authority"
+
+export interface SidebarProps {
+ side?: "left" | "right"
+ variant?: "sidebar" | "floating" | "inset"
+ collapsible?: "offcanvas" | "icon" | "none"
+ class?: HTMLAttributes["class"]
+}
+
+export { default as Sidebar } from "./Sidebar.vue"
+export { default as SidebarContent } from "./SidebarContent.vue"
+export { default as SidebarGroup } from "./SidebarGroup.vue"
+export { default as SidebarGroupLabel } from "./SidebarGroupLabel.vue"
+export { default as SidebarHeader } from "./SidebarHeader.vue"
+export { default as SidebarInset } from "./SidebarInset.vue"
+export { default as SidebarMenu } from "./SidebarMenu.vue"
+export { default as SidebarMenuButton } from "./SidebarMenuButton.vue"
+export { default as SidebarMenuItem } from "./SidebarMenuItem.vue"
+export { default as SidebarProvider } from "./SidebarProvider.vue"
+export { default as SidebarTrigger } from "./SidebarTrigger.vue"
+
+export { useSidebar } from "./utils"
+
+export const sidebarMenuButtonVariants = cva(
+ "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
+ {
+ variants: {
+ variant: {
+ default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
+ outline:
+ "bg-background shadow-[0_0_0_1px_var(--sidebar-border)] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_var(--sidebar-accent)]",
+ },
+ size: {
+ default: "h-8 text-sm",
+ sm: "h-7 text-xs",
+ lg: "h-12 text-sm group-data-[collapsible=icon]:p-0!",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+ },
+)
+
+export type SidebarMenuButtonVariants = VariantProps
diff --git a/web/src/components/ui/sidebar/utils.ts b/web/src/components/ui/sidebar/utils.ts
new file mode 100644
index 00000000..6e57eeb9
--- /dev/null
+++ b/web/src/components/ui/sidebar/utils.ts
@@ -0,0 +1,19 @@
+import type { ComputedRef, Ref } from "vue"
+import { createContext } from "reka-ui"
+
+export const SIDEBAR_COOKIE_NAME = "sidebar_state"
+export const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7
+export const SIDEBAR_WIDTH = "16rem"
+export const SIDEBAR_WIDTH_MOBILE = "18rem"
+export const SIDEBAR_WIDTH_ICON = "3rem"
+export const SIDEBAR_KEYBOARD_SHORTCUT = "b"
+
+export const [useSidebar, provideSidebarContext] = createContext<{
+ state: ComputedRef<"expanded" | "collapsed">
+ open: Ref
+ setOpen: (value: boolean) => void
+ isMobile: Ref
+ openMobile: Ref
+ setOpenMobile: (value: boolean) => void
+ toggleSidebar: () => void
+}>("Sidebar")
diff --git a/web/src/components/ui/skeleton/Skeleton.vue b/web/src/components/ui/skeleton/Skeleton.vue
new file mode 100644
index 00000000..0dadcef9
--- /dev/null
+++ b/web/src/components/ui/skeleton/Skeleton.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
diff --git a/web/src/components/ui/skeleton/index.ts b/web/src/components/ui/skeleton/index.ts
new file mode 100644
index 00000000..e5ce72c3
--- /dev/null
+++ b/web/src/components/ui/skeleton/index.ts
@@ -0,0 +1 @@
+export { default as Skeleton } from "./Skeleton.vue"
diff --git a/web/src/components/ui/slider/Slider.vue b/web/src/components/ui/slider/Slider.vue
index ac01c30f..bae7b720 100644
--- a/web/src/components/ui/slider/Slider.vue
+++ b/web/src/components/ui/slider/Slider.vue
@@ -15,19 +15,29 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits)
-
-
+
+
+
diff --git a/web/src/components/ui/stepper/Stepper.vue b/web/src/components/ui/stepper/Stepper.vue
new file mode 100644
index 00000000..91a7ce63
--- /dev/null
+++ b/web/src/components/ui/stepper/Stepper.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/stepper/StepperItem.vue b/web/src/components/ui/stepper/StepperItem.vue
new file mode 100644
index 00000000..fda449bb
--- /dev/null
+++ b/web/src/components/ui/stepper/StepperItem.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/stepper/StepperSeparator.vue b/web/src/components/ui/stepper/StepperSeparator.vue
new file mode 100644
index 00000000..33b5a735
--- /dev/null
+++ b/web/src/components/ui/stepper/StepperSeparator.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
diff --git a/web/src/components/ui/stepper/StepperTitle.vue b/web/src/components/ui/stepper/StepperTitle.vue
new file mode 100644
index 00000000..90041829
--- /dev/null
+++ b/web/src/components/ui/stepper/StepperTitle.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/stepper/StepperTrigger.vue b/web/src/components/ui/stepper/StepperTrigger.vue
new file mode 100644
index 00000000..0cbb5399
--- /dev/null
+++ b/web/src/components/ui/stepper/StepperTrigger.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/stepper/index.ts b/web/src/components/ui/stepper/index.ts
new file mode 100644
index 00000000..60ebe934
--- /dev/null
+++ b/web/src/components/ui/stepper/index.ts
@@ -0,0 +1,5 @@
+export { default as Stepper } from "./Stepper.vue"
+export { default as StepperItem } from "./StepperItem.vue"
+export { default as StepperSeparator } from "./StepperSeparator.vue"
+export { default as StepperTitle } from "./StepperTitle.vue"
+export { default as StepperTrigger } from "./StepperTrigger.vue"
diff --git a/web/src/components/ui/switch/Switch.vue b/web/src/components/ui/switch/Switch.vue
index 2e725edb..96bf705a 100644
--- a/web/src/components/ui/switch/Switch.vue
+++ b/web/src/components/ui/switch/Switch.vue
@@ -24,7 +24,7 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits)
data-slot="switch"
v-bind="forwarded"
:class="cn(
- 'peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50',
+ 'peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-3 disabled:cursor-not-allowed disabled:opacity-50',
props.class,
)"
>
diff --git a/web/src/components/ui/table/Table.vue b/web/src/components/ui/table/Table.vue
new file mode 100644
index 00000000..0d0cd9b4
--- /dev/null
+++ b/web/src/components/ui/table/Table.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/web/src/components/ui/table/TableBody.vue b/web/src/components/ui/table/TableBody.vue
new file mode 100644
index 00000000..d14a2d32
--- /dev/null
+++ b/web/src/components/ui/table/TableBody.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/table/TableCell.vue b/web/src/components/ui/table/TableCell.vue
new file mode 100644
index 00000000..3a83b7db
--- /dev/null
+++ b/web/src/components/ui/table/TableCell.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+ |
+
diff --git a/web/src/components/ui/table/TableHead.vue b/web/src/components/ui/table/TableHead.vue
new file mode 100644
index 00000000..3a2ea4ce
--- /dev/null
+++ b/web/src/components/ui/table/TableHead.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+ |
+
diff --git a/web/src/components/ui/table/TableHeader.vue b/web/src/components/ui/table/TableHeader.vue
new file mode 100644
index 00000000..b4ab5cfb
--- /dev/null
+++ b/web/src/components/ui/table/TableHeader.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/table/TableRow.vue b/web/src/components/ui/table/TableRow.vue
new file mode 100644
index 00000000..8f1d172f
--- /dev/null
+++ b/web/src/components/ui/table/TableRow.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/ui/table/index.ts b/web/src/components/ui/table/index.ts
new file mode 100644
index 00000000..6561e6e7
--- /dev/null
+++ b/web/src/components/ui/table/index.ts
@@ -0,0 +1,6 @@
+export { default as Table } from "./Table.vue"
+export { default as TableBody } from "./TableBody.vue"
+export { default as TableCell } from "./TableCell.vue"
+export { default as TableHead } from "./TableHead.vue"
+export { default as TableHeader } from "./TableHeader.vue"
+export { default as TableRow } from "./TableRow.vue"
diff --git a/web/src/components/ui/tabs/TabsList.vue b/web/src/components/ui/tabs/TabsList.vue
index a64a2dad..2b75b431 100644
--- a/web/src/components/ui/tabs/TabsList.vue
+++ b/web/src/components/ui/tabs/TabsList.vue
@@ -15,7 +15,7 @@ const delegatedProps = reactiveOmit(props, "class")
data-slot="tabs-list"
v-bind="delegatedProps"
:class="cn(
- 'bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]',
+ 'bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-0.75',
props.class,
)"
>
diff --git a/web/src/components/ui/tabs/TabsTrigger.vue b/web/src/components/ui/tabs/TabsTrigger.vue
index 45e424f7..14ebcfb4 100644
--- a/web/src/components/ui/tabs/TabsTrigger.vue
+++ b/web/src/components/ui/tabs/TabsTrigger.vue
@@ -16,7 +16,7 @@ const forwardedProps = useForwardProps(delegatedProps)
-import type { HTMLAttributes } from 'vue'
-import { cn } from '@/lib/utils'
-
-defineOptions({
- inheritAttrs: false,
-})
+import type { HTMLAttributes } from "vue"
+import { useVModel } from "@vueuse/core"
+import { cn } from "@/lib/utils"
const props = defineProps<{
- class?: HTMLAttributes['class']
- modelValue?: string
+ class?: HTMLAttributes["class"]
+ defaultValue?: string | number
+ modelValue?: string | number
}>()
-const emit = defineEmits<{
- (e: 'update:modelValue', value: string): void
+const emits = defineEmits<{
+ (e: "update:modelValue", payload: string | number): void
}>()
+
+const modelValue = useVModel(props, "modelValue", emits, {
+ passive: true,
+ defaultValue: props.defaultValue,
+})
diff --git a/web/src/components/ui/textarea/index.ts b/web/src/components/ui/textarea/index.ts
index 6a7ab2a7..8ce91e9c 100644
--- a/web/src/components/ui/textarea/index.ts
+++ b/web/src/components/ui/textarea/index.ts
@@ -1 +1 @@
-export { default as Textarea } from './Textarea.vue'
+export { default as Textarea } from "./Textarea.vue"
diff --git a/web/src/components/ui/toggle-group/ToggleGroup.vue b/web/src/components/ui/toggle-group/ToggleGroup.vue
index a2368336..876051fd 100644
--- a/web/src/components/ui/toggle-group/ToggleGroup.vue
+++ b/web/src/components/ui/toggle-group/ToggleGroup.vue
@@ -10,25 +10,40 @@ import { cn } from "@/lib/utils"
type ToggleGroupVariants = VariantProps
-const props = defineProps()
+ spacing?: number
+}>(), {
+ spacing: 0,
+})
+
const emits = defineEmits()
provide("toggleGroup", {
variant: props.variant,
size: props.size,
+ spacing: props.spacing,
})
-const delegatedProps = reactiveOmit(props, "class")
-
+const delegatedProps = reactiveOmit(props, "class", "size", "variant")
const forwarded = useForwardPropsEmits(delegatedProps, emits)
-
+
diff --git a/web/src/components/ui/toggle-group/ToggleGroupItem.vue b/web/src/components/ui/toggle-group/ToggleGroupItem.vue
index 06db458f..c042abf8 100644
--- a/web/src/components/ui/toggle-group/ToggleGroupItem.vue
+++ b/web/src/components/ui/toggle-group/ToggleGroupItem.vue
@@ -8,7 +8,9 @@ import { inject } from "vue"
import { cn } from "@/lib/utils"
import { toggleVariants } from '@/components/ui/toggle'
-type ToggleGroupVariants = VariantProps
+type ToggleGroupVariants = VariantProps & {
+ spacing?: number
+}
const props = defineProps("toggleGroup")
const delegatedProps = reactiveOmit(props, "class", "size", "variant")
-
const forwardedProps = useForwardProps(delegatedProps)
diff --git a/web/src/components/ui/toggle/index.ts b/web/src/components/ui/toggle/index.ts
index d873390e..7bf08dce 100644
--- a/web/src/components/ui/toggle/index.ts
+++ b/web/src/components/ui/toggle/index.ts
@@ -4,7 +4,7 @@ import { cva } from "class-variance-authority"
export { default as Toggle } from "./Toggle.vue"
export const toggleVariants = cva(
- "inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap",
+ "inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3 outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap",
{
variants: {
variant: {
diff --git a/web/src/components/ui/tooltip/TooltipContent.vue b/web/src/components/ui/tooltip/TooltipContent.vue
index c5d2df9c..7954b147 100644
--- a/web/src/components/ui/tooltip/TooltipContent.vue
+++ b/web/src/components/ui/tooltip/TooltipContent.vue
@@ -28,7 +28,7 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits)
>
-
+
diff --git a/web/src/composables/useTheme.ts b/web/src/composables/useTheme.ts
new file mode 100644
index 00000000..f4ba10a9
--- /dev/null
+++ b/web/src/composables/useTheme.ts
@@ -0,0 +1,54 @@
+import { readonly, ref } from 'vue'
+
+export type Theme = 'light' | 'dark' | 'system'
+
+const theme = ref('system')
+const isDark = ref(false)
+let initialized = false
+let mediaQuery: MediaQueryList | null = null
+
+function applyTheme() {
+ const dark = theme.value === 'dark' || (theme.value === 'system' && mediaQuery?.matches === true)
+ isDark.value = dark
+ document.documentElement.classList.toggle('dark', dark)
+}
+
+function handleSystemThemeChange() {
+ if (theme.value === 'system') applyTheme()
+}
+
+function initializeTheme() {
+ if (initialized || typeof window === 'undefined') return
+
+ const storedTheme = localStorage.getItem('theme')
+ if (storedTheme === 'light' || storedTheme === 'dark' || storedTheme === 'system') {
+ theme.value = storedTheme
+ }
+
+ mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')
+ mediaQuery.addEventListener('change', handleSystemThemeChange)
+ initialized = true
+ applyTheme()
+}
+
+function setTheme(value: Theme) {
+ initializeTheme()
+ theme.value = value
+ localStorage.setItem('theme', value)
+ applyTheme()
+}
+
+function toggleTheme() {
+ initializeTheme()
+ setTheme(isDark.value ? 'light' : 'dark')
+}
+
+export function useTheme() {
+ initializeTheme()
+ return {
+ theme: readonly(theme),
+ isDark: readonly(isDark),
+ setTheme,
+ toggleTheme,
+ }
+}
diff --git a/web/src/i18n/en-US.ts b/web/src/i18n/en-US.ts
index 10e709b9..218b4e72 100644
--- a/web/src/i18n/en-US.ts
+++ b/web/src/i18n/en-US.ts
@@ -5,10 +5,7 @@ export default {
cancel: 'Cancel',
confirm: 'Confirm',
delete: 'Delete',
- upload: 'Upload',
- download: 'Download',
refresh: 'Refresh',
- close: 'Close',
success: 'Success',
error: 'Error',
warning: 'Warning',
@@ -24,21 +21,16 @@ export default {
connected: 'Connected',
disconnected: 'Disconnected',
connecting: 'Connecting...',
- disconnecting: 'Disconnecting...',
unknown: 'Unknown',
back: 'Back',
next: 'Next',
apply: 'Apply',
menu: 'Menu',
optional: 'Optional',
- recommended: 'Recommended',
notSupportedYet: ' (Not Yet Supported)',
create: 'Create',
creating: 'Creating...',
deleting: 'Deleting...',
- more: 'More',
- collapse: 'Collapse',
- expand: 'Expand',
toggleTheme: 'Toggle theme',
toggleLanguage: 'Toggle language',
retry: 'Retry',
@@ -55,9 +47,6 @@ export default {
networkErrorDesc: 'Unable to connect to server. Please check your connection.',
},
nav: {
- console: 'Console',
- msd: 'Virtual Media',
- settings: 'Settings',
logout: 'Logout',
},
auth: {
@@ -80,8 +69,6 @@ export default {
passwordRequired: 'Please fill in all password fields',
passwordMismatch: 'Passwords do not match',
passwordTooShort: 'Password must be at least 4 characters',
- passwordChanged: 'Password changed successfully',
- userNotFound: 'User not found',
sessionExpired: 'Session expired',
loggedInElsewhere: 'Logged in elsewhere',
forgotPassword: 'Forgot password',
@@ -101,10 +88,6 @@ export default {
power: 'Power',
keyboard: 'Virtual Keyboard',
keyboardTip: 'Show virtual keyboard',
- mouseAbsolute: 'Absolute Mouse',
- mouseRelative: 'Relative Mouse',
- mouseAbsoluteTip: 'Absolute positioning - direct screen coordinate mapping',
- mouseRelativeTip: 'Relative positioning - sends mouse movement deltas',
webTerminal: 'Web Terminal',
stats: 'Stats',
statsTip: 'View connection statistics',
@@ -117,8 +100,7 @@ export default {
deviceSettings: 'Device Settings',
videoMode: 'Mode',
selectMode: 'Select mode...',
- h264Hint: 'H.264 mode requires WebRTC support, lower latency',
- webrtcHint: 'WebRTC mode has lower latency, requires browser support',
+ videoModeHint: 'HTTP uses more bandwidth but offers broad compatibility; WebRTC has stricter network requirements but uses less bandwidth',
videoDevice: 'Device',
videoFormat: 'Format',
videoResolution: 'Resolution',
@@ -129,14 +111,9 @@ export default {
selectFps: 'Select FPS...',
bitratePreset: 'Bitrate',
bitrateSpeed: 'Speed',
- bitrateSpeedDesc: '1 Mbps - Lowest latency',
bitrateBalanced: 'Balanced',
- bitrateBalancedDesc: '4 Mbps - Recommended',
bitrateQuality: 'Quality',
- bitrateQualityDesc: '8 Mbps - Best visual',
browserUnsupported: 'Browser unsupported',
- encoder: 'Encoder',
- changeEncoderBackend: 'Change encoder backend...',
backendSoftware: 'Software',
backendAuto: 'Auto',
recommended: 'Recommended',
@@ -158,7 +135,6 @@ export default {
audioConfig: 'Audio',
playbackControl: 'Playback',
volume: 'Volume',
- mute: 'Mute',
audioDeviceSettings: 'Device Settings',
audioEnabled: 'Audio',
audioDevice: 'Device',
@@ -207,16 +183,12 @@ export default {
macAddress: 'MAC Address',
invalidMac: 'Invalid MAC address format',
recentMac: 'Recent',
- send: 'Send',
- wolSent: 'WOL packet sent',
wolFailed: 'Failed to send WOL packet',
},
setup: {
- title: 'Initial Setup',
welcome: 'Welcome to One-KVM',
description: 'Complete the initial setup to get started',
stepAccount: 'Account Setup',
- stepVideo: 'Video Setup',
stepAudioVideo: 'Audio/Video Setup',
stepHid: 'HID Setup',
setUsername: 'Set Admin Username',
@@ -242,9 +214,7 @@ export default {
noAudioDevices: 'No audio devices detected',
audioDeviceHelp: 'Select the audio capture device for capturing remote host audio. Usually on the same USB device as the video capture card.',
hidBackend: 'HID Backend',
- selectHidBackend: 'Select HID control method',
serialHid: 'Serial HID',
- disableHid: 'Disabled',
serialPort: 'Serial Port',
selectSerialPort: 'Select serial port',
noSerialDevices: 'No serial devices detected',
@@ -252,7 +222,6 @@ export default {
udc: 'USB Device Controller',
selectUdc: 'Select UDC',
noUdcDevices: 'No UDC devices detected',
- hidDisabledHint: 'Disabling HID will prevent keyboard and mouse control of the remote host',
complete: 'Complete Setup',
setupFailed: 'Setup failed',
advancedEncoder: 'Advanced: Encoder Backend',
@@ -269,10 +238,8 @@ export default {
extensionsDescription: 'Choose which extensions to auto-start',
ttydTitle: 'Web Terminal (ttyd)',
ttydDescription: 'Access device command line in browser',
- ttydWindowsUnsupportedDescription: 'ttyd Web Terminal is not supported on Windows and will not be enabled.',
extensionsHint: 'These settings can be changed later in Settings',
notInstalled: 'Not installed',
- notSupportedOnWindows: 'Unsupported on Windows',
passwordStrength: 'Password Strength',
passwordWeak: 'Weak',
passwordMedium: 'Medium',
@@ -280,24 +247,14 @@ export default {
passwordVeryStrong: 'Very Strong',
},
console: {
- title: 'Remote Console',
videoAlt: 'KVM Video',
- videoMode: 'Video Mode',
mjpeg: 'MJPEG',
webrtc: 'WebRTC',
- fullscreen: 'Fullscreen',
- exitFullscreen: 'Exit Fullscreen',
- screenshot: 'Screenshot',
reconnect: 'Refresh Page',
- noVideo: 'No video signal',
connecting: 'Connecting...',
- streamOffline: 'Stream offline',
connectionFailed: 'Connection Failed',
connectionFailedDesc: 'Unable to connect to video stream, please refresh page or check device status',
videoRestarting: 'Video stream is restarting',
- deviceSwitching: 'Switching video device...',
- configChanging: 'Applying new configuration...',
- videoRestarted: 'Video stream updated',
streamError: 'Stream error',
// Four canonical video states (backend StreamStateChanged: streaming /
// no_signal / device_lost / device_busy). `reason` provides optional
@@ -321,7 +278,7 @@ export default {
},
uvc_usb_error: {
title: 'USB capture transport error',
- detail: 'The USB capture device encountered a protocol error (EPROTO). You can try resetting the device from Settings → Environment → USB Devices.',
+ detail: 'The USB capture device encountered a protocol error (EPROTO). You can try resetting it from Settings → Other → USB Device Reset.',
},
uvc_capture_stall: {
title: 'UVC capture stalled',
@@ -339,14 +296,12 @@ export default {
audio_device_lost: 'Audio capture is unavailable; recovery in progress',
audio_reconnecting: 'Retrying audio device connection',
uvc_usb_error:
- 'Try another USB port or cable, avoid hubs, or reconnect the device. You can also reset the device from Settings → Environment → USB Devices.',
+ 'Try another USB port or cable, avoid hubs, or reconnect the device. You can also reset it from Settings → Other → USB Device Reset.',
uvc_capture_stall: '',
},
},
webrtcConnected: 'WebRTC Connected',
- webrtcConnectedDesc: 'Using low-latency H.264 video stream',
webrtcFailed: 'WebRTC Connection Failed',
- fallingBackToMjpeg: 'Falling back to MJPEG mode',
webrtcPhaseIceServers: 'Loading ICE servers...',
webrtcPhaseCreatePeer: 'Creating peer connection...',
webrtcPhaseCreateChannel: 'Creating data channel...',
@@ -359,40 +314,14 @@ export default {
mjpegPhaseStream: 'Requesting video stream...',
mjpegPhaseFirstFrame: 'Waiting for first frame...',
stepProgress: 'Step {current}/{total}',
- pointerLocked: 'Pointer Locked',
- pointerLockedDesc: 'Press Escape to release the pointer',
pointerLockFailed: 'Failed to lock pointer',
- relativeModeHint: 'Relative Mouse Mode',
- relativeModeHintDesc: 'Click on the video area to lock the pointer, press Escape to release',
- metaKeyHint: 'System Key Detected',
- metaKeyHintDesc: 'Enter fullscreen mode to capture Win/Meta keys',
- streamModeChanged: 'Video Mode Changed',
- streamModeChangedDesc: 'Server switched to {mode} mode',
deviceLost: 'Video Device Lost',
deviceLostDesc: '{device}: {reason}',
- deviceRecovering: 'Video Device Recovering',
- deviceRecoveringDesc: 'Attempting to recover video device (attempt {attempt})',
- deviceRecovered: 'Video Device Recovered',
- deviceRecoveredDesc: 'Video device reconnected successfully',
pleaseWait: 'Please wait...',
- retryCount: 'Retrying (attempt {count})',
errorDetails: 'Error details',
},
hid: {
- title: 'HID Control',
keyboard: 'Keyboard',
- mouse: 'Mouse',
- reset: 'Reset HID',
- sendCtrlAltDel: 'Send Ctrl+Alt+Del',
- pasteText: 'Paste Text',
- absoluteMouse: 'Absolute',
- relativeMouse: 'Relative',
- deviceLost: 'HID Device Lost',
- deviceLostDesc: '{backend}: {reason}',
- reconnecting: 'HID Reconnecting',
- reconnectingDesc: 'Attempting to reconnect (attempt {attempt})',
- recovered: 'HID Recovered',
- recoveredDesc: '{backend} HID device reconnected successfully',
errorHints: {
udcNotConfigured: 'OTG is ready, waiting for the target host to connect and finish USB enumeration',
disabled: 'HID backend is disabled',
@@ -418,10 +347,6 @@ export default {
audio: {
deviceLost: 'Audio Device Lost',
deviceLostDesc: '{device}: {reason}',
- reconnecting: 'Audio Reconnecting',
- reconnectingDesc: 'Attempting to reconnect (attempt {attempt})',
- recovered: 'Audio Recovered',
- recoveredDesc: '{device} audio device reconnected successfully',
},
msd: {
title: 'Virtual Media',
@@ -438,8 +363,6 @@ export default {
accessMode: 'Access Mode',
readOnly: 'Read Only',
readWrite: 'Read/Write',
- fileList: 'File List',
- uploadFile: 'Upload File',
createFolder: 'Create Folder',
driveNotInitialized: 'Virtual drive not initialized',
initializeDrive: 'Initialize Drive',
@@ -485,11 +408,8 @@ export default {
settings: {
title: 'Settings',
sidebarSubtitle: 'Manage device, network and extensions',
- basic: 'Basic',
- general: 'General',
appearance: 'Appearance',
account: 'Account',
- access: 'Access',
video: 'Video',
encoder: 'Encoder',
hid: 'HID',
@@ -497,38 +417,31 @@ export default {
atx: 'ATX',
environment: 'Environment',
network: 'Network',
- users: 'Users',
hardware: 'Hardware',
system: 'System',
other: 'Other',
extensions: 'Extensions',
- configured: 'Configured',
- security: 'Security',
about: 'About',
appearanceSubtitle: 'Customize interface appearance and language',
- accountSubtitle: 'Manage credentials and session policy',
- networkSubtitle: 'Configure web server ports, listen addresses and SSL certificate',
videoSubtitle: 'Configure capture device, video encoder and WebRTC ICE servers',
hidSubtitle: 'Configure the HID backend, device, descriptors, and USB gadget functions',
- msdSubtitle: 'Manage Mass Storage Device image directory',
atxSubtitle: 'Configure remote power control hardware and Wake-on-LAN',
- environmentSubtitle: 'System runtime environment and USB device maintenance',
- otherSubtitle: 'Additional system hardware controls',
- aboutSubtitle: 'Online upgrade, version info and hardware overview',
+ environmentSubtitle: 'View device information and system runtime diagnostics',
+ otherSubtitle: 'Additional hardware controls and USB device maintenance',
+ aboutSubtitle: 'Online upgrade and version information',
extTtydSubtitle: 'Open a host Shell terminal in the browser',
thirdPartyAccessSubtitle: 'Configure external RustDesk, VNC, RTSP, and Redfish access',
extRemoteAccessSubtitle: 'Remote access through NAT-traversal services',
extFrpcSubtitle: 'NAT traversal through the FRP client',
watchdog: {
title: 'Hardware Watchdog',
- description: 'Automatically use an available hardware watchdog while One-KVM is running.',
+ description: 'The hardware watchdog can trigger a hardware reset if the system hangs or the process exits',
status: {
running: 'Running',
closed: 'Off',
unsupported: 'Unsupported',
error: 'Error',
},
- safety: 'If One-KVM stops feeding the watchdog, the hardware may restart the system according to its watchdog policy.',
loadFailed: 'Failed to load hardware watchdog status',
toggleFailed: 'Failed to update hardware watchdog',
enableFailed: 'Failed to enable the hardware watchdog.',
@@ -539,7 +452,6 @@ export default {
disableFailed: 'The hardware watchdog cannot be safely disabled and keepalive will continue.',
abnormalReason: 'The hardware watchdog is in an abnormal state.',
},
- aboutDesc: 'Open and Lightweight IP-KVM Solution',
deviceInfo: 'Device Info',
deviceInfoDesc: 'Host system information',
hostname: 'Hostname',
@@ -557,55 +469,31 @@ export default {
newPassword: 'New Password',
usernameDesc: 'Change the console login username',
passwordDesc: 'Change the console login password',
- version: 'Version',
- detectDevices: 'Detect Devices',
- detecting: 'Detecting...',
- networkSettings: 'Network Settings',
- msdSettings: 'MSD Settings',
- httpSettings: 'HTTP Settings',
httpPort: 'HTTP Port',
- configureHttpPort: 'Configure HTTP server port',
- webServer: 'Access Address',
- webServerDesc: 'Configure HTTP/HTTPS ports and listening addresses. Restart required for changes to take effect.',
httpsPort: 'HTTPS Port',
bindAddress: 'Bind Address',
- bindAddressDesc: 'IP address the server listens on. 0.0.0.0 means all network interfaces.',
bindMode: 'Listening Address',
- bindModeDesc: 'Choose which addresses the web server binds to.',
bindModeAll: 'All addresses',
bindModeLocal: 'Local only (127.0.0.1)',
bindModeCustom: 'Custom address list',
bindIpv6: 'Enable IPv6',
- bindAllDesc: 'Also listen on :: (all IPv6 interfaces).',
- bindLocalDesc: 'Also listen on ::1 (IPv6 loopback).',
bindAddressList: 'Address List',
- bindAddressListDesc: 'One IP address per line (IPv4 or IPv6).',
addBindAddress: 'Add address',
bindAddressListEmpty: 'Add at least one IP address.',
httpsEnabled: 'Enable HTTPS',
- httpsEnabledDesc: 'Serve over an encrypted connection. A self-signed certificate is generated automatically if none is provided.',
portConfig: 'Port & Protocol',
portConfigDesc: 'The service listens on a single port at a time, determined by the HTTPS toggle',
redfishTitle: 'Redfish',
redfishDesc: 'DMTF Redfish standard management interface',
redfishEnabled: 'Enable Redfish API',
- redfishEnabledDesc: 'When enabled, the standard Redfish management interface is available at /redfish/v1/',
redfishEndpoint: 'Redfish Endpoint',
- copyRedfishUrl: 'Copy Redfish URL',
- openRedfishEndpoint: 'Open Redfish endpoint',
- httpPortReserved: 'HTTP port (reserved)',
- httpsPortReserved: 'HTTPS port (reserved)',
portActive: 'Active',
portReserved: 'Reserved',
- portReservedHint: 'The reserved port is applied only after switching protocol; you can preconfigure it now.',
previewUrl: 'Access URL preview',
copyUrl: 'Copy access URL',
openInBrowser: 'Open in browser',
listenAddress: 'Listen Address',
- listenAddressDesc: 'Choose which network interfaces the web server binds to',
- bindModeAllDesc: '0.0.0.0 — Listen on all network interfaces',
- bindModeLocalDesc: '127.0.0.1 — Loopback only (local access)',
- bindModeCustomDesc: 'Bind to a specific list of IP addresses',
+ listenAddressDesc: 'Configure the network interfaces used by the web server',
effectiveAddresses: 'Effective listen addresses',
sslCertificate: 'SSL Certificate',
sslCertificateDesc: 'Upload a custom PEM certificate to replace the self-signed one. A service restart is required to apply.',
@@ -618,8 +506,6 @@ export default {
sslKeyPem: 'Private Key (.key)',
sslCertPemPlaceholder: '-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----',
sslKeyPemPlaceholder: '-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----',
- sslCertSaved: 'Certificate saved, restart to apply',
- sslCertCleared: 'Reverted to self-signed certificate, restart to apply',
restartRequired: 'Restart Required',
restartRequiredHint: 'The service will restart automatically to apply the new configuration.',
unsavedChangesHint: 'Click Save to apply changes',
@@ -637,7 +523,6 @@ export default {
currentVersion: 'Current Version',
latestVersion: 'Latest Version',
updateStatus: 'Update Status',
- updateStatusIdle: 'Idle',
releaseNotes: 'Release Notes',
noUpdates: 'No new version available for current channel',
updateOverviewLoadFailed: 'Failed to load update information',
@@ -659,38 +544,12 @@ export default {
authSettings: 'Session Policy',
authSettingsDesc: 'Configure single-user login and concurrent session behavior',
allowMultipleSessions: 'Allow concurrent web sessions',
- allowMultipleSessionsDesc: 'When disabled, a new login automatically signs out the previous session',
- userManagement: 'User Management',
- userManagementDesc: 'Manage user accounts and permissions',
- addUser: 'Add User',
- editUser: 'Edit User',
- deleteUser: 'Delete User',
username: 'Username',
password: 'Password',
- role: 'Role',
- roleAdmin: 'Admin',
- roleUser: 'User',
- loadingUsers: 'Loading users...',
- noUsers: 'No users found',
- create: 'Create',
- confirmDeleteUser: 'Are you sure you want to delete user "{name}"?',
- msdStatus: 'MSD Status',
- atxStatus: 'ATX Status',
- available: 'Available',
- notAvailable: 'Not available',
- msdEnable: 'Enable MSD',
- msdEnableDesc: 'Enable to mount ISO images and virtual drives to the target machine',
- msdCh9329Warning: 'HID backend is CH9329, MSD is unavailable',
- msdCh9329WarningDesc: 'CH9329 is a serial HID backend and does not support USB Gadget MSD',
msdDir: 'MSD directory',
- msdDirDesc: 'MSD base directory containing images/ and ventoy/ subfolders',
- msdDirHint: 'Changing this rebuilds MSD and updates console capacity stats',
- willBeEnabledAfterSave: 'Will be enabled after save',
- disabled: 'Disabled',
- msdDesc: 'Mass Storage Device allows you to mount ISO images and virtual drives to the target machine. Use the MSD panel on the main page to manage images.',
- atxDesc: 'ATX power control allows you to remotely power on/off and reset the target machine. Use the ATX panel on the main page to control power.',
atxPowerButton: 'Power Button',
atxResetButton: 'Reset Button',
+ atxPowerManagement: 'Power Management',
atxDriver: 'Driver Type',
atxDriverNone: 'Disabled',
atxDriverGpio: 'GPIO',
@@ -709,7 +568,6 @@ export default {
atxWolSettingsDesc: 'Configure WOL magic packet sending options',
atxWolInterface: 'Network Interface',
atxWolInterfacePlaceholder: 'e.g. eth0, enp0s3',
- atxWolInterfaceHint: 'Specify network interface for WOL packets, leave empty for default routing',
themeDesc: 'Choose the interface color scheme',
languageDesc: 'Choose the interface display language',
featureVisibility: 'Feature Visibility',
@@ -722,7 +580,6 @@ export default {
selectDevice: 'Select device...',
videoFormat: 'Video Format',
selectFormat: 'Select format...',
- driver: 'Driver',
resolution: 'Resolution',
frameRate: 'Frame Rate',
encoderBackend: 'Video Encoder',
@@ -731,14 +588,12 @@ export default {
autoRecommended: 'Auto (Recommended)',
software: 'Software',
supportedFormats: 'Supported Codecs',
- encoderHint: 'Hardware encoders deliver lower latency and CPU usage; software encoders offer broader compatibility at a higher resource cost.',
hidSettings: 'HID Settings',
hidSettingsDesc: 'Configure backend, device, descriptors, and functions in order',
hidBackend: 'HID Backend',
serialDevice: 'Serial Device',
baudRate: 'Baud Rate',
otgUdc: 'OTG Device Controller',
- otgUdcDesc: 'Select the UDC used by the USB gadget, or leave blank for automatic selection',
ch9329Options: 'CH9329 Options',
ch9329OptionsDesc: 'Configure runtime compatibility for the CH9329 serial HID chip',
ch9329HybridMouse: 'Linux Absolute Mouse Compatibility',
@@ -752,29 +607,21 @@ export default {
ch9329DescriptorWarning: 'Saving writes CH9329 parameters; changes may not show until the device is power-cycled or reconnected',
ch9329StringLengthWarning: 'CH9329 strings are limited to 23 bytes',
otgHidProfile: 'OTG Functions',
- otgHidProfileDesc: 'Select which USB functions are exposed to the host',
- otgFunctionKeyboard: 'Keyboard',
+ otgFunctionKeyboard: 'Standard Keyboard',
otgFunctionKeyboardDesc: 'Standard HID keyboard device',
otgKeyboardLeds: 'Keyboard LED Status',
- otgKeyboardLedsDesc: 'Enable Caps/Num/Scroll LED feedback from the host',
- otgFunctionMouseRelative: 'Relative Mouse',
- otgFunctionMouseRelativeDesc: 'Traditional mouse movement (HID boot mouse)',
- otgFunctionMouseAbsolute: 'Absolute Mouse',
- otgFunctionMouseAbsoluteDesc: 'Absolute positioning (touchscreen-like)',
+ otgFunctionMouseRelative: 'Relative Positioning Mouse',
+ otgFunctionMouseAbsolute: 'Absolute Positioning Mouse',
otgFunctionConsumer: 'Consumer Control Keyboard',
- otgFunctionConsumerDesc: 'Consumer Control keys such as volume/play/pause',
otgFunctionMsd: 'Mass Storage (MSD)',
- otgFunctionMsdDesc: 'Expose USB storage to the host',
otgProfileWarning: 'Saving reconnects the USB device; unsupported combinations show an error and restore the previous configuration',
otgFunctionMinWarning: 'Enable at least one HID function before saving',
- otgNetwork: 'USB Virtual Ethernet',
+ otgNetwork: 'USB Virtual Ethernet Bridge',
otgRuntimeDegraded: 'OTG runtime is degraded',
- otgNetworkDesc: 'Bridge the USB link to an existing uplink',
otgNetworkDriver: 'Host Driver Mode',
otgNetworkInterface: 'Bridge Interface',
otgNetworkNone: 'None',
otgDescriptor: 'USB Device Descriptor',
- otgDescriptorDesc: 'Configure USB device identification',
vendorId: 'Vendor ID (VID)',
productId: 'Product ID (PID)',
manufacturer: 'Manufacturer',
@@ -790,7 +637,6 @@ export default {
overall: 'Overall Status',
ok: 'Healthy',
hasIssues: 'Issues Found',
- summary: 'Issue Summary',
counts: '{errors} errors, {warnings} warnings',
groupCounts: '{ok} passed, {warnings} warnings, {errors} errors',
notRun: 'Not run',
@@ -872,7 +718,7 @@ export default {
none: 'None',
},
usbDevices: {
- title: 'USB Devices',
+ title: 'USB Device Reset',
desc: 'View connected USB devices and reset them to recover from errors',
refresh: 'Refresh',
loadFailed: 'Failed to load USB device list',
@@ -887,34 +733,21 @@ export default {
resetAction: 'Reset Device',
},
webrtcSettings: 'WebRTC Signaling',
- webrtcSettingsDesc: 'Configure STUN/TURN servers to assist NAT traversal',
- publicIceServersHint: 'Leave empty to use Google\u2019s public STUN servers; TURN must be self-hosted',
+ webrtcSettingsDesc: 'Configure STUN/TURN servers; changes apply to newly established WebRTC sessions after saving',
stunServer: 'STUN Server',
stunServerPlaceholder: 'stun:stun.l.google.com:19302',
- stunServerHint: 'Leave empty to use Google\u2019s public STUN servers',
turnServer: 'TURN Server',
turnServerPlaceholder: 'turn:turn.example.com:3478',
- turnServerHint: 'TURN relay server. Strongly recommended for public deployments or strict NAT environments.',
turnUsername: 'TURN Username',
turnPassword: 'TURN Password',
- turnCredentialsHint: 'Credentials used for TURN server authentication',
- iceConfigNote: 'Changes apply to the next WebRTC session',
},
virtualKeyboard: {
title: 'Virtual Keyboard',
attach: 'Attach',
detach: 'Detach',
hide: 'Hide',
- show: 'Show Virtual Keyboard',
- layoutSelect: 'Keyboard Layout',
- osWindows: 'Windows',
- osMac: 'Mac',
- osAndroid: 'Android',
- mediaKeys: 'Consumer Control Keyboard',
},
config: {
- applied: 'Configuration applied',
- applyFailed: 'Failed to apply configuration',
loadDevicesFailed: 'Failed to load device list',
updateFailed: 'Update failed',
},
@@ -927,9 +760,6 @@ export default {
online: 'Online',
offline: 'Offline',
connecting: 'Connecting...',
- version: 'Version',
- uptime: 'Uptime',
- running: 'Running',
format: 'Format',
resolution: 'Resolution',
fps: 'FPS',
@@ -937,10 +767,7 @@ export default {
fpsActual: 'Actual FPS',
fpsStaticHint: 'Frame rate drops automatically while the image is static',
paused: 'Paused',
- clients: 'Clients',
backend: 'Backend',
- mouse: 'Mouse',
- mouseSupport: 'Mouse Support',
currentMode: 'Current Mode',
absolute: 'Absolute',
relative: 'Relative',
@@ -948,21 +775,14 @@ export default {
networkError: 'Network Error',
disconnected: 'Disconnected',
hidUnavailable: 'HID Unavailable',
- sampleRate: 'Sample Rate',
- channels: 'Channels',
quality: 'Quality',
streaming: 'Streaming',
off: 'Off',
defaultDevice: 'Default',
- notConnected: 'Not Connected',
connected: 'Connected',
- image: 'Image',
msdStatus: 'Status',
msdStandby: 'Idle',
- msdImageMode: 'Image Mode',
msdDriveMode: 'Virtual USB',
- msdMultiMode: 'Virtual Media: {count} mounted',
- msdMountType: 'Mount Type',
msdCurrentImage: 'Current Image',
msdNoImage: 'None',
},
@@ -978,21 +798,18 @@ export default {
autoStart: 'Auto Start',
thirdPartyAccess: {
title: 'Third-party Access',
- desc: 'Configure RustDesk, VNC, and RTSP in one place',
},
viewLogs: 'View Logs',
noLogs: 'No logs available',
binaryNotFound: '{path} not found, please install the required program',
remoteAccess: {
title: 'Remote Access',
- desc: 'GOSTC/FRPC NAT traversal and Easytier networking',
},
ttyd: {
title: 'Ttyd Web Terminal',
desc: 'Web terminal access via ttyd',
open: 'Open Terminal',
openInNewTab: 'Open in New Tab',
- port: 'Port',
shell: 'Shell',
},
gostc: {
@@ -1014,11 +831,10 @@ export default {
peers: 'Peer Nodes',
addPeer: 'Add Peer',
virtualIp: 'Virtual IP',
- virtualIpHint: 'Leave empty for DHCP, or specify with CIDR (e.g., 10.0.0.1/24)',
},
frpc: {
title: 'FRPC NAT Traversal',
- desc: 'Connect to an frps server through the FRP client',
+ desc: 'Use the FRP client for NAT traversal',
quickConfig: 'Quick Config',
fullConfig: 'Full Config',
fullConfigHint: 'Paste the provider TOML configuration file here',
@@ -1045,8 +861,7 @@ export default {
},
rustdesk: {
title: 'RustDesk Remote',
- desc: 'Remote access via RustDesk client',
- serverSettings: 'Server Settings',
+ desc: 'Configure the RustDesk service; the selected codec will be locked',
rendezvousServer: 'ID Server',
rendezvousServerPlaceholder: 'hbbs.example.com:21116',
rendezvousServerRequired: 'Enter the RustDesk ID server',
@@ -1054,10 +869,8 @@ export default {
relayServerPlaceholder: 'hbbr.example.com:21117',
relayKey: 'Relay Key',
codec: 'Codec',
- codecHint: 'Choose H.264 or H.265 before starting RustDesk. The codec is locked while running.',
deviceInfo: 'Device Info',
deviceId: 'Device ID',
- deviceIdHint: 'Use this ID in RustDesk client to connect',
devicePassword: 'Device Password',
showPassword: 'Show Password',
hidePassword: 'Hide Password',
@@ -1065,8 +878,6 @@ export default {
regeneratePassword: 'Regenerate Password',
confirmRegenerateId: 'Are you sure you want to regenerate the device ID? Existing clients will need to reconnect with the new ID.',
confirmRegeneratePassword: 'Are you sure you want to regenerate the password? Existing clients will need to reconnect with the new password.',
- serviceStatus: 'Service Status',
- rendezvousStatus: 'Registration Status',
registered: 'Registered',
connected: 'Connected',
disconnected: 'Disconnected',
@@ -1075,21 +886,16 @@ export default {
notInitialized: 'Not Initialized',
copyId: 'Copy ID',
copyPassword: 'Copy Password',
- copied: 'Copied',
keypairGenerated: 'Keypair Generated',
- noKeypair: 'No Keypair',
},
rtsp: {
title: 'RTSP Streaming',
- desc: 'Configure RTSP video output service (H.264/H.265)',
+ desc: 'Configure the RTSP streaming service; the selected codec will be locked',
bind: 'Bind Address',
- bindHint: 'Enter an IPv4 or IPv6 address; configure the port in the port field.',
port: 'Port',
path: 'Stream Path',
pathPlaceholder: 'live',
- pathHint: 'Example: rtsp://device-ip:8554/live',
codec: 'Codec',
- codecHint: 'RTSP locks output to the selected codec while running. If RustDesk is running, choose the same codec.',
allowOneClient: 'Allow One Client Only',
username: 'Username',
usernamePlaceholder: 'Empty means no authentication',
@@ -1099,44 +905,31 @@ export default {
},
vnc: {
title: 'VNC Remote',
- desc: 'Access via TigerVNC client',
+ desc: 'Configure the VNC service; the selected codec will be locked',
bind: 'Bind Address',
- bindHint: 'Enter an IPv4 or IPv6 address; configure the port in the port field.',
port: 'Port',
encoding: 'Video Encoding',
encodingTightJpeg: 'Tight JPEG',
encodingH264: 'H.264',
- encodingHint: 'VNC locks output while running. VNC cannot start under an H.265 lock; MJPEG blocks RTSP and RustDesk.',
allowOneClient: 'Allow One Client Only',
password: 'Password',
passwordPlaceholder: 'Leave empty to keep current',
passwordRequiredPlaceholder: 'Up to 8 characters',
passwordRequired: 'Set a VNC password',
passwordMaxLength: 'VNC passwords are limited to 8 characters',
- passwordSaved: 'Password is saved; leaving this empty keeps it unchanged.',
clients: '{count} clients',
urlPreview: 'VNC Address Preview',
},
},
stats: {
title: 'Connection Stats',
- current: 'Current Status',
- video: 'Video',
- videoDesc: 'Video stream from server to client.',
+ video: 'Video Information',
stability: 'Network Stability',
- stabilityDesc: 'How smooth the incoming video packets are in the network.',
- jitter: 'Jitter',
delay: 'Playback Delay',
- delayDesc: 'Delay added by jitter buffer to smooth unevenly arriving frames.',
packetLoss: 'Packet Loss',
- packetLossDesc: 'Number of lost incoming video RTP packets.',
total: 'total',
frameRate: 'Frame Rate',
- frameRateDesc: 'Number of incoming video frames displayed per second.',
- additional: 'Additional Info',
- latency: 'ICE Latency',
bitrate: 'Bitrate',
- fps: 'FPS',
resolution: 'Resolution',
packetsLost: 'Packets Lost',
connection: 'Connection Info',
@@ -1148,23 +941,9 @@ export default {
relay: 'TURN Relay',
},
help: {
- flashMode: 'Flash mode mounts the image as a USB drive, compatible with most BIOS boot',
- cdromMode: 'CDROM mode mounts the image as a CD drive, for systems requiring optical boot',
- readOnlyMode: 'Read-only mode is safer, the target system cannot modify the image',
- readWriteMode: 'Read-write mode allows writing data, useful for saving configurations',
- driveSize: 'Virtual drive size. Larger drives can store more files but take longer to initialize',
- mjpegMode: 'MJPEG mode has best compatibility, works with all browsers, but higher latency',
- webrtcMode: 'WebRTC mode has lower latency, but requires browser codec support',
videoBitratePreset: 'Speed: lowest latency, best for slow networks. Balanced: good quality and latency. Quality: best visual, needs good bandwidth',
- encoderBackend: 'Hardware encoder has better performance and lower power. Software encoder has better compatibility',
absoluteMode: 'Absolute mode maps mouse coordinates directly, suitable for most scenarios',
relativeMode: 'Relative mode sends mouse movement delta, for games or special software',
mouseThrottle: 'Send interval controls mouse event frequency. Higher values reduce network load',
- hidBackend: 'OTG backend requires USB OTG hardware support. CH9329 is a serial HID chip solution',
- atxActiveLevel: 'Active level depends on your hardware wiring. High means high voltage when triggered',
- wolInterface: 'Network interface name for sending Wake-on-LAN magic packets, e.g., eth0 or br0',
- stunServer: 'STUN server for NAT traversal to establish P2P connections. Leave empty for public servers',
- turnServer: 'TURN server provides relay when P2P fails. Requires more bandwidth but more reliable',
- audioQuality: 'Higher quality means better audio but requires more network bandwidth',
},
}
diff --git a/web/src/i18n/zh-CN.ts b/web/src/i18n/zh-CN.ts
index fc9e3f39..1747e1b7 100644
--- a/web/src/i18n/zh-CN.ts
+++ b/web/src/i18n/zh-CN.ts
@@ -5,10 +5,7 @@ export default {
cancel: '取消',
confirm: '确认',
delete: '删除',
- upload: '上传',
- download: '下载',
refresh: '刷新',
- close: '关闭',
success: '成功',
error: '错误',
warning: '警告',
@@ -24,21 +21,16 @@ export default {
connected: '已连接',
disconnected: '已断开',
connecting: '连接中...',
- disconnecting: '断开中...',
unknown: '未知',
back: '上一步',
next: '下一步',
apply: '应用',
menu: '菜单',
optional: '可选',
- recommended: '推荐',
notSupportedYet: '(尚未支持)',
create: '创建',
creating: '创建中...',
deleting: '删除中...',
- more: '更多',
- collapse: '收起',
- expand: '展开',
toggleTheme: '切换主题',
toggleLanguage: '切换语言',
retry: '重试',
@@ -55,9 +47,6 @@ export default {
networkErrorDesc: '无法连接到服务器,请检查网络连接。',
},
nav: {
- console: '控制台',
- msd: '虚拟媒体',
- settings: '设置',
logout: '退出登录',
},
auth: {
@@ -80,8 +69,6 @@ export default {
passwordRequired: '请填写所有密码字段',
passwordMismatch: '两次输入的密码不一致',
passwordTooShort: '密码至少需要4个字符',
- passwordChanged: '密码修改成功',
- userNotFound: '用户不存在',
sessionExpired: '会话已过期',
loggedInElsewhere: '已在别处登录',
forgotPassword: '忘记密码',
@@ -101,10 +88,6 @@ export default {
power: '电源',
keyboard: '虚拟键盘',
keyboardTip: '显示虚拟键盘',
- mouseAbsolute: '绝对鼠标',
- mouseRelative: '相对鼠标',
- mouseAbsoluteTip: '绝对定位模式 - 直接映射屏幕坐标',
- mouseRelativeTip: '相对定位模式 - 发送鼠标移动增量',
webTerminal: '网页终端',
stats: '连接统计',
statsTip: '查看连接状态',
@@ -117,8 +100,7 @@ export default {
deviceSettings: '设备配置',
videoMode: '视频模式',
selectMode: '选择模式...',
- h264Hint: 'H.264 模式需要 WebRTC 支持,延迟更低',
- webrtcHint: 'WebRTC 模式延迟更低,需要浏览器支持',
+ videoModeHint: 'HTTP 对带宽占用较大但模式兼容性好;WebRTC 对网络要求较高但带宽占用低',
videoDevice: '视频设备',
videoFormat: '视频格式',
videoResolution: '分辨率',
@@ -129,14 +111,9 @@ export default {
selectFps: '选择帧率...',
bitratePreset: '码率',
bitrateSpeed: '速度优先',
- bitrateSpeedDesc: '1 Mbps - 最低延迟',
bitrateBalanced: '均衡',
- bitrateBalancedDesc: '4 Mbps - 推荐',
bitrateQuality: '质量优先',
- bitrateQualityDesc: '8 Mbps - 最佳画质',
browserUnsupported: '浏览器不支持',
- encoder: '编码器',
- changeEncoderBackend: '更改编码器后端...',
backendSoftware: '软件编码',
backendAuto: '自动',
recommended: '推荐',
@@ -158,7 +135,6 @@ export default {
audioConfig: '音频',
playbackControl: '播放控制',
volume: '音量',
- mute: '静音',
audioDeviceSettings: '设备配置',
audioEnabled: '启用音频',
audioDevice: '音频设备',
@@ -207,16 +183,12 @@ export default {
macAddress: 'MAC 地址',
invalidMac: 'MAC 地址格式无效',
recentMac: '最近使用',
- send: '发送',
- wolSent: 'WOL 唤醒包已发送',
wolFailed: 'WOL 发送失败',
},
setup: {
- title: '初始化设置',
welcome: '欢迎使用 One-KVM',
description: '请完成初始设置以开始使用',
stepAccount: '账号设置',
- stepVideo: '视频设置',
stepAudioVideo: '音视频设置',
stepHid: '鼠键设置',
setUsername: '设置管理员用户名',
@@ -242,9 +214,7 @@ export default {
noAudioDevices: '未检测到音频设备',
audioDeviceHelp: '选择用于捕获远程主机音频的设备。通常与视频采集卡在同一 USB 设备上。',
hidBackend: 'HID 后端',
- selectHidBackend: '选择 HID 控制方式',
serialHid: '串口 HID',
- disableHid: '禁用',
serialPort: '串口设备',
selectSerialPort: '选择串口设备',
noSerialDevices: '未检测到串口设备',
@@ -252,7 +222,6 @@ export default {
udc: 'USB 设备控制器',
selectUdc: '选择 UDC',
noUdcDevices: '未检测到 UDC 设备',
- hidDisabledHint: '禁用 HID 后将无法控制远程主机的键盘和鼠标',
complete: '完成设置',
setupFailed: '设置失败',
advancedEncoder: '高级选项:编码器后端',
@@ -269,10 +238,8 @@ export default {
extensionsDescription: '选择要自动启动的扩展服务',
ttydTitle: 'Web 终端 (ttyd)',
ttydDescription: '在浏览器中访问设备的命令行终端',
- ttydWindowsUnsupportedDescription: 'Windows 平台暂不支持 ttyd Web 终端,此扩展不会启用。',
extensionsHint: '这些设置可以在设置页面中随时更改',
notInstalled: '未安装',
- notSupportedOnWindows: 'Windows 不支持',
passwordStrength: '密码强度',
passwordWeak: '弱',
passwordMedium: '中',
@@ -280,24 +247,14 @@ export default {
passwordVeryStrong: '很强',
},
console: {
- title: '远程控制台',
videoAlt: 'KVM 视频',
- videoMode: '视频模式',
mjpeg: 'MJPEG',
webrtc: 'WebRTC',
- fullscreen: '全屏',
- exitFullscreen: '退出全屏',
- screenshot: '截图',
reconnect: '刷新网页',
- noVideo: '无视频信号',
connecting: '正在连接...',
- streamOffline: '视频流离线',
connectionFailed: '连接失败',
connectionFailedDesc: '无法连接到视频流,请刷新网页或检查设备状态',
videoRestarting: '视频流正在重启',
- deviceSwitching: '正在切换视频设备...',
- configChanging: '正在应用新配置...',
- videoRestarted: '视频流已更新',
streamError: '视频流错误',
// 四档视频状态(对应后端 StreamStateChanged:streaming / no_signal /
// device_lost / device_busy). `reason` 子键可选,用于在副文案中补充细节。
@@ -320,7 +277,7 @@ export default {
},
uvc_usb_error: {
title: 'USB 采集传输异常',
- detail: 'USB 采集卡遇到协议错误(EPROTO),可在 设置 → 环境 → USB 设备 中尝试复位。',
+ detail: 'USB 采集卡遇到协议错误(EPROTO),可在 设置 → 其他 → USB 设备复位 中尝试复位。',
},
uvc_capture_stall: {
title: 'UVC 采集超时',
@@ -338,14 +295,12 @@ export default {
audio_device_lost: '音频采集不可用,正在自动恢复',
audio_reconnecting: '正在重试连接音频设备',
uvc_usb_error:
- '可尝试更换 USB 口或线、避免 HUB、或重新插拔设备;也可在 设置 → 环境 → USB 设备 中复位。',
+ '可尝试更换 USB 口或线、避免 HUB、或重新插拔设备;也可在 设置 → 其他 → USB 设备复位 中复位。',
uvc_capture_stall: '',
},
},
webrtcConnected: 'WebRTC 已连接',
- webrtcConnectedDesc: '正在使用 H.264 低延迟视频流',
webrtcFailed: 'WebRTC 连接失败',
- fallingBackToMjpeg: '自动切换到 MJPEG 模式',
webrtcPhaseIceServers: '正在加载 ICE 服务器...',
webrtcPhaseCreatePeer: '正在创建点对点连接...',
webrtcPhaseCreateChannel: '正在创建数据通道...',
@@ -358,40 +313,14 @@ export default {
mjpegPhaseStream: '正在请求视频流...',
mjpegPhaseFirstFrame: '正在等待首帧...',
stepProgress: '第 {current}/{total} 步',
- pointerLocked: '鼠标已锁定',
- pointerLockedDesc: '按 Escape 键释放鼠标',
pointerLockFailed: '鼠标锁定失败',
- relativeModeHint: '相对鼠标模式',
- relativeModeHintDesc: '点击视频区域以锁定鼠标,按 Escape 释放',
- metaKeyHint: '检测到系统键',
- metaKeyHintDesc: '请进入全屏模式以捕获 Win/Meta 键',
- streamModeChanged: '视频模式已切换',
- streamModeChangedDesc: '服务器已切换到 {mode} 模式',
deviceLost: '视频设备丢失',
deviceLostDesc: '{device}: {reason}',
- deviceRecovering: '视频设备恢复中',
- deviceRecoveringDesc: '正在尝试恢复视频设备(第 {attempt} 次)',
- deviceRecovered: '视频设备已恢复',
- deviceRecoveredDesc: '视频设备已成功重连',
pleaseWait: '请稍候...',
- retryCount: '正在重试 (第 {count} 次)',
errorDetails: '错误详情',
},
hid: {
- title: 'HID 控制',
keyboard: '键盘',
- mouse: '鼠标',
- reset: '重置 HID',
- sendCtrlAltDel: '发送 Ctrl+Alt+Del',
- pasteText: '粘贴文本',
- absoluteMouse: '绝对定位',
- relativeMouse: '相对定位',
- deviceLost: 'HID 设备丢失',
- deviceLostDesc: '{backend}: {reason}',
- reconnecting: 'HID 重连中',
- reconnectingDesc: '正在尝试重连(第 {attempt} 次)',
- recovered: 'HID 已恢复',
- recoveredDesc: '{backend} HID 设备已成功重连',
errorHints: {
udcNotConfigured: 'OTG 已就绪,等待被控机连接并完成 USB 枚举',
disabled: 'HID 后端已禁用',
@@ -417,10 +346,6 @@ export default {
audio: {
deviceLost: '音频设备丢失',
deviceLostDesc: '{device}: {reason}',
- reconnecting: '音频重连中',
- reconnectingDesc: '正在尝试重连(第 {attempt} 次)',
- recovered: '音频已恢复',
- recoveredDesc: '音频设备已成功重连',
},
msd: {
title: '虚拟媒体',
@@ -437,8 +362,6 @@ export default {
accessMode: '访问模式',
readOnly: '只读',
readWrite: '读写',
- fileList: '文件列表',
- uploadFile: '上传文件',
createFolder: '新建文件夹',
driveNotInitialized: '虚拟驱动器未初始化',
initializeDrive: '初始化驱动器',
@@ -484,11 +407,8 @@ export default {
settings: {
title: '系统设置',
sidebarSubtitle: '管理设备、网络与扩展',
- basic: '基础',
- general: '通用',
appearance: '外观',
account: '账户',
- access: '访问',
video: '视频',
encoder: '编码器',
hid: 'HID',
@@ -496,38 +416,31 @@ export default {
atx: 'ATX',
environment: '环境',
network: '网络',
- users: '用户',
hardware: '硬件',
system: '系统',
other: '其他',
extensions: '扩展',
- configured: '已配置',
- security: '安全',
about: '关于',
appearanceSubtitle: '自定义界面外观与显示语言',
- accountSubtitle: '管理登录凭据与会话策略',
- networkSubtitle: '配置 Web 服务端口、监听地址与 SSL 证书',
videoSubtitle: '配置采集设备、视频编码器与 WebRTC 信令服务器',
hidSubtitle: '配置 HID 后端、设备、描述符与 USB Gadget 功能',
- msdSubtitle: '管理虚拟存储设备 (MSD) 镜像目录',
atxSubtitle: '配置远程电源控制硬件与网络唤醒',
- environmentSubtitle: '系统级运行环境与 USB 设备维护',
- otherSubtitle: '其他系统硬件控制',
- aboutSubtitle: '在线升级、版本信息与设备硬件概览',
+ environmentSubtitle: '查看设备信息与系统级运行环境',
+ otherSubtitle: '其他系统硬件控制与 USB 设备维护',
+ aboutSubtitle: '在线升级与版本信息',
extTtydSubtitle: '在浏览器中打开本机 Shell 终端',
thirdPartyAccessSubtitle: '集中配置 RustDesk、VNC、RTSP 与 Redfish 外部接入',
extRemoteAccessSubtitle: '通过内网穿透服务实现远程访问',
extFrpcSubtitle: '通过 FRP 客户端实现内网穿透',
watchdog: {
title: '硬件 Watchdog',
- description: 'One-KVM 运行期间自动使用可用的硬件 Watchdog。',
+ description: '硬件 Watchdog 可在系统死机或程序退出时自动触发硬件复位信号',
status: {
running: '运行中',
closed: '已关闭',
unsupported: '不支持',
error: '异常',
},
- safety: '如果 One-KVM 停止喂狗,硬件可能会按照 Watchdog 策略重启系统。',
loadFailed: '无法加载硬件 Watchdog 状态',
toggleFailed: '无法更新硬件 Watchdog',
enableFailed: '无法开启硬件 Watchdog。',
@@ -538,7 +451,6 @@ export default {
disableFailed: '硬件 Watchdog 无法安全停用,将继续喂狗。',
abnormalReason: '硬件 Watchdog 状态异常。',
},
- aboutDesc: '开放轻量的 IP-KVM 解决方案',
deviceInfo: '设备信息',
deviceInfoDesc: '主机系统信息',
hostname: '主机名',
@@ -556,55 +468,31 @@ export default {
newPassword: '新密码',
usernameDesc: '修改控制台登录用户名',
passwordDesc: '修改控制台登录密码',
- version: '版本',
- detectDevices: '探测设备',
- detecting: '探测中...',
- networkSettings: '网络设置',
- msdSettings: 'MSD 设置',
- httpSettings: 'HTTP 设置',
httpPort: 'HTTP 端口',
- configureHttpPort: '配置 HTTP 服务器端口',
- webServer: '访问地址',
- webServerDesc: '配置 HTTP/HTTPS 端口和监听地址,修改后需要重启生效',
httpsPort: 'HTTPS 端口',
bindAddress: '绑定地址',
- bindAddressDesc: '服务器监听的 IP 地址,0.0.0.0 表示监听所有网络接口',
bindMode: '监听地址',
- bindModeDesc: '选择 Web 服务监听哪些地址。',
bindModeAll: '所有地址',
bindModeLocal: '仅本地 (127.0.0.1)',
bindModeCustom: '自定义地址列表',
bindIpv6: '启用 IPv6',
- bindAllDesc: '同时监听 ::(所有 IPv6 地址)。',
- bindLocalDesc: '同时监听 ::1(IPv6 本地回环)。',
bindAddressList: '地址列表',
- bindAddressListDesc: '每行一个 IP(IPv4 或 IPv6)。',
addBindAddress: '添加地址',
bindAddressListEmpty: '请至少填写一个 IP 地址。',
httpsEnabled: '启用 HTTPS',
- httpsEnabledDesc: '使用加密连接对外提供服务,未配置证书时自动生成自签名证书',
portConfig: '端口与协议',
portConfigDesc: '服务一次仅监听一个端口,由 HTTPS 开关决定生效端口',
redfishTitle: 'Redfish',
redfishDesc: 'DMTF Redfish 标准管理接口',
redfishEnabled: '启用 Redfish API',
- redfishEnabledDesc: '开启后可通过 /redfish/v1/ 访问标准 Redfish 管理接口',
redfishEndpoint: 'Redfish 入口',
- copyRedfishUrl: '复制 Redfish 地址',
- openRedfishEndpoint: '打开 Redfish 入口',
- httpPortReserved: 'HTTP 端口(备用)',
- httpsPortReserved: 'HTTPS 端口(备用)',
portActive: '当前生效',
portReserved: '备用',
- portReservedHint: '备用端口仅在切换协议后生效,可提前配置',
previewUrl: '访问地址预览',
copyUrl: '复制访问地址',
openInBrowser: '在浏览器中打开',
listenAddress: '监听地址',
- listenAddressDesc: '配置 Web 服务监听哪些网络接口',
- bindModeAllDesc: '0.0.0.0 — 监听所有网络接口',
- bindModeLocalDesc: '127.0.0.1 — 仅允许本机访问',
- bindModeCustomDesc: '指定一组 IP 地址',
+ listenAddressDesc: '配置 Web 服务监听的网络接口',
effectiveAddresses: '生效监听地址',
sslCertificate: 'SSL 证书',
sslCertificateDesc: '上传自定义 PEM 证书替换自签名证书,保存后需重启服务生效',
@@ -617,8 +505,6 @@ export default {
sslKeyPem: '私钥内容 (.key)',
sslCertPemPlaceholder: '-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----',
sslKeyPemPlaceholder: '-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----',
- sslCertSaved: '证书已保存,重启后生效',
- sslCertCleared: '已恢复自签名证书,重启后生效',
restartRequired: '需要重启',
restartRequiredHint: '保存后将自动重启服务以应用新配置',
unsavedChangesHint: '点击右侧按钮保存当前配置',
@@ -636,7 +522,6 @@ export default {
currentVersion: '当前版本',
latestVersion: '最新版本',
updateStatus: '升级状态',
- updateStatusIdle: '空闲',
releaseNotes: '更新说明',
noUpdates: '当前通道暂无可升级新版本',
updateOverviewLoadFailed: '获取版本更新信息失败',
@@ -658,38 +543,12 @@ export default {
authSettings: '会话策略',
authSettingsDesc: '配置单用户登录与并发会话规则',
allowMultipleSessions: '允许多个 Web 会话并存',
- allowMultipleSessionsDesc: '关闭后,新登录将自动踢出旧会话',
- userManagement: '用户管理',
- userManagementDesc: '管理用户账号和权限',
- addUser: '添加用户',
- editUser: '编辑用户',
- deleteUser: '删除用户',
username: '用户名',
password: '密码',
- role: '角色',
- roleAdmin: '管理员',
- roleUser: '普通用户',
- loadingUsers: '加载用户中...',
- noUsers: '暂无用户',
- create: '创建',
- confirmDeleteUser: '确定要删除用户 "{name}" 吗?',
- msdStatus: 'MSD 状态',
- atxStatus: 'ATX 状态',
- available: '可用',
- notAvailable: '不可用',
- msdEnable: '启用 MSD',
- msdEnableDesc: '启用后可以挂载 ISO 镜像和虚拟驱动器到目标机器',
- msdCh9329Warning: '当前 HID 后端为 CH9329,MSD 功能不可用',
- msdCh9329WarningDesc: 'CH9329 为串口 HID 方案,不支持 USB Gadget 的 MSD 功能',
msdDir: 'MSD 目录',
- msdDirDesc: 'MSD 根目录,内部包含 images/ 和 ventoy/ 两个子目录',
- msdDirHint: '修改后会重建 MSD,控制台容量统计以该目录为准',
- willBeEnabledAfterSave: '保存后生效',
- disabled: '已禁用',
- msdDesc: '虚拟存储设备允许您将 ISO 镜像和虚拟驱动器挂载到目标机器。请在主页面的 MSD 面板中管理镜像。',
- atxDesc: 'ATX 电源控制允许您远程开关机和重启目标机器。请在主页面的 ATX 面板中控制电源。',
atxPowerButton: '电源按钮',
atxResetButton: '重启按钮',
+ atxPowerManagement: '电源管理',
atxDriver: '驱动类型',
atxDriverNone: '禁用',
atxDriverGpio: 'GPIO',
@@ -708,7 +567,6 @@ export default {
atxWolSettingsDesc: '配置 Wake-on-LAN 魔术包发送选项',
atxWolInterface: '网络接口',
atxWolInterfacePlaceholder: '例如: eth0, enp0s3',
- atxWolInterfaceHint: '指定发送 WOL 包的网络接口,留空则使用系统默认路由',
themeDesc: '选择界面颜色方案',
languageDesc: '选择界面显示语言',
featureVisibility: '功能展示',
@@ -721,7 +579,6 @@ export default {
selectDevice: '选择设备...',
videoFormat: '视频格式',
selectFormat: '选择格式...',
- driver: '驱动',
resolution: '分辨率',
frameRate: '帧率',
encoderBackend: '视频编码器',
@@ -730,14 +587,12 @@ export default {
autoRecommended: '自动(推荐)',
software: '软件',
supportedFormats: '支持的编码格式',
- encoderHint: '硬件编码器延迟和 CPU 占用比软件编码低,画质预设更好',
hidSettings: 'HID 设置',
hidSettingsDesc: '按后端、设备、描述符和功能顺序配置',
hidBackend: 'HID 后端',
serialDevice: '串口设备',
baudRate: '波特率',
otgUdc: 'OTG 设备控制器',
- otgUdcDesc: '选择用于 USB Gadget 的 UDC,留空时自动选择',
ch9329Options: 'CH9329 选项',
ch9329OptionsDesc: '配置 CH9329 串口 HID 芯片的运行兼容性',
ch9329HybridMouse: 'Linux 绝对鼠标兼容模式',
@@ -751,29 +606,21 @@ export default {
ch9329DescriptorWarning: '保存会写入 CH9329 参数;需要重新上电或重新插拔后才会变化',
ch9329StringLengthWarning: 'CH9329 字符串最长为 23 字节',
otgHidProfile: 'OTG 功能',
- otgHidProfileDesc: '选择对目标主机暴露的 USB 功能',
- otgFunctionKeyboard: '键盘',
+ otgFunctionKeyboard: '标准键盘',
otgFunctionKeyboardDesc: '标准 HID 键盘设备',
otgKeyboardLeds: '键盘状态灯',
- otgKeyboardLedsDesc: '启用 Caps/Num/Scroll 状态灯回读',
- otgFunctionMouseRelative: '相对鼠标',
- otgFunctionMouseRelativeDesc: '传统鼠标移动(HID 启动鼠标)',
- otgFunctionMouseAbsolute: '绝对鼠标',
- otgFunctionMouseAbsoluteDesc: '绝对定位(类似触控)',
+ otgFunctionMouseRelative: '相对定位鼠标',
+ otgFunctionMouseAbsolute: '绝对定位鼠标',
otgFunctionConsumer: '多媒体键盘',
- otgFunctionConsumerDesc: '音量/播放/暂停等多媒体按键',
otgFunctionMsd: '虚拟媒体(MSD)',
- otgFunctionMsdDesc: '向目标主机暴露 USB 存储',
otgProfileWarning: '保存后 USB 设备会重新连接;若控制器不支持当前组合,将显示失败并恢复原配置',
otgFunctionMinWarning: '请至少启用一个 HID 功能后再保存',
- otgNetwork: 'USB 虚拟网卡',
+ otgNetwork: 'USB 虚拟网卡桥接',
otgRuntimeDegraded: 'OTG 运行时处于降级状态',
- otgNetworkDesc: '桥接到现有上联网卡',
otgNetworkDriver: '目标机驱动模式',
otgNetworkInterface: '桥接网卡',
otgNetworkNone: '无',
otgDescriptor: 'USB 设备描述符',
- otgDescriptorDesc: '配置 USB 设备标识信息',
vendorId: '厂商 ID (VID)',
productId: '产品 ID (PID)',
manufacturer: '制造商',
@@ -789,7 +636,6 @@ export default {
overall: '总体状态',
ok: '正常',
hasIssues: '存在问题',
- summary: '问题统计',
counts: '错误 {errors},警告 {warnings}',
groupCounts: '通过 {ok},警告 {warnings},错误 {errors}',
notRun: '未执行',
@@ -871,7 +717,7 @@ export default {
none: '无',
},
usbDevices: {
- title: 'USB 设备',
+ title: 'USB 设备复位',
desc: '查看已连接的 USB 设备,可通过复位恢复异常设备',
refresh: '刷新',
loadFailed: '加载 USB 设备列表失败',
@@ -886,34 +732,21 @@ export default {
resetAction: '确认复位',
},
webrtcSettings: 'WebRTC 信令',
- webrtcSettingsDesc: '配置 STUN/TURN 服务器以辅助 NAT 穿透',
- publicIceServersHint: '留空将使用 Google 公共 STUN 服务器;TURN 服务器需自行部署',
+ webrtcSettingsDesc: '配置 STUN/TURN 服务器,保存后WebRTC 会话新建立时生效',
stunServer: 'STUN 服务器',
stunServerPlaceholder: 'stun:stun.l.google.com:19302',
- stunServerHint: '留空将使用 Google 公共 STUN 服务器',
turnServer: 'TURN 服务器',
turnServerPlaceholder: 'turn:turn.example.com:3478',
- turnServerHint: 'P2P 连接失败时进行流量中继',
turnUsername: 'TURN 用户名',
turnPassword: 'TURN 密码',
- turnCredentialsHint: '用于 TURN 服务器身份验证的凭据',
- iceConfigNote: '更改后将在下一次 WebRTC 会话建立时生效',
},
virtualKeyboard: {
title: '虚拟键盘',
attach: '固定',
detach: '浮动',
hide: '隐藏',
- show: '显示虚拟键盘',
- layoutSelect: '键盘布局',
- osWindows: 'Windows',
- osMac: 'Mac',
- osAndroid: 'Android',
- mediaKeys: '多媒体键盘',
},
config: {
- applied: '配置已应用',
- applyFailed: '配置应用失败',
loadDevicesFailed: '加载设备列表失败',
updateFailed: '更新失败',
},
@@ -926,9 +759,6 @@ export default {
online: '在线',
offline: '离线',
connecting: '连接中...',
- version: '版本',
- uptime: '运行时间',
- running: '运行中',
format: '格式',
resolution: '分辨率',
fps: '帧率',
@@ -936,10 +766,7 @@ export default {
fpsActual: '实际帧率',
fpsStaticHint: '画面静止时会自动降帧',
paused: '已暂停',
- clients: '客户端',
backend: '后端',
- mouse: '鼠标',
- mouseSupport: '鼠标支持',
currentMode: '当前模式',
absolute: '绝对定位',
relative: '相对定位',
@@ -947,21 +774,14 @@ export default {
networkError: '网络错误',
disconnected: '已断开',
hidUnavailable: 'HID不可用',
- sampleRate: '采样率',
- channels: '声道',
quality: '质量',
streaming: '传输中',
off: '关闭',
defaultDevice: '默认',
- notConnected: '未连接',
connected: '已连接',
- image: '镜像',
msdStatus: '状态',
msdStandby: '空闲',
- msdImageMode: '镜像模式',
msdDriveMode: '虚拟U盘',
- msdMultiMode: '多媒体:{count} 个已挂载',
- msdMountType: '挂载类型',
msdCurrentImage: '当前镜像',
msdNoImage: '无',
},
@@ -977,21 +797,18 @@ export default {
autoStart: '开机自启',
thirdPartyAccess: {
title: '第三方接入',
- desc: '集中配置 RustDesk、VNC 与 RTSP',
},
viewLogs: '查看日志',
noLogs: '暂无日志',
binaryNotFound: '未找到 {path},请先安装对应程序',
remoteAccess: {
title: '远程访问',
- desc: 'GOSTC/FRPC 内网穿透与 Easytier 组网',
},
ttyd: {
title: 'Ttyd 网页终端',
desc: '通过 ttyd 提供网页终端访问',
open: '打开终端',
openInNewTab: '在新标签页打开',
- port: '端口',
shell: 'Shell',
},
gostc: {
@@ -1013,11 +830,10 @@ export default {
peers: '对等节点',
addPeer: '添加节点',
virtualIp: '虚拟 IP',
- virtualIpHint: '留空则自动分配,手动指定需包含网段(如 10.0.0.1/24)',
},
frpc: {
title: 'FRPC 内网穿透',
- desc: '通过 FRP 客户端连接 frps 服务',
+ desc: '通过 FRP 客户端实现内网穿透',
quickConfig: '快速配置',
fullConfig: '完整配置',
fullConfigHint: '可在此粘贴供应商 TOML 配置文件',
@@ -1044,8 +860,7 @@ export default {
},
rustdesk: {
title: 'RustDesk 远程',
- desc: '使用 RustDesk 客户端进行远程访问',
- serverSettings: '服务器设置',
+ desc: '配置 RustDesk 服务,将会锁定所选编码',
rendezvousServer: 'ID 服务器',
rendezvousServerPlaceholder: 'hbbs.example.com:21116',
rendezvousServerRequired: '请填写 RustDesk ID 服务器',
@@ -1053,10 +868,8 @@ export default {
relayServerPlaceholder: 'hbbr.example.com:21117',
relayKey: '中继密钥',
codec: '编码格式',
- codecHint: 'RustDesk 启动前需选择 H.264 或 H.265;运行时会锁定编码,不允许客户端切换。',
deviceInfo: '设备信息',
deviceId: '设备 ID',
- deviceIdHint: '此 ID 用于 RustDesk 客户端连接',
devicePassword: '设备密码',
showPassword: '显示密码',
hidePassword: '隐藏密码',
@@ -1064,8 +877,6 @@ export default {
regeneratePassword: '重新生成密码',
confirmRegenerateId: '确定要重新生成设备 ID 吗?现有客户端需要使用新 ID 重新连接。',
confirmRegeneratePassword: '确定要重新生成设备密码吗?现有客户端需要使用新密码重新连接。',
- serviceStatus: '服务状态',
- rendezvousStatus: '注册状态',
registered: '已注册',
connected: '已连接',
disconnected: '未连接',
@@ -1074,21 +885,16 @@ export default {
notInitialized: '未初始化',
copyId: '复制 ID',
copyPassword: '复制密码',
- copied: '已复制',
keypairGenerated: '密钥对已生成',
- noKeypair: '密钥对未生成',
},
rtsp: {
title: 'RTSP 视频流',
- desc: '配置 RTSP 推流服务(H.264/H.265)',
+ desc: '配置 RTSP 推流服务,将会锁定所选编码',
bind: '监听地址',
- bindHint: '填写 IPv4 或 IPv6 地址;端口请在端口字段配置。',
port: '端口',
path: '流路径',
pathPlaceholder: 'live',
- pathHint: '访问路径,例如 rtsp://设备IP:8554/live',
codec: '编码格式',
- codecHint: 'RTSP 运行时会锁定为所选编码;若 RustDesk 已运行,只能选择相同编码。',
allowOneClient: '仅允许单客户端',
username: '用户名',
usernamePlaceholder: '留空表示无需认证',
@@ -1098,44 +904,31 @@ export default {
},
vnc: {
title: 'VNC 远程',
- desc: '通过 TigerVNC 客户端访问',
+ desc: '配置 VNC 服务,将会锁定所选编码',
bind: '监听地址',
- bindHint: '填写 IPv4 或 IPv6 地址;端口请在端口字段配置。',
port: '端口',
encoding: '视频编码',
encodingTightJpeg: 'Tight JPEG',
encodingH264: 'H.264',
- encodingHint: 'VNC 运行时会锁定编码;H.265 锁定时 VNC 无法启动,MJPEG 锁定时 RTSP 与 RustDesk 无法启动。',
allowOneClient: '仅允许单客户端',
password: '密码',
passwordPlaceholder: '留空表示不修改',
passwordRequiredPlaceholder: '最多 8 个字符',
passwordRequired: '请设置 VNC 密码',
passwordMaxLength: 'VNC 密码最多 8 个字符',
- passwordSaved: '已保存密码;留空不会修改。',
clients: '{count} 个客户端',
urlPreview: 'VNC 地址预览',
},
},
stats: {
title: '连接统计',
- current: '当前状态',
- video: '视频',
- videoDesc: '从服务器到客户端的视频流。',
+ video: '视频信息',
stability: '网络稳定性',
- stabilityDesc: '入站视频数据包在网络中的平稳程度。',
- jitter: '抖动',
delay: '播放延迟',
- delayDesc: '为平滑不均匀到达的帧而由抖动缓冲添加的延迟。',
packetLoss: '丢包',
- packetLossDesc: '入站视频 RTP 数据包的丢失数量。',
total: '个',
frameRate: '帧率',
- frameRateDesc: '每秒显示的入站视频帧数。',
- additional: '其他信息',
- latency: 'ICE 延迟',
bitrate: '码率',
- fps: '帧率',
resolution: '分辨率',
packetsLost: '丢包数',
connection: '连接信息',
@@ -1147,23 +940,9 @@ export default {
relay: 'TURN 中继',
},
help: {
- flashMode: 'Flash 模式将镜像作为 U 盘挂载,支持大多数 BIOS 启动',
- cdromMode: 'CDROM 模式将镜像作为光驱挂载,适用于需要光盘启动的系统',
- readOnlyMode: '只读模式更安全,目标系统无法修改镜像内容',
- readWriteMode: '读写模式允许目标系统写入数据,适用于需要保存配置的场景',
- driveSize: '虚拟驱动器大小。较大的驱动器支持存放更多文件,但初始化时间更长',
- mjpegMode: 'MJPEG 模式兼容性最好,适用于所有浏览器,但延迟较高',
- webrtcMode: 'WebRTC 模式延迟更低,但需要浏览器支持相应编解码器',
videoBitratePreset: '速度优先:最低延迟,适合网络较差的场景;均衡:画质和延迟平衡;质量优先:最佳画质,需要较好的网络带宽',
- encoderBackend: '硬件编码器性能更好功耗更低,软件编码器兼容性更好',
absoluteMode: '绝对定位模式直接映射鼠标坐标,适用于大多数场景',
relativeMode: '相对定位模式发送鼠标移动增量,适用于游戏或特殊软件',
mouseThrottle: '发送间隔控制鼠标事件的发送频率,较大的值可减少网络负载',
- hidBackend: 'OTG 后端需要硬件支持 USB OTG,CH9329 是串口 HID 芯片方案',
- atxActiveLevel: '活跃电平取决于您的硬件接线方式。高电平表示触发时输出高电压,低电平相反',
- wolInterface: '用于发送 Wake-on-LAN 魔术包的网络接口名称,如 eth0 或 br0',
- stunServer: 'STUN 服务器用于 NAT 穿透,帮助建立 P2P 连接。留空使用公共服务器',
- turnServer: 'TURN 服务器在 P2P 连接失败时提供中继。需要更多带宽但连接更可靠',
- audioQuality: '更高的质量意味着更好的音频效果,但需要更多的网络带宽',
},
}
diff --git a/web/src/style.css b/web/src/style.css
index 3e52aeca..cafdb2da 100644
--- a/web/src/style.css
+++ b/web/src/style.css
@@ -21,10 +21,16 @@
--accent-foreground: oklch(20.47% 0.006 285.88);
--destructive: oklch(57.71% 0.215 27.33);
--destructive-foreground: oklch(98.48% 0 0);
+ --success: oklch(52.7% 0.154 150.07);
+ --success-foreground: oklch(98.48% 0 0);
+ --warning: oklch(55.4% 0.135 66.44);
+ --warning-foreground: oklch(98.48% 0 0);
+ --info: oklch(54.6% 0.245 262.88);
+ --info-foreground: oklch(98.48% 0 0);
--border: oklch(91.97% 0.004 286.32);
--input: oklch(91.97% 0.004 286.32);
--ring: oklch(70.9% 0.015 286.07);
- --radius: 0.5rem;
+ --radius: 0.625rem;
--chart-1: oklch(57.42% 0.169 243.35);
--chart-2: oklch(76.95% 0.149 183.61);
--chart-3: oklch(55.75% 0.099 259.21);
@@ -38,11 +44,10 @@
--sidebar-accent-foreground: oklch(20.47% 0.006 285.88);
--sidebar-border: oklch(91.97% 0.004 286.32);
--sidebar-ring: oklch(70.9% 0.015 286.07);
- /* Keyboard button variables - light mode */
- --keyboard-button-bg: white;
- --keyboard-button-color: #1f2937;
- --keyboard-button-border: #e5e7eb;
- --keyboard-button-hover-bg: #f3f4f6;
+ --keyboard-button-bg: var(--background);
+ --keyboard-button-color: var(--foreground);
+ --keyboard-button-border: var(--border);
+ --keyboard-button-hover-bg: var(--accent);
}
.dark {
@@ -62,6 +67,12 @@
--accent-foreground: oklch(98.48% 0 0);
--destructive: oklch(57.71% 0.215 27.33);
--destructive-foreground: oklch(98.48% 0 0);
+ --success: oklch(72.3% 0.219 149.58);
+ --success-foreground: oklch(14.08% 0.004 285.82);
+ --warning: oklch(76.9% 0.188 70.08);
+ --warning-foreground: oklch(14.08% 0.004 285.82);
+ --info: oklch(70.7% 0.165 254.62);
+ --info-foreground: oklch(14.08% 0.004 285.82);
--border: oklch(26.98% 0.005 286.03);
--input: oklch(26.98% 0.005 286.03);
--ring: oklch(83.91% 0.018 227.91);
@@ -98,6 +109,12 @@
--color-accent-foreground: var(--accent-foreground);
--color-destructive: var(--destructive);
--color-destructive-foreground: var(--destructive-foreground);
+ --color-success: var(--success);
+ --color-success-foreground: var(--success-foreground);
+ --color-warning: var(--warning);
+ --color-warning-foreground: var(--warning-foreground);
+ --color-info: var(--info);
+ --color-info-foreground: var(--info-foreground);
--color-border: var(--border);
--color-input: var(--input);
--color-ring: var(--ring);
@@ -114,10 +131,13 @@
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-ring: var(--sidebar-ring);
- --radius-sm: calc(var(--radius) - 4px);
- --radius-md: calc(var(--radius) - 2px);
+ --radius-sm: calc(var(--radius) * 0.6);
+ --radius-md: calc(var(--radius) * 0.8);
--radius-lg: var(--radius);
- --radius-xl: calc(var(--radius) + 4px);
+ --radius-xl: calc(var(--radius) * 1.4);
+ --radius-2xl: calc(var(--radius) * 1.8);
+ --radius-3xl: calc(var(--radius) * 2.2);
+ --radius-4xl: calc(var(--radius) * 2.6);
}
/* Base styles */
diff --git a/web/src/views/ConsoleView.vue b/web/src/views/ConsoleView.vue
index e33b9876..b0bf9c1f 100644
--- a/web/src/views/ConsoleView.vue
+++ b/web/src/views/ConsoleView.vue
@@ -12,6 +12,7 @@ import { useWebRTC } from '@/composables/useWebRTC'
import { useVideoSession } from '@/composables/useVideoSession'
import { useComputerUseSocket, type ComputerUseServerMessage } from '@/composables/useComputerUseSocket'
import { useFeatureVisibility } from '@/composables/useFeatureVisibility'
+import { useTheme } from '@/composables/useTheme'
import { getUnifiedAudio } from '@/composables/useUnifiedAudio'
import { streamApi, hidApi, atxApi, atxConfigApi, authApi, computerUseApi } from '@/api'
import type { ComputerUseScreenshot, ComputerUseSession } from '@/api'
@@ -187,13 +188,12 @@ const changingPassword = ref(false)
const ttydStatus = ref<{ available: boolean; running: boolean } | null>(null)
const showTerminalDialog = ref(false)
const featureVisibility = useFeatureVisibility()
+const { isDark, toggleTheme } = useTheme()
const terminalAvailable = computed(() => ttydStatus.value?.available !== false)
const showTerminal = computed(() => terminalAvailable.value && featureVisibility.value.webTerminal)
const showComputerUse = computed(() => featureVisibility.value.computerUse)
const showPasteText = computed(() => featureVisibility.value.pasteText)
-const isDark = ref(document.documentElement.classList.contains('dark'))
-
const videoStatus = computed<'connected' | 'connecting' | 'disconnected' | 'error'>(() => {
if (wsNetworkError.value) return 'connecting'
@@ -1973,12 +1973,6 @@ async function toggleFullscreen() {
}
}
-function toggleTheme() {
- isDark.value = !isDark.value
- document.documentElement.classList.toggle('dark', isDark.value)
- localStorage.setItem('theme', isDark.value ? 'dark' : 'light')
-}
-
async function logout() {
await authStore.logout()
router.push('/login')
@@ -2657,12 +2651,6 @@ onMounted(async () => {
syncMouseModeFromConfig()
})
- const storedTheme = localStorage.getItem('theme')
- if (storedTheme === 'dark' || (!storedTheme && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
- isDark.value = true
- document.documentElement.classList.add('dark')
- }
-
try {
const modeResp = await streamApi.getMode()
const serverMode = normalizeServerMode(modeResp?.mode)
@@ -2720,7 +2708,7 @@ onUnmounted(() => {
- {{ t('settings.portReservedHint') }}
-
{{ t('settings.previewUrl') }}
@@ -3857,7 +3812,7 @@ watch(isWindows, () => {
:aria-label="t('settings.copyUrl')"
@click="copyPreviewUrl"
>
-
+
{
-
-
- {{ t('settings.restartRequiredHint') }}
+
+
+ {{ t('settings.restartRequiredHint') }}
@@ -3898,7 +3853,6 @@ watch(isWindows, () => {
-
{{ t('settings.bindModeAllDesc') }}
@@ -3915,7 +3869,6 @@ watch(isWindows, () => {
-
{{ t('settings.bindModeLocalDesc') }}
@@ -3932,7 +3885,6 @@ watch(isWindows, () => {
-
{{ t('settings.bindModeCustomDesc') }}
@@ -3958,9 +3910,9 @@ watch(isWindows, () => {
-
-
- {{ t('settings.restartRequiredHint') }}
+
+
+ {{ t('settings.restartRequiredHint') }}
@@ -3983,14 +3935,10 @@ watch(isWindows, () => {
-
-
-
- {{ t('settings.sslCertActive') }}
-
+
+
+
+ {{ t('settings.sslCertActive') }}
{
{{ autoRestarting ? t('settings.restarting') : t('settings.sslCertClear') }}
-
+
+
@@ -4030,9 +3979,9 @@ watch(isWindows, () => {
-
-
- {{ t('settings.restartRequiredHint') }}
+
+
+ {{ t('settings.restartRequiredHint') }}
{
-
+
+ {{ t('settings.atxPowerManagement') }}
+
+
-
+
@@ -4067,27 +4020,26 @@ watch(isWindows, () => {
-
+
+
-
+
@@ -4099,10 +4051,10 @@ watch(isWindows, () => {
-
+
+ {{ t('settings.atxDriverNone') }}
+ {{ dev }}
+
@@ -4110,10 +4062,10 @@ watch(isWindows, () => {
-
+
@@ -4123,10 +4075,10 @@ watch(isWindows, () => {
-
+
+ {{ t('settings.atxDriverNone') }}
+ {{ dev }}
+
@@ -4134,10 +4086,10 @@ watch(isWindows, () => {
-
+
@@ -4147,10 +4099,10 @@ watch(isWindows, () => {
-
+
+ {{ t('settings.atxDriverNone') }}
+ {{ dev }}
+
@@ -4158,10 +4110,10 @@ watch(isWindows, () => {
-
+
@@ -4171,10 +4123,10 @@ watch(isWindows, () => {
-
+
+ {{ t('settings.atxDriverNone') }}
+ {{ dev }}
+
@@ -4182,10 +4134,10 @@ watch(isWindows, () => {
-
+
@@ -4213,12 +4165,12 @@ watch(isWindows, () => {
+
+
+ {{ atxSaving ? t('actionbar.applying') : atxSaved ? t('common.success') : t('common.save') }}
+
+
-
-
- {{ atxSaving ? t('actionbar.applying') : atxSaved ? t('common.success') : t('common.save') }}
-
-
@@ -4234,15 +4186,14 @@ watch(isWindows, () => {
v-model="atxConfig.wol_interface"
:placeholder="t('settings.atxWolInterfacePlaceholder')"
/>
- {{ t('settings.atxWolInterfaceHint') }}
+
+
+ {{ wolSaving ? t('actionbar.applying') : wolSaved ? t('common.success') : t('common.save') }}
+
+
-
-
- {{ wolSaving ? t('actionbar.applying') : wolSaved ? t('common.success') : t('common.save') }}
-
-
@@ -4315,27 +4266,25 @@ watch(isWindows, () => {
-
-
- {{ t('extensions.viewLogs') }}
-
-
+
open && refreshExtensionLogs('ttyd')">
+ {{ t('extensions.viewLogs') }}
+
{{ (extensionLogs.ttyd || []).join('\n') || t('extensions.noLogs') }}
{{ t('common.refresh') }}
-
+
+
+
+
+ {{ loading ? t('actionbar.applying') : saved ? t('common.success') : t('common.save') }}
+
+
-
-
-
- {{ loading ? t('actionbar.applying') : saved ? t('common.success') : t('common.save') }}
-
-
@@ -4415,27 +4364,25 @@ watch(isWindows, () => {
-
-
- {{ t('extensions.viewLogs') }}
-
-
+
open && refreshExtensionLogs('gostc')">
+ {{ t('extensions.viewLogs') }}
+
{{ (extensionLogs.gostc || []).join('\n') || t('extensions.noLogs') }}
{{ t('common.refresh') }}
-
+
+
+
+
+ {{ loading ? t('actionbar.applying') : saved ? t('common.success') : t('common.save') }}
+
+
-
-
-
- {{ loading ? t('actionbar.applying') : saved ? t('common.success') : t('common.save') }}
-
-
@@ -4519,33 +4466,30 @@ watch(isWindows, () => {
-
-
- {{ t('extensions.viewLogs') }}
-
-
+
open && refreshExtensionLogs('easytier')">
+ {{ t('extensions.viewLogs') }}
+
{{ (extensionLogs.easytier || []).join('\n') || t('extensions.noLogs') }}
{{ t('common.refresh') }}
-
+
+
+
+
+ {{ loading ? t('actionbar.applying') : saved ? t('common.success') : t('common.save') }}
+
+
-
-
-
- {{ loading ? t('actionbar.applying') : saved ? t('common.success') : t('common.save') }}
-
-
@@ -4597,30 +4541,24 @@ watch(isWindows, () => {
-
-
+
{{ t('extensions.frpc.quickConfig') }}
-
-
+
{{ t('extensions.frpc.fullConfig') }}
-
-
+
+
@@ -4703,26 +4641,25 @@ watch(isWindows, () => {
-
-
- {{ t('extensions.viewLogs') }}
-
-
+
open && refreshExtensionLogs('frpc')">
+ {{ t('extensions.viewLogs') }}
+
{{ (extensionLogs.frpc || []).join('\n') || t('extensions.noLogs') }}
{{ t('common.refresh') }}
-
+
+
+
+
+ {{ loading ? t('actionbar.applying') : saved ? t('common.success') : t('common.save') }}
+
+
-
-
- {{ loading ? t('actionbar.applying') : saved ? t('common.success') : t('common.save') }}
-
-
@@ -4783,7 +4720,6 @@ watch(isWindows, () => {
@@ -4794,17 +4730,15 @@ watch(isWindows, () => {
-
-
{{ t('extensions.rtsp.codecHint') }}
+
@@ -4825,33 +4759,33 @@ watch(isWindows, () => {
:placeholder="t('extensions.rtsp.passwordPlaceholder')"
:disabled="rtspStatus?.service_status === 'running'"
/>
-
-
+
-
-
-
-
{{ t('extensions.rtsp.urlPreview') }}
-
{{ rtspStreamUrl }}
-
+
+
+ {{ t('extensions.rtsp.urlPreview') }}
+ {{ rtspStreamUrl }}
+
+
+ {{ loading ? t('actionbar.applying') : saved ? t('common.success') : t('common.save') }}
+
+
-
-
- {{ loading ? t('actionbar.applying') : saved ? t('common.success') : t('common.save') }}
-
-
@@ -4916,7 +4850,6 @@ watch(isWindows, () => {
@@ -4926,11 +4859,10 @@ watch(isWindows, () => {
-
-
{{ t('extensions.vnc.encodingHint') }}
+
@@ -4949,34 +4881,33 @@ watch(isWindows, () => {
:placeholder="vncStatus?.config.has_password ? t('extensions.vnc.passwordPlaceholder') : t('extensions.vnc.passwordRequiredPlaceholder')"
:disabled="vncStatus?.service_status === 'running'"
/>
-
-
+
-
{{ t('extensions.vnc.passwordSaved') }}
-
-
-
-
{{ t('extensions.vnc.urlPreview') }}
-
{{ vncStreamUrl }}
-
+
+
+ {{ t('extensions.vnc.urlPreview') }}
+ {{ vncStreamUrl }}
+
+
+ {{ loading ? t('actionbar.applying') : saved ? t('common.success') : t('common.save') }}
+
+
-
-
- {{ loading ? t('actionbar.applying') : saved ? t('common.success') : t('common.save') }}
-
-
@@ -5043,11 +4974,10 @@ watch(isWindows, () => {
-
-
{{ t('extensions.rustdesk.codecHint') }}
+
@@ -5084,15 +5014,17 @@ watch(isWindows, () => {
spellcheck="false"
class="font-mono"
/>
-
-
+
@@ -5116,7 +5048,7 @@ watch(isWindows, () => {
@click="copyToClipboard(rustdeskConfig?.device_id || '', 'id')"
:disabled="!rustdeskConfig?.device_id"
>
-
+
@@ -5139,7 +5071,7 @@ watch(isWindows, () => {
@click="copyToClipboard(rustdeskPassword?.device_password || '', 'password')"
:disabled="!rustdeskPassword?.device_password"
>
-
+
@@ -5160,13 +5092,12 @@ watch(isWindows, () => {
+
+
+ {{ loading ? t('actionbar.applying') : saved ? t('common.success') : t('common.save') }}
+
+
-
-
-
- {{ loading ? t('actionbar.applying') : saved ? t('common.success') : t('common.save') }}
-
-
@@ -5192,37 +5123,26 @@ watch(isWindows, () => {
-
+
+
+ {{ t('settings.httpsManualRedirectTitle') }}
+ {{ t('settings.httpsManualRedirectDesc') }}
+
+ {{ autoRestartManualUrl }}
+
+
-
-
{{ t('settings.autoRestartFailed') }}
-
+
+
+
+ {{ t('settings.autoRestartFailed') }}
+
{{ t('common.retry') }}
-
+
+
@@ -5231,40 +5151,18 @@ watch(isWindows, () => {
-
-
-
{{ t('settings.redfishEnabledDesc') }}
-
+
{{ t('settings.redfishEndpoint') }}
-
- {{ redfishAccessUrl }}
-
-
-
-
-
-
-
-
+
{{ redfishAccessUrl }}
-
-
- {{ t('settings.restartRequiredHint') }}
+
+
+ {{ t('settings.restartRequiredHint') }}
@@ -5310,10 +5208,10 @@ watch(isWindows, () => {
-
+
@@ -5362,58 +5260,21 @@ watch(isWindows, () => {
-
-
-
- {{ t('settings.deviceInfo') }}
- {{ t('settings.deviceInfoDesc') }}
-
-
-
-
- {{ t('settings.hostname') }}
- {{ systemStore.deviceInfo.hostname }}
-
-
- {{ t('settings.cpuModel') }}
- {{ systemStore.deviceInfo.cpu_model }}
-
-
- {{ t('settings.cpuUsage') }}
- {{ systemStore.deviceInfo.cpu_usage.toFixed(1) }}%
-
-
- {{ t('settings.memoryUsage') }}
- {{ formatBytes(systemStore.deviceInfo.memory_used) }} / {{ formatBytes(systemStore.deviceInfo.memory_total) }}
-
-
-
{{ t('settings.networkAddresses') }}
-
-
- {{ addr.interface }}
- {{ addr.ip }}
-
-
-
-
-
-
-
@2025-2026 SilentWind
-
+
{{ t('settings.otgFunctionMinWarning') }}
-
+
{{ t('settings.ch9329StringLengthWarning') }}
-
+
{{ t('settings.ch9329DescriptorLoading') }}
@@ -5426,8 +5287,8 @@ watch(isWindows, () => {
-
-
+
+
diff --git a/web/src/views/SetupView.vue b/web/src/views/SetupView.vue
index 07aac537..1074a951 100644
--- a/web/src/views/SetupView.vue
+++ b/web/src/views/SetupView.vue
@@ -25,6 +25,9 @@ import {
HoverCardTrigger,
} from '@/components/ui/hover-card'
import { Switch } from '@/components/ui/switch'
+import { Stepper, StepperItem, StepperSeparator, StepperTitle, StepperTrigger } from '@/components/ui/stepper'
+import { Alert, AlertDescription } from '@/components/ui/alert'
+import { NativeSelect, NativeSelectOption } from '@/components/ui/native-select'
import {
Eye,
EyeOff,
@@ -37,6 +40,7 @@ import {
HelpCircle,
Puzzle,
RefreshCw,
+ AlertTriangle,
} from 'lucide-vue-next'
const { t } = useI18n()
@@ -157,7 +161,7 @@ const passwordStrengthText = computed(() => {
})
const passwordStrengthColor = computed(() => {
- const colors = ['bg-muted', 'bg-red-500', 'bg-orange-500', 'bg-yellow-500', 'bg-green-500']
+ const colors = ['bg-muted', 'bg-destructive', 'bg-warning', 'bg-warning', 'bg-success']
return colors[passwordStrength.value] || colors[0]
})
@@ -552,37 +556,36 @@ const stepIcons = [User, Video, Keyboard, Puzzle]
{{ t('setup.progress', { current: step, total: totalSteps }) }}
-
-
-
-
-
-
-
-
-
- {{ stepLabels[i - 1] }}
-
-
-
+
+
-
-
+
+
+
+
+
+
+
+ {{ stepLabels[i - 1] }}
+
+
+
@@ -629,15 +632,17 @@ const stepIcons = [User, Video, Keyboard, Puzzle]
@blur="validatePassword"
@input="passwordTouched && validatePassword()"
/>
-
-
+
{{ passwordError }}
@@ -684,92 +689,79 @@ const stepIcons = [User, Video, Keyboard, Puzzle]
-
+
-
+
{{ t('setup.videoDeviceHelp') }}
-
+
+
-
+
+
+
{{ t('setup.noSignalDetected') }}
{{ t('setup.refreshDevices') }}
-
+
+
-
+
-
+
{{ t('setup.videoFormatHelp') }}
-
+
+
-
+
+
-
+
+
@@ -783,27 +775,20 @@ const stepIcons = [User, Video, Keyboard, Puzzle]
-
+
-
+
{{ t('setup.audioDeviceHelp') }}
-
+
+ {{ t('setup.selectAudioDevice') }}
+ {{ t('setup.noAudio') }}
+ {{ dev.description }}{{ dev.is_hdmi ? ' (HDMI)' : '' }}
+
{{ t('setup.noAudioDevices') }}
@@ -811,9 +796,10 @@ const stepIcons = [User, Video, Keyboard, Puzzle]
-
@@ -824,7 +810,7 @@ const stepIcons = [User, Video, Keyboard, Puzzle]
class="h-4 w-4 transition-transform duration-200"
:class="{ 'rotate-90': showAdvancedEncoder }"
/>
-
+
{{ t('setup.encoderHint') }}
@@ -873,16 +859,12 @@ const stepIcons = [User, Video, Keyboard, Puzzle]
-
+
+
{{ t('setup.noSerialDevices') }}
@@ -890,7 +872,7 @@ const stepIcons = [User, Video, Keyboard, Puzzle]
-