import { type ReactNode } from "react"; import { isElectron } from "~/env"; import { getPreviewPanelMaxWidth, type PreviewPanelInlineSize, usePreviewPanelInlineSize, } from "~/hooks/usePreviewPanelInlineSize"; export { getPreviewPanelMaxWidth }; import { cn } from "~/lib/utils"; import { RightPanelResizeHandle } from "./RightPanelResizeHandle"; export type PreviewPanelMode = "inline" | "sheet" | "sidebar" | "embedded"; /** * Shell for the preview panel. In inline mode the panel is user-resizable * via a drag handle on the left edge; width persists per browser. In * sheet/sidebar modes the parent owns the size. */ interface PreviewPanelShellProps { mode: PreviewPanelMode; maximized?: boolean; inlineSize?: PreviewPanelInlineSize; children: ReactNode; } export function PreviewPanelShell(props: PreviewPanelShellProps) { if (props.inlineSize) { return ; } return ; } function ResizablePreviewPanelShell(props: PreviewPanelShellProps) { const inlineSize = usePreviewPanelInlineSize(); return ; } function PreviewPanelShellFrame( props: PreviewPanelShellProps & { inlineSize: PreviewPanelInlineSize }, ) { const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; const isInline = props.mode === "inline"; const { width, handlers } = props.inlineSize; return (
{isInline && !props.maximized ? : null} {useDragRegion ?
: null} {props.children}
); }