feat(electrobun): fixes + 7 new features (terminal input, file browser, memory, toasts)

Fixes:
- Terminal accepts keyboard input (echo mode with prompt)
- Terminal drawer collapses properly (display:none preserves xterm state)

Features:
- 6 project tabs: Model | Docs | Context | Files | SSH | Memory
- FileBrowser.svelte: recursive tree with expand/collapse + file preview
- MemoryTab.svelte: memory cards with trust badges (human/agent/auto)
- Subagent tree in AgentPane (demo: search-agent, test-runner)
- Drag resize handle between agent pane and terminal
- Theme dropdown in Settings (4 Catppuccin flavors)
- ToastContainer.svelte: auto-dismiss notifications
This commit is contained in:
Hibryda 2026-03-20 02:07:18 +01:00
parent b11a856b72
commit 4ae558af17
14 changed files with 1168 additions and 196 deletions

View file

@ -38,11 +38,9 @@
const idx = tabs.findIndex(t => t.id === id);
tabs = tabs.filter(t => t.id !== id);
if (activeTabId === id) {
// activate neighbor
const next = tabs[Math.min(idx, tabs.length - 1)];
activeTabId = next?.id ?? '';
}
// Remove from mounted to free resources
const m = new Set(mounted);
m.delete(id);
mounted = m;
@ -50,7 +48,6 @@
function activateTab(id: string) {
activeTabId = id;
// Mount on first activation
if (!mounted.has(id)) {
mounted = new Set([...mounted, id]);
}
@ -120,23 +117,24 @@
</div>
</div>
<!-- Terminal panes: display:flex/none to preserve xterm state -->
{#if !collapsed}
<div class="term-panes">
{#each tabs as tab (tab.id)}
{#if mounted.has(tab.id)}
<div
class="term-pane"
style:display={activeTabId === tab.id ? 'flex' : 'none'}
role="tabpanel"
aria-label={tab.title}
>
<Terminal />
</div>
{/if}
{/each}
</div>
{/if}
<!--
Terminal panes: always rendered (display:none when collapsed) so xterm state
is preserved across collapse/expand. Using display:none instead of {#if}.
-->
<div class="term-panes" style:display={collapsed ? 'none' : 'block'}>
{#each tabs as tab (tab.id)}
{#if mounted.has(tab.id)}
<div
class="term-pane"
style:display={activeTabId === tab.id ? 'flex' : 'none'}
role="tabpanel"
aria-label={tab.title}
>
<Terminal />
</div>
{/if}
{/each}
</div>
</div>
<style>