import type * as React from 'react'; import type { PrimitivePropsWithRef } from '../utils/primitive.js'; /** Per-file upload status; pushed onto FileUploadItem by the transport owner. */ export type FileUploadFileStatus = 'idle' | 'uploading' | 'complete' | 'error'; /** Why one file was refused: file-invalid-type, file-too-large, file-too-small, or custom codes. */ export interface FileUploadRejection { /** The file object that was refused. */ file: File; /** Every reason this file was refused. */ errors: string[]; } /** Device camera: 'user' for front, 'environment' for rear. */ export type FileUploadCapture = 'user' | 'environment'; /** @internal Validation options. */ export interface FileUploadValidateOptions { accept?: string | undefined; maxFileSize?: number | undefined; minFileSize?: number | undefined; validator?: ((file: File) => string[] | null | undefined) | undefined; } /** Context value distributed from FileUpload to its parts. */ export interface FileUploadContextValue { inputRef: React.RefObject; files: File[]; disabled: boolean; accept?: string | undefined; multiple: boolean; addFiles: (files: FileList | File[]) => void; removeFile: (file: File) => void; clearFiles: () => void; openPicker: () => void; readOnly: boolean; directory: boolean; capture?: FileUploadCapture | undefined; removeLabel: (fileName: string) => string; labelId: string; labelPresent: boolean; /** @internal */ setLabelPresent: (present: boolean) => void; descriptionId: string; required: boolean; invalid: boolean; } /** Root ref handle: HTMLDivElement with constraint-validation and addFiles. */ export interface FileUploadHandle extends HTMLDivElement { /** Whether current selection satisfies constraints, fires invalid if not. */ checkValidity(): boolean; /** Like checkValidity, but shows browser's validation message. */ reportValidity(): boolean; /** Set external error like setCustomValidity; works whether required or not. */ setCustomValidity(message: string): void; /** * Feed files through the picker/drop pipeline: accept, size, maxFiles, validation. * @example upload.current?.addFiles(event.clipboardData.files) */ addFiles(files: FileList | File[]): void; } /** Root props; manually-composed parts or children override defaults. */ export interface FileUploadProps extends Omit, 'defaultValue' | 'onChange'> { /** Custom anatomy parts; omitted uses showList/showPreview/renderFile. @default undefined */ children?: React.ReactNode | undefined; /** Selected files for controlled usage; pair with onValueChange. @default undefined */ value?: File[] | undefined; /** Initially selected files for uncontrolled usage. @default [] */ defaultValue?: File[] | undefined; /** Fires when files are added or removed. @default undefined */ onValueChange?: ((files: File[]) => void) | undefined; /** Comma-separated file-type filter for picker and drag-drop. @default undefined */ accept?: string | undefined; /** Allow multiple files; false replaces instead of appending. @default false */ multiple?: boolean | undefined; /** Disables dropzone, trigger, and file input. @default false */ disabled?: boolean | undefined; /** Max files; excess rejected with too-many-files. @default undefined */ maxFiles?: number | undefined; /** Largest file size in bytes; excess rejected. @default undefined */ maxFileSize?: number | undefined; /** Smallest file size in bytes; smaller rejected. @default undefined */ minFileSize?: number | undefined; /** Extra per-file validation; return error codes to reject. @default undefined */ validator?: ((file: File) => string[] | null | undefined) | undefined; /** Fires once per refused file before commit. @default undefined */ onFileReject?: ((rejection: FileUploadRejection) => void) | undefined; /** Formats delete button accessible names from file names. @default (fileName) => `Remove ${fileName}` */ removeLabel?: ((fileName: string) => string) | undefined; /** Form field name for file input; omitted submits nothing. @default undefined */ name?: string | undefined; /** Form id this upload submits into; needs name. @default undefined */ form?: string | undefined; /** Marks field required; valueMissing while no files. @default false */ required?: boolean | undefined; /** Custom message for valueMissing when required is empty. @default browser wording */ requiredMessage?: string | undefined; /** Show selection but block changes; dropzone keeps tab stop. @default false */ readOnly?: boolean | undefined; /** Mark invalid from outside; ORed with own required invalidity. @default false */ invalid?: boolean | undefined; /** Let picker select whole directory via webkitdirectory. @default false */ directory?: boolean | undefined; /** Open device camera instead of file browser; mobile only. @default undefined */ capture?: FileUploadCapture | undefined; /** Prevents browser navigation on drop outside dropzone. @default true */ preventDocumentDrop?: boolean | undefined; /** Whether to render the derived `FileUploadItemGroup` listing selected files. @default true */ showList?: boolean | undefined; /** Show thumbnail before file name in each row. @default false */ showPreview?: boolean | undefined; /** Per-file upload state keyed by File; returns status and progress. @default undefined */ fileStatus?: ((file: File) => { status?: FileUploadFileStatus | undefined; progress?: number | undefined; } | undefined) | undefined; /** Custom render for file row (replaces name/size/delete). @default undefined */ renderFile?: ((file: File) => React.ReactNode) | undefined; } /** Label element that names the dropzone. */ export interface FileUploadLabelProps extends PrimitivePropsWithRef<'span'> { } /** Drag-and-drop / click-to-browse target. */ export interface FileUploadDropzoneProps extends PrimitivePropsWithRef<'div'> { /** Suppress click-to-open; drag-drop and keyboard work. @default false */ disableClick?: boolean | undefined; } /** Button that opens the native file picker. */ export interface FileUploadTriggerProps extends PrimitivePropsWithRef<'button'> { } /** Visually-hidden native input; onChange not omitted, compose handlers. */ export interface FileUploadInputProps extends Omit, 'type' | 'value' | 'defaultValue'> { } /** Context value Item publishes to its nested parts. */ export interface FileUploadItemContextValue { file: File; } /** Single selected file's row; file used by delete button. */ export interface FileUploadItemProps extends PrimitivePropsWithRef<'div'> { /** File this row shows; delete button removes by identity. */ file: File; /** Upload status, owned by transport; reflected as data-state. @default 'idle' */ status?: FileUploadFileStatus | undefined; /** Upload progress 0-100, owned by transport; reflected as data-progress. @default undefined */ progress?: number | undefined; } /** Button that removes one selected file. */ export interface FileUploadItemDeleteProps extends PrimitivePropsWithRef<'button'> { /** File to remove by identity; defaults to enclosing Item's file. @default the enclosing Item's file */ file?: File | undefined; } /** List wrapper the rows sit in. */ export interface FileUploadItemGroupProps extends PrimitivePropsWithRef<'div'> { } /** File name as readable text. */ export interface FileUploadItemNameProps extends PrimitivePropsWithRef<'span'> { } /** File size as readable text. */ export interface FileUploadItemSizeTextProps extends PrimitivePropsWithRef<'span'> { } /** Slot for thumbnail or file-type icon. */ export interface FileUploadItemPreviewProps extends PrimitivePropsWithRef<'div'> { } /** Button that empties the whole list. */ export interface FileUploadClearProps extends PrimitivePropsWithRef<'button'> { }