<script lang="ts">
import { onMount } from 'svelte';
import { layoutStore } from '$lib/stores/layout.svelte.js';
import LeftSidebar from './LeftSidebar.svelte';
import RightSidebar from './RightSidebar.svelte';
import StatusBar from './StatusBar.svelte';
import InputBar from './InputBar.svelte';
import type { Snippet } from 'svelte';
let { children, onsubmit }: { children: Snippet; onsubmit: (msg: string, mode: string) => void } = $props();
let isMobile = $state(false);
onMount(() => {
const mq = window.matchMedia('(max-width: 768px)');
isMobile = mq.matches;
const handler = (e: MediaQueryListEvent) => { isMobile = e.matches; };
mq.addEventListener('change', handler);
function handleKey(e: KeyboardEvent) {
if (e.ctrlKey && e.key === 'b') { e.preventDefault(); layoutStore.toggleLeft(); }
if (e.ctrlKey && e.key === 'j') { e.preventDefault(); layoutStore.toggleRight(); }
if (e.key === 'Escape' && isMobile && layoutStore.rightSidebarOpen) { layoutStore.rightSidebarOpen = false; }
}
window.addEventListener('keydown', handleKey);
return () => {
mq.removeEventListener('change', handler);
window.removeEventListener('keydown', handleKey);
};
});
</script>
<!-- Mobile sidebar overlay backdrop -->
{#if isMobile && layoutStore.rightSidebarOpen}
<!-- svelte-ignore a11y_no_static_element_interactions a11y_click_events_have_key_events -->
<div class="backdrop" role="presentation" onclick={() => layoutStore.rightSidebarOpen = false} onkeydown={() => {}}></div>
{/if}
<div class="shell">
{#if !isMobile}
<LeftSidebar />
{/if}
<div class="center">
<!-- Mobile top bar -->
{#if isMobile}
<div class="mobile-bar">
<span class="logo">collet</span>
<button class="menu-btn" onclick={() => layoutStore.rightSidebarOpen = !layoutStore.rightSidebarOpen} aria-label="Toggle sidebar">
☰
</button>
</div>
{/if}
<main class="main-area">
{@render children()}
</main>
<StatusBar />
<InputBar {onsubmit} />
</div>
<RightSidebar {isMobile} />
</div>
<style>
.shell {
display: flex;
height: 100vh;
overflow: hidden;
background: var(--bg);
}
.center {
flex: 1;
display: flex;
flex-direction: column;
min-width: 0;
overflow: hidden;
}
.main-area {
flex: 1;
overflow-y: auto;
overflow-x: hidden;
}
.backdrop {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.5);
z-index: 90;
}
.mobile-bar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0.5rem 0.75rem;
background: var(--bg-surface);
border-bottom: 1px solid var(--border);
flex-shrink: 0;
}
.logo {
color: var(--accent);
font-weight: 700;
}
.menu-btn {
all: unset;
cursor: pointer;
color: var(--fg-dim);
font-size: 1.25rem;
padding: 0.125rem 0.25rem;
}
.menu-btn:hover { color: var(--fg); }
</style>