diff --git a/tools/server/webui/package-lock.json b/tools/server/webui/package-lock.json
index a11b87ad50..fa05b6f5c1 100644
--- a/tools/server/webui/package-lock.json
+++ b/tools/server/webui/package-lock.json
@@ -25,8 +25,8 @@
"@chromatic-com/storybook": "^4.1.2",
"@eslint/compat": "^1.2.5",
"@eslint/js": "^9.18.0",
- "@internationalized/date": "^3.8.2",
- "@lucide/svelte": "^0.515.0",
+ "@internationalized/date": "^3.10.1",
+ "@lucide/svelte": "^0.561.0",
"@playwright/test": "^1.49.1",
"@storybook/addon-a11y": "^10.0.7",
"@storybook/addon-docs": "^10.0.7",
@@ -41,7 +41,7 @@
"@tailwindcss/vite": "^4.0.0",
"@types/node": "^22",
"@vitest/browser": "^3.2.3",
- "bits-ui": "^2.8.11",
+ "bits-ui": "^2.14.4",
"clsx": "^2.1.1",
"dexie": "^4.0.11",
"eslint": "^9.18.0",
@@ -862,9 +862,9 @@
}
},
"node_modules/@internationalized/date": {
- "version": "3.8.2",
- "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.8.2.tgz",
- "integrity": "sha512-/wENk7CbvLbkUvX1tu0mwq49CVkkWpkXubGel6birjRPyo6uQ4nQpnq5xZu823zRCwwn82zgHrvgF1vZyvmVgA==",
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.10.1.tgz",
+ "integrity": "sha512-oJrXtQiAXLvT9clCf1K4kxp3eKsQhIaZqxEyowkBcsvZDdZkbWrVmnGknxs5flTD0VGsxrxKgBCZty1EzoiMzA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -931,9 +931,9 @@
}
},
"node_modules/@lucide/svelte": {
- "version": "0.515.0",
- "resolved": "https://registry.npmjs.org/@lucide/svelte/-/svelte-0.515.0.tgz",
- "integrity": "sha512-CEAyqcZmNBfYzVgaRmK2RFJP5tnbXxekRyDk0XX/eZQRfsJmkDvmQwXNX8C869BgNeryzmrRyjHhUL6g9ZOHNA==",
+ "version": "0.561.0",
+ "resolved": "https://registry.npmjs.org/@lucide/svelte/-/svelte-0.561.0.tgz",
+ "integrity": "sha512-vofKV2UFVrKE6I4ewKJ3dfCXSV6iP6nWVmiM83MLjsU91EeJcEg7LoWUABLp/aOTxj1HQNbJD1f3g3L0JQgH9A==",
"dev": true,
"license": "ISC",
"peerDependencies": {
@@ -3343,17 +3343,17 @@
}
},
"node_modules/bits-ui": {
- "version": "2.8.11",
- "resolved": "https://registry.npmjs.org/bits-ui/-/bits-ui-2.8.11.tgz",
- "integrity": "sha512-lKN9rAk69my6j7H1D4B87r8LrHuEtfEsf1xCixBj9yViql2BdI3f04HyyyT7T1GOCpgb9+8b0B+nm3LN81Konw==",
+ "version": "2.14.4",
+ "resolved": "https://registry.npmjs.org/bits-ui/-/bits-ui-2.14.4.tgz",
+ "integrity": "sha512-W6kenhnbd/YVvur+DKkaVJ6GldE53eLewur5AhUCqslYQ0vjZr8eWlOfwZnMiPB+PF5HMVqf61vXBvmyrAmPWg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@floating-ui/core": "^1.7.1",
"@floating-ui/dom": "^1.7.1",
"esm-env": "^1.1.2",
- "runed": "^0.29.1",
- "svelte-toolbelt": "^0.9.3",
+ "runed": "^0.35.1",
+ "svelte-toolbelt": "^0.10.6",
"tabbable": "^6.2.0"
},
"engines": {
@@ -3368,9 +3368,9 @@
}
},
"node_modules/bits-ui/node_modules/runed": {
- "version": "0.29.2",
- "resolved": "https://registry.npmjs.org/runed/-/runed-0.29.2.tgz",
- "integrity": "sha512-0cq6cA6sYGZwl/FvVqjx9YN+1xEBu9sDDyuWdDW1yWX7JF2wmvmVKfH+hVCZs+csW+P3ARH92MjI3H9QTagOQA==",
+ "version": "0.35.1",
+ "resolved": "https://registry.npmjs.org/runed/-/runed-0.35.1.tgz",
+ "integrity": "sha512-2F4Q/FZzbeJTFdIS/PuOoPRSm92sA2LhzTnv6FXhCoENb3huf5+fDuNOg1LNvGOouy3u/225qxmuJvcV3IZK5Q==",
"dev": true,
"funding": [
"https://github.com/sponsors/huntabyte",
@@ -3378,23 +3378,31 @@
],
"license": "MIT",
"dependencies": {
- "esm-env": "^1.0.0"
+ "dequal": "^2.0.3",
+ "esm-env": "^1.0.0",
+ "lz-string": "^1.5.0"
},
"peerDependencies": {
+ "@sveltejs/kit": "^2.21.0",
"svelte": "^5.7.0"
+ },
+ "peerDependenciesMeta": {
+ "@sveltejs/kit": {
+ "optional": true
+ }
}
},
"node_modules/bits-ui/node_modules/svelte-toolbelt": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/svelte-toolbelt/-/svelte-toolbelt-0.9.3.tgz",
- "integrity": "sha512-HCSWxCtVmv+c6g1ACb8LTwHVbDqLKJvHpo6J8TaqwUme2hj9ATJCpjCPNISR1OCq2Q4U1KT41if9ON0isINQZw==",
+ "version": "0.10.6",
+ "resolved": "https://registry.npmjs.org/svelte-toolbelt/-/svelte-toolbelt-0.10.6.tgz",
+ "integrity": "sha512-YWuX+RE+CnWYx09yseAe4ZVMM7e7GRFZM6OYWpBKOb++s+SQ8RBIMMe+Bs/CznBMc0QPLjr+vDBxTAkozXsFXQ==",
"dev": true,
"funding": [
"https://github.com/sponsors/huntabyte"
],
"dependencies": {
"clsx": "^2.1.1",
- "runed": "^0.29.0",
+ "runed": "^0.35.1",
"style-to-object": "^1.0.8"
},
"engines": {
diff --git a/tools/server/webui/package.json b/tools/server/webui/package.json
index 8b88f691a4..e1c8d95137 100644
--- a/tools/server/webui/package.json
+++ b/tools/server/webui/package.json
@@ -27,8 +27,8 @@
"@chromatic-com/storybook": "^4.1.2",
"@eslint/compat": "^1.2.5",
"@eslint/js": "^9.18.0",
- "@internationalized/date": "^3.8.2",
- "@lucide/svelte": "^0.515.0",
+ "@internationalized/date": "^3.10.1",
+ "@lucide/svelte": "^0.561.0",
"@playwright/test": "^1.49.1",
"@storybook/addon-a11y": "^10.0.7",
"@storybook/addon-docs": "^10.0.7",
@@ -43,7 +43,7 @@
"@tailwindcss/vite": "^4.0.0",
"@types/node": "^22",
"@vitest/browser": "^3.2.3",
- "bits-ui": "^2.8.11",
+ "bits-ui": "^2.14.4",
"clsx": "^2.1.1",
"dexie": "^4.0.11",
"eslint": "^9.18.0",
diff --git a/tools/server/webui/src/lib/components/ui/command/command-dialog.svelte b/tools/server/webui/src/lib/components/ui/command/command-dialog.svelte
new file mode 100644
index 0000000000..98852c5261
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/command/command-dialog.svelte
@@ -0,0 +1,40 @@
+
+
+
+
+ {title}
+ {description}
+
+
+
+
+
diff --git a/tools/server/webui/src/lib/components/ui/command/command-empty.svelte b/tools/server/webui/src/lib/components/ui/command/command-empty.svelte
new file mode 100644
index 0000000000..903287e075
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/command/command-empty.svelte
@@ -0,0 +1,17 @@
+
+
+
diff --git a/tools/server/webui/src/lib/components/ui/command/command-group.svelte b/tools/server/webui/src/lib/components/ui/command/command-group.svelte
new file mode 100644
index 0000000000..3805a68839
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/command/command-group.svelte
@@ -0,0 +1,30 @@
+
+
+
+ {#if heading}
+
+ {heading}
+
+ {/if}
+
+
diff --git a/tools/server/webui/src/lib/components/ui/command/command-input.svelte b/tools/server/webui/src/lib/components/ui/command/command-input.svelte
new file mode 100644
index 0000000000..81fcde0098
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/command/command-input.svelte
@@ -0,0 +1,26 @@
+
+
+
+
+
+
diff --git a/tools/server/webui/src/lib/components/ui/command/command-item.svelte b/tools/server/webui/src/lib/components/ui/command/command-item.svelte
new file mode 100644
index 0000000000..f58c9d3de9
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/command/command-item.svelte
@@ -0,0 +1,20 @@
+
+
+
diff --git a/tools/server/webui/src/lib/components/ui/command/command-link-item.svelte b/tools/server/webui/src/lib/components/ui/command/command-link-item.svelte
new file mode 100644
index 0000000000..649a34e231
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/command/command-link-item.svelte
@@ -0,0 +1,20 @@
+
+
+
diff --git a/tools/server/webui/src/lib/components/ui/command/command-list.svelte b/tools/server/webui/src/lib/components/ui/command/command-list.svelte
new file mode 100644
index 0000000000..8acdcf8409
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/command/command-list.svelte
@@ -0,0 +1,17 @@
+
+
+
diff --git a/tools/server/webui/src/lib/components/ui/command/command-loading.svelte b/tools/server/webui/src/lib/components/ui/command/command-loading.svelte
new file mode 100644
index 0000000000..0aaf5c3904
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/command/command-loading.svelte
@@ -0,0 +1,7 @@
+
+
+
diff --git a/tools/server/webui/src/lib/components/ui/command/command-separator.svelte b/tools/server/webui/src/lib/components/ui/command/command-separator.svelte
new file mode 100644
index 0000000000..57a7927566
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/command/command-separator.svelte
@@ -0,0 +1,17 @@
+
+
+
diff --git a/tools/server/webui/src/lib/components/ui/command/command-shortcut.svelte b/tools/server/webui/src/lib/components/ui/command/command-shortcut.svelte
new file mode 100644
index 0000000000..c10f7fc21d
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/command/command-shortcut.svelte
@@ -0,0 +1,20 @@
+
+
+
+ {@render children?.()}
+
diff --git a/tools/server/webui/src/lib/components/ui/command/command.svelte b/tools/server/webui/src/lib/components/ui/command/command.svelte
new file mode 100644
index 0000000000..3643c5aea1
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/command/command.svelte
@@ -0,0 +1,28 @@
+
+
+
diff --git a/tools/server/webui/src/lib/components/ui/command/index.ts b/tools/server/webui/src/lib/components/ui/command/index.ts
new file mode 100644
index 0000000000..d0c947618e
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/command/index.ts
@@ -0,0 +1,37 @@
+import Root from './command.svelte';
+import Loading from './command-loading.svelte';
+import Dialog from './command-dialog.svelte';
+import Empty from './command-empty.svelte';
+import Group from './command-group.svelte';
+import Item from './command-item.svelte';
+import Input from './command-input.svelte';
+import List from './command-list.svelte';
+import Separator from './command-separator.svelte';
+import Shortcut from './command-shortcut.svelte';
+import LinkItem from './command-link-item.svelte';
+
+export {
+ Root,
+ Dialog,
+ Empty,
+ Group,
+ Item,
+ LinkItem,
+ Input,
+ List,
+ Separator,
+ Shortcut,
+ Loading,
+ //
+ Root as Command,
+ Dialog as CommandDialog,
+ Empty as CommandEmpty,
+ Group as CommandGroup,
+ Item as CommandItem,
+ LinkItem as CommandLinkItem,
+ Input as CommandInput,
+ List as CommandList,
+ Separator as CommandSeparator,
+ Shortcut as CommandShortcut,
+ Loading as CommandLoading
+};
diff --git a/tools/server/webui/src/lib/components/ui/popover/index.ts b/tools/server/webui/src/lib/components/ui/popover/index.ts
new file mode 100644
index 0000000000..c5937fb3a0
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/popover/index.ts
@@ -0,0 +1,19 @@
+import Root from './popover.svelte';
+import Close from './popover-close.svelte';
+import Content from './popover-content.svelte';
+import Trigger from './popover-trigger.svelte';
+import Portal from './popover-portal.svelte';
+
+export {
+ Root,
+ Content,
+ Trigger,
+ Close,
+ Portal,
+ //
+ Root as Popover,
+ Content as PopoverContent,
+ Trigger as PopoverTrigger,
+ Close as PopoverClose,
+ Portal as PopoverPortal
+};
diff --git a/tools/server/webui/src/lib/components/ui/popover/popover-close.svelte b/tools/server/webui/src/lib/components/ui/popover/popover-close.svelte
new file mode 100644
index 0000000000..dc4dec4b33
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/popover/popover-close.svelte
@@ -0,0 +1,7 @@
+
+
+
diff --git a/tools/server/webui/src/lib/components/ui/popover/popover-content.svelte b/tools/server/webui/src/lib/components/ui/popover/popover-content.svelte
new file mode 100644
index 0000000000..e59caa2757
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/popover/popover-content.svelte
@@ -0,0 +1,31 @@
+
+
+
+
+
diff --git a/tools/server/webui/src/lib/components/ui/popover/popover-portal.svelte b/tools/server/webui/src/lib/components/ui/popover/popover-portal.svelte
new file mode 100644
index 0000000000..25efb877b7
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/popover/popover-portal.svelte
@@ -0,0 +1,7 @@
+
+
+
diff --git a/tools/server/webui/src/lib/components/ui/popover/popover-trigger.svelte b/tools/server/webui/src/lib/components/ui/popover/popover-trigger.svelte
new file mode 100644
index 0000000000..5ef3d0e932
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/popover/popover-trigger.svelte
@@ -0,0 +1,17 @@
+
+
+
diff --git a/tools/server/webui/src/lib/components/ui/popover/popover.svelte b/tools/server/webui/src/lib/components/ui/popover/popover.svelte
new file mode 100644
index 0000000000..f39b867a69
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/popover/popover.svelte
@@ -0,0 +1,7 @@
+
+
+