import type { CSSProperties, ReactNode } from "react"; import { Maximize2, Minimize2, PanelRightClose, PanelRightOpen, X } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { cn } from "@/lib/utils"; import type { SidePanelContentMode, SidePanelPresentation } from "./types"; import { useScrollbarWhileScrolling } from "./use-scrollbar-while-scrolling"; export interface SidePanelFrameProps { children: ReactNode; header?: ReactNode; footer?: ReactNode; trailingControls?: ReactNode; presentation?: SidePanelPresentation; contentMode?: SidePanelContentMode; open?: boolean; maximized?: boolean; resizing?: boolean; label?: string; headerSize?: "default" | "task-detail"; className?: string; bodyClassName?: string; style?: CSSProperties; } export function SidePanelFrame({ children, header, footer, trailingControls, presentation = "docked", contentMode = "padded", open = true, maximized = false, resizing = false, label = "Side panel", headerSize = "default", className, bodyClassName, style, }: SidePanelFrameProps) { const handleScroll = useScrollbarWhileScrolling(); return (
{(header || trailingControls) ? (
{header}
{trailingControls ? (
{trailingControls}
) : null}
) : null}
{contentMode === "prose" ? (
{children}
) : children}
{footer ? ( ) : null}
); } export function SidePanelToggleButton({ open, onToggle, shortcut, className, }: { open: boolean; onToggle: () => void; shortcut?: string; className?: string; }) { const label = "Toggle side panel"; return ( {shortcut ? `${label} (${shortcut})` : label} ); } export function SidePanelWindowControls({ maximized, onMaximizedChange, onToggle, closeControl = "toggle", }: { maximized: boolean; onMaximizedChange: (maximized: boolean) => void; onToggle: () => void; closeControl?: "toggle" | "close"; }) { return ( <> {closeControl === "close" ? ( ) : ( )} ); }