diff --git a/frontend/src/components/common/CommandPalette.vue b/frontend/src/components/common/CommandPalette.vue
index b26b165..11f051e 100644
--- a/frontend/src/components/common/CommandPalette.vue
+++ b/frontend/src/components/common/CommandPalette.vue
@@ -117,6 +117,8 @@ const sessionStore = useSessionStore();
const emit = defineEmits<{
(e: "open-import"): void;
+ (e: "open-settings"): void;
+ (e: "open-new-connection", protocol?: "ssh" | "rdp"): void;
}>();
const actions: PaletteAction[] = [
@@ -125,7 +127,7 @@ const actions: PaletteAction[] = [
label: "New SSH Connection",
icon: ``,
handler: () => {
- // TODO: Open new connection dialog for SSH
+ emit("open-new-connection", "ssh");
close();
},
},
@@ -134,7 +136,7 @@ const actions: PaletteAction[] = [
label: "New RDP Connection",
icon: ``,
handler: () => {
- // TODO: Open new connection dialog for RDP
+ emit("open-new-connection", "rdp");
close();
},
},
@@ -152,7 +154,7 @@ const actions: PaletteAction[] = [
label: "Settings",
icon: ``,
handler: () => {
- // TODO: Open settings dialog
+ emit("open-settings");
close();
},
},
diff --git a/frontend/src/components/common/SettingsModal.vue b/frontend/src/components/common/SettingsModal.vue
new file mode 100644
index 0000000..84c6eb4
--- /dev/null
+++ b/frontend/src/components/common/SettingsModal.vue
@@ -0,0 +1,314 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ General
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Terminal
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Vault
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ About
+
+
+
+
WRAITH
+
Connection Manager
+
+
+
+
+ Version
+ 0.1.0-dev
+
+
+
+ License
+ Proprietary
+
+
+ Runtime
+ Wails v2
+
+
+ Frontend
+ Vue 3 + TypeScript
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/layouts/MainLayout.vue b/frontend/src/layouts/MainLayout.vue
index 837ad6c..2182720 100644
--- a/frontend/src/layouts/MainLayout.vue
+++ b/frontend/src/layouts/MainLayout.vue
@@ -5,9 +5,60 @@
class="h-10 flex items-center justify-between px-4 bg-[var(--wraith-bg-secondary)] border-b border-[var(--wraith-border)] shrink-0"
style="--wails-draggable: drag"
>
-
- WRAITH
-
+
+
+ WRAITH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -60,6 +111,7 @@
@@ -137,13 +189,24 @@
-
+
+
+
+
+
+
+
@@ -164,6 +227,8 @@ import EditorWindow from "@/components/editor/EditorWindow.vue";
import CommandPalette from "@/components/common/CommandPalette.vue";
import ThemePicker from "@/components/common/ThemePicker.vue";
import ImportDialog from "@/components/common/ImportDialog.vue";
+import SettingsModal from "@/components/common/SettingsModal.vue";
+import ConnectionEditDialog from "@/components/connections/ConnectionEditDialog.vue";
import CopilotPanel from "@/components/copilot/CopilotPanel.vue";
import type { ThemeDefinition } from "@/components/common/ThemePicker.vue";
import type { SidebarTab } from "@/components/sidebar/SidebarToggle.vue";
@@ -184,8 +249,38 @@ const editorFile = ref<{ content: string; path: string; sessionId: string } | nu
const commandPalette = ref | null>(null);
const themePicker = ref | null>(null);
const importDialog = ref | null>(null);
+const settingsModal = ref | null>(null);
+const connectionEditDialog = ref | null>(null);
const statusBar = ref | null>(null);
+/** File menu dropdown state. */
+const showFileMenu = ref(false);
+
+/** Close the file menu after a short delay (allows click events to fire first). */
+function closeFileMenuDeferred(): void {
+ setTimeout(() => { showFileMenu.value = false; }, 150);
+}
+
+/** Handle file menu item clicks. */
+function handleFileMenuAction(action: string): void {
+ showFileMenu.value = false;
+ switch (action) {
+ case "new-connection":
+ connectionEditDialog.value?.openNew();
+ break;
+ case "import":
+ importDialog.value?.open();
+ break;
+ case "settings":
+ settingsModal.value?.open();
+ break;
+ case "exit":
+ // TODO: Replace with Wails runtime.Quit()
+ window.close();
+ break;
+ }
+}
+
/** Handle file open from SFTP sidebar -- loads mock content for now. */
function handleOpenFile(entry: FileEntry): void {
if (!sessionStore.activeSession) return;