import { type FC } from 'react'; import type { ImageAttachmentRef } from '@deepseek-ai/dsh-attachment'; import type { LocaleService } from './gallery-view.js'; export interface StudioReferenceItem { id: string; attachment?: ImageAttachmentRef; file?: File; previewUrl: string; } export interface StudioWorkspaceProps { workspaceId?: string | undefined; path?: string | undefined; title?: string | undefined; sessionIds?: readonly string[] | undefined; } export declare const StudioView: FC<{ locale?: LocaleService | undefined; /** Host credential-change notifier; re-reads provider sign-in state silently. */ credentialEvents?: { listen(callback: () => void): () => void; } | undefined; workspace?: StudioWorkspaceProps | null | undefined; initialPrompt?: string | undefined; /** * Canvas surface opened first: 'preview' (single-image viewer, the default) * or 'infinite' (the tldraw editor). The right-sidebar variant opens the * infinite canvas directly - mirroring chat-generated images while the * native conversation runs beside it is the point of the split. */ initialCanvasSurface?: 'preview' | 'infinite' | undefined; /** * Show the one-time hint banner above the infinite canvas. Only the * conversation-tab seat (no chat running beside the canvas) needs it - the * right-sidebar variant IS the full experience, so the hint would be noise. */ showInfiniteCanvasHint?: boolean; onInitialPromptApplied?(): void; onOpenInspiration?(): void; }>; export declare function useAttachmentImage(attachment: ImageAttachmentRef | undefined, shouldLoad?: boolean): { url: string | null; blob: Blob | null; loading: boolean; }; export declare function fileToBase64(file: File): Promise;