{"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]}