fix(electrobun): wizard 7 fixes — validation, GitLab, SSHFS, icons, model dropdown, keyboard nav

- Git Platform: validates repo via git.probe before enabling Next, supports GitHub + GitLab + any git URL
- Template dir configurable in Advanced Settings (template_dir key)
- SSHFS: checks sshfs availability, mountpoint selector when enabled
- CustomDropdown: flip-up when insufficient space below
- 50 Lucide icons (was 24) with categories (AI, Data, DevOps, Security, Media, Comms)
- Model: CustomDropdown from live API, max_tokens as slider, effort only with adaptive thinking
- Keyboard: Escape closes wizard, Tab navigation with :focus-visible rings, source cards navigable
This commit is contained in:
Hibryda 2026-03-23 14:20:30 +01:00
parent 41b8d46a19
commit 021feba3ed
11 changed files with 368 additions and 614 deletions

View file

@ -17,6 +17,7 @@
let otlpEndpoint = $state('');
let relayUrls = $state('');
let connTimeout = $state(30);
let templateDir = $state('~/.config/agor/templates/');
let appVersion = $state('...');
let updateChecking = $state(false);
@ -32,6 +33,7 @@
function setOtlp(v: string) { otlpEndpoint = v; persist('otlp_endpoint', v); }
function setRelayUrls(v: string) { relayUrls = v; persist('relay_urls', v); }
function setConnTimeout(v: number) { connTimeout = v; persist('connection_timeout', String(v)); }
function setTemplateDir(v: string) { templateDir = v; persist('template_dir', v); }
function togglePlugin(id: string) {
plugins = plugins.map(p => p.id === id ? { ...p, enabled: !p.enabled } : p);
@ -107,6 +109,7 @@
if (settings['otlp_endpoint']) otlpEndpoint = settings['otlp_endpoint'];
if (settings['relay_urls']) relayUrls = settings['relay_urls'];
if (settings['connection_timeout']) connTimeout = parseInt(settings['connection_timeout'], 10) || 30;
if (settings['template_dir']) templateDir = settings['template_dir'];
if (settings['plugin_states']) {
try {
const states: Record<string, boolean> = JSON.parse(settings['plugin_states']);
@ -153,6 +156,14 @@
<span class="unit">seconds</span>
</div>
<h3 class="sh" style="margin-top: 0.75rem;">Templates</h3>
<div class="field">
<label class="lbl" for="adv-tpldir">Template directory</label>
<input id="adv-tpldir" class="text-in" value={templateDir} placeholder="~/.config/agor/templates/"
onchange={e => setTemplateDir((e.target as HTMLInputElement).value)} />
<span class="unit">Where project templates are stored</span>
</div>
<h3 class="sh" style="margin-top: 0.75rem;">Plugins</h3>
<div class="plugin-list">
{#each plugins as plug}