react-upload-pro 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/cn.ts","../src/utils/id.ts","../src/utils/files.ts","../src/utils/format.ts","../src/core/validation.ts","../src/core/chunkUpload.ts","../src/core/speed.ts","../src/core/xhrUpload.ts","../src/core/queue.ts","../src/hooks/useUploadQueue.ts","../src/hooks/useDropzone.ts","../src/hooks/useUploadProgress.ts","../src/hooks/useFilePreview.ts","../src/i18n/translations.ts","../src/i18n/I18nProvider.tsx","../src/components/icons.tsx","../src/components/UploadModal.tsx","../src/components/FileEditModal.tsx","../src/components/FilePreviewModal.tsx","../src/components/UploadProgress.tsx","../src/components/UploadPreview.tsx","../src/components/UploadGallery.tsx"],"names":["m","makeError","id","useRef","useState","useEffect","useMemo","base","jsx","jsxs","Fragment"],"mappings":"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","file":"chunk-JI2V5ITY.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/** Combine Tailwind classes safely (resolves conflicts). */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * Generate a stable-ish file id. Uses crypto.randomUUID if available,\n * falls back to a timestamp + random string for SSR / older targets.\n */\nexport function generateId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return `rup-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n","import type { FileMetadata, UploadFile } from '../types';\nimport { generateId } from './id';\n\nconst SSR = typeof window === 'undefined';\n\n/** Convert a native File into an UploadFile. */\nexport function wrapFile(file: File, metadata: FileMetadata = {}): UploadFile {\n const path =\n typeof (file as File & { webkitRelativePath?: string }).webkitRelativePath === 'string'\n ? (file as File & { webkitRelativePath: string }).webkitRelativePath\n : '';\n\n return {\n id: generateId(),\n file,\n name: file.name,\n size: file.size,\n type: file.type,\n path,\n status: 'idle',\n progress: 0,\n bytesUploaded: 0,\n speed: 0,\n eta: Infinity,\n addedAt: Date.now(),\n attempts: 0,\n metadata,\n };\n}\n\n/**\n * Create an object URL for previews. SSR-safe (returns undefined on server).\n * Caller is responsible for revoking via revokePreview.\n */\nexport function generatePreview(file: File): string | undefined {\n if (SSR) return undefined;\n if (typeof URL === 'undefined' || typeof URL.createObjectURL !== 'function') return undefined;\n try {\n return URL.createObjectURL(file);\n } catch {\n return undefined;\n }\n}\n\nexport function revokePreview(url: string | undefined): void {\n if (!url || SSR) return;\n if (typeof URL === 'undefined' || typeof URL.revokeObjectURL !== 'function') return;\n try {\n URL.revokeObjectURL(url);\n } catch {\n /* ignore */\n }\n}\n\n/** Best-effort file category from MIME or extension. */\nexport function getFileCategory(\n file: File | UploadFile,\n): 'image' | 'video' | 'audio' | 'pdf' | 'text' | 'office' | 'archive' | 'other' {\n const name = 'file' in file ? file.file.name : file.name;\n const type = 'file' in file ? file.file.type : file.type;\n if (type.startsWith('image/')) return 'image';\n if (type.startsWith('video/')) return 'video';\n if (type.startsWith('audio/')) return 'audio';\n if (type === 'application/pdf') return 'pdf';\n if (type.startsWith('text/') || type === 'application/json' || type === 'application/xml') {\n return 'text';\n }\n const ext = name.toLowerCase().split('.').pop() ?? '';\n if (['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'odt', 'ods', 'odp'].includes(ext)) {\n return 'office';\n }\n if (['zip', 'rar', 'tar', 'gz', '7z'].includes(ext)) return 'archive';\n if (['md', 'log', 'csv', 'tsv'].includes(ext)) return 'text';\n return 'other';\n}\n\n/**\n * Read the first 16 bytes of a file to validate its magic-number signature.\n * Returns the detected MIME type or null. Best-effort, not exhaustive.\n *\n * Uses a small dispatch because `Blob.arrayBuffer` isn't always available\n * (e.g., in some jsdom versions) — we fall back to FileReader.\n */\nexport async function detectSignature(file: File): Promise<string | null> {\n const head = file.slice(0, 16);\n const ab = await readArrayBuffer(head);\n const buf = new Uint8Array(ab);\n const hex = Array.from(buf).map((b) => b.toString(16).padStart(2, '0')).join('');\n\n // JPEG\n if (hex.startsWith('ffd8ff')) return 'image/jpeg';\n // PNG\n if (hex.startsWith('89504e470d0a1a0a')) return 'image/png';\n // GIF\n if (hex.startsWith('474946383761') || hex.startsWith('474946383961')) return 'image/gif';\n // WebP (RIFF....WEBP)\n if (hex.startsWith('52494646') && hex.slice(16, 24) === '57454250') return 'image/webp';\n // PDF\n if (hex.startsWith('25504446')) return 'application/pdf';\n // ZIP (also docx, xlsx, pptx, jar)\n if (hex.startsWith('504b0304') || hex.startsWith('504b0506') || hex.startsWith('504b0708')) {\n return 'application/zip';\n }\n // MP4 / m4a / mov\n if (hex.slice(8, 16) === '66747970') return 'video/mp4';\n // GZIP\n if (hex.startsWith('1f8b')) return 'application/gzip';\n return null;\n}\n\n/**\n * Recursively walk a DataTransferItemList for files, including folders.\n * Returns a flat list of File objects with webkitRelativePath set when possible.\n */\nexport async function collectFiles(items: DataTransferItemList | null): Promise<File[]> {\n if (!items) return [];\n const collected: File[] = [];\n const promises: Promise<void>[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (!item) continue;\n if (item.kind !== 'file') continue;\n const entry = typeof item.webkitGetAsEntry === 'function' ? item.webkitGetAsEntry() : null;\n if (entry) {\n promises.push(walkEntry(entry, '', collected));\n } else {\n const file = item.getAsFile();\n if (file) collected.push(file);\n }\n }\n\n await Promise.all(promises);\n return collected;\n}\n\nasync function walkEntry(\n entry: FileSystemEntry,\n basePath: string,\n out: File[],\n): Promise<void> {\n if (entry.isFile) {\n const fileEntry = entry as FileSystemFileEntry;\n return new Promise((resolve) => {\n fileEntry.file(\n (f) => {\n if (basePath) {\n Object.defineProperty(f, 'webkitRelativePath', {\n value: `${basePath}/${f.name}`,\n configurable: true,\n });\n }\n out.push(f);\n resolve();\n },\n () => resolve(),\n );\n });\n }\n if (entry.isDirectory) {\n const dirEntry = entry as FileSystemDirectoryEntry;\n const reader = dirEntry.createReader();\n const children: FileSystemEntry[] = [];\n await new Promise<void>((resolve) => {\n const readAll = () => {\n reader.readEntries((batch) => {\n if (batch.length === 0) {\n resolve();\n return;\n }\n children.push(...batch);\n readAll();\n }, () => resolve());\n };\n readAll();\n });\n const nextPath = basePath ? `${basePath}/${entry.name}` : entry.name;\n await Promise.all(children.map((c) => walkEntry(c, nextPath, out)));\n }\n}\n\n/** Stable identity key used for duplicate detection. */\nexport function fileKey(file: File): string {\n return `${file.name}::${file.size}::${file.lastModified}`;\n}\n\nasync function readArrayBuffer(blob: Blob): Promise<ArrayBuffer> {\n const maybe = (blob as Blob & { arrayBuffer?: () => Promise<ArrayBuffer> }).arrayBuffer;\n if (typeof maybe === 'function') {\n return maybe.call(blob);\n }\n return new Promise<ArrayBuffer>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as ArrayBuffer);\n reader.onerror = () => reject(reader.error);\n reader.readAsArrayBuffer(blob);\n });\n}\n","/** Human-readable file size. */\nexport function formatBytes(bytes: number, decimals = 1): string {\n if (!Number.isFinite(bytes) || bytes <= 0) return '0 B';\n const k = 1024;\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.min(units.length - 1, Math.floor(Math.log(bytes) / Math.log(k)));\n return `${(bytes / Math.pow(k, i)).toFixed(decimals)} ${units[i]}`;\n}\n\n/** Human-readable bytes/sec. */\nexport function formatSpeed(bps: number): string {\n if (!Number.isFinite(bps) || bps <= 0) return '—';\n return `${formatBytes(bps)}/s`;\n}\n\n/** Human-readable ETA in seconds. */\nexport function formatEta(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds <= 0) return '—';\n if (seconds < 60) return `${Math.ceil(seconds)}s`;\n if (seconds < 3600) {\n const m = Math.floor(seconds / 60);\n const s = Math.ceil(seconds % 60);\n return `${m}m ${s}s`;\n }\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n return `${h}h ${m}m`;\n}\n\n/** Format a percent (0..1). */\nexport function formatPercent(progress: number): string {\n return `${Math.round(Math.max(0, Math.min(1, progress)) * 100)}%`;\n}\n","import type { Accept, ValidationConfig, ValidationError } from '../types';\nimport { formatBytes, fileKey } from '../utils';\n\n/**\n * Normalize the `accept` config into a flat list of MIME/extension matchers.\n */\nfunction normalizeAccept(accept: Accept | undefined): string[] {\n if (!accept) return [];\n if (typeof accept === 'string') {\n return accept.split(',').map((s) => s.trim()).filter(Boolean);\n }\n if (Array.isArray(accept)) {\n return accept.map((s) => s.trim()).filter(Boolean);\n }\n // Record<mime, extensions>\n const out: string[] = [];\n for (const [mime, exts] of Object.entries(accept)) {\n out.push(mime);\n if (Array.isArray(exts)) out.push(...exts);\n }\n return out;\n}\n\n/**\n * Match a file's MIME / extension against a list of acceptors.\n * Supports `image/*` wildcards and `.ext` entries.\n */\nexport function matchesAccept(file: File, acceptors: string[]): boolean {\n if (acceptors.length === 0) return true;\n const fileMime = (file.type || '').toLowerCase();\n const fileName = file.name.toLowerCase();\n for (const raw of acceptors) {\n const a = raw.toLowerCase();\n if (a.startsWith('.')) {\n if (fileName.endsWith(a)) return true;\n continue;\n }\n if (a.endsWith('/*')) {\n const prefix = a.slice(0, -1); // \"image/\"\n if (fileMime.startsWith(prefix)) return true;\n continue;\n }\n if (fileMime === a) return true;\n }\n return false;\n}\n\n/**\n * Validate one file synchronously against built-in rules.\n * Custom (async) validators are run separately by validateFile.\n */\nfunction validateBuiltin(file: File, config: ValidationConfig): ValidationError | null {\n if (typeof config.minSize === 'number' && file.size < config.minSize) {\n return {\n code: 'file-too-small',\n message: `File is smaller than ${formatBytes(config.minSize)}.`,\n file,\n };\n }\n if (typeof config.maxSize === 'number' && file.size > config.maxSize) {\n return {\n code: 'file-too-large',\n message: `File is larger than ${formatBytes(config.maxSize)}.`,\n file,\n };\n }\n const acceptors = normalizeAccept(config.accept);\n if (!matchesAccept(file, acceptors)) {\n return {\n code: 'file-invalid-type',\n message: `File type \"${file.type || 'unknown'}\" is not allowed.`,\n file,\n };\n }\n return null;\n}\n\n/**\n * Full single-file validation including custom async validators.\n */\nexport async function validateFile(\n file: File,\n config: ValidationConfig,\n): Promise<ValidationError | null> {\n const built = validateBuiltin(file, config);\n if (built) return built;\n if (config.validators?.length) {\n for (const validator of config.validators) {\n const result = await validator(file);\n if (result) return result;\n }\n }\n return null;\n}\n\n/**\n * Validate a batch of files. Applies built-in rules first, then maxFiles,\n * then duplicate detection, then async validators. Returns accepted + rejected.\n */\nexport async function validateBatch(\n files: File[],\n config: ValidationConfig,\n existingCount = 0,\n existingKeys: Set<string> = new Set(),\n): Promise<{ accepted: File[]; rejected: ValidationError[] }> {\n const accepted: File[] = [];\n const rejected: ValidationError[] = [];\n const seenInBatch = new Set<string>();\n let count = existingCount;\n\n for (const file of files) {\n if (typeof config.maxFiles === 'number' && count >= config.maxFiles) {\n rejected.push({\n code: 'too-many-files',\n message: `Maximum of ${config.maxFiles} files allowed.`,\n file,\n });\n continue;\n }\n\n if (config.rejectDuplicates) {\n const key = fileKey(file);\n if (existingKeys.has(key) || seenInBatch.has(key)) {\n rejected.push({\n code: 'duplicate-file',\n message: `Duplicate file: ${file.name}.`,\n file,\n });\n continue;\n }\n seenInBatch.add(key);\n }\n\n const error = await validateFile(file, config);\n if (error) {\n rejected.push(error);\n } else {\n accepted.push(file);\n count += 1;\n }\n }\n\n return { accepted, rejected };\n}\n","import type { ChunkState, UploadError, UploadFile, UploaderConfig } from '../types';\n\nexport interface ChunkUploadParams {\n file: UploadFile;\n config: UploaderConfig;\n signal: AbortSignal;\n onProgress: (loaded: number, total: number) => void;\n}\n\n/**\n * Chunked upload over plain HTTP. Each chunk is sent as a separate request\n * with `Content-Range` and `X-Upload-Id` headers so a custom server can stitch\n * them together. The implementation is provider-agnostic — for S3 multipart,\n * use the s3 cloud adapter instead.\n *\n * Resume semantics: chunks already marked 'success' in file.chunks are skipped.\n * This makes pause-then-resume cheap: just abort, then call upload again.\n */\nexport async function chunkUpload(params: ChunkUploadParams): Promise<unknown> {\n const { file, config, signal, onProgress } = params;\n const chunkSize = config.chunkSize ?? 5 * 1024 * 1024;\n const uploadId = file.id;\n\n if (!file.chunks || file.chunks.length === 0) {\n file.chunks = buildChunks(file.size, chunkSize);\n }\n\n const total = file.size;\n let loadedBaseline = file.chunks\n .filter((c) => c.status === 'success')\n .reduce((sum, c) => sum + (c.end - c.start), 0);\n\n for (const chunk of file.chunks) {\n if (signal.aborted) throw makeError('cancelled', 'Upload cancelled', false);\n if (chunk.status === 'success') continue;\n\n chunk.status = 'uploading';\n chunk.attempts += 1;\n\n const blob = file.file.slice(chunk.start, chunk.end);\n try {\n await sendChunk({\n blob,\n chunk,\n total,\n uploadId,\n config,\n signal,\n onProgress: (loadedInChunk) => {\n onProgress(loadedBaseline + loadedInChunk, total);\n },\n });\n chunk.status = 'success';\n loadedBaseline += chunk.end - chunk.start;\n onProgress(loadedBaseline, total);\n } catch (err) {\n chunk.status = 'error';\n throw err;\n }\n }\n\n return { uploadId, chunks: file.chunks.length };\n}\n\nfunction buildChunks(total: number, size: number): ChunkState[] {\n const chunks: ChunkState[] = [];\n let start = 0;\n let index = 0;\n while (start < total) {\n const end = Math.min(total, start + size);\n chunks.push({ index, start, end, status: 'pending', attempts: 0 });\n start = end;\n index += 1;\n }\n // Ensure at least one chunk for zero-byte files.\n if (chunks.length === 0) {\n chunks.push({ index: 0, start: 0, end: 0, status: 'pending', attempts: 0 });\n }\n return chunks;\n}\n\ninterface SendChunkParams {\n blob: Blob;\n chunk: ChunkState;\n total: number;\n uploadId: string;\n config: UploaderConfig;\n signal: AbortSignal;\n onProgress: (loadedInChunk: number) => void;\n}\n\nfunction sendChunk(params: SendChunkParams): Promise<void> {\n const { blob, chunk, total, uploadId, config, signal, onProgress } = params;\n return new Promise(async (resolve, reject) => {\n if (!config.endpoint) {\n reject(makeError('config-error', 'No endpoint configured', false));\n return;\n }\n let headers: Record<string, string> = {};\n if (config.headers) {\n try {\n headers =\n typeof config.headers === 'function' ? await config.headers() : { ...config.headers };\n } catch (cause) {\n reject(makeError('headers-failed', 'Failed to compute headers', true, cause));\n return;\n }\n }\n headers['Content-Range'] = `bytes ${chunk.start}-${Math.max(0, chunk.end - 1)}/${total}`;\n headers['X-Upload-Id'] = uploadId;\n headers['X-Chunk-Index'] = String(chunk.index);\n\n const xhr = new XMLHttpRequest();\n xhr.open(config.method ?? 'POST', config.endpoint, true);\n xhr.withCredentials = !!config.withCredentials;\n for (const [k, v] of Object.entries(headers)) {\n try {\n xhr.setRequestHeader(k, v);\n } catch {\n /* ignore */\n }\n }\n xhr.upload.addEventListener('progress', (ev) => {\n if (ev.lengthComputable) onProgress(ev.loaded);\n });\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) resolve();\n else {\n reject(\n makeError(\n `http-${xhr.status}`,\n `Chunk ${chunk.index} failed: ${xhr.status}`,\n xhr.status >= 500 || xhr.status === 408 || xhr.status === 429,\n ),\n );\n }\n });\n xhr.addEventListener('error', () => reject(makeError('network', 'Network error', true)));\n xhr.addEventListener('abort', () => reject(makeError('cancelled', 'Upload cancelled', false)));\n signal.addEventListener('abort', () => xhr.abort(), { once: true });\n xhr.send(blob);\n });\n}\n\nfunction makeError(code: string, message: string, retryable: boolean, cause?: unknown): UploadError {\n return { code, message, retryable, cause };\n}\n","/**\n * Exponentially-weighted moving average for upload speed.\n * Half-life roughly 1 second, so old samples decay quickly.\n */\nexport class SpeedMeter {\n private bytes = 0;\n private lastTime = 0;\n private speed = 0;\n private readonly alpha: number;\n private readonly totalBytes: number;\n\n constructor(totalBytes: number, alpha = 0.3) {\n this.totalBytes = totalBytes;\n this.alpha = alpha;\n }\n\n update(currentBytes: number): { speed: number; eta: number } {\n const now = performance.now ? performance.now() : Date.now();\n if (this.lastTime === 0) {\n this.lastTime = now;\n this.bytes = currentBytes;\n return { speed: 0, eta: Infinity };\n }\n const dt = (now - this.lastTime) / 1000;\n if (dt <= 0) return { speed: this.speed, eta: this.eta() };\n const db = currentBytes - this.bytes;\n if (db < 0) {\n // Restarted; reset baseline.\n this.bytes = currentBytes;\n this.lastTime = now;\n return { speed: this.speed, eta: this.eta() };\n }\n const sample = db / dt;\n this.speed = this.speed === 0 ? sample : this.alpha * sample + (1 - this.alpha) * this.speed;\n this.bytes = currentBytes;\n this.lastTime = now;\n return { speed: this.speed, eta: this.eta() };\n }\n\n private eta(): number {\n if (this.speed <= 0) return Infinity;\n const remaining = this.totalBytes - this.bytes;\n if (remaining <= 0) return 0;\n return remaining / this.speed;\n }\n}\n","import type { UploadError, UploadFile, UploaderConfig } from '../types';\n\nexport interface XhrProgressEvent {\n loaded: number;\n total: number;\n}\n\nexport interface XhrUploadParams {\n file: UploadFile;\n config: UploaderConfig;\n signal: AbortSignal;\n onProgress: (event: XhrProgressEvent) => void;\n}\n\n/**\n * Single-shot file upload via XMLHttpRequest. XHR is used instead of fetch\n * because fetch lacks reliable upload-progress support in all browsers.\n *\n * Returns the parsed response body (JSON if possible, else text).\n * Throws UploadError on failure.\n */\nexport function xhrUpload(params: XhrUploadParams): Promise<unknown> {\n const { file, config, signal, onProgress } = params;\n\n return new Promise(async (resolve, reject) => {\n if (signal.aborted) {\n reject(makeError('cancelled', 'Upload cancelled', false));\n return;\n }\n\n let url = config.endpoint;\n let method: 'POST' | 'PUT' | 'PATCH' = config.method ?? 'POST';\n let extraFields: Record<string, string> = {};\n let extraHeaders: Record<string, string> = {};\n\n if (typeof config.getUploadToken === 'function') {\n try {\n const token = await config.getUploadToken(file);\n url = token.url;\n method = token.method ?? method;\n extraFields = token.fields ?? {};\n extraHeaders = token.headers ?? {};\n } catch (cause) {\n reject(makeError('token-failed', 'Failed to obtain upload token', true, cause));\n return;\n }\n }\n\n if (!url) {\n reject(makeError('config-error', 'No endpoint configured', false));\n return;\n }\n\n let headers: Record<string, string> = { ...extraHeaders };\n if (config.headers) {\n try {\n const dynamic =\n typeof config.headers === 'function' ? await config.headers() : config.headers;\n headers = { ...headers, ...dynamic };\n } catch (cause) {\n reject(makeError('headers-failed', 'Failed to compute headers', true, cause));\n return;\n }\n }\n\n const formExtra =\n typeof config.formData === 'function' ? config.formData(file) : (config.formData ?? {});\n\n const xhr = new XMLHttpRequest();\n xhr.open(method, url, true);\n xhr.withCredentials = !!config.withCredentials;\n for (const [k, v] of Object.entries(headers)) {\n try {\n xhr.setRequestHeader(k, v);\n } catch {\n /* ignore forbidden headers */\n }\n }\n\n xhr.upload.addEventListener('progress', (ev) => {\n if (ev.lengthComputable) onProgress({ loaded: ev.loaded, total: ev.total });\n });\n\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n const ct = xhr.getResponseHeader('content-type') ?? '';\n let body: unknown = xhr.responseText;\n if (ct.includes('application/json')) {\n try {\n body = JSON.parse(xhr.responseText);\n } catch {\n /* leave as text */\n }\n }\n resolve(body);\n } else {\n reject(\n makeError(\n `http-${xhr.status}`,\n `Upload failed with status ${xhr.status}`,\n xhr.status >= 500 || xhr.status === 408 || xhr.status === 429,\n xhr.responseText,\n ),\n );\n }\n });\n\n xhr.addEventListener('error', () => {\n reject(makeError('network', 'Network error', true));\n });\n\n xhr.addEventListener('abort', () => {\n reject(makeError('cancelled', 'Upload cancelled', false));\n });\n\n xhr.addEventListener('timeout', () => {\n reject(makeError('timeout', 'Upload timed out', true));\n });\n\n const onAbort = () => xhr.abort();\n signal.addEventListener('abort', onAbort, { once: true });\n\n // Build body\n const fieldName = config.fieldName ?? 'file';\n if (method === 'POST' && Object.keys(formExtra).length + Object.keys(extraFields).length > 0) {\n const fd = new FormData();\n for (const [k, v] of Object.entries({ ...extraFields, ...formExtra })) fd.append(k, v);\n fd.append(fieldName, file.file, file.name);\n xhr.send(fd);\n } else if (method === 'POST') {\n const fd = new FormData();\n fd.append(fieldName, file.file, file.name);\n xhr.send(fd);\n } else {\n // PUT/PATCH: send the raw file body. Useful for presigned URLs.\n xhr.send(file.file);\n }\n });\n}\n\nfunction makeError(code: string, message: string, retryable: boolean, cause?: unknown): UploadError {\n return { code, message, retryable, cause };\n}\n","import type {\n DropzoneCallbacks,\n UploadError,\n UploadFile,\n UploaderConfig,\n} from '../types';\nimport { revokePreview } from '../utils';\nimport { chunkUpload } from './chunkUpload';\nimport { SpeedMeter } from './speed';\nimport { xhrUpload } from './xhrUpload';\n\ntype Listener = (files: UploadFile[]) => void;\n\n/**\n * Central upload coordinator. Owns the list of files, drives the upload\n * lifecycle (start/pause/resume/retry/cancel/remove), and emits updates\n * to subscribed React hooks.\n *\n * The queue is intentionally framework-agnostic — the hooks layer adapts it.\n */\nexport class UploadQueue {\n private files: UploadFile[] = [];\n private listeners = new Set<Listener>();\n private inFlight = new Set<string>();\n private callbacks: DropzoneCallbacks;\n private config: UploaderConfig;\n private completionFired = false;\n\n constructor(config: UploaderConfig = {}, callbacks: DropzoneCallbacks = {}) {\n this.config = { concurrency: 3, retries: 2, retryBackoffMs: 500, ...config };\n this.callbacks = callbacks;\n }\n\n // ───────────── public state ─────────────\n\n getFiles(): UploadFile[] {\n return this.files;\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n listener(this.files);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n updateConfig(config: UploaderConfig): void {\n this.config = { ...this.config, ...config };\n }\n\n updateCallbacks(callbacks: DropzoneCallbacks): void {\n this.callbacks = callbacks;\n }\n\n // ───────────── mutations ─────────────\n\n add(files: UploadFile[]): void {\n if (files.length === 0) return;\n this.files = [...this.files, ...files];\n this.completionFired = false;\n this.emit();\n const mode = this.config.mode ?? 'manual';\n if (mode === 'instant' || mode === 'auto') {\n void this.start();\n }\n }\n\n remove(id: string): void {\n const file = this.files.find((f) => f.id === id);\n if (!file) return;\n if (file.status === 'uploading') {\n file.controller?.abort();\n }\n revokePreview(file.previewUrl);\n this.files = this.files.filter((f) => f.id !== id);\n this.inFlight.delete(id);\n this.callbacks.onRemove?.(file);\n this.emit();\n }\n\n removeAll(): void {\n for (const f of this.files) {\n if (f.status === 'uploading') f.controller?.abort();\n revokePreview(f.previewUrl);\n }\n const removed = this.files;\n this.files = [];\n this.inFlight.clear();\n for (const f of removed) this.callbacks.onRemove?.(f);\n this.emit();\n }\n\n reorder(fromIndex: number, toIndex: number): void {\n if (\n fromIndex < 0 ||\n toIndex < 0 ||\n fromIndex >= this.files.length ||\n toIndex >= this.files.length ||\n fromIndex === toIndex\n ) {\n return;\n }\n const next = [...this.files];\n const [moved] = next.splice(fromIndex, 1);\n if (moved) next.splice(toIndex, 0, moved);\n this.files = next;\n this.emit();\n }\n\n rename(id: string, newName: string): void {\n this.patch(id, { name: newName });\n }\n\n setMetadata(id: string, metadata: UploadFile['metadata']): void {\n const file = this.files.find((f) => f.id === id);\n if (!file) return;\n this.patch(id, { metadata: { ...file.metadata, ...metadata } });\n }\n\n // ───────────── lifecycle ─────────────\n\n async start(): Promise<void> {\n const strategy = this.config.strategy ?? 'parallel';\n const concurrency =\n strategy === 'sequential' ? 1 : Math.max(1, this.config.concurrency ?? 3);\n\n const pending = () =>\n this.files.filter((f) => f.status === 'idle' || f.status === 'queued' || f.status === 'paused');\n\n // Mark all pending as queued so the UI reflects it immediately.\n for (const f of pending()) {\n if (f.status === 'idle') this.patch(f.id, { status: 'queued' });\n }\n\n const next = () => pending().find((f) => f.status === 'queued');\n\n const runners: Promise<void>[] = [];\n const launch = async () => {\n while (true) {\n const file = next();\n if (!file) return;\n await this.runFile(file);\n }\n };\n for (let i = 0; i < concurrency; i++) runners.push(launch());\n await Promise.all(runners);\n this.maybeFireCompletion();\n }\n\n pause(id: string): void {\n const file = this.files.find((f) => f.id === id);\n if (!file) return;\n if (file.status !== 'uploading') return;\n file.controller?.abort();\n this.patch(id, { status: 'paused' });\n this.callbacks.onPause?.(file);\n }\n\n resume(id: string): void {\n const file = this.files.find((f) => f.id === id);\n if (!file) return;\n if (file.status !== 'paused') return;\n this.patch(id, { status: 'queued' });\n this.callbacks.onResume?.(file);\n void this.start();\n }\n\n retry(id: string): void {\n const file = this.files.find((f) => f.id === id);\n if (!file) return;\n if (file.status !== 'error' && file.status !== 'cancelled') return;\n this.patch(id, {\n status: 'queued',\n progress: 0,\n bytesUploaded: 0,\n speed: 0,\n eta: Infinity,\n error: undefined,\n });\n this.callbacks.onRetry?.(file);\n void this.start();\n }\n\n cancel(id: string): void {\n const file = this.files.find((f) => f.id === id);\n if (!file) return;\n if (file.status === 'uploading') file.controller?.abort();\n this.patch(id, { status: 'cancelled' });\n }\n\n // ───────────── internals ─────────────\n\n private async runFile(file: UploadFile): Promise<void> {\n if (this.inFlight.has(file.id)) return;\n this.inFlight.add(file.id);\n\n const controller = new AbortController();\n file.controller = controller;\n const startedAt = Date.now();\n this.patch(file.id, {\n status: 'uploading',\n startedAt,\n attempts: file.attempts + 1,\n controller,\n });\n this.callbacks.onUploadStart?.(this.lookup(file.id));\n\n const meter = new SpeedMeter(file.size);\n const updateProgress = (loaded: number, total: number) => {\n const { speed, eta } = meter.update(loaded);\n const progress = total > 0 ? loaded / total : 0;\n this.patch(file.id, { progress, bytesUploaded: loaded, speed, eta });\n this.callbacks.onUploadProgress?.(this.lookup(file.id));\n };\n\n try {\n if (this.config.virusScan) {\n const result = await this.config.virusScan(this.lookup(file.id));\n if (!result.clean) {\n throw {\n code: 'virus-detected',\n message: result.reason ?? 'File failed virus scan',\n retryable: false,\n } satisfies UploadError;\n }\n }\n\n let response: unknown;\n if (this.config.cloud) {\n response = await this.config.cloud.upload(this.lookup(file.id), {\n signal: controller.signal,\n onProgress: updateProgress,\n });\n } else if (this.config.chunkSize && this.config.chunkSize > 0) {\n response = await chunkUpload({\n file: this.lookup(file.id),\n config: this.config,\n signal: controller.signal,\n onProgress: updateProgress,\n });\n } else {\n response = await xhrUpload({\n file: this.lookup(file.id),\n config: this.config,\n signal: controller.signal,\n onProgress: (ev) => updateProgress(ev.loaded, ev.total),\n });\n }\n\n this.patch(file.id, {\n status: 'success',\n progress: 1,\n bytesUploaded: file.size,\n finishedAt: Date.now(),\n response,\n controller: undefined,\n eta: 0,\n });\n this.callbacks.onUploadSuccess?.(this.lookup(file.id));\n } catch (err) {\n const error = normalizeError(err);\n const current = this.lookup(file.id);\n\n // If the user paused, the controller aborted — leave status as 'paused'.\n if (current.status === 'paused') {\n // already handled by pause()\n } else if (error.code === 'cancelled') {\n this.patch(file.id, { status: 'cancelled', error, controller: undefined });\n } else {\n const maxRetries = this.config.retries ?? 0;\n const canRetry = error.retryable && current.attempts <= maxRetries;\n if (canRetry) {\n const backoff = (this.config.retryBackoffMs ?? 500) * Math.pow(2, current.attempts - 1);\n await new Promise((r) => setTimeout(r, backoff));\n this.inFlight.delete(file.id);\n this.callbacks.onRetry?.(current);\n this.patch(file.id, { status: 'queued', controller: undefined });\n return this.runFile(this.lookup(file.id));\n }\n this.patch(file.id, { status: 'error', error, controller: undefined });\n this.callbacks.onUploadError?.(this.lookup(file.id), error);\n }\n } finally {\n this.inFlight.delete(file.id);\n }\n }\n\n private lookup(id: string): UploadFile {\n const f = this.files.find((x) => x.id === id);\n if (!f) throw new Error(`File ${id} not found`);\n return f;\n }\n\n private patch(id: string, patch: Partial<UploadFile>): void {\n const idx = this.files.findIndex((f) => f.id === id);\n if (idx < 0) return;\n const prev = this.files[idx];\n if (!prev) return;\n this.files = [\n ...this.files.slice(0, idx),\n { ...prev, ...patch },\n ...this.files.slice(idx + 1),\n ];\n this.emit();\n }\n\n private emit(): void {\n for (const l of this.listeners) l(this.files);\n }\n\n private maybeFireCompletion(): void {\n if (this.completionFired) return;\n if (this.files.length === 0) return;\n const allDone = this.files.every(\n (f) => f.status === 'success' || f.status === 'error' || f.status === 'cancelled',\n );\n if (allDone) {\n this.completionFired = true;\n this.callbacks.onAllComplete?.(this.files);\n }\n }\n}\n\nfunction normalizeError(err: unknown): UploadError {\n if (err && typeof err === 'object' && 'code' in err && 'message' in err && 'retryable' in err) {\n return err as UploadError;\n }\n if (err instanceof Error) {\n return { code: 'unknown', message: err.message, retryable: false, cause: err };\n }\n return { code: 'unknown', message: 'Upload failed', retryable: false, cause: err };\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { UploadQueue } from '../core/queue';\nimport type { DropzoneCallbacks, UploadFile, UploaderConfig } from '../types';\n\nexport interface UseUploadQueueOptions extends UploaderConfig, DropzoneCallbacks {}\n\nexport interface UseUploadQueueReturn {\n queue: UploadQueue;\n files: UploadFile[];\n add: (files: UploadFile[]) => void;\n remove: (id: string) => void;\n removeAll: () => void;\n reorder: (from: number, to: number) => void;\n rename: (id: string, name: string) => void;\n setMetadata: (id: string, metadata: UploadFile['metadata']) => void;\n start: () => Promise<void>;\n pause: (id: string) => void;\n resume: (id: string) => void;\n retry: (id: string) => void;\n cancel: (id: string) => void;\n}\n\n/**\n * Low-level hook that returns a stable UploadQueue instance bound to React state.\n * Higher-level hooks (useDropzone, useUploader) compose this.\n */\nexport function useUploadQueue(options: UseUploadQueueOptions = {}): UseUploadQueueReturn {\n const queueRef = useRef<UploadQueue | null>(null);\n if (queueRef.current === null) {\n queueRef.current = new UploadQueue(options, options);\n }\n const queue = queueRef.current;\n\n const [files, setFiles] = useState<UploadFile[]>(() => queue.getFiles());\n\n // Keep queue config/callbacks in sync with prop changes without remounting.\n useEffect(() => {\n queue.updateConfig(options);\n queue.updateCallbacks(options);\n }, [queue, options]);\n\n useEffect(() => {\n return queue.subscribe(setFiles);\n }, [queue]);\n\n return {\n queue,\n files,\n add: (f) => queue.add(f),\n remove: (id) => queue.remove(id),\n removeAll: () => queue.removeAll(),\n reorder: (from, to) => queue.reorder(from, to),\n rename: (id, name) => queue.rename(id, name),\n setMetadata: (id, m) => queue.setMetadata(id, m),\n start: () => queue.start(),\n pause: (id) => queue.pause(id),\n resume: (id) => queue.resume(id),\n retry: (id) => queue.retry(id),\n cancel: (id) => queue.cancel(id),\n };\n}\n","import {\n type ChangeEvent,\n type ClipboardEvent,\n type DragEvent,\n type HTMLAttributes,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type Ref,\n type RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { validateBatch } from '../core/validation';\nimport type {\n DropzoneOptions,\n DropzoneState,\n UploadFile,\n ValidationError,\n} from '../types';\nimport { collectFiles, fileKey, generatePreview, wrapFile } from '../utils';\nimport { useUploadQueue } from './useUploadQueue';\n\n/** The bag of props returned by getRootProps. Tagged with data-* attributes for styling. */\nexport type RootProps<T extends HTMLElement = HTMLDivElement> = HTMLAttributes<T> & {\n [dataAttr: `data-${string}`]: string | undefined;\n};\n\n/** Input props returned by getInputProps. Includes a callback ref. */\nexport type InputProps = InputHTMLAttributes<HTMLInputElement> & {\n ref?: Ref<HTMLInputElement>;\n [dataAttr: `data-${string}`]: string | undefined;\n};\n\nexport interface UseDropzoneReturn {\n /** Spread on the dropzone root element. */\n getRootProps: <T extends HTMLElement = HTMLDivElement>(\n props?: HTMLAttributes<T>,\n ) => RootProps<T>;\n /** Spread on a hidden <input type=\"file\">. */\n getInputProps: (props?: InputHTMLAttributes<HTMLInputElement>) => InputProps;\n /** Open the native file dialog programmatically. */\n open: () => void;\n /** Files currently in the queue. */\n files: UploadFile[];\n /** Validation errors from the most recent drop. */\n rejected: ValidationError[];\n /** Whether anything is being dragged over the dropzone. */\n isDragging: boolean;\n /** Whether the current drag would be accepted. */\n isDragAccept: boolean;\n isDragReject: boolean;\n /** Coarse state for styling. */\n state: DropzoneState;\n /** Queue helpers. */\n add: (files: File[]) => Promise<{ accepted: UploadFile[]; rejected: ValidationError[] }>;\n remove: (id: string) => void;\n removeAll: () => void;\n reorder: (from: number, to: number) => void;\n start: () => Promise<void>;\n pause: (id: string) => void;\n resume: (id: string) => void;\n retry: (id: string) => void;\n cancel: (id: string) => void;\n rename: (id: string, name: string) => void;\n setMetadata: (id: string, metadata: UploadFile['metadata']) => void;\n /** Direct queue handle for advanced use. */\n queue: ReturnType<typeof useUploadQueue>['queue'];\n /** Ref to the hidden input. */\n inputRef: RefObject<HTMLInputElement | null>;\n}\n\n/**\n * The flagship hook. Wires drag-and-drop, paste, click, and folder upload\n * to the validation + upload queue. SSR-safe: only attaches DOM listeners\n * inside effects. Compatible with React 17/18/19.\n */\nexport function useDropzone(options: DropzoneOptions = {}): UseDropzoneReturn {\n const {\n multiple = true,\n directory = false,\n disabled = false,\n clipboard = true,\n noBubble: _noBubble = true,\n autoRevoke = true,\n accept,\n minSize,\n maxSize,\n maxFiles,\n rejectDuplicates,\n validators,\n onDrop,\n onDropAccepted,\n onDropRejected,\n ...uploaderConfig\n } = options;\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const dragCounterRef = useRef(0);\n const [dragState, setDragState] = useState<DropzoneState>('idle');\n const [rejected, setRejected] = useState<ValidationError[]>([]);\n\n const queueApi = useUploadQueue({ ...uploaderConfig, ...options });\n\n const existingKeys = useMemo(() => {\n const set = new Set<string>();\n for (const f of queueApi.files) set.add(fileKey(f.file));\n return set;\n }, [queueApi.files]);\n\n const add = useCallback(\n async (rawFiles: File[]) => {\n let pool = rawFiles;\n if (!multiple && pool.length > 1) pool = pool.slice(0, 1);\n\n // Single-file mode: dropping a new file replaces the existing one\n // (matches native <input type=\"file\"> semantics). Without this, repeated\n // drops accumulate even when `multiple={false}`.\n const isReplacement = !multiple && pool.length > 0 && queueApi.files.length > 0;\n if (isReplacement) {\n queueApi.removeAll();\n }\n\n const { accepted, rejected: rejectedFiles } = await validateBatch(\n pool,\n { accept, minSize, maxSize, maxFiles, rejectDuplicates, validators },\n isReplacement ? 0 : queueApi.files.length,\n isReplacement ? new Set() : existingKeys,\n );\n\n const wrapped = accepted.map((f) => {\n const wf = wrapFile(f);\n wf.previewUrl = generatePreview(f);\n return wf;\n });\n queueApi.add(wrapped);\n setRejected(rejectedFiles);\n onDrop?.(wrapped, rejectedFiles);\n if (wrapped.length) onDropAccepted?.(wrapped);\n if (rejectedFiles.length) onDropRejected?.(rejectedFiles);\n return { accepted: wrapped, rejected: rejectedFiles };\n },\n [\n multiple,\n accept,\n minSize,\n maxSize,\n maxFiles,\n rejectDuplicates,\n validators,\n queueApi,\n existingKeys,\n onDrop,\n onDropAccepted,\n onDropRejected,\n ],\n );\n\n // ───────────── DOM handlers ─────────────\n\n const open = useCallback(() => {\n if (disabled) return;\n inputRef.current?.click();\n }, [disabled]);\n\n const handleInputChange = useCallback(\n async (event: ChangeEvent<HTMLInputElement>) => {\n const list = event.target.files;\n if (!list) return;\n await add(Array.from(list));\n // Reset so the same file can be selected again.\n event.target.value = '';\n },\n [add],\n );\n\n const handleDragEnter = useCallback(\n (event: DragEvent) => {\n if (disabled) return;\n event.preventDefault();\n dragCounterRef.current += 1;\n const hasFiles = Array.from(event.dataTransfer?.types ?? []).includes('Files');\n setDragState(hasFiles ? 'drag-accept' : 'dragging');\n },\n [disabled],\n );\n\n const handleDragOver = useCallback(\n (event: DragEvent) => {\n if (disabled) return;\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'copy';\n },\n [disabled],\n );\n\n const handleDragLeave = useCallback(\n (event: DragEvent) => {\n if (disabled) return;\n event.preventDefault();\n dragCounterRef.current = Math.max(0, dragCounterRef.current - 1);\n if (dragCounterRef.current === 0) setDragState('idle');\n },\n [disabled],\n );\n\n const handleDrop = useCallback(\n async (event: DragEvent) => {\n if (disabled) return;\n event.preventDefault();\n dragCounterRef.current = 0;\n setDragState('idle');\n\n const dt = event.dataTransfer;\n if (!dt) return;\n let files: File[] = [];\n if (dt.items && typeof dt.items[0]?.webkitGetAsEntry === 'function') {\n files = await collectFiles(dt.items);\n } else if (dt.files) {\n files = Array.from(dt.files);\n }\n await add(files);\n },\n [add, disabled],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (disabled) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n open();\n }\n },\n [disabled, open],\n );\n\n // Clipboard paste — global listener while the user is interacting.\n useEffect(() => {\n if (!clipboard || disabled) return;\n const onPaste = (event: Event) => {\n const ev = event as unknown as ClipboardEvent;\n const items = ev.clipboardData?.items;\n if (!items) return;\n const files: File[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (!item) continue;\n if (item.kind === 'file') {\n const f = item.getAsFile();\n if (f) files.push(f);\n }\n }\n if (files.length) void add(files);\n };\n document.addEventListener('paste', onPaste);\n return () => document.removeEventListener('paste', onPaste);\n }, [clipboard, disabled, add]);\n\n // Revoke object URLs on unmount to avoid memory leaks.\n useEffect(() => {\n if (!autoRevoke) return;\n return () => {\n for (const f of queueApi.queue.getFiles()) {\n if (f.previewUrl && typeof URL !== 'undefined') {\n try {\n URL.revokeObjectURL(f.previewUrl);\n } catch {\n /* ignore */\n }\n }\n }\n };\n }, [autoRevoke, queueApi.queue]);\n\n const state: DropzoneState = dragState;\n const isDragging = state !== 'idle';\n\n const getRootProps = useCallback(\n <T extends HTMLElement = HTMLDivElement>(\n props: HTMLAttributes<T> = {},\n ): RootProps<T> => {\n return {\n ...props,\n role: props.role ?? 'button',\n tabIndex: props.tabIndex ?? 0,\n 'aria-disabled': disabled || undefined,\n 'aria-label': props['aria-label'] ?? 'File upload area',\n 'data-dropzone-state': state,\n onClick: (e) => {\n props.onClick?.(e);\n if (!e.defaultPrevented) open();\n },\n onKeyDown: (e) => {\n props.onKeyDown?.(e);\n if (!e.defaultPrevented) handleKeyDown(e as unknown as KeyboardEvent);\n },\n onDragEnter: (e) => {\n props.onDragEnter?.(e);\n handleDragEnter(e as unknown as DragEvent);\n },\n onDragOver: (e) => {\n props.onDragOver?.(e);\n handleDragOver(e as unknown as DragEvent);\n },\n onDragLeave: (e) => {\n props.onDragLeave?.(e);\n handleDragLeave(e as unknown as DragEvent);\n },\n onDrop: (e) => {\n props.onDrop?.(e);\n void handleDrop(e as unknown as DragEvent);\n },\n };\n },\n [\n disabled,\n state,\n open,\n handleKeyDown,\n handleDragEnter,\n handleDragOver,\n handleDragLeave,\n handleDrop,\n ],\n );\n\n const getInputProps = useCallback(\n (props: InputHTMLAttributes<HTMLInputElement> = {}): InputProps => {\n const directoryProps: Record<string, string> = directory\n ? { webkitdirectory: '', directory: '', mozdirectory: '' }\n : {};\n return {\n ...directoryProps,\n ...props,\n ref: (node: HTMLInputElement | null) => {\n inputRef.current = node;\n },\n type: 'file',\n multiple,\n disabled,\n accept: typeof accept === 'string' ? accept : Array.isArray(accept) ? accept.join(',') : undefined,\n style: { display: 'none', ...props.style },\n onChange: (e) => {\n props.onChange?.(e);\n void handleInputChange(e);\n },\n tabIndex: -1,\n 'aria-hidden': true,\n };\n },\n [multiple, disabled, accept, directory, handleInputChange],\n );\n\n return {\n getRootProps,\n getInputProps,\n open,\n files: queueApi.files,\n rejected,\n isDragging,\n isDragAccept: state === 'drag-accept',\n isDragReject: state === 'drag-reject',\n state,\n add,\n remove: queueApi.remove,\n removeAll: queueApi.removeAll,\n reorder: queueApi.reorder,\n start: queueApi.start,\n pause: queueApi.pause,\n resume: queueApi.resume,\n retry: queueApi.retry,\n cancel: queueApi.cancel,\n rename: queueApi.rename,\n setMetadata: queueApi.setMetadata,\n queue: queueApi.queue,\n inputRef,\n };\n}\n","import { useMemo } from 'react';\nimport type { UploadFile } from '../types';\n\nexport interface AggregateProgress {\n total: number;\n uploaded: number;\n progress: number;\n speed: number;\n eta: number;\n uploading: number;\n completed: number;\n errored: number;\n pending: number;\n}\n\n/** Aggregate progress across a list of files. Pure function — no state. */\nexport function useUploadProgress(files: UploadFile[]): AggregateProgress {\n return useMemo(() => {\n let total = 0;\n let uploaded = 0;\n let speed = 0;\n let uploading = 0;\n let completed = 0;\n let errored = 0;\n let pending = 0;\n\n for (const f of files) {\n total += f.size;\n uploaded += f.bytesUploaded;\n if (f.status === 'uploading') {\n uploading += 1;\n speed += f.speed;\n } else if (f.status === 'success') {\n completed += 1;\n } else if (f.status === 'error' || f.status === 'cancelled') {\n errored += 1;\n } else {\n pending += 1;\n }\n }\n\n const progress = total > 0 ? uploaded / total : 0;\n const remaining = total - uploaded;\n const eta = speed > 0 ? remaining / speed : Infinity;\n\n return { total, uploaded, progress, speed, eta, uploading, completed, errored, pending };\n }, [files]);\n}\n","import { useEffect, useState } from 'react';\nimport type { UploadFile } from '../types';\nimport { getFileCategory } from '../utils';\n\nexport type PreviewKind =\n | 'image'\n | 'video'\n | 'audio'\n | 'pdf'\n | 'text'\n | 'office'\n | 'archive'\n | 'other';\n\nexport interface FilePreview {\n kind: PreviewKind;\n url?: string;\n /** For text files: first ~64KB as a string. */\n text?: string;\n /** Loading state. */\n loading: boolean;\n /** Any error encountered while building the preview. */\n error?: string;\n}\n\nconst TEXT_PREVIEW_MAX_BYTES = 64 * 1024;\n\n/**\n * Lazy preview builder. For images/video/audio/pdf it returns the existing\n * object URL; for text files it reads up to 64KB; office files return kind\n * only (consumers can render a generic icon or call a server-side renderer).\n */\nexport function useFilePreview(file: UploadFile | null | undefined): FilePreview {\n const [state, setState] = useState<FilePreview>({\n kind: file ? getFileCategory(file) : 'other',\n loading: !!file,\n });\n\n useEffect(() => {\n if (!file) {\n setState({ kind: 'other', loading: false });\n return;\n }\n const kind = getFileCategory(file);\n if (kind === 'text') {\n let cancelled = false;\n setState({ kind, loading: true });\n const slice = file.file.slice(0, TEXT_PREVIEW_MAX_BYTES);\n slice\n .text()\n .then((text) => {\n if (!cancelled) setState({ kind, text, loading: false });\n })\n .catch((err) => {\n if (!cancelled) {\n setState({\n kind,\n loading: false,\n error: err instanceof Error ? err.message : 'Failed to read file',\n });\n }\n });\n return () => {\n cancelled = true;\n };\n }\n setState({ kind, url: file.previewUrl, loading: false });\n return;\n }, [file]);\n\n return state;\n}\n","import type { Locale, Translations } from '../types';\n\nconst en: Translations = {\n dropHere: 'Drop files here',\n dragOrClick: 'Drag & drop files or click to browse',\n browse: 'Browse files',\n uploading: 'Uploading',\n paused: 'Paused',\n success: 'Uploaded',\n error: 'Failed',\n retry: 'Retry',\n pause: 'Pause',\n resume: 'Resume',\n cancel: 'Cancel',\n remove: 'Remove',\n removeAll: 'Remove all',\n preview: 'Preview',\n download: 'Download',\n edit: 'Edit',\n save: 'Save',\n fullscreen: 'Fullscreen',\n rename: 'Rename',\n tags: 'Tags',\n description: 'Description',\n category: 'Category',\n addTag: 'Add tag',\n fileTooLarge: 'File is too large',\n fileTooSmall: 'File is too small',\n invalidType: 'File type not allowed',\n tooManyFiles: 'Too many files',\n duplicateFile: 'Duplicate file',\n speed: 'Speed',\n eta: 'ETA',\n ofText: 'of',\n filesText: 'files',\n bytes: 'B',\n kb: 'KB',\n mb: 'MB',\n gb: 'GB',\n};\n\nconst hi: Translations = {\n dropHere: 'फ़ाइलें यहाँ छोड़ें',\n dragOrClick: 'फ़ाइलें खींचें और छोड़ें या ब्राउज़ करने के लिए क्लिक करें',\n browse: 'फ़ाइलें ब्राउज़ करें',\n uploading: 'अपलोड हो रहा है',\n paused: 'रुका हुआ',\n success: 'अपलोड हो गया',\n error: 'विफल',\n retry: 'पुनः प्रयास',\n pause: 'रोकें',\n resume: 'जारी रखें',\n cancel: 'रद्द करें',\n remove: 'हटाएँ',\n removeAll: 'सभी हटाएँ',\n preview: 'पूर्वावलोकन',\n download: 'डाउनलोड',\n edit: 'संपादित करें',\n save: 'सहेजें',\n fullscreen: 'पूर्ण स्क्रीन',\n rename: 'नाम बदलें',\n tags: 'टैग',\n description: 'विवरण',\n category: 'श्रेणी',\n addTag: 'टैग जोड़ें',\n fileTooLarge: 'फ़ाइल बहुत बड़ी है',\n fileTooSmall: 'फ़ाइल बहुत छोटी है',\n invalidType: 'फ़ाइल प्रकार अनुमत नहीं है',\n tooManyFiles: 'बहुत सी फ़ाइलें',\n duplicateFile: 'डुप्लिकेट फ़ाइल',\n speed: 'गति',\n eta: 'अनुमानित समय',\n ofText: 'में से',\n filesText: 'फ़ाइलें',\n bytes: 'B',\n kb: 'KB',\n mb: 'MB',\n gb: 'GB',\n};\n\nconst gu: Translations = {\n dropHere: 'ફાઇલો અહીં મૂકો',\n dragOrClick: 'ફાઇલો ખેંચીને મૂકો અથવા બ્રાઉઝ કરવા માટે ક્લિક કરો',\n browse: 'ફાઇલો બ્રાઉઝ કરો',\n uploading: 'અપલોડ થઈ રહ્યું છે',\n paused: 'થોભાવેલું',\n success: 'અપલોડ થઈ ગયું',\n error: 'નિષ્ફળ',\n retry: 'ફરી પ્રયાસ કરો',\n pause: 'થોભો',\n resume: 'ફરી શરૂ કરો',\n cancel: 'રદ કરો',\n remove: 'દૂર કરો',\n removeAll: 'બધું દૂર કરો',\n preview: 'પૂર્વાવલોકન',\n download: 'ડાઉનલોડ',\n edit: 'સંપાદિત કરો',\n save: 'સાચવો',\n fullscreen: 'સંપૂર્ણ સ્ક્રીન',\n rename: 'નામ બદલો',\n tags: 'ટૅગ્સ',\n description: 'વર્ણન',\n category: 'શ્રેણી',\n addTag: 'ટૅગ ઉમેરો',\n fileTooLarge: 'ફાઇલ બહુ મોટી છે',\n fileTooSmall: 'ફાઇલ બહુ નાની છે',\n invalidType: 'ફાઇલ પ્રકાર મંજૂર નથી',\n tooManyFiles: 'ઘણી બધી ફાઇલો',\n duplicateFile: 'ડુપ્લિકેટ ફાઇલ',\n speed: 'ઝડપ',\n eta: 'અંદાજિત સમય',\n ofText: 'માંથી',\n filesText: 'ફાઇલો',\n bytes: 'B',\n kb: 'KB',\n mb: 'MB',\n gb: 'GB',\n};\n\nconst fr: Translations = {\n dropHere: 'Déposez les fichiers ici',\n dragOrClick: 'Glissez-déposez ou cliquez pour parcourir',\n browse: 'Parcourir',\n uploading: 'Envoi en cours',\n paused: 'En pause',\n success: 'Envoyé',\n error: 'Échec',\n retry: 'Réessayer',\n pause: 'Pause',\n resume: 'Reprendre',\n cancel: 'Annuler',\n remove: 'Supprimer',\n removeAll: 'Tout supprimer',\n preview: 'Aperçu',\n download: 'Télécharger',\n edit: 'Modifier',\n save: 'Enregistrer',\n fullscreen: 'Plein écran',\n rename: 'Renommer',\n tags: 'Étiquettes',\n description: 'Description',\n category: 'Catégorie',\n addTag: 'Ajouter une étiquette',\n fileTooLarge: 'Fichier trop volumineux',\n fileTooSmall: 'Fichier trop petit',\n invalidType: 'Type de fichier non autorisé',\n tooManyFiles: 'Trop de fichiers',\n duplicateFile: 'Fichier en double',\n speed: 'Vitesse',\n eta: 'Restant',\n ofText: 'sur',\n filesText: 'fichiers',\n bytes: 'o',\n kb: 'Ko',\n mb: 'Mo',\n gb: 'Go',\n};\n\nconst de: Translations = {\n dropHere: 'Dateien hier ablegen',\n dragOrClick: 'Dateien ablegen oder klicken zum Auswählen',\n browse: 'Dateien auswählen',\n uploading: 'Wird hochgeladen',\n paused: 'Angehalten',\n success: 'Hochgeladen',\n error: 'Fehler',\n retry: 'Erneut versuchen',\n pause: 'Pause',\n resume: 'Fortsetzen',\n cancel: 'Abbrechen',\n remove: 'Entfernen',\n removeAll: 'Alle entfernen',\n preview: 'Vorschau',\n download: 'Herunterladen',\n edit: 'Bearbeiten',\n save: 'Speichern',\n fullscreen: 'Vollbild',\n rename: 'Umbenennen',\n tags: 'Tags',\n description: 'Beschreibung',\n category: 'Kategorie',\n addTag: 'Tag hinzufügen',\n fileTooLarge: 'Datei ist zu groß',\n fileTooSmall: 'Datei ist zu klein',\n invalidType: 'Dateityp nicht zulässig',\n tooManyFiles: 'Zu viele Dateien',\n duplicateFile: 'Doppelte Datei',\n speed: 'Geschwindigkeit',\n eta: 'Verbleibend',\n ofText: 'von',\n filesText: 'Dateien',\n bytes: 'B',\n kb: 'KB',\n mb: 'MB',\n gb: 'GB',\n};\n\nconst ar: Translations = {\n dropHere: 'أفلت الملفات هنا',\n dragOrClick: 'اسحب وأفلت الملفات أو انقر للتصفح',\n browse: 'تصفح الملفات',\n uploading: 'جاري الرفع',\n paused: 'متوقف',\n success: 'تم الرفع',\n error: 'فشل',\n retry: 'إعادة',\n pause: 'إيقاف',\n resume: 'استئناف',\n cancel: 'إلغاء',\n remove: 'إزالة',\n removeAll: 'إزالة الكل',\n preview: 'معاينة',\n download: 'تنزيل',\n edit: 'تحرير',\n save: 'حفظ',\n fullscreen: 'ملء الشاشة',\n rename: 'إعادة تسمية',\n tags: 'علامات',\n description: 'الوصف',\n category: 'الفئة',\n addTag: 'إضافة علامة',\n fileTooLarge: 'الملف كبير جدًا',\n fileTooSmall: 'الملف صغير جدًا',\n invalidType: 'نوع الملف غير مسموح',\n tooManyFiles: 'الكثير من الملفات',\n duplicateFile: 'ملف مكرر',\n speed: 'السرعة',\n eta: 'الوقت المتبقي',\n ofText: 'من',\n filesText: 'ملفات',\n bytes: 'بايت',\n kb: 'ك.ب',\n mb: 'م.ب',\n gb: 'ج.ب',\n};\n\nconst zh: Translations = {\n dropHere: '将文件拖放到此处',\n dragOrClick: '拖放文件或点击浏览',\n browse: '浏览文件',\n uploading: '上传中',\n paused: '已暂停',\n success: '已上传',\n error: '失败',\n retry: '重试',\n pause: '暂停',\n resume: '继续',\n cancel: '取消',\n remove: '移除',\n removeAll: '全部移除',\n preview: '预览',\n download: '下载',\n edit: '编辑',\n save: '保存',\n fullscreen: '全屏',\n rename: '重命名',\n tags: '标签',\n description: '描述',\n category: '类别',\n addTag: '添加标签',\n fileTooLarge: '文件过大',\n fileTooSmall: '文件过小',\n invalidType: '不允许的文件类型',\n tooManyFiles: '文件过多',\n duplicateFile: '重复文件',\n speed: '速度',\n eta: '剩余时间',\n ofText: '/',\n filesText: '个文件',\n bytes: 'B',\n kb: 'KB',\n mb: 'MB',\n gb: 'GB',\n};\n\nconst es: Translations = {\n dropHere: 'Suelta los archivos aquí',\n dragOrClick: 'Arrastra y suelta archivos o haz clic para explorar',\n browse: 'Explorar archivos',\n uploading: 'Subiendo',\n paused: 'Pausado',\n success: 'Subido',\n error: 'Error',\n retry: 'Reintentar',\n pause: 'Pausar',\n resume: 'Reanudar',\n cancel: 'Cancelar',\n remove: 'Eliminar',\n removeAll: 'Eliminar todo',\n preview: 'Vista previa',\n download: 'Descargar',\n edit: 'Editar',\n save: 'Guardar',\n fullscreen: 'Pantalla completa',\n rename: 'Renombrar',\n tags: 'Etiquetas',\n description: 'Descripción',\n category: 'Categoría',\n addTag: 'Añadir etiqueta',\n fileTooLarge: 'El archivo es demasiado grande',\n fileTooSmall: 'El archivo es demasiado pequeño',\n invalidType: 'Tipo de archivo no permitido',\n tooManyFiles: 'Demasiados archivos',\n duplicateFile: 'Archivo duplicado',\n speed: 'Velocidad',\n eta: 'Restante',\n ofText: 'de',\n filesText: 'archivos',\n bytes: 'B',\n kb: 'KB',\n mb: 'MB',\n gb: 'GB',\n};\n\nconst pt: Translations = {\n dropHere: 'Solte os arquivos aqui',\n dragOrClick: 'Arraste e solte arquivos ou clique para procurar',\n browse: 'Procurar arquivos',\n uploading: 'Enviando',\n paused: 'Pausado',\n success: 'Enviado',\n error: 'Falhou',\n retry: 'Tentar novamente',\n pause: 'Pausar',\n resume: 'Retomar',\n cancel: 'Cancelar',\n remove: 'Remover',\n removeAll: 'Remover todos',\n preview: 'Pré-visualizar',\n download: 'Baixar',\n edit: 'Editar',\n save: 'Salvar',\n fullscreen: 'Tela cheia',\n rename: 'Renomear',\n tags: 'Etiquetas',\n description: 'Descrição',\n category: 'Categoria',\n addTag: 'Adicionar etiqueta',\n fileTooLarge: 'Arquivo muito grande',\n fileTooSmall: 'Arquivo muito pequeno',\n invalidType: 'Tipo de arquivo não permitido',\n tooManyFiles: 'Muitos arquivos',\n duplicateFile: 'Arquivo duplicado',\n speed: 'Velocidade',\n eta: 'Restante',\n ofText: 'de',\n filesText: 'arquivos',\n bytes: 'B',\n kb: 'KB',\n mb: 'MB',\n gb: 'GB',\n};\n\nconst ru: Translations = {\n dropHere: 'Перетащите файлы сюда',\n dragOrClick: 'Перетащите файлы или нажмите для выбора',\n browse: 'Выбрать файлы',\n uploading: 'Загрузка',\n paused: 'Приостановлено',\n success: 'Загружено',\n error: 'Ошибка',\n retry: 'Повторить',\n pause: 'Пауза',\n resume: 'Продолжить',\n cancel: 'Отмена',\n remove: 'Удалить',\n removeAll: 'Удалить все',\n preview: 'Предпросмотр',\n download: 'Скачать',\n edit: 'Редактировать',\n save: 'Сохранить',\n fullscreen: 'Полный экран',\n rename: 'Переименовать',\n tags: 'Теги',\n description: 'Описание',\n category: 'Категория',\n addTag: 'Добавить тег',\n fileTooLarge: 'Файл слишком большой',\n fileTooSmall: 'Файл слишком маленький',\n invalidType: 'Тип файла не разрешён',\n tooManyFiles: 'Слишком много файлов',\n duplicateFile: 'Дублирующий файл',\n speed: 'Скорость',\n eta: 'Осталось',\n ofText: 'из',\n filesText: 'файлов',\n bytes: 'Б',\n kb: 'КБ',\n mb: 'МБ',\n gb: 'ГБ',\n};\n\nconst ja: Translations = {\n dropHere: 'ここにファイルをドロップ',\n dragOrClick: 'ファイルをドラッグ&ドロップまたはクリックして選択',\n browse: 'ファイルを選択',\n uploading: 'アップロード中',\n paused: '一時停止',\n success: 'アップロード完了',\n error: '失敗',\n retry: '再試行',\n pause: '一時停止',\n resume: '再開',\n cancel: 'キャンセル',\n remove: '削除',\n removeAll: 'すべて削除',\n preview: 'プレビュー',\n download: 'ダウンロード',\n edit: '編集',\n save: '保存',\n fullscreen: '全画面',\n rename: '名前を変更',\n tags: 'タグ',\n description: '説明',\n category: 'カテゴリー',\n addTag: 'タグを追加',\n fileTooLarge: 'ファイルが大きすぎます',\n fileTooSmall: 'ファイルが小さすぎます',\n invalidType: '許可されていないファイル形式',\n tooManyFiles: 'ファイル数が多すぎます',\n duplicateFile: '重複ファイル',\n speed: '速度',\n eta: '残り時間',\n ofText: '/',\n filesText: 'ファイル',\n bytes: 'B',\n kb: 'KB',\n mb: 'MB',\n gb: 'GB',\n};\n\nconst ko: Translations = {\n dropHere: '여기에 파일을 놓으세요',\n dragOrClick: '파일을 끌어다 놓거나 클릭하여 선택',\n browse: '파일 찾아보기',\n uploading: '업로드 중',\n paused: '일시 중지됨',\n success: '업로드됨',\n error: '실패',\n retry: '다시 시도',\n pause: '일시 중지',\n resume: '재개',\n cancel: '취소',\n remove: '제거',\n removeAll: '모두 제거',\n preview: '미리보기',\n download: '다운로드',\n edit: '편집',\n save: '저장',\n fullscreen: '전체 화면',\n rename: '이름 변경',\n tags: '태그',\n description: '설명',\n category: '카테고리',\n addTag: '태그 추가',\n fileTooLarge: '파일이 너무 큽니다',\n fileTooSmall: '파일이 너무 작습니다',\n invalidType: '허용되지 않는 파일 형식',\n tooManyFiles: '파일이 너무 많습니다',\n duplicateFile: '중복 파일',\n speed: '속도',\n eta: '남은 시간',\n ofText: '/',\n filesText: '개 파일',\n bytes: 'B',\n kb: 'KB',\n mb: 'MB',\n gb: 'GB',\n};\n\nconst it: Translations = {\n dropHere: 'Trascina i file qui',\n dragOrClick: 'Trascina i file o clicca per sfogliare',\n browse: 'Sfoglia file',\n uploading: 'Caricamento in corso',\n paused: 'In pausa',\n success: 'Caricato',\n error: 'Errore',\n retry: 'Riprova',\n pause: 'Pausa',\n resume: 'Riprendi',\n cancel: 'Annulla',\n remove: 'Rimuovi',\n removeAll: 'Rimuovi tutto',\n preview: 'Anteprima',\n download: 'Scarica',\n edit: 'Modifica',\n save: 'Salva',\n fullscreen: 'Schermo intero',\n rename: 'Rinomina',\n tags: 'Etichette',\n description: 'Descrizione',\n category: 'Categoria',\n addTag: 'Aggiungi etichetta',\n fileTooLarge: 'File troppo grande',\n fileTooSmall: 'File troppo piccolo',\n invalidType: 'Tipo di file non consentito',\n tooManyFiles: 'Troppi file',\n duplicateFile: 'File duplicato',\n speed: 'Velocità',\n eta: 'Rimanente',\n ofText: 'di',\n filesText: 'file',\n bytes: 'B',\n kb: 'KB',\n mb: 'MB',\n gb: 'GB',\n};\n\nconst tr: Translations = {\n dropHere: 'Dosyaları buraya bırakın',\n dragOrClick: 'Dosyaları sürükleyip bırakın veya gözatmak için tıklayın',\n browse: 'Dosyalara gözat',\n uploading: 'Yükleniyor',\n paused: 'Duraklatıldı',\n success: 'Yüklendi',\n error: 'Başarısız',\n retry: 'Tekrar dene',\n pause: 'Duraklat',\n resume: 'Devam et',\n cancel: 'İptal',\n remove: 'Kaldır',\n removeAll: 'Tümünü kaldır',\n preview: 'Önizleme',\n download: 'İndir',\n edit: 'Düzenle',\n save: 'Kaydet',\n fullscreen: 'Tam ekran',\n rename: 'Yeniden adlandır',\n tags: 'Etiketler',\n description: 'Açıklama',\n category: 'Kategori',\n addTag: 'Etiket ekle',\n fileTooLarge: 'Dosya çok büyük',\n fileTooSmall: 'Dosya çok küçük',\n invalidType: 'Dosya türüne izin verilmiyor',\n tooManyFiles: 'Çok fazla dosya',\n duplicateFile: 'Yinelenen dosya',\n speed: 'Hız',\n eta: 'Kalan süre',\n ofText: '/',\n filesText: 'dosya',\n bytes: 'B',\n kb: 'KB',\n mb: 'MB',\n gb: 'GB',\n};\n\nconst id: Translations = {\n dropHere: 'Letakkan file di sini',\n dragOrClick: 'Seret & lepas file atau klik untuk menjelajah',\n browse: 'Jelajahi file',\n uploading: 'Mengunggah',\n paused: 'Dijeda',\n success: 'Diunggah',\n error: 'Gagal',\n retry: 'Coba lagi',\n pause: 'Jeda',\n resume: 'Lanjutkan',\n cancel: 'Batal',\n remove: 'Hapus',\n removeAll: 'Hapus semua',\n preview: 'Pratinjau',\n download: 'Unduh',\n edit: 'Ubah',\n save: 'Simpan',\n fullscreen: 'Layar penuh',\n rename: 'Ganti nama',\n tags: 'Tag',\n description: 'Deskripsi',\n category: 'Kategori',\n addTag: 'Tambah tag',\n fileTooLarge: 'File terlalu besar',\n fileTooSmall: 'File terlalu kecil',\n invalidType: 'Tipe file tidak diizinkan',\n tooManyFiles: 'Terlalu banyak file',\n duplicateFile: 'File duplikat',\n speed: 'Kecepatan',\n eta: 'Sisa waktu',\n ofText: 'dari',\n filesText: 'file',\n bytes: 'B',\n kb: 'KB',\n mb: 'MB',\n gb: 'GB',\n};\n\nconst bn: Translations = {\n dropHere: 'এখানে ফাইল ছাড়ুন',\n dragOrClick: 'ফাইল টেনে আনুন বা ব্রাউজ করতে ক্লিক করুন',\n browse: 'ফাইল ব্রাউজ করুন',\n uploading: 'আপলোড হচ্ছে',\n paused: 'বিরতি',\n success: 'আপলোড হয়েছে',\n error: 'ব্যর্থ',\n retry: 'পুনরায় চেষ্টা',\n pause: 'বিরতি',\n resume: 'পুনরায় শুরু',\n cancel: 'বাতিল',\n remove: 'সরান',\n removeAll: 'সব সরান',\n preview: 'পূর্বরূপ',\n download: 'ডাউনলোড',\n edit: 'সম্পাদনা',\n save: 'সংরক্ষণ',\n fullscreen: 'পূর্ণ স্ক্রিন',\n rename: 'নাম পরিবর্তন',\n tags: 'ট্যাগ',\n description: 'বিবরণ',\n category: 'বিভাগ',\n addTag: 'ট্যাগ যোগ করুন',\n fileTooLarge: 'ফাইলটি খুব বড়',\n fileTooSmall: 'ফাইলটি খুব ছোট',\n invalidType: 'ফাইলের প্রকার অনুমোদিত নয়',\n tooManyFiles: 'অনেক বেশি ফাইল',\n duplicateFile: 'নকল ফাইল',\n speed: 'গতি',\n eta: 'বাকি সময়',\n ofText: 'এর',\n filesText: 'ফাইল',\n bytes: 'B',\n kb: 'KB',\n mb: 'MB',\n gb: 'GB',\n};\n\nconst ur: Translations = {\n dropHere: 'فائلیں یہاں چھوڑیں',\n dragOrClick: 'فائلیں گھسیٹیں اور چھوڑیں یا براؤز کرنے کے لیے کلک کریں',\n browse: 'فائلیں براؤز کریں',\n uploading: 'اپ لوڈ ہو رہا ہے',\n paused: 'روک دیا گیا',\n success: 'اپ لوڈ ہو گیا',\n error: 'ناکام',\n retry: 'دوبارہ کوشش',\n pause: 'روکیں',\n resume: 'جاری رکھیں',\n cancel: 'منسوخ',\n remove: 'ہٹائیں',\n removeAll: 'سب ہٹائیں',\n preview: 'پیش نظارہ',\n download: 'ڈاؤن لوڈ',\n edit: 'ترمیم',\n save: 'محفوظ کریں',\n fullscreen: 'پوری اسکرین',\n rename: 'نام تبدیل کریں',\n tags: 'ٹیگز',\n description: 'تفصیل',\n category: 'زمرہ',\n addTag: 'ٹیگ شامل کریں',\n fileTooLarge: 'فائل بہت بڑی ہے',\n fileTooSmall: 'فائل بہت چھوٹی ہے',\n invalidType: 'فائل کی قسم کی اجازت نہیں',\n tooManyFiles: 'بہت زیادہ فائلیں',\n duplicateFile: 'ڈپلیکیٹ فائل',\n speed: 'رفتار',\n eta: 'باقی وقت',\n ofText: 'میں سے',\n filesText: 'فائلیں',\n bytes: 'B',\n kb: 'KB',\n mb: 'MB',\n gb: 'GB',\n};\n\nconst nl: Translations = {\n dropHere: 'Zet bestanden hier neer',\n dragOrClick: 'Sleep bestanden of klik om te bladeren',\n browse: 'Bladeren',\n uploading: 'Uploaden',\n paused: 'Gepauzeerd',\n success: 'Geüpload',\n error: 'Mislukt',\n retry: 'Opnieuw proberen',\n pause: 'Pauze',\n resume: 'Hervatten',\n cancel: 'Annuleren',\n remove: 'Verwijderen',\n removeAll: 'Alles verwijderen',\n preview: 'Voorbeeld',\n download: 'Downloaden',\n edit: 'Bewerken',\n save: 'Opslaan',\n fullscreen: 'Volledig scherm',\n rename: 'Hernoemen',\n tags: 'Tags',\n description: 'Beschrijving',\n category: 'Categorie',\n addTag: 'Tag toevoegen',\n fileTooLarge: 'Bestand is te groot',\n fileTooSmall: 'Bestand is te klein',\n invalidType: 'Bestandstype niet toegestaan',\n tooManyFiles: 'Te veel bestanden',\n duplicateFile: 'Dubbel bestand',\n speed: 'Snelheid',\n eta: 'Resterend',\n ofText: 'van',\n filesText: 'bestanden',\n bytes: 'B',\n kb: 'KB',\n mb: 'MB',\n gb: 'GB',\n};\n\nconst pl: Translations = {\n dropHere: 'Upuść pliki tutaj',\n dragOrClick: 'Przeciągnij i upuść pliki lub kliknij, aby przeglądać',\n browse: 'Przeglądaj pliki',\n uploading: 'Przesyłanie',\n paused: 'Wstrzymane',\n success: 'Przesłano',\n error: 'Błąd',\n retry: 'Ponów',\n pause: 'Wstrzymaj',\n resume: 'Wznów',\n cancel: 'Anuluj',\n remove: 'Usuń',\n removeAll: 'Usuń wszystko',\n preview: 'Podgląd',\n download: 'Pobierz',\n edit: 'Edytuj',\n save: 'Zapisz',\n fullscreen: 'Pełny ekran',\n rename: 'Zmień nazwę',\n tags: 'Tagi',\n description: 'Opis',\n category: 'Kategoria',\n addTag: 'Dodaj tag',\n fileTooLarge: 'Plik jest za duży',\n fileTooSmall: 'Plik jest za mały',\n invalidType: 'Typ pliku niedozwolony',\n tooManyFiles: 'Za dużo plików',\n duplicateFile: 'Duplikat pliku',\n speed: 'Prędkość',\n eta: 'Pozostało',\n ofText: 'z',\n filesText: 'plików',\n bytes: 'B',\n kb: 'KB',\n mb: 'MB',\n gb: 'GB',\n};\n\nconst vi: Translations = {\n dropHere: 'Thả tệp vào đây',\n dragOrClick: 'Kéo & thả tệp hoặc nhấp để duyệt',\n browse: 'Duyệt tệp',\n uploading: 'Đang tải lên',\n paused: 'Đã tạm dừng',\n success: 'Đã tải lên',\n error: 'Thất bại',\n retry: 'Thử lại',\n pause: 'Tạm dừng',\n resume: 'Tiếp tục',\n cancel: 'Hủy',\n remove: 'Xóa',\n removeAll: 'Xóa tất cả',\n preview: 'Xem trước',\n download: 'Tải xuống',\n edit: 'Sửa',\n save: 'Lưu',\n fullscreen: 'Toàn màn hình',\n rename: 'Đổi tên',\n tags: 'Thẻ',\n description: 'Mô tả',\n category: 'Danh mục',\n addTag: 'Thêm thẻ',\n fileTooLarge: 'Tệp quá lớn',\n fileTooSmall: 'Tệp quá nhỏ',\n invalidType: 'Loại tệp không được phép',\n tooManyFiles: 'Quá nhiều tệp',\n duplicateFile: 'Tệp trùng lặp',\n speed: 'Tốc độ',\n eta: 'Còn lại',\n ofText: 'của',\n filesText: 'tệp',\n bytes: 'B',\n kb: 'KB',\n mb: 'MB',\n gb: 'GB',\n};\n\nconst th: Translations = {\n dropHere: 'วางไฟล์ที่นี่',\n dragOrClick: 'ลากและวางไฟล์หรือคลิกเพื่อเรียกดู',\n browse: 'เรียกดูไฟล์',\n uploading: 'กำลังอัปโหลด',\n paused: 'หยุดชั่วคราว',\n success: 'อัปโหลดแล้ว',\n error: 'ล้มเหลว',\n retry: 'ลองอีกครั้ง',\n pause: 'หยุดชั่วคราว',\n resume: 'ดำเนินการต่อ',\n cancel: 'ยกเลิก',\n remove: 'ลบ',\n removeAll: 'ลบทั้งหมด',\n preview: 'ดูตัวอย่าง',\n download: 'ดาวน์โหลด',\n edit: 'แก้ไข',\n save: 'บันทึก',\n fullscreen: 'เต็มจอ',\n rename: 'เปลี่ยนชื่อ',\n tags: 'แท็ก',\n description: 'คำอธิบาย',\n category: 'หมวดหมู่',\n addTag: 'เพิ่มแท็ก',\n fileTooLarge: 'ไฟล์มีขนาดใหญ่เกินไป',\n fileTooSmall: 'ไฟล์มีขนาดเล็กเกินไป',\n invalidType: 'ไม่อนุญาตประเภทไฟล์นี้',\n tooManyFiles: 'ไฟล์มากเกินไป',\n duplicateFile: 'ไฟล์ซ้ำ',\n speed: 'ความเร็ว',\n eta: 'เวลาที่เหลือ',\n ofText: 'จาก',\n filesText: 'ไฟล์',\n bytes: 'B',\n kb: 'KB',\n mb: 'MB',\n gb: 'GB',\n};\n\nconst he: Translations = {\n dropHere: 'גרור קבצים לכאן',\n dragOrClick: 'גרור ושחרר קבצים או לחץ לעיון',\n browse: 'עיון בקבצים',\n uploading: 'מעלה',\n paused: 'מושהה',\n success: 'הועלה',\n error: 'נכשל',\n retry: 'נסה שוב',\n pause: 'השהה',\n resume: 'המשך',\n cancel: 'בטל',\n remove: 'הסר',\n removeAll: 'הסר הכל',\n preview: 'תצוגה מקדימה',\n download: 'הורד',\n edit: 'ערוך',\n save: 'שמור',\n fullscreen: 'מסך מלא',\n rename: 'שנה שם',\n tags: 'תגיות',\n description: 'תיאור',\n category: 'קטגוריה',\n addTag: 'הוסף תגית',\n fileTooLarge: 'הקובץ גדול מדי',\n fileTooSmall: 'הקובץ קטן מדי',\n invalidType: 'סוג הקובץ אינו מותר',\n tooManyFiles: 'יותר מדי קבצים',\n duplicateFile: 'קובץ כפול',\n speed: 'מהירות',\n eta: 'זמן נותר',\n ofText: 'מתוך',\n filesText: 'קבצים',\n bytes: 'B',\n kb: 'KB',\n mb: 'MB',\n gb: 'GB',\n};\n\nconst fa: Translations = {\n dropHere: 'فایل‌ها را اینجا رها کنید',\n dragOrClick: 'فایل‌ها را بکشید و رها کنید یا برای مرور کلیک کنید',\n browse: 'مرور فایل‌ها',\n uploading: 'در حال بارگذاری',\n paused: 'متوقف شد',\n success: 'بارگذاری شد',\n error: 'ناموفق',\n retry: 'تلاش دوباره',\n pause: 'توقف',\n resume: 'ادامه',\n cancel: 'لغو',\n remove: 'حذف',\n removeAll: 'حذف همه',\n preview: 'پیش‌نمایش',\n download: 'دانلود',\n edit: 'ویرایش',\n save: 'ذخیره',\n fullscreen: 'تمام صفحه',\n rename: 'تغییر نام',\n tags: 'برچسب‌ها',\n description: 'توضیحات',\n category: 'دسته‌بندی',\n addTag: 'افزودن برچسب',\n fileTooLarge: 'فایل خیلی بزرگ است',\n fileTooSmall: 'فایل خیلی کوچک است',\n invalidType: 'نوع فایل مجاز نیست',\n tooManyFiles: 'فایل‌های زیاد',\n duplicateFile: 'فایل تکراری',\n speed: 'سرعت',\n eta: 'زمان باقی‌مانده',\n ofText: 'از',\n filesText: 'فایل',\n bytes: 'B',\n kb: 'KB',\n mb: 'MB',\n gb: 'GB',\n};\n\nexport const translations: Record<Locale, Translations> = {\n en, hi, gu, fr, de, ar, zh,\n es, pt, ru, ja, ko, it, tr, id, bn, ur, nl, pl, vi, th, he, fa,\n};\n\nexport const rtlLocales: ReadonlySet<Locale> = new Set(['ar', 'ur', 'he', 'fa']);\n","import { type ReactNode, createContext, useContext, useMemo } from 'react';\nimport type { Locale, Translations } from '../types';\nimport { translations as defaults, rtlLocales } from './translations';\n\ninterface I18nContextValue {\n locale: Locale;\n t: Translations;\n isRtl: boolean;\n}\n\nconst I18nContext = createContext<I18nContextValue | null>(null);\n\nexport interface I18nProviderProps {\n locale?: Locale;\n /** Override or extend translations for the active locale. */\n messages?: Partial<Translations>;\n children: ReactNode;\n}\n\nexport function I18nProvider({ locale = 'en', messages, children }: I18nProviderProps) {\n const value = useMemo<I18nContextValue>(() => {\n const base = defaults[locale] ?? defaults.en;\n return {\n locale,\n t: { ...base, ...messages },\n isRtl: rtlLocales.has(locale),\n };\n }, [locale, messages]);\n return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;\n}\n\nexport function useI18n(): I18nContextValue {\n const ctx = useContext(I18nContext);\n if (ctx) return ctx;\n return { locale: 'en', t: defaults.en, isRtl: false };\n}\n","import type { SVGProps } from 'react';\n\nconst base = {\n width: 16,\n height: 16,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n};\n\nexport const UploadIcon = (p: SVGProps<SVGSVGElement>) => (\n <svg {...base} {...p}>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n);\n\nexport const FileIcon = (p: SVGProps<SVGSVGElement>) => (\n <svg {...base} {...p}>\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n </svg>\n);\n\nexport const ImageIcon = (p: SVGProps<SVGSVGElement>) => (\n <svg {...base} {...p}>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <circle cx=\"9\" cy=\"9\" r=\"2\" />\n <path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\" />\n </svg>\n);\n\nexport const TrashIcon = (p: SVGProps<SVGSVGElement>) => (\n <svg {...base} {...p}>\n <polyline points=\"3 6 5 6 21 6\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n </svg>\n);\n\nexport const PauseIcon = (p: SVGProps<SVGSVGElement>) => (\n <svg {...base} {...p}>\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" />\n <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" />\n </svg>\n);\n\nexport const PlayIcon = (p: SVGProps<SVGSVGElement>) => (\n <svg {...base} {...p}>\n <polygon points=\"5 3 19 12 5 21 5 3\" />\n </svg>\n);\n\nexport const RetryIcon = (p: SVGProps<SVGSVGElement>) => (\n <svg {...base} {...p}>\n <polyline points=\"23 4 23 10 17 10\" />\n <path d=\"M20.49 15a9 9 0 1 1-2.12-9.36L23 10\" />\n </svg>\n);\n\nexport const CheckIcon = (p: SVGProps<SVGSVGElement>) => (\n <svg {...base} {...p}>\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n);\n\nexport const AlertIcon = (p: SVGProps<SVGSVGElement>) => (\n <svg {...base} {...p}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n);\n\nexport const CloseIcon = (p: SVGProps<SVGSVGElement>) => (\n <svg {...base} {...p}>\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n);\n\nexport const DownloadIcon = (p: SVGProps<SVGSVGElement>) => (\n <svg {...base} {...p}>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </svg>\n);\n\nexport const EyeIcon = (p: SVGProps<SVGSVGElement>) => (\n <svg {...base} {...p}>\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n);\n\nexport const FolderIcon = (p: SVGProps<SVGSVGElement>) => (\n <svg {...base} {...p}>\n <path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\n </svg>\n);\n\nexport const EditIcon = (p: SVGProps<SVGSVGElement>) => (\n <svg {...base} {...p}>\n <path d=\"M12 20h9\" />\n <path d=\"M16.5 3.5a2.121 2.121 0 1 1 3 3L7 19l-4 1 1-4z\" />\n </svg>\n);\n\nexport const MaximizeIcon = (p: SVGProps<SVGSVGElement>) => (\n <svg {...base} {...p}>\n <path d=\"M8 3H5a2 2 0 0 0-2 2v3\" />\n <path d=\"M21 8V5a2 2 0 0 0-2-2h-3\" />\n <path d=\"M3 16v3a2 2 0 0 0 2 2h3\" />\n <path d=\"M16 21h3a2 2 0 0 0 2-2v-3\" />\n </svg>\n);\n\nexport const TagIcon = (p: SVGProps<SVGSVGElement>) => (\n <svg {...base} {...p}>\n <path d=\"M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z\" />\n <line x1=\"7\" y1=\"7\" x2=\"7.01\" y2=\"7\" />\n </svg>\n);\n","import { type ReactNode, useEffect } from 'react';\nimport { useI18n } from '../i18n/I18nProvider';\nimport { cn } from '../utils/cn';\nimport { CloseIcon } from './icons';\n\nexport interface UploadModalProps {\n open: boolean;\n onClose: () => void;\n title?: ReactNode;\n description?: ReactNode;\n /** Children render inside the modal body. Typically a <Dropzone /> + gallery. */\n children: ReactNode;\n /** Wider modal for galleries. */\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n /** Hide the close button. */\n hideClose?: boolean;\n className?: string;\n}\n\nconst sizeClasses: Record<NonNullable<UploadModalProps['size']>, string> = {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-2xl',\n xl: 'max-w-4xl',\n full: 'max-w-[95vw]',\n};\n\n/**\n * SSR-safe modal with a backdrop, ESC-to-close, focus trap (basic), and\n * scroll lock. Mounted via React portal to document.body when available;\n * renders nothing on the server.\n */\nexport function UploadModal({\n open,\n onClose,\n title,\n description,\n children,\n size = 'lg',\n hideClose,\n className,\n}: UploadModalProps) {\n const { t } = useI18n();\n\n useEffect(() => {\n if (!open) return;\n const prev = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handler);\n return () => {\n document.body.style.overflow = prev;\n document.removeEventListener('keydown', handler);\n };\n }, [open, onClose]);\n\n if (!open || typeof document === 'undefined') return null;\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={typeof title === 'string' ? title : 'Upload'}\n className=\"fixed inset-0 z-[1000] flex items-center justify-center p-4\"\n >\n <div\n className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\"\n onClick={onClose}\n aria-hidden\n />\n <div\n className={cn(\n 'relative w-full overflow-hidden rounded-rup border border-rup-border bg-rup-bg text-rup-fg shadow-rup',\n sizeClasses[size],\n className,\n )}\n >\n {(title || !hideClose) && (\n <div className=\"flex items-center justify-between border-b border-rup-border px-5 py-3\">\n <div>\n {title && <h2 className=\"text-base font-semibold\">{title}</h2>}\n {description && (\n <p className=\"mt-0.5 text-xs text-rup-muted\">{description}</p>\n )}\n </div>\n {!hideClose && (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label={t.cancel}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md text-rup-muted hover:bg-rup-border/40 hover:text-rup-fg\"\n >\n <CloseIcon width={16} height={16} />\n </button>\n )}\n </div>\n )}\n <div className=\"max-h-[80vh] overflow-y-auto p-5\">{children}</div>\n </div>\n </div>\n );\n}\n","import { type KeyboardEvent, useEffect, useState } from 'react';\nimport { useI18n } from '../i18n/I18nProvider';\nimport type { FileMetadata, UploadFile } from '../types';\nimport { cn } from '../utils/cn';\nimport { CloseIcon, TagIcon } from './icons';\nimport { UploadModal } from './UploadModal';\n\nexport interface FileEditModalProps {\n file: UploadFile | null;\n onClose: () => void;\n /** Persist a new name (rename). */\n onRename?: (file: UploadFile, newName: string) => void;\n /** Persist metadata (tags / category / description / custom fields). */\n onSave?: (file: UploadFile, metadata: FileMetadata) => void;\n}\n\n/**\n * Modal for editing a single file's name + metadata. Drives the library's\n * built-in `rename()` / `setMetadata()` queue methods when wired through\n * UploadGallery, but the form itself is presentational — pass `onRename` /\n * `onSave` to integrate with your own state.\n */\nexport function FileEditModal({ file, onClose, onRename, onSave }: FileEditModalProps) {\n const { t } = useI18n();\n const [name, setName] = useState('');\n const [category, setCategory] = useState('');\n const [description, setDescription] = useState('');\n const [tags, setTags] = useState<string[]>([]);\n const [tagDraft, setTagDraft] = useState('');\n\n useEffect(() => {\n if (!file) return;\n setName(file.name);\n setCategory(typeof file.metadata.category === 'string' ? file.metadata.category : '');\n setDescription(\n typeof file.metadata.description === 'string' ? file.metadata.description : '',\n );\n setTags(Array.isArray(file.metadata.tags) ? [...file.metadata.tags] : []);\n setTagDraft('');\n }, [file]);\n\n const commitTagDraft = () => {\n const next = tagDraft.trim();\n if (!next) return;\n if (tags.includes(next)) {\n setTagDraft('');\n return;\n }\n setTags((prev) => [...prev, next]);\n setTagDraft('');\n };\n\n const onTagKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault();\n commitTagDraft();\n } else if (e.key === 'Backspace' && tagDraft === '' && tags.length > 0) {\n setTags((prev) => prev.slice(0, -1));\n }\n };\n\n const handleSave = () => {\n if (!file) return;\n if (name && name !== file.name) onRename?.(file, name);\n onSave?.(file, { category: category || undefined, description: description || undefined, tags });\n onClose();\n };\n\n return (\n <UploadModal open={!!file} onClose={onClose} title={t.edit} size=\"md\" hideClose>\n {file && (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-xs text-rup-muted\">\n {file.size > 0\n ? new Intl.NumberFormat().format(file.size) + ' bytes'\n : ''}{' '}\n · {file.type || 'unknown'}\n </p>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label={t.cancel}\n className=\"inline-flex h-7 w-7 items-center justify-center rounded-md text-rup-muted hover:bg-rup-border/40 hover:text-rup-fg\"\n >\n <CloseIcon width={14} height={14} />\n </button>\n </div>\n\n <Field label={t.rename}>\n <input\n value={name}\n onChange={(e) => setName(e.target.value)}\n className={inputCls}\n autoFocus\n />\n </Field>\n\n <Field label={t.category}>\n <input\n value={category}\n onChange={(e) => setCategory(e.target.value)}\n placeholder=\"e.g. invoices\"\n className={inputCls}\n />\n </Field>\n\n <Field label={t.tags}>\n <div className=\"flex flex-wrap items-center gap-1.5 rounded-rup border border-rup-border bg-rup-bg p-2\">\n {tags.map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center gap-1 rounded-full bg-rup-accent/15 px-2 py-0.5 text-xs text-rup-accent\"\n >\n <TagIcon width={10} height={10} />\n {tag}\n <button\n type=\"button\"\n onClick={() => setTags((prev) => prev.filter((x) => x !== tag))}\n className=\"ml-0.5 text-rup-accent hover:opacity-70\"\n aria-label={`${t.remove} ${tag}`}\n >\n <CloseIcon width={10} height={10} />\n </button>\n </span>\n ))}\n <input\n value={tagDraft}\n onChange={(e) => setTagDraft(e.target.value)}\n onKeyDown={onTagKeyDown}\n onBlur={commitTagDraft}\n placeholder={t.addTag}\n className=\"min-w-[80px] flex-1 bg-transparent text-sm text-rup-fg outline-none placeholder:text-rup-muted\"\n />\n </div>\n </Field>\n\n <Field label={t.description}>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n rows={3}\n className={cn(inputCls, 'resize-none')}\n />\n </Field>\n\n <div className=\"mt-2 flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-md border border-rup-border bg-rup-bg px-4 py-2 text-sm text-rup-fg hover:bg-rup-border/30\"\n >\n {t.cancel}\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n className=\"rounded-md bg-rup-accent px-4 py-2 text-sm font-medium text-rup-accent-fg hover:opacity-90\"\n >\n {t.save}\n </button>\n </div>\n </div>\n )}\n </UploadModal>\n );\n}\n\nconst inputCls =\n 'w-full rounded-rup border border-rup-border bg-rup-bg px-3 py-2 text-sm text-rup-fg placeholder:text-rup-muted focus:outline-none focus:ring-2 focus:ring-rup-accent';\n\nfunction Field({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-rup-muted\">{label}</span>\n {children}\n </label>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { useFilePreview } from '../hooks/useFilePreview';\nimport { useI18n } from '../i18n/I18nProvider';\nimport type { UploadFile } from '../types';\nimport { cn } from '../utils/cn';\nimport { CloseIcon, DownloadIcon } from './icons';\nimport { UploadModal } from './UploadModal';\n\nexport interface FilePreviewModalProps {\n file: UploadFile | null;\n onClose: () => void;\n /** Override download handler. By default, triggers a browser download of the local File. */\n onDownload?: (file: UploadFile) => void;\n}\n\n/**\n * Full-screen preview modal supporting images (with zoom/rotate), videos,\n * audio, PDFs (iframe), and text files. Office files fall back to a generic\n * \"open in new tab\" affordance because rendering DOCX/XLSX/PPTX client-side\n * is out of scope for this library.\n */\nexport function FilePreviewModal({ file, onClose, onDownload }: FilePreviewModalProps) {\n const { t } = useI18n();\n const preview = useFilePreview(file);\n const [zoom, setZoom] = useState(1);\n const [rotate, setRotate] = useState(0);\n\n useEffect(() => {\n setZoom(1);\n setRotate(0);\n }, [file?.id]);\n\n const handleDownload = () => {\n if (!file) return;\n if (onDownload) {\n onDownload(file);\n return;\n }\n const url = URL.createObjectURL(file.file);\n const a = document.createElement('a');\n a.href = url;\n a.download = file.name;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n };\n\n return (\n <UploadModal open={!!file} onClose={onClose} title={file?.name} size=\"xl\" hideClose>\n {file && (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center justify-end gap-2\">\n {preview.kind === 'image' && (\n <>\n <ZoomButton onClick={() => setZoom((z) => Math.max(0.2, z - 0.2))}>−</ZoomButton>\n <span className=\"text-xs text-rup-muted\">{Math.round(zoom * 100)}%</span>\n <ZoomButton onClick={() => setZoom((z) => Math.min(5, z + 0.2))}>+</ZoomButton>\n <ZoomButton onClick={() => setRotate((r) => (r + 90) % 360)}>↻</ZoomButton>\n </>\n )}\n <button\n type=\"button\"\n onClick={handleDownload}\n className=\"inline-flex items-center gap-1 rounded-md border border-rup-border px-3 py-1.5 text-xs hover:bg-rup-border/30\"\n >\n <DownloadIcon width={14} height={14} />\n {t.download}\n </button>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label={t.cancel}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md text-rup-muted hover:bg-rup-border/40 hover:text-rup-fg\"\n >\n <CloseIcon width={16} height={16} />\n </button>\n </div>\n <div className=\"flex min-h-[40vh] items-center justify-center overflow-auto rounded-rup bg-rup-border/20 p-4\">\n {renderPreview({ preview, file, zoom, rotate })}\n </div>\n </div>\n )}\n </UploadModal>\n );\n}\n\nfunction renderPreview({\n preview,\n file,\n zoom,\n rotate,\n}: {\n preview: ReturnType<typeof useFilePreview>;\n file: UploadFile;\n zoom: number;\n rotate: number;\n}) {\n if (preview.loading) {\n return <div className=\"text-sm text-rup-muted\">Loading…</div>;\n }\n if (preview.error) {\n return <div className=\"text-sm text-rup-error\">{preview.error}</div>;\n }\n if (preview.kind === 'image' && preview.url) {\n return (\n <img\n src={preview.url}\n alt={file.name}\n style={{ transform: `scale(${zoom}) rotate(${rotate}deg)` }}\n className=\"max-h-[70vh] origin-center select-none transition-transform\"\n />\n );\n }\n if (preview.kind === 'video' && preview.url) {\n return <video src={preview.url} controls className=\"max-h-[70vh]\" />;\n }\n if (preview.kind === 'audio' && preview.url) {\n return <audio src={preview.url} controls className=\"w-full\" />;\n }\n if (preview.kind === 'pdf' && preview.url) {\n return <iframe src={preview.url} title={file.name} className=\"h-[70vh] w-full rounded border-0\" />;\n }\n if (preview.kind === 'text' && typeof preview.text === 'string') {\n return (\n <pre className=\"max-h-[70vh] w-full overflow-auto whitespace-pre-wrap break-words rounded bg-rup-bg p-4 text-xs\">\n {preview.text}\n </pre>\n );\n }\n return (\n <div className=\"flex flex-col items-center gap-2 text-sm text-rup-muted\">\n <span>No inline preview available for this file type.</span>\n {preview.url && (\n <a\n href={preview.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-rup-accent underline\"\n >\n Open in new tab\n </a>\n )}\n </div>\n );\n}\n\nfunction ZoomButton({ children, onClick }: { children: React.ReactNode; onClick: () => void }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n 'h-8 w-8 rounded-md border border-rup-border bg-rup-bg text-sm text-rup-fg hover:bg-rup-border/30',\n )}\n >\n {children}\n </button>\n );\n}\n","import { type HTMLAttributes } from 'react';\nimport { cn } from '../utils/cn';\nimport { formatPercent } from '../utils/format';\n\nexport type ProgressVariant =\n | 'bar'\n | 'striped'\n | 'circle'\n | 'minimal'\n | 'gradient'\n | 'segmented'\n | 'dots';\n\nexport interface UploadProgressProps extends HTMLAttributes<HTMLDivElement> {\n /** Progress 0..1 */\n value: number;\n /** Visual variant. */\n variant?: ProgressVariant;\n /** Show the percentage label. */\n showLabel?: boolean;\n /** Size in px for circle/dots variants, height in px for bar variants. */\n size?: number;\n /** Color overrides via Tailwind classes (e.g., 'bg-emerald-500'). */\n fillClassName?: string;\n /** Track color override. */\n trackClassName?: string;\n /** Marks the upload as indeterminate (no known progress). */\n indeterminate?: boolean;\n /** Number of segments for segmented/dots variants (default 10). */\n segments?: number;\n}\n\nconst SEGMENT_COUNT = 10;\n\n/**\n * Single-file progress visualization. Pure presentational — does not subscribe\n * to the queue. Multiple visual variants supported; choose via `variant`.\n */\nexport function UploadProgress({\n value,\n variant = 'bar',\n showLabel = false,\n size,\n fillClassName,\n trackClassName,\n indeterminate = false,\n segments = SEGMENT_COUNT,\n className,\n ...rest\n}: UploadProgressProps) {\n const pct = Math.max(0, Math.min(1, value));\n const roundedPct = Math.round(pct * 100);\n\n // ─── Circle ───\n if (variant === 'circle') {\n const dim = size ?? 48;\n const stroke = Math.max(3, Math.floor(dim / 12));\n const radius = (dim - stroke) / 2;\n const circumference = 2 * Math.PI * radius;\n const offset = indeterminate ? circumference * 0.75 : circumference * (1 - pct);\n return (\n <div\n className={cn('relative inline-flex items-center justify-center', className)}\n style={{ width: dim, height: dim }}\n role=\"progressbar\"\n aria-valuenow={indeterminate ? undefined : roundedPct}\n aria-valuemin={0}\n aria-valuemax={100}\n {...rest}\n >\n <svg width={dim} height={dim} className={indeterminate ? 'animate-spin' : ''}>\n <circle\n cx={dim / 2}\n cy={dim / 2}\n r={radius}\n stroke=\"currentColor\"\n strokeWidth={stroke}\n fill=\"none\"\n className={cn('text-rup-border', trackClassName)}\n />\n <circle\n cx={dim / 2}\n cy={dim / 2}\n r={radius}\n stroke=\"currentColor\"\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n fill=\"none\"\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n transform={`rotate(-90 ${dim / 2} ${dim / 2})`}\n className={cn('text-rup-accent transition-[stroke-dashoffset] duration-300', fillClassName)}\n />\n </svg>\n {showLabel && (\n <span className=\"absolute text-xs font-medium text-rup-fg\">{formatPercent(pct)}</span>\n )}\n </div>\n );\n }\n\n // ─── Segmented (battery-style blocks) ───\n if (variant === 'segmented') {\n const filled = Math.round(pct * segments);\n return (\n <div\n className={cn('flex items-center gap-2', className)}\n role=\"progressbar\"\n aria-valuenow={roundedPct}\n aria-valuemin={0}\n aria-valuemax={100}\n {...rest}\n >\n <div className=\"flex flex-1 items-center gap-[3px]\">\n {Array.from({ length: segments }).map((_, i) => (\n <div\n key={i}\n className={cn(\n 'h-2 flex-1 rounded-sm transition-colors duration-200',\n i < filled ? 'bg-rup-accent' : 'bg-rup-border/60',\n fillClassName && i < filled && fillClassName,\n )}\n />\n ))}\n </div>\n {showLabel && (\n <span className=\"min-w-[3ch] text-right text-xs tabular-nums text-rup-muted\">\n {formatPercent(pct)}\n </span>\n )}\n </div>\n );\n }\n\n // ─── Dots ───\n if (variant === 'dots') {\n const filled = Math.round(pct * segments);\n return (\n <div\n className={cn('flex items-center gap-2', className)}\n role=\"progressbar\"\n aria-valuenow={roundedPct}\n aria-valuemin={0}\n aria-valuemax={100}\n {...rest}\n >\n <div className=\"flex flex-1 items-center justify-between gap-1\">\n {Array.from({ length: segments }).map((_, i) => (\n <span\n key={i}\n className={cn(\n 'h-2 w-2 rounded-full transition-all duration-200',\n i < filled ? 'bg-rup-accent scale-110' : 'bg-rup-border/60',\n fillClassName && i < filled && fillClassName,\n )}\n />\n ))}\n </div>\n {showLabel && (\n <span className=\"min-w-[3ch] text-right text-xs tabular-nums text-rup-muted\">\n {formatPercent(pct)}\n </span>\n )}\n </div>\n );\n }\n\n // ─── Linear (bar / striped / minimal / gradient) ───\n const isMinimal = variant === 'minimal';\n const isGradient = variant === 'gradient';\n const isStriped = variant === 'striped';\n const height = size ?? (isMinimal ? 2 : isStriped ? 10 : 6);\n\n return (\n <div\n className={cn('flex items-center gap-2', className)}\n role=\"progressbar\"\n aria-valuenow={indeterminate ? undefined : roundedPct}\n aria-valuemin={0}\n aria-valuemax={100}\n {...rest}\n >\n <div\n className={cn(\n 'relative w-full overflow-hidden bg-rup-border/60',\n isMinimal ? 'rounded-none' : 'rounded-full',\n trackClassName,\n )}\n style={{ height }}\n >\n <div\n className={cn(\n 'absolute inset-y-0 left-0 transition-[width] duration-300',\n isMinimal ? 'rounded-none' : 'rounded-full',\n isGradient\n ? 'bg-gradient-to-r from-indigo-500 via-purple-500 to-pink-500'\n : 'bg-rup-accent',\n isStriped &&\n 'bg-[linear-gradient(45deg,rgba(255,255,255,0.18)_25%,transparent_25%,transparent_50%,rgba(255,255,255,0.18)_50%,rgba(255,255,255,0.18)_75%,transparent_75%,transparent)] bg-[length:1rem_1rem] animate-[rup-shimmer_1s_linear_infinite]',\n indeterminate && 'w-1/3 animate-[rup-shimmer_1.4s_linear_infinite]',\n fillClassName,\n )}\n style={{ width: indeterminate ? undefined : `${pct * 100}%` }}\n />\n </div>\n {showLabel && (\n <span className=\"min-w-[3ch] text-right text-xs tabular-nums text-rup-muted\">\n {formatPercent(pct)}\n </span>\n )}\n </div>\n );\n}\n","import { type HTMLAttributes, useMemo, useState } from 'react';\nimport { useI18n } from '../i18n/I18nProvider';\nimport type { UploadFile } from '../types';\nimport { formatBytes, formatSpeed, formatEta, getFileCategory } from '../utils';\nimport { cn } from '../utils/cn';\nimport {\n AlertIcon,\n CheckIcon,\n CloseIcon,\n DownloadIcon,\n EyeIcon,\n FileIcon,\n ImageIcon,\n PauseIcon,\n PlayIcon,\n RetryIcon,\n TrashIcon,\n EditIcon,\n} from './icons';\nimport { UploadProgress, type ProgressVariant } from './UploadProgress';\n\ntype DivAttrs = Omit<HTMLAttributes<HTMLDivElement>, 'onPause' | 'onResume' | 'onAbort'>;\n\nexport interface UploadPreviewProps extends DivAttrs {\n file: UploadFile;\n /** Layout density. */\n density?: 'compact' | 'comfortable' | 'card';\n /** Show speed + ETA while uploading. */\n showStats?: boolean;\n /** Show thumbnail for images/video. */\n showThumb?: boolean;\n /** Override the progress visual style. */\n progressVariant?: ProgressVariant;\n /** Override progress bar height (px) or circle diameter (px). */\n progressSize?: number;\n onRetry?: (file: UploadFile) => void;\n onPause?: (file: UploadFile) => void;\n onResume?: (file: UploadFile) => void;\n onCancel?: (file: UploadFile) => void;\n onRemove?: (file: UploadFile) => void;\n onPreview?: (file: UploadFile) => void;\n onDownload?: (file: UploadFile) => void;\n onEdit?: (file: UploadFile) => void;\n}\n\n/**\n * A single row/card representing one file. Used as the building block of\n * UploadGallery and most variants.\n */\nexport function UploadPreview({\n file,\n density = 'comfortable',\n showStats = true,\n showThumb = true,\n progressVariant,\n progressSize,\n className,\n onRetry,\n onPause,\n onResume,\n onCancel,\n onRemove,\n onPreview,\n onDownload,\n onEdit,\n ...rest\n}: UploadPreviewProps) {\n const { t } = useI18n();\n const category = useMemo(() => getFileCategory(file), [file]);\n const [thumbError, setThumbError] = useState(false);\n\n const isImage = category === 'image' && file.previewUrl && showThumb && !thumbError;\n const isVideo = category === 'video' && file.previewUrl && showThumb && !thumbError;\n\n const isUploading = file.status === 'uploading';\n const isPaused = file.status === 'paused';\n const isErr = file.status === 'error';\n const isOk = file.status === 'success';\n\n const showProgress = isUploading || isPaused || file.progress > 0;\n\n // Default progress variant: striped while uploading, plain bar otherwise.\n const resolvedProgressVariant: ProgressVariant =\n progressVariant ?? (isPaused ? 'bar' : isUploading ? 'striped' : 'bar');\n\n return (\n <div\n className={cn(\n 'group relative flex items-center gap-3 rounded-rup border border-rup-border bg-rup-bg p-3 text-rup-fg',\n density === 'compact' && 'p-2 gap-2',\n density === 'card' && 'flex-col items-stretch p-4',\n isErr && 'border-rup-error/50',\n isOk && 'border-rup-success/50',\n className,\n )}\n data-rup-file-id={file.id}\n data-status={file.status}\n {...rest}\n >\n <div\n className={cn(\n 'flex h-12 w-12 shrink-0 items-center justify-center overflow-hidden rounded-md bg-rup-border/30 text-rup-muted',\n density === 'compact' && 'h-9 w-9',\n density === 'card' && 'h-32 w-full',\n )}\n >\n {isImage ? (\n <img\n src={file.previewUrl}\n alt={file.name}\n className=\"h-full w-full object-cover\"\n onError={() => setThumbError(true)}\n />\n ) : isVideo ? (\n <video\n src={file.previewUrl}\n className=\"h-full w-full object-cover\"\n muted\n onError={() => setThumbError(true)}\n />\n ) : category === 'image' ? (\n <ImageIcon width={20} height={20} />\n ) : (\n <FileIcon width={20} height={20} />\n )}\n </div>\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-medium\" title={file.name}>\n {file.name}\n </span>\n {isOk && <CheckIcon width={14} height={14} className=\"text-rup-success\" />}\n {isErr && <AlertIcon width={14} height={14} className=\"text-rup-error\" />}\n </div>\n <div className=\"mt-0.5 flex items-center gap-2 text-xs text-rup-muted\">\n <span>{formatBytes(file.size)}</span>\n {isUploading && showStats && (\n <>\n <span>·</span>\n <span>\n {t.speed}: {formatSpeed(file.speed)}\n </span>\n <span>·</span>\n <span>\n {t.eta}: {formatEta(file.eta)}\n </span>\n </>\n )}\n {isErr && file.error && (\n <span className=\"truncate text-rup-error\" title={file.error.message}>\n {file.error.message}\n </span>\n )}\n {isPaused && <span>{t.paused}</span>}\n </div>\n {showProgress && (\n <UploadProgress\n value={file.progress}\n variant={resolvedProgressVariant}\n size={progressSize}\n className=\"mt-2\"\n fillClassName={isErr ? 'bg-rup-error' : isOk ? 'bg-rup-success' : undefined}\n />\n )}\n </div>\n\n <div className={cn('flex items-center gap-1', density === 'card' && 'justify-end')}>\n {onPreview && (\n <IconButton onClick={() => onPreview(file)} label={t.preview}>\n <EyeIcon width={14} height={14} />\n </IconButton>\n )}\n {onEdit && (\n <IconButton onClick={() => onEdit(file)} label={t.edit ?? 'Edit'}>\n <EditIcon width={14} height={14} />\n </IconButton>\n )}\n {onDownload && isOk && (\n <IconButton onClick={() => onDownload(file)} label={t.download}>\n <DownloadIcon width={14} height={14} />\n </IconButton>\n )}\n {onRetry && (isErr || file.status === 'cancelled') && (\n <IconButton onClick={() => onRetry(file)} label={t.retry}>\n <RetryIcon width={14} height={14} />\n </IconButton>\n )}\n {onPause && isUploading && (\n <IconButton onClick={() => onPause(file)} label={t.pause}>\n <PauseIcon width={14} height={14} />\n </IconButton>\n )}\n {onResume && isPaused && (\n <IconButton onClick={() => onResume(file)} label={t.resume}>\n <PlayIcon width={14} height={14} />\n </IconButton>\n )}\n {onCancel && isUploading && (\n <IconButton onClick={() => onCancel(file)} label={t.cancel}>\n <CloseIcon width={14} height={14} />\n </IconButton>\n )}\n {onRemove && (\n <IconButton onClick={() => onRemove(file)} label={t.remove} danger>\n <TrashIcon width={14} height={14} />\n </IconButton>\n )}\n </div>\n </div>\n );\n}\n\nfunction IconButton({\n children,\n onClick,\n label,\n danger,\n}: {\n children: React.ReactNode;\n onClick: () => void;\n label: string;\n danger?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={label}\n title={label}\n className={cn(\n 'inline-flex h-7 w-7 items-center justify-center rounded-md text-rup-muted transition hover:bg-rup-border/40 hover:text-rup-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-rup-accent',\n danger && 'hover:bg-rup-error/10 hover:text-rup-error',\n )}\n >\n {children}\n </button>\n );\n}\n","import { type HTMLAttributes, useState } from 'react';\nimport { useI18n } from '../i18n/I18nProvider';\nimport type { FileMetadata, UploadFile } from '../types';\nimport { cn } from '../utils/cn';\nimport { FileEditModal } from './FileEditModal';\nimport { FilePreviewModal } from './FilePreviewModal';\nimport { UploadPreview, type UploadPreviewProps } from './UploadPreview';\n\nexport type GalleryLayout = 'list' | 'grid' | 'table' | 'compact';\n\ntype DivAttrs = Omit<HTMLAttributes<HTMLDivElement>, 'onSelect' | 'onPause' | 'onResume' | 'onAbort'>;\n\nexport interface UploadGalleryProps extends DivAttrs, Omit<UploadPreviewProps, 'file'> {\n files: UploadFile[];\n layout?: GalleryLayout;\n /** Allow drag-to-reorder. Requires onReorder. */\n reorderable?: boolean;\n onReorder?: (from: number, to: number) => void;\n /** Allow free-text search by filename. */\n searchable?: boolean;\n /** Allow status filter chips. */\n filterable?: boolean;\n /**\n * Enable the built-in fullscreen preview modal (images / video / pdf / text).\n * Adds an eye icon to each row. Has no effect if a custom `onPreview` is passed.\n */\n previewable?: boolean;\n /**\n * Enable the built-in edit modal (rename + metadata). Adds a pencil icon.\n * Has no effect if a custom `onEdit` is passed.\n *\n * If `onRename` / `onMetadataChange` are provided, they're called on save.\n */\n editable?: boolean;\n /** Called when the edit modal renames a file. */\n onRename?: (file: UploadFile, newName: string) => void;\n /** Called when the edit modal saves metadata. */\n onMetadataChange?: (file: UploadFile, metadata: FileMetadata) => void;\n /**\n * When the visible file count exceeds this threshold, the file list becomes\n * a scrollable region with the height set by `maxHeight` (default ~3 rows).\n * Set to 0 to disable. Recommended for long lists so the page doesn't grow\n * unbounded.\n */\n scrollAfter?: number;\n /**\n * Max CSS height for the scrollable list region. Used together with\n * `scrollAfter`. Accepts any valid CSS value ('280px', '24rem', '40vh').\n * Default: '280px' (≈ 3 comfortable rows).\n */\n maxHeight?: string;\n emptyState?: React.ReactNode;\n}\n\n/**\n * Renders a list of files using one of several layouts. Search/filter/sort\n * are built-in. Drag-to-reorder is opt-in. When `previewable` or `editable`\n * is set, the gallery also manages the corresponding modals — pass through\n * `onRename` / `onMetadataChange` to persist the changes.\n */\nexport function UploadGallery({\n files,\n layout = 'list',\n reorderable = false,\n onReorder,\n searchable = false,\n filterable = false,\n previewable = false,\n editable = false,\n onRename,\n onMetadataChange,\n scrollAfter,\n maxHeight = '280px',\n emptyState,\n className,\n density,\n showStats,\n showThumb,\n progressVariant,\n progressSize,\n onRetry,\n onPause,\n onResume,\n onCancel,\n onRemove,\n onPreview,\n onDownload,\n onEdit,\n ...rest\n}: UploadGalleryProps) {\n const { t } = useI18n();\n const [query, setQuery] = useState('');\n const [filter, setFilter] = useState<'all' | 'uploading' | 'success' | 'error'>('all');\n const [dragIndex, setDragIndex] = useState<number | null>(null);\n\n // Built-in modal state (only used when previewable/editable is true and no\n // custom handler was passed).\n const [previewFile, setPreviewFile] = useState<UploadFile | null>(null);\n const [editFile, setEditFile] = useState<UploadFile | null>(null);\n\n const resolvedOnPreview =\n onPreview ?? (previewable ? (f: UploadFile) => setPreviewFile(f) : undefined);\n const resolvedOnEdit =\n onEdit ?? (editable ? (f: UploadFile) => setEditFile(f) : undefined);\n\n const visible = files.filter((f) => {\n if (query && !f.name.toLowerCase().includes(query.toLowerCase())) return false;\n if (filter === 'uploading' && f.status !== 'uploading' && f.status !== 'queued') return false;\n if (filter === 'success' && f.status !== 'success') return false;\n if (filter === 'error' && f.status !== 'error' && f.status !== 'cancelled') return false;\n return true;\n });\n\n // Kick the list into a bounded scroll region once we cross the threshold.\n // Threshold of 0 or undefined disables the behavior entirely.\n const shouldScroll =\n typeof scrollAfter === 'number' && scrollAfter > 0 && visible.length > scrollAfter;\n\n const wrapDrag = (index: number) =>\n reorderable && onReorder\n ? {\n draggable: true,\n onDragStart: (e: React.DragEvent) => {\n e.dataTransfer.effectAllowed = 'move';\n setDragIndex(index);\n },\n onDragOver: (e: React.DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n },\n onDrop: (e: React.DragEvent) => {\n e.preventDefault();\n if (dragIndex === null || dragIndex === index) return;\n onReorder(dragIndex, index);\n setDragIndex(null);\n },\n onDragEnd: () => setDragIndex(null),\n }\n : {};\n\n if (files.length === 0 && emptyState) {\n return <div className={cn('text-sm text-rup-muted', className)}>{emptyState}</div>;\n }\n\n return (\n <div className={cn('flex flex-col gap-3', className)} {...rest}>\n {(searchable || filterable) && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {searchable && (\n <input\n type=\"search\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search…\"\n className=\"h-9 flex-1 min-w-[180px] rounded-rup border border-rup-border bg-rup-bg px-3 text-sm text-rup-fg placeholder:text-rup-muted focus:outline-none focus:ring-2 focus:ring-rup-accent\"\n />\n )}\n {filterable && (\n <div className=\"flex items-center gap-1\">\n {(['all', 'uploading', 'success', 'error'] as const).map((key) => (\n <button\n key={key}\n type=\"button\"\n onClick={() => setFilter(key)}\n className={cn(\n 'rounded-full px-3 py-1 text-xs font-medium capitalize transition',\n filter === key\n ? 'bg-rup-accent text-rup-accent-fg'\n : 'bg-rup-border/30 text-rup-muted hover:bg-rup-border/60',\n )}\n >\n {key === 'all'\n ? 'All'\n : key === 'uploading'\n ? t.uploading\n : key === 'success'\n ? t.success\n : t.error}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n <ScrollWrapper active={shouldScroll} maxHeight={maxHeight}>\n <div\n className={cn(\n layout === 'list' && 'flex flex-col gap-2',\n layout === 'compact' && 'flex flex-col gap-1',\n layout === 'grid' && 'grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-4',\n layout === 'table' && 'overflow-hidden rounded-rup border border-rup-border',\n )}\n >\n {visible.map((f, i) => (\n <div key={f.id} {...wrapDrag(i)}>\n <UploadPreview\n file={f}\n density={\n density ?? (layout === 'grid' ? 'card' : layout === 'compact' ? 'compact' : 'comfortable')\n }\n showStats={showStats}\n showThumb={showThumb}\n progressVariant={progressVariant}\n progressSize={progressSize}\n onRetry={onRetry}\n onPause={onPause}\n onResume={onResume}\n onCancel={onCancel}\n onRemove={onRemove}\n onPreview={resolvedOnPreview}\n onDownload={onDownload}\n onEdit={resolvedOnEdit}\n className={cn(layout === 'table' && 'rounded-none border-x-0 border-t-0 last:border-b-0')}\n />\n </div>\n ))}\n </div>\n </ScrollWrapper>\n\n {/* Built-in modals — only mount when actually opened, and only if the\n caller didn't pass a custom handler (which would suppress the\n internal state altogether). */}\n {previewable && !onPreview && (\n <FilePreviewModal file={previewFile} onClose={() => setPreviewFile(null)} />\n )}\n {editable && !onEdit && (\n <FileEditModal\n file={editFile}\n onClose={() => setEditFile(null)}\n onRename={onRename}\n onSave={onMetadataChange}\n />\n )}\n </div>\n );\n}\n\n/**\n * Conditionally wraps children in a bounded, vertically-scrollable region.\n * Used by UploadGallery to cap the list height once `scrollAfter` is crossed.\n * Renders as a pass-through fragment when inactive so layouts stay unchanged.\n */\nfunction ScrollWrapper({\n active,\n maxHeight,\n children,\n}: {\n active: boolean;\n maxHeight: string;\n children: React.ReactNode;\n}) {\n if (!active) return <>{children}</>;\n return (\n <div\n className=\"rup-scrollbar overflow-y-auto pr-1\"\n style={{ maxHeight, scrollbarGutter: 'stable' }}\n >\n {children}\n </div>\n );\n}\n"]}