zentrixui
Version:
ZentrixUI - A modern, highly customizable and accessible React file upload component library with multiple variants, JSON-based configuration, and excellent developer experience.
1 lines • 44 kB
Source Map (JSON)
{"version":3,"file":"schema-BOtZesVP.cjs","sources":["../../src/lib/config/schema.ts"],"sourcesContent":["import { FileUploadConfig } from '../components/file-upload/file-upload.types'\r\n\r\nexport const defaultConfig: FileUploadConfig = {\r\n defaults: {\r\n variant: 'button',\r\n size: 'md',\r\n radius: 'md',\r\n theme: 'auto',\r\n multiple: false,\r\n disabled: false,\r\n accept: '*',\r\n maxSize: 10 * 1024 * 1024,\r\n maxFiles: 5\r\n },\r\n validation: {\r\n maxSize: 10 * 1024 * 1024,\r\n maxFiles: 5,\r\n allowedTypes: ['*'],\r\n allowedExtensions: ['*'],\r\n minSize: 0,\r\n validateDimensions: false\r\n },\r\n styling: {\r\n theme: 'auto',\r\n colors: {\r\n primary: '#3b82f6',\r\n secondary: '#6b7280',\r\n success: '#10b981',\r\n error: '#ef4444',\r\n warning: '#f59e0b',\r\n background: '#ffffff',\r\n foreground: '#1f2937',\r\n border: '#d1d5db',\r\n muted: '#9ca3af'\r\n },\r\n spacing: {\r\n padding: '1rem',\r\n margin: '0.5rem',\r\n gap: '0.5rem',\r\n borderRadius: '0.375rem'\r\n },\r\n typography: {\r\n fontSize: '0.875rem',\r\n fontWeight: '400',\r\n lineHeight: '1.25rem'\r\n },\r\n borders: {\r\n width: '1px',\r\n style: 'solid',\r\n color: '#d1d5db'\r\n },\r\n shadows: {\r\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\r\n md: '0 4px 6px -1px rgb(0 0 0 / 0.1)',\r\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.1)'\r\n }\r\n },\r\n labels: {\r\n uploadText: 'Choose files to upload',\r\n dragText: 'Drag and drop files here',\r\n dropText: 'Drop files here',\r\n browseText: 'Browse',\r\n errorText: 'Upload failed',\r\n successText: 'Upload successful',\r\n progressText: 'Uploading...',\r\n removeText: 'Remove',\r\n retryText: 'Retry',\r\n cancelText: 'Cancel',\r\n selectFilesText: 'Select files',\r\n maxSizeText: 'File too large',\r\n invalidTypeText: 'Invalid file type',\r\n tooManyFilesText: 'Too many files'\r\n },\r\n features: {\r\n dragAndDrop: true,\r\n preview: true,\r\n progress: true,\r\n multipleFiles: false,\r\n removeFiles: true,\r\n retryFailed: true,\r\n showFileSize: true,\r\n showFileType: true,\r\n autoUpload: false,\r\n chunkedUpload: false,\r\n resumableUpload: false\r\n },\r\n animations: {\r\n enabled: true,\r\n duration: 200,\r\n easing: 'ease-in-out'\r\n },\r\n accessibility: {\r\n announceFileSelection: true,\r\n announceProgress: true,\r\n announceErrors: true,\r\n keyboardNavigation: true,\r\n focusManagement: true\r\n }\r\n}\r\n\r\n\r\nexport const configSchema = {\r\n $schema: 'http://json-schema.org/draft-07/schema#',\r\n title: 'File Upload Component Configuration',\r\n description: 'Configuration schema for the file upload component library',\r\n type: 'object',\r\n properties: {\r\n defaults: {\r\n type: 'object',\r\n description: 'Default values for component props',\r\n properties: {\r\n variant: {\r\n type: 'string',\r\n enum: ['button', 'dropzone', 'preview', 'image-only', 'multi-file'],\r\n description: 'Default variant to use'\r\n },\r\n size: {\r\n type: 'string',\r\n enum: ['sm', 'md', 'lg'],\r\n description: 'Default size'\r\n },\r\n radius: {\r\n type: 'string',\r\n enum: ['none', 'sm', 'md', 'lg', 'full'],\r\n description: 'Default border radius'\r\n },\r\n theme: {\r\n type: 'string',\r\n enum: ['light', 'dark', 'auto'],\r\n description: 'Default theme'\r\n },\r\n multiple: {\r\n type: 'boolean',\r\n description: 'Allow multiple file selection by default'\r\n },\r\n disabled: {\r\n type: 'boolean',\r\n description: 'Disabled state by default'\r\n },\r\n accept: {\r\n type: 'string',\r\n description: 'Default accepted file types'\r\n },\r\n maxSize: {\r\n type: 'number',\r\n minimum: 0,\r\n description: 'Default maximum file size in bytes'\r\n },\r\n maxFiles: {\r\n type: 'number',\r\n minimum: 1,\r\n description: 'Default maximum number of files'\r\n }\r\n },\r\n required: ['variant', 'size', 'radius', 'theme', 'multiple', 'disabled', 'accept', 'maxSize', 'maxFiles'],\r\n additionalProperties: false\r\n },\r\n validation: {\r\n type: 'object',\r\n description: 'File validation rules',\r\n properties: {\r\n maxSize: {\r\n type: 'number',\r\n minimum: 0,\r\n description: 'Maximum file size in bytes'\r\n },\r\n maxFiles: {\r\n type: 'number',\r\n minimum: 1,\r\n description: 'Maximum number of files'\r\n },\r\n allowedTypes: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Allowed MIME types'\r\n },\r\n allowedExtensions: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Allowed file extensions'\r\n },\r\n minSize: {\r\n type: 'number',\r\n minimum: 0,\r\n description: 'Minimum file size in bytes'\r\n },\r\n validateDimensions: {\r\n type: 'boolean',\r\n description: 'Whether to validate image dimensions'\r\n },\r\n maxWidth: {\r\n type: 'number',\r\n minimum: 1,\r\n description: 'Maximum image width in pixels'\r\n },\r\n maxHeight: {\r\n type: 'number',\r\n minimum: 1,\r\n description: 'Maximum image height in pixels'\r\n },\r\n minWidth: {\r\n type: 'number',\r\n minimum: 1,\r\n description: 'Minimum image width in pixels'\r\n },\r\n minHeight: {\r\n type: 'number',\r\n minimum: 1,\r\n description: 'Minimum image height in pixels'\r\n }\r\n },\r\n required: ['maxSize', 'maxFiles', 'allowedTypes', 'allowedExtensions'],\r\n additionalProperties: false\r\n },\r\n styling: {\r\n type: 'object',\r\n description: 'Visual styling configuration',\r\n properties: {\r\n theme: {\r\n type: 'string',\r\n enum: ['light', 'dark', 'auto'],\r\n description: 'Theme mode'\r\n },\r\n colors: {\r\n type: 'object',\r\n properties: {\r\n primary: { type: 'string', pattern: '^#[0-9a-fA-F]{6}$' },\r\n secondary: { type: 'string', pattern: '^#[0-9a-fA-F]{6}$' },\r\n success: { type: 'string', pattern: '^#[0-9a-fA-F]{6}$' },\r\n error: { type: 'string', pattern: '^#[0-9a-fA-F]{6}$' },\r\n warning: { type: 'string', pattern: '^#[0-9a-fA-F]{6}$' },\r\n background: { type: 'string', pattern: '^#[0-9a-fA-F]{6}$' },\r\n foreground: { type: 'string', pattern: '^#[0-9a-fA-F]{6}$' },\r\n border: { type: 'string', pattern: '^#[0-9a-fA-F]{6}$' },\r\n muted: { type: 'string', pattern: '^#[0-9a-fA-F]{6}$' }\r\n },\r\n required: ['primary', 'secondary', 'success', 'error', 'warning', 'background', 'foreground', 'border', 'muted'],\r\n additionalProperties: false\r\n },\r\n spacing: {\r\n type: 'object',\r\n properties: {\r\n padding: { type: 'string' },\r\n margin: { type: 'string' },\r\n gap: { type: 'string' },\r\n borderRadius: { type: 'string' }\r\n },\r\n required: ['padding', 'margin', 'gap', 'borderRadius'],\r\n additionalProperties: false\r\n },\r\n typography: {\r\n type: 'object',\r\n properties: {\r\n fontSize: { type: 'string' },\r\n fontWeight: { type: 'string' },\r\n lineHeight: { type: 'string' }\r\n },\r\n required: ['fontSize', 'fontWeight', 'lineHeight'],\r\n additionalProperties: false\r\n },\r\n borders: {\r\n type: 'object',\r\n properties: {\r\n width: { type: 'string' },\r\n style: {\r\n type: 'string',\r\n enum: ['solid', 'dashed', 'dotted', 'none']\r\n },\r\n color: { type: 'string', pattern: '^#[0-9a-fA-F]{6}$' }\r\n },\r\n required: ['width', 'style', 'color'],\r\n additionalProperties: false\r\n },\r\n shadows: {\r\n type: 'object',\r\n properties: {\r\n sm: { type: 'string' },\r\n md: { type: 'string' },\r\n lg: { type: 'string' }\r\n },\r\n required: ['sm', 'md', 'lg'],\r\n additionalProperties: false\r\n }\r\n },\r\n required: ['theme', 'colors', 'spacing', 'typography', 'borders', 'shadows'],\r\n additionalProperties: false\r\n },\r\n labels: {\r\n type: 'object',\r\n description: 'Text labels and messages',\r\n properties: {\r\n uploadText: { type: 'string' },\r\n dragText: { type: 'string' },\r\n dropText: { type: 'string' },\r\n browseText: { type: 'string' },\r\n errorText: { type: 'string' },\r\n successText: { type: 'string' },\r\n progressText: { type: 'string' },\r\n removeText: { type: 'string' },\r\n retryText: { type: 'string' },\r\n cancelText: { type: 'string' },\r\n selectFilesText: { type: 'string' },\r\n maxSizeText: { type: 'string' },\r\n invalidTypeText: { type: 'string' },\r\n tooManyFilesText: { type: 'string' }\r\n },\r\n required: [\r\n 'uploadText', 'dragText', 'dropText', 'browseText', 'errorText',\r\n 'successText', 'progressText', 'removeText', 'retryText', 'cancelText',\r\n 'selectFilesText', 'maxSizeText', 'invalidTypeText', 'tooManyFilesText'\r\n ],\r\n additionalProperties: false\r\n },\r\n features: {\r\n type: 'object',\r\n description: 'Feature toggles',\r\n properties: {\r\n dragAndDrop: { type: 'boolean' },\r\n preview: { type: 'boolean' },\r\n progress: { type: 'boolean' },\r\n multipleFiles: { type: 'boolean' },\r\n removeFiles: { type: 'boolean' },\r\n retryFailed: { type: 'boolean' },\r\n showFileSize: { type: 'boolean' },\r\n showFileType: { type: 'boolean' },\r\n autoUpload: { type: 'boolean' },\r\n chunkedUpload: { type: 'boolean' },\r\n resumableUpload: { type: 'boolean' }\r\n },\r\n required: [\r\n 'dragAndDrop', 'preview', 'progress', 'multipleFiles', 'removeFiles',\r\n 'retryFailed', 'showFileSize', 'showFileType', 'autoUpload',\r\n 'chunkedUpload', 'resumableUpload'\r\n ],\r\n additionalProperties: false\r\n },\r\n animations: {\r\n type: 'object',\r\n description: 'Animation settings',\r\n properties: {\r\n enabled: { type: 'boolean' },\r\n duration: {\r\n type: 'number',\r\n minimum: 0,\r\n maximum: 5000\r\n },\r\n easing: { type: 'string' }\r\n },\r\n required: ['enabled', 'duration', 'easing'],\r\n additionalProperties: false\r\n },\r\n accessibility: {\r\n type: 'object',\r\n description: 'Accessibility settings',\r\n properties: {\r\n announceFileSelection: { type: 'boolean' },\r\n announceProgress: { type: 'boolean' },\r\n announceErrors: { type: 'boolean' },\r\n keyboardNavigation: { type: 'boolean' },\r\n focusManagement: { type: 'boolean' }\r\n },\r\n required: [\r\n 'announceFileSelection', 'announceProgress', 'announceErrors',\r\n 'keyboardNavigation', 'focusManagement'\r\n ],\r\n additionalProperties: false\r\n }\r\n },\r\n required: ['defaults', 'validation', 'styling', 'labels', 'features', 'animations', 'accessibility'],\r\n additionalProperties: false\r\n}\r\n\r\nexport interface ValidationResult {\r\n isValid: boolean\r\n errors: ValidationError[]\r\n}\r\n\r\nexport interface ValidationError {\r\n path: string\r\n message: string\r\n value?: any\r\n severity?: 'error' | 'warning'\r\n code?: string\r\n suggestion?: string\r\n}\r\n\r\n\r\nexport function validateConfig(config: any): ValidationResult {\r\n const errors: ValidationError[] = []\r\n\r\n try {\r\n\r\n if (!config || typeof config !== 'object') {\r\n errors.push({\r\n path: 'root',\r\n message: 'Configuration must be an object',\r\n value: config\r\n })\r\n return { isValid: false, errors }\r\n }\r\n\r\n\r\n const requiredProps = ['defaults', 'validation', 'styling', 'labels', 'features', 'animations', 'accessibility']\r\n for (const prop of requiredProps) {\r\n if (!(prop in config)) {\r\n errors.push({\r\n path: prop,\r\n message: `Required property '${prop}' is missing`\r\n })\r\n }\r\n }\r\n\r\n\r\n if (config.defaults) {\r\n validateDefaults(config.defaults, errors)\r\n }\r\n\r\n\r\n if (config.validation) {\r\n validateValidationRules(config.validation, errors)\r\n }\r\n\r\n\r\n if (config.styling) {\r\n validateStyling(config.styling, errors)\r\n }\r\n\r\n if (config.labels) {\r\n validateLabels(config.labels, errors)\r\n }\r\n\r\n\r\n if (config.features) {\r\n validateFeatures(config.features, errors)\r\n }\r\n\r\n\r\n if (config.animations) {\r\n validateAnimations(config.animations, errors)\r\n }\r\n\r\n\r\n if (config.accessibility) {\r\n validateAccessibility(config.accessibility, errors)\r\n }\r\n\r\n } catch (error) {\r\n errors.push({\r\n path: 'root',\r\n message: `Validation error: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n })\r\n }\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors\r\n }\r\n}\r\n\r\nfunction validateDefaults(defaults: any, errors: ValidationError[]) {\r\n const validVariants = ['button', 'dropzone', 'preview', 'image-only', 'multi-file']\r\n const validSizes = ['sm', 'md', 'lg']\r\n const validRadii = ['none', 'sm', 'md', 'lg', 'full']\r\n const validThemes = ['light', 'dark', 'auto']\r\n\r\n if (defaults.variant && !validVariants.includes(defaults.variant)) {\r\n errors.push({\r\n path: 'defaults.variant',\r\n message: `Invalid variant. Must be one of: ${validVariants.join(', ')}`,\r\n value: defaults.variant\r\n })\r\n }\r\n\r\n if (defaults.size && !validSizes.includes(defaults.size)) {\r\n errors.push({\r\n path: 'defaults.size',\r\n message: `Invalid size. Must be one of: ${validSizes.join(', ')}`,\r\n value: defaults.size\r\n })\r\n }\r\n\r\n if (defaults.radius && !validRadii.includes(defaults.radius)) {\r\n errors.push({\r\n path: 'defaults.radius',\r\n message: `Invalid radius. Must be one of: ${validRadii.join(', ')}`,\r\n value: defaults.radius\r\n })\r\n }\r\n\r\n if (defaults.theme && !validThemes.includes(defaults.theme)) {\r\n errors.push({\r\n path: 'defaults.theme',\r\n message: `Invalid theme. Must be one of: ${validThemes.join(', ')}`,\r\n value: defaults.theme\r\n })\r\n }\r\n\r\n if (typeof defaults.maxSize === 'number' && defaults.maxSize < 0) {\r\n errors.push({\r\n path: 'defaults.maxSize',\r\n message: 'maxSize must be a non-negative number',\r\n value: defaults.maxSize\r\n })\r\n }\r\n\r\n if (typeof defaults.maxFiles === 'number' && defaults.maxFiles < 1) {\r\n errors.push({\r\n path: 'defaults.maxFiles',\r\n message: 'maxFiles must be at least 1',\r\n value: defaults.maxFiles\r\n })\r\n }\r\n}\r\n\r\nfunction validateValidationRules(validation: any, errors: ValidationError[]) {\r\n if (typeof validation.maxSize === 'number' && validation.maxSize < 0) {\r\n errors.push({\r\n path: 'validation.maxSize',\r\n message: 'maxSize must be a non-negative number',\r\n value: validation.maxSize\r\n })\r\n }\r\n\r\n if (typeof validation.maxFiles === 'number' && validation.maxFiles < 1) {\r\n errors.push({\r\n path: 'validation.maxFiles',\r\n message: 'maxFiles must be at least 1',\r\n value: validation.maxFiles\r\n })\r\n }\r\n\r\n if (validation.minSize !== undefined && typeof validation.minSize === 'number' && validation.minSize < 0) {\r\n errors.push({\r\n path: 'validation.minSize',\r\n message: 'minSize must be a non-negative number',\r\n value: validation.minSize\r\n })\r\n }\r\n\r\n if (validation.maxWidth !== undefined && typeof validation.maxWidth === 'number' && validation.maxWidth < 1) {\r\n errors.push({\r\n path: 'validation.maxWidth',\r\n message: 'maxWidth must be at least 1',\r\n value: validation.maxWidth\r\n })\r\n }\r\n\r\n if (validation.maxHeight !== undefined && typeof validation.maxHeight === 'number' && validation.maxHeight < 1) {\r\n errors.push({\r\n path: 'validation.maxHeight',\r\n message: 'maxHeight must be at least 1',\r\n value: validation.maxHeight\r\n })\r\n }\r\n}\r\n\r\nfunction validateStyling(styling: any, errors: ValidationError[]) {\r\n const validThemes = ['light', 'dark', 'auto']\r\n const validBorderStyles = ['solid', 'dashed', 'dotted', 'none']\r\n const hexColorPattern = /^#[0-9a-fA-F]{6}$/\r\n\r\n if (styling.theme && !validThemes.includes(styling.theme)) {\r\n errors.push({\r\n path: 'styling.theme',\r\n message: `Invalid theme. Must be one of: ${validThemes.join(', ')}`,\r\n value: styling.theme\r\n })\r\n }\r\n\r\n if (styling.colors) {\r\n const colorKeys = ['primary', 'secondary', 'success', 'error', 'warning', 'background', 'foreground', 'border', 'muted']\r\n for (const key of colorKeys) {\r\n if (styling.colors[key] && !hexColorPattern.test(styling.colors[key])) {\r\n errors.push({\r\n path: `styling.colors.${key}`,\r\n message: 'Color must be a valid hex color (e.g., #ffffff)',\r\n value: styling.colors[key]\r\n })\r\n }\r\n }\r\n }\r\n\r\n if (styling.borders?.style && !validBorderStyles.includes(styling.borders.style)) {\r\n errors.push({\r\n path: 'styling.borders.style',\r\n message: `Invalid border style. Must be one of: ${validBorderStyles.join(', ')}`,\r\n value: styling.borders.style\r\n })\r\n }\r\n}\r\n\r\nfunction validateLabels(labels: any, errors: ValidationError[]) {\r\n const requiredLabels = [\r\n 'uploadText', 'dragText', 'dropText', 'browseText', 'errorText',\r\n 'successText', 'progressText', 'removeText', 'retryText', 'cancelText',\r\n 'selectFilesText', 'maxSizeText', 'invalidTypeText', 'tooManyFilesText'\r\n ]\r\n\r\n for (const label of requiredLabels) {\r\n if (!(label in labels)) {\r\n errors.push({\r\n path: `labels.${label}`,\r\n message: `Required label '${label}' is missing`\r\n })\r\n } else if (typeof labels[label] !== 'string') {\r\n errors.push({\r\n path: `labels.${label}`,\r\n message: `Label '${label}' must be a string`,\r\n value: labels[label]\r\n })\r\n }\r\n }\r\n}\r\n\r\nfunction validateFeatures(features: any, errors: ValidationError[]) {\r\n const requiredFeatures = [\r\n 'dragAndDrop', 'preview', 'progress', 'multipleFiles', 'removeFiles',\r\n 'retryFailed', 'showFileSize', 'showFileType', 'autoUpload',\r\n 'chunkedUpload', 'resumableUpload'\r\n ]\r\n\r\n for (const feature of requiredFeatures) {\r\n if (!(feature in features)) {\r\n errors.push({\r\n path: `features.${feature}`,\r\n message: `Required feature '${feature}' is missing`\r\n })\r\n } else if (typeof features[feature] !== 'boolean') {\r\n errors.push({\r\n path: `features.${feature}`,\r\n message: `Feature '${feature}' must be a boolean`,\r\n value: features[feature]\r\n })\r\n }\r\n }\r\n}\r\n\r\nfunction validateAnimations(animations: any, errors: ValidationError[]) {\r\n if (typeof animations.enabled !== 'boolean') {\r\n errors.push({\r\n path: 'animations.enabled',\r\n message: 'animations.enabled must be a boolean',\r\n value: animations.enabled\r\n })\r\n }\r\n\r\n if (typeof animations.duration === 'number') {\r\n if (animations.duration < 0 || animations.duration > 5000) {\r\n errors.push({\r\n path: 'animations.duration',\r\n message: 'animations.duration must be between 0 and 5000 milliseconds',\r\n value: animations.duration\r\n })\r\n }\r\n } else if (animations.duration !== undefined) {\r\n errors.push({\r\n path: 'animations.duration',\r\n message: 'animations.duration must be a number',\r\n value: animations.duration\r\n })\r\n }\r\n\r\n if (animations.easing !== undefined && typeof animations.easing !== 'string') {\r\n errors.push({\r\n path: 'animations.easing',\r\n message: 'animations.easing must be a string',\r\n value: animations.easing\r\n })\r\n }\r\n}\r\n\r\nfunction validateAccessibility(accessibility: any, errors: ValidationError[]) {\r\n const requiredAccessibilityFeatures = [\r\n 'announceFileSelection', 'announceProgress', 'announceErrors',\r\n 'keyboardNavigation', 'focusManagement'\r\n ]\r\n\r\n for (const feature of requiredAccessibilityFeatures) {\r\n if (!(feature in accessibility)) {\r\n errors.push({\r\n path: `accessibility.${feature}`,\r\n message: `Required accessibility feature '${feature}' is missing`\r\n })\r\n } else if (typeof accessibility[feature] !== 'boolean') {\r\n errors.push({\r\n path: `accessibility.${feature}`,\r\n message: `Accessibility feature '${feature}' must be a boolean`,\r\n value: accessibility[feature]\r\n })\r\n }\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Removes null and undefined values from an object recursively\r\n */\r\nfunction cleanNullValues(obj: any): any {\r\n if (obj === null || obj === undefined) {\r\n return undefined\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.filter(item => item !== null && item !== undefined)\r\n }\r\n\r\n if (typeof obj === 'object') {\r\n const cleaned: any = {}\r\n for (const [key, value] of Object.entries(obj)) {\r\n if (value !== null && value !== undefined) {\r\n if (typeof value === 'object' && !Array.isArray(value)) {\r\n const cleanedValue = cleanNullValues(value)\r\n if (cleanedValue !== undefined && Object.keys(cleanedValue).length > 0) {\r\n cleaned[key] = cleanedValue\r\n }\r\n } else {\r\n cleaned[key] = value\r\n }\r\n }\r\n }\r\n return cleaned\r\n }\r\n\r\n return obj\r\n}\r\n\r\nexport function mergeConfig(userConfig: Partial<FileUploadConfig>): FileUploadConfig {\r\n // Clean null values from user config before merging\r\n const cleanedUserConfig = cleanNullValues(userConfig)\r\n\r\n return {\r\n defaults: { ...defaultConfig.defaults, ...cleanedUserConfig.defaults },\r\n validation: { ...defaultConfig.validation, ...cleanedUserConfig.validation },\r\n styling: {\r\n ...defaultConfig.styling,\r\n ...cleanedUserConfig.styling,\r\n colors: { ...defaultConfig.styling.colors, ...cleanedUserConfig.styling?.colors },\r\n spacing: { ...defaultConfig.styling.spacing, ...cleanedUserConfig.styling?.spacing },\r\n typography: { ...defaultConfig.styling.typography, ...cleanedUserConfig.styling?.typography },\r\n borders: { ...defaultConfig.styling.borders, ...cleanedUserConfig.styling?.borders },\r\n shadows: { ...defaultConfig.styling.shadows, ...cleanedUserConfig.styling?.shadows }\r\n },\r\n labels: { ...defaultConfig.labels, ...cleanedUserConfig.labels },\r\n features: { ...defaultConfig.features, ...cleanedUserConfig.features },\r\n animations: { ...defaultConfig.animations, ...cleanedUserConfig.animations },\r\n accessibility: { ...defaultConfig.accessibility, ...cleanedUserConfig.accessibility }\r\n }\r\n}\r\n\r\n\r\nexport function loadConfigFromJSON(jsonString: string): { config: FileUploadConfig | null; errors: ValidationError[] } {\r\n try {\r\n const parsed = JSON.parse(jsonString)\r\n\r\n // For partial configurations, we merge first then validate\r\n const mergedConfig = mergeConfig(parsed)\r\n const validation = validateConfig(mergedConfig)\r\n\r\n if (validation.isValid) {\r\n return { config: mergedConfig, errors: [] }\r\n } else {\r\n return { config: null, errors: validation.errors }\r\n }\r\n } catch (error) {\r\n return {\r\n config: null,\r\n errors: [{\r\n path: 'root',\r\n message: `Invalid JSON: ${error instanceof Error ? error.message : 'Unknown parsing error'}`\r\n }]\r\n }\r\n }\r\n}"],"names":[],"mappings":"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"}