diff --git a/Cargo.lock b/Cargo.lock
index a3b034d..dd21e77 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3903,9 +3903,9 @@ dependencies = [
[[package]]
name = "toml"
-version = "1.1.3+spec-1.1.0"
+version = "1.1.4+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53c96ecdfa941c8fc4fcaed14f99ada8ebed502eef533015095a07e3301d4c3c"
+checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5"
dependencies = [
"indexmap",
"serde_core",
@@ -3939,9 +3939,9 @@ dependencies = [
[[package]]
name = "toml_parser"
-version = "1.1.2+spec-1.1.0"
+version = "1.1.3+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526"
+checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56"
dependencies = [
"winnow",
]
@@ -4228,12 +4228,11 @@ dependencies = [
[[package]]
name = "validator"
-version = "0.20.0"
+version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43fb22e1a008ece370ce08a3e9e4447a910e92621bb49b85d6e48a45397e7cfa"
+checksum = "c3d68c6633c483df6780cc5277a417c7c2d1bceee2649d06c8ab6b0fd2dd3c81"
dependencies = [
"idna",
- "once_cell",
"regex",
"serde",
"serde_derive",
diff --git a/Cargo.toml b/Cargo.toml
index 892fa87..dd856ea 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -21,7 +21,7 @@ event_bus = { path = "event_bus" }
parking_lot = "0.12.5"
serde = "1.0.229"
serde_json = "1.0.151"
-toml = "1.1.3"
+toml = "1.1.4"
uuid = { version = "1.24.0", features = ["v4", "v7", "fast-rng", "serde"] }
tracing = "0.1.44"
tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt", "time"] }
@@ -35,7 +35,7 @@ jsonwebtoken = { version = "11.0.0", features = ["aws_lc_rs"] }
tower = { version = "0.5", features = ["util"] }
tower-http = { version = "0.7.0", features = ["catch-panic", "cors", "trace"] }
chrono = "0.4.45"
-validator = { version = "0.20.0", features = ["derive"] }
+validator = { version = "0.21.0", features = ["derive"] }
async-trait = "0.1.91"
anyhow = "1.0.104"
futures-util = "0.3"
diff --git a/frontend/src/components/ContextMenu.vue b/frontend/src/components/ContextMenu.vue
new file mode 100644
index 0000000..630006e
--- /dev/null
+++ b/frontend/src/components/ContextMenu.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/composables/useContextMenu.ts b/frontend/src/composables/useContextMenu.ts
new file mode 100644
index 0000000..dd32b79
--- /dev/null
+++ b/frontend/src/composables/useContextMenu.ts
@@ -0,0 +1,36 @@
+import {ref} from 'vue'
+
+export interface MenuItem {
+ label: string
+ icon?: string
+ color?: string
+ disabled?: boolean
+ action: () => void
+}
+
+const isOpen = ref(false)
+const position = ref({x: 0, y: 0})
+const items = ref