import { type Component, type JSX, createSignal, createEffect, Show, lazy, Suspense, onMount, onCleanup } from "solid-js"; import { Sidebar, BottomNav, ContextSwitcher } from "./Navigation"; import { store, setStore, activeTaskId, setActiveTaskId, requestImmediateNotesMetadataLoad } from "@/store"; import { PanelLeftOpen, PanelLeftClose } from "lucide-solid"; const TaskDetail = lazy(() => import("./TaskDetail").then(m => ({ default: m.TaskDetail }))); const QuickEntry = lazy(() => import("./QuickEntry").then(m => ({ default: m.QuickEntry }))); const NotepadView = lazy(() => import("../views/NotepadView").then(m => ({ default: m.NotepadView }))); import { NotesSidebar } from "./NotesSidebar"; import { Button } from "./ui/button"; import { cn } from "@/lib/utils"; import { FilterBar } from "./FilterBar"; interface LayoutProps { children: JSX.Element; currentView: string; setView: (v: string) => void; } export const Layout: Component = (props) => { const [isSidebarLocked, setIsSidebarLocked] = createSignal(true); const [isSidebarPeeking, setIsSidebarPeeking] = createSignal(false); const [isDropdownOpen, setIsDropdownOpen] = createSignal(false); // Lift selectedNoteId up to Layout so it can be passed to NotesSidebar and NotepadView const [selectedNoteId, setSelectedNoteId] = createSignal(null); // Make it available globally for QuickEntry auto-tagging without circular deps createEffect(() => { (window as any)._activeNoteId = selectedNoteId(); }); onMount(() => { const handleOpenNote = (e: Event) => { const detail = (e as CustomEvent).detail; if (detail && detail.noteId) { setStore('isNotepadMode', true); setSelectedNoteId(detail.noteId); } }; window.addEventListener('open-note', handleOpenNote); onCleanup(() => window.removeEventListener('open-note', handleOpenNote)); // Preload heavy components in background when idle const idleCallback = (window as any).requestIdleCallback || ((cb: any) => setTimeout(cb, 2000)); idleCallback(() => { import("./TaskDetail"); import("./QuickEntry"); import("./TaskEditor"); import("../views/NotepadView"); }); }); // Derived active task for the detail view const activeTask = () => store.tasks.find(t => t.id === activeTaskId()); createEffect(() => { if (store.isNotepadMode) { void requestImmediateNotesMetadataLoad(); } }); return (
{/* Desktop UI Container */}
!isSidebarLocked() && setIsSidebarPeeking(true)} onMouseLeave={() => { if (!isSidebarLocked() && !isDropdownOpen()) { setIsSidebarPeeking(false); } }}>
{/* Task Sidebar Wrapper */}
{/* Notes Sidebar Wrapper */}

Tasgrid

{/* Expand Trigger Button (visible when not locked) */} {!isSidebarLocked() && ( )} {/* Mobile Context Switcher */}
{/* Mode Switcher */}
{/* Sliding Indicator */}
{/* Sync Progress Bar Overlay */}
{/* Main Content Area */}
{props.children}
{/* Mobile Bottom Nav */}
setActiveTaskId(null)} />
); };