zentrixui
Version:
ZentrixUI - A modern, highly customizable and accessible React file upload component library with multiple variants, JSON-based configuration, and excellent developer experience.
1 lines • 433 kB
Source Map (JSON)
{"version":3,"file":"file-upload-tgTAdTQa.cjs","sources":["../../src/lib/components/file-upload/file-upload-context.tsx","../../node_modules/lucide-react/dist/esm/shared/src/utils.js","../../node_modules/lucide-react/dist/esm/defaultAttributes.js","../../node_modules/lucide-react/dist/esm/Icon.js","../../node_modules/lucide-react/dist/esm/createLucideIcon.js","../../node_modules/lucide-react/dist/esm/icons/circle-alert.js","../../node_modules/lucide-react/dist/esm/icons/circle-check-big.js","../../node_modules/lucide-react/dist/esm/icons/circle-question-mark.js","../../node_modules/lucide-react/dist/esm/icons/circle-x.js","../../node_modules/lucide-react/dist/esm/icons/clock.js","../../node_modules/lucide-react/dist/esm/icons/info.js","../../node_modules/lucide-react/dist/esm/icons/refresh-cw.js","../../node_modules/lucide-react/dist/esm/icons/trash-2.js","../../node_modules/lucide-react/dist/esm/icons/triangle-alert.js","../../node_modules/lucide-react/dist/esm/icons/x.js","../../src/lib/components/file-upload/error-boundary.tsx","../../node_modules/@radix-ui/react-compose-refs/dist/index.mjs","../../node_modules/@radix-ui/react-slot/dist/index.mjs","../../node_modules/clsx/dist/clsx.mjs","../../node_modules/tailwind-merge/dist/bundle-mjs.mjs","../../src/lib/utils/cn.ts","../../src/lib/components/file-upload/progress/progress-bar.tsx","../../src/lib/components/file-upload/progress/status-indicator.tsx","../../src/lib/components/file-upload/progress/loading-spinner.tsx","../../src/lib/components/file-upload/progress/accessibility-announcer.tsx","../../src/lib/components/file-upload/error-display.tsx","../../src/lib/components/file-upload/accessibility-announcer.tsx","../../src/lib/components/file-upload/feedback/error-feedback.tsx","../../src/lib/components/file-upload/feedback/upload-feedback.tsx","../../src/lib/components/file-upload/variants/button-upload.tsx","../../src/lib/components/file-upload/variants/dropzone-upload.tsx","../../src/lib/components/file-upload/variants/preview-upload.tsx","../../src/lib/components/file-upload/variants/image-upload.tsx","../../src/lib/components/file-upload/variants/multi-file-upload.tsx","../../src/lib/components/file-upload/file-upload.tsx"],"sourcesContent":["import React, { createContext, useContext, useReducer, useCallback, useState } from 'react'\r\nimport type {\r\n FileUploadState,\r\n FileUploadConfig,\r\n UploadFile,\r\n FileUploadEventHandlers,\r\n FileUploadContextValue\r\n} from './file-upload.types'\r\nimport { processError, processErrors, ProcessedError, logError } from '../../utils/error-handling'\r\n\r\n// Initial state\r\nconst initialState: FileUploadState = {\r\n files: [],\r\n isUploading: false,\r\n progress: 0,\r\n overallProgress: 0,\r\n error: null,\r\n isDragOver: false,\r\n isDropValid: false,\r\n selectedFiles: [],\r\n rejectedFiles: [],\r\n uploadQueue: [],\r\n completedUploads: [],\r\n failedUploads: []\r\n}\r\n\r\n// Action types\r\ntype FileUploadAction =\r\n | { type: 'SET_FILES'; payload: UploadFile[] }\r\n | { type: 'ADD_FILES'; payload: UploadFile[] }\r\n | { type: 'REMOVE_FILE'; payload: string }\r\n | { type: 'UPDATE_FILE'; payload: { id: string; updates: Partial<UploadFile> } }\r\n | { type: 'SET_UPLOADING'; payload: boolean }\r\n | { type: 'SET_PROGRESS'; payload: number }\r\n | { type: 'SET_OVERALL_PROGRESS'; payload: number }\r\n | { type: 'SET_ERROR'; payload: string | null }\r\n | { type: 'SET_DRAG_OVER'; payload: boolean }\r\n | { type: 'SET_DROP_VALID'; payload: boolean }\r\n | { type: 'SET_SELECTED_FILES'; payload: File[] }\r\n | { type: 'CLEAR_ALL' }\r\n | { type: 'RESET' }\r\n\r\n// Reducer\r\nfunction fileUploadReducer(state: FileUploadState, action: FileUploadAction): FileUploadState {\r\n switch (action.type) {\r\n case 'SET_FILES':\r\n return { ...state, files: action.payload }\r\n\r\n case 'ADD_FILES':\r\n return { ...state, files: [...state.files, ...action.payload] }\r\n\r\n case 'REMOVE_FILE':\r\n return {\r\n ...state,\r\n files: state.files.filter(file => file.id !== action.payload),\r\n completedUploads: state.completedUploads.filter(id => id !== action.payload),\r\n failedUploads: state.failedUploads.filter(id => id !== action.payload),\r\n uploadQueue: state.uploadQueue.filter(id => id !== action.payload)\r\n }\r\n\r\n case 'UPDATE_FILE':\r\n return {\r\n ...state,\r\n files: state.files.map(file =>\r\n file.id === action.payload.id\r\n ? { ...file, ...action.payload.updates }\r\n : file\r\n )\r\n }\r\n\r\n case 'SET_UPLOADING':\r\n return { ...state, isUploading: action.payload }\r\n\r\n case 'SET_PROGRESS':\r\n return { ...state, progress: action.payload }\r\n\r\n case 'SET_OVERALL_PROGRESS':\r\n return { ...state, overallProgress: action.payload }\r\n\r\n case 'SET_ERROR':\r\n return { ...state, error: action.payload }\r\n\r\n case 'SET_DRAG_OVER':\r\n return { ...state, isDragOver: action.payload }\r\n\r\n case 'SET_DROP_VALID':\r\n return { ...state, isDropValid: action.payload }\r\n\r\n case 'SET_SELECTED_FILES':\r\n return { ...state, selectedFiles: action.payload }\r\n\r\n case 'CLEAR_ALL':\r\n return {\r\n ...state,\r\n files: [],\r\n selectedFiles: [],\r\n rejectedFiles: [],\r\n uploadQueue: [],\r\n completedUploads: [],\r\n failedUploads: [],\r\n error: null,\r\n progress: 0,\r\n overallProgress: 0,\r\n isUploading: false\r\n }\r\n\r\n case 'RESET':\r\n return initialState\r\n\r\n default:\r\n return state\r\n }\r\n}\r\n\r\n// Context\r\nconst FileUploadContext = createContext<FileUploadContextValue | null>(null)\r\n\r\n// Provider props\r\ninterface FileUploadProviderProps {\r\n children: React.ReactNode\r\n config: FileUploadConfig\r\n handlers?: FileUploadEventHandlers\r\n}\r\n\r\n// Provider component\r\nexport const FileUploadProvider: React.FC<FileUploadProviderProps> = ({\r\n children,\r\n config,\r\n handlers = {}\r\n}) => {\r\n const [state, dispatch] = useReducer(fileUploadReducer, initialState)\r\n const [processedErrors, setProcessedErrors] = useState<ProcessedError[]>([])\r\n\r\n // Actions\r\n const selectFiles = useCallback((files: File[]) => {\r\n dispatch({ type: 'SET_SELECTED_FILES', payload: files })\r\n\r\n // Create UploadFile objects\r\n const uploadFiles: UploadFile[] = files.map(file => ({\r\n id: `file_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`,\r\n file,\r\n status: 'pending',\r\n progress: 0,\r\n size: file.size,\r\n type: file.type,\r\n name: file.name,\r\n lastModified: file.lastModified,\r\n retryCount: 0,\r\n maxRetries: 3,\r\n startedAt: new Date()\r\n }))\r\n\r\n dispatch({ type: 'ADD_FILES', payload: uploadFiles })\r\n\r\n // Call handler if provided\r\n if (handlers.onFileSelect) {\r\n handlers.onFileSelect({\r\n type: 'select',\r\n files: uploadFiles,\r\n timestamp: new Date()\r\n })\r\n }\r\n }, [handlers])\r\n\r\n const removeFile = useCallback((fileId: string) => {\r\n const fileToRemove = state.files.find(f => f.id === fileId)\r\n if (fileToRemove) {\r\n dispatch({ type: 'REMOVE_FILE', payload: fileId })\r\n\r\n // Call handler if provided\r\n if (handlers.onFileRemove) {\r\n handlers.onFileRemove({\r\n type: 'remove',\r\n files: [fileToRemove],\r\n timestamp: new Date()\r\n })\r\n }\r\n }\r\n }, [state.files, handlers])\r\n\r\n const retryUpload = useCallback((fileId: string) => {\r\n const file = state.files.find(f => f.id === fileId)\r\n if (file) {\r\n const updatedFile = {\r\n ...file,\r\n status: 'pending' as const,\r\n progress: 0,\r\n error: undefined,\r\n retryCount: file.retryCount + 1\r\n }\r\n\r\n dispatch({\r\n type: 'UPDATE_FILE',\r\n payload: { id: fileId, updates: updatedFile }\r\n })\r\n\r\n // Call handler if provided\r\n if (handlers.onUploadRetry) {\r\n handlers.onUploadRetry({\r\n type: 'retry',\r\n files: [updatedFile],\r\n timestamp: new Date()\r\n })\r\n }\r\n }\r\n }, [state.files, handlers])\r\n\r\n const clearAll = useCallback(() => {\r\n dispatch({ type: 'CLEAR_ALL' })\r\n }, [])\r\n\r\n const uploadFiles = useCallback(async () => {\r\n const pendingFiles = state.files.filter(f => f.status === 'pending')\r\n if (pendingFiles.length === 0) return\r\n\r\n dispatch({ type: 'SET_UPLOADING', payload: true })\r\n dispatch({ type: 'SET_ERROR', payload: null })\r\n\r\n // Call upload start handler\r\n if (handlers.onUploadStart) {\r\n handlers.onUploadStart({\r\n type: 'upload',\r\n files: pendingFiles,\r\n timestamp: new Date()\r\n })\r\n }\r\n\r\n // This is a placeholder - actual upload logic will be implemented later\r\n // For now, we'll simulate the upload process\r\n for (const file of pendingFiles) {\r\n dispatch({\r\n type: 'UPDATE_FILE',\r\n payload: {\r\n id: file.id,\r\n updates: { status: 'uploading', startedAt: new Date() }\r\n }\r\n })\r\n\r\n // Simulate progress\r\n for (let progress = 0; progress <= 100; progress += 10) {\r\n await new Promise(resolve => setTimeout(resolve, 100))\r\n dispatch({\r\n type: 'UPDATE_FILE',\r\n payload: { id: file.id, updates: { progress } }\r\n })\r\n\r\n if (handlers.onUploadProgress) {\r\n handlers.onUploadProgress({\r\n type: 'progress',\r\n files: [{ ...file, progress }],\r\n timestamp: new Date()\r\n })\r\n }\r\n }\r\n\r\n // Mark as complete\r\n dispatch({\r\n type: 'UPDATE_FILE',\r\n payload: {\r\n id: file.id,\r\n updates: {\r\n status: 'success',\r\n progress: 100,\r\n completedAt: new Date()\r\n }\r\n }\r\n })\r\n\r\n if (handlers.onUploadSuccess) {\r\n handlers.onUploadSuccess({\r\n type: 'success',\r\n files: [{ ...file, status: 'success', progress: 100 }],\r\n timestamp: new Date()\r\n })\r\n }\r\n }\r\n\r\n dispatch({ type: 'SET_UPLOADING', payload: false })\r\n }, [state.files, handlers])\r\n\r\n const updateProgress = useCallback((fileId: string, progress: number) => {\r\n dispatch({\r\n type: 'UPDATE_FILE',\r\n payload: { id: fileId, updates: { progress } }\r\n })\r\n }, [])\r\n\r\n const setError = useCallback((fileId: string, error: string) => {\r\n dispatch({\r\n type: 'UPDATE_FILE',\r\n payload: {\r\n id: fileId,\r\n updates: {\r\n status: 'error',\r\n error,\r\n completedAt: new Date()\r\n }\r\n }\r\n })\r\n\r\n const file = state.files.find(f => f.id === fileId)\r\n if (file && handlers.onUploadError) {\r\n handlers.onUploadError({\r\n type: 'error',\r\n files: [{ ...file, status: 'error', error }],\r\n timestamp: new Date()\r\n })\r\n }\r\n }, [state.files, handlers])\r\n\r\n const setSuccess = useCallback((fileId: string) => {\r\n dispatch({\r\n type: 'UPDATE_FILE',\r\n payload: {\r\n id: fileId,\r\n updates: {\r\n status: 'success',\r\n progress: 100,\r\n completedAt: new Date()\r\n }\r\n }\r\n })\r\n }, [])\r\n\r\n // Enhanced error handling methods\r\n const handleError = useCallback((error: Error | string, context: {\r\n fileName?: string\r\n fileId?: string\r\n operation?: string\r\n } = {}) => {\r\n try {\r\n const processedError = processError(error, {\r\n fileName: context.fileName,\r\n operation: context.operation,\r\n timestamp: new Date()\r\n }, config)\r\n\r\n // Log the error\r\n logError(processedError, { fileId: context.fileId })\r\n\r\n // Add to processed errors list\r\n setProcessedErrors(prev => [...prev, processedError])\r\n\r\n // Update file-specific error if fileId provided\r\n if (context.fileId) {\r\n setError(context.fileId, processedError.userMessage)\r\n } else {\r\n // Set global error\r\n dispatch({ type: 'SET_ERROR', payload: processedError.userMessage })\r\n }\r\n\r\n // Call error handler if provided\r\n if (handlers.onUploadError) {\r\n const file = context.fileId ? state.files.find(f => f.id === context.fileId) : undefined\r\n handlers.onUploadError({\r\n type: 'error',\r\n files: file ? [{ ...file, status: 'error', error: processedError.userMessage }] : [],\r\n timestamp: new Date()\r\n })\r\n }\r\n\r\n return processedError\r\n } catch (processingError) {\r\n console.error('Error processing error:', processingError)\r\n const fallbackMessage = typeof error === 'string' ? error : error.message\r\n dispatch({ type: 'SET_ERROR', payload: fallbackMessage })\r\n return null\r\n }\r\n }, [config, handlers, state.files, setError])\r\n\r\n const handleValidationErrors = useCallback((errors: (Error | string)[], context: {\r\n operation?: string\r\n } = {}) => {\r\n try {\r\n const { errors: processedErrors } = processErrors(errors, {\r\n operation: context.operation,\r\n timestamp: new Date()\r\n }, config)\r\n\r\n // Log all errors\r\n processedErrors.forEach(error => logError(error))\r\n\r\n // Add to processed errors list\r\n setProcessedErrors(prev => [...prev, ...processedErrors])\r\n\r\n // Set global error with summary\r\n const errorSummary = processedErrors.length === 1\r\n ? processedErrors[0].userMessage\r\n : `${processedErrors.length} validation errors occurred`\r\n\r\n dispatch({ type: 'SET_ERROR', payload: errorSummary })\r\n\r\n return processedErrors\r\n } catch (processingError) {\r\n console.error('Error processing validation errors:', processingError)\r\n dispatch({ type: 'SET_ERROR', payload: 'Multiple validation errors occurred' })\r\n return []\r\n }\r\n }, [config])\r\n\r\n const dismissError = useCallback((errorId: string) => {\r\n setProcessedErrors(prev => prev.filter(error => error.id !== errorId))\r\n }, [])\r\n\r\n const dismissAllErrors = useCallback(() => {\r\n setProcessedErrors([])\r\n dispatch({ type: 'SET_ERROR', payload: null })\r\n }, [])\r\n\r\n const retryFailedUploads = useCallback(() => {\r\n const failedFiles = state.files.filter(f => f.status === 'error')\r\n failedFiles.forEach(file => {\r\n if (file.retryCount < file.maxRetries) {\r\n retryUpload(file.id)\r\n }\r\n })\r\n }, [state.files, retryUpload])\r\n\r\n const clearFailedUploads = useCallback(() => {\r\n const failedFileIds = state.files\r\n .filter(f => f.status === 'error')\r\n .map(f => f.id)\r\n\r\n failedFileIds.forEach(fileId => {\r\n dispatch({ type: 'REMOVE_FILE', payload: fileId })\r\n })\r\n\r\n // Clear related errors\r\n setProcessedErrors(prev =>\r\n prev.filter(error =>\r\n !failedFileIds.some(fileId => error.context.fileName ===\r\n state.files.find(f => f.id === fileId)?.name\r\n )\r\n )\r\n )\r\n }, [state.files])\r\n\r\n const contextValue: FileUploadContextValue = {\r\n state,\r\n config,\r\n processedErrors,\r\n actions: {\r\n selectFiles,\r\n removeFile,\r\n retryUpload,\r\n clearAll,\r\n uploadFiles,\r\n updateProgress,\r\n setError,\r\n setSuccess,\r\n handleError,\r\n handleValidationErrors,\r\n dismissError,\r\n dismissAllErrors,\r\n retryFailedUploads,\r\n clearFailedUploads\r\n },\r\n handlers\r\n }\r\n\r\n return (\r\n <FileUploadContext.Provider value={contextValue}>\r\n {children}\r\n </FileUploadContext.Provider>\r\n )\r\n}\r\n\r\n// Hook to use the context\r\nexport const useFileUpload = (): FileUploadContextValue => {\r\n const context = useContext(FileUploadContext)\r\n if (!context) {\r\n throw new Error('useFileUpload must be used within a FileUploadProvider')\r\n }\r\n return context\r\n}\r\n\r\n// Hook to use just the state\r\nexport const useFileUploadState = (): FileUploadState => {\r\n const { state } = useFileUpload()\r\n return state\r\n}\r\n\r\n// Hook to use just the actions\r\nexport const useFileUploadActions = () => {\r\n const { actions } = useFileUpload()\r\n return actions\r\n}\r\n\r\n// Hook to use just the config\r\nexport const useFileUploadConfig = (): FileUploadConfig => {\r\n const { config } = useFileUpload()\r\n return config\r\n}","/**\n * @license lucide-react v0.536.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n};\n\nexport { hasA11yProp, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.536.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.536.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses, hasA11yProp } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.536.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.536.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"8\", y2: \"12\", key: \"1pkeuh\" }],\n [\"line\", { x1: \"12\", x2: \"12.01\", y1: \"16\", y2: \"16\", key: \"4dfq90\" }]\n];\nconst CircleAlert = createLucideIcon(\"circle-alert\", __iconNode);\n\nexport { __iconNode, CircleAlert as default };\n//# sourceMappingURL=circle-alert.js.map\n","/**\n * @license lucide-react v0.536.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M21.801 10A10 10 0 1 1 17 3.335\", key: \"yps3ct\" }],\n [\"path\", { d: \"m9 11 3 3L22 4\", key: \"1pflzl\" }]\n];\nconst CircleCheckBig = createLucideIcon(\"circle-check-big\", __iconNode);\n\nexport { __iconNode, CircleCheckBig as default };\n//# sourceMappingURL=circle-check-big.js.map\n","/**\n * @license lucide-react v0.536.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\", key: \"1u773s\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n];\nconst CircleQuestionMark = createLucideIcon(\"circle-question-mark\", __iconNode);\n\nexport { __iconNode, CircleQuestionMark as default };\n//# sourceMappingURL=circle-question-mark.js.map\n","/**\n * @license lucide-react v0.536.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m15 9-6 6\", key: \"1uzhvr\" }],\n [\"path\", { d: \"m9 9 6 6\", key: \"z0biqf\" }]\n];\nconst CircleX = createLucideIcon(\"circle-x\", __iconNode);\n\nexport { __iconNode, CircleX as default };\n//# sourceMappingURL=circle-x.js.map\n","/**\n * @license lucide-react v0.536.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 6v6l4 2\", key: \"mmk7yg\" }],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]\n];\nconst Clock = createLucideIcon(\"clock\", __iconNode);\n\nexport { __iconNode, Clock as default };\n//# sourceMappingURL=clock.js.map\n","/**\n * @license lucide-react v0.536.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 16v-4\", key: \"1dtifu\" }],\n [\"path\", { d: \"M12 8h.01\", key: \"e9boi3\" }]\n];\nconst Info = createLucideIcon(\"info\", __iconNode);\n\nexport { __iconNode, Info as default };\n//# sourceMappingURL=info.js.map\n","/**\n * @license lucide-react v0.536.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n];\nconst RefreshCw = createLucideIcon(\"refresh-cw\", __iconNode);\n\nexport { __iconNode, RefreshCw as default };\n//# sourceMappingURL=refresh-cw.js.map\n","/**\n * @license lucide-react v0.536.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 11v6\", key: \"nco0om\" }],\n [\"path\", { d: \"M14 11v6\", key: \"outv1u\" }],\n [\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\", key: \"miytrc\" }],\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\", key: \"e791ji\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n","/**\n * @license lucide-react v0.536.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\n key: \"wmoenq\"\n }\n ],\n [\"path\", { d: \"M12 9v4\", key: \"juzpu7\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n];\nconst TriangleAlert = createLucideIcon(\"triangle-alert\", __iconNode);\n\nexport { __iconNode, TriangleAlert as default };\n//# sourceMappingURL=triangle-alert.js.map\n","/**\n * @license lucide-react v0.536.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n];\nconst X = createLucideIcon(\"x\", __iconNode);\n\nexport { __iconNode, X as default };\n//# sourceMappingURL=x.js.map\n","import React, { Component, ErrorInfo, ReactNode } from 'react'\r\nimport { AlertTriangle, RefreshCw, X } from 'lucide-react'\r\nimport { cn } from '../../utils/theme'\r\n\r\ninterface ErrorBoundaryState {\r\n hasError: boolean\r\n error: Error | null\r\n errorInfo: ErrorInfo | null\r\n errorId: string\r\n}\r\n\r\ninterface ErrorBoundaryProps {\r\n children: ReactNode\r\n fallback?: ReactNode\r\n onError?: (error: Error, errorInfo: ErrorInfo) => void\r\n showErrorDetails?: boolean\r\n className?: string\r\n}\r\n\r\nexport class FileUploadErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\r\n constructor(props: ErrorBoundaryProps) {\r\n super(props)\r\n\r\n this.state = {\r\n hasError: false,\r\n error: null,\r\n errorInfo: null,\r\n errorId: ''\r\n }\r\n }\r\n\r\n static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\r\n // Generate unique error ID for tracking\r\n const errorId = `error_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`\r\n\r\n return {\r\n hasError: true,\r\n error,\r\n errorId\r\n }\r\n }\r\n\r\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\r\n this.setState({\r\n error,\r\n errorInfo\r\n })\r\n\r\n // Call the onError callback if provided\r\n this.props.onError?.(error, errorInfo)\r\n\r\n // Log error for debugging\r\n console.error('FileUpload Error Boundary caught an error:', error, errorInfo)\r\n }\r\n\r\n handleRetry = () => {\r\n this.setState({\r\n hasError: false,\r\n error: null,\r\n errorInfo: null,\r\n errorId: ''\r\n })\r\n }\r\n\r\n handleDismiss = () => {\r\n this.setState({\r\n hasError: false,\r\n error: null,\r\n errorInfo: null,\r\n errorId: ''\r\n })\r\n }\r\n\r\n render() {\r\n if (this.state.hasError) {\r\n // If a custom fallback is provided, use it\r\n if (this.props.fallback) {\r\n return this.props.fallback\r\n }\r\n\r\n // Default error UI\r\n return (\r\n <div\r\n className={cn(\r\n 'file-upload-error-boundary',\r\n 'border border-red-200 rounded-lg p-6 bg-red-50',\r\n 'text-red-900 space-y-4',\r\n this.props.className\r\n )}\r\n role=\"alert\"\r\n aria-live=\"assertive\"\r\n aria-labelledby={`error-title-${this.state.errorId}`}\r\n aria-describedby={`error-description-${this.state.errorId}`}\r\n >\r\n <div className=\"flex items-start gap-3\">\r\n <AlertTriangle\r\n className=\"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5\"\r\n aria-hidden=\"true\"\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <h3\r\n id={`error-title-${this.state.errorId}`}\r\n className=\"text-sm font-medium text-red-800\"\r\n >\r\n Something went wrong with the file upload component\r\n </h3>\r\n <p\r\n id={`error-description-${this.state.errorId}`}\r\n className=\"mt-1 text-sm text-red-700\"\r\n >\r\n An unexpected error occurred. You can try refreshing the component or contact support if the problem persists.\r\n </p>\r\n\r\n {this.props.showErrorDetails && this.state.error && (\r\n <details className=\"mt-3\">\r\n <summary className=\"text-sm font-medium text-red-800 cursor-pointer hover:text-red-900\">\r\n Technical Details\r\n </summary>\r\n <div className=\"mt-2 p-3 bg-red-100 rounded border text-xs font-mono text-red-800 overflow-auto\">\r\n <div className=\"mb-2\">\r\n <strong>Error:</strong> {this.state.error.message}\r\n </div>\r\n <div className=\"mb-2\">\r\n <strong>Stack:</strong>\r\n <pre className=\"whitespace-pre-wrap mt-1\">{this.state.error.stack}</pre>\r\n </div>\r\n {this.state.errorInfo && (\r\n <div>\r\n <strong>Component Stack:</strong>\r\n <pre className=\"whitespace-pre-wrap mt-1\">{this.state.errorInfo.componentStack}</pre>\r\n </div>\r\n )}\r\n </div>\r\n </details>\r\n )}\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={this.handleDismiss}\r\n className=\"text-red-400 hover:text-red-500 focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2 rounded\"\r\n aria-label=\"Dismiss error\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"flex gap-3 pt-2\">\r\n <button\r\n type=\"button\"\r\n onClick={this.handleRetry}\r\n className={cn(\r\n 'inline-flex items-center gap-2 px-3 py-2 text-sm font-medium',\r\n 'text-red-700 bg-red-100 border border-red-300 rounded-md',\r\n 'hover:bg-red-200 focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2',\r\n 'transition-colors duration-200'\r\n )}\r\n >\r\n <RefreshCw className=\"w-4 h-4\" />\r\n Try Again\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => window.location.reload()}\r\n className={cn(\r\n 'inline-flex items-center px-3 py-2 text-sm font-medium',\r\n 'text-red-700 bg-transparent border border-red-300 rounded-md',\r\n 'hover:bg-red-50 focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2',\r\n 'transition-colors duration-200'\r\n )}\r\n >\r\n Refresh Page\r\n </button>\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n return this.props.children\r\n }\r\n}\r\n\r\n// Hook to create error boundary wrapper\r\nexport const withErrorBoundary = <P extends object>(\r\n Component: React.ComponentType<P>,\r\n errorBoundaryProps?: Omit<ErrorBoundaryProps, 'children'>\r\n) => {\r\n const WrappedComponent = (props: P) => (\r\n <FileUploadErrorBoundary {...errorBoundaryProps}>\r\n <Component {...props} />\r\n </FileUploadErrorBoundary>\r\n )\r\n\r\n WrappedComponent.displayName = `withErrorBoundary(${Component.displayName || Component.name})`\r\n\r\n return WrappedComponent\r\n}","// packages/react/compose-refs/src/compose-refs.tsx\nimport * as React from \"react\";\nfunction setRef(ref, value) {\n if (typeof ref === \"function\") {\n return ref(value);\n } else if (ref !== null && ref !== void 0) {\n ref.current = value;\n }\n}\nfunction composeRefs(...refs) {\n return (node) => {\n let hasCleanup = false;\n const cleanups = refs.map((ref) => {\n const cleanup = setRef(ref, node);\n if (!hasCleanup && typeof cleanup == \"function\") {\n hasCleanup = true;\n }\n return cleanup;\n });\n if (hasCleanup) {\n return () => {\n for (let i = 0; i < cleanups.length; i++) {\n const cleanup = cleanups[i];\n if (typeof cleanup == \"function\") {\n cleanup();\n } else {\n setRef(refs[i], null);\n }\n }\n };\n }\n };\n}\nfunction useComposedRefs(...refs) {\n return React.useCallback(composeRefs(...refs), refs);\n}\nexport {\n composeRefs,\n useComposedRefs\n};\n//# sourceMappingURL=index.mjs.map\n","// src/slot.tsx\nimport * as React from \"react\";\nimport { composeRefs } from \"@radix-ui/react-compose-refs\";\nimport { Fragment as Fragment2, jsx } from \"react/jsx-runtime\";\n// @__NO_SIDE_EFFECTS__\nfunction createSlot(ownerName) {\n const SlotClone = /* @__PURE__ */ createSlotClone(ownerName);\n const Slot2 = React.forwardRef((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n const childrenArray = React.Children.toArray(children);\n const slottable = childrenArray.find(isSlottable);\n if (slottable) {\n const newElement = slottable.props.children;\n const newChildren = childrenArray.map((child) => {\n if (child === slottable) {\n if (React.Children.count(newElement) > 1) return React.Children.only(null);\n return React.isValidElement(newElement) ? newElement.props.children : null;\n } else {\n return child;\n }\n });\n return /* @__PURE__ */ jsx(SlotClone, { ...slotProps, ref: forwardedRef, children: React.isValidElement(newElement) ? React.cloneElement(newElement, void 0, newChildren) : null });\n }\n return /* @__PURE__ */ jsx(SlotClone, { ...slotProps, ref: forwardedRef, children });\n });\n Slot2.displayName = `${ownerName}.Slot`;\n return Slot2;\n}\nvar Slot = /* @__PURE__ */ createSlot(\"Slot\");\n// @__NO_SIDE_EFFECTS__\nfunction createSlotClone(ownerName) {\n const SlotClone = React.forwardRef((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n if (React.isValidElement(children)) {\n const childrenRef = getElementRef(children);\n const props2 = mergeProps(slotProps, children.props);\n if (children.type !== React.Fragment) {\n props2.ref = forwardedRef ? composeRefs(forwardedRef, childrenRef) : childrenRef;\n }\n return React.cloneElement(children, props2);\n }\n return React.Children.count(children) > 1 ? React.Children.only(null) : null;\n });\n SlotClone.displayName = `${ownerName}.SlotClone`;\n return SlotClone;\n}\nvar SLOTTABLE_IDENTIFIER = Symbol(\"radix.slottable\");\n// @__NO_SIDE_EFFECTS__\nfunction createSlottable(ownerName) {\n const Slottable2 = ({ children }) => {\n return /* @__PURE__ */ jsx(Fragment2, { children });\n };\n Slottable2.displayName = `${ownerName}.Slottable`;\n Slottable2.__radixId = SLOTTABLE_IDENTIFIER;\n return Slottable2;\n}\nvar Slottable = /* @__PURE__ */ createSlottable(\"Slottable\");\nfunction isSlottable(child) {\n return React.isValidElement(child) && typeof child.type === \"function\" && \"__radixId\" in child.type && child.type.__radixId === SLOTTABLE_IDENTIFIER;\n}\nfunction mergeProps(slotProps, childProps) {\n const overrideProps = { ...childProps };\n for (const propName in childProps) {\n const slotPropValue = slotProps[propName];\n const childPropValue = childProps[propName];\n const isHandler = /^on[A-Z]/.test(propName);\n if (isHandler) {\n if (slotPropValue && childPropValue) {\n overrideProps[propName] = (...args) => {\n const result = childPropValue(...args);\n slotPropValue(...args);\n return result;\n };\n } else if (slotPropValue) {\n overrideProps[propName] = slotPropValue;\n }\n } else if (propName === \"style\") {\n overrideProps[propName] = { ...slotPropValue, ...childPropValue };\n } else if (propName === \"className\") {\n overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(\" \");\n }\n }\n return { ...slotProps, ...overrideProps };\n}\nfunction getElementRef(element) {\n let getter = Object.getOwnPropertyDescriptor(element.props, \"ref\")?.get;\n let mayWarn = getter && \"isReactWarning\" in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.ref;\n }\n getter = Object.getOwnPropertyDescriptor(element, \"ref\")?.get;\n mayWarn = getter && \"isReactWarning\" in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.props.ref;\n }\n return element.props.ref || element.ref;\n}\nexport {\n Slot as Root,\n Slot,\n Slottable,\n createSlot,\n createSlottable\n};\n//# sourceMappingURL=index.mjs.map\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","const CLASS_PART_SEPARATOR = '-';\nconst createClassGroupUtils = config => {\n const classMap = createClassMap(config);\n const {\n conflictingClassGroups,\n conflictingClassGroupModifiers\n } = config;\n const getClassGroupId = className => {\n const classParts = className.split(CLASS_PART_SEPARATOR);\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and remove it from classParts.\n if (classParts[0] === '' && classParts.length !== 1) {\n classParts.shift();\n }\n return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className);\n };\n const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {\n const conflicts = conflictingClassGroups[classGroupId] || [];\n if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {\n return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]];\n }\n return conflicts;\n };\n return {\n getClassGroupId,\n getConflictingClassGroupIds\n };\n};\nconst getGroupRecursive = (classParts, classPartObject) => {\n if (classParts.length === 0) {\n return classPartObject.classGroupId;\n }\n const currentClassPart = classParts[0];\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);\n const classGroupFromNextClassPart = nextClassPartObject ? getGroupRecursive(classParts.slice(1), nextClassPartObject) : undefined;\n if (classGroupFromNextClassPart) {\n return classGroupFromNextClassPart;\n }\n if (classPartObject.validators.length === 0) {\n return undefined;\n }\n const classRest = classParts.join(CLASS_PART_SEPARATOR);\n return classPartObject.validators.find(({\n validator\n }) => validator(classRest))?.classGroupId;\n};\nconst arbitraryPropertyRegex = /^\\[(.+)\\]$/;\nconst getGroupIdForArbitraryProperty = className => {\n if (arbitraryPropertyRegex.test(className)) {\n const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)[1];\n const property = arbitraryPropertyClassName?.substring(0, arbitraryPropertyClassName.indexOf(':'));\n if (property) {\n // I use two dots here because one dot is used as prefix for class groups in plugins\n return 'arbitrary..' + property;\n }\n }\n};\n/**\n * Exported for testing only\n */\nconst createClassMap = config => {\n const {\n theme,\n classGroups\n } = config;\n const classMap = {\n nextPart: new Map(),\n validators: []\n };\n for (const classGroupId in classGroups) {\n processClassesRecursively(classGroups[classGroupId], classMap, classGroupId, theme);\n }\n return classMap;\n};\nconst processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {\n classGroup.forEach(classDefinition => {\n if (typeof classDefinition === 'string') {\n const classPartObjectToEdit = classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition);\n classPartObjectToEdit.classGroupId = classGroupId;\n return;\n }\n if (typeof classDefinition === 'function') {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);\n return;\n }\n classPartObject.validators.push({\n validator: classDefinition,\n classGroupId\n });\n return;\n }\n Object.entries(classDefinition).forEach(([key, classGroup]) => {\n processClassesRecursively(classGroup, getPart(classPartObject, key), classGroupId, theme);\n });\n });\n};\nconst getPart = (classPartObject, path) => {\n let currentClassPartObject = classPartObject;\n path.split(CLASS_PART_SEPARATOR).forEach(pathPart => {\n if (!currentClassPartObject.nextPart.has(pathPart)) {\n currentClassPartObject.nextPart.set(pathPart, {\n nextPart: new Map(),\n validators: []\n });\n }\n currentClassPartObject = currentClassPartObject.nextPart.get(pathPart);\n });\n return currentClassPartObject;\n};\nconst isThemeGetter = func => func.isThemeGetter;\n\n// LRU cache inspired from hashlru (https://github.com/dominictarr/hashlru/blob/v1.0.4/index.js) but object replaced with Map to improve performance\nconst createLruCache = maxCacheSize => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {}\n };\n }\n let cacheSize = 0;\n let cache = new Map();\n let previousCache = new Map();\n const update = (key, value) => {\n cache.set(key, value);\n cacheSize++;\n if (cacheSize > maxCacheSize) {\n cacheSize = 0;\n previousCache = cache;\n cache = new Map();\n }\n };\n return {\n get(key) {\n let value = cache.get(key);\n if (value !== undefined) {\n return value;\n }\n if ((value = previousCache.get(key)) !== undefined) {\n update(key, value);\n return value;\n }\n },\n set(key, value) {\n if (cache.has(key)) {\n cache.set(key, value);\n } else {\n update(key, value);\n }\n }\n };\n};\nconst IMPORTANT_MODIFIER = '!';\nconst MODIFIER_SEPARATOR = ':';\nconst MODIFIER_SEPARATOR_LENGTH = MODIFIER_SEPARATOR.length;\nconst createParseClassName = config => {\n const {\n prefix,\n experimentalParseClassName\n } = config;\n /**\n * Parse class name into parts.\n *\n * Inspired by `splitAtTopLevelOnly` used in Tailwind CSS\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n */\n let parseClassName = className => {\n const modifiers = [];\n let bracketDepth = 0;\n let parenDepth = 0;\n let modifierStart = 0;\n let postfixModifierPosition;\n for (let index = 0; index < className.length; index++) {\n let currentCharacter = className[index];\n if (bracketDepth === 0 && parenDepth === 0) {\n if (currentCharacter === MODIFIER_SEPARATOR) {\n modifiers.push(className.slice(modifierStart, index));\n modifierStart = index + MODIFIER_SEPARATOR_LENGTH;\n continue;\n }\n if (currentCharacter === '/') {\n postfixModifierPosition = index;\n continue;\n }\n }\n if (currentCharacter === '[') {\n bracketDepth++;\n } else if (currentCharacter === ']') {\n bracketDepth--;\n } else if (currentCharacter === '(') {\n parenDepth++;\n } else if (currentCharacter === ')') {\n parenDepth--;\n }\n }\n const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.substring(modifierStart);\n const baseClassName = stripImportantModifier(baseClassNameWithImportantModifier);\n const hasImportantModifier = baseClassName !== baseClassNameWithImportantModifier;\n const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : undefined;\n return {\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition\n };\n };\n if (prefix) {\n const fullPrefix = prefix + MODIFIER_SEPARATOR;\n const parseClassNameOriginal = parseClassName;\n parseClassName = className => className.startsWith(fullPrefix) ? parseClassNameOriginal(className.substring(fullPrefix.length)) : {\n isExternal: true,\n modifiers: [],\n hasImportantModifier: false,\n baseClassName: className,\n maybePostfixModifierPosition: undefined\n };\n }\n if (experimentalParseClassName) {\n const parseClassNameOriginal = parseClassName;\n parseClassName = className => experimentalParseClassName({\n className,\n parseClassName: parseClassNameOriginal\n });\n }\n return parseClassName;\n};\nconst stripImportantModifier = baseClassName => {\n if (baseClassName.endsWith(IMPORTANT_MODIFIER)) {\n return baseClassName.substring(0, baseClassName.length - 1);\n }\n /**\n * In Tailwind CSS v3 the important modifier was at the start of the base class name. This is still supported for legacy reasons.\n * @see https://github.com/dcastil/tailwind-merge/issues/513#issuecomment-2614029864\n */\n if (baseClassName.startsWith(IMPORTANT_MODIFIER)) {\n return baseClassName.substring(1);\n }\n return baseClassName;\n};\n\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nconst createSortModifiers = config => {\n const orderSensitiveModifiers = Object.fromEntries(config.orderSensitiveModifiers.map(modifier => [modifier, true]));\n const sortModifiers = modifiers => {\n if (modifiers.length <= 1) {\n return modifiers;\n }\n const sortedModifiers = [];\n let unsortedModifiers = [];\n modifiers.forEach(modifier => {\n const isPositionSensitive = modifier[0] === '[' || orderSensitiveModifiers[modifier];\n if (isPositionSensitive) {\n sortedModifiers.push(...unsortedModifiers.sort(), modifier);\n unsortedModifiers = [];\n } else {\n unsortedModifiers.push(modifier);\n }\n });\n sortedModifiers.push(...unsortedModifiers.sort());\n return sortedModifiers;\n };\n return sortModifiers;\n};\nconst createConfigUtils = config => ({\n cache: createLruCache(config.cacheSize),\n parseClassName: createParseClassName(config),\n sortModifiers: createSortModifiers(config),\n ...createClassGroupUtils(config)\n});\nconst SPLIT_CLASSES_REGEX = /\\s+/;\nconst mergeClassList = (classList, configUtils) => {\n const {\n parseClassName,\n getClassGroupId,\n getConflictingClassGroupIds,\n sortModifiers\n } = configUtils;\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict = [];\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);\n let result = '';\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index];\n const {\n isExternal,\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition\n } = parseClassName(originalClassName);\n if (isExternal) {\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n let hasPostfixModifier = !!maybePostfixModifierPosition;\n let classGroupId = getClassGroupId(hasPostfixModifier ? baseClassName.substring(0, maybePostfixModifierPosition) : baseClassName);\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n classGroupId = getClassGroupId(baseClassName);\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n hasPostfixModifier = false;\n }\n const variantModifier = sortModifiers(modifiers).join(':');\n const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;\n const classId = modifierId + classGroupId;\n if (classGroupsInConflict.includes(classId)) {\n // Tailwind class omitted due to conflict\n continue;\n }\n classGroupsInConflict.push(classId);\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i];\n classGroupsInConflict.push(modifierId + group);\n }\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n }\n return result;\n};\n\n/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\nfunction twJoin() {\n let index = 0;\n let argument;\n let resolvedValue;\n let string = '';\n while (index < arguments.length) {\n if (argument = arguments[index++]) {\n if (resolvedValue = toValue(argument)) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n}\nconst toValue = mix => {\n if (typeof mix === 'string') {\n return mix;\n }\n let resolvedValue;\n let string = '';\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if (resolvedValue = toValue(mix[k])) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n};\nfunction createTailwindMerge(createConfigFirst, ...createConfigRest) {\n let configUtils;\n let cacheGet;\n let cacheSet;\n let functionToCall = initTailwindMerge;\n function initTailwindMerge(classList) {\n const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());\n configUtils = createConfigUtils(config);\n cacheGet = configUtils.cache.get;\n cacheSet = configUtils.cache.set;\n functionToCall = tailwindMerge;\n return tailwindMerge(classList);\n }\n function tailwindMerge(classList) {\n const cachedResult = cacheGet(classList);\n if (cachedResult) {\n return cachedResult;\n }\n const result = mergeClassList(classList, configUtils);\n cacheSet(classList, result);\n return result;\n }\n return function callTailwindMerge() {\n return functionToCall(twJoin.apply(null, arguments));\n };\n}\nconst fromTheme = key => {\n const themeGetter = theme => theme[key] || [];\n themeGetter.isThemeGetter = true;\n return themeGetter;\n};\nconst arbitraryValueRegex = /^\\[(?:(\\w[\\w-]*):)?(.+)\\]$/i;\nconst arbitraryVariableRegex = /^\\((?:(\\w[\\w-]*):)?(.+)\\)$/i;\nconst fractionRegex = /^\\d+\\/\\d+$/;\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/;\nconst lengthUnitRegex = /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/;\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\\(.+\\)$/;\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/;\nconst imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/;\nconst isFraction = value => fractionRegex.test(value);\nconst isNumber = value => !!value && !Number.isNaN(Number(value));\nconst isInteger = value => !!value && Number.isInteger(Number(value));\nconst isPercent = value => value.endsWith('%') && isNumber(value.slice(0, -1));\nconst isTshirtSize = value => tshirtUnitRegex.test(value);\nconst isAny = () => true;\nconst isLengthOnly = value =>\n// `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n// For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n// I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\nlengthUnitRegex.test(value) && !colorFunctionRegex.test(value);\nconst isNever = () => false;\nconst isShadow = value => shadowRegex.test(value);\nconst isImage = value => imageRegex.test(value);\nconst isAnyNonArbitrary = value => !isArbitraryValue(value) && !isArbitraryVariable(value);\nconst isArbitrarySize = value => getIsArbitraryValue(value, isLabelSize, isNever);\nconst isArbitraryValue = value => arbitraryValueRegex.test(value);\nconst isArbitraryLength = value => getIsArbitraryValue(value, isLabelLength, isLengthOnly);\nconst isArbitraryNumber = value => getIsArbitraryValue(value, isLabelNumber, isNumber);\nconst isArbitraryPosition = value => getIsArbitraryValue(value, isLabelPosition, isNever);\nconst isArbitraryImage = value => getIsArbitraryValue(value, isLabelImage, isImage);\nconst isArbitraryShadow = value => getIsArbitraryValue(value, isLabelShadow, isShadow);\nconst isArbitraryVariable = value => arbitraryVariableRegex.test(value);\nconst isArbitraryVariableLength = value => getIsArbitraryVariable(value, isLabelLength);\nconst isArbitraryVariableFamilyName = value => getIsArbitraryVariable(value, isLabelFamilyName);\nconst isArbitraryVariablePosition = value => getIsArbitraryVariable(value, isLabelPosition);\nconst isArbitraryVariableSize = value => getIsArbitraryVariable(value, isLabelSize);\nconst isArbitraryVariableImage = value => getIsArbitraryVariable(value, isLabelImage);\nconst isArbitraryVariableShadow = value => getIsArbitraryVariable(value, isLabelShadow, true);\n// Helpers\nconst getIsArbitraryValue = (value, testLabel, testValue) => {\n const result = arbitraryValueRegex.exec(value);\n if (result) {\n if (result[1]) {\n return testLabel(result[1]);\n }\n return testValue(result[2]);\n }\n return false;\n};\nconst getIsArbitraryVariable = (value, testLabel, shouldMatchNoLabel = false) => {\n const result = arbitraryVariableRegex.exec(value);\n if (result) {\n if (result[1]) {\n return testLabel(result[1]);\n }\n return shouldMatchNoLabel;\n }\n return false;\n};\n// Labels\nconst isLabelPosition = label => label === 'position' || label === 'percentage';\nconst isLabelImage = label => label === 'image' || label === 'url';\nconst isLabelSize = label => label === 'length' || label === 'size' || label === 'bg-size';\nconst isLabelLength = label => label === 'length';\nconst isLabelNumber = label => label === 'number';\nconst isLabelFamilyName = label => label === 'family-name';\nconst isLabelShadow = label => label === 'shadow';\nconst validators = /*#__PURE__*/Object.defineProperty({\n __proto__: null,\n isAny,\n isAnyNonArbitrary,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isArbitraryVariable,\n isArbitraryVariableFamilyName,\n isArbitraryVariableImage,\n isArbitraryVariableLength,\n isArbitraryVariablePosition,\n isArbitraryVariableShadow,\n isArbitraryVariableSize,\n isFraction,\n isInteger,\n isNumber,\n isPercent,\n isTshirtSize\n}, Symbol.toStringTag, {\n value: 'Module'\n});\nconst getDefaultConfig = () => {\n /**\n * Theme getters for theme variable namespaces\n * @see https://tailwindcss.com/docs/theme#theme-variable-namespaces\n */\n /***/\n const themeColor = fromTheme('color');\n const themeFont = fromTheme('font');\n const themeText = fromTheme('text');\n const themeFontWeight = fromTheme('font-weight');\n const themeTracking = fromTheme('tracking');\n const themeLeading = fromTheme('leading');\n const themeBreakpoint = fromTheme('breakpoint');\n const themeContainer = fromTheme('container');\n const themeSpacing = fromTheme('spacing');\n const themeRadius = fromTheme('radius');\n const themeShadow = fromTheme('shadow');\n const themeInsetShadow = fromTheme('inset-shadow');\n const themeTextShadow = fromTheme('text-shadow');\n const themeDropShadow = fromTheme('drop-shadow');\n const themeBlur = fromTheme('blur');\n const themePerspective = fromTheme('perspective');\n const themeAspect = fromTheme('aspect');\n const themeEase = fromTheme('ease');\n const themeAnimate = fromTheme('animate');\n /**\n * Helpers to avoid repeating the same scales\n *\n * We use functions that create a new array every time they're called instead of static arrays.\n * This ensures that users who modify any scale by mutating the array (e.g. with `array.push(element)`) don't accidentally mutate arrays in other parts of the config.\n */\n /***/\n const scaleBreak = () => ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'];\n const scalePosition = () => ['center', 'top', 'bottom', 'left', 'right', 'top-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-top', 'top-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-top', 'bottom-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-bottom', 'bottom-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-bottom'];\n const scalePositionWithArbitrary = () => [...scalePosition(), isArbitraryVariable, isArbitraryValue];\n const scaleOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'];\n const scaleOverscroll = () => ['auto', 'contain', 'none'];\n const scaleUnambiguousSpacing = () => [isArbitraryVariable, isArbitraryValue, themeSpacing];\n const scaleInset = () => [isFraction, 'full', 'auto', ...scaleUnambiguousSpacing()];\n const scaleGridTemplateColsRows = () => [isInteger, 'none', 'subgrid', isArbitraryVariable, isArbitraryValue];\n const scaleGridColRowStartAndEnd = () => ['auto', {\n span: ['full', isInteger, isArbitraryVariable, isArbitraryValue]\n }, isInteger, isArbitraryVariable, isArbitraryValue];\n const scaleGridColRowStartOrEnd = () => [isInteger, 'auto', isArbitraryVariable, isArbitraryValue];\n const scaleGridAutoColsRows = () => ['auto', 'min', 'max', 'fr', isArbitraryVariable, isArbitraryValue];\n const scaleAlignPrimaryAxis = () => ['start', 'end', 'center', 'between', 'around', 'evenly', 'stretch', 'baseline', 'center-safe', 'end-safe'];\n const scaleAlignSecondaryAxis = () => ['start', 'end', 'center', 'stretch', 'center-safe', 'end-safe'];\n const scaleMargin = () => ['auto', ...scaleUnambiguousSpacing()];\n const scaleSizing = () => [isFraction, 'auto', 'full', 'dvw', 'dvh', 'lvw', 'lvh', 'svw', 'svh', 'min', 'max', 'fit', ...scaleUnambiguousSpacing()];\n const scaleColor = () => [themeColor, isArbitraryVariable, isArbitraryValue];\n const scaleBgPosition = () => [...scalePosition(), isArbitraryVariablePosition, isArbitraryPosition, {\n position: [isArbitraryVariable, isArbitraryValue]\n }];\n const scaleBgRepeat = () => ['no-repeat', {\n repeat: ['', 'x', 'y', 'space', 'round']\n }];\n const scaleBgSize = () => ['auto', 'cover', 'contain', isArbitraryVariableSize, isArbitrarySize, {\n size: [isArbitraryVariable, isArbitraryValue]\n }];\n const scaleGradientStopPosition = () => [isPercent, isArbitraryVariableLength, isArbitraryLength];\n const scaleRadius = () => [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', 'full', themeRadius, isArbitraryVariable, isArbitraryValue];\n const scaleBorderWidth = () => ['', isNumber, isArbitraryVariableLength, isArbitraryLength];\n const scaleLineStyle = () => ['solid', 'dashed', 'dotted', 'double'];\n const scaleBlendMode = () => ['normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn', 'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity'];\n const scaleMaskImagePosition = () => [isNumber, isPercent, isArbitraryVariablePosition, isArbitraryPosition];\n const scaleBlur = () => [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeBlur, isArbitraryVariable, isArbitraryValue];\n const scaleRotate = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleScale = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleSkew = () => [isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleTranslate = () => [isFraction, 'full', ...scaleUnambiguousSpacing()];\n return {\n cacheSize: 500,\n theme: {\n animate: ['spin', 'ping', 'pulse', 'bounce'],\n aspect: ['video'],\n blur: [isTshirtSize],\n breakpoint: [isTshirtSize],\n color: [isAny],\n container: [isTshirtSize],\n 'drop-shadow': [isTshirtSize],\n ease: ['in', 'out', 'in-out'],\n font: [isAnyNonArbitrary],\n 'font-weight': ['thin', 'extralight', 'light', 'normal', 'medium', 'semibold', 'bold', 'extrabold', 'black'],\n 'inset-shadow': [isTshirtSize],\n leading: ['none', 'tight', 'snug', 'normal', 'relaxed', 'loose'],\n perspective: ['dramatic', 'near', 'normal', 'midrange', 'distant', 'none'],\n radius: [isTshirtSize],\n shadow: [isTshirtSize],\n spacing: ['px', isNumber],\n text: [isTshirtSize],\n 'text-shadow': [isTshirtSize],\n tracking: ['tighter', 'tight', 'normal', 'wide', 'wider', 'widest']\n },\n classGroups: {\n // --------------\n // --- Layout ---\n // --------------\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [{\n aspect: ['auto', 'square', isFraction, isArbitraryValue, isArbitraryVariable, themeAspect]\n }],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n * @deprecated since Tailwind CSS v4.0.0\n */\n container: ['container'],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [{\n columns: [isNumber, isArbitraryValue, isArbitraryVariable, themeContainer]\n }],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{\n 'break-after': scaleBreak()\n }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{\n 'break-before': scaleBreak()\n }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{\n 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column']\n }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{\n 'box-decoration': ['slice', 'clone']\n }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{\n box: ['border', 'content']\n }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: ['block', 'inline-block', 'inline', 'flex', 'inline-flex', 'table', 'inline-table', 'table-caption', 'table-cell', 'table-column', 'table-column-group', 'table-footer-group', 'table-header-group', 'table-row-group', 'table-row', 'flow-root', 'grid', 'inline-grid', 'contents', 'list-item', 'hidden'],\n /**\n * Screen Reader Only\n * @see https://tailwindcss.com/docs/display#screen-reader-only\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{\n float: ['right', 'left', 'none', 'start', 'end']\n }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{\n clear: ['left', 'right', 'both', 'none', 'start', 'end']\n }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{\n object: ['contain', 'cover', 'fill', 'none', 'scale-down']\n }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{\n object: scalePositionWithArbitrary()\n }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{\n overflow: scaleOverflow()\n }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{\n 'overflow-x': scaleOverflow()\n }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{\n 'overflow-y': scaleOverflow()\n }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{\n overscroll: scaleOverscroll()\n }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{\n 'overscroll-x': scaleOverscroll()\n }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{\n 'overscroll-y': scaleOverscroll()\n }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Top / Right / Bottom / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{\n inset: scaleInset()\n }],\n /**\n * Right / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{\n 'inset-x': scaleInset()\n }],\n /**\n * Top / Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{\n 'inset-y': scaleInset()\n }],\n /**\n * Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n start: [{\n start: scaleInset()\n }],\n /**\n * End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n end: [{\n end: scaleInset()\n }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{\n top: scaleInset()\n }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{\n right: scaleInset()\n }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{\n bottom: scaleInset()\n }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{\n left: scaleInset()\n }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{\n z: [isInteger, 'auto', isArbitraryVariable, isArbitraryValue]\n }],\n // ------------------------\n // --- Flexbox and Grid ---\n // ------------------------\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [{\n basis: [isFraction, 'full', 'auto', themeContainer, ...scaleUnambiguousSpacing()]\n }],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{\n flex: ['row', 'row-reverse', 'col', 'col-reverse']\n }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{\n flex: ['nowrap', 'wrap', 'wrap-reverse']\n }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{\n flex: [isNumber, isFraction, 'auto', 'initial', 'none', isArbitraryValue]\n }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{\n grow: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{\n shrink: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [{\n order: [isInteger, 'first', 'last', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{\n 'grid-cols': scaleGridTemplateColsRows()\n }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [{\n col: scaleGridColRowStartAndEnd()\n }],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{\n 'col-start': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{\n 'col-end': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{\n 'grid-rows': scaleGridTemplateColsRows()\n }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [{\n row: scaleGridColRowStartAndEnd()\n }],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{\n 'row-start': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{\n 'row-end': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{\n 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense']\n }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{\n 'auto-cols': scaleGridAutoColsRows()\n }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{\n 'auto-rows': scaleGridAutoColsRows()\n }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{\n gap: scaleUnambiguousSpacing()\n }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{\n 'gap-x': scaleUnambiguousSpacing()\n }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{\n 'gap-y': scaleUnambiguousSpacing()\n }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{\n justify: [...scaleAlignPrimaryAxis(), 'normal']\n }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{\n 'justify-items': [...scaleAlignSecondaryAxis(), 'normal']\n }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{\n 'justify-self': ['auto', ...scaleAlignSecondaryAxis()]\n }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{\n content: ['normal', ...scaleAlignPrimaryAxis()]\n }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{\n items: [...scaleAlignSecondaryAxis(), {\n baseline: ['', 'last']\n }]\n }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [{\n self: ['auto', ...scaleAlignSecondaryAxis(), {\n baseline: ['', 'last']\n }]\n }],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{\n 'place-content': scaleAlignPrimaryAxis()\n }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{\n 'place-items': [...scaleAlignSecondaryAxis(), 'baseline']\n }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{\n 'place-self': ['auto', ...scaleAlignSecondaryAxis()]\n }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{\n p: scaleUnambiguousSpacing()\n }],\n /**\n * Padding X\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{\n px: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Y\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{\n py: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{\n ps: scaleUnambiguousSpacing()\n }],\n /**\n * Padding End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{\n pe: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{\n pt: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{\n pr: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{\n pb: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{\n pl: scaleUnambiguousSpacing()\n }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{\n m: scaleMargin()\n }],\n /**\n * Margin X\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{\n mx: scaleMargin()\n }],\n /**\n * Margin Y\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{\n my: scaleMargin()\n }],\n /**\n * Margin Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{\n ms: scaleMargin()\n }],\n /**\n * Margin End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{\n me: scaleMargin()\n }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{\n mt: scaleMargin()\n }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{\n mr: scaleMargin()\n }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{\n mb: scaleMargin()\n }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{\n ml: scaleMargin()\n }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x': [{\n 'space-x': scaleUnambiguousSpacing()\n }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y': [{\n 'space-y': scaleUnambiguousSpacing()\n }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y-reverse': ['space-y-reverse'],\n // --------------\n // --- Sizing ---\n // --------------\n /**\n * Size\n * @see https://tailwindcss.com/docs/width#setting-both-width-and-height\n */\n size: [{\n size: scaleSizing()\n }],\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [{\n w: [themeContainer, 'screen', ...scaleSizing()]\n }],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [{\n 'min-w': [themeContainer, 'screen', /** Deprecated. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'none', ...scaleSizing()]\n }],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [{\n 'max-w': [themeContainer, 'screen', 'none', /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'prose', /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n {\n screen: [themeBreakpoint]\n }, ...scaleSizing()]\n }],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [{\n h: ['screen', 'lh', ...scaleSizing()]\n }],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [{\n 'min-h': ['screen', 'lh', 'none', ...scaleSizing()]\n }],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [{\n 'max-h': ['screen', 'lh', ...scaleSizing()]\n }],\n // ------------------\n // --- Typography ---\n // ------------------\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [{\n text: ['base', themeText, isArbitraryVariableLength, isArbitraryLength]\n }],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [{\n font: [themeFontWeight, isArbitraryVariable, isArbitraryNumber]\n }],\n /**\n * Font Stretch\n * @see https://tailwindcss.com/docs/font-stretch\n */\n 'font-stretch': [{\n 'font-stretch': ['ultra-condensed', 'extra-condensed', 'condensed', 'semi-condensed', 'normal', 'semi-expanded', 'expanded', 'extra-expanded', 'ultra-expanded', isPercent, isArbitraryValue]\n }],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [{\n font: [isArbitraryVariableFamilyName, isArbitraryValue, themeFont]\n }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [{\n tracking: [themeTracking, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [{\n 'line-clamp': [isNumber, 'none', isArbitraryVariable, isArbitraryNumber]\n }],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [{\n leading: [/** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n themeLeading, ...scaleUnambiguousSpacing()]\n }],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{\n 'list-image': ['none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{\n list: ['inside', 'outside']\n }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [{\n list: ['disc', 'decimal', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{\n text: ['left', 'center', 'right', 'justify', 'start', 'end']\n }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://v3.tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{\n placeholder: scaleColor()\n }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{\n text: scaleColor()\n }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{\n decoration: [...scaleLineStyle(), 'wavy']\n }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [{\n decoration: [isNumber, 'from-font', 'auto', isArbitraryVariable, isArbitraryLength]\n }],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{\n decoration: scaleColor()\n }],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [{\n 'underline-offset': [isNumber, 'auto', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{\n text: ['wrap', 'nowrap', 'balance', 'pretty']\n }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{\n indent: scaleUnambiguousSpacing()\n }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [{\n align: ['baseline', 'top', 'middle', 'bottom', 'text-top', 'text-bottom', 'sub', 'super', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [{\n whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces']\n }],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{\n break: ['normal', 'words', 'all', 'keep']\n }],\n /**\n * Overflow Wrap\n * @see https://tailwindcss.com/docs/overflow-wrap\n */\n wrap: [{\n wrap: ['break-word', 'anywhere', 'normal']\n }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{\n hyphens: ['none', 'manual', 'auto']\n }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{\n content: ['none', isArbitraryVariable, isArbitraryValue]\n }],\n // -------------------\n // --- Backgrounds ---\n // -------------------\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{\n bg: ['fixed', 'local', 'scroll']\n }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{\n 'bg-clip': ['border', 'padding', 'content', 'text']\n }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{\n 'bg-origin': ['border', 'padding', 'content']\n }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{\n bg: scaleBgPosition()\n }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{\n bg: scaleBgRepeat()\n }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{\n bg: scaleBgSize()\n }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [{\n bg: ['none', {\n linear: [{\n to: ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl']\n }, isInteger, isArbitraryVariable, isArbitraryValue],\n radial: ['', isArbitraryVariable, isArbitraryValue],\n conic: [isInteger, isArbitraryVariable, isArbitraryValue]\n }, isArbitraryVariableImage, isArbitraryImage]\n }],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{\n bg: scaleColor()\n }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{\n from: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{\n via: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{\n to: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{\n from: scaleColor()\n }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{\n via: scaleColor()\n }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{\n to: scaleColor()\n }],\n // ---------------\n // --- Borders ---\n // ---------------\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{\n rounded: scaleRadius()\n }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{\n 'rounded-s': scaleRadius()\n }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{\n 'rounded-e': scaleRadius()\n }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{\n 'rounded-t': scaleRadius()\n }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{\n 'rounded-r': scaleRadius()\n }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{\n 'rounded-b': scaleRadius()\n }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{\n 'rounded-l': scaleRadius()\n }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{\n 'rounded-ss': scaleRadius()\n }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{\n 'rounded-se': scaleRadius()\n }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{\n 'rounded-ee': scaleRadius()\n }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{\n 'rounded-es': scaleRadius()\n }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{\n 'rounded-tl': scaleRadius()\n }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{\n 'rounded-tr': scaleRadius()\n }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{\n 'rounded-br': scaleRadius()\n }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{\n 'rounded-bl': scaleRadius()\n }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{\n border: scaleBorderWidth()\n }],\n /**\n * Border Width X\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{\n 'border-x': scaleBorderWidth()\n }],\n /**\n * Border Width Y\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{\n 'border-y': scaleBorderWidth()\n }],\n /**\n * Border Width Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{\n 'border-s': scaleBorderWidth()\n }],\n /**\n * Border Width End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{\n 'border-e': scaleBorderWidth()\n }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{\n 'border-t': scaleBorderWidth()\n }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{\n 'border-r': scaleBorderWidth()\n }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{\n 'border-b': scaleBorderWidth()\n }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{\n 'border-l': scaleBorderWidth()\n }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x': [{\n 'divide-x': scaleBorderWidth()\n }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y': [{\n 'divide-y': scaleBorderWidth()\n }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{\n border: [...scaleLineStyle(), 'hidden', 'none']\n }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/border-style#setting-the-divider-style\n */\n 'divide-style': [{\n divide: [...scaleLineStyle(), 'hidden', 'none']\n }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{\n border: scaleColor()\n }],\n /**\n * Border Color X\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{\n 'border-x': scaleColor()\n }],\n /**\n * Border Color Y\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{\n 'border-y': scaleColor()\n }],\n /**\n * Border Color S\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{\n 'border-s': scaleColor()\n }],\n /**\n * Border Color E\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{\n 'border-e': scaleColor()\n }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{\n 'border-t': scaleColor()\n }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{\n 'border-r': scaleColor()\n }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{\n 'border-b': scaleColor()\n }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{\n 'border-l': scaleColor()\n }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{\n divide: scaleColor()\n }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{\n outline: [...scaleLineStyle(), 'none', 'hidden']\n }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [{\n 'outline-offset': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [{\n outline: ['', isNumber, isArbitraryVariableLength, isArbitraryLength]\n }],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{\n outline: scaleColor()\n }],\n // ---------------\n // --- Effects ---\n // ---------------\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [{\n shadow: [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-shadow-color\n */\n 'shadow-color': [{\n shadow: scaleColor()\n }],\n /**\n * Inset Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow\n */\n 'inset-shadow': [{\n 'inset-shadow': ['none', themeInsetShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Inset Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color\n */\n 'inset-shadow-color': [{\n 'inset-shadow': scaleColor()\n }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-a-ring\n */\n 'ring-w': [{\n ring: scaleBorderWidth()\n }],\n /**\n * Ring Width Inset\n * @see https://v3.tailwindcss.com/docs/ring-width#inset-rings\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-ring-color\n */\n 'ring-color': [{\n ring: scaleColor()\n }],\n /**\n * Ring Offset Width\n * @see https://v3.tailwindcss.com/docs/ring-offset-width\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-w': [{\n 'ring-offset': [isNumber, isArbitraryLength]\n }],\n /**\n * Ring Offset Color\n * @see https://v3.tailwindcss.com/docs/ring-offset-color\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-color': [{\n 'ring-offset': scaleColor()\n }],\n /**\n * Inset Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring\n */\n 'inset-ring-w': [{\n 'inset-ring': scaleBorderWidth()\n }],\n /**\n * Inset Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color\n */\n 'inset-ring-color': [{\n 'inset-ring': scaleColor()\n }],\n /**\n * Text Shadow\n * @see https://tailwindcss.com/docs/text-shadow\n */\n 'text-shadow': [{\n 'text-shadow': ['none', themeTextShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Text Shadow Color\n * @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color\n */\n 'text-shadow-color': [{\n 'text-shadow': scaleColor()\n }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{\n opacity: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{\n 'mix-blend': [...scaleBlendMode(), 'plus-darker', 'plus-lighter']\n }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{\n 'bg-blend': scaleBlendMode()\n }],\n /**\n * Mask Clip\n * @see https://tailwindcss.com/docs/mask-clip\n */\n 'mask-clip': [{\n 'mask-clip': ['border', 'padding', 'content', 'fill', 'stroke', 'view']\n }, 'mask-no-clip'],\n /**\n * Mask Composite\n * @see https://tailwindcss.com/docs/mask-composite\n */\n 'mask-composite': [{\n mask: ['add', 'subtract', 'intersect', 'exclude']\n }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image-linear-pos': [{\n 'mask-linear': [isNumber]\n }],\n 'mask-image-linear-from-pos': [{\n 'mask-linear-from': scaleMaskImagePosition()\n }],\n 'mask-image-linear-to-pos': [{\n 'mask-linear-to': scaleMaskImagePosition()\n }],\n 'mask-image-linear-from-color': [{\n 'mask-linear-from': scaleColor()\n }],\n 'mask-image-linear-to-color': [{\n 'mask-linear-to': scaleColor()\n }],\n 'mask-image-t-from-pos': [{\n 'mask-t-from': scaleMaskImagePosition()\n }],\n 'mask-image-t-to-pos': [{\n 'mask-t-to': scaleMaskImagePosition()\n }],\n 'mask-image-t-from-color': [{\n 'mask-t-from': scaleColor()\n }],\n 'mask-image-t-to-color': [{\n 'mask-t-to': scaleColor()\n }],\n 'mask-image-r-from-pos': [{\n 'mask-r-from': scaleMaskImagePosition()\n }],\n 'mask-image-r-to-pos': [{\n 'mask-r-to': scaleMaskImagePosition()\n }],\n 'mask-image-r-from-color': [{\n 'mask-r-from': scaleColor()\n }],\n 'mask-image-r-to-color': [{\n 'mask-r-to': scaleColor()\n }],\n 'mask-image-b-from-pos': [{\n 'mask-b-from': scaleMaskImagePosition()\n }],\n 'mask-image-b-to-pos': [{\n 'mask-b-to': scaleMaskImagePosition()\n }],\n 'mask-image-b-from-color': [{\n 'mask-b-from': scaleColor()\n }],\n 'mask-image-b-to-color': [{\n 'mask-b-to': scaleColor()\n }],\n 'mask-image-l-from-pos': [{\n 'mask-l-from': scaleMaskImagePosition()\n }],\n 'mask-image-l-to-pos': [{\n 'mask-l-to': scaleMaskImagePosition()\n }],\n 'mask-image-l-from-color': [{\n 'mask-l-from': scaleColor()\n }],\n 'mask-image-l-to-color': [{\n 'mask-l-to': scaleColor()\n }],\n 'mask-image-x-from-pos': [{\n 'mask-x-from': scaleMaskImagePosition()\n }],\n 'mask-image-x-to-pos': [{\n 'mask-x-to': scaleMaskImagePosition()\n }],\n 'mask-image-x-from-color': [{\n 'mask-x-from': scaleColor()\n }],\n 'mask-image-x-to-color': [{\n 'mask-x-to': scaleColor()\n }],\n 'mask-image-y-from-pos': [{\n 'mask-y-from': scaleMaskImagePosition()\n }],\n 'mask-image-y-to-pos': [{\n 'mask-y-to': scaleMaskImagePosition()\n }],\n 'mask-image-y-from-color': [{\n 'mask-y-from': scaleColor()\n }],\n 'mask-image-y-to-color': [{\n 'mask-y-to': scaleColor()\n }],\n 'mask-image-radial': [{\n 'mask-radial': [isArbitraryVariable, isArbitraryValue]\n }],\n 'mask-image-radial-from-pos': [{\n 'mask-radial-from': scaleMaskImagePosition()\n }],\n 'mask-image-radial-to-pos': [{\n 'mask-radial-to': scaleMaskImagePosition()\n }],\n 'mask-image-radial-from-color': [{\n 'mask-radial-from': scaleColor()\n }],\n 'mask-image-radial-to-color': [{\n 'mask-radial-to': scaleColor()\n }],\n 'mask-image-radial-shape': [{\n 'mask-radial': ['circle', 'ellipse']\n }],\n 'mask-image-radial-size': [{\n 'mask-radial': [{\n closest: ['side', 'corner'],\n farthest: ['side', 'corner']\n }]\n }],\n 'mask-image-radial-pos': [{\n 'mask-radial-at': scalePosition()\n }],\n 'mask-image-conic-pos': [{\n 'mask-conic': [isNumber]\n }],\n 'mask-image-conic-from-pos': [{\n 'mask-conic-from': scaleMaskImagePosition()\n }],\n 'mask-image-conic-to-pos': [{\n 'mask-conic-to': scaleMaskImagePosition()\n }],\n 'mask-image-conic-from-color': [{\n 'mask-conic-from': scaleColor()\n }],\n 'mask-image-conic-to-color': [{\n 'mask-conic-to': scaleColor()\n }],\n /**\n * Mask Mode\n * @see https://tailwindcss.com/docs/mask-mode\n */\n 'mask-mode': [{\n mask: ['alpha', 'luminance', 'match']\n }],\n /**\n * Mask Origin\n * @see https://tailwindcss.com/docs/mask-origin\n */\n 'mask-origin': [{\n 'mask-origin': ['border', 'padding', 'content', 'fill', 'stroke', 'view']\n }],\n /**\n * Mask Position\n * @see https://tailwindcss.com/docs/mask-position\n */\n 'mask-position': [{\n mask: scaleBgPosition()\n }],\n /**\n * Mask Repeat\n * @see https://tailwindcss.com/docs/mask-repeat\n */\n 'mask-repeat': [{\n mask: scaleBgRepeat()\n }],\n /**\n * Mask Size\n * @see https://tailwindcss.com/docs/mask-size\n */\n 'mask-size': [{\n mask: scaleBgSize()\n }],\n /**\n * Mask Type\n * @see https://tailwindcss.com/docs/mask-type\n */\n 'mask-type': [{\n 'mask-type': ['alpha', 'luminance']\n }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image': [{\n mask: ['none', isArbitraryVariable, isArbitraryValue]\n }],\n // ---------------\n // --- Filters ---\n // ---------------\n /**\n * Filter\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [{\n filter: [\n // Deprecated since Tailwind CSS v3.0.0\n '', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{\n blur: scaleBlur()\n }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{\n brightness: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{\n contrast: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [{\n 'drop-shadow': [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeDropShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Drop Shadow Color\n * @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color\n */\n 'drop-shadow-color': [{\n 'drop-shadow': scaleColor()\n }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{\n grayscale: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{\n 'hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{\n invert: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{\n saturate: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{\n sepia: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Filter\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [{\n 'backdrop-filter': [\n // Deprecated since Tailwind CSS v3.0.0\n '', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{\n 'backdrop-blur': scaleBlur()\n }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [{\n 'backdrop-brightness': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [{\n 'backdrop-contrast': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [{\n 'backdrop-grayscale': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [{\n 'backdrop-hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [{\n 'backdrop-invert': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [{\n 'backdrop-opacity': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [{\n 'backdrop-saturate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [{\n 'backdrop-sepia': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n // --------------\n // --- Tables ---\n // --------------\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{\n border: ['collapse', 'separate']\n }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{\n 'border-spacing': scaleUnambiguousSpacing()\n }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{\n 'border-spacing-x': scaleUnambiguousSpacing()\n }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{\n 'border-spacing-y': scaleUnambiguousSpacing()\n }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{\n table: ['auto', 'fixed']\n }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{\n caption: ['top', 'bottom']\n }],\n // ---------------------------------\n // --- Transitions and Animation ---\n // ---------------------------------\n /**\n * Transition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [{\n transition: ['', 'all', 'colors', 'opacity', 'shadow', 'transform', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Behavior\n * @see https://tailwindcss.com/docs/transition-behavior\n */\n 'transition-behavior': [{\n transition: ['normal', 'discrete']\n }],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{\n duration: [isNumber, 'initial', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [{\n ease: ['linear', 'initial', themeEase, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{\n delay: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{\n animate: ['none', themeAnimate, isArbitraryVariable, isArbitraryValue]\n }],\n // ------------------\n // --- Transforms ---\n // ------------------\n /**\n * Backface Visibility\n * @see https://tailwindcss.com/docs/backface-visibility\n */\n backface: [{\n backface: ['hidden', 'visible']\n }],\n /**\n * Perspective\n * @see https://tailwindcss.com/docs/perspective\n */\n perspective: [{\n perspective: [themePerspective, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Perspective Origin\n * @see https://tailwindcss.com/docs/perspective-origin\n */\n 'perspective-origin': [{\n 'perspective-origin': scalePositionWithArbitrary()\n }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{\n rotate: scaleRotate()\n }],\n /**\n * Rotate X\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-x': [{\n 'rotate-x': scaleRotate()\n }],\n /**\n * Rotate Y\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-y': [{\n 'rotate-y': scaleRotate()\n }],\n /**\n * Rotate Z\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-z': [{\n 'rotate-z': scaleRotate()\n }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{\n scale: scaleScale()\n }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{\n 'scale-x': scaleScale()\n }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{\n 'scale-y': scaleScale()\n }],\n /**\n * Scale Z\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-z': [{\n 'scale-z': scaleScale()\n }],\n /**\n * Scale 3D\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-3d': ['scale-3d'],\n /**\n * Skew\n * @see https://tailwindcss.com/docs/skew\n */\n skew: [{\n skew: scaleSkew()\n }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{\n 'skew-x': scaleSkew()\n }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{\n 'skew-y': scaleSkew()\n }],\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [{\n transform: [isArbitraryVariable, isArbitraryValue, '', 'none', 'gpu', 'cpu']\n }],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [{\n origin: scalePositionWithArbitrary()\n }],\n /**\n * Transform Style\n * @see https://tailwindcss.com/docs/transform-style\n */\n 'transform-style': [{\n transform: ['3d', 'flat']\n }],\n /**\n * Translate\n * @see https://tailwindcss.com/docs/translate\n */\n translate: [{\n translate: scaleTranslate()\n }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{\n 'translate-x': scaleTranslate()\n }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{\n 'translate-y': scaleTranslate()\n }],\n /**\n * Translate Z\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-z': [{\n 'translate-z': scaleTranslate()\n }],\n /**\n * Translate None\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-none': ['translate-none'],\n // ---------------------\n // --- Interactivity ---\n // ---------------------\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{\n accent: scaleColor()\n }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{\n appearance: ['none', 'auto']\n }],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{\n caret: scaleColor()\n }],\n /**\n * Color Scheme\n * @see https://tailwindcss.com/docs/color-scheme\n */\n 'color-scheme': [{\n scheme: ['normal', 'dark', 'light', 'light-dark', 'only-dark', 'only-light']\n }],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [{\n cursor: ['auto', 'default', 'pointer', 'wait', 'text', 'move', 'help', 'not-allowed', 'none', 'context-menu', 'progress', 'cell', 'crosshair', 'vertical-text', 'alias', 'copy', 'no-drop', 'grab', 'grabbing', 'all-scroll', 'col-resize', 'row-resize', 'n-resize', 'e-resize', 's-resize', 'w-resize', 'ne-resize', 'nw-resize', 'se-resize', 'sw-resize', 'ew-resize', 'ns-resize', 'nesw-resize', 'nwse-resize', 'zoom-in', 'zoom-out', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Field Sizing\n * @see https://tailwindcss.com/docs/field-sizing\n */\n 'field-sizing': [{\n 'field-sizing': ['fixed', 'content']\n }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{\n 'pointer-events': ['auto', 'none']\n }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{\n resize: ['none', '', 'y', 'x']\n }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{\n scroll: ['auto', 'smooth']\n }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{\n 'scroll-m': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin X\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{\n 'scroll-mx': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Y\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{\n 'scroll-my': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{\n 'scroll-ms': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{\n 'scroll-me': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{\n 'scroll-mt': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{\n 'scroll-mr': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{\n 'scroll-mb': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{\n 'scroll-ml': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{\n 'scroll-p': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding X\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{\n 'scroll-px': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Y\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{\n 'scroll-py': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{\n 'scroll-ps': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{\n 'scroll-pe': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{\n 'scroll-pt': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{\n 'scroll-pr': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{\n 'scroll-pb': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{\n 'scroll-pl': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{\n snap: ['start', 'end', 'center', 'align-none']\n }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{\n snap: ['normal', 'always']\n }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{\n snap: ['none', 'x', 'y', 'both']\n }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{\n snap: ['mandatory', 'proximity']\n }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [{\n touch: ['auto', 'none', 'manipulation']\n }],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [{\n 'touch-pan': ['x', 'left', 'right']\n }],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [{\n 'touch-pan': ['y', 'up', 'down']\n }],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{\n select: ['none', 'text', 'all', 'auto']\n }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [{\n 'will-change': ['auto', 'scroll', 'contents', 'transform', isArbitraryVariable, isArbitraryValue]\n }],\n // -----------\n // --- SVG ---\n // -----------\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{\n fill: ['none', ...scaleColor()]\n }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [{\n stroke: [isNumber, isArbitraryVariableLength, isArbitraryLength, isArbitraryNumber]\n }],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{\n stroke: ['none', ...scaleColor()]\n }],\n // ---------------------\n // --- Accessibility ---\n // ---------------------\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{\n 'forced-color-adjust': ['auto', 'none']\n }]\n },\n conflictingClassGroups: {\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: ['inset-x', 'inset-y', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': ['fvn-ordinal', 'fvn-slashed-zero', 'fvn-figure', 'fvn-spacing', 'fvn-fraction'],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: ['rounded-s', 'rounded-e', 'rounded-t', 'rounded-r', 'rounded-b', 'rounded-l', 'rounded-ss', 'rounded-se', 'rounded-ee', 'rounded-es', 'rounded-tl', 'rounded-tr', 'rounded-br', 'rounded-bl'],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': ['border-w-x', 'border-w-y', 'border-w-s', 'border-w-e', 'border-w-t', 'border-w-r', 'border-w-b', 'border-w-l'],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': ['border-color-x', 'border-color-y', 'border-color-s', 'border-color-e', 'border-color-t', 'border-color-r', 'border-color-b', 'border-color-l'],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n translate: ['translate-x', 'translate-y', 'translate-none'],\n 'translate-none': ['translate', 'translate-x', 'translate-y', 'translate-z'],\n 'scroll-m': ['scroll-mx', 'scroll-my', 'scroll-ms', 'scroll-me', 'scroll-mt', 'scroll-mr', 'scroll-mb', 'scroll-ml'],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': ['scroll-px', 'scroll-py', 'scroll-ps', 'scroll-pe', 'scroll-pt', 'scroll-pr', 'scroll-pb', 'scroll-pl'],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch']\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading']\n },\n orderSensitiveModifiers: ['*', '**', 'after', 'backdrop', 'before', 'details-content', 'file', 'first-letter', 'first-line', 'marker', 'placeholder', 'selection']\n };\n};\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nconst mergeConfigs = (baseConfig, {\n cacheSize,\n prefix,\n experimentalParseClassName,\n extend = {},\n override = {}\n}) => {\n overrideProperty(baseConfig, 'cacheSize', cacheSize);\n overrideProperty(baseConfig, 'prefix', prefix);\n overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName);\n overrideConfigProperties(baseConfig.theme, override.theme);\n overrideConfigProperties(baseConfig.classGroups, override.classGroups);\n overrideConfigProperties(baseConfig.conflictingClassGroups, override.conflictingClassGroups);\n overrideConfigProperties(baseConfig.conflictingClassGroupModifiers, override.conflictingClassGroupModifiers);\n overrideProperty(baseConfig, 'orderSensitiveModifiers', override.orderSensitiveModifiers);\n mergeConfigProperties(baseConfig.theme, extend.theme);\n mergeConfigProperties(baseConfig.classGroups, extend.classGroups);\n mergeConfigProperties(baseConfig.conflictingClassGroups, extend.conflictingClassGroups);\n mergeConfigProperties(baseConfig.conflictingClassGroupModifiers, extend.conflictingClassGroupModifiers);\n mergeArrayProperties(baseConfig, extend, 'orderSensitiveModifiers');\n return baseConfig;\n};\nconst overrideProperty = (baseObject, overrideKey, overrideValue) => {\n if (overrideValue !== undefined) {\n baseObject[overrideKey] = overrideValue;\n }\n};\nconst overrideConfigProperties = (baseObject, overrideObject) => {\n if (overrideObject) {\n for (const key in overrideObject) {\n overrideProperty(baseObject, key, overrideObject[key]);\n }\n }\n};\nconst mergeConfigProperties = (baseObject, mergeObject) => {\n if (mergeObject) {\n for (const key in mergeObject) {\n mergeArrayProperties(baseObject, mergeObject, key);\n }\n }\n};\nconst mergeArrayProperties = (baseObject, mergeObject, key) => {\n const mergeValue = mergeObject[key];\n if (mergeValue !== undefined) {\n baseObject[key] = baseObject[key] ? baseObject[key].concat(mergeValue) : mergeValue;\n }\n};\nconst extendTailwindMerge = (configExtension, ...createConfig) => typeof configExtension === 'function' ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig) : createTailwindMerge(() => mergeConfigs(getDefaultConfig(), configExtension), ...createConfig);\nconst twMerge = /*#__PURE__*/createTailwindMerge(getDefaultConfig);\nexport { createTailwindMerge, extendTailwindMerge, fromTheme, getDefaultConfig, mergeConfigs, twJoin, twMerge, validators };\n//# sourceMappingURL=bundle-mjs.mjs.map\n","import { type ClassValue, clsx } from 'clsx'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs))\r\n}","import React from 'react'\r\nimport { cn } from '../../../utils/cn'\r\n\r\ninterface ProgressBarProps {\r\n progress: number\r\n size?: 'sm' | 'md' | 'lg'\r\n variant?: 'default' | 'success' | 'error' | 'warning'\r\n showPercentage?: boolean\r\n animated?: boolean\r\n className?: string\r\n 'aria-label'?: string\r\n 'aria-describedby'?: string\r\n}\r\n\r\nexport const ProgressBar: React.FC<ProgressBarProps> = ({\r\n progress,\r\n size = 'md',\r\n variant = 'default',\r\n showPercentage = false,\r\n animated = true,\r\n className,\r\n 'aria-label': ariaLabel,\r\n 'aria-describedby': ariaDescribedBy\r\n}) => {\r\n const clampedProgress = Math.max(0, Math.min(100, progress))\r\n\r\n const sizeClasses = {\r\n sm: 'h-1',\r\n md: 'h-2',\r\n lg: 'h-3'\r\n }\r\n\r\n const variantClasses = {\r\n default: 'bg-blue-500',\r\n success: 'bg-green-500',\r\n error: 'bg-red-500',\r\n warning: 'bg-yellow-500'\r\n }\r\n\r\n return (\r\n <div className={cn('w-full', className)}>\r\n <div\r\n className={cn(\r\n 'w-full bg-gray-200 rounded-full overflow-hidden',\r\n sizeClasses[size]\r\n )}\r\n role=\"progressbar\"\r\n aria-valuenow={clampedProgress}\r\n aria-valuemin={0}\r\n aria-valuemax={100}\r\n aria-label={ariaLabel || `Upload progress: ${clampedProgress}%`}\r\n aria-describedby={ariaDescribedBy}\r\n >\r\n <div\r\n className={cn(\r\n 'h-full rounded-full transition-all duration-300 ease-out',\r\n variantClasses[variant],\r\n animated && 'transition-transform'\r\n )}\r\n style={{ width: `${clampedProgress}%` }}\r\n />\r\n </div>\r\n {showPercentage && (\r\n <div className=\"mt-1 text-xs text-gray-600 text-right\">\r\n {Math.round(clampedProgress)}%\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}","import React from 'react'\r\nimport { cn } from '../../../utils/cn'\r\nimport { CheckCircle, XCircle, AlertCircle, Clock } from 'lucide-react'\r\nimport type { FileUploadStatus } from '../file-upload.types'\r\n\r\ninterface StatusIndicatorProps {\r\n status: FileUploadStatus\r\n size?: 'sm' | 'md' | 'lg'\r\n showText?: boolean\r\n className?: string\r\n 'aria-label'?: string\r\n}\r\n\r\nconst statusConfig = {\r\n pending: {\r\n icon: Clock,\r\n color: 'text-gray-500',\r\n bgColor: 'bg-gray-100',\r\n text: 'Pending'\r\n },\r\n uploading: {\r\n icon: Clock,\r\n color: 'text-blue-500',\r\n bgColor: 'bg-blue-100',\r\n text: 'Uploading'\r\n },\r\n success: {\r\n icon: CheckCircle,\r\n color: 'text-green-500',\r\n bgColor: 'bg-green-100',\r\n text: 'Success'\r\n },\r\n error: {\r\n icon: XCircle,\r\n color: 'text-red-500',\r\n bgColor: 'bg-red-100',\r\n text: 'Error'\r\n }\r\n}\r\n\r\nexport const StatusIndicator: React.FC<StatusIndicatorProps> = ({\r\n status,\r\n size = 'md',\r\n showText = false,\r\n className,\r\n 'aria-label': ariaLabel\r\n}) => {\r\n const config = statusConfig[status]\r\n const Icon = config.icon\r\n\r\n const sizeClasses = {\r\n sm: 'w-4 h-4',\r\n md: 'w-5 h-5',\r\n lg: 'w-6 h-6'\r\n }\r\n\r\n const textSizeClasses = {\r\n sm: 'text-xs',\r\n md: 'text-sm',\r\n lg: 'text-base'\r\n }\r\n\r\n return (\r\n <div\r\n className={cn('flex items-center gap-2', className)}\r\n role=\"status\"\r\n aria-label={ariaLabel || `File status: ${config.text}`}\r\n >\r\n <div\r\n className={cn(\r\n 'rounded-full p-1 flex items-center justify-center',\r\n config.bgColor\r\n )}\r\n >\r\n <Icon\r\n className={cn(\r\n sizeClasses[size],\r\n config.color\r\n )}\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n {showText && (\r\n <span className={cn(textSizeClasses[size], config.color)}>\r\n {config.text}\r\n </span>\r\n )}\r\n </div>\r\n )\r\n}","import React from 'react'\r\nimport { cn } from '../../../utils/cn'\r\n\r\ninterface LoadingSpinnerProps {\r\n size?: 'sm' | 'md' | 'lg'\r\n variant?: 'default' | 'primary' | 'secondary'\r\n className?: string\r\n 'aria-label'?: string\r\n}\r\n\r\nexport const LoadingSpinner: React.FC<LoadingSpinnerProps> = ({\r\n size = 'md',\r\n variant = 'default',\r\n className,\r\n 'aria-label': ariaLabel\r\n}) => {\r\n const sizeClasses = {\r\n sm: 'w-4 h-4',\r\n md: 'w-6 h-6',\r\n lg: 'w-8 h-8'\r\n }\r\n\r\n const variantClasses = {\r\n default: 'text-gray-500',\r\n primary: 'text-blue-500',\r\n secondary: 'text-gray-400'\r\n }\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'inline-block animate-spin rounded-full border-2 border-solid border-current border-r-transparent',\r\n sizeClasses[size],\r\n variantClasses[variant],\r\n className\r\n )}\r\n role=\"status\"\r\n aria-label={ariaLabel || 'Loading'}\r\n >\r\n <span className=\"sr-only\">Loading...</span>\r\n </div>\r\n )\r\n}","import React, { useEffect, useRef } from 'react'\r\nimport type { UploadFile, FileUploadStatus } from '../file-upload.types'\r\n\r\ninterface AccessibilityAnnouncerProps {\r\n files: UploadFile[]\r\n isUploading: boolean\r\n announceProgress?: boolean\r\n announceStatus?: boolean\r\n announceErrors?: boolean\r\n className?: string\r\n}\r\n\r\nexport const AccessibilityAnnouncer: React.FC<AccessibilityAnnouncerProps> = ({\r\n files,\r\n isUploading,\r\n announceProgress = true,\r\n announceStatus = true,\r\n announceErrors = true,\r\n className\r\n}) => {\r\n const liveRegionRef = useRef<HTMLDivElement>(null)\r\n const previousFilesRef = useRef<UploadFile[]>([])\r\n const announcementTimeoutRef = useRef<NodeJS.Timeout>()\r\n\r\n const announce = (message: string, priority: 'polite' | 'assertive' = 'polite') => {\r\n if (liveRegionRef.current) {\r\n // Clear any existing timeout\r\n if (announcementTimeoutRef.current) {\r\n clearTimeout(announcementTimeoutRef.current)\r\n }\r\n\r\n // Set the aria-live attribute based on priority\r\n liveRegionRef.current.setAttribute('aria-live', priority)\r\n\r\n // Clear the region first to ensure the announcement is heard\r\n liveRegionRef.current.textContent = ''\r\n\r\n // Add the message after a brief delay\r\n announcementTimeoutRef.current = setTimeout(() => {\r\n if (liveRegionRef.current) {\r\n liveRegionRef.current.textContent = message\r\n }\r\n }, 100)\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n const previousFiles = previousFilesRef.current\r\n const currentFiles = files\r\n\r\n // Announce file selection\r\n if (currentFiles.length > previousFiles.length && announceStatus) {\r\n const newFilesCount = currentFiles.length - previousFiles.length\r\n announce(\r\n `${newFilesCount} file${newFilesCount === 1 ? '' : 's'} selected for upload`,\r\n 'polite'\r\n )\r\n }\r\n\r\n // Announce upload start\r\n if (!previousFiles.some(f => f.status === 'uploading') &&\r\n currentFiles.some(f => f.status === 'uploading') &&\r\n announceStatus) {\r\n announce('Upload started', 'polite')\r\n }\r\n\r\n // Announce individual file status changes\r\n currentFiles.forEach(currentFile => {\r\n const previousFile = previousFiles.find(f => f.id === currentFile.id)\r\n\r\n if (previousFile && previousFile.status !== currentFile.status) {\r\n if (currentFile.status === 'success' && announceStatus) {\r\n announce(`${currentFile.name} uploaded successfully`, 'polite')\r\n } else if (currentFile.status === 'error' && announceErrors) {\r\n const errorMessage = currentFile.error || 'Upload failed'\r\n announce(`${currentFile.name} upload failed: ${errorMessage}`, 'assertive')\r\n }\r\n }\r\n\r\n // Announce progress milestones (every 25%)\r\n if (previousFile &&\r\n announceProgress &&\r\n currentFile.status === 'uploading' &&\r\n currentFile.progress > 0) {\r\n const currentMilestone = Math.floor(currentFile.progress / 25) * 25\r\n const previousMilestone = Math.floor(previousFile.progress / 25) * 25\r\n\r\n if (currentMilestone > previousMilestone && currentMilestone > 0) {\r\n announce(`${currentFile.name} ${currentMilestone}% uploaded`, 'polite')\r\n }\r\n }\r\n })\r\n\r\n // Announce overall completion\r\n const allCompleted = currentFiles.length > 0 &&\r\n currentFiles.every(f => f.status === 'success' || f.status === 'error')\r\n const wasUploading = previousFiles.some(f => f.status === 'uploading')\r\n\r\n if (allCompleted && wasUploading && announceStatus) {\r\n const successCount = currentFiles.filter(f => f.status === 'success').length\r\n const errorCount = currentFiles.filter(f => f.status === 'error').length\r\n\r\n if (errorCount === 0) {\r\n announce(`All ${successCount} files uploaded successfully`, 'polite')\r\n } else {\r\n announce(\r\n `Upload complete: ${successCount} successful, ${errorCount} failed`,\r\n 'assertive'\r\n )\r\n }\r\n }\r\n\r\n // Update previous files reference\r\n previousFilesRef.current = [...currentFiles]\r\n }, [files, announceProgress, announceStatus, announceErrors])\r\n\r\n // Cleanup timeout on unmount\r\n useEffect(() => {\r\n return () => {\r\n if (announcementTimeoutRef.current) {\r\n clearTimeout(announcementTimeoutRef.current)\r\n }\r\n }\r\n }, [])\r\n\r\n return (\r\n <div\r\n ref={liveRegionRef}\r\n className={className}\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n aria-atomic=\"true\"\r\n style={{\r\n position: 'absolute',\r\n left: '-10000px',\r\n width: '1px',\r\n height: '1px',\r\n overflow: 'hidden'\r\n }}\r\n />\r\n )\r\n}","import React, { useCallback, useMemo } from 'react'\r\nimport { AlertTriangle, AlertCircle, Info, X, RefreshCw, Trash2, HelpCircle } from 'lucide-react'\r\nimport { ProcessedError, ErrorAction, formatErrorForUser } from '../../utils/error-handling'\r\nimport { cn } from '../../utils/theme'\r\n\r\ninterface ErrorDisplayProps {\r\n errors: ProcessedError[]\r\n onAction?: (action: ErrorAction, error: ProcessedError) => void\r\n onDismiss?: (errorId: string) => void\r\n onDismissAll?: () => void\r\n className?: string\r\n compact?: boolean\r\n showTechnicalDetails?: boolean\r\n maxErrors?: number\r\n groupByType?: boolean\r\n}\r\n\r\nconst ErrorIcon: React.FC<{ severity: ProcessedError['severity']; className?: string }> = ({\r\n severity,\r\n className\r\n}) => {\r\n const iconProps = { className: cn('w-5 h-5 flex-shrink-0', className), 'aria-hidden': true }\r\n\r\n switch (severity) {\r\n case 'critical':\r\n return <AlertTriangle {...iconProps} className={cn(iconProps.className, 'text-red-600')} />\r\n case 'high':\r\n return <AlertCircle {...iconProps} className={cn(iconProps.className, 'text-red-500')} />\r\n case 'medium':\r\n return <AlertCircle {...iconProps} className={cn(iconProps.className, 'text-orange-500')} />\r\n case 'low':\r\n return <Info {...iconProps} className={cn(iconProps.className, 'text-blue-500')} />\r\n default:\r\n return <AlertCircle {...iconProps} className={cn(iconProps.className, 'text-gray-500')} />\r\n }\r\n}\r\n\r\nconst ErrorActionButton: React.FC<{\r\n action: ErrorAction\r\n error: ProcessedError\r\n onAction: (action: ErrorAction, error: ProcessedError) => void\r\n compact?: boolean\r\n}> = ({ action, error, onAction, compact }) => {\r\n const handleClick = useCallback(() => {\r\n if (action.handler) {\r\n action.handler()\r\n } else {\r\n onAction(action, error)\r\n }\r\n }, [action, error, onAction])\r\n\r\n const getActionIcon = () => {\r\n switch (action.type) {\r\n case 'retry':\r\n return <RefreshCw className=\"w-4 h-4\" />\r\n case 'remove':\r\n case 'clear':\r\n return <Trash2 className=\"w-4 h-4\" />\r\n case 'contact':\r\n return <HelpCircle className=\"w-4 h-4\" />\r\n default:\r\n return null\r\n }\r\n }\r\n\r\n const getButtonClasses = () => {\r\n const baseClasses = [\r\n 'inline-flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium rounded-md',\r\n 'focus:outline-none focus:ring-2 focus:ring-offset-2 transition-colors duration-200',\r\n action.disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'\r\n ]\r\n\r\n if (compact) {\r\n baseClasses.push('px-2 py-1 text-xs')\r\n }\r\n\r\n if (action.primary) {\r\n baseClasses.push(\r\n 'text-white bg-blue-600 hover:bg-blue-700 focus:ring-blue-500',\r\n action.disabled ? '' : 'hover:bg-blue-700'\r\n )\r\n } else {\r\n baseClasses.push(\r\n 'text-gray-700 bg-gray-100 border border-gray-300 hover:bg-gray-200 focus:ring-gray-500',\r\n action.disabled ? '' : 'hover:bg-gray-200'\r\n )\r\n }\r\n\r\n return cn(...baseClasses)\r\n }\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={handleClick}\r\n disabled={action.disabled}\r\n className={getButtonClasses()}\r\n aria-label={`${action.label} for ${error.context.fileName || 'file'}`}\r\n >\r\n {getActionIcon()}\r\n {action.label}\r\n </button>\r\n )\r\n}\r\n\r\nconst SingleErrorDisplay: React.FC<{\r\n error: ProcessedError\r\n onAction?: (action: ErrorAction, error: ProcessedError) => void\r\n onDismiss?: (errorId: string) => void\r\n compact?: boolean\r\n showTechnicalDetails?: boolean\r\n}> = ({ error, onAction, onDismiss, compact, showTechnicalDetails }) => {\r\n const getSeverityClasses = () => {\r\n switch (error.severity) {\r\n case 'critical':\r\n return 'border-red-300 bg-red-50 text-red-900'\r\n case 'high':\r\n return 'border-red-200 bg-red-50 text-red-800'\r\n case 'medium':\r\n return 'border-orange-200 bg-orange-50 text-orange-800'\r\n case 'low':\r\n return 'border-blue-200 bg-blue-50 text-blue-800'\r\n default:\r\n return 'border-gray-200 bg-gray-50 text-gray-800'\r\n }\r\n }\r\n\r\n const containerClasses = cn(\r\n 'border rounded-lg p-4 space-y-3',\r\n getSeverityClasses(),\r\n compact && 'p-3 space-y-2'\r\n )\r\n\r\n return (\r\n <div\r\n className={containerClasses}\r\n role=\"alert\"\r\n aria-live=\"polite\"\r\n aria-labelledby={`error-title-${error.id}`}\r\n aria-describedby={`error-description-${error.id}`}\r\n >\r\n <div className=\"flex items-start gap-3\">\r\n <ErrorIcon severity={error.severity} />\r\n\r\n <div className=\"flex-1 min-w-0\">\r\n <h4\r\n id={`error-title-${error.id}`}\r\n className={cn(\r\n 'font-medium',\r\n compact ? 'text-sm' : 'text-base'\r\n )}\r\n >\r\n {error.title}\r\n </h4>\r\n\r\n <p\r\n id={`error-description-${error.id}`}\r\n className={cn(\r\n 'mt-1 text-sm',\r\n compact ? 'text-xs' : 'text-sm'\r\n )}\r\n >\r\n {formatErrorForUser(error, true)}\r\n </p>\r\n\r\n {error.suggestions.length > 0 && !compact && (\r\n <div className=\"mt-2\">\r\n <p className=\"text-sm font-medium mb-1\">Suggestions:</p>\r\n <ul className=\"text-sm space-y-1 list-disc list-inside\">\r\n {error.suggestions.map((suggestion, index) => (\r\n <li key={index}>{suggestion}</li>\r\n ))}\r\n </ul>\r\n </div>\r\n )}\r\n\r\n {showTechnicalDetails && (\r\n <details className=\"mt-3\">\r\n <summary className=\"text-sm font-medium cursor-pointer hover:underline\">\r\n Technical Details\r\n </summary>\r\n <div className=\"mt-2 p-2 bg-gray-100 rounded text-xs font-mono overflow-auto\">\r\n <div><strong>Error ID:</strong> {error.id}</div>\r\n <div><strong>Code:</strong> {error.code}</div>\r\n <div><strong>Type:</strong> {error.type}</div>\r\n <div><strong>Message:</strong> {error.technicalMessage}</div>\r\n {error.context.timestamp && (\r\n <div><strong>Time:</strong> {error.context.timestamp.toISOString()}</div>\r\n )}\r\n {error.context.fileName && (\r\n <div><strong>File:</strong> {error.context.fileName}</div>\r\n )}\r\n {error.context.fileSize && (\r\n <div><strong>Size:</strong> {error.context.fileSize} bytes</div>\r\n )}\r\n </div>\r\n </details>\r\n )}\r\n </div>\r\n\r\n {onDismiss && (\r\n <button\r\n type=\"button\"\r\n onClick={() => onDismiss(error.id)}\r\n className=\"text-gray-400 hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 rounded\"\r\n aria-label=\"Dismiss error\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n\r\n {error.actions.length > 0 && onAction && (\r\n <div className=\"flex flex-wrap gap-2 pt-2\">\r\n {error.actions.map((action) => (\r\n <ErrorActionButton\r\n key={action.id}\r\n action={action}\r\n error={error}\r\n onAction={onAction}\r\n compact={compact}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nexport const ErrorDisplay: React.FC<ErrorDisplayProps> = ({\r\n errors,\r\n onAction,\r\n onDismiss,\r\n onDismissAll,\r\n className,\r\n compact = false,\r\n showTechnicalDetails = false,\r\n maxErrors = 5,\r\n groupByType = false\r\n}) => {\r\n const displayErrors = useMemo(() => {\r\n if (errors.length <= maxErrors) {\r\n return errors\r\n }\r\n return errors.slice(0, maxErrors)\r\n }, [errors, maxErrors])\r\n\r\n const groupedErrors = useMemo(() => {\r\n if (!groupByType) {\r\n return { ungrouped: displayErrors }\r\n }\r\n\r\n return displayErrors.reduce((groups, error) => {\r\n const key = error.type\r\n if (!groups[key]) {\r\n groups[key] = []\r\n }\r\n groups[key].push(error)\r\n return groups\r\n }, {} as Record<string, ProcessedError[]>)\r\n }, [displayErrors, groupByType])\r\n\r\n const hasMoreErrors = errors.length > maxErrors\r\n\r\n if (errors.length === 0) {\r\n return null\r\n }\r\n\r\n return (\r\n <div className={cn('space-y-4', className)} role=\"region\" aria-label=\"Error messages\">\r\n {/* Header with dismiss all button */}\r\n {errors.length > 1 && onDismissAll && (\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"text-lg font-medium text-gray-900\">\r\n {errors.length} Error{errors.length !== 1 ? 's' : ''} Occurred\r\n </h3>\r\n <button\r\n type=\"button\"\r\n onClick={onDismissAll}\r\n className=\"text-sm text-gray-500 hover:text-gray-700 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 rounded\"\r\n >\r\n Dismiss All\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Error groups */}\r\n {Object.entries(groupedErrors).map(([groupKey, groupErrors]) => (\r\n <div key={groupKey} className=\"space-y-3\">\r\n {groupByType && groupKey !== 'ungrouped' && (\r\n <h4 className=\"text-md font-medium text-gray-800 capitalize\">\r\n {groupKey.replace('-', ' ')} Errors ({groupErrors.length})\r\n </h4>\r\n )}\r\n\r\n {groupErrors.map((error) => (\r\n <SingleErrorDisplay\r\n key={error.id}\r\n error={error}\r\n onAction={onAction}\r\n onDismiss={onDismiss}\r\n compact={compact}\r\n showTechnicalDetails={showTechnicalDetails}\r\n />\r\n ))}\r\n </div>\r\n ))}\r\n\r\n {/* Show more indicator */}\r\n {hasMoreErrors && (\r\n <div className=\"text-center py-2\">\r\n <p className=\"text-sm text-gray-500\">\r\n Showing {maxErrors} of {errors.length} errors\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nErrorDisplay.displayName = 'ErrorDisplay'","import React, { useEffect, useRef, useState, useCallback } from 'react'\r\nimport { ProcessedError, createErrorAnnouncement, shouldAnnounceError } from '../../utils/error-handling'\r\n\r\ninterface AccessibilityAnnouncerProps {\r\n errors?: ProcessedError[]\r\n announceErrors?: boolean\r\n announceProgress?: boolean\r\n announceFileSelection?: boolean\r\n politeAnnouncements?: boolean\r\n className?: string\r\n}\r\n\r\ninterface AnnouncementQueue {\r\n id: string\r\n message: string\r\n priority: 'polite' | 'assertive'\r\n timestamp: Date\r\n}\r\n\r\nexport const AccessibilityAnnouncer: React.FC<AccessibilityAnnouncerProps> = ({\r\n errors = [],\r\n announceErrors = true,\r\n announceProgress = true,\r\n announceFileSelection = true,\r\n politeAnnouncements = false,\r\n className = ''\r\n}) => {\r\n const [announcements, setAnnouncements] = useState<AnnouncementQueue[]>([])\r\n const [currentAnnouncement, setCurrentAnnouncement] = useState<string>('')\r\n const announcementTimeoutRef = useRef<NodeJS.Timeout>()\r\n const processedErrorsRef = useRef<Set<string>>(new Set())\r\n\r\n // Process new errors for announcements\r\n useEffect(() => {\r\n if (!announceErrors || errors.length === 0) return\r\n\r\n const newErrors = errors.filter(error =>\r\n !processedErrorsRef.current.has(error.id) && shouldAnnounceError(error)\r\n )\r\n\r\n if (newErrors.length === 0) return\r\n\r\n const newAnnouncements: AnnouncementQueue[] = newErrors.map(error => ({\r\n id: `error-${error.id}`,\r\n message: createErrorAnnouncement(error),\r\n priority: error.severity === 'critical' || error.severity === 'high' ? 'assertive' : 'polite',\r\n timestamp: new Date()\r\n }))\r\n\r\n // Mark errors as processed\r\n newErrors.forEach(error => {\r\n processedErrorsRef.current.add(error.id)\r\n })\r\n\r\n // Add to announcement queue\r\n setAnnouncements(prev => [...prev, ...newAnnouncements])\r\n }, [errors, announceErrors])\r\n\r\n // Process announcement queue\r\n useEffect(() => {\r\n if (announcements.length === 0) return\r\n\r\n const processNextAnnouncement = () => {\r\n const nextAnnouncement = announcements[0]\r\n if (!nextAnnouncement) return\r\n\r\n setCurrentAnnouncement(nextAnnouncement.message)\r\n setAnnouncements(prev => prev.slice(1))\r\n\r\n // Clear the announcement after a delay to allow screen readers to process it\r\n announcementTimeoutRef.current = setTimeout(() => {\r\n setCurrentAnnouncement('')\r\n }, 1000)\r\n }\r\n\r\n // Process immediately if no current announcement, otherwise wait\r\n if (!currentAnnouncement) {\r\n processNextAnnouncement()\r\n } else {\r\n const timeout = setTimeout(processNextAnnouncement, 1500)\r\n return () => clearTimeout(timeout)\r\n }\r\n }, [announcements, currentAnnouncement])\r\n\r\n // Cleanup timeout on unmount\r\n useEffect(() => {\r\n return () => {\r\n if (announcementTimeoutRef.current) {\r\n clearTimeout(announcementTimeoutRef.current)\r\n }\r\n }\r\n }, [])\r\n\r\n // Public method to announce custom messages\r\n const announce = useCallback((\r\n message: string,\r\n priority: 'polite' | 'assertive' = 'polite'\r\n ) => {\r\n const announcement: AnnouncementQueue = {\r\n id: `custom-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`,\r\n message,\r\n priority,\r\n timestamp: new Date()\r\n }\r\n\r\n setAnnouncements(prev => [...prev, announcement])\r\n }, [])\r\n\r\n // Expose announce method via ref (for parent components)\r\n React.useImperativeHandle(React.forwardRef(() => null), () => ({\r\n announce\r\n }))\r\n\r\n const liveRegionProps = {\r\n 'aria-live': politeAnnouncements ? 'polite' as const : 'assertive' as const,\r\n 'aria-atomic': true,\r\n role: 'status' as const,\r\n className: `sr-only ${className}`.trim()\r\n }\r\n\r\n return (\r\n <>\r\n {/* Main announcement region */}\r\n <div {...liveRegionProps}>\r\n {currentAnnouncement}\r\n </div>\r\n\r\n {/* Polite announcements region (for less critical updates) */}\r\n <div\r\n aria-live=\"polite\"\r\n aria-atomic=\"true\"\r\n role=\"status\"\r\n className=\"sr-only\"\r\n >\r\n {/* This will be used for progress updates and file selection announcements */}\r\n </div>\r\n </>\r\n )\r\n}\r\n\r\n// Hook to use the announcer in components\r\nexport const useAccessibilityAnnouncer = () => {\r\n const announcerRef = useRef<{ announce: (message: string, priority?: 'polite' | 'assertive') => void }>()\r\n\r\n const announce = useCallback((message: string, priority: 'polite' | 'assertive' = 'polite') => {\r\n announcerRef.current?.announce(message, priority)\r\n }, [])\r\n\r\n const announceError = useCallback((error: ProcessedError) => {\r\n if (shouldAnnounceError(error)) {\r\n const message = createErrorAnnouncement(error)\r\n const priority = error.severity === 'critical' || error.severity === 'high' ? 'assertive' : 'polite'\r\n announce(message, priority)\r\n }\r\n }, [announce])\r\n\r\n const announceFileSelection = useCallback((fileCount: number, totalSize?: number) => {\r\n let message = `${fileCount} file${fileCount !== 1 ? 's' : ''} selected`\r\n if (totalSize) {\r\n const sizeMB = (totalSize / 1024 / 1024).toFixed(1)\r\n message += `, total size ${sizeMB} MB`\r\n }\r\n announce(message, 'polite')\r\n }, [announce])\r\n\r\n const announceProgress = useCallback((fileName: string, progress: number) => {\r\n const message = `${fileName} upload ${progress}% complete`\r\n announce(message, 'polite')\r\n }, [announce])\r\n\r\n const announceUploadComplete = useCallback((fileName: string, success: boolean) => {\r\n const message = success\r\n ? `${fileName} uploaded successfully`\r\n : `${fileName} upload failed`\r\n announce(message, success ? 'polite' : 'assertive')\r\n }, [announce])\r\n\r\n return {\r\n announcerRef,\r\n announce,\r\n announceError,\r\n announceFileSelection,\r\n announceProgress,\r\n announceUploadComplete\r\n }\r\n}\r\n\r\nAccessibilityAnnouncer.displayName = 'AccessibilityAnnouncer'","import React, { useCallback } from 'react'\r\nimport { useFileUpload } from '../file-upload-context'\r\nimport { ErrorDisplay } from '../error-display'\r\nimport { AccessibilityAnnouncer } from '../accessibility-announcer'\r\nimport { ErrorAction, ProcessedError } from '../../../utils/error-handling'\r\nimport { cn } from '../../../utils/theme'\r\n\r\ninterface ErrorFeedbackProps {\r\n className?: string\r\n compact?: boolean\r\n showTechnicalDetails?: boolean\r\n maxErrors?: number\r\n groupByType?: boolean\r\n showAccessibilityAnnouncer?: boolean\r\n}\r\n\r\nexport const ErrorFeedback: React.FC<ErrorFeedbackProps> = ({\r\n className,\r\n compact = false,\r\n showTechnicalDetails = false,\r\n maxErrors = 5,\r\n groupByType = false,\r\n showAccessibilityAnnouncer = true\r\n}) => {\r\n const { processedErrors, actions, config } = useFileUpload()\r\n\r\n const handleErrorAction = useCallback((action: ErrorAction, error: ProcessedError) => {\r\n switch (action.type) {\r\n case 'retry':\r\n if (error.context.fileName) {\r\n // Find the file by name and retry\r\n const fileToRetry = actions.state?.files.find(f => f.name === error.context.fileName)\r\n if (fileToRetry) {\r\n actions.retryUpload(fileToRetry.id)\r\n }\r\n } else {\r\n // Retry all failed uploads\r\n actions.retryFailedUploads()\r\n }\r\n actions.dismissError(error.id)\r\n break\r\n\r\n case 'remove':\r\n if (error.context.fileName) {\r\n // Find the file by name and remove\r\n const fileToRemove = actions.state?.files.find(f => f.name === error.context.fileName)\r\n if (fileToRemove) {\r\n actions.removeFile(fileToRemove.id)\r\n }\r\n }\r\n actions.dismissError(error.id)\r\n break\r\n\r\n case 'clear':\r\n actions.clearFailedUploads()\r\n actions.dismissAllErrors()\r\n break\r\n\r\n case 'refresh':\r\n window.location.reload()\r\n break\r\n\r\n case 'contact':\r\n // In a real application, this might open a support modal or redirect to support\r\n console.log('Contact support for error:', error.id)\r\n break\r\n\r\n default:\r\n // Handle custom actions\r\n if (action.handler) {\r\n action.handler()\r\n }\r\n break\r\n }\r\n }, [actions])\r\n\r\n const handleDismissError = useCallback((errorId: string) => {\r\n actions.dismissError(errorId)\r\n }, [actions])\r\n\r\n const handleDismissAllErrors = useCallback(() => {\r\n actions.dismissAllErrors()\r\n }, [actions])\r\n\r\n if (processedErrors.length === 0) {\r\n return showAccessibilityAnnouncer ? (\r\n <AccessibilityAnnouncer\r\n errors={processedErrors}\r\n announceErrors={config.accessibility.announceErrors}\r\n announceProgress={config.accessibility.announceProgress}\r\n announceFileSelection={config.accessibility.announceFileSelection}\r\n />\r\n ) : null\r\n }\r\n\r\n return (\r\n <div className={cn('error-feedback-container', className)}>\r\n {showAccessibilityAnnouncer && (\r\n <AccessibilityAnnouncer\r\n errors={processedErrors}\r\n announceErrors={config.accessibility.announceErrors}\r\n announceProgress={config.accessibility.announceProgress}\r\n announceFileSelection={config.accessibility.announceFileSelection}\r\n />\r\n )}\r\n\r\n <ErrorDisplay\r\n errors={processedErrors}\r\n onAction={handleErrorAction}\r\n onDismiss={handleDismissError}\r\n onDismissAll={handleDismissAllErrors}\r\n compact={compact}\r\n showTechnicalDetails={showTechnicalDetails}\r\n maxErrors={maxErrors}\r\n groupByType={groupByType}\r\n />\r\n </div>\r\n )\r\n}\r\n\r\nErrorFeedback.displayName = 'ErrorFeedback'","import React from 'react'\r\nimport { cn } from '../../../utils/theme'\r\nimport { ProgressBar } from '../progress/progress-bar'\r\nimport { StatusIndicator } from '../progress/status-indicator'\r\nimport { LoadingSpinner } from '../progress/loading-spinner'\r\nimport { AccessibilityAnnouncer } from '../progress/accessibility-announcer'\r\nimport { ErrorFeedback } from './error-feedback'\r\nimport type { UploadFile } from '../file-upload.types'\r\n\r\ninterface UploadFeedbackProps {\r\n files: UploadFile[]\r\n isUploading: boolean\r\n showIndividualProgress?: boolean\r\n showOverallProgress?: boolean\r\n showStatusIndicators?: boolean\r\n showFileNames?: boolean\r\n enableAccessibilityAnnouncements?: boolean\r\n showErrorFeedback?: boolean\r\n showAccessibilityAnnouncer?: boolean\r\n layout?: 'default' | 'compact'\r\n progressSize?: 'sm' | 'md' | 'lg'\r\n statusSize?: 'sm' | 'md' | 'lg'\r\n maxVisibleFiles?: number\r\n className?: string\r\n onRetry?: (fileId: string) => void\r\n onRemove?: (fileId: string) => void\r\n}\r\n\r\nexport const UploadFeedback: React.FC<UploadFeedbackProps> = ({\r\n files = [],\r\n isUploading,\r\n showIndividualProgress = true,\r\n showOverallProgress = true,\r\n showStatusIndicators = true,\r\n showFileNames = true,\r\n enableAccessibilityAnnouncements = true,\r\n showErrorFeedback = true,\r\n showAccessibilityAnnouncer = true,\r\n layout = 'default',\r\n progressSize = 'md',\r\n statusSize = 'md',\r\n maxVisibleFiles = 10,\r\n className,\r\n onRetry,\r\n onRemove\r\n}) => {\r\n if (!files || files.length === 0) {\r\n return null\r\n }\r\n\r\n // Calculate overall progress\r\n const totalProgress = files.reduce((sum, file) => sum + file.progress, 0)\r\n const overallProgress = files.length > 0 ? totalProgress / files.length : 0\r\n\r\n const completedFiles = files.filter(f => f.status === 'success').length\r\n const failedFiles = files.filter(f => f.status === 'error').length\r\n const uploadingFiles = files.filter(f => f.status === 'uploading').length\r\n\r\n // Determine overall status\r\n const overallStatus = failedFiles > 0 && !isUploading\r\n ? 'error'\r\n : completedFiles === files.length && files.length > 0\r\n ? 'success'\r\n : 'default'\r\n\r\n const visibleFiles = files.slice(0, maxVisibleFiles)\r\n const hiddenFilesCount = Math.max(0, files.length - maxVisibleFiles)\r\n\r\n return (\r\n <div className={cn('space-y-4', className)}>\r\n {/* Error Feedback */}\r\n {showErrorFeedback && (\r\n <ErrorFeedback\r\n compact={layout === 'compact'}\r\n showAccessibilityAnnouncer={showAccessibilityAnnouncer}\r\n />\r\n )}\r\n\r\n {enableAccessibilityAnnouncements && (\r\n <AccessibilityAnnouncer\r\n files={files}\r\n isUploading={isUploading}\r\n announceProgress={true}\r\n announceStatus={true}\r\n announceErrors={true}\r\n />\r\n )}\r\n\r\n {/* Overall Progress */}\r\n {showOverallProgress && files.length > 1 && (\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-2\">\r\n {isUploading && <LoadingSpinner size=\"sm\" />}\r\n <span className=\"text-sm font-medium\">\r\n {isUploading ? 'Uploading files...' : 'Upload complete'}\r\n </span>\r\n </div>\r\n <span className=\"text-xs text-gray-600\">\r\n {completedFiles}/{files.length} files\r\n </span>\r\n </div>\r\n\r\n <ProgressBar\r\n progress={overallProgress}\r\n variant={overallStatus}\r\n showPercentage={true}\r\n aria-label={`Overall upload progress: ${Math.round(overallProgress)}%`}\r\n />\r\n\r\n <div className=\"flex justify-between text-xs text-gray-600\">\r\n <div className=\"flex gap-4\">\r\n {completedFiles > 0 && (\r\n <span className=\"text-green-600\">\r\n ✓ {completedFiles} completed\r\n </span>\r\n )}\r\n {uploadingFiles > 0 && (\r\n <span className=\"text-blue-600\">\r\n ↑ {uploadingFiles} uploading\r\n </span>\r\n )}\r\n {failedFiles > 0 && (\r\n <span className=\"text-red-600\">\r\n ✗ {failedFiles} failed\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Individual File Progress */}\r\n {showIndividualProgress && (\r\n <div className=\"space-y-3\">\r\n {visibleFiles.map((file) => (\r\n <div\r\n key={file.id}\r\n className=\"flex items-center gap-3 p-3 bg-gray-50 rounded-lg\"\r\n >\r\n {/* Status Indicator */}\r\n {showStatusIndicators && (\r\n <StatusIndicator\r\n status={file.status}\r\n size=\"sm\"\r\n aria-label={`${file.name} status: ${file.status}`}\r\n />\r\n )}\r\n\r\n {/* File Info */}\r\n <div className=\"flex-1 min-w-0\">\r\n {showFileNames && (\r\n <div className=\"flex items-center justify-between mb-1\">\r\n <span className=\"text-sm font-medium truncate\">\r\n {file.name}\r\n </span>\r\n <span className=\"text-xs text-gray-500 ml-2\">\r\n {(file.size / 1024 / 1024).toFixed(1)} MB\r\n </span>\r\n </div>\r\n )}\r\n\r\n {/* Progress Bar for individual file */}\r\n {(file.status === 'uploading' || file.progress > 0) && (\r\n <ProgressBar\r\n progress={file.progress}\r\n size=\"sm\"\r\n variant={\r\n file.status === 'error'\r\n ? 'error'\r\n : file.status === 'success'\r\n ? 'success'\r\n : 'default'\r\n }\r\n showPercentage={file.status === 'uploading'}\r\n aria-label={`${file.name} upload progress: ${file.progress}%`}\r\n />\r\n )}\r\n\r\n {/* Error Message */}\r\n {file.status === 'error' && file.error && (\r\n <div className=\"mt-1 text-xs text-red-600\">\r\n {file.error}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Action Buttons */}\r\n <div className=\"flex items-center gap-2\">\r\n {file.status === 'error' && onRetry && (\r\n <button\r\n onClick={() => onRetry(file.id)}\r\n className=\"text-xs text-blue-600 hover:text-blue-800 px-2 py-1 rounded border border-blue-200 hover:border-blue-300\"\r\n aria-label={`Retry upload for ${file.name}`}\r\n >\r\n Retry\r\n </button>\r\n )}\r\n\r\n {onRemove && file.status !== 'uploading' && (\r\n <button\r\n onClick={() => onRemove(file.id)}\r\n className=\"text-xs text-gray-600 hover:text-red-600 px-2 py-1 rounded border border-gray-200 hover:border-red-300\"\r\n aria-label={`Remove ${file.name}`}\r\n >\r\n Remove\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n\r\n {/* Hidden Files Indicator */}\r\n {hiddenFilesCount > 0 && (\r\n <div className=\"text-center text-sm text-gray-600 py-2\">\r\n ... and {hiddenFilesCount} more file{hiddenFilesCount === 1 ? '' : 's'}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}","import React, { useRef, useCallback } from 'react'\r\nimport { Slot } from '@radix-ui/react-slot'\r\nimport { useFileUpload } from '../file-upload-context'\r\nimport { validateFiles } from '../../../utils/file-validation'\r\nimport { generateThemeClasses, cn } from '../../../utils/theme'\r\nimport { UploadFeedback } from '../feedback'\r\nimport { LoadingSpinner, ProgressBar, StatusIndicator } from '../progress'\r\nimport type { ButtonUploadProps } from '../file-upload.types'\r\n\r\nexport const ButtonUpload: React.FC<ButtonUploadProps> = ({\r\n className = '',\r\n style,\r\n ariaLabel,\r\n ariaDescribedBy,\r\n children,\r\n buttonText,\r\n icon,\r\n iconPosition = 'left',\r\n asChild = false,\r\n disabled: propDisabled,\r\n multiple: propMultiple,\r\n accept: propAccept,\r\n maxSize: propMaxSize,\r\n maxFiles: propMaxFiles,\r\n onFileSelect,\r\n onError,\r\n ...props\r\n}) => {\r\n const { config, actions, state } = useFileUpload()\r\n const inputRef = useRef<HTMLInputElement>(null)\r\n\r\n // Merge props with config defaults\r\n const disabled = propDisabled ?? config.defaults.disabled ?? false\r\n const multiple = propMultiple ?? config.defaults.multiple ?? false\r\n const accept = propAccept ?? config.defaults.accept ?? '*'\r\n const maxSize = propMaxSize ?? config.validation.maxSize\r\n const maxFiles = propMaxFiles ?? config.validation.maxFiles\r\n\r\n const handleFileSelect = useCallback(async (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = Array.from(event.target.files || [])\r\n if (files.length === 0) return\r\n\r\n try {\r\n // Validate files using the validation utility\r\n const validationResult = await validateFiles(files, {\r\n ...config,\r\n validation: {\r\n ...config.validation,\r\n maxSize,\r\n maxFiles,\r\n allowedTypes: accept === '*' ? ['*'] : accept.split(',').map(t => t.trim())\r\n }\r\n }, state.files.length)\r\n\r\n if (validationResult.validFiles.length > 0) {\r\n actions.selectFiles(validationResult.validFiles)\r\n onFileSelect?.(validationResult.validFiles)\r\n }\r\n\r\n // Handle rejected files\r\n if (validationResult.rejectedFiles.length > 0) {\r\n const errorMessage = validationResult.rejectedFiles\r\n .map(rf => `${rf.file.name}: ${rf.errors.map(e => e.message).join(', ')}`)\r\n .join('\\n')\r\n onError?.(errorMessage)\r\n }\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'File validation failed'\r\n onError?.(errorMessage)\r\n }\r\n\r\n // Reset input value to allow selecting the same file again\r\n event.target.value = ''\r\n }, [config, maxSize, maxFiles, accept, state.files.length, actions, onFileSelect, onError])\r\n\r\n const handleButtonClick = useCallback(() => {\r\n if (disabled || state.isUploading) return\r\n inputRef.current?.click()\r\n }, [disabled, state.isUploading])\r\n\r\n const handleKeyDown = useCallback((event: React.KeyboardEvent) => {\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault()\r\n handleButtonClick()\r\n }\r\n }, [handleButtonClick])\r\n\r\n // Generate theme classes using the theming system\r\n const getButtonClasses = () => {\r\n const themeClasses = generateThemeClasses(\r\n 'button',\r\n config.defaults.size,\r\n config.defaults.radius,\r\n config,\r\n ['file-upload--primary']\r\n )\r\n\r\n const additionalClasses = [\r\n 'inline-flex items-center justify-center gap-2',\r\n disabled || state.isUploading ? 'file-upload--disabled' : '',\r\n state.isUploading ? 'file-upload--loading' : ''\r\n ]\r\n\r\n return cn(themeClasses, ...additionalClasses, className)\r\n }\r\n\r\n const renderButtonContent = () => {\r\n const text = buttonText || children || config.labels.selectFilesText\r\n const showIcon = icon && !state.isUploading\r\n const showCount = state.files.length > 0\r\n\r\n if (state.isUploading) {\r\n return (\r\n <>\r\n <LoadingSpinner size=\"sm\" color=\"primary\" />\r\n {config.labels.progressText}\r\n </>\r\n )\r\n }\r\n\r\n return (\r\n <>\r\n {showIcon && iconPosition === 'left' && icon}\r\n <span>\r\n {text}\r\n {showCount && (\r\n <span className=\"ml-1 text-xs opacity-75\">\r\n ({state.files.length} {state.files.length === 1 ? 'file' : 'files'})\r\n </span>\r\n )}\r\n </span>\r\n {showIcon && iconPosition === 'right' && icon}\r\n </>\r\n )\r\n }\r\n\r\n const buttonProps = {\r\n type: 'button' as const,\r\n className: getButtonClasses(),\r\n onClick: handleButtonClick,\r\n onKeyDown: handleKeyDown,\r\n disabled: disabled || state.isUploading,\r\n 'aria-label': ariaLabel || config.labels.selectFilesText,\r\n 'aria-describedby': ariaDescribedBy,\r\n 'aria-pressed': state.files.length > 0,\r\n style,\r\n ...props\r\n }\r\n\r\n const Comp = asChild ? Slot : 'button'\r\n\r\n return (\r\n <div className=\"file-upload-button-container\">\r\n {/* Hidden file input */}\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n multiple={multiple}\r\n accept={accept}\r\n disabled={disabled || state.isUploading}\r\n onChange={handleFileSelect}\r\n className=\"sr-only\"\r\n aria-hidden=\"true\"\r\n tabIndex={-1}\r\n />\r\n\r\n {/* Button component */}\r\n <Comp {...buttonProps}>\r\n {renderButtonContent()}\r\n </Comp>\r\n\r\n {/* Overall progress feedback */}\r\n {state.files.length > 0 && (\r\n <div className=\"mt-4\">\r\n <UploadFeedback\r\n showOverallProgress={true}\r\n showIndividualProgress={false}\r\n showStatusIndicator={true}\r\n showAccessibilityAnnouncer={true}\r\n layout=\"compact\"\r\n progressSize=\"sm\"\r\n statusSize=\"sm\"\r\n />\r\n </div>\r\n )}\r\n\r\n {/* File list display */}\r\n {state.files.length > 0 && (\r\n <div className=\"mt-4 space-y-2\" role=\"list\" aria-label=\"Selected files\">\r\n {state.files.map((file) => (\r\n <div\r\n key={file.id}\r\n className={cn(\r\n 'flex items-center justify-between',\r\n 'file-upload--sm',\r\n 'file-upload--radius-md',\r\n 'border border-[var(--file-upload-border)]',\r\n 'bg-[var(--file-upload-background)]',\r\n 'text-[var(--file-upload-foreground)]'\r\n )}\r\n role=\"listitem\"\r\n >\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"font-medium truncate\" style={{ fontSize: 'var(--file-upload-font-size-sm)' }}>\r\n {file.name}\r\n </p>\r\n <p className=\"text-[var(--file-upload-muted)]\" style={{ fontSize: 'var(--file-upload-font-size-sm)' }}>\r\n {(file.size / 1024 / 1024).toFixed(2)} MB\r\n </p>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2 ml-4\">\r\n <StatusIndicator\r\n status={file.status}\r\n size=\"sm\"\r\n showText={false}\r\n />\r\n\r\n {file.status === 'uploading' && (\r\n <div className=\"w-16\">\r\n <ProgressBar\r\n file={file}\r\n size=\"sm\"\r\n showLabel={false}\r\n showPercentage={false}\r\n />\r\n </div>\r\n )}\r\n\r\n {file.status === 'pending' && (\r\n <button\r\n type=\"button\"\r\n onClick={() => actions.removeFile(file.id)}\r\n className={cn(\r\n generateThemeClasses('button', 'sm', 'sm', config, ['file-upload--error', 'file-upload--outline'])\r\n )}\r\n aria-label={`Remove ${file.name}`}\r\n >\r\n {config.labels.removeText}\r\n </button>\r\n )}\r\n\r\n {file.status === 'error' && (\r\n <button\r\n type=\"button\"\r\n onClick={() => actions.retryUpload(file.id)}\r\n className={cn(\r\n generateThemeClasses('button', 'sm', 'sm', config, ['file-upload--error', 'file-upload--outline'])\r\n )}\r\n aria-label={`Retry upload for ${file.name}`}\r\n >\r\n {config.labels.retryText}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n\r\n {/* Upload all button */}\r\n {state.files.some(f => f.status === 'pending') && !config.features.autoUpload && (\r\n <button\r\n type=\"button\"\r\n onClick={actions.uploadFiles}\r\n disabled={state.isUploading}\r\n className={cn(\r\n generateThemeClasses('button', 'md', config.defaults.radius, config, ['file-upload--success']),\r\n 'w-full mt-3',\r\n state.isUploading ? 'file-upload--disabled' : ''\r\n )}\r\n >\r\n {state.isUploading ? config.labels.progressText : 'Upload Files'}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nButtonUpload.displayName = 'ButtonUpload'","import React, { useRef, useState, useCallback, useEffect } from 'react'\r\nimport { useFileUpload } from '../file-upload-context'\r\nimport { UploadFeedback } from '../feedback'\r\nimport { LoadingSpinner, ProgressBar, StatusIndicator } from '../progress'\r\n\r\ninterface DropzoneUploadProps {\r\n className?: string\r\n style?: React.CSSProperties\r\n ariaLabel?: string\r\n ariaDescribedBy?: string\r\n onDragEnter?: (event: React.DragEvent) => void\r\n onDragLeave?: (event: React.DragEvent) => void\r\n onDragOver?: (event: React.DragEvent) => void\r\n onDrop?: (event: React.DragEvent) => void\r\n children?: React.ReactNode\r\n height?: string | number\r\n showBorder?: boolean\r\n dropzoneText?: string\r\n activeDropzoneText?: string\r\n}\r\n\r\nexport const DropzoneUpload: React.FC<DropzoneUploadProps> = ({\r\n className,\r\n style,\r\n ariaLabel,\r\n ariaDescribedBy,\r\n onDragEnter,\r\n onDragLeave,\r\n onDragOver,\r\n onDrop,\r\n children,\r\n height = '200px',\r\n showBorder = true,\r\n dropzoneText,\r\n activeDropzoneText\r\n}) => {\r\n const { config, actions, state } = useFileUpload()\r\n const inputRef = useRef<HTMLInputElement>(null)\r\n const dropzoneRef = useRef<HTMLDivElement>(null)\r\n const [isDragOver, setIsDragOver] = useState(false)\r\n const [dragCounter, setDragCounter] = useState(0)\r\n const [isFocused, setIsFocused] = useState(false)\r\n\r\n // Handle file selection from input\r\n const handleFileSelect = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = Array.from(event.target.files || [])\r\n if (files.length > 0) {\r\n actions.selectFiles(files)\r\n }\r\n // Reset input value to allow selecting the same file again\r\n event.target.value = ''\r\n }, [actions])\r\n\r\n // Handle click to open file dialog\r\n const handleClick = useCallback(() => {\r\n if (!config.defaults.disabled && !state.isUploading) {\r\n inputRef.current?.click()\r\n }\r\n }, [config.defaults.disabled, state.isUploading])\r\n\r\n // Enhanced keyboard navigation\r\n const handleKeyDown = useCallback((event: React.KeyboardEvent) => {\r\n if (config.defaults.disabled || state.isUploading) return\r\n\r\n switch (event.key) {\r\n case 'Enter':\r\n case ' ':\r\n event.preventDefault()\r\n handleClick()\r\n break\r\n case 'Escape':\r\n if (isDragOver) {\r\n event.preventDefault()\r\n setIsDragOver(false)\r\n setDragCounter(0)\r\n }\r\n break\r\n default:\r\n break\r\n }\r\n }, [config.defaults.disabled, state.isUploading, handleClick, isDragOver])\r\n\r\n // Focus management\r\n const handleFocus = useCallback(() => {\r\n setIsFocused(true)\r\n }, [])\r\n\r\n const handleBlur = useCallback(() => {\r\n setIsFocused(false)\r\n }, [])\r\n\r\n // Enhanced drag event handlers with proper counter management\r\n const handleDragEnter = useCallback((event: React.DragEvent) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n if (config.defaults.disabled || state.isUploading || !config.features.dragAndDrop) {\r\n return\r\n }\r\n\r\n setDragCounter(prev => prev + 1)\r\n\r\n // Only set drag over on first enter\r\n if (dragCounter === 0) {\r\n setIsDragOver(true)\r\n }\r\n\r\n onDragEnter?.(event)\r\n }, [config.defaults.disabled, state.isUploading, config.features.dragAndDrop, dragCounter, onDragEnter])\r\n\r\n const handleDragLeave = useCallback((event: React.DragEvent) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n if (config.defaults.disabled || state.isUploading || !config.features.dragAndDrop) {\r\n return\r\n }\r\n\r\n setDragCounter(prev => {\r\n const newCounter = prev - 1\r\n // Only remove drag over when counter reaches 0\r\n if (newCounter === 0) {\r\n setIsDragOver(false)\r\n }\r\n return newCounter\r\n })\r\n\r\n onDragLeave?.(event)\r\n }, [config.defaults.disabled, state.isUploading, config.features.dragAndDrop, onDragLeave])\r\n\r\n const handleDragOver = useCallback((event: React.DragEvent) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n if (config.defaults.disabled || state.isUploading || !config.features.dragAndDrop) {\r\n return\r\n }\r\n\r\n // Set the dropEffect to indicate what will happen on drop\r\n event.dataTransfer.dropEffect = 'copy'\r\n\r\n onDragOver?.(event)\r\n }, [config.defaults.disabled, state.isUploading, config.features.dragAndDrop, onDragOver])\r\n\r\n const handleDrop = useCallback((event: React.DragEvent) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n if (config.defaults.disabled || state.isUploading || !config.features.dragAndDrop) {\r\n return\r\n }\r\n\r\n // Reset drag state\r\n setIsDragOver(false)\r\n setDragCounter(0)\r\n\r\n const files = Array.from(event.dataTransfer.files)\r\n if (files.length > 0) {\r\n actions.selectFiles(files)\r\n }\r\n\r\n onDrop?.(event)\r\n }, [config.defaults.disabled, state.isUploading, config.features.dragAndDrop, actions, onDrop])\r\n\r\n // Reset drag state on component unmount or when disabled\r\n useEffect(() => {\r\n if (config.defaults.disabled || state.isUploading) {\r\n setIsDragOver(false)\r\n setDragCounter(0)\r\n }\r\n }, [config.defaults.disabled, state.isUploading])\r\n\r\n // Determine visual state for styling\r\n const isDisabled = config.defaults.disabled || state.isUploading\r\n const isActive = isDragOver && !isDisabled\r\n const hasFocus = isFocused && !isDisabled\r\n\r\n // Build CSS classes\r\n const dropzoneClasses = [\r\n 'file-upload-dropzone',\r\n `file-upload-dropzone--${config.defaults.size}`,\r\n `file-upload-dropzone--${config.defaults.radius}`,\r\n isDisabled ? 'file-upload-dropzone--disabled' : '',\r\n state.isUploading ? 'file-upload-dropzone--uploading' : '',\r\n isActive ? 'file-upload-dropzone--drag-over' : '',\r\n hasFocus ? 'file-upload-dropzone--focused' : '',\r\n className || ''\r\n ].filter(Boolean).join(' ')\r\n\r\n // Dynamic styling based on state\r\n const dropzoneStyle: React.CSSProperties = {\r\n border: showBorder ? `2px ${config.styling.borders.style} ${isActive ? config.styling.colors.primary :\r\n hasFocus ? config.styling.colors.primary :\r\n config.styling.colors.border\r\n }` : 'none',\r\n borderRadius: config.styling.spacing.borderRadius,\r\n padding: '2rem',\r\n textAlign: 'center' as const,\r\n cursor: isDisabled ? 'not-allowed' : 'pointer',\r\n backgroundColor: isActive ? `${config.styling.colors.primary}15` :\r\n hasFocus ? `${config.styling.colors.primary}08` :\r\n config.styling.colors.background,\r\n color: config.styling.colors.foreground,\r\n fontSize: config.styling.typography.fontSize,\r\n transition: config.animations.enabled ?\r\n `all ${config.animations.duration}ms ${config.animations.easing}` : 'none',\r\n opacity: isDisabled ? 0.6 : 1,\r\n minHeight: typeof height === 'number' ? `${height}px` : height,\r\n height: typeof height === 'number' ? `${height}px` : height,\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: config.styling.spacing.gap,\r\n outline: hasFocus ? `2px solid ${config.styling.colors.primary}` : 'none',\r\n outlineOffset: '2px',\r\n boxShadow: isActive ? config.styling.shadows.md :\r\n hasFocus ? config.styling.shadows.sm : 'none',\r\n ...style\r\n }\r\n\r\n return (\r\n <div className=\"file-upload file-upload--dropzone\">\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n multiple={config.defaults.multiple}\r\n accept={config.defaults.accept}\r\n disabled={isDisabled}\r\n onChange={handleFileSelect}\r\n className=\"sr-only\"\r\n aria-hidden=\"true\"\r\n tabIndex={-1}\r\n />\r\n\r\n <div\r\n ref={dropzoneRef}\r\n className={dropzoneClasses}\r\n onClick={handleClick}\r\n onKeyDown={handleKeyDown}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n onDragEnter={config.features.dragAndDrop ? handleDragEnter : undefined}\r\n onDragLeave={config.features.dragAndDrop ? handleDragLeave : undefined}\r\n onDragOver={config.features.dragAndDrop ? handleDragOver : undefined}\r\n onDrop={config.features.dragAndDrop ? handleDrop : undefined}\r\n role=\"button\"\r\n tabIndex={isDisabled ? -1 : 0}\r\n aria-label={ariaLabel || (\r\n isActive ? (activeDropzoneText || config.labels.dropText) :\r\n (dropzoneText || config.labels.dragText)\r\n )}\r\n aria-describedby={ariaDescribedBy}\r\n aria-disabled={isDisabled}\r\n aria-pressed={state.files.length > 0}\r\n style={dropzoneStyle}\r\n >\r\n {children || (\r\n <>\r\n <div className=\"file-upload-dropzone-icon\" style={{\r\n fontSize: '2rem',\r\n color: isDragOver ? config.styling.colors.primary : config.styling.colors.muted\r\n }}>\r\n 📁\r\n </div>\r\n\r\n <div className=\"file-upload-dropzone-text\">\r\n <div className=\"file-upload-dropzone-primary-text\" style={{\r\n fontWeight: '600',\r\n marginBottom: '0.5rem',\r\n color: isDragOver ? config.styling.colors.primary : config.styling.colors.foreground\r\n }}>\r\n {isDragOver ? config.labels.dropText : config.labels.dragText}\r\n </div>\r\n\r\n <div className=\"file-upload-dropzone-secondary-text\" style={{\r\n fontSize: '0.875rem',\r\n color: config.styling.colors.muted\r\n }}>\r\n or <span style={{ color: config.styling.colors.primary, textDecoration: 'underline' }}>\r\n {config.labels.browseText}\r\n </span> to choose files\r\n </div>\r\n </div>\r\n\r\n {state.files.length > 0 && (\r\n <div className=\"file-upload-dropzone-count\" style={{\r\n fontSize: '0.875rem',\r\n color: config.styling.colors.primary,\r\n fontWeight: '500'\r\n }}>\r\n {state.files.length} {state.files.length === 1 ? 'file' : 'files'} selected\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Overall progress feedback */}\r\n {state.files.length > 0 && (\r\n <div style={{ marginTop: config.styling.spacing.margin }}>\r\n <UploadFeedback\r\n showOverallProgress={true}\r\n showIndividualProgress={false}\r\n showStatusIndicator={true}\r\n showAccessibilityAnnouncer={true}\r\n layout=\"vertical\"\r\n progressSize=\"md\"\r\n statusSize=\"sm\"\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Display selected files */}\r\n {state.files.length > 0 && (\r\n <div className=\"file-upload-files\" style={{ marginTop: config.styling.spacing.margin }}>\r\n {state.files.map(file => (\r\n <div key={file.id} className=\"file-upload-file-item\" style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: '0.75rem',\r\n border: `1px solid ${config.styling.colors.border}`,\r\n borderRadius: config.styling.spacing.borderRadius,\r\n marginBottom: '0.5rem',\r\n backgroundColor: config.styling.colors.background\r\n }}>\r\n <div className=\"file-upload-file-info\">\r\n <div className=\"file-upload-file-name\" style={{\r\n fontWeight: '500',\r\n color: config.styling.colors.foreground\r\n }}>\r\n {file.name}\r\n </div>\r\n <div className=\"file-upload-file-size\" style={{\r\n fontSize: '0.75rem',\r\n color: config.styling.colors.muted\r\n }}>\r\n {(file.size / 1024).toFixed(1)} KB\r\n </div>\r\n </div>\r\n\r\n <div className=\"file-upload-file-actions\" style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '0.5rem'\r\n }}>\r\n <StatusIndicator\r\n status={file.status}\r\n size=\"sm\"\r\n showText={false}\r\n />\r\n\r\n {file.status === 'uploading' && (\r\n <div style={{ width: '60px' }}>\r\n <ProgressBar\r\n file={file}\r\n size=\"sm\"\r\n showLabel={false}\r\n showPercentage={true}\r\n />\r\n </div>\r\n )}\r\n\r\n {file.status === 'error' && (\r\n <button\r\n type=\"button\"\r\n onClick={() => actions.retryUpload(file.id)}\r\n className=\"file-upload-retry-button\"\r\n style={{\r\n background: 'none',\r\n border: `1px solid ${config.styling.colors.error}`,\r\n color: config.styling.colors.error,\r\n cursor: 'pointer',\r\n fontSize: '0.75rem',\r\n padding: '0.25rem 0.5rem',\r\n borderRadius: '0.25rem'\r\n }}\r\n aria-label={`${config.labels.retryText} ${file.name}`}\r\n >\r\n {config.labels.retryText}\r\n </button>\r\n )}\r\n\r\n {file.status === 'pending' && (\r\n <button\r\n type=\"button\"\r\n onClick={() => actions.removeFile(file.id)}\r\n className=\"file-upload-remove-button\"\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: config.styling.colors.error,\r\n cursor: 'pointer',\r\n fontSize: '1.25rem',\r\n padding: '0.25rem'\r\n }}\r\n aria-label={`${config.labels.removeText} ${file.name}`}\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n\r\n {/* Upload button */}\r\n {state.files.some(f => f.status === 'pending') && (\r\n <button\r\n type=\"button\"\r\n onClick={actions.uploadFiles}\r\n disabled={state.isUploading}\r\n className=\"file-upload-upload-button\"\r\n style={{\r\n backgroundColor: config.styling.colors.primary,\r\n color: config.styling.colors.background,\r\n padding: '0.75rem 1.5rem',\r\n border: 'none',\r\n borderRadius: config.styling.spacing.borderRadius,\r\n cursor: state.isUploading ? 'not-allowed' : 'pointer',\r\n opacity: state.isUploading ? 0.6 : 1,\r\n fontSize: config.styling.typography.fontSize,\r\n fontWeight: '500',\r\n width: '100%',\r\n marginTop: '1rem'\r\n }}\r\n >\r\n {state.isUploading ? config.labels.progressText : 'Upload Files'}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nDropzoneUpload.displayName = 'DropzoneUpload'","import React, { useRef, useCallback, useEffect, useState } from 'react'\r\nimport { useFileUpload } from '../file-upload-context'\r\nimport { validateFiles, formatFileSize, isImageFile } from '../../../utils/file-validation'\r\nimport type { PreviewUploadProps } from '../file-upload.types'\r\n\r\ninterface FilePreview {\r\n id: string\r\n url: string\r\n type: 'image' | 'icon'\r\n}\r\n\r\nexport const PreviewUpload: React.FC<PreviewUploadProps> = ({\r\n className = '',\r\n style,\r\n ariaLabel,\r\n ariaDescribedBy,\r\n children,\r\n previewSize = 'md',\r\n showFileInfo = true,\r\n allowReorder = false,\r\n disabled: propDisabled,\r\n multiple: propMultiple,\r\n accept: propAccept,\r\n maxSize: propMaxSize,\r\n maxFiles: propMaxFiles,\r\n onFileSelect,\r\n onError,\r\n onFileRemove\r\n}) => {\r\n const { config, actions, state } = useFileUpload()\r\n const inputRef = useRef<HTMLInputElement>(null)\r\n const [previews, setPreviews] = useState<Map<string, FilePreview>>(new Map())\r\n const [focusedFileIndex, setFocusedFileIndex] = useState<number>(-1)\r\n\r\n // Merge props with config defaults\r\n const disabled = propDisabled ?? config.defaults.disabled ?? false\r\n const multiple = propMultiple ?? config.defaults.multiple ?? false\r\n const accept = propAccept ?? config.defaults.accept ?? '*'\r\n const maxSize = propMaxSize ?? config.validation.maxSize\r\n const maxFiles = propMaxFiles ?? config.validation.maxFiles\r\n\r\n // Generate image thumbnails for image files\r\n const generateImageThumbnail = useCallback(async (file: File): Promise<string> => {\r\n return new Promise((resolve, reject) => {\r\n if (!isImageFile(file)) {\r\n reject(new Error('Not an image file'))\r\n return\r\n }\r\n\r\n const canvas = document.createElement('canvas')\r\n const ctx = canvas.getContext('2d')\r\n const img = new Image()\r\n\r\n img.onload = () => {\r\n // Calculate thumbnail dimensions while maintaining aspect ratio\r\n const maxDimension = previewSize === 'sm' ? 80 : previewSize === 'lg' ? 200 : 120\r\n let { width, height } = img\r\n\r\n if (width > height) {\r\n if (width > maxDimension) {\r\n height = (height * maxDimension) / width\r\n width = maxDimension\r\n }\r\n } else {\r\n if (height > maxDimension) {\r\n width = (width * maxDimension) / height\r\n height = maxDimension\r\n }\r\n }\r\n\r\n canvas.width = width\r\n canvas.height = height\r\n\r\n if (ctx) {\r\n ctx.drawImage(img, 0, 0, width, height)\r\n resolve(canvas.toDataURL('image/jpeg', 0.8))\r\n } else {\r\n reject(new Error('Could not get canvas context'))\r\n }\r\n\r\n URL.revokeObjectURL(img.src)\r\n }\r\n\r\n img.onerror = () => {\r\n URL.revokeObjectURL(img.src)\r\n reject(new Error('Failed to load image'))\r\n }\r\n\r\n img.src = URL.createObjectURL(file)\r\n })\r\n }, [previewSize])\r\n\r\n // Generate file preview (thumbnail for images, icon for others)\r\n const generateFilePreview = useCallback(async (file: File): Promise<FilePreview> => {\r\n if (isImageFile(file)) {\r\n try {\r\n const thumbnailUrl = await generateImageThumbnail(file)\r\n return {\r\n id: `preview_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`,\r\n url: thumbnailUrl,\r\n type: 'image'\r\n }\r\n } catch (error) {\r\n console.warn('Failed to generate thumbnail:', error)\r\n return {\r\n id: `preview_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`,\r\n url: getFileIcon(file),\r\n type: 'icon'\r\n }\r\n }\r\n } else {\r\n return {\r\n id: `preview_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`,\r\n url: getFileIcon(file),\r\n type: 'icon'\r\n }\r\n }\r\n }, [generateImageThumbnail])\r\n\r\n // Get file type icon\r\n const getFileIcon = useCallback((file: File): string => {\r\n if (file.type.startsWith('image/')) return '🖼️'\r\n if (file.type.startsWith('video/')) return '🎥'\r\n if (file.type.startsWith('audio/')) return '🎵'\r\n if (file.type.includes('pdf')) return '📄'\r\n if (file.type.includes('text')) return '📝'\r\n if (file.type.includes('zip') || file.type.includes('archive')) return '📦'\r\n if (file.type.includes('word')) return '📝'\r\n if (file.type.includes('excel') || file.type.includes('spreadsheet')) return '📊'\r\n if (file.type.includes('powerpoint') || file.type.includes('presentation')) return '📽️'\r\n return '📁'\r\n }, [])\r\n\r\n // Update previews when files change\r\n useEffect(() => {\r\n const updatePreviews = async () => {\r\n const newPreviews = new Map<string, FilePreview>()\r\n\r\n for (const uploadFile of state.files) {\r\n if (!previews.has(uploadFile.id)) {\r\n const preview = await generateFilePreview(uploadFile.file)\r\n newPreviews.set(uploadFile.id, preview)\r\n } else {\r\n newPreviews.set(uploadFile.id, previews.get(uploadFile.id)!)\r\n }\r\n }\r\n\r\n setPreviews(newPreviews)\r\n }\r\n\r\n updatePreviews()\r\n }, [state.files, generateFilePreview])\r\n\r\n // Handle file selection with validation\r\n const handleFileSelect = useCallback(async (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = Array.from(event.target.files || [])\r\n if (files.length === 0) return\r\n\r\n try {\r\n // Validate files using the validation utility\r\n const validationResult = await validateFiles(files, {\r\n ...config,\r\n validation: {\r\n ...config.validation,\r\n maxSize,\r\n maxFiles,\r\n allowedTypes: accept === '*' ? ['*'] : accept.split(',').map(t => t.trim())\r\n }\r\n }, state.files.length)\r\n\r\n if (validationResult.validFiles.length > 0) {\r\n actions.selectFiles(validationResult.validFiles)\r\n onFileSelect?.(validationResult.validFiles)\r\n }\r\n\r\n // Handle rejected files\r\n if (validationResult.rejectedFiles.length > 0) {\r\n const errorMessage = validationResult.rejectedFiles\r\n .map(rf => `${rf.file.name}: ${rf.errors.map(e => e.message).join(', ')}`)\r\n .join('\\n')\r\n onError?.(errorMessage)\r\n }\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'File validation failed'\r\n onError?.(errorMessage)\r\n }\r\n\r\n // Reset input value to allow selecting the same file again\r\n event.target.value = ''\r\n }, [config, maxSize, maxFiles, accept, state.files.length, actions, onFileSelect, onError])\r\n\r\n // Handle button click to open file dialog\r\n const handleButtonClick = useCallback(() => {\r\n if (disabled || state.isUploading) return\r\n inputRef.current?.click()\r\n }, [disabled, state.isUploading])\r\n\r\n // Handle keyboard navigation for button\r\n const handleButtonKeyDown = useCallback((event: React.KeyboardEvent) => {\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault()\r\n handleButtonClick()\r\n }\r\n }, [handleButtonClick])\r\n\r\n // Handle file removal with keyboard support\r\n const handleRemoveFile = useCallback((fileId: string, fileName: string) => {\r\n actions.removeFile(fileId)\r\n onFileRemove?.(fileId)\r\n\r\n // Clean up preview\r\n const preview = previews.get(fileId)\r\n if (preview && preview.type === 'image' && preview.url.startsWith('data:')) {\r\n // No need to revoke data URLs, but we can remove from map\r\n setPreviews(prev => {\r\n const newPreviews = new Map(prev)\r\n newPreviews.delete(fileId)\r\n return newPreviews\r\n })\r\n }\r\n\r\n // Announce removal for screen readers\r\n if (config.accessibility.announceFileSelection) {\r\n const announcement = `File ${fileName} removed`\r\n // Create temporary element for screen reader announcement\r\n const announcer = document.createElement('div')\r\n announcer.setAttribute('aria-live', 'polite')\r\n announcer.setAttribute('aria-atomic', 'true')\r\n announcer.className = 'sr-only'\r\n announcer.textContent = announcement\r\n document.body.appendChild(announcer)\r\n setTimeout(() => document.body.removeChild(announcer), 1000)\r\n }\r\n }, [actions, onFileRemove, previews, config.accessibility.announceFileSelection])\r\n\r\n // Handle keyboard navigation for file list\r\n const handleFileListKeyDown = useCallback((event: React.KeyboardEvent, fileIndex: number, fileId: string, fileName: string) => {\r\n switch (event.key) {\r\n case 'Delete':\r\n case 'Backspace':\r\n event.preventDefault()\r\n handleRemoveFile(fileId, fileName)\r\n break\r\n case 'ArrowDown':\r\n event.preventDefault()\r\n setFocusedFileIndex(Math.min(fileIndex + 1, state.files.length - 1))\r\n break\r\n case 'ArrowUp':\r\n event.preventDefault()\r\n setFocusedFileIndex(Math.max(fileIndex - 1, 0))\r\n break\r\n case 'Home':\r\n event.preventDefault()\r\n setFocusedFileIndex(0)\r\n break\r\n case 'End':\r\n event.preventDefault()\r\n setFocusedFileIndex(state.files.length - 1)\r\n break\r\n }\r\n }, [handleRemoveFile, state.files.length])\r\n\r\n // Get preview size classes\r\n const getPreviewSizeClasses = () => {\r\n const sizeMap = {\r\n sm: { container: 'min-w-[150px]', media: 'h-20', text: 'text-xs' },\r\n md: { container: 'min-w-[200px]', media: 'h-28', text: 'text-sm' },\r\n lg: { container: 'min-w-[250px]', media: 'h-36', text: 'text-base' }\r\n }\r\n return sizeMap[previewSize] || sizeMap.md\r\n }\r\n\r\n const sizeClasses = getPreviewSizeClasses()\r\n\r\n return (\r\n <div className={`file-upload file-upload--preview ${className}`} style={style}>\r\n {/* Hidden file input */}\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n multiple={multiple}\r\n accept={accept}\r\n disabled={disabled || state.isUploading}\r\n onChange={handleFileSelect}\r\n className=\"sr-only\"\r\n aria-hidden=\"true\"\r\n tabIndex={-1}\r\n />\r\n\r\n {/* Upload Button */}\r\n <button\r\n type=\"button\"\r\n onClick={handleButtonClick}\r\n onKeyDown={handleButtonKeyDown}\r\n disabled={disabled || state.isUploading}\r\n aria-label={ariaLabel || config.labels.selectFilesText}\r\n aria-describedby={ariaDescribedBy}\r\n className=\"inline-flex items-center justify-center gap-2 font-medium transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 h-10 px-4 text-sm rounded-md bg-blue-600 text-white hover:bg-blue-700 focus-visible:ring-blue-500\"\r\n >\r\n {state.isUploading && (\r\n <svg className=\"animate-spin h-4 w-4\" viewBox=\"0 0 24 24\">\r\n <circle\r\n className=\"opacity-25\"\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"4\"\r\n fill=\"none\"\r\n />\r\n <path\r\n className=\"opacity-75\"\r\n fill=\"currentColor\"\r\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\r\n />\r\n </svg>\r\n )}\r\n <span>\r\n {children || (state.isUploading ? config.labels.progressText : config.labels.selectFilesText)}\r\n {state.files.length > 0 && (\r\n <span className=\"ml-1 text-xs opacity-75\">\r\n ({state.files.length} {state.files.length === 1 ? 'file' : 'files'})\r\n </span>\r\n )}\r\n </span>\r\n </button>\r\n\r\n {/* File Previews Grid */}\r\n {state.files.length > 0 && (\r\n <div\r\n className=\"mt-4 grid gap-4\"\r\n style={{\r\n gridTemplateColumns: `repeat(auto-fill, minmax(${sizeClasses.container.replace('min-w-[', '').replace(']', '')}, 1fr))`\r\n }}\r\n role=\"list\"\r\n aria-label=\"Selected files with previews\"\r\n >\r\n {state.files.map((file, index) => {\r\n const preview = previews.get(file.id)\r\n const isFocused = focusedFileIndex === index\r\n\r\n return (\r\n <div\r\n key={file.id}\r\n className={`relative border rounded-lg p-4 bg-white transition-all duration-200 ${isFocused ? 'ring-2 ring-blue-500 ring-offset-2' : 'hover:shadow-md'\r\n }`}\r\n role=\"listitem\"\r\n tabIndex={config.accessibility.keyboardNavigation ? 0 : -1}\r\n onKeyDown={(e) => handleFileListKeyDown(e, index, file.id, file.name)}\r\n onFocus={() => setFocusedFileIndex(index)}\r\n onBlur={() => setFocusedFileIndex(-1)}\r\n aria-label={`File: ${file.name}, ${formatFileSize(file.size)}, ${file.status}`}\r\n >\r\n {/* Preview Media */}\r\n <div className={`w-full ${sizeClasses.media} flex items-center justify-center bg-gray-50 rounded-md mb-3 overflow-hidden`}>\r\n {preview?.type === 'image' ? (\r\n <img\r\n src={preview.url}\r\n alt={`Preview of ${file.name}`}\r\n className=\"max-w-full max-h-full object-cover rounded-md\"\r\n loading=\"lazy\"\r\n />\r\n ) : (\r\n <span className=\"text-4xl opacity-70\" role=\"img\" aria-label={`${file.type} file`}>\r\n {preview?.url || getFileIcon(file.file)}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* File Information */}\r\n {showFileInfo && (\r\n <div className=\"space-y-1\">\r\n <div className={`font-medium text-gray-900 truncate ${sizeClasses.text}`} title={file.name}>\r\n {file.name}\r\n </div>\r\n <div className=\"flex items-center justify-between text-xs text-gray-500\">\r\n <span>{formatFileSize(file.size)}</span>\r\n <span className=\"uppercase\">{file.type.split('/')[1] || 'file'}</span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Upload Progress */}\r\n {file.status === 'uploading' && (\r\n <div className=\"mt-3 space-y-1\">\r\n <div className=\"flex items-center justify-between text-xs\">\r\n <span className=\"text-blue-600\">Uploading...</span>\r\n <span className=\"text-blue-600 font-medium\">{file.progress}%</span>\r\n </div>\r\n <div className=\"w-full bg-gray-200 rounded-full h-2 overflow-hidden\">\r\n <div\r\n className=\"bg-blue-600 h-2 rounded-full transition-all duration-300 ease-out\"\r\n style={{ width: `${file.progress}%` }}\r\n role=\"progressbar\"\r\n aria-valuenow={file.progress}\r\n aria-valuemin={0}\r\n aria-valuemax={100}\r\n aria-label={`Upload progress: ${file.progress}%`}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Status Indicators */}\r\n {file.status === 'success' && (\r\n <div className=\"mt-3 flex items-center text-green-600 text-sm\">\r\n <svg className=\"w-4 h-4 mr-1\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n <path\r\n fillRule=\"evenodd\"\r\n d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\"\r\n clipRule=\"evenodd\"\r\n />\r\n </svg>\r\n <span>{config.labels.successText}</span>\r\n </div>\r\n )}\r\n\r\n {file.status === 'error' && (\r\n <div className=\"mt-3 space-y-2\">\r\n <div className=\"flex items-center text-red-600 text-sm\">\r\n <svg className=\"w-4 h-4 mr-1\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n <path\r\n fillRule=\"evenodd\"\r\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z\"\r\n clipRule=\"evenodd\"\r\n />\r\n </svg>\r\n <span className=\"text-xs\">{file.error || config.labels.errorText}</span>\r\n </div>\r\n <button\r\n type=\"button\"\r\n onClick={() => actions.retryUpload(file.id)}\r\n className=\"text-xs text-red-600 hover:text-red-800 border border-red-300 hover:border-red-400 px-2 py-1 rounded transition-colors focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-1\"\r\n aria-label={`Retry upload for ${file.name}`}\r\n >\r\n {config.labels.retryText}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {file.status === 'pending' && (\r\n <div className=\"mt-3 text-gray-500 text-sm\">\r\n Ready to upload\r\n </div>\r\n )}\r\n\r\n {/* Remove Button */}\r\n {(file.status === 'pending' || file.status === 'error') && (\r\n <button\r\n type=\"button\"\r\n onClick={() => handleRemoveFile(file.id, file.name)}\r\n className=\"absolute top-2 right-2 w-6 h-6 bg-red-500 hover:bg-red-600 text-white rounded-full flex items-center justify-center text-sm font-bold transition-colors focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2\"\r\n aria-label={`Remove ${file.name}`}\r\n title={`Remove ${file.name}`}\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n )\r\n })}\r\n </div>\r\n )}\r\n\r\n {/* Upload All Button */}\r\n {state.files.some(f => f.status === 'pending') && !config.features.autoUpload && (\r\n <button\r\n type=\"button\"\r\n onClick={actions.uploadFiles}\r\n disabled={state.isUploading}\r\n className=\"w-full mt-4 bg-green-600 text-white py-3 px-4 rounded-md hover:bg-green-700 disabled:opacity-50 disabled:cursor-not-allowed focus:outline-none focus:ring-2 focus:ring-green-500 focus:ring-offset-2 font-medium transition-colors\"\r\n >\r\n {state.isUploading ? (\r\n <span className=\"flex items-center justify-center gap-2\">\r\n <svg className=\"animate-spin h-4 w-4\" viewBox=\"0 0 24 24\">\r\n <circle\r\n className=\"opacity-25\"\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"4\"\r\n fill=\"none\"\r\n />\r\n <path\r\n className=\"opacity-75\"\r\n fill=\"currentColor\"\r\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\r\n />\r\n </svg>\r\n {config.labels.progressText}\r\n </span>\r\n ) : (\r\n `Upload All Files (${state.files.filter(f => f.status === 'pending').length})`\r\n )}\r\n </button>\r\n )}\r\n\r\n {/* Screen Reader Announcements */}\r\n <div aria-live=\"polite\" aria-atomic=\"true\" className=\"sr-only\">\r\n {state.files.length > 0 && (\r\n <span>\r\n {state.files.length} {state.files.length === 1 ? 'file' : 'files'} selected.\r\n {state.files.filter(f => f.status === 'pending').length > 0 &&\r\n ` ${state.files.filter(f => f.status === 'pending').length} ready to upload.`\r\n }\r\n {state.files.filter(f => f.status === 'success').length > 0 &&\r\n ` ${state.files.filter(f => f.status === 'success').length} uploaded successfully.`\r\n }\r\n {state.files.filter(f => f.status === 'error').length > 0 &&\r\n ` ${state.files.filter(f => f.status === 'error').length} failed to upload.`\r\n }\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nPreviewUpload.displayName = 'PreviewUpload'","import React, { useRef, useState, useCallback } from 'react'\r\nimport { useFileUpload } from '../file-upload-context'\r\nimport { validateImageDimensions } from '../../../utils/file-validation'\r\n\r\ninterface ImageUploadProps {\r\n className?: string\r\n style?: React.CSSProperties\r\n ariaLabel?: string\r\n ariaDescribedBy?: string\r\n children?: React.ReactNode\r\n aspectRatio?: number\r\n cropEnabled?: boolean\r\n resizeEnabled?: boolean\r\n quality?: number\r\n}\r\n\r\nexport const ImageUpload: React.FC<ImageUploadProps> = ({\r\n className,\r\n style,\r\n ariaLabel,\r\n ariaDescribedBy,\r\n children,\r\n aspectRatio,\r\n cropEnabled = false,\r\n resizeEnabled = false,\r\n quality = 0.8\r\n}) => {\r\n const { config, actions, state } = useFileUpload()\r\n const inputRef = useRef<HTMLInputElement>(null)\r\n const [imageValidationErrors, setImageValidationErrors] = useState<Record<string, string[]>>({})\r\n\r\n const validateImageFile = useCallback(async (file: File) => {\r\n if (!file.type.startsWith('image/')) return []\r\n\r\n const errors: string[] = []\r\n\r\n try {\r\n const validation = await validateImageDimensions(\r\n file,\r\n config.validation.maxWidth,\r\n config.validation.maxHeight,\r\n config.validation.minWidth,\r\n config.validation.minHeight\r\n )\r\n\r\n if (!validation.isValid) {\r\n errors.push(...validation.errors.map(e => e.message))\r\n }\r\n } catch (error) {\r\n errors.push('Failed to validate image dimensions')\r\n }\r\n\r\n return errors\r\n }, [config.validation])\r\n\r\n const handleFileSelect = async (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = Array.from(event.target.files || [])\r\n // Filter only image files\r\n const imageFiles = files.filter(file => file.type.startsWith('image/'))\r\n\r\n if (imageFiles.length > 0) {\r\n // Validate each image file\r\n const validationResults: Record<string, string[]> = {}\r\n\r\n for (const file of imageFiles) {\r\n const errors = await validateImageFile(file)\r\n if (errors.length > 0) {\r\n validationResults[file.name] = errors\r\n }\r\n }\r\n\r\n setImageValidationErrors(validationResults)\r\n\r\n // Only select files that passed validation\r\n const validFiles = imageFiles.filter(file => !validationResults[file.name])\r\n if (validFiles.length > 0) {\r\n // Process images if crop/resize is enabled\r\n const processedFiles = await Promise.all(\r\n validFiles.map(file => processImage(file))\r\n )\r\n actions.selectFiles(processedFiles)\r\n }\r\n }\r\n }\r\n\r\n const handleButtonClick = () => {\r\n inputRef.current?.click()\r\n }\r\n\r\n const handleKeyDown = (event: React.KeyboardEvent) => {\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault()\r\n handleButtonClick()\r\n }\r\n }\r\n\r\n const getImagePreview = (file: File): string => {\r\n return URL.createObjectURL(file)\r\n }\r\n\r\n const resizeImage = useCallback((file: File, maxWidth: number, maxHeight: number): Promise<File> => {\r\n return new Promise((resolve) => {\r\n const canvas = document.createElement('canvas')\r\n const ctx = canvas.getContext('2d')\r\n const img = new Image()\r\n\r\n img.onload = () => {\r\n let { width, height } = img\r\n\r\n // Calculate new dimensions while maintaining aspect ratio\r\n if (width > height) {\r\n if (width > maxWidth) {\r\n height = (height * maxWidth) / width\r\n width = maxWidth\r\n }\r\n } else {\r\n if (height > maxHeight) {\r\n width = (width * maxHeight) / height\r\n height = maxHeight\r\n }\r\n }\r\n\r\n canvas.width = width\r\n canvas.height = height\r\n\r\n ctx?.drawImage(img, 0, 0, width, height)\r\n\r\n canvas.toBlob((blob) => {\r\n if (blob) {\r\n const resizedFile = new File([blob], file.name, {\r\n type: file.type,\r\n lastModified: Date.now()\r\n })\r\n resolve(resizedFile)\r\n } else {\r\n resolve(file)\r\n }\r\n }, file.type, quality)\r\n }\r\n\r\n img.src = URL.createObjectURL(file)\r\n })\r\n }, [quality])\r\n\r\n const cropImage = useCallback((file: File, aspectRatio: number): Promise<File> => {\r\n return new Promise((resolve) => {\r\n const canvas = document.createElement('canvas')\r\n const ctx = canvas.getContext('2d')\r\n const img = new Image()\r\n\r\n img.onload = () => {\r\n const { width, height } = img\r\n\r\n let cropWidth = width\r\n let cropHeight = height\r\n let offsetX = 0\r\n let offsetY = 0\r\n\r\n // Calculate crop dimensions based on aspect ratio\r\n const imageAspectRatio = width / height\r\n\r\n if (imageAspectRatio > aspectRatio) {\r\n // Image is wider than desired aspect ratio\r\n cropWidth = height * aspectRatio\r\n offsetX = (width - cropWidth) / 2\r\n } else {\r\n // Image is taller than desired aspect ratio\r\n cropHeight = width / aspectRatio\r\n offsetY = (height - cropHeight) / 2\r\n }\r\n\r\n canvas.width = cropWidth\r\n canvas.height = cropHeight\r\n\r\n ctx?.drawImage(\r\n img,\r\n offsetX, offsetY, cropWidth, cropHeight,\r\n 0, 0, cropWidth, cropHeight\r\n )\r\n\r\n canvas.toBlob((blob) => {\r\n if (blob) {\r\n const croppedFile = new File([blob], file.name, {\r\n type: file.type,\r\n lastModified: Date.now()\r\n })\r\n resolve(croppedFile)\r\n } else {\r\n resolve(file)\r\n }\r\n }, file.type, quality)\r\n }\r\n\r\n img.src = URL.createObjectURL(file)\r\n })\r\n }, [quality])\r\n\r\n const processImage = useCallback(async (file: File): Promise<File> => {\r\n let processedFile = file\r\n\r\n // Apply cropping if enabled and aspect ratio is specified\r\n if (cropEnabled && aspectRatio) {\r\n processedFile = await cropImage(processedFile, aspectRatio)\r\n }\r\n\r\n // Apply resizing if enabled and dimensions are specified\r\n if (resizeEnabled && (config.validation.maxWidth || config.validation.maxHeight)) {\r\n const maxWidth = config.validation.maxWidth || 1920\r\n const maxHeight = config.validation.maxHeight || 1080\r\n processedFile = await resizeImage(processedFile, maxWidth, maxHeight)\r\n }\r\n\r\n return processedFile\r\n }, [cropEnabled, resizeEnabled, aspectRatio, config.validation, cropImage, resizeImage])\r\n\r\n return (\r\n <div className={`file-upload file-upload--image ${className || ''}`} style={style}>\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n multiple={config.defaults.multiple}\r\n accept=\"image/*\"\r\n disabled={config.defaults.disabled || state.isUploading}\r\n onChange={handleFileSelect}\r\n className=\"file-upload-input\"\r\n style={{ display: 'none' }}\r\n aria-hidden=\"true\"\r\n />\r\n\r\n {/* Upload Area */}\r\n <div\r\n onClick={handleButtonClick}\r\n onKeyDown={handleKeyDown}\r\n role=\"button\"\r\n tabIndex={config.defaults.disabled || state.isUploading ? -1 : 0}\r\n aria-label={ariaLabel || 'Upload images'}\r\n aria-describedby={ariaDescribedBy}\r\n style={{\r\n border: `2px dashed ${config.styling.colors.border}`,\r\n borderRadius: config.styling.spacing.borderRadius,\r\n padding: '2rem',\r\n textAlign: 'center',\r\n cursor: config.defaults.disabled || state.isUploading ? 'not-allowed' : 'pointer',\r\n backgroundColor: config.styling.colors.background,\r\n color: config.styling.colors.foreground,\r\n fontSize: config.styling.typography.fontSize,\r\n opacity: config.defaults.disabled || state.isUploading ? 0.6 : 1,\r\n minHeight: '200px',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: config.styling.spacing.gap\r\n }}\r\n >\r\n {children || (\r\n <>\r\n <div className=\"file-upload-image-icon\" style={{\r\n fontSize: '3rem',\r\n color: config.styling.colors.muted\r\n }}>\r\n 🖼️\r\n </div>\r\n\r\n <div className=\"file-upload-image-text\">\r\n <div className=\"file-upload-image-primary-text\" style={{\r\n fontWeight: '600',\r\n marginBottom: '0.5rem',\r\n color: config.styling.colors.foreground\r\n }}>\r\n {state.isUploading ? config.labels.progressText : 'Upload Images'}\r\n </div>\r\n\r\n <div className=\"file-upload-image-secondary-text\" style={{\r\n fontSize: '0.875rem',\r\n color: config.styling.colors.muted\r\n }}>\r\n Click to select image files\r\n </div>\r\n </div>\r\n\r\n {state.files.length > 0 && (\r\n <div className=\"file-upload-image-count\" style={{\r\n fontSize: '0.875rem',\r\n color: config.styling.colors.primary,\r\n fontWeight: '500'\r\n }}>\r\n {state.files.length} {state.files.length === 1 ? 'image' : 'images'} selected\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Validation Errors */}\r\n {Object.keys(imageValidationErrors).length > 0 && (\r\n <div className=\"file-upload-validation-errors\" style={{\r\n marginTop: '1rem',\r\n padding: '1rem',\r\n backgroundColor: config.styling.colors.error + '10',\r\n border: `1px solid ${config.styling.colors.error}`,\r\n borderRadius: config.styling.spacing.borderRadius\r\n }}>\r\n <div style={{\r\n fontSize: '0.875rem',\r\n fontWeight: '600',\r\n color: config.styling.colors.error,\r\n marginBottom: '0.5rem'\r\n }}>\r\n Image Validation Errors:\r\n </div>\r\n {Object.entries(imageValidationErrors).map(([fileName, errors]) => (\r\n <div key={fileName} style={{ marginBottom: '0.5rem' }}>\r\n <div style={{\r\n fontSize: '0.8rem',\r\n fontWeight: '500',\r\n color: config.styling.colors.foreground,\r\n marginBottom: '0.25rem'\r\n }}>\r\n {fileName}:\r\n </div>\r\n <ul style={{\r\n margin: 0,\r\n paddingLeft: '1rem',\r\n fontSize: '0.75rem',\r\n color: config.styling.colors.error\r\n }}>\r\n {errors.map((error, index) => (\r\n <li key={index}>{error}</li>\r\n ))}\r\n </ul>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Image Previews */}\r\n {state.files.length > 0 && (\r\n <div className=\"file-upload-image-previews\" style={{\r\n display: 'grid',\r\n gridTemplateColumns: config.defaults.multiple\r\n ? 'repeat(auto-fill, minmax(150px, 1fr))'\r\n : '1fr',\r\n gap: config.styling.spacing.gap,\r\n marginTop: config.styling.spacing.margin\r\n }}>\r\n {state.files.map(file => {\r\n const preview = getImagePreview(file.file)\r\n\r\n return (\r\n <div key={file.id} className=\"file-upload-image-preview\" style={{\r\n position: 'relative',\r\n border: `1px solid ${config.styling.colors.border}`,\r\n borderRadius: config.styling.spacing.borderRadius,\r\n overflow: 'hidden',\r\n backgroundColor: config.styling.colors.background\r\n }}>\r\n {/* Image Preview */}\r\n <div style={{\r\n width: '100%',\r\n height: aspectRatio\r\n ? `${(config.defaults.multiple ? 150 : 200) / aspectRatio}px`\r\n : config.defaults.multiple ? '150px' : '200px',\r\n position: 'relative',\r\n overflow: 'hidden',\r\n aspectRatio: aspectRatio ? aspectRatio.toString() : undefined\r\n }}>\r\n <img\r\n src={preview}\r\n alt={file.name}\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n objectFit: cropEnabled ? 'cover' : 'contain',\r\n backgroundColor: config.styling.colors.muted + '20'\r\n }}\r\n onLoad={() => {\r\n // Clean up object URL to prevent memory leaks\r\n setTimeout(() => URL.revokeObjectURL(preview), 1000)\r\n }}\r\n />\r\n\r\n {/* Progress Overlay */}\r\n {file.status === 'uploading' && (\r\n <div style={{\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n backgroundColor: 'rgba(0, 0, 0, 0.7)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n color: 'white'\r\n }}>\r\n <div style={{\r\n textAlign: 'center'\r\n }}>\r\n <div style={{\r\n width: '60px',\r\n height: '4px',\r\n backgroundColor: 'rgba(255, 255, 255, 0.3)',\r\n borderRadius: '2px',\r\n overflow: 'hidden',\r\n marginBottom: '0.5rem'\r\n }}>\r\n <div style={{\r\n width: `${file.progress}%`,\r\n height: '100%',\r\n backgroundColor: config.styling.colors.primary,\r\n transition: 'width 0.3s ease'\r\n }} />\r\n </div>\r\n <div style={{ fontSize: '0.875rem' }}>\r\n {file.progress}%\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Status Indicators */}\r\n {file.status === 'success' && (\r\n <div style={{\r\n position: 'absolute',\r\n top: '0.5rem',\r\n left: '0.5rem',\r\n backgroundColor: config.styling.colors.success,\r\n color: config.styling.colors.background,\r\n borderRadius: '50%',\r\n width: '24px',\r\n height: '24px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '0.875rem'\r\n }}>\r\n ✓\r\n </div>\r\n )}\r\n\r\n {file.status === 'error' && (\r\n <div style={{\r\n position: 'absolute',\r\n top: '0.5rem',\r\n left: '0.5rem',\r\n backgroundColor: config.styling.colors.error,\r\n color: config.styling.colors.background,\r\n borderRadius: '50%',\r\n width: '24px',\r\n height: '24px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '0.875rem'\r\n }}>\r\n !\r\n </div>\r\n )}\r\n\r\n {/* Remove Button */}\r\n {(file.status === 'pending' || file.status === 'error') && (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation()\r\n actions.removeFile(file.id)\r\n }}\r\n style={{\r\n position: 'absolute',\r\n top: '0.5rem',\r\n right: '0.5rem',\r\n background: config.styling.colors.error,\r\n color: config.styling.colors.background,\r\n border: 'none',\r\n borderRadius: '50%',\r\n width: '24px',\r\n height: '24px',\r\n cursor: 'pointer',\r\n fontSize: '0.875rem',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}\r\n aria-label={`${config.labels.removeText} ${file.name}`}\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* File Info */}\r\n <div style={{\r\n padding: '0.75rem',\r\n borderTop: `1px solid ${config.styling.colors.border}`\r\n }}>\r\n <div style={{\r\n fontSize: '0.875rem',\r\n fontWeight: '500',\r\n color: config.styling.colors.foreground,\r\n marginBottom: '0.25rem',\r\n wordBreak: 'break-word'\r\n }}>\r\n {file.name}\r\n </div>\r\n\r\n <div style={{\r\n fontSize: '0.75rem',\r\n color: config.styling.colors.muted,\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center'\r\n }}>\r\n <span>{(file.size / 1024).toFixed(1)} KB</span>\r\n\r\n {file.status === 'error' && (\r\n <button\r\n type=\"button\"\r\n onClick={() => actions.retryUpload(file.id)}\r\n style={{\r\n background: 'none',\r\n border: `1px solid ${config.styling.colors.error}`,\r\n color: config.styling.colors.error,\r\n cursor: 'pointer',\r\n fontSize: '0.75rem',\r\n padding: '0.25rem 0.5rem',\r\n borderRadius: '0.25rem'\r\n }}\r\n aria-label={`${config.labels.retryText} ${file.name}`}\r\n >\r\n {config.labels.retryText}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n })}\r\n </div>\r\n )}\r\n\r\n {/* Upload Button */}\r\n {state.files.some(f => f.status === 'pending') && (\r\n <button\r\n type=\"button\"\r\n onClick={actions.uploadFiles}\r\n disabled={state.isUploading}\r\n style={{\r\n backgroundColor: config.styling.colors.primary,\r\n color: config.styling.colors.background,\r\n padding: '0.75rem 1.5rem',\r\n border: 'none',\r\n borderRadius: config.styling.spacing.borderRadius,\r\n cursor: state.isUploading ? 'not-allowed' : 'pointer',\r\n opacity: state.isUploading ? 0.6 : 1,\r\n fontSize: config.styling.typography.fontSize,\r\n fontWeight: '500',\r\n width: '100%',\r\n marginTop: '1rem'\r\n }}\r\n >\r\n {state.isUploading ? config.labels.progressText : 'Upload Images'}\r\n </button>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nImageUpload.displayName = 'ImageUpload'","import React, { useRef, useCallback, useState, useEffect } from 'react'\r\nimport { useFileUpload } from '../file-upload-context'\r\nimport { validateFiles } from '../../../utils/file-validation'\r\nimport { UploadFeedback } from '../feedback/upload-feedback'\r\nimport type { MultiFileUploadProps, UploadFile } from '../file-upload.types'\r\n\r\nexport const MultiFileUpload: React.FC<MultiFileUploadProps> = ({\r\n className = '',\r\n style,\r\n ariaLabel,\r\n ariaDescribedBy,\r\n children,\r\n disabled: propDisabled,\r\n multiple: propMultiple = true, // Multi-file upload should default to multiple\r\n accept: propAccept,\r\n maxSize: propMaxSize,\r\n maxFiles: propMaxFiles,\r\n listLayout = 'list',\r\n sortable = false,\r\n bulkActions = true,\r\n onFileSelect,\r\n onError,\r\n onDragEnter,\r\n onDragLeave,\r\n onDragOver,\r\n onDrop,\r\n ...props\r\n}) => {\r\n const { config, actions, state } = useFileUpload()\r\n const inputRef = useRef<HTMLInputElement>(null)\r\n const [selectedFileIds, setSelectedFileIds] = useState<Set<string>>(new Set())\r\n const [isDragOver, setIsDragOver] = useState(false)\r\n const [focusedIndex, setFocusedIndex] = useState<number>(-1)\r\n\r\n // Merge props with config defaults\r\n const disabled = propDisabled ?? config.defaults.disabled ?? false\r\n const multiple = propMultiple ?? config.defaults.multiple ?? true\r\n const accept = propAccept ?? config.defaults.accept ?? '*'\r\n const maxSize = propMaxSize ?? config.validation.maxSize\r\n const maxFiles = propMaxFiles ?? config.validation.maxFiles\r\n\r\n // Handle file selection from input\r\n const handleFileSelect = useCallback(async (files: File[]) => {\r\n if (files.length === 0) return\r\n\r\n try {\r\n // Validate files using the validation utility\r\n const validationResult = await validateFiles(files, {\r\n ...config,\r\n validation: {\r\n ...config.validation,\r\n maxSize,\r\n maxFiles,\r\n allowedTypes: accept === '*' ? ['*'] : accept.split(',').map(t => t.trim())\r\n }\r\n }, state.files.length)\r\n\r\n if (validationResult.validFiles.length > 0) {\r\n actions.selectFiles(validationResult.validFiles)\r\n onFileSelect?.(validationResult.validFiles)\r\n }\r\n\r\n // Handle rejected files\r\n if (validationResult.rejectedFiles.length > 0) {\r\n const errorMessage = validationResult.rejectedFiles\r\n .map(rf => `${rf.file.name}: ${rf.errors.map(e => e.message).join(', ')}`)\r\n .join('\\n')\r\n onError?.(errorMessage)\r\n }\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'File validation failed'\r\n onError?.(errorMessage)\r\n }\r\n }, [config, maxSize, maxFiles, accept, state.files.length, actions, onFileSelect, onError])\r\n\r\n // Handle input change\r\n const handleInputChange = useCallback(async (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = Array.from(event.target.files || [])\r\n await handleFileSelect(files)\r\n // Reset input value to allow selecting the same file again\r\n event.target.value = ''\r\n }, [handleFileSelect])\r\n\r\n // Handle drag and drop\r\n const handleDragEnter = useCallback((event: React.DragEvent) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n setIsDragOver(true)\r\n onDragEnter?.(event)\r\n }, [onDragEnter])\r\n\r\n const handleDragLeave = useCallback((event: React.DragEvent) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n // Only set drag over to false if we're leaving the main container\r\n if (!event.currentTarget.contains(event.relatedTarget as Node)) {\r\n setIsDragOver(false)\r\n }\r\n onDragLeave?.(event)\r\n }, [onDragLeave])\r\n\r\n const handleDragOver = useCallback((event: React.DragEvent) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n onDragOver?.(event)\r\n }, [onDragOver])\r\n\r\n const handleDrop = useCallback(async (event: React.DragEvent) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n setIsDragOver(false)\r\n\r\n const files = Array.from(event.dataTransfer.files)\r\n await handleFileSelect(files)\r\n onDrop?.(event)\r\n }, [handleFileSelect, onDrop])\r\n\r\n // Bulk actions\r\n const handleSelectAll = useCallback(() => {\r\n const allFileIds = new Set(state.files.map(f => f.id))\r\n setSelectedFileIds(allFileIds)\r\n }, [state.files])\r\n\r\n const handleDeselectAll = useCallback(() => {\r\n setSelectedFileIds(new Set())\r\n }, [])\r\n\r\n const handleRemoveSelected = useCallback(() => {\r\n selectedFileIds.forEach(fileId => {\r\n actions.removeFile(fileId)\r\n })\r\n setSelectedFileIds(new Set())\r\n }, [selectedFileIds, actions])\r\n\r\n const handleUploadSelected = useCallback(async () => {\r\n // Filter files to only upload selected ones\r\n const selectedFiles = state.files.filter(f => selectedFileIds.has(f.id) && f.status === 'pending')\r\n if (selectedFiles.length === 0) return\r\n\r\n // For now, upload all files (the context doesn't support selective upload yet)\r\n await actions.uploadFiles()\r\n }, [selectedFileIds, state.files, actions])\r\n\r\n const handleRemoveAll = useCallback(() => {\r\n actions.clearAll()\r\n setSelectedFileIds(new Set())\r\n }, [actions])\r\n\r\n const handleUploadAll = useCallback(async () => {\r\n await actions.uploadFiles()\r\n }, [actions])\r\n\r\n // Individual file actions\r\n const handleFileToggle = useCallback((fileId: string) => {\r\n setSelectedFileIds(prev => {\r\n const newSet = new Set(prev)\r\n if (newSet.has(fileId)) {\r\n newSet.delete(fileId)\r\n } else {\r\n newSet.add(fileId)\r\n }\r\n return newSet\r\n })\r\n }, [])\r\n\r\n // Keyboard navigation\r\n const handleKeyDown = useCallback((event: React.KeyboardEvent) => {\r\n if (state.files.length === 0) return\r\n\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n event.preventDefault()\r\n setFocusedIndex(prev => Math.min(prev + 1, state.files.length - 1))\r\n break\r\n case 'ArrowUp':\r\n event.preventDefault()\r\n setFocusedIndex(prev => Math.max(prev - 1, 0))\r\n break\r\n case ' ':\r\n event.preventDefault()\r\n if (focusedIndex >= 0 && focusedIndex < state.files.length) {\r\n const fileId = state.files[focusedIndex].id\r\n handleFileToggle(fileId)\r\n }\r\n break\r\n case 'Enter':\r\n event.preventDefault()\r\n inputRef.current?.click()\r\n break\r\n case 'Delete':\r\n case 'Backspace':\r\n event.preventDefault()\r\n if (selectedFileIds.size > 0) {\r\n handleRemoveSelected()\r\n } else if (focusedIndex >= 0 && focusedIndex < state.files.length) {\r\n const fileId = state.files[focusedIndex].id\r\n actions.removeFile(fileId)\r\n }\r\n break\r\n case 'a':\r\n if (event.ctrlKey || event.metaKey) {\r\n event.preventDefault()\r\n handleSelectAll()\r\n }\r\n break\r\n }\r\n }, [state.files, focusedIndex, selectedFileIds, handleFileToggle, handleRemoveSelected, handleSelectAll, actions])\r\n\r\n // Reset focused index when files change\r\n useEffect(() => {\r\n if (focusedIndex >= state.files.length) {\r\n setFocusedIndex(Math.max(0, state.files.length - 1))\r\n }\r\n }, [state.files.length, focusedIndex])\r\n\r\n // Generate container classes\r\n const getContainerClasses = () => {\r\n const baseClasses = [\r\n 'multi-file-upload',\r\n 'border-2 border-dashed rounded-lg p-6',\r\n 'transition-colors duration-200',\r\n 'focus-within:outline-none focus-within:ring-2 focus-within:ring-offset-2 focus-within:ring-blue-500'\r\n ]\r\n\r\n const stateClasses = []\r\n if (isDragOver) {\r\n stateClasses.push('border-blue-500 bg-blue-50')\r\n } else {\r\n stateClasses.push('border-gray-300 hover:border-gray-400')\r\n }\r\n\r\n if (disabled) {\r\n stateClasses.push('opacity-50 cursor-not-allowed')\r\n }\r\n\r\n return [...baseClasses, ...stateClasses, className].filter(Boolean).join(' ')\r\n }\r\n\r\n\r\n\r\n const hasFiles = state.files.length > 0\r\n const hasSelectedFiles = selectedFileIds.size > 0\r\n const hasPendingFiles = state.files.some(f => f.status === 'pending')\r\n const selectedPendingFiles = state.files.filter(f => selectedFileIds.has(f.id) && f.status === 'pending')\r\n\r\n return (\r\n <div\r\n className={getContainerClasses()}\r\n onDragEnter={handleDragEnter}\r\n onDragLeave={handleDragLeave}\r\n onDragOver={handleDragOver}\r\n onDrop={handleDrop}\r\n onKeyDown={handleKeyDown}\r\n tabIndex={0}\r\n role=\"application\"\r\n aria-label={ariaLabel || \"Multi-file upload area\"}\r\n aria-describedby={ariaDescribedBy}\r\n style={style}\r\n >\r\n {/* Hidden file input */}\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n multiple={multiple}\r\n accept={accept}\r\n disabled={disabled || state.isUploading}\r\n onChange={handleInputChange}\r\n className=\"sr-only\"\r\n aria-hidden=\"true\"\r\n />\r\n\r\n {/* Upload area */}\r\n <div className=\"text-center\">\r\n <div className=\"mx-auto h-12 w-12 text-gray-400 mb-4\">\r\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 48 48\" aria-hidden=\"true\">\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M28 8H12a4 4 0 00-4 4v20m32-12v8m0 0v8a4 4 0 01-4 4H12a4 4 0 01-4-4v-4m32-4l-3.172-3.172a4 4 0 00-5.656 0L28 28M8 32l9.172-9.172a4 4 0 015.656 0L28 28m0 0l4 4m4-24h8m-4-4v8m-12 4h.02\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <button\r\n type=\"button\"\r\n onClick={() => inputRef.current?.click()}\r\n disabled={disabled || state.isUploading}\r\n className=\"text-blue-600 hover:text-blue-700 font-medium focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 rounded px-2 py-1\"\r\n >\r\n {config.labels.selectFilesText || 'Select files'}\r\n </button>\r\n <p className=\"text-sm text-gray-600\">\r\n or drag and drop files here\r\n </p>\r\n {maxFiles > 1 && (\r\n <p className=\"text-xs text-gray-500\">\r\n Maximum {maxFiles} files, up to {(maxSize / 1024 / 1024).toFixed(0)}MB each\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* File list with progress feedback */}\r\n {hasFiles && (\r\n <div className=\"mt-6\">\r\n {/* Bulk actions */}\r\n {bulkActions && (\r\n <div className=\"flex items-center justify-between mb-4 p-3 bg-gray-50 rounded-md\">\r\n <div className=\"flex items-center gap-4\">\r\n <span className=\"text-sm text-gray-700\">\r\n {state.files.length} file{state.files.length !== 1 ? 's' : ''}\r\n {hasSelectedFiles && (\r\n <span className=\"ml-2 text-blue-600\">\r\n ({selectedFileIds.size} selected)\r\n </span>\r\n )}\r\n </span>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={handleSelectAll}\r\n className=\"text-xs text-blue-600 hover:text-blue-700 focus:outline-none focus:ring-1 focus:ring-blue-500 rounded px-2 py-1\"\r\n >\r\n Select All\r\n </button>\r\n {hasSelectedFiles && (\r\n <button\r\n type=\"button\"\r\n onClick={handleDeselectAll}\r\n className=\"text-xs text-gray-600 hover:text-gray-700 focus:outline-none focus:ring-1 focus:ring-gray-500 rounded px-2 py-1\"\r\n >\r\n Deselect All\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {hasSelectedFiles && (\r\n <>\r\n {selectedPendingFiles.length > 0 && (\r\n <button\r\n type=\"button\"\r\n onClick={handleUploadSelected}\r\n disabled={state.isUploading}\r\n className=\"text-xs bg-blue-600 text-white px-3 py-1 rounded hover:bg-blue-700 disabled:opacity-50 focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n >\r\n Upload Selected ({selectedPendingFiles.length})\r\n </button>\r\n )}\r\n <button\r\n type=\"button\"\r\n onClick={handleRemoveSelected}\r\n className=\"text-xs bg-red-600 text-white px-3 py-1 rounded hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-red-500\"\r\n >\r\n Remove Selected\r\n </button>\r\n </>\r\n )}\r\n\r\n {hasPendingFiles && (\r\n <button\r\n type=\"button\"\r\n onClick={handleUploadAll}\r\n disabled={state.isUploading}\r\n className=\"text-xs bg-green-600 text-white px-3 py-1 rounded hover:bg-green-700 disabled:opacity-50 focus:outline-none focus:ring-2 focus:ring-green-500\"\r\n >\r\n Upload All\r\n </button>\r\n )}\r\n\r\n <button\r\n type=\"button\"\r\n onClick={handleRemoveAll}\r\n className=\"text-xs text-red-600 hover:text-red-700 px-2 py-1 rounded focus:outline-none focus:ring-1 focus:ring-red-500\"\r\n >\r\n Remove All\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Upload feedback with progress indicators */}\r\n <UploadFeedback\r\n files={state.files}\r\n isUploading={state.isUploading}\r\n showIndividualProgress={true}\r\n showOverallProgress={state.files.length > 1}\r\n showStatusIndicators={true}\r\n showFileNames={true}\r\n enableAccessibilityAnnouncements={config.accessibility?.announceProgress ?? true}\r\n onRetry={actions.retryUpload}\r\n onRemove={actions.removeFile}\r\n />\r\n\r\n {/* Keyboard shortcuts help */}\r\n <div className=\"mt-4 text-xs text-gray-500 space-y-1\">\r\n <p><kbd className=\"px-1 py-0.5 bg-gray-100 rounded\">↑↓</kbd> Navigate • <kbd className=\"px-1 py-0.5 bg-gray-100 rounded\">Space</kbd> Select • <kbd className=\"px-1 py-0.5 bg-gray-100 rounded\">Ctrl+A</kbd> Select All • <kbd className=\"px-1 py-0.5 bg-gray-100 rounded\">Del</kbd> Remove</p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nMultiFileUpload.displayName = 'MultiFileUpload'","import React, { useMemo, useEffect } from 'react'\r\nimport type { FileUploadProps, FileUploadConfig } from './file-upload.types'\r\nimport { FileUploadProvider } from './file-upload-context'\r\nimport { defaultConfig, mergeConfig, loadConfigFromJSON } from '../../config/schema'\r\nimport { generateThemeClasses, applyTheme, cn } from '../../utils/theme'\r\nimport { FileUploadErrorBoundary } from './error-boundary'\r\n\r\n// Import variant components\r\nimport { ButtonUpload } from './variants/button-upload'\r\nimport { DropzoneUpload } from './variants/dropzone-upload'\r\nimport { PreviewUpload } from './variants/preview-upload'\r\nimport { ImageUpload } from './variants/image-upload'\r\nimport { MultiFileUpload } from './variants/multi-file-upload'\r\n\r\nexport const FileUpload: React.FC<FileUploadProps> = ({\r\n variant,\r\n size,\r\n radius,\r\n theme,\r\n disabled,\r\n multiple,\r\n accept,\r\n maxSize,\r\n maxFiles,\r\n onUpload,\r\n onError,\r\n onProgress,\r\n onFileSelect,\r\n onFileRemove,\r\n onDragEnter,\r\n onDragLeave,\r\n onDragOver,\r\n onDrop,\r\n config: configProp,\r\n className,\r\n style,\r\n ariaLabel,\r\n ariaDescribedBy,\r\n children,\r\n ...props\r\n}) => {\r\n // Merge configuration: default < config file/object < props\r\n const mergedConfig = useMemo((): FileUploadConfig => {\r\n let baseConfig = defaultConfig\r\n\r\n // If config is provided as a string (JSON path) or object\r\n if (configProp) {\r\n if (typeof configProp === 'string') {\r\n // Try to load from JSON string (could be file path or JSON content)\r\n try {\r\n const { config: loadedConfig } = loadConfigFromJSON(configProp)\r\n if (loadedConfig) {\r\n baseConfig = loadedConfig\r\n }\r\n } catch (error) {\r\n console.warn('Failed to load config from string:', error)\r\n }\r\n } else {\r\n // Merge with provided config object\r\n baseConfig = mergeConfig(configProp)\r\n }\r\n }\r\n\r\n // Override with explicit props (props take highest priority)\r\n const propOverrides: Partial<FileUploadConfig> = {}\r\n\r\n if (variant !== undefined) {\r\n propOverrides.defaults = { ...propOverrides.defaults, variant }\r\n }\r\n if (size !== undefined) {\r\n propOverrides.defaults = { ...propOverrides.defaults, size }\r\n }\r\n if (radius !== undefined) {\r\n propOverrides.defaults = { ...propOverrides.defaults, radius }\r\n }\r\n if (theme !== undefined) {\r\n propOverrides.defaults = { ...propOverrides.defaults, theme }\r\n propOverrides.styling = { ...propOverrides.styling, theme }\r\n }\r\n if (disabled !== undefined) {\r\n propOverrides.defaults = { ...propOverrides.defaults, disabled }\r\n }\r\n if (multiple !== undefined) {\r\n propOverrides.defaults = { ...propOverrides.defaults, multiple }\r\n propOverrides.features = { ...propOverrides.features, multipleFiles: multiple }\r\n }\r\n if (accept !== undefined) {\r\n propOverrides.defaults = { ...propOverrides.defaults, accept }\r\n }\r\n if (maxSize !== undefined) {\r\n propOverrides.defaults = { ...propOverrides.defaults, maxSize }\r\n propOverrides.validation = { ...propOverrides.validation, maxSize }\r\n }\r\n if (maxFiles !== undefined) {\r\n propOverrides.defaults = { ...propOverrides.defaults, maxFiles }\r\n propOverrides.validation = { ...propOverrides.validation, maxFiles }\r\n }\r\n\r\n return Object.keys(propOverrides).length > 0\r\n ? mergeConfig({ ...baseConfig, ...propOverrides })\r\n : baseConfig\r\n }, [configProp, variant, size, radius, theme, disabled, multiple, accept, maxSize, maxFiles])\r\n\r\n // Create event handlers object\r\n const eventHandlers = useMemo(() => ({\r\n onFileSelect: onFileSelect ? (event: any) => onFileSelect(event.files.map((f: any) => f.file)) : undefined,\r\n onUploadStart: onUpload ? (event: any) => onUpload(event.files.map((f: any) => f.file)) : undefined,\r\n onUploadProgress: onProgress ? (event: any) => {\r\n const file = event.files[0]\r\n if (file) {\r\n onProgress(file.progress, file)\r\n }\r\n } : undefined,\r\n onUploadSuccess: undefined, // Will be handled internally\r\n onUploadError: onError ? (event: any) => {\r\n const file = event.files[0]\r\n if (file?.error) {\r\n onError(file.error)\r\n }\r\n } : undefined,\r\n onFileRemove: onFileRemove ? (event: any) => {\r\n const file = event.files[0]\r\n if (file) {\r\n onFileRemove(file.id)\r\n }\r\n } : undefined,\r\n onUploadRetry: undefined // Will be handled internally\r\n }), [onUpload, onError, onProgress, onFileSelect, onFileRemove])\r\n\r\n // Apply theme when config changes\r\n useEffect(() => {\r\n if (mergedConfig.styling?.theme) {\r\n applyTheme(mergedConfig.styling.theme, mergedConfig)\r\n }\r\n }, [mergedConfig])\r\n\r\n // Get the effective values from merged config\r\n const effectiveVariant = mergedConfig.defaults.variant\r\n const effectiveSize = mergedConfig.defaults.size\r\n const effectiveRadius = mergedConfig.defaults.radius\r\n const effectiveTheme = mergedConfig.styling.theme\r\n\r\n // Generate theme classes\r\n const themeClasses = generateThemeClasses(\r\n effectiveVariant,\r\n effectiveSize,\r\n effectiveRadius,\r\n mergedConfig\r\n )\r\n\r\n // Combine all classes\r\n const combinedClassName = cn(\r\n themeClasses,\r\n disabled && 'file-upload--disabled',\r\n className\r\n )\r\n\r\n // Generate CSS variables for inline styles\r\n const cssVariables = useMemo(() => {\r\n const variables: Record<string, string> = {}\r\n\r\n if (mergedConfig.styling) {\r\n const { colors, spacing, typography, borders, shadows } = mergedConfig.styling\r\n\r\n // Apply color variables\r\n if (colors) {\r\n Object.entries(colors).forEach(([key, value]) => {\r\n variables[`--file-upload-${key}`] = value\r\n })\r\n }\r\n\r\n // Apply spacing variables\r\n if (spacing) {\r\n Object.entries(spacing).forEach(([key, value]) => {\r\n variables[`--file-upload-spacing-${key}`] = value\r\n })\r\n }\r\n\r\n // Apply typography variables\r\n if (typography) {\r\n Object.entries(typography).forEach(([key, value]) => {\r\n variables[`--file-upload-${key}`] = value\r\n })\r\n }\r\n\r\n // Apply border variables\r\n if (borders) {\r\n Object.entries(borders).forEach(([key, value]) => {\r\n variables[`--file-upload-border-${key}`] = value\r\n })\r\n }\r\n\r\n // Apply shadow variables\r\n if (shadows) {\r\n Object.entries(shadows).forEach(([key, value]) => {\r\n variables[`--file-upload-shadow-${key}`] = value\r\n })\r\n }\r\n }\r\n\r\n return variables\r\n }, [mergedConfig])\r\n\r\n // Combine inline styles\r\n const combinedStyle = {\r\n ...cssVariables,\r\n ...style\r\n }\r\n\r\n // Render the appropriate variant component\r\n const renderVariant = () => {\r\n const commonProps = {\r\n className: combinedClassName,\r\n style: combinedStyle,\r\n ariaLabel,\r\n ariaDescribedBy,\r\n onDragEnter,\r\n onDragLeave,\r\n onDragOver,\r\n onDrop,\r\n children,\r\n ...props\r\n }\r\n\r\n switch (effectiveVariant) {\r\n case 'dropzone':\r\n return <DropzoneUpload {...commonProps} />\r\n case 'preview':\r\n return <PreviewUpload {...commonProps} />\r\n case 'image-only':\r\n return <ImageUpload {...commonProps} />\r\n case 'multi-file':\r\n return <MultiFileUpload {...commonProps} />\r\n case 'button':\r\n default:\r\n return <ButtonUpload {...commonProps} />\r\n }\r\n }\r\n\r\n return (\r\n <FileUploadErrorBoundary\r\n onError={(error, errorInfo) => {\r\n console.error('FileUpload component crashed:', error, errorInfo)\r\n onError?.(error.message)\r\n }}\r\n showErrorDetails={process.env.NODE_ENV === 'development'}\r\n >\r\n <FileUploadProvider config={mergedConfig} handlers={eventHandlers}>\r\n <div\r\n data-theme={effectiveTheme}\r\n className=\"file-upload-wrapper\"\r\n style={cssVariables}\r\n >\r\n {renderVariant()}\r\n </div>\r\n </FileUploadProvider>\r\n </FileUploadErrorBoundary>\r\n )\r\n}\r\n\r\nFileUpload.displayName = 'FileUpload'"],"names":["createContext","useReducer","useState","useCallback","uploadFiles","processError","logError","processedErrors","processErrors","useContext","forwardRef","createElement","__iconNode","Component","jsxs","cn","jsx","AlertTriangle","React","theme","classGroup","CheckCircle","XCircle","Icon","AccessibilityAnnouncer","useRef","useEffect","AlertCircle","HelpCircle","formatErrorForUser","useMemo","shouldAnnounceError","createErrorAnnouncement","Fragment","validateFiles","generateThemeClasses","isImageFile","formatFileSize","validateImageDimensions","aspectRatio","defaultConfig","loadConfigFromJSON","mergeConfig","applyTheme"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18,19]}