collet 0.1.0

Relentless agentic coding orchestrator with zero-drop agent loops
Documentation
<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">
					&#x2630;
				</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>