import type { UploadResult } from "@silo/nextjs"; export interface BaseUploaderProps { /** Bucket to upload to */ bucket?: string; /** Seconds until file expires (optional) */ expiresIn?: number; /** Keep file private (default: true) */ private?: boolean; /** Called when upload completes */ onUpload?: (result: UploadResult) => void; /** Called when upload fails */ onError?: (error: Error) => void; /** Custom className for the root element */ className?: string; /** Custom styles */ style?: React.CSSProperties; /** Disable the uploader */ disabled?: boolean; /** Max file size in bytes */ maxSize?: number; /** Custom label/content slot */ children?: React.ReactNode; /** Override inner icon slot */ renderIcon?: () => React.ReactNode; /** Override progress bar slot */ renderProgress?: (progress: number) => React.ReactNode; /** Override success state slot */ renderSuccess?: (result: UploadResult) => React.ReactNode; /** Override error state slot */ renderError?: (error: Error, retry: () => void) => React.ReactNode; /** Theme tokens */ theme?: SiloTheme; } export interface SiloTheme { borderColor?: string; borderColorActive?: string; backgroundColor?: string; backgroundColorHover?: string; textColor?: string; textColorMuted?: string; accentColor?: string; accentColorHover?: string; errorColor?: string; successColor?: string; borderRadius?: string; fontFamily?: string; } export interface ImageUploaderProps extends BaseUploaderProps { /** Allow cropping before upload */ allowCrop?: boolean; /** Crop aspect ratio (e.g. 16/9) */ cropAspectRatio?: number; /** Show preview after selection */ showPreview?: boolean; /** Accept string (default: image/*) */ accept?: string; } export interface VideoUploaderProps extends BaseUploaderProps { /** Show video preview after selection */ showPreview?: boolean; /** Accept string (default: video/*) */ accept?: string; } export interface FileUploaderProps extends BaseUploaderProps { /** Accepted MIME types or extensions */ accept?: string; /** Allow multiple files */ multiple?: boolean; } export interface MediaUploaderProps extends BaseUploaderProps { /** Which tabs to show */ tabs?: Array<"image" | "video" | "file">; /** Default active tab */ defaultTab?: "image" | "video" | "file"; imageProps?: Partial; videoProps?: Partial; fileProps?: Partial; } export interface VideoPlayerProps { /** HLS playlist URL or direct MP4 URL */ src: string; /** Poster/thumbnail image URL */ poster?: string; /** Signed URL for private streams */ token?: string; /** Auto play */ autoPlay?: boolean; /** Loop */ loop?: boolean; /** Mute */ muted?: boolean; /** Show native controls (default: true) */ controls?: boolean; /** Custom controls slot — disables native controls */ renderControls?: (player: VideoPlayerControls) => React.ReactNode; /** Custom className */ className?: string; /** Custom styles */ style?: React.CSSProperties; /** Subtitle tracks */ tracks?: Array<{ src: string; label: string; srcLang: string; default?: boolean; }>; /** Theme */ theme?: SiloTheme; /** Called when playback starts */ onPlay?: () => void; /** Called when playback pauses */ onPause?: () => void; /** Called on time update */ onTimeUpdate?: (currentTime: number, duration: number) => void; } export interface VideoPlayerControls { playing: boolean; currentTime: number; duration: number; volume: number; muted: boolean; play: () => void; pause: () => void; seek: (time: number) => void; setVolume: (vol: number) => void; toggleMute: () => void; requestFullscreen: () => void; } //# sourceMappingURL=types.d.ts.map