import * as React from "react"; import { useIsAuxiliaryPanelOverlay } from "@/shared/hooks/use-mobile"; import { AUXILIARY_PANEL_MIN_WIDTH_PX } from "@/shared/layout/auxiliaryPanelLayout"; import { AuxiliaryPanelContext, type AuxiliaryPanelLayout, } from "@/shared/layout/auxiliaryPanelContext"; import { getAuxiliaryPanelMode } from "@/shared/layout/AuxiliaryPanelHeader"; import { cn } from "@/shared/lib/cn"; import { OverlayPanelBackdrop, PANEL_ENTER_BASE_CLASS, PANEL_OVERLAY_CLASS, } from "@/shared/ui/OverlayPanelBackdrop"; export type { AuxiliaryPanelContextValue, AuxiliaryPanelLayout, } from "@/shared/layout/auxiliaryPanelContext"; export { useAuxiliaryPanel } from "@/shared/layout/auxiliaryPanelContext"; type AuxiliaryPanelProps = { canResetWidth?: boolean; children: React.ReactNode; className?: string; footer?: React.ReactNode; header?: React.ReactNode; isSinglePanelView?: boolean; layout?: AuxiliaryPanelLayout; onClose: () => void; onResetWidth?: () => void; onResizeStart?: React.PointerEventHandler; resizeHandleAriaLabel?: string; resizeHandleTestId?: string; siblings?: React.ReactNode; /** When false, standalone width uses `widthPx` without min-width clamp. */ splitPaneClamp?: boolean; testId?: string; transparentChrome?: boolean; widthPx: number; }; /** Right-side auxiliary panel shell for split and standalone overlay layouts. */ export function AuxiliaryPanel({ canResetWidth, children, className, footer, header, isSinglePanelView = false, layout = "standalone", onClose, onResetWidth, onResizeStart, resizeHandleAriaLabel = "Resize panel", resizeHandleTestId, siblings, splitPaneClamp = true, testId, transparentChrome = false, widthPx, }: AuxiliaryPanelProps) { const isOverlay = useIsAuxiliaryPanelOverlay(); const isFloatingOverlay = isOverlay && !isSinglePanelView; const isSplitLayout = layout === "split"; const mode = getAuxiliaryPanelMode(isSplitLayout, isFloatingOverlay); const contextValue = React.useMemo( () => ({ isFloatingOverlay, isOverlay, isSinglePanelView, isSplitLayout, layout, mode, onClose, transparentChrome, widthPx, }), [ isFloatingOverlay, isOverlay, isSinglePanelView, isSplitLayout, layout, mode, onClose, transparentChrome, widthPx, ], ); const panelWidth = isSinglePanelView ? "100%" : splitPaneClamp ? `min(${widthPx}px, calc(100% - ${AUXILIARY_PANEL_MIN_WIDTH_PX}px))` : `${widthPx}px`; const resizeHandle = !isSplitLayout && !isOverlay && !isSinglePanelView && onResizeStart != null ? ( ) : null; if (isSplitLayout) { return (
{header} {children} {footer}
{siblings}
); } return ( {isFloatingOverlay ? : null} {siblings} ); }