branch:
Layout.tsx
1339 bytesRaw
import { useState, useCallback } from "react";
import { Outlet } from "react-router-dom";
import { Button } from "@cloudflare/kumo";
import { ListIcon } from "@phosphor-icons/react";
import { PoweredByAgents } from "@cloudflare/agents-ui";
import { Sidebar } from "./Sidebar";
import { ToastProvider } from "../hooks/useToast";
import { Toaster } from "../components";
export function Layout() {
const [sidebarOpen, setSidebarOpen] = useState(false);
const closeSidebar = useCallback(() => setSidebarOpen(false), []);
return (
<ToastProvider>
<div className="h-full flex flex-col md:flex-row bg-kumo-base">
{/* Mobile header */}
<header className="md:hidden flex items-center justify-between px-4 py-3 border-b border-kumo-line bg-kumo-base shrink-0">
<Button
variant="ghost"
shape="square"
size="sm"
icon={<ListIcon size={20} />}
onClick={() => setSidebarOpen(true)}
aria-label="Open navigation"
/>
<PoweredByAgents />
<div className="w-8" />
</header>
<Sidebar open={sidebarOpen} onClose={closeSidebar} />
<main className="flex-1 overflow-y-auto bg-kumo-base min-h-0">
<Outlet />
</main>
</div>
<Toaster />
</ToastProvider>
);
}