"use client"; import { useEffect } from "react"; import { motion } from "framer-motion"; import Sidebar from "./Sidebar"; import MobileNav from "./MobileNav"; import MobileTabBar from "./MobileTabBar"; import TopBar from "./TopBar"; import CommandPalette from "./CommandPalette"; import PreferencesModal from "../theme/PreferencesModal"; import AiPanel from "../ai/AiPanel"; import TopLoader from "../ui/TopLoader"; import { ShellProvider, useShell } from "./ShellContext"; interface AppShellProps { children: React.ReactNode; /** Masquer la barre supérieure (pages qui gèrent leur propre en-tête plein écran) */ hideTopBar?: boolean; } function ShellFrame({ children, hideTopBar }: AppShellProps) { const { sidebarCollapsed, toggleSidebar, mobileNavOpen, setMobileNavOpen } = useShell(); // ⌘B / Ctrl+B : replier la barre latérale useEffect(() => { const onKey = (e: KeyboardEvent) => { if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === "b") { const t = e.target as HTMLElement | null; if (t && (t.tagName === "INPUT" || t.tagName === "TEXTAREA" || t.isContentEditable)) return; e.preventDefault(); toggleSidebar(); } }; window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); }, [toggleSidebar]); return (
{/* Barre latérale desktop (repliable) */} {/* Tiroir mobile */} setMobileNavOpen(false)} /> {/* Colonne principale */}
{!hideTopBar && }
{children}
); } export default function AppShell(props: AppShellProps) { return ( ); }