import React from 'react'; /** * EmbedViewerFrame — the ONE viewer shell shared by every embed viewer * (Google Sheets / PDF / Figma): header row (icon + title + caller-supplied * actions) over an `EmbedIframe`, with an inline empty state when there is no * `src`. * * Extraction rules (output parity with the three pre-existing viewers is the * merge gate — every knob below exists because the shells were NOT byte- * identical): * - `titleVariant`: sheets/pdf render `h2.text-h3`; figma renders * `span.text-h6 font-semibold`. * - `actions` is rendered AS-IS in the header row — each viewer owns its * action container (pdf wraps two buttons, figma wraps a stateful * ToggleGroup + button). State lives in the CALLER (figma's present/ * browse toggle keeps its `useState` in `FigmaEmbed`), so the slot is a * plain ReactNode and re-renders flow through normally. * - `className` overrides the wrapper (figma uses `my-6 space-y-3`). * - Empty body (`src` falsy) keeps the header visible (figma's behavior). * Viewers that historically rendered a standalone empty state WITHOUT a * header (sheets/pdf with no URL at all) early-return before mounting * the frame. */ export interface EmbedViewerFrameProps { /** Header icon, already sized by the caller (the viewers pass `w-5 h-5`). */ icon: React.ReactNode; title: string; /** `h3` = `h2.text-h3` (sheets/pdf, default); `h6` = `span.text-h6 font-semibold` (figma). */ titleVariant?: 'h3' | 'h6'; /** Rendered verbatim in the header row — the caller owns its own container/state. */ actions?: React.ReactNode; /** Iframe source; falsy renders the inline empty state (or the loading * state when `isLoading`) under the header. */ src: string | null | undefined; /** While true AND there is no `src` yet, the body shows the shared embed * loading skeleton (`EmbedLoadingSkeleton`) instead of the empty state — * for a viewer that is still resolving where its frame points (e.g. * ClaudeEmbed probing for a self-hosted mirror), so a cold first view * reads as "loading" (identical to every other embed), not "nothing here". */ isLoading?: boolean; /** Large icon for the inline empty state (the viewers pass `w-16 h-16`). */ emptyIcon?: React.ReactNode; emptyMessage?: string; height?: string; allow?: string; allowFullScreen?: boolean; loading?: 'eager' | 'lazy'; /** iframe `sandbox` — see `EmbedIframe`. Set it for user-authored contents. */ sandbox?: string; /** Wrapper classes; defaults to the sheets/pdf `space-y-4`. */ className?: string; /** Opt-in fullscreen toggle in the header row (rendered after `actions`, * only when there is a `src`). Fullscreens the WHOLE frame — header * included — so the exit control stays reachable (Esc works too). * Exists because some embedded contents ship their own fullscreen * button (the Figma player) and some cannot (a self-hosted Claude * artifact mirror) — the shell provides the affordance uniformly. */ fullscreenControl?: boolean; } export declare function EmbedViewerFrame({ icon, title, titleVariant, actions, src, isLoading, emptyIcon, emptyMessage, height, allow, allowFullScreen, loading, sandbox, className, fullscreenControl, }: EmbedViewerFrameProps): React.JSX.Element; //# sourceMappingURL=embed-viewer-frame.d.ts.map