"use client"; import { AnimatePresence, motion } from "motion/react"; import { useMediaQuery } from "@/hooks/use-media-query"; import { cn } from "@/lib/utils"; import { useSidebarContextSafe } from "../../hooks"; const SIDEBAR_COLLAPSED_WIDTH = 60; interface SidebarSlideOutPanelProps { open: boolean; onOpenChange: (open: boolean) => void; ariaLabel: string; width?: number; children: React.ReactNode; } /** * Reusable slide-out panel that appears from the right edge of the sidebar. * Used by InboxSidebar (floating mode), AllSharedChatsSidebar, and AllPrivateChatsSidebar. * * Must be rendered inside a positioned container (the LayoutShell's relative flex container) * and within the SidebarProvider context. */ export function SidebarSlideOutPanel({ open, onOpenChange, ariaLabel, width = 360, children, }: SidebarSlideOutPanelProps) { const isMobile = !useMediaQuery("(min-width: 640px)"); const sidebarContext = useSidebarContextSafe(); const isCollapsed = sidebarContext?.isCollapsed ?? false; const sidebarWidth = isCollapsed ? SIDEBAR_COLLAPSED_WIDTH : (sidebarContext?.sidebarWidth ?? 240); return ( {open && ( <> {/* Click-away layer - covers the full container including the sidebar */} onOpenChange(false)} aria-hidden="true" /> {/* Clip container - positioned at sidebar edge with overflow hidden */}
{children}
)}
); }