export type ClaudeEmbedKind = 'artifact' | 'design'; export interface ClaudeEmbedProps { /** Any claude.ai / claude.site url. */ url: string; /** Which surface the link points at — only the heading differs. */ kind?: ClaudeEmbedKind; /** The author's name for this link, when they gave one. */ title?: string; /** iframe height (CSS value), matching `FigmaEmbed`'s prop. */ height?: string; /** iframe loading strategy. Defaults to `lazy`, as `FigmaEmbed` does. */ loading?: 'eager' | 'lazy'; } /** * A Claude artifact, in the SAME chrome as every other embed viewer * (`EmbedViewerFrame` — what `FigmaEmbed` renders): icon, heading, an * "Open in Claude" action, and the frame below. Reached through the * `{{claude-artifact:URL}}` / `{{claude-design:URL}}` shortcodes, so it looks * identical wherever markdown renders — a spec body, a comment, a links rail. * * FRAME SOURCE — fully under the hood, in priority order: * 1. The host's SELF-HOSTED MIRROR: the url's artifact id derives the * storage-view proxy path (`toClaudeMirrorPath`), probed with a * 1-byte ranged fetch. When the host has ingested a copy, the frame * shows it — claude.ai frame-locks CODE artifacts entirely, so this * is the only way those ever render inline. * 2. claude.ai's own `/embed` route for a PUBLISHED artifact * (`toClaudeEmbedUrl`). * 3. Neither → the shared frame's empty state. * The consumer passes only the claude URL; "Open in Claude" always * targets it, so commenting stays on claude.ai. * * What defeats the claude.ai leg: a Claude CODE url (no Embed settings * exist for it, and its `/embed` path answers `frame-ancestors 'self'`), * a Claude Design url (no embed route), an artifact whose author has not * allow-listed this host, or an http host (mixed content). */ export declare function ClaudeEmbed({ url, kind, title, height, loading }: ClaudeEmbedProps): import("react").JSX.Element; //# sourceMappingURL=claude-embed.d.ts.map