Add external editor/file picker, update theme

Introduce file/application pickers and external-editor integration, plus a visual refresh. Frontend: add UI for selecting/rescanning installed IDEs, custom editor input, "Open in File Explorer" and "Open in Code Editor" actions, clone destination browse, helper utilities, new icons, and many CSS theme/UX improvements (variables, shadows, scrollbars, selection, refined component styles). State: track installedIdes and scan status. Tauri API: expose browseDirectory, browseApplication and scanInstalledIdes, and wire UI handlers to call them. Backend: add InstalledIde struct and update tauri Cargo manifest and capabilities to allow dialogs. Overall improves editor/workflow integrations and modernizes the app styling.
This commit is contained in:
2026-05-10 21:26:03 +12:00
parent ac7fc231a0
commit 5e10750043
9 changed files with 815 additions and 104 deletions
+59 -38
View File
@@ -1,33 +1,52 @@
:root {
--bg-app: #1c2128;
--bg-panel: #22272e;
--bg-panel-alt: #2a3038;
--bg-hover: #2d3540;
--border: #1e242b;
--text-main: #cdd9e5;
--text-muted: #768390;
--accent: #58a6ff;
--accent-strong: #1f6feb;
--success: #3fb950;
--danger: #f85149;
--radius-md: 6px;
--radius-lg: 8px;
--shadow: 0 8px 24px rgba(1, 4, 9, 0.7);
/* Backgrounds Gitpub Brand Palette */
--bg-app: #0F1115;
--bg-panel: #171B21;
--bg-panel-alt: #1E242C;
--bg-panel-lift: #222931;
--bg-hover: #252D38;
/* Borders */
--border: #2C3440;
--border-subtle: #1F2730;
/* Text */
--text-main: #F3F2EE;
--text-muted: #9CA6B5;
/* Accent Amber Ale */
--accent: #E5A13E;
--accent-strong: #C57B27;
--accent-glow: rgba(229, 161, 62, 0.18);
--accent-subtle: rgba(229, 161, 62, 0.09);
/* Status */
--success: #3FB950;
--danger: #F85149;
/* Shape */
--radius-md: 7px;
--radius-lg: 11px;
--shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
}
:root[data-theme="light"] {
--bg-app: #f6f8fa;
--bg-panel: #ffffff;
--bg-panel-alt: #f0f3f6;
--bg-hover: #eaeef2;
--border: #d0d7de;
--text-main: #24292f;
--text-muted: #57606a;
--accent: #0969da;
--accent-strong: #0969da;
--success: #1a7f37;
--danger: #cf222e;
--shadow: 0 8px 24px rgba(31, 35, 40, 0.12);
--bg-app: #FDF8F0;
--bg-panel: #FFFFFF;
--bg-panel-alt: #F5EFE0;
--bg-panel-lift: #FEFCF8;
--bg-hover: #EDDFC8;
--border: #D4C4A0;
--border-subtle: #E8DFC8;
--text-main: #1A120A;
--text-muted: #6B5C40;
--accent: #C57B27;
--accent-strong: #A86020;
--accent-glow: rgba(197, 123, 39, 0.18);
--accent-subtle: rgba(197, 123, 39, 0.09);
--success: #16a34a;
--danger: #dc2626;
--shadow: 0 8px 28px rgba(197, 123, 39, 0.12);
}
* {
@@ -61,17 +80,17 @@ button {
color: var(--text-main);
padding: 5px 12px;
cursor: pointer;
transition: background 0.1s ease, border-color 0.1s ease, opacity 0.1s ease;
transition: background 0.12s ease, border-color 0.12s ease, opacity 0.12s ease, box-shadow 0.12s ease;
font-size: 13px;
}
button:hover {
background: var(--bg-hover);
border-color: #6e7681;
border-color: #4a5e78;
}
button:disabled {
opacity: 0.5;
opacity: 0.45;
cursor: default;
}
@@ -81,36 +100,38 @@ button:disabled:hover {
}
button.primary {
background: #238636;
background: linear-gradient(135deg, var(--accent-strong) 0%, var(--accent) 100%);
border-color: transparent;
color: #ffffff;
}
button.primary:hover {
background: #2ea043;
opacity: 0.88;
border-color: transparent;
box-shadow: 0 0 0 3px var(--accent-glow);
}
button.primary-blue {
background: var(--accent-strong);
background: linear-gradient(135deg, var(--accent-strong) 0%, var(--accent) 100%);
border-color: transparent;
color: #ffffff;
}
button.primary-blue:hover {
background: #388bfd;
opacity: 0.88;
border-color: transparent;
box-shadow: 0 0 0 3px var(--accent-glow);
}
button.danger {
border-color: rgba(248, 81, 73, 0.35);
color: #f85149;
color: var(--danger);
background: transparent;
}
button.danger:hover {
background: rgba(248, 81, 73, 0.1);
border-color: #f85149;
border-color: var(--danger);
}
input,
@@ -120,10 +141,10 @@ textarea {
padding: 5px 10px;
border-radius: var(--radius-md);
border: 1px solid var(--border);
background: rgba(0, 0, 0, 0.25);
background: rgba(0, 0, 0, 0.28);
color: var(--text-main);
font-size: 13px;
transition: border-color 0.1s ease, box-shadow 0.1s ease;
transition: border-color 0.12s ease, box-shadow 0.12s ease;
}
input:focus,
@@ -131,7 +152,7 @@ select:focus,
textarea:focus {
outline: none;
border-color: var(--accent);
box-shadow: 0 0 0 3px rgba(31, 111, 235, 0.12);
box-shadow: 0 0 0 3px var(--accent-glow);
}
textarea {