import * as React from 'react';
/**
 * FileUpload — 拖放 / 點擊上傳區塊
 *
 * 世界級對照:Ant Design `Upload.Dragger`、Polaris `DropZone`、Material community MUI-File-Input。
 * 與本 DS 既有 FileItem(顯示已上傳檔案)配對 — 這裡 own「上傳觸發 + 拖放偵測」,
 * 上傳後的檔案清單顯示交給 consumer 用 FileItem 渲染。
 *
 * ── 4 狀態(2026-06-03 修正)──
 * idle     (default) — border-dashed border-border  bg-surface
 * hover = drag-over  — border-primary(統一,純 border-driven,底維持 surface)
 * loading            — CircularProgress;cursor-progress(無 pointer-events-none)
 * disabled           — bg-disabled + 文字 fg-disabled(語意 token,非 opacity)+ cursor-not-allowed
 *
 * ── variant ──
 * dropzone(預設)大拖放區 + drag;button 緊湊 Button 觸發(form-friendly,click-only)
 *
 * ── children 插槽 ──
 * 預設渲染 `<Empty icon={Upload} title description />` — 重用 Empty 元件 own
 * 的「icon + title + description 垂直居中」SSOT 避免視覺漂移。Empty 改字體 /
 * gap / icon 尺寸時 FileUpload 自動跟進。若 consumer 傳 children 則整個覆寫。
 *
 * ── API ──
 * onUpload: 使用者選取或拖放檔案時觸發,回傳 File[](至少 1 個)。
 * multiple: 允許多檔。預設 false(單檔)。
 * accept:   MIME filter(例 "image/*,.pdf"),傳給 <input type=file>。
 * maxSize:  單檔最大 bytes;超過靜默忽略(consumer 若需要錯誤提示,走 onReject)。
 * onReject: 被 maxSize / accept 擋下的檔案(提供錯誤訊息顯示機會)。
 */
/**
 * Uploaded / uploading file status item(for `files` prop)。
 * Consumer 持 state(progress / status),FileUpload 只負責渲染。
 */
export interface FileUploadStatus {
    id: string;
    name: string;
    /** bytes */
    size?: number;
    /** Upload 進度(0-100)— uploading 時顯示 progress bar */
    progress?: number;
    status?: 'uploading' | 'completed' | 'error';
    /** Error 訊息 / size 等 description */
    description?: React.ReactNode;
    /** Thumbnail URL for rich mode */
    thumbnailSrc?: string;
}
export interface FileUploadProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onDrop'> {
    onUpload?: (files: File[]) => void;
    onReject?: (files: File[], reason: 'size' | 'type') => void;
    multiple?: boolean;
    accept?: string;
    maxSize?: number;
    disabled?: boolean;
    /**
     * 觸發外觀(2026-06-03 加,M21 prop-variant + Ant `Upload`(button)/`Upload.Dragger`(dropzone)先例):
     * - `dropzone`(預設):大拖放區 + 點擊,支援 drag-and-drop。
     * - `button`:緊湊 Button 觸發(form-friendly,省空間),click-only(無拖放區)。
     * 兩者共用 onUpload / onReject / files 清單渲染;都可放進 Field control slot。
     */
    variant?: 'dropzone' | 'button';
    /** `variant="button"` 的按鈕文字(預設「Choose file」)。 */
    buttonLabel?: string;
    /**
     * Loading 狀態(async 上傳 / 伺服器處理中)。
     * - 2026-06-03 **deferred**:其唯一用途(無清單單檔 / 頭像替換)場景尚未定義,故已從 3-state showcase
     *   移除、不作為當前 feature 呈現;prop 保留供未來該場景。有清單的上傳進度走 FileItem 自身 progress bar(status=uploading）。
     * - 顯示 CircularProgress 取代預設 Empty 內容;`cursor-progress`;互動由 handleClick/handlers 的 isBlocked guard 擋
     * - 宣告 `aria-busy="true"` 讓 screen reader 感知處理中
     */
    loading?: boolean;
    /** Loading 狀態的文字標題(預設「上傳中…」) */
    loadingTitle?: string;
    /** 標題文字(預設「Click or drag file here to upload」) */
    title?: string;
    /** 說明文字(預設依 multiple:單檔「Support for a single file upload」、multiple 多檔「Support for a single or bulk upload」) */
    description?: string;
    /** 若傳入 children,覆寫預設 Empty 結構 */
    children?: React.ReactNode;
    /**
     * Uploaded / uploading 檔案清單。傳入 → FileUpload 在 drop zone 下方渲染列表。
     * 不傳 → 不顯示(consumer 可自行用 FileItem 組成,pre-2026-04-24 行為)。
     * 每項由 FileItem 渲染,status 狀態對應視覺:
     *   - `uploading`:linear ProgressBar(via FileItem;rich mode 另顯示 {progress}%)
     *   - `completed`:綠色 ✓(success 狀態視覺確認)
     *   - `error`:紅色 ✗(+ description 顯示錯誤訊息)
     */
    files?: FileUploadStatus[];
    /** File list 每項顯示模式。Default: 'compact'(單行);'rich' = 含 thumbnail / size / progress bar */
    fileListMode?: 'compact' | 'rich';
    /** File list 移除 callback。有值 → 每項右側顯示 X dismiss button;無 → 不可移除(view-only) */
    onRemove?: (id: string) => void;
    /** File list dismiss button ARIA label template。預設 `移除 {name}`。For i18n. */
    removeAriaLabel?: (name: string) => string;
}
declare const FileUpload: React.ForwardRefExoticComponent<FileUploadProps & React.RefAttributes<HTMLDivElement>>;
export declare const fileUploadMeta: {
    readonly component: "FileUpload";
    readonly family: null;
    readonly variants: {};
    readonly sizes: {};
    readonly states: readonly ["default", "hover", "active", "focus-visible", "disabled"];
    readonly tokens: {
        readonly bg: readonly ["bg-surface", "bg-disabled"];
        readonly fg: readonly [];
        readonly ring: readonly ["ring-ring"];
    };
};
export { FileUpload };
//# sourceMappingURL=file-upload.d.ts.map