img-upload-kit 1.1.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +56 -41
- package/MIGRATION.md +192 -0
- package/README.md +138 -154
- package/dist/bin.js +1186 -0
- package/dist/bin.js.map +1 -0
- package/dist/blur.cjs +40 -412
- package/dist/blur.cjs.map +1 -1
- package/dist/blur.d.cts +5 -5
- package/dist/blur.d.ts +5 -5
- package/dist/blur.js +39 -393
- package/dist/blur.js.map +1 -1
- package/dist/blurDataUtils-DveBRtqE.d.cts +43 -0
- package/dist/blurDataUtils-yx9Q6HlU.d.ts +43 -0
- package/dist/blurService-D5TpMNji.d.ts +83 -0
- package/dist/blurService-DacwylJx.d.cts +83 -0
- package/dist/chunk-2OVNXHTN.cjs +514 -0
- package/dist/chunk-2OVNXHTN.cjs.map +1 -0
- package/dist/chunk-3ICG2SLL.cjs +135 -0
- package/dist/chunk-3ICG2SLL.cjs.map +1 -0
- package/dist/chunk-4ASFG3KB.js +514 -0
- package/dist/chunk-4ASFG3KB.js.map +1 -0
- package/dist/chunk-AI3JJLSA.js +2370 -0
- package/dist/chunk-AI3JJLSA.js.map +1 -0
- package/dist/chunk-CV23O4YU.js +145 -0
- package/dist/chunk-CV23O4YU.js.map +1 -0
- package/dist/chunk-G7LLSKBV.js +158 -0
- package/dist/chunk-G7LLSKBV.js.map +1 -0
- package/dist/chunk-IB3TEDLR.js +294 -0
- package/dist/chunk-IB3TEDLR.js.map +1 -0
- package/dist/chunk-KJVYWKIG.cjs +158 -0
- package/dist/chunk-KJVYWKIG.cjs.map +1 -0
- package/dist/chunk-NEDBIIE3.cjs +226 -0
- package/dist/chunk-NEDBIIE3.cjs.map +1 -0
- package/dist/chunk-QHU7FUO4.cjs +37 -0
- package/dist/chunk-QHU7FUO4.cjs.map +1 -0
- package/dist/chunk-QQHZJKNA.js +135 -0
- package/dist/chunk-QQHZJKNA.js.map +1 -0
- package/dist/chunk-S2IFAWJK.js +37 -0
- package/dist/chunk-S2IFAWJK.js.map +1 -0
- package/dist/chunk-TT5C7K3Q.js +226 -0
- package/dist/chunk-TT5C7K3Q.js.map +1 -0
- package/dist/chunk-U2TWTEBY.cjs +2370 -0
- package/dist/chunk-U2TWTEBY.cjs.map +1 -0
- package/dist/chunk-WISG74VL.cjs +294 -0
- package/dist/chunk-WISG74VL.cjs.map +1 -0
- package/dist/chunk-YRXXQUDE.cjs +145 -0
- package/dist/chunk-YRXXQUDE.cjs.map +1 -0
- package/dist/cli.cjs +273 -76
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +269 -73
- package/dist/cli.js.map +1 -1
- package/dist/headless.cjs +8 -1880
- package/dist/headless.cjs.map +1 -1
- package/dist/headless.d.cts +3 -1
- package/dist/headless.d.ts +3 -1
- package/dist/headless.js +25 -1886
- package/dist/headless.js.map +1 -1
- package/dist/index-BIdnqtW8.d.ts +234 -0
- package/dist/index-Brk_uHs6.d.cts +234 -0
- package/dist/{index-FVXXKf2v.d.ts → index-CPMlaQsC.d.ts} +76 -153
- package/dist/{index-FVXXKf2v.d.cts → index-DHINe-rA.d.cts} +76 -153
- package/dist/index.cjs +64 -532
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -4
- package/dist/index.d.ts +7 -4
- package/dist/index.js +63 -504
- package/dist/index.js.map +1 -1
- package/dist/{memoryAdapter-CBu7_3Pp.d.ts → memoryAdapter-Ck0ccZbF.d.cts} +3 -2
- package/dist/{memoryAdapter-BJjyLR-1.d.cts → memoryAdapter-DxEKaG0b.d.ts} +3 -2
- package/dist/placeholders-C4ftwaII.d.ts +5 -0
- package/dist/placeholders-x_3rt65M.d.cts +5 -0
- package/dist/react.cjs +1952 -3257
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +188 -50
- package/dist/react.d.ts +188 -50
- package/dist/react.js +1763 -3013
- package/dist/react.js.map +1 -1
- package/dist/server-handler.cjs +14 -0
- package/dist/server-handler.cjs.map +1 -0
- package/dist/server-handler.d.cts +3 -0
- package/dist/server-handler.d.ts +3 -0
- package/dist/server-handler.js +14 -0
- package/dist/server-handler.js.map +1 -0
- package/dist/server.cjs +1096 -532
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +77 -154
- package/dist/server.d.ts +77 -154
- package/dist/server.js +1050 -448
- package/dist/server.js.map +1 -1
- package/dist/storage.cjs +239 -232
- package/dist/storage.cjs.map +1 -1
- package/dist/storage.d.cts +21 -5
- package/dist/storage.d.ts +21 -5
- package/dist/storage.js +227 -207
- package/dist/storage.js.map +1 -1
- package/dist/styles/animated-image.css +112 -0
- package/dist/styles/dropzone-and-tiles.css +247 -0
- package/dist/styles/modals-and-dock.css +248 -0
- package/dist/styles/primitives.css +197 -0
- package/dist/styles/quality-and-inputs.css +184 -0
- package/dist/styles/tokens.css +123 -0
- package/dist/styles.css +39 -24
- package/dist/types-BrP-o9nd.d.cts +85 -0
- package/dist/types-sZ3KoFQY.d.ts +85 -0
- package/dist/types-yShGNQnW.d.cts +61 -0
- package/dist/types-yShGNQnW.d.ts +61 -0
- package/dist/{types-CiLY0DwB.d.cts → upload-C5Trd6Dh.d.cts} +27 -53
- package/dist/{types-CiLY0DwB.d.ts → upload-C5Trd6Dh.d.ts} +27 -53
- package/package.json +92 -32
- package/dist/blurService-DqsnfPTd.d.cts +0 -172
- package/dist/blurService-DqsnfPTd.d.ts +0 -172
package/dist/headless.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/hooks/useDragAndDrop.ts","../src/types/quality.ts","../src/types/presets.ts","../src/utils/color.ts","../src/utils/validators.ts","../src/react/context.tsx","../src/react/i18n/ar.ts","../src/react/i18n/en.ts","../src/react/i18n.ts","../src/react/utils/sessionMetaCache.ts","../src/react/hooks/useFilePreview.ts","../src/utils/formatters.ts","../src/react/hooks/xhrUpload.ts","../src/react/hooks/useImageUpload.ts","../src/react/hooks/useSingleImageState.ts","../src/react/utils/slotStyles.ts","../src/react/headless/useSingleUpload.ts","../src/react/hooks/useMultiImageState.ts","../src/react/headless/useMultiUpload.ts","../src/react/headless/HeadlessSingleUpload.tsx","../src/react/headless/HeadlessMultiUpload.tsx"],"names":["useCallback","useState","useMemo","useRef","useEffect","DEFAULT_ACCEPT","jsx","Fragment"],"mappings":"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","file":"headless.js","sourcesContent":["import { type DragEvent, useCallback, useState } from 'react';\n\nexport interface UseDragAndDropOptions {\n disabled?: boolean;\n onDrop: (files: FileList) => void;\n}\n\nexport function useDragAndDrop({ disabled, onDrop }: UseDragAndDropOptions) {\n const [isDragging, setIsDragging] = useState(false);\n\n const handleDragEnter = useCallback(\n (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (!disabled) {\n setIsDragging(true);\n }\n },\n [disabled],\n );\n\n const handleDragLeave = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n }, []);\n\n const handleDragOver = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const handleDrop = useCallback(\n (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n\n if (disabled) return;\n\n const files = e.dataTransfer.files;\n if (files && files.length > 0) {\n onDrop(files);\n }\n },\n [disabled, onDrop],\n );\n\n return {\n isDragging,\n dragHandlers: {\n onDragEnter: handleDragEnter,\n onDragLeave: handleDragLeave,\n onDragOver: handleDragOver,\n onDrop: handleDrop,\n },\n };\n}\n","export type UploadLocale = 'en' | 'ar';\n\nexport type ImageOutputFormat = 'avif' | 'webp' | 'jpeg' | 'png' | 'svg';\n\nexport type ExplicitOutputFormat = 'avif' | 'webp' | 'jpeg' | 'png';\n\nexport type QualityLevel = 'low' | 'medium' | 'high' | 'maximum';\n\nexport interface QualityPreset {\n label: string;\n labelAr: string;\n value: number;\n description: string;\n descriptionAr: string;\n /** Rough fraction of original bytes after modern AVIF/WebP compression */\n compressionRatio: number;\n}\n\nexport const QUALITY_PRESETS: Record<QualityLevel, QualityPreset> = {\n low: {\n label: 'Low',\n labelAr: 'منخفضة',\n value: 50,\n description: 'Smallest file — best for tiny thumbnails and icons',\n descriptionAr: 'أصغر حجم — مناسب للمصغرات والأيقونات الصغيرة',\n compressionRatio: 0.12,\n },\n medium: {\n label: 'Medium',\n labelAr: 'متوسطة',\n value: 72,\n description: 'Balanced size and quality — suitable for most web images',\n descriptionAr: 'توازن بين الحجم والجودة — مناسب لمعظم صور الويب',\n compressionRatio: 0.22,\n },\n high: {\n label: 'High',\n labelAr: 'عالية',\n value: 85,\n description: 'Recommended — sharp visuals with excellent compression',\n descriptionAr: 'موصى به — جودة عالية وضغط ممتاز',\n compressionRatio: 0.3,\n },\n maximum: {\n label: 'Maximum',\n labelAr: 'أقصى جودة',\n value: 95,\n description: 'Closest to original — large file, use for hero / print',\n descriptionAr: 'أقرب للأصل — حجم كبير، مناسب للصور الرئيسية والطباعة',\n compressionRatio: 0.55,\n },\n};\n\nexport interface ImageDimensions {\n width: number;\n height: number;\n}\n","import type {\n ExplicitOutputFormat,\n ImageDimensions,\n QualityLevel,\n} from './quality';\n\n/**\n * Universal visual role presets (project-agnostic).\n * Consumers can define their own presets via `defineUploadPresets` / `createImageUploader({ presets })`\n * or augment `UploadKitRegister` for global type-safety.\n */\nexport type StandardPresetName =\n | 'thumbnail'\n | 'avatar'\n | 'card'\n | 'cover'\n | 'hero'\n | 'logo'\n | 'original';\n\n/**\n * Module augmentation hook for global preset autocomplete across a project:\n * ```ts\n * declare module 'img-upload-kit' {\n * interface UploadKitRegister {\n * presets: 'product-main' | 'product-thumb' | 'user-avatar';\n * }\n * }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface UploadKitRegister {}\n\nexport type UploadPresetName = UploadKitRegister extends {\n presets: infer TCustom extends string;\n}\n ? TCustom\n : StandardPresetName | (string & {});\n\nexport interface UploadPresetConfig {\n /** Target storage bucket for this preset */\n bucket?: string;\n /** Default folder prefix within the bucket (e.g. 'avatars' or 'products/thumbnails') */\n folder?: string;\n /** Maximum bounding box dimensions (aspect ratio preserved, never enlarged) */\n maxDimensions?: ImageDimensions;\n /** Maximum allowed source file size in MB */\n maxSizeMB?: number;\n /** Allowed source MIME types */\n allowedFormats?: string[];\n /** Force a specific output format; omit for smart size-guarded AVIF/WebP optimization */\n outputFormat?: ExplicitOutputFormat;\n /** Default compression quality (1–100) */\n quality?: number;\n /** Recommended UI quality tab for React `<QualitySelector />` */\n recommendedQualityLevel?: QualityLevel;\n /** Optional guidance note shown in `<QualitySelector />` */\n recommendationNote?: { en: string; ar?: string };\n /** Generate compact BlurHash string alongside WebP LQIP data URL */\n includeBlurHash?: boolean;\n /** Optional local directory to mirror uploaded files into */\n mirrorDir?: string;\n /** Optional public URL prefix when `mirrorDir` is used */\n publicUrlBase?: string;\n}\n\nexport const DEFAULT_ALLOWED_FORMATS: string[] = [\n 'image/jpeg',\n 'image/png',\n 'image/webp',\n 'image/avif',\n 'image/svg+xml',\n];\n\nexport const RASTER_ALLOWED_FORMATS: string[] = [\n 'image/jpeg',\n 'image/png',\n 'image/webp',\n 'image/avif',\n];\n\nexport const DEFAULT_IMAGE_DIMENSIONS: ImageDimensions = {\n width: 1920,\n height: 1080,\n};\n\nexport const STANDARD_PRESETS: Record<StandardPresetName, UploadPresetConfig> = {\n thumbnail: {\n folder: 'thumbnails',\n maxDimensions: { width: 600, height: 600 },\n maxSizeMB: 5,\n quality: 78,\n recommendedQualityLevel: 'medium',\n allowedFormats: RASTER_ALLOWED_FORMATS,\n recommendationNote: {\n en: 'Thumbnails display at compact sizes — Medium quality keeps pages fast',\n ar: 'المصغرات تعرض بأحجام صغيرة — الجودة المتوسطة تحافظ على سرعة الصفحة',\n },\n },\n avatar: {\n folder: 'avatars',\n maxDimensions: { width: 512, height: 512 },\n maxSizeMB: 5,\n quality: 80,\n recommendedQualityLevel: 'medium',\n allowedFormats: RASTER_ALLOWED_FORMATS,\n recommendationNote: {\n en: 'Avatars display small — Medium quality balances sharpness and speed',\n ar: 'الصور الشخصية صغيرة — الجودة المتوسطة توازن بين الوضوح والسرعة',\n },\n },\n card: {\n folder: 'cards',\n maxDimensions: { width: 1200, height: 900 },\n maxSizeMB: 8,\n quality: 85,\n recommendedQualityLevel: 'high',\n allowedFormats: DEFAULT_ALLOWED_FORMATS,\n },\n cover: {\n folder: 'covers',\n maxDimensions: { width: 1920, height: 1080 },\n maxSizeMB: 10,\n quality: 88,\n recommendedQualityLevel: 'high',\n allowedFormats: DEFAULT_ALLOWED_FORMATS,\n },\n hero: {\n folder: 'hero',\n maxDimensions: { width: 2560, height: 1440 },\n maxSizeMB: 15,\n quality: 92,\n recommendedQualityLevel: 'maximum',\n allowedFormats: DEFAULT_ALLOWED_FORMATS,\n recommendationNote: {\n en: 'Full-width hero visuals benefit from Maximum quality to preserve fine detail',\n ar: 'الصور الرئيسية بعرض كامل تستفيد من الجودة القصوى للحفاظ على التفاصيل الدقيقة',\n },\n },\n logo: {\n folder: 'logos',\n maxDimensions: { width: 800, height: 800 },\n maxSizeMB: 5,\n quality: 90,\n recommendedQualityLevel: 'high',\n allowedFormats: DEFAULT_ALLOWED_FORMATS,\n recommendationNote: {\n en: 'Prefer SVG for vector logos — High quality preserves crisp edges on raster logos',\n ar: 'يفضل SVG للشعارات المتجهة — الجودة العالية تحافظ على حواف واضحة',\n },\n },\n original: {\n folder: 'originals',\n maxDimensions: { width: 4096, height: 4096 },\n maxSizeMB: 25,\n quality: 95,\n recommendedQualityLevel: 'maximum',\n allowedFormats: DEFAULT_ALLOWED_FORMATS,\n },\n};\n\n/**\n * Type-safe helper to define project-specific upload presets with full key inference.\n */\nexport function defineUploadPresets<\n T extends Record<string, UploadPresetConfig>,\n>(presets: T): T {\n return presets;\n}\n","export const DEFAULT_BLUR_COLOR = '#F5F5F5';\n\nexport function normalizeColorInput(value?: string | null): string | null {\n if (!value) return null;\n let next = value.trim();\n if (!next) return null;\n if (!next.startsWith('#')) {\n next = `#${next}`;\n }\n const threeHex = /^#([0-9a-fA-F]{3})$/;\n const sixHex = /^#([0-9a-fA-F]{6})$/;\n if (threeHex.test(next)) {\n const [, triplet] = next.match(threeHex) ?? [];\n if (triplet) {\n next = `#${triplet\n .split('')\n .map((char) => char + char)\n .join('')}`;\n }\n } else if (!sixHex.test(next)) {\n return null;\n }\n return next.toUpperCase();\n}\n\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } {\n const normalized = hex.replace('#', '');\n const expanded =\n normalized.length === 3\n ? normalized\n .split('')\n .map((char) => char + char)\n .join('')\n : normalized;\n const padded = expanded.padEnd(6, '0').slice(0, 6);\n const value = Number.parseInt(padded, 16);\n if (Number.isNaN(value)) {\n return { r: 245, g: 245, b: 245 };\n }\n return {\n r: (value >> 16) & 255,\n g: (value >> 8) & 255,\n b: value & 255,\n };\n}\n\nexport function rgbToHex(r: number, g: number, b: number): string {\n const clamp = (v: number) => Math.max(0, Math.min(255, Math.round(v)));\n const value = (clamp(r) << 16) | (clamp(g) << 8) | clamp(b);\n return `#${value.toString(16).padStart(6, '0').toUpperCase()}`;\n}\n\nfunction encodeBase64Ascii(str: string): string {\n if (typeof btoa === 'function') {\n return btoa(str);\n }\n return Buffer.from(str, 'utf8').toString('base64');\n}\n\nexport function generateColorSvgDataURL(color: string = DEFAULT_BLUR_COLOR): string {\n const safeColor = normalizeColorInput(color) || DEFAULT_BLUR_COLOR;\n const svg = `<svg width=\"100\" height=\"100\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"100%\" height=\"100%\" fill=\"${safeColor}\"/></svg>`;\n return `data:image/svg+xml;base64,${encodeBase64Ascii(svg)}`;\n}\n","import type { UploadLocale } from '../types';\n\nexport interface FileLike {\n name?: string;\n size: number;\n type: string;\n}\n\nexport function validateImageFileStrict(\n file: FileLike,\n maxSizeMB: number,\n allowedFormats: string[],\n): { valid: boolean; error?: string } {\n const maxBytes = maxSizeMB * 1024 * 1024;\n if (file.size > maxBytes) {\n return {\n valid: false,\n error: `File size (${(file.size / 1024 / 1024).toFixed(2)}MB) exceeds maximum of ${maxSizeMB}MB`,\n };\n }\n\n if (allowedFormats.length > 0 && !allowedFormats.includes(file.type)) {\n return {\n valid: false,\n error: `File type ${file.type || 'unknown'} is not allowed. Allowed: ${allowedFormats.join(', ')}`,\n };\n }\n\n return { valid: true };\n}\n\nexport function validateImageFile(\n file: FileLike,\n maxSizeMB: number,\n locale: UploadLocale = 'en',\n allowedFormats?: string[],\n): string | null {\n if (!file.type || !file.type.startsWith('image/')) {\n return locale === 'ar'\n ? 'يرجى اختيار ملف صورة صالح'\n : 'Please select a valid image file';\n }\n\n if (allowedFormats && allowedFormats.length > 0 && !allowedFormats.includes(file.type)) {\n return locale === 'ar'\n ? `صيغة الملف غير مدعومة (${file.type})`\n : `Unsupported image format (${file.type})`;\n }\n\n const fileSizeMB = file.size / (1024 * 1024);\n if (fileSizeMB > maxSizeMB) {\n return locale === 'ar'\n ? `يجب ألا يتجاوز حجم الملف ${maxSizeMB}MB`\n : `File size must be less than ${maxSizeMB}MB`;\n }\n\n return null;\n}\n\nexport function validateImageFileWithName(\n file: FileLike & { name: string },\n maxSizeMB: number,\n locale: UploadLocale = 'en',\n): string | null {\n if (!file.type || !file.type.startsWith('image/')) {\n return locale === 'ar'\n ? `${file.name}: ليس ملف صورة صالحاً`\n : `${file.name}: Not a valid image file`;\n }\n\n const fileSizeMB = file.size / (1024 * 1024);\n if (fileSizeMB > maxSizeMB) {\n return locale === 'ar'\n ? `${file.name}: يجب ألا يتجاوز حجم الملف ${maxSizeMB}MB`\n : `${file.name}: File size must be less than ${maxSizeMB}MB`;\n }\n\n return null;\n}\n\nexport function validateMultipleFiles(\n files: Array<FileLike & { name: string }>,\n maxSizeMB: number,\n currentCount: number,\n maxImages: number,\n locale: UploadLocale = 'en',\n): string | null {\n if (currentCount + files.length > maxImages) {\n return locale === 'ar'\n ? `يمكن رفع ${maxImages} صورة فقط. المتبقي: ${maxImages - currentCount}.`\n : `Can only upload ${maxImages} images. ${maxImages - currentCount} remaining.`;\n }\n\n const oversizedFiles: string[] = [];\n for (const file of files) {\n const fileSizeMB = file.size / (1024 * 1024);\n if (fileSizeMB > maxSizeMB) {\n oversizedFiles.push(file.name);\n }\n }\n\n if (oversizedFiles.length > 0) {\n if (locale === 'ar') {\n return `الملفات التالية أكبر من الحد المسموح (${maxSizeMB}MB): ${oversizedFiles.join(', ')}`;\n }\n return `The following file${\n oversizedFiles.length > 1 ? 's are' : ' is'\n } too large (max ${maxSizeMB}MB): ${oversizedFiles.join(', ')}`;\n }\n\n return null;\n}\n","import { createContext, type ReactNode, useContext, useMemo } from 'react';\nimport type { UploadLocale } from '../types';\nimport type { UploadTranslations } from './i18n';\nimport type {\n MultiUploadClassNames,\n MultiUploadStyles,\n SingleUploadClassNames,\n SingleUploadStyles,\n} from './styling';\nimport type { CustomImageRenderer, CustomUploaderFn } from './types';\n\nexport interface ImageUploadContextValue {\n endpoint: string;\n uploader?: CustomUploaderFn;\n headers?: Record<string, string>;\n withCredentials?: boolean;\n locale: UploadLocale;\n translations?: Partial<UploadTranslations>;\n renderImage?: CustomImageRenderer;\n storageKeyPrefix: string;\n requireAltText: boolean;\n unstyled: boolean;\n singleClassNames?: SingleUploadClassNames;\n singleStyles?: SingleUploadStyles;\n multiClassNames?: MultiUploadClassNames;\n multiStyles?: MultiUploadStyles;\n}\n\nconst DEFAULT_CONTEXT: ImageUploadContextValue = {\n endpoint: '/api/upload',\n locale: 'en',\n storageKeyPrefix: 'iuk',\n requireAltText: true,\n unstyled: false,\n};\n\nconst ImageUploadContext =\n createContext<ImageUploadContextValue>(DEFAULT_CONTEXT);\n\nexport interface ImageUploadProviderProps {\n children: ReactNode;\n /** Default server endpoint for uploads (defaults to `'/api/upload'`) */\n endpoint?: string;\n /** Custom async uploader function used across all upload components */\n uploader?: CustomUploaderFn;\n /** Custom HTTP headers attached to FormData upload requests */\n headers?: Record<string, string>;\n /** Send credentials/cookies with XHR/fetch requests */\n withCredentials?: boolean;\n /** Default UI locale (`'en' | 'ar'`) */\n locale?: UploadLocale;\n /** Global translation overrides */\n translations?: Partial<UploadTranslations>;\n /** Custom image component renderer (e.g. for custom CDN or framework `<Image />`) */\n renderImage?: CustomImageRenderer;\n /** Prefix used for sessionStorage metadata cache keys (defaults to `'iuk'`) */\n storageKeyPrefix?: string;\n /** Require alt text before saving in modal mode (defaults to `true`) */\n requireAltText?: boolean;\n /** Globally strip default `iuk-*` classes across all Single/Multi upload components */\n unstyled?: boolean;\n /** Global default slot `classNames` applied to all `<SingleImageUpload />` instances */\n singleClassNames?: SingleUploadClassNames;\n /** Global default slot `styles` applied to all `<SingleImageUpload />` instances */\n singleStyles?: SingleUploadStyles;\n /** Global default slot `classNames` applied to all `<MultiImageUpload />` instances */\n multiClassNames?: MultiUploadClassNames;\n /** Global default slot `styles` applied to all `<MultiImageUpload />` instances */\n multiStyles?: MultiUploadStyles;\n}\n\nexport function ImageUploadProvider({\n children,\n endpoint = '/api/upload',\n uploader,\n headers,\n withCredentials,\n locale = 'en',\n translations,\n renderImage,\n storageKeyPrefix = 'iuk',\n requireAltText = true,\n unstyled = false,\n singleClassNames,\n singleStyles,\n multiClassNames,\n multiStyles,\n}: ImageUploadProviderProps) {\n const value = useMemo<ImageUploadContextValue>(\n () => ({\n endpoint,\n uploader,\n headers,\n withCredentials,\n locale,\n translations,\n renderImage,\n storageKeyPrefix,\n requireAltText,\n unstyled,\n singleClassNames,\n singleStyles,\n multiClassNames,\n multiStyles,\n }),\n [\n endpoint,\n uploader,\n headers,\n withCredentials,\n locale,\n translations,\n renderImage,\n storageKeyPrefix,\n requireAltText,\n unstyled,\n singleClassNames,\n singleStyles,\n multiClassNames,\n multiStyles,\n ],\n );\n\n return (\n <ImageUploadContext.Provider value={value}>\n {children}\n </ImageUploadContext.Provider>\n );\n}\n\nexport function useImageUploadContext(): ImageUploadContextValue {\n return useContext(ImageUploadContext);\n}\n","import type { UploadTranslations } from './types';\n\nexport const arTranslations: UploadTranslations = {\n uploadWindow: 'نافذة الرفع',\n tapToResume: 'اضغط للاستئناف',\n restoreUploadWindow: 'استعادة نافذة الرفع',\n minimize: 'تصغير',\n minimizeUploader: 'تصغير نافذة الرفع',\n close: 'إغلاق',\n editPrefix: 'تعديل - {title}',\n uploadImage: 'رفع صورة',\n uploadImages: 'رفع صور',\n noValidImageFiles:\n 'لم يتم العثور على ملفات صور صالحة. يرجى اختيار صور (JPEG, PNG, WebP, AVIF, SVG).',\n selectedImagesSkipped:\n 'تم اختيار {imageCount} صورة. وتم تجاهل {skippedCount} ملف غير صوري.',\n queued: 'في الانتظار...',\n retrying: 'جاري إعادة المحاولة...',\n preparingUpload: 'جاري تجهيز الرفع...',\n uploadFailed: 'فشل الرفع',\n failedCreatePreview: 'تعذر إنشاء المعاينة',\n failedCreatePreviewFor: 'تعذر إنشاء معاينة للملف: {file}',\n selectAll: 'تحديد الكل',\n deselectAll: 'إلغاء تحديد الكل',\n removeSelected: 'حذف المحدد',\n uploading: 'جارٍ الرفع',\n someUploadsFailed: 'فشل رفع بعض الملفات.',\n retryFailedUploads: 'إعادة رفع الملفات الفاشلة',\n needsAltBeforeSave:\n 'يوجد {count} صورة بدون نص بديل. أضف وصفًا قبل الحفظ من زر الوصف على كل صورة.',\n selectFilesAria: 'اختيار ملفات',\n selectMoreFilesAria: 'اختيار ملفات إضافية',\n selectFolderAria: 'اختيار مجلد',\n dropImagesHere: 'أسقط الصور هنا',\n releaseToUpload: 'اترك للإفلات والرفع',\n dragDropOrChoose: 'اسحب وأفلت الصور هنا، أو اختر طريقة الرفع من الأسفل',\n selectFiles: 'اختيار ملفات',\n selectFolder: 'اختيار مجلد',\n supportsFormats: 'الصيغ المدعومة: JPEG, PNG, WebP, AVIF, SVG',\n maxPerFile: 'الحد الأقصى {size}MB لكل ملف',\n upToSizeMB: 'حتى {size} ميجابايت',\n dropHere: 'أسقط هنا',\n addMore: 'إضافة المزيد',\n files: 'ملفات',\n folder: 'مجلد',\n withoutAltText: '{count} بدون نص بديل',\n saveImages: 'حفظ الصور',\n addAltBeforeSaving:\n 'يرجى إضافة نص بديل قبل الحفظ. اضغط زر الوصف على الصورة.',\n missingDescription: 'الوصف مفقود',\n saveImage: 'حفظ الصورة',\n downloadImage: 'تحميل الصورة',\n dragDropOrClickToUpload: 'اسحب وأفلت أو انقر للرفع',\n browseFiles: 'تصفح الملفات',\n image: 'صورة',\n processing: 'جارٍ المعالجة...',\n uploadImageAria: 'رفع صورة',\n fileInputAria: 'حقل اختيار ملف',\n uploadingAlt: 'جارٍ الرفع',\n previewAlt: 'معاينة',\n addImageDescription: 'إضافة وصف للصورة',\n describeImagePlaceholder: 'صف هذه الصورة لإمكانية الوصول...',\n characters: 'حرف',\n usedForA11ySeo: 'يُستخدم لإمكانية الوصول وتحسين الظهور في البحث',\n cancel: 'إلغاء',\n saveDescription: 'حفظ الوصف',\n selectImageAria: 'تحديد الصورة',\n editAltTextAria: 'تعديل النص البديل',\n addAltTextAria: 'إضافة نص بديل',\n addDescriptionForA11y: 'أضف وصفًا لإمكانية الوصول',\n adjustBlurColorAria: 'ضبط التمويه واللون',\n adjustBlurColorTitle: 'معاينة بيانات التمويه وضبط الألوان',\n removeImageAria: 'حذف الصورة',\n blurModal: {\n title: 'معاينة التمويه واللون السائد',\n closeModal: 'إغلاق المعاينة',\n adjustColor: 'لون الخلفية السائد',\n clickToSample: 'انقر في أي مكان على الصورة لالتقاط لون البكسل',\n pickColorNote:\n 'اختر لونًا من الأداة، أو أدخل كود HEX، أو التقط مباشرة من الصورة',\n enterHexColor: 'أدخل كود اللون HEX',\n hexPlaceholder: 'F5F5F5',\n enablePenMode: 'التقاط لون من الصورة',\n disablePenMode: 'إيقاف الالتقاط',\n penModeActive: 'وضع الالتقاط مفعل',\n resetToDetected: 'استعادة اللون التلقائي',\n sampled: 'تم التقاط',\n livePreview: 'معاينة حية للتمويه والصورة',\n showingOriginal: 'عرض الصورة الأصلية (لا يتوفر تمويه بعد)',\n saved: 'التوفير في الحجم:',\n accessibility: 'إمكانية الوصول ومحركات البحث',\n altText: 'النص البديل للصورة (Alt Text)',\n altTextPlaceholder: 'صف محتوى الصورة لقارئات الشاشة ومحركات البحث...',\n saveAndClose: 'حفظ وإغلاق',\n },\n};\n","import type { UploadTranslations } from './types';\n\nexport const enTranslations: UploadTranslations = {\n uploadWindow: 'Upload window',\n tapToResume: 'Tap to resume',\n restoreUploadWindow: 'Restore upload window',\n minimize: 'Minimize',\n minimizeUploader: 'Minimize uploader',\n close: 'Close',\n editPrefix: 'Edit - {title}',\n uploadImage: 'Upload Image',\n uploadImages: 'Upload Images',\n noValidImageFiles:\n 'No valid image files found. Please select image files (JPEG, PNG, WebP, AVIF, SVG).',\n selectedImagesSkipped:\n '{imageCount} image{imageSuffix} selected. {skippedCount} non-image file{skippedSuffix} skipped.',\n queued: 'Queued...',\n retrying: 'Retrying...',\n preparingUpload: 'Preparing upload...',\n uploadFailed: 'Upload failed',\n failedCreatePreview: 'Failed to create preview',\n failedCreatePreviewFor: 'Failed to create preview for {file}',\n selectAll: 'Select All',\n deselectAll: 'Deselect All',\n removeSelected: 'Remove Selected',\n uploading: 'Uploading',\n someUploadsFailed: 'Some uploads failed.',\n retryFailedUploads: 'Retry Failed Uploads',\n needsAltBeforeSave:\n '{count} image{suffix} need{verbSuffix} alt text before saving. Click the description button on each image.',\n selectFilesAria: 'Select files',\n selectMoreFilesAria: 'Select more files',\n selectFolderAria: 'Select folder',\n dropImagesHere: 'Drop images here',\n releaseToUpload: 'Release to upload',\n dragDropOrChoose: 'Drag and drop images here, or choose an option below',\n selectFiles: 'Select Files',\n selectFolder: 'Select Folder',\n supportsFormats: 'Supports: JPEG, PNG, WebP, AVIF, SVG',\n maxPerFile: 'Max {size}MB per file',\n upToSizeMB: 'Up to {size} MB',\n dropHere: 'Drop here',\n addMore: 'Add More',\n files: 'Files',\n folder: 'Folder',\n withoutAltText: '{count} without alt text',\n saveImages: 'Save Images',\n addAltBeforeSaving:\n 'Please add alt text before saving. Click the description button on the image.',\n missingDescription: 'Missing description',\n saveImage: 'Save Image',\n downloadImage: 'Download Image',\n dragDropOrClickToUpload: 'Drag & drop or click to upload',\n browseFiles: 'Browse Files',\n image: 'Image',\n processing: 'Processing...',\n uploadImageAria: 'Upload image',\n fileInputAria: 'File input',\n uploadingAlt: 'Uploading',\n previewAlt: 'Preview',\n addImageDescription: 'Add Image Description',\n describeImagePlaceholder: 'Describe this image for accessibility...',\n characters: 'characters',\n usedForA11ySeo: 'Used for accessibility & SEO',\n cancel: 'Cancel',\n saveDescription: 'Save Description',\n selectImageAria: 'Select image',\n editAltTextAria: 'Edit alt text',\n addAltTextAria: 'Add alt text',\n addDescriptionForA11y: 'Add description for accessibility',\n adjustBlurColorAria: 'Adjust blur and color',\n adjustBlurColorTitle: 'Visualize blur data and adjust colors',\n removeImageAria: 'Remove image',\n blurModal: {\n title: 'Blur & Dominant Color Inspector',\n closeModal: 'Close inspector',\n adjustColor: 'Dominant Backdrop Color',\n clickToSample: 'Click anywhere on the image preview to sample a pixel color',\n pickColorNote:\n 'Use the picker, enter a HEX code, or sample directly from the image',\n enterHexColor: 'Enter HEX color',\n hexPlaceholder: 'F5F5F5',\n enablePenMode: 'Eyedropper Sample',\n disablePenMode: 'Exit Eyedropper',\n penModeActive: 'Sampling Active',\n resetToDetected: 'Reset to Detected',\n sampled: 'Sampled',\n livePreview: 'Live Placeholder & Image Preview',\n showingOriginal: 'Showing original image (blur placeholder not generated yet)',\n saved: 'Size Saved:',\n accessibility: 'Accessibility & SEO',\n altText: 'Image Alt Text',\n altTextPlaceholder:\n 'Describe this image for screen readers and search engines...',\n saveAndClose: 'Save & Close',\n },\n};\n","import type { UploadLocale } from '../types';\nimport { arTranslations } from './i18n/ar';\nimport { enTranslations } from './i18n/en';\nimport type {\n BlurModalTranslations,\n UploadTranslations,\n} from './i18n/types';\n\nexport { arTranslations, enTranslations };\nexport type { BlurModalTranslations, UploadTranslations };\n\nexport function normalizeUploadLocale(locale?: string): UploadLocale {\n if (locale && locale.toLowerCase().startsWith('ar')) {\n return 'ar';\n }\n if (typeof document !== 'undefined') {\n const docLang =\n document.documentElement.getAttribute('lang') ||\n document.documentElement.getAttribute('dir');\n if (!locale && (docLang === 'ar' || docLang === 'rtl')) {\n return 'ar';\n }\n }\n return 'en';\n}\n\nexport const uploadText: Record<UploadLocale, UploadTranslations> = {\n en: enTranslations,\n ar: arTranslations,\n};\n\nexport function resolveTranslations(\n locale?: UploadLocale,\n overrides?: Partial<UploadTranslations>,\n): UploadTranslations {\n const base = uploadText[normalizeUploadLocale(locale)];\n if (!overrides) return base;\n return {\n ...base,\n ...overrides,\n blurModal: {\n ...base.blurModal,\n ...(overrides.blurModal || {}),\n },\n };\n}\n","import type { ImageOutputFormat } from '../../types';\n\nexport interface SessionMetaLookup {\n url?: string | null;\n contentHash?: string | null;\n}\n\nexport interface CachedBlurMeta {\n blurDataUrl?: string;\n blurColor?: string;\n}\n\nexport interface UploadSessionCache {\n writeAltMetaFor: (info: SessionMetaLookup, alt: string) => void;\n readAltMetaFor: (info: SessionMetaLookup) => string | null;\n writeBlurMetaFor: (info: SessionMetaLookup, meta: CachedBlurMeta) => void;\n readBlurMetaFor: (info: SessionMetaLookup) => CachedBlurMeta | null;\n}\n\nexport function readSessionJson<T>(key: string): T | null {\n if (typeof window === 'undefined') return null;\n try {\n const raw = window.sessionStorage.getItem(key);\n return raw ? (JSON.parse(raw) as T) : null;\n } catch {\n return null;\n }\n}\n\nexport function writeSessionJson(key: string, value: unknown): void {\n if (typeof window === 'undefined') return;\n try {\n window.sessionStorage.setItem(key, JSON.stringify(value));\n } catch {\n // Ignore storage quota errors\n }\n}\n\nexport function createUploadSessionCache(\n storagePrefix = 'iuk',\n): UploadSessionCache {\n const altKey = (id: string) => `${storagePrefix}:alt-meta:${id}`;\n const blurKey = (id: string) => `${storagePrefix}:blur-meta:${id}`;\n\n const writeAltMetaFor = (info: SessionMetaLookup, alt: string): void => {\n if (!alt?.trim()) return;\n if (info.url) writeSessionJson(altKey(info.url), alt);\n if (info.contentHash) writeSessionJson(altKey(info.contentHash), alt);\n };\n\n const readAltMetaFor = (info: SessionMetaLookup): string | null => {\n if (info.contentHash) {\n const byHash = readSessionJson<string>(altKey(info.contentHash));\n if (byHash) return byHash;\n }\n if (info.url) {\n const byUrl = readSessionJson<string>(altKey(info.url));\n if (byUrl) return byUrl;\n }\n return null;\n };\n\n const writeBlurMetaFor = (\n info: SessionMetaLookup,\n meta: CachedBlurMeta,\n ): void => {\n if (info.url) writeSessionJson(blurKey(info.url), meta);\n if (info.contentHash) writeSessionJson(blurKey(info.contentHash), meta);\n };\n\n const readBlurMetaFor = (info: SessionMetaLookup): CachedBlurMeta | null => {\n if (info.contentHash) {\n const byHash = readSessionJson<CachedBlurMeta>(blurKey(info.contentHash));\n if (byHash?.blurDataUrl || byHash?.blurColor) return byHash;\n }\n if (info.url) {\n const byUrl = readSessionJson<CachedBlurMeta>(blurKey(info.url));\n if (byUrl?.blurDataUrl || byUrl?.blurColor) return byUrl;\n }\n return null;\n };\n\n return {\n writeAltMetaFor,\n readAltMetaFor,\n writeBlurMetaFor,\n readBlurMetaFor,\n };\n}\n\nconst MIME_TO_EXT: Record<string, ImageOutputFormat | 'jpg'> = {\n 'image/avif': 'avif',\n 'image/webp': 'webp',\n 'image/jpeg': 'jpg',\n 'image/png': 'png',\n 'image/svg+xml': 'svg',\n};\n\nexport async function downloadImageWithFallback(\n url: string,\n format?: ImageOutputFormat,\n): Promise<void> {\n if (!url || typeof window === 'undefined') return;\n try {\n const sep = url.includes('?') ? '&' : '?';\n const fetchUrl = `${url}${sep}t=${Date.now()}`;\n const res = await fetch(fetchUrl, { cache: 'no-store' });\n const blob = await res.blob();\n const objectUrl = URL.createObjectURL(blob);\n\n const ext: ImageOutputFormat | 'jpg' =\n format ?? MIME_TO_EXT[blob.type] ?? 'avif';\n\n const anchor = document.createElement('a');\n anchor.href = objectUrl;\n anchor.download = `image-${Date.now()}.${ext}`;\n anchor.click();\n URL.revokeObjectURL(objectUrl);\n } catch {\n window.open(url, '_blank', 'noopener,noreferrer');\n }\n}\n","import { useCallback } from 'react';\n\nexport function useFilePreview() {\n const createPreview = useCallback((file: File): Promise<string> => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n resolve(reader.result as string);\n };\n reader.onerror = () => {\n reject(new Error('Failed to read file'));\n };\n reader.readAsDataURL(file);\n });\n }, []);\n\n return { createPreview };\n}\n","import type { QualityLevel, UploadLocale } from '../types';\nimport { QUALITY_PRESETS } from '../types';\n\nexport function formatFileSize(bytes: number): string {\n if (bytes <= 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.min(\n sizes.length - 1,\n Math.floor(Math.log(bytes) / Math.log(k)),\n );\n return `${Math.round((bytes / Math.pow(k, i)) * 100) / 100} ${sizes[i]}`;\n}\n\nexport function calculateReduction(\n original: number,\n optimized: number,\n): number {\n if (original <= 0) return 0;\n return Math.round(((original - optimized) / original) * 100);\n}\n\nexport function estimateOutputSize(\n originalBytes: number,\n level: QualityLevel,\n): number {\n return Math.round(originalBytes * QUALITY_PRESETS[level].compressionRatio);\n}\n\nconst creativeMessages = [\n 'Sprinkling digital magic ✨',\n 'Painting pixels with perfection 🎨',\n 'Launching to the cloud 🚀',\n 'Creating something beautiful ⭐',\n 'Transforming your vision ⚡',\n 'Weaving visual excellence 💫',\n 'Crafting your masterpiece 🎭',\n 'Working our magic 🔮',\n 'Making it pixel-perfect ✨',\n 'Keep calm, creating magic 🎪',\n 'Hitting the sweet spot 🎯',\n 'Artist mode activated 🎨',\n 'Shooting for the stars 🌠',\n 'Compressing with love 💝',\n 'Enhancing quality 💎',\n 'Polishing to perfection ✨',\n];\n\nconst creativeMessagesAr = [\n 'نضيف لمسة رقمية ساحرة ✨',\n 'ننسق البكسلات بإتقان 🎨',\n 'الرفع جارٍ إلى السحابة 🚀',\n 'نصنع شيئاً جميلاً ⭐',\n 'نحوّل رؤيتك إلى واقع ⚡',\n 'نبني تجربة بصرية مميزة 💫',\n 'نصقل عملك باحتراف 🎭',\n 'السحر جارٍ الآن 🔮',\n 'نضبط كل بكسل بعناية ✨',\n 'اهدأ، نحن نهتم بالتفاصيل 🎪',\n 'نقترب من النتيجة المثالية 🎯',\n 'وضع الإبداع مفعل 🎨',\n 'نستهدف أفضل نتيجة 🌠',\n 'ضغط ذكي مع الحفاظ على الجودة 💝',\n 'تحسين الجودة مستمر 💎',\n 'اللمسات الأخيرة قيد التنفيذ ✨',\n];\n\nlet lastMessageIndex = -1;\n\nexport function getStatusMessage(\n progress: number,\n locale: UploadLocale = 'en',\n): string {\n const list = locale === 'ar' ? creativeMessagesAr : creativeMessages;\n const clampedProgress = Math.max(0, Math.min(99, progress));\n const messageIndex = Math.floor((clampedProgress / 100) * list.length);\n\n const useRandom = Math.random() > 0.7;\n let selectedIndex = useRandom\n ? Math.floor(Math.random() * list.length)\n : messageIndex;\n\n if (selectedIndex === lastMessageIndex && list.length > 1) {\n selectedIndex = (selectedIndex + 1) % list.length;\n }\n\n lastMessageIndex = selectedIndex;\n\n if (progress >= 95) {\n return locale === 'ar' ? '🎉 اقتربنا جداً...' : '🎉 Almost there...';\n }\n if (progress >= 85) {\n return locale === 'ar'\n ? '✨ نضع اللمسات الأخيرة...'\n : '✨ Polishing the final details...';\n }\n\n return list[selectedIndex];\n}\n\nexport function createSuccessMessage(\n originalSize: number,\n optimizedSize: number,\n compact: boolean = false,\n locale: UploadLocale = 'en',\n): string {\n const reduction = calculateReduction(originalSize, optimizedSize);\n const original = formatFileSize(originalSize);\n const optimized = formatFileSize(optimizedSize);\n\n if (compact) {\n if (reduction > 50) {\n return locale === 'ar'\n ? `🎉 أصغر بنسبة ${reduction}%! (${original} → ${optimized})`\n : `🎉 ${reduction}% smaller! (${original} → ${optimized})`;\n }\n if (reduction > 0) {\n return locale === 'ar'\n ? `✓ أصغر بنسبة ${reduction}% (${original} → ${optimized})`\n : `✓ ${reduction}% smaller (${original} → ${optimized})`;\n }\n return `✓ ${optimized}`;\n }\n\n if (reduction > 70) {\n return locale === 'ar'\n ? `🎉 رائع! تم تقليل الحجم بنسبة ${reduction}% (${original} → ${optimized})`\n : `🎉 Amazing! Reduced by ${reduction}% (${original} → ${optimized})`;\n }\n if (reduction > 50) {\n return locale === 'ar'\n ? `✨ ممتاز! تم تقليل الحجم بنسبة ${reduction}% (${original} → ${optimized})`\n : `✨ Great! Reduced by ${reduction}% (${original} → ${optimized})`;\n }\n if (reduction > 20) {\n return locale === 'ar'\n ? `✓ اكتمل الرفع! تم تقليل الحجم بنسبة ${reduction}% (${original} → ${optimized})`\n : `✓ Upload complete! Reduced by ${reduction}% (${original} → ${optimized})`;\n }\n return locale === 'ar'\n ? `✓ اكتمل الرفع! (${original} → ${optimized})`\n : `✓ Upload complete! (${original} → ${optimized})`;\n}\n\nexport function getFriendlyErrorMessage(\n error: string,\n locale: UploadLocale = 'en',\n): string {\n const lower = error.toLowerCase();\n if (lower.includes('size') || lower.includes('large') || lower.includes('exceeds')) {\n return locale === 'ar'\n ? 'الملف كبير جداً. يرجى اختيار صورة أصغر.'\n : 'File is too large. Please choose a smaller image.';\n }\n if (lower.includes('type') || lower.includes('format')) {\n return locale === 'ar'\n ? 'نوع الملف غير صالح. يرجى رفع صورة صالحة (JPEG, PNG, WebP, AVIF, SVG).'\n : 'Invalid file type. Please upload a valid image (JPEG, PNG, WebP, AVIF, SVG).';\n }\n if (lower.includes('network') || lower.includes('fetch')) {\n return locale === 'ar'\n ? 'حدث خطأ في الشبكة. يرجى التحقق من الاتصال والمحاولة مرة أخرى.'\n : 'Network error. Please check your connection and try again.';\n }\n if (lower.includes('timeout') || lower.includes('timed out')) {\n return locale === 'ar'\n ? 'انتهت مهلة الرفع. يرجى المحاولة مرة أخرى.'\n : 'Upload timed out. Please try again.';\n }\n if (error) return error;\n return locale === 'ar'\n ? 'فشل الرفع. يرجى المحاولة مرة أخرى.'\n : 'Upload failed. Please try again.';\n}\n","import type {\n ExplicitOutputFormat,\n ImageDimensions,\n UploadedImageData,\n} from '../../types';\n\nexport interface XhrUploadOptions {\n headers?: Record<string, string>;\n withCredentials?: boolean;\n fallbackErrorLabel?: string;\n onUploadProgress?: (percent: number) => void;\n}\n\nexport interface UploadFormFields {\n preset?: string;\n folder?: string;\n bucket?: string;\n altText?: string;\n customFilename?: string;\n outputFormat?: ExplicitOutputFormat;\n quality?: number;\n maxDimensions?: ImageDimensions;\n metadata?: Record<string, string>;\n}\n\nexport function parseErrorPayload(\n status: number,\n rawBody: string,\n fallbackLabel = 'Upload failed',\n): string {\n const statusInfo = `status ${status}`;\n let parsed: Record<string, unknown> | undefined;\n try {\n const json = JSON.parse(rawBody);\n if (json && typeof json === 'object') {\n parsed = json as Record<string, unknown>;\n }\n } catch {\n parsed = undefined;\n }\n\n const candidateKeys = ['error', 'message', 'detail', 'details'] as const;\n if (parsed) {\n for (const key of candidateKeys) {\n const val = parsed[key];\n if (typeof val === 'string' && val.trim()) {\n return `${val.trim()} (${statusInfo})`;\n }\n }\n }\n\n if (rawBody && rawBody.trim()) {\n return `${rawBody.trim()} (${statusInfo})`;\n }\n\n return `${fallbackLabel} (${statusInfo})`;\n}\n\nexport function buildUploadFormData(\n file: File | Blob,\n fields: UploadFormFields = {},\n): FormData {\n const {\n preset,\n folder,\n bucket,\n altText,\n customFilename,\n outputFormat,\n quality,\n maxDimensions,\n metadata,\n } = fields;\n\n const formData = new FormData();\n formData.append('file', file);\n if (preset) formData.append('preset', preset);\n if (folder) formData.append('folder', folder);\n if (bucket) formData.append('bucket', bucket);\n if (altText) formData.append('altText', altText);\n if (customFilename) formData.append('customFilename', customFilename);\n if (outputFormat) formData.append('outputFormat', outputFormat);\n if (quality !== undefined) formData.append('quality', String(quality));\n if (maxDimensions) {\n formData.append('maxWidth', String(maxDimensions.width));\n formData.append('maxHeight', String(maxDimensions.height));\n }\n if (metadata && Object.keys(metadata).length > 0) {\n formData.append('metadata', JSON.stringify(metadata));\n }\n\n return formData;\n}\n\nexport function uploadViaXhr(\n endpoint: string,\n formData: FormData,\n options: XhrUploadOptions = {},\n): Promise<UploadedImageData> {\n const fallbackLabel = options.fallbackErrorLabel || 'Upload failed';\n\n if (typeof XMLHttpRequest === 'undefined') {\n return fetch(endpoint, {\n method: 'POST',\n body: formData,\n headers: options.headers,\n credentials: options.withCredentials ? 'include' : 'same-origin',\n }).then(async (res) => {\n const text = await res.text();\n if (!res.ok) {\n throw new Error(parseErrorPayload(res.status, text, fallbackLabel));\n }\n return JSON.parse(text) as UploadedImageData;\n });\n }\n\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('POST', endpoint, true);\n xhr.withCredentials = Boolean(options.withCredentials);\n\n if (options.headers) {\n for (const [key, value] of Object.entries(options.headers)) {\n xhr.setRequestHeader(key, value);\n }\n }\n\n xhr.upload.onprogress = (event) => {\n if (event.lengthComputable && event.total > 0) {\n const pct = Math.min(\n 85,\n Math.round((event.loaded / event.total) * 85),\n );\n options.onUploadProgress?.(pct);\n }\n };\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const parsed = JSON.parse(xhr.responseText) as UploadedImageData;\n resolve(parsed);\n } catch {\n reject(new Error('Invalid JSON response from upload endpoint'));\n }\n } else {\n reject(\n new Error(\n parseErrorPayload(xhr.status, xhr.responseText, fallbackLabel),\n ),\n );\n }\n };\n\n xhr.onerror = () => {\n reject(new Error('Network error during image upload'));\n };\n\n xhr.send(formData);\n });\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type {\n ExplicitOutputFormat,\n ImageDimensions,\n UploadedImageData,\n UploadLocale,\n} from '../../types';\nimport {\n createSuccessMessage,\n getStatusMessage,\n} from '../../utils/formatters';\nimport { useImageUploadContext } from '../context';\nimport { normalizeUploadLocale, resolveTranslations } from '../i18n';\nimport type { CustomUploaderFn } from '../types';\nimport { buildUploadFormData, uploadViaXhr } from './xhrUpload';\n\nexport interface UseImageUploadOptions {\n preset?: string;\n folder?: string;\n bucket?: string;\n metadata?: Record<string, string>;\n altText?: string;\n outputFormat?: ExplicitOutputFormat;\n /** 1–100. When omitted, the server picks the preset or format default. */\n quality?: number;\n maxDimensions?: ImageDimensions;\n customFilename?: string;\n endpoint?: string;\n uploader?: CustomUploaderFn;\n headers?: Record<string, string>;\n withCredentials?: boolean;\n locale?: UploadLocale;\n onSuccess?: (data: UploadedImageData, file?: File) => void;\n onError?: (error: string, file?: File) => void;\n onProgress?: (progress: number, message: string, file?: File) => void;\n}\n\nexport function useImageUpload({\n preset,\n folder,\n bucket,\n metadata,\n altText,\n outputFormat,\n quality,\n maxDimensions,\n customFilename: defaultCustomFilename,\n endpoint: propEndpoint,\n uploader: propUploader,\n headers: propHeaders,\n withCredentials: propWithCredentials,\n locale: propLocale,\n onSuccess,\n onError,\n onProgress,\n}: UseImageUploadOptions = {}) {\n const ctx = useImageUploadContext();\n const uploadLocale = normalizeUploadLocale(propLocale || ctx.locale);\n const ui = resolveTranslations(uploadLocale, ctx.translations);\n\n const resolvedEndpoint = propEndpoint || ctx.endpoint || '/api/upload';\n const resolvedUploader = propUploader || ctx.uploader;\n const resolvedHeaders = propHeaders || ctx.headers;\n const resolvedCredentials = propWithCredentials ?? ctx.withCredentials;\n\n const [isUploading, setIsUploading] = useState(false);\n const [progress, setProgress] = useState(0);\n const [uploadMessage, setUploadMessage] = useState('');\n\n const isMountedRef = useRef(true);\n const timeoutsRef = useRef<Set<ReturnType<typeof setTimeout>>>(new Set());\n const activeIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const clearProgressInterval = useCallback(() => {\n if (activeIntervalRef.current) {\n clearInterval(activeIntervalRef.current);\n activeIntervalRef.current = null;\n }\n }, []);\n\n const clearAllTimeouts = useCallback(() => {\n timeoutsRef.current.forEach((t) => clearTimeout(t));\n timeoutsRef.current.clear();\n }, []);\n\n const safeSetTimeout = useCallback((fn: () => void, ms: number) => {\n const handle = setTimeout(() => {\n timeoutsRef.current.delete(handle);\n if (isMountedRef.current) {\n fn();\n }\n }, ms);\n timeoutsRef.current.add(handle);\n return handle;\n }, []);\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n clearProgressInterval();\n clearAllTimeouts();\n };\n }, [clearProgressInterval, clearAllTimeouts]);\n\n const uploadImage = useCallback(\n async (\n file: File,\n customAltText?: string,\n overrideCustomFilename?: string,\n ): Promise<UploadedImageData | null> => {\n clearProgressInterval();\n clearAllTimeouts();\n\n const originalSize = file.size;\n setIsUploading(true);\n setProgress(0);\n setUploadMessage(ui.preparingUpload);\n onProgress?.(0, ui.preparingUpload, file);\n\n const reportProgress = (nextPct: number) => {\n if (!isMountedRef.current) return;\n setProgress((prev) => {\n const clamped = Math.max(prev, Math.min(94, nextPct));\n const msg = getStatusMessage(clamped, uploadLocale);\n setUploadMessage(msg);\n onProgress?.(clamped, msg, file);\n return clamped;\n });\n };\n\n try {\n activeIntervalRef.current = setInterval(() => {\n if (!isMountedRef.current) {\n clearProgressInterval();\n return;\n }\n setProgress((prev) => {\n const nextProgress = Math.min(prev + 6, 92);\n const msg = getStatusMessage(nextProgress, uploadLocale);\n setUploadMessage(msg);\n onProgress?.(nextProgress, msg, file);\n return nextProgress;\n });\n }, 300);\n\n const finalAlt = customAltText || altText || undefined;\n const finalCustomFilename =\n overrideCustomFilename || defaultCustomFilename || undefined;\n\n const requestFields = {\n preset,\n folder,\n bucket,\n altText: finalAlt,\n customFilename: finalCustomFilename,\n outputFormat,\n quality,\n maxDimensions,\n metadata,\n };\n\n const data = resolvedUploader\n ? await resolvedUploader(file, {\n ...requestFields,\n onUploadProgress: reportProgress,\n })\n : await uploadViaXhr(\n resolvedEndpoint,\n buildUploadFormData(file, requestFields),\n {\n headers: resolvedHeaders,\n withCredentials: resolvedCredentials,\n fallbackErrorLabel: ui.uploadFailed,\n onUploadProgress: reportProgress,\n },\n );\n\n clearProgressInterval();\n if (!isMountedRef.current) return data;\n\n setProgress(100);\n const successMsg = createSuccessMessage(\n originalSize,\n data.size,\n false,\n uploadLocale,\n );\n setUploadMessage(successMsg);\n onProgress?.(100, successMsg, file);\n\n safeSetTimeout(() => {\n setUploadMessage('');\n }, 5000);\n\n onSuccess?.(data, file);\n return data;\n } catch (err) {\n clearProgressInterval();\n if (!isMountedRef.current) return null;\n const errorMsg = err instanceof Error ? err.message : ui.uploadFailed;\n setUploadMessage('');\n onError?.(errorMsg, file);\n return null;\n } finally {\n clearProgressInterval();\n if (isMountedRef.current) {\n setIsUploading(false);\n safeSetTimeout(() => {\n setProgress(0);\n }, 1000);\n }\n }\n },\n [\n preset,\n folder,\n bucket,\n metadata,\n altText,\n outputFormat,\n quality,\n maxDimensions,\n defaultCustomFilename,\n resolvedEndpoint,\n resolvedUploader,\n resolvedHeaders,\n resolvedCredentials,\n uploadLocale,\n ui.preparingUpload,\n ui.uploadFailed,\n onSuccess,\n onError,\n onProgress,\n clearProgressInterval,\n clearAllTimeouts,\n safeSetTimeout,\n ],\n );\n\n const reset = useCallback(() => {\n clearProgressInterval();\n clearAllTimeouts();\n setIsUploading(false);\n setProgress(0);\n setUploadMessage('');\n }, [clearProgressInterval, clearAllTimeouts]);\n\n return {\n uploadImage,\n isUploading,\n progress,\n uploadMessage,\n reset,\n };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { QualityLevel, StandardPresetName, UploadedImageData, UploadPresetConfig, UploadPresetName } from '../../types';\nimport { QUALITY_PRESETS, STANDARD_PRESETS } from '../../types';\nimport { DEFAULT_BLUR_COLOR, normalizeColorInput } from '../../utils/color';\nimport { validateImageFile } from '../../utils/validators';\nimport { useImageUploadContext } from '../context';\nimport { normalizeUploadLocale, resolveTranslations } from '../i18n';\nimport type { SingleImageUploadProps } from '../types';\nimport { createUploadSessionCache, downloadImageWithFallback } from '../utils/sessionMetaCache';\nimport { useFilePreview } from './useFilePreview';\nimport { useImageUpload } from './useImageUpload';\n\nfunction resolveInitialQualityLevel(quality?: number, preset?: UploadPresetConfig): QualityLevel {\n const q = quality ?? preset?.quality;\n if (!q) return preset?.recommendedQualityLevel || 'high';\n if (q <= 55) return 'low';\n if (q <= 78) return 'medium';\n return q <= 90 ? 'high' : 'maximum';\n}\n\nexport function useSingleImageState<TPreset extends string = UploadPresetName>(\n props: SingleImageUploadProps<TPreset>,\n) {\n const {\n value, onChange, preset, folder, bucket, metadata, endpoint, uploader,\n headers, withCredentials, locale: propLocale, translations,\n initialAltText: propInitialAltText, maxSizeMB: propMaxSizeMB,\n maxDimensions, requireAltText: propRequireAltText, isOpen, onClose,\n outputFormat, quality: initialQualityProp, customFilename,\n } = props;\n\n const ctx = useImageUploadContext();\n const locale = normalizeUploadLocale(propLocale || ctx.locale);\n const ui = resolveTranslations(locale, translations || ctx.translations);\n const requireAltText = propRequireAltText ?? ctx.requireAltText;\n const standardPreset = preset ? STANDARD_PRESETS[preset as StandardPresetName] : undefined;\n const maxSizeMB = propMaxSizeMB ?? standardPreset?.maxSizeMB ?? 10;\n const requiresManualCommit = Boolean(isOpen);\n const cache = useMemo(() => createUploadSessionCache(ctx.storageKeyPrefix || 'iuk'), [ctx.storageKeyPrefix]);\n\n const objVal = typeof value === 'object' && value ? value : null;\n const initPreview = typeof value === 'string' ? value : objVal?.url || null;\n const initAlt = objVal?.altText || propInitialAltText || '';\n const initColor = objVal?.blurColor || DEFAULT_BLUR_COLOR;\n\n const [preview, setPreview] = useState<string | null>(initPreview);\n const [altText, setAltText] = useState<string>(initAlt);\n const [blurColor, setBlurColor] = useState<string>(initColor);\n const [detectedBlurColor, setDetectedBlurColor] = useState<string>(initColor);\n const [blurDataUrlState, setBlurDataUrlState] = useState<string>(objVal?.blurDataUrl || '');\n const [hasColorOverride, setHasColorOverride] = useState(false);\n const [validationError, setValidationError] = useState<string>('');\n const [showMissingAltWarning, setShowMissingAltWarning] = useState(false);\n const [editingAltText, setEditingAltText] = useState(false);\n const [sizeInfo, setSizeInfo] = useState<{ original: number; optimized: number } | null>(null);\n const [uploadedData, setUploadedData] = useState<UploadedImageData | null>(objVal && 'url' in objVal ? objVal : null);\n const [isBlurModalOpen, setIsBlurModalOpen] = useState(false);\n const [selectedFile, setSelectedFile] = useState<File | null>(null);\n const [qualityLevel, setQualityLevel] = useState<QualityLevel>(() => resolveInitialQualityLevel(initialQualityProp, standardPreset));\n const fileInputRef = useRef<HTMLInputElement>(null);\n const lastAltRef = useRef<string>(initAlt);\n\n const resetColorAndErrorState = () => {\n setValidationError('');\n setHasColorOverride(false);\n setBlurColor(DEFAULT_BLUR_COLOR);\n setDetectedBlurColor(DEFAULT_BLUR_COLOR);\n setIsBlurModalOpen(false);\n };\n\n const { createPreview } = useFilePreview();\n const { uploadImage, isUploading, progress, uploadMessage, reset } = useImageUpload({\n preset, folder, bucket, metadata, outputFormat, maxDimensions, customFilename,\n quality: QUALITY_PRESETS[qualityLevel].value,\n endpoint, uploader, headers, withCredentials, locale,\n onSuccess: (data) => {\n const nextPreviewUrl = /^(?:blob:|data:)/i.test(data.url)\n ? data.url\n : `${data.url}${data.url.includes('?') ? '&' : '?'}t=${Date.now()}`;\n setPreview(nextPreviewUrl);\n setSizeInfo({ original: data.originalSize || 0, optimized: data.size });\n const normColor = data.blurColor || DEFAULT_BLUR_COLOR;\n setBlurColor(normColor);\n setDetectedBlurColor(normColor);\n setHasColorOverride(false);\n setBlurDataUrlState(data.blurDataUrl || '');\n const keyInfo = { url: data.url, contentHash: data.contentHash };\n cache.writeBlurMetaFor(keyInfo, { blurDataUrl: data.blurDataUrl || '', blurColor: normColor });\n const payload: UploadedImageData = { ...data, altText, blurColor: normColor };\n setUploadedData(payload);\n lastAltRef.current = altText;\n cache.writeAltMetaFor(keyInfo, altText);\n if (!requiresManualCommit) onChange(payload);\n },\n onError: (errorMsg) => {\n setValidationError(errorMsg);\n setPreview(null);\n setUploadedData(null);\n },\n });\n\n useEffect(() => {\n const incomingObj = typeof value === 'object' && value ? value : null;\n const nextPreview = typeof value === 'string' ? value : incomingObj?.url || null;\n const rawAlt = incomingObj?.altText || propInitialAltText || '';\n const cachedAlt = cache.readAltMetaFor({ url: incomingObj ? incomingObj.url : nextPreview, contentHash: incomingObj?.contentHash ?? null });\n const nextAlt =\n rawAlt.trim() === '' && nextPreview === preview && (lastAltRef.current.trim() !== '' || cachedAlt?.trim())\n ? lastAltRef.current.trim() || cachedAlt || rawAlt\n : rawAlt;\n const nextColor = incomingObj?.blurColor || DEFAULT_BLUR_COLOR;\n\n const stripCacheQuery = (u: string | null) =>\n u && !/^(?:blob:|data:)/i.test(u) ? u.split('?')[0] : u;\n if (stripCacheQuery(nextPreview) !== stripCacheQuery(preview)) setPreview(nextPreview);\n if (nextAlt !== altText && (nextPreview !== preview || nextAlt.trim() !== '' || !altText.trim())) setAltText(nextAlt);\n\n const nextIsFallback = nextColor === DEFAULT_BLUR_COLOR;\n if (nextColor !== blurColor && (nextPreview !== preview || (!hasColorOverride && (!nextIsFallback || blurColor === DEFAULT_BLUR_COLOR)))) {\n setBlurColor(nextColor);\n setDetectedBlurColor(nextColor);\n setHasColorOverride(false);\n }\n const nextBlurUrl = incomingObj?.blurDataUrl || '';\n if (nextPreview !== preview || (nextBlurUrl && nextBlurUrl !== blurDataUrlState)) {\n setBlurDataUrlState(nextBlurUrl);\n }\n\n if (nextPreview) {\n const cached = cache.readBlurMetaFor({\n url: nextPreview,\n contentHash: incomingObj?.contentHash || uploadedData?.contentHash,\n });\n if (cached?.blurDataUrl && !nextBlurUrl) setBlurDataUrlState(cached.blurDataUrl);\n if (cached?.blurColor && nextIsFallback && blurColor === DEFAULT_BLUR_COLOR) {\n setBlurColor(cached.blurColor);\n setDetectedBlurColor(cached.blurColor);\n }\n }\n\n if (!value) {\n setUploadedData(null);\n setBlurDataUrlState('');\n setSizeInfo(null);\n setSelectedFile(null);\n if (fileInputRef.current) fileInputRef.current.value = '';\n } else if (incomingObj?.url) {\n setUploadedData((prev) => (prev?.url === incomingObj.url ? prev : incomingObj));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, propInitialAltText]);\n\n const buildExistingImagePayload = (overrides: Partial<UploadedImageData> = {}): UploadedImageData | null => {\n const base: UploadedImageData | null = uploadedData\n ? { ...uploadedData }\n : objVal\n ? { ...objVal }\n : typeof value === 'string' && value.trim()\n ? { url: value, blurDataUrl: '', blurColor: DEFAULT_BLUR_COLOR, altText: '', width: 0, height: 0, format: 'webp', size: 0, contentHash: 'existing-image', uploadedAt: new Date().toISOString() }\n : null;\n if (!base) return null;\n return {\n ...base,\n ...overrides,\n url: (overrides.url ?? base.url) || preview || '',\n altText: overrides.altText ?? altText ?? base.altText ?? '',\n blurColor: overrides.blurColor ?? blurColor ?? base.blurColor ?? DEFAULT_BLUR_COLOR,\n blurDataUrl: overrides.blurDataUrl ?? base.blurDataUrl ?? blurDataUrlState ?? '',\n };\n };\n\n const commitIfAuto = (overrides: Partial<UploadedImageData>) => {\n if (!requiresManualCommit) {\n const payload = buildExistingImagePayload(overrides);\n if (payload) onChange(payload);\n }\n };\n\n const applyBlurColor = (color: string, options: { markOverride?: boolean } = {}) => {\n const normalized = normalizeColorInput(color);\n if (!normalized) return;\n setBlurColor(normalized);\n setHasColorOverride(options.markOverride !== false);\n setUploadedData((prev) => (prev ? { ...prev, blurColor: normalized } : prev));\n if (preview) cache.writeBlurMetaFor({ url: preview, contentHash: uploadedData?.contentHash }, { blurDataUrl: blurDataUrlState, blurColor: normalized });\n commitIfAuto({ blurColor: normalized });\n };\n\n const handleResetColor = () => {\n if (detectedBlurColor) applyBlurColor(detectedBlurColor, { markOverride: false });\n };\n\n const handleFileSelect = async (files: FileList) => {\n const file = files[0];\n if (!file) return;\n setSelectedFile(file);\n resetColorAndErrorState();\n const err = validateImageFile(file, maxSizeMB, locale);\n if (err) {\n setValidationError(err);\n return;\n }\n try {\n setPreview(await createPreview(file));\n setAltText('');\n lastAltRef.current = '';\n } catch {\n setValidationError(ui.failedCreatePreview);\n return;\n }\n await uploadImage(file, altText);\n };\n\n const handleRemoveTile = () => {\n setPreview(null);\n setAltText('');\n setBlurDataUrlState('');\n setSizeInfo(null);\n setUploadedData(null);\n setSelectedFile(null);\n resetColorAndErrorState();\n reset();\n if (fileInputRef.current) fileInputRef.current.value = '';\n if (!requiresManualCommit) onChange(null);\n };\n\n const handleAltTextSave = (newAltText: string) => {\n setAltText(newAltText);\n lastAltRef.current = newAltText;\n if (preview) cache.writeAltMetaFor({ url: preview, contentHash: uploadedData?.contentHash }, newAltText);\n setShowMissingAltWarning(false);\n setEditingAltText(false);\n commitIfAuto({ altText: newAltText });\n };\n\n const handleSaveImage = () => {\n if (requireAltText && preview && !altText?.trim()) {\n setShowMissingAltWarning(true);\n setValidationError(ui.addAltBeforeSaving);\n return;\n }\n setShowMissingAltWarning(false);\n setValidationError('');\n const payload = buildExistingImagePayload();\n if (payload) {\n lastAltRef.current = payload.altText || lastAltRef.current;\n cache.writeAltMetaFor({ url: payload.url, contentHash: payload.contentHash }, payload.altText || '');\n onChange(payload);\n }\n onClose?.();\n };\n\n const downloadUrl = uploadedData?.url ?? (typeof value === 'string' ? value : objVal?.url) ?? null;\n const handleDownload = useCallback(async () => {\n if (downloadUrl) await downloadImageWithFallback(downloadUrl, uploadedData?.format);\n }, [downloadUrl, uploadedData?.format]);\n\n return {\n locale, ui, requireAltText, maxSizeMB, fileInputRef,\n preview, altText, blurColor, detectedBlurColor, blurDataUrlState,\n validationError, showMissingAltWarning, editingAltText, setEditingAltText,\n sizeInfo, uploadedData, isBlurModalOpen, setIsBlurModalOpen,\n selectedFile, qualityLevel, setQualityLevel, isUploading, progress, uploadMessage,\n currentImageData: uploadedData ?? objVal, canDownload: Boolean(downloadUrl),\n applyBlurColor, handleResetColor, handleFileSelect, handleRemoveTile,\n handleAltTextSave, handleSaveImage, handleDownload,\n };\n}\n","import type { CSSProperties } from 'react';\nimport type { UploadVisualState } from '../styling';\n\n/**\n * Inline style applied to `<input type=\"file\">` when `unstyled` mode is active\n * so hidden file inputs remain invisible even when `image-upload-kit/styles.css` is not imported.\n */\nexport const HIDDEN_INPUT_STYLE: CSSProperties = {\n position: 'absolute',\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: 'hidden',\n clip: 'rect(0, 0, 0, 0)',\n whiteSpace: 'nowrap',\n border: 0,\n};\n\n/**\n * Joins truthy CSS class names cleanly.\n */\nexport function cx(\n ...classes: Array<string | false | null | undefined>\n): string {\n return classes.filter(Boolean).join(' ');\n}\n\n/**\n * Resolves a component slot's final `className`:\n * - When `unstyled` is `false` (default): includes `defaultClass` followed by provider & prop overrides.\n * - When `unstyled` is `true`: strips `defaultClass` (`iuk-*`) and applies only user-supplied classes.\n */\nexport function resolveSlotClass(\n defaultClass: string | undefined,\n unstyled: boolean | undefined,\n ...customClasses: Array<string | false | null | undefined>\n): string | undefined {\n const merged = unstyled\n ? cx(...customClasses)\n : cx(defaultClass, ...customClasses);\n return merged || undefined;\n}\n\n/**\n * Merges multiple optional inline `CSSProperties` objects for a slot.\n */\nexport function resolveSlotStyle(\n ...styles: Array<CSSProperties | undefined>\n): CSSProperties | undefined {\n let result: CSSProperties | undefined;\n for (const style of styles) {\n if (style) {\n result = result ? { ...result, ...style } : { ...style };\n }\n }\n return result;\n}\n\n/**\n * Computes a deterministic semantic state string for `data-state=\"...\"` styling\n * (e.g. Tailwind `data-[state=dragging]:border-indigo-500` or CSS `[data-state=\"uploading\"]`).\n */\nexport function resolveUploadDataState(flags: {\n disabled?: boolean;\n hasError?: boolean;\n isUploading?: boolean;\n isDragging?: boolean;\n hasContent?: boolean;\n}): UploadVisualState {\n if (flags.disabled) return 'disabled';\n if (flags.isDragging) return 'dragging';\n if (flags.isUploading) return 'uploading';\n if (flags.hasError) return 'error';\n if (flags.hasContent) return 'ready';\n return 'idle';\n}\n","import type { HTMLAttributes, InputHTMLAttributes } from 'react';\nimport type { UploadPresetName } from '../../types';\nimport { useDragAndDrop } from '../hooks/useDragAndDrop';\nimport { useSingleImageState } from '../hooks/useSingleImageState';\nimport { HIDDEN_INPUT_STYLE, resolveUploadDataState } from '../utils/slotStyles';\nimport type {\n HeadlessDropzoneProps,\n HeadlessFileInputProps,\n SingleUploadController,\n UseSingleUploadOptions,\n} from './types';\n\nconst DEFAULT_ACCEPT = 'image/jpeg,image/png,image/webp,image/avif,image/svg+xml';\n\nexport function useSingleUpload<TPreset extends string = UploadPresetName>(\n options: UseSingleUploadOptions<TPreset>,\n): SingleUploadController {\n const { accept = DEFAULT_ACCEPT, disabled = false, error: externalError } = options;\n\n const {\n locale, ui, maxSizeMB, fileInputRef, preview, altText, blurColor,\n detectedBlurColor, blurDataUrlState, validationError, sizeInfo,\n uploadedData, qualityLevel, setQualityLevel, isUploading, progress,\n uploadMessage, currentImageData, canDownload, applyBlurColor,\n handleResetColor, handleFileSelect, handleRemoveTile,\n handleAltTextSave, handleSaveImage, handleDownload,\n } = useSingleImageState(options);\n\n const { isDragging, dragHandlers } = useDragAndDrop({\n disabled,\n onDrop: (files) => { void handleFileSelect(files); },\n });\n\n const displayError = externalError || validationError || '';\n const blurDataUrl = blurDataUrlState || currentImageData?.blurDataUrl || '';\n\n const state = resolveUploadDataState({\n disabled,\n hasError: Boolean(displayError),\n isUploading,\n isDragging,\n hasContent: Boolean(preview),\n });\n\n const openFileDialog = () => {\n if (!disabled) fileInputRef.current?.click();\n };\n\n const getDropzoneProps = (\n overrides?: HTMLAttributes<HTMLElement>,\n ): HeadlessDropzoneProps => ({\n ...overrides,\n role: overrides?.role ?? 'button',\n tabIndex: overrides?.tabIndex ?? (disabled ? -1 : 0),\n 'aria-label': overrides?.['aria-label'] ?? ui.uploadImageAria,\n 'aria-disabled': disabled || undefined,\n 'data-state': state,\n 'data-dragging': isDragging || undefined,\n 'data-uploading': isUploading || undefined,\n 'data-disabled': disabled || undefined,\n 'data-error': Boolean(displayError) || undefined,\n onClick: (event) => {\n if (event.target === fileInputRef.current) return;\n overrides?.onClick?.(event);\n if (!event.defaultPrevented && !disabled) openFileDialog();\n },\n onKeyDown: (event) => {\n overrides?.onKeyDown?.(event);\n if (\n !event.defaultPrevented &&\n !disabled &&\n event.target === event.currentTarget &&\n (event.key === 'Enter' || event.key === ' ')\n ) {\n event.preventDefault();\n openFileDialog();\n }\n },\n onDragEnter: (event) => { overrides?.onDragEnter?.(event); dragHandlers.onDragEnter(event); },\n onDragLeave: (event) => { overrides?.onDragLeave?.(event); dragHandlers.onDragLeave(event); },\n onDragOver: (event) => { overrides?.onDragOver?.(event); dragHandlers.onDragOver(event); },\n onDrop: (event) => { overrides?.onDrop?.(event); dragHandlers.onDrop(event); },\n });\n\n const getInputProps = (\n overrides?: InputHTMLAttributes<HTMLInputElement>,\n ): HeadlessFileInputProps => ({\n ...overrides,\n ref: fileInputRef,\n type: 'file',\n accept: overrides?.accept ?? accept,\n disabled: overrides?.disabled ?? disabled,\n 'aria-label': overrides?.['aria-label'] ?? ui.fileInputAria,\n style: overrides?.style ? { ...HIDDEN_INPUT_STYLE, ...overrides.style } : HIDDEN_INPUT_STYLE,\n onClick: (event) => {\n overrides?.onClick?.(event);\n event.stopPropagation();\n },\n onChange: (event) => {\n overrides?.onChange?.(event);\n if (!event.defaultPrevented) {\n const files = event.target.files;\n if (files && files.length > 0) void handleFileSelect(files);\n event.target.value = '';\n }\n },\n });\n\n return {\n state, preview, uploadedData, altText, blurColor, detectedBlurColor,\n blurDataUrl, isDragging, isUploading, progress, uploadMessage,\n error: displayError, sizeInfo, qualityLevel, maxSizeMB, disabled,\n canDownload, locale, ui, openFileDialog,\n selectFiles: handleFileSelect,\n remove: handleRemoveTile,\n save: handleSaveImage,\n download: handleDownload,\n setQualityLevel,\n setAltText: handleAltTextSave,\n setBlurColor: (hex: string) => applyBlurColor(hex),\n resetBlurColor: handleResetColor,\n getDropzoneProps,\n getInputProps,\n };\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { QualityLevel, StandardPresetName, UploadedImageData, UploadPresetName } from '../../types';\nimport { QUALITY_PRESETS, STANDARD_PRESETS } from '../../types';\nimport { validateMultipleFiles } from '../../utils/validators';\nimport { useImageUploadContext } from '../context';\nimport { normalizeUploadLocale, resolveTranslations } from '../i18n';\nimport type { ImagePreview, MultiImageUploadProps } from '../types';\nimport { useFilePreview } from './useFilePreview';\nimport { useImageUpload } from './useImageUpload';\n\nconst EMPTY_IMAGES: UploadedImageData[] = [];\n\nexport interface MultiUploadStats { total: number; completed: number; failed: number; }\n\nexport type UseMultiImageStateOptions<TPreset extends string = UploadPresetName> =\n Omit<MultiImageUploadProps<TPreset>, 'mode'> & { mode?: 'multiple' };\n\nfunction mapUploadedToPreview(img: UploadedImageData, prev?: ImagePreview): ImagePreview {\n const altText = prev?.altText && !img.altText?.trim() ? prev.altText : img.altText;\n return {\n id: img.url, url: img.url, file: null, uploadMessage: null,\n originalSize: img.originalSize, optimizedSize: img.size,\n data: { ...img, altText }, altText, blurColor: img.blurColor || prev?.blurColor,\n };\n}\n\nfunction resolveInitialQuality(q?: number, fallback: QualityLevel = 'high'): QualityLevel {\n if (!q) return fallback;\n return q <= 55 ? 'low' : q <= 78 ? 'medium' : q <= 90 ? 'high' : 'maximum';\n}\n\nfunction collectUploadedData(list: ImagePreview[], readyOnly: boolean): UploadedImageData[] {\n return list\n .filter((p) => p.data && (!readyOnly || !p.isUploading))\n .map((p) => ({ ...p.data!, altText: p.altText ?? p.data!.altText, blurColor: p.blurColor ?? p.data!.blurColor }));\n}\n\nexport function useMultiImageState<TPreset extends string = UploadPresetName>(\n options: UseMultiImageStateOptions<TPreset>,\n) {\n const { onChange, preset, isOpen, onClose } = options;\n const value = options.value ?? EMPTY_IMAGES;\n const maxImages = options.maxImages ?? 999;\n const maxParallelUploads = options.maxParallelUploads ?? 2;\n\n const ctx = useImageUploadContext();\n const locale = normalizeUploadLocale(options.locale || ctx.locale);\n const ui = resolveTranslations(locale, options.translations || ctx.translations);\n const requireAltText = options.requireAltText ?? ctx.requireAltText;\n const standardPreset = preset ? STANDARD_PRESETS[preset as StandardPresetName] : undefined;\n const maxSizeMB = options.maxSizeMB ?? standardPreset?.maxSizeMB ?? 10;\n const requiresManualCommit = Boolean(isOpen);\n\n const [previews, setPreviews] = useState<ImagePreview[]>(() => value.map((img) => mapUploadedToPreview(img)));\n const previewsRef = useRef<ImagePreview[]>(previews);\n previewsRef.current = previews;\n const [validationError, setValidationError] = useState('');\n const [infoMessage, setInfoMessage] = useState('');\n const [selectedPreviews, setSelectedPreviews] = useState<Set<string>>(() => new Set());\n const [uploadStats, setUploadStats] = useState<MultiUploadStats>({ total: 0, completed: 0, failed: 0 });\n const [editingAltTextId, setEditingAltTextId] = useState<string | null>(null);\n const [showMissingAltWarning, setShowMissingAltWarning] = useState(false);\n const [qualityLevel, setQualityLevel] = useState<QualityLevel>(() =>\n resolveInitialQuality(options.quality ?? standardPreset?.quality, standardPreset?.recommendedQualityLevel),\n );\n\n const { createPreview } = useFilePreview();\n\n const infoTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (infoTimeoutRef.current) clearTimeout(infoTimeoutRef.current);\n };\n }, []);\n\n useEffect(() => {\n setPreviews((current) => {\n const prevMap = new Map<string, ImagePreview>();\n current.forEach((p) => {\n prevMap.set(p.id, p);\n if (p.url) prevMap.set(p.url, p);\n });\n const synced = value.map((img) => mapUploadedToPreview(img, prevMap.get(img.url)));\n const pending = current.filter(\n (p) =>\n !value.some((img) => img.url === p.id || (p.url && img.url === p.url)) &&\n (p.isUploading || Boolean(p.error)),\n );\n const next = [...synced, ...pending];\n const isSame =\n next.length === current.length &&\n next.every((it, idx) => {\n const p = current[idx];\n return (\n p &&\n p.id === it.id &&\n p.url === it.url &&\n p.altText === it.altText &&\n p.blurColor === it.blurColor &&\n p.isUploading === it.isUploading\n );\n });\n const resolved = isSame ? current : next;\n previewsRef.current = resolved;\n return resolved;\n });\n }, [value]);\n\n const emitImmediateChange = (nextPreviews: ImagePreview[]) => {\n if (!requiresManualCommit) onChange(collectUploadedData(nextPreviews, true));\n };\n\n const patchByFile = (file: File | undefined, patch: Partial<ImagePreview>, emit = false) => {\n const next = previewsRef.current.map((p) => (p.file === file ? { ...p, ...patch } : p));\n previewsRef.current = next;\n setPreviews(next);\n if (emit) emitImmediateChange(next);\n };\n\n const patchPreview = (id: string, patch: (p: ImagePreview) => ImagePreview) => {\n const next = previewsRef.current.map((p) => (p.id === id ? patch(p) : p));\n previewsRef.current = next;\n setPreviews(next);\n emitImmediateChange(next);\n };\n\n const { uploadImage } = useImageUpload({\n preset, folder: options.folder, bucket: options.bucket, metadata: options.metadata,\n outputFormat: options.outputFormat, quality: QUALITY_PRESETS[qualityLevel].value,\n maxDimensions: options.maxDimensions, customFilename: options.customFilename,\n endpoint: options.endpoint, uploader: options.uploader,\n headers: options.headers, withCredentials: options.withCredentials, locale,\n onSuccess: (data, file) => {\n patchByFile(file, {\n url: data.url, uploadMessage: undefined, originalSize: data.originalSize,\n optimizedSize: data.size, data, blurColor: data.blurColor,\n error: undefined, isUploading: false, progress: 100,\n }, true);\n setUploadStats((s) => ({ ...s, completed: s.completed + 1 }));\n },\n onError: (error, file) => {\n patchByFile(file, { uploadMessage: undefined, error, isUploading: false, progress: 0 });\n setUploadStats((s) => ({ ...s, failed: s.failed + 1 }));\n },\n onProgress: (progress, uploadMessage, file) => {\n patchByFile(file, { uploadMessage, progress, isUploading: true });\n },\n });\n\n const handleFileSelect = async (files: FileList) => {\n setValidationError('');\n setInfoMessage('');\n const allFiles = Array.from(files);\n const imageFiles = allFiles.filter((file) => file.type.startsWith('image/'));\n if (imageFiles.length === 0) {\n setValidationError(ui.noValidImageFiles);\n return;\n }\n if (allFiles.length > imageFiles.length) {\n const skipped = allFiles.length - imageFiles.length;\n const msg = ui.selectedImagesSkipped\n .replace('{imageCount}', String(imageFiles.length))\n .replace('{imageSuffix}', imageFiles.length > 1 ? 's' : '')\n .replace('{skippedCount}', String(skipped))\n .replace('{skippedSuffix}', skipped > 1 ? 's' : '');\n setInfoMessage(msg);\n if (infoTimeoutRef.current) clearTimeout(infoTimeoutRef.current);\n infoTimeoutRef.current = setTimeout(() => setInfoMessage(''), 5000);\n }\n const validationResult = validateMultipleFiles(imageFiles, maxSizeMB, previews.length, maxImages, locale);\n if (validationResult) {\n setValidationError(validationResult);\n return;\n }\n\n setUploadStats({ total: imageFiles.length, completed: 0, failed: 0 });\n const newPreviews: ImagePreview[] = [];\n for (const file of imageFiles) {\n try {\n const url = await createPreview(file);\n newPreviews.push({\n id: `temp-${Date.now()}-${Math.random()}`, url, file, fileName: file.name,\n uploadMessage: ui.queued, originalSize: file.size, optimizedSize: null,\n isUploading: true, progress: 0,\n });\n } catch {\n setValidationError(ui.failedCreatePreviewFor.replace('{file}', file.name));\n return;\n }\n }\n const nextBatch = [...previewsRef.current, ...newPreviews];\n previewsRef.current = nextBatch;\n setPreviews(nextBatch);\n\n let nextIndex = 0;\n const workerCount = Math.max(1, Math.min(maxParallelUploads, imageFiles.length));\n await Promise.all(\n Array.from({ length: workerCount }, async () => {\n while (nextIndex < imageFiles.length) {\n const file = imageFiles[nextIndex];\n nextIndex += 1;\n await uploadImage(file);\n }\n }),\n );\n };\n\n const removeIds = (ids: Set<string>) => {\n const next = previewsRef.current.filter((p) => !ids.has(p.id));\n previewsRef.current = next;\n setPreviews(next);\n emitImmediateChange(next);\n };\n\n const handleRemove = (id: string) => {\n removeIds(new Set([id]));\n setSelectedPreviews((prev) => {\n if (!prev.has(id)) return prev;\n const copy = new Set(prev);\n copy.delete(id);\n return copy;\n });\n };\n\n const handleRemoveSelected = () => {\n removeIds(new Set(selectedPreviews));\n setSelectedPreviews(new Set());\n };\n\n const toggleSelect = (id: string) => {\n setSelectedPreviews((prev) => {\n const copy = new Set(prev);\n if (copy.has(id)) copy.delete(id);\n else copy.add(id);\n return copy;\n });\n };\n\n const handleRetryFailed = async () => {\n for (const item of previews.filter((p) => p.error && p.file)) {\n if (item.file) {\n patchByFile(item.file, { error: undefined, isUploading: true, uploadMessage: ui.retrying });\n await uploadImage(item.file);\n }\n }\n };\n\n const handleAltTextSave = (previewId: string, altText: string) => {\n patchPreview(previewId, (p) => ({ ...p, altText, data: p.data ? { ...p.data, altText } : p.data }));\n setEditingAltTextId(null);\n setShowMissingAltWarning(false);\n };\n\n const handleColorChange = (previewId: string, blurColor: string) => {\n patchPreview(previewId, (p) => ({ ...p, blurColor, data: p.data ? { ...p.data, blurColor } : p.data }));\n };\n\n const isUploading = previews.some((p) => p.isUploading);\n const hasFailedUploads = previews.some((p) => Boolean(p.error));\n const uploadingPreviews = previews.filter((p) => p.isUploading);\n const completedPreviews = previews.filter((p) => Boolean(p.data) && !p.isUploading);\n const imagesWithoutAlt = completedPreviews.filter((p) => !p.altText || !p.altText.trim());\n const editingTarget = editingAltTextId ? (previews.find((p) => p.id === editingAltTextId) ?? null) : null;\n\n const handleSaveImages = () => {\n if (requireAltText && imagesWithoutAlt.length > 0) {\n const count = imagesWithoutAlt.length;\n setShowMissingAltWarning(true);\n setValidationError(\n ui.needsAltBeforeSave.replace('{count}', String(count)).replace('{suffix}', count > 1 ? 's' : '').replace('{verbSuffix}', count > 1 ? '' : 's'),\n );\n return;\n }\n setShowMissingAltWarning(false);\n setValidationError('');\n onChange(collectUploadedData(previews, false));\n onClose?.();\n };\n\n return {\n locale, ui, requireAltText, maxSizeMB,\n previews, validationError, infoMessage,\n selectedPreviews, setSelectedPreviews, uploadStats,\n editingAltTextId, setEditingAltTextId, showMissingAltWarning,\n qualityLevel, setQualityLevel,\n isUploading, hasFailedUploads, uploadingPreviews,\n completedPreviews, imagesWithoutAlt, editingTarget,\n handleFileSelect, handleRemove, handleRemoveSelected,\n toggleSelect, handleRetryFailed, handleAltTextSave,\n handleColorChange, handleSaveImages,\n };\n}\n","import { type HTMLAttributes, type InputHTMLAttributes, type RefObject, useRef } from 'react';\nimport type { UploadPresetName } from '../../types';\nimport { useDragAndDrop } from '../hooks/useDragAndDrop';\nimport { useMultiImageState } from '../hooks/useMultiImageState';\nimport { HIDDEN_INPUT_STYLE, resolveUploadDataState } from '../utils/slotStyles';\nimport type {\n HeadlessDropzoneProps,\n HeadlessFileInputProps,\n MultiUploadController,\n UseMultiUploadOptions,\n} from './types';\n\nconst DEFAULT_ACCEPT = 'image/jpeg,image/png,image/webp,image/avif,image/svg+xml';\n\nexport function useMultiUpload<TPreset extends string = UploadPresetName>(\n options: UseMultiUploadOptions<TPreset>,\n): MultiUploadController {\n const {\n accept = DEFAULT_ACCEPT,\n disabled = false,\n error: externalError,\n maxImages = 999,\n } = options;\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const folderInputRef = useRef<HTMLInputElement>(null);\n\n const {\n locale, ui, maxSizeMB, previews, validationError, infoMessage,\n selectedPreviews, setSelectedPreviews, uploadStats, qualityLevel,\n setQualityLevel, isUploading, hasFailedUploads, uploadingPreviews,\n completedPreviews, handleFileSelect, handleRemove, handleRemoveSelected,\n toggleSelect, handleRetryFailed, handleAltTextSave, handleColorChange,\n handleSaveImages,\n } = useMultiImageState(options);\n\n const { isDragging, dragHandlers } = useDragAndDrop({\n disabled,\n onDrop: (files) => { void handleFileSelect(files); },\n });\n\n const displayError = externalError || validationError || '';\n const remainingCount = Math.max(0, maxImages - previews.length);\n\n const state = resolveUploadDataState({\n disabled,\n hasError: Boolean(displayError),\n isUploading,\n isDragging,\n hasContent: previews.length > 0,\n });\n\n const openFileDialog = () => { if (!disabled) fileInputRef.current?.click(); };\n const openFolderDialog = () => { if (!disabled) folderInputRef.current?.click(); };\n\n const getDropzoneProps = (\n overrides?: HTMLAttributes<HTMLElement>,\n ): HeadlessDropzoneProps => ({\n ...overrides,\n role: overrides?.role ?? 'button',\n tabIndex: overrides?.tabIndex ?? (disabled ? -1 : 0),\n 'aria-label': overrides?.['aria-label'] ?? ui.selectFilesAria,\n 'aria-disabled': disabled || undefined,\n 'data-state': state,\n 'data-dragging': isDragging || undefined,\n 'data-uploading': isUploading || undefined,\n 'data-disabled': disabled || undefined,\n 'data-error': Boolean(displayError) || undefined,\n onClick: (event) => {\n if (event.target === fileInputRef.current || event.target === folderInputRef.current) return;\n overrides?.onClick?.(event);\n if (!event.defaultPrevented && !disabled) openFileDialog();\n },\n onKeyDown: (event) => {\n overrides?.onKeyDown?.(event);\n if (\n !event.defaultPrevented &&\n !disabled &&\n event.target === event.currentTarget &&\n (event.key === 'Enter' || event.key === ' ')\n ) {\n event.preventDefault();\n openFileDialog();\n }\n },\n onDragEnter: (event) => { overrides?.onDragEnter?.(event); dragHandlers.onDragEnter(event); },\n onDragLeave: (event) => { overrides?.onDragLeave?.(event); dragHandlers.onDragLeave(event); },\n onDragOver: (event) => { overrides?.onDragOver?.(event); dragHandlers.onDragOver(event); },\n onDrop: (event) => { overrides?.onDrop?.(event); dragHandlers.onDrop(event); },\n });\n\n const buildInputProps = (\n ref: RefObject<HTMLInputElement | null>,\n defaultAriaLabel: string,\n isFolder: boolean,\n overrides?: InputHTMLAttributes<HTMLInputElement>,\n ): HeadlessFileInputProps => ({\n ...overrides,\n ...(isFolder ? { webkitdirectory: '', directory: '' } : {}),\n ref,\n type: 'file',\n multiple: overrides?.multiple ?? true,\n accept: overrides?.accept ?? accept,\n disabled: overrides?.disabled ?? disabled,\n 'aria-label': overrides?.['aria-label'] ?? defaultAriaLabel,\n style: overrides?.style ? { ...HIDDEN_INPUT_STYLE, ...overrides.style } : HIDDEN_INPUT_STYLE,\n onClick: (event) => {\n overrides?.onClick?.(event);\n event.stopPropagation();\n },\n onChange: (event) => {\n overrides?.onChange?.(event);\n if (!event.defaultPrevented) {\n const files = event.target.files;\n if (files && files.length > 0) void handleFileSelect(files);\n event.target.value = '';\n }\n },\n });\n\n return {\n state,\n items: previews,\n completedItems: completedPreviews,\n uploadingItems: uploadingPreviews,\n selectedIds: selectedPreviews,\n stats: uploadStats,\n isDragging, isUploading, hasFailedUploads,\n error: displayError, infoMessage, qualityLevel,\n maxSizeMB, maxImages, remainingCount, disabled, locale, ui,\n openFileDialog, openFolderDialog,\n selectFiles: handleFileSelect,\n remove: handleRemove,\n removeSelected: handleRemoveSelected,\n toggleSelect,\n selectAll: () => setSelectedPreviews(new Set(previews.map((p) => p.id))),\n clearSelection: () => setSelectedPreviews(new Set()),\n retryFailed: handleRetryFailed,\n save: handleSaveImages,\n setQualityLevel,\n setAltText: handleAltTextSave,\n setBlurColor: handleColorChange,\n getDropzoneProps,\n getInputProps: (overrides) => buildInputProps(fileInputRef, ui.selectFilesAria, false, overrides),\n getFolderInputProps: (overrides) => buildInputProps(folderInputRef, ui.selectFolderAria, true, overrides),\n };\n}\n","import type { ReactElement } from 'react';\nimport type { UploadPresetName } from '../../types';\nimport type { HeadlessSingleUploadProps } from './types';\nimport { useSingleUpload } from './useSingleUpload';\n\n/**\n * Headless render-prop primitive for single-image upload workflows.\n * Renders zero DOM elements of its own and delegates 100% of markup and styling to `children(controller)`.\n */\nexport function HeadlessSingleUpload<\n TPreset extends string = UploadPresetName,\n>(props: HeadlessSingleUploadProps<TPreset>): ReactElement {\n const controller = useSingleUpload<TPreset>(props);\n return <>{props.children(controller)}</>;\n}\n\nexport default HeadlessSingleUpload;\n","import type { ReactElement } from 'react';\nimport type { UploadPresetName } from '../../types';\nimport type { HeadlessMultiUploadProps } from './types';\nimport { useMultiUpload } from './useMultiUpload';\n\n/**\n * Headless render-prop primitive for multi-image and folder upload workflows.\n * Renders zero DOM elements of its own and delegates 100% of markup and styling to `children(controller)`.\n */\nexport function HeadlessMultiUpload<\n TPreset extends string = UploadPresetName,\n>(props: HeadlessMultiUploadProps<TPreset>): ReactElement {\n const controller = useMultiUpload<TPreset>(props);\n return <>{props.children(controller)}</>;\n}\n\nexport default HeadlessMultiUpload;\n"]}
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":";","names":[]}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { S as StorageAdapter, U as UploadRecordHook } from './types-sZ3KoFQY.js';
|
|
2
|
+
import { c as ImageOutputFormat, b as ImageDimensions, E as ExplicitOutputFormat, d as ImageUploadOptions, m as UploadedImageData, k as UploadPresetConfig, i as StandardPresetName } from './upload-C5Trd6Dh.js';
|
|
3
|
+
|
|
4
|
+
interface OptimizedImageResult {
|
|
5
|
+
buffer: Buffer;
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
format: ImageOutputFormat;
|
|
9
|
+
size: number;
|
|
10
|
+
quality?: number;
|
|
11
|
+
}
|
|
12
|
+
interface BlurHashResult {
|
|
13
|
+
dataURL: string;
|
|
14
|
+
color: string;
|
|
15
|
+
blurHash?: string;
|
|
16
|
+
}
|
|
17
|
+
interface OptimizeImageOptions {
|
|
18
|
+
/** Max bounding box dimensions (fit: 'inside', withoutEnlargement: true). Defaults to 1920x1080. */
|
|
19
|
+
maxDimensions?: ImageDimensions;
|
|
20
|
+
/** Explicit output format; omit for smart size-guarded AVIF/WebP selection */
|
|
21
|
+
outputFormat?: ExplicitOutputFormat;
|
|
22
|
+
/** 1–100 compression quality. Defaults to smart photo/graphic heuristic (85–88). */
|
|
23
|
+
quality?: number;
|
|
24
|
+
/** Maximum input pixel count allowed by Sharp (defaults to 50 MP = 50,000,000) */
|
|
25
|
+
limitInputPixels?: number;
|
|
26
|
+
/** AVIF/WebP encoding effort (defaults to 6) */
|
|
27
|
+
effort?: number;
|
|
28
|
+
}
|
|
29
|
+
declare const DEFAULT_LIMIT_INPUT_PIXELS = 50000000;
|
|
30
|
+
interface GenerateBlurOptions {
|
|
31
|
+
width?: number;
|
|
32
|
+
fallbackWidth?: number;
|
|
33
|
+
quality?: number;
|
|
34
|
+
maxDataUrlChars?: number;
|
|
35
|
+
includeBlurHash?: boolean;
|
|
36
|
+
}
|
|
37
|
+
type ColorSamplingMode = 'balanced' | 'edge';
|
|
38
|
+
type EdgeKey = 'top' | 'right' | 'bottom' | 'left';
|
|
39
|
+
type EdgeColorSet = Record<EdgeKey, string>;
|
|
40
|
+
declare const PRIMARY_AVIF_EFFORT = 6;
|
|
41
|
+
declare const RETRY_AVIF_EFFORT = 5;
|
|
42
|
+
declare const BLUR_PLACEHOLDER_WIDTH = 128;
|
|
43
|
+
declare const BLUR_PLACEHOLDER_FALLBACK_WIDTH = 96;
|
|
44
|
+
declare const BLUR_PLACEHOLDER_QUALITY = 80;
|
|
45
|
+
declare const BLUR_PLACEHOLDER_MAX_CHARS = 8000;
|
|
46
|
+
declare const EDGE_COLOR_FALLBACK = "#6B7280";
|
|
47
|
+
declare const EDGE_WHITE_FALLBACK = "#F9FAFB";
|
|
48
|
+
declare const WHITE_DOMINANCE_RATIO = 1.35;
|
|
49
|
+
|
|
50
|
+
interface ProcessedImageBufferResult {
|
|
51
|
+
optimized: OptimizedImageResult;
|
|
52
|
+
blurData: BlurHashResult;
|
|
53
|
+
contentHash: string;
|
|
54
|
+
originalSize: number;
|
|
55
|
+
}
|
|
56
|
+
interface ProcessImageBufferOptions {
|
|
57
|
+
maxDimensions?: ImageDimensions;
|
|
58
|
+
outputFormat?: ExplicitOutputFormat;
|
|
59
|
+
quality?: number;
|
|
60
|
+
includeBlurHash?: boolean;
|
|
61
|
+
optimizationTimeoutMs?: number;
|
|
62
|
+
blurTimeoutMs?: number;
|
|
63
|
+
limitInputPixels?: number;
|
|
64
|
+
effort?: number;
|
|
65
|
+
allowSvg?: boolean;
|
|
66
|
+
signal?: AbortSignal;
|
|
67
|
+
}
|
|
68
|
+
interface StoragePathContext {
|
|
69
|
+
bucket: string;
|
|
70
|
+
folder?: string;
|
|
71
|
+
preset?: string;
|
|
72
|
+
format: ImageOutputFormat;
|
|
73
|
+
extension: string;
|
|
74
|
+
customFilename?: string;
|
|
75
|
+
isClientFilename?: boolean;
|
|
76
|
+
contentHash: string;
|
|
77
|
+
originalName?: string;
|
|
78
|
+
metadata?: Record<string, string>;
|
|
79
|
+
}
|
|
80
|
+
interface GeneratedStorageTarget {
|
|
81
|
+
bucket: string;
|
|
82
|
+
path: string;
|
|
83
|
+
filename: string;
|
|
84
|
+
}
|
|
85
|
+
type StoragePathGenerator = (context: StoragePathContext) => GeneratedStorageTarget;
|
|
86
|
+
interface ImageUploaderOptions<TPresets extends Record<string, UploadPresetConfig> = Record<StandardPresetName, UploadPresetConfig>> {
|
|
87
|
+
/** Pluggable storage backend (Supabase, S3, R2, Local FS, Memory, or custom) */
|
|
88
|
+
storage: StorageAdapter;
|
|
89
|
+
/** Default bucket name when neither `options.bucket` nor `preset.bucket` is provided (defaults to `'images'`) */
|
|
90
|
+
defaultBucket?: string;
|
|
91
|
+
/** Default folder prefix within the bucket (defaults to `''` or preset folder) */
|
|
92
|
+
defaultFolder?: string;
|
|
93
|
+
/** Default max input size in MB (defaults to `10`) */
|
|
94
|
+
defaultMaxSizeMB?: number;
|
|
95
|
+
/** Default allowed MIME formats */
|
|
96
|
+
defaultAllowedFormats?: string[];
|
|
97
|
+
/** Default max bounding box dimensions (defaults to `1920x1080`) */
|
|
98
|
+
defaultMaxDimensions?: ImageDimensions;
|
|
99
|
+
/** Opt-in to allow SVG uploads by default (sanitized before storage). Defaults to `false`. */
|
|
100
|
+
allowSvg?: boolean;
|
|
101
|
+
/** Maximum input pixel count allowed by Sharp (defaults to `50_000_000` = 50 MP) */
|
|
102
|
+
limitInputPixels?: number;
|
|
103
|
+
/** Default AVIF/WebP encoding effort (defaults to `6`) */
|
|
104
|
+
effort?: number;
|
|
105
|
+
/**
|
|
106
|
+
* Project-specific named presets (merged over universal `STANDARD_PRESETS` unless `includeStandardPresets: false`).
|
|
107
|
+
* Preset names are automatically inferred in `uploader.uploadImage(file, { preset })`.
|
|
108
|
+
*/
|
|
109
|
+
presets?: TPresets;
|
|
110
|
+
/** Include universal visual role presets (`thumbnail`, `avatar`, `card`, `cover`, `hero`, `logo`, `original`). Defaults to `true`. */
|
|
111
|
+
includeStandardPresets?: boolean;
|
|
112
|
+
/** Custom storage path generator for full control over bucket/folder/filename layout */
|
|
113
|
+
pathGenerator?: StoragePathGenerator;
|
|
114
|
+
/** Optional database/analytics hook invoked after each successful upload */
|
|
115
|
+
onUploadRecord?: UploadRecordHook;
|
|
116
|
+
/** Wait for `onUploadRecord` before returning (defaults to `false` best-effort) */
|
|
117
|
+
awaitRecordHook?: boolean;
|
|
118
|
+
/** Optional error hook invoked when a non-awaited `onUploadRecord` fails */
|
|
119
|
+
onError?: (error: unknown, ctx: {
|
|
120
|
+
action: 'recordHook' | 'mirrorCleanup';
|
|
121
|
+
}) => void;
|
|
122
|
+
/** Max concurrent Sharp + LQIP image processing pipelines (defaults to `2`) */
|
|
123
|
+
concurrency?: number;
|
|
124
|
+
/** Max queued processing jobs waiting for a semaphore slot before rejecting with 503 */
|
|
125
|
+
maxQueue?: number;
|
|
126
|
+
/** Timeout per Sharp optimization job in ms (defaults to `60000`) */
|
|
127
|
+
optimizationTimeoutMs?: number;
|
|
128
|
+
/** Timeout per LQIP/blur generation job in ms (defaults to `30000`) */
|
|
129
|
+
blurTimeoutMs?: number;
|
|
130
|
+
/** Generate compact BlurHash strings by default on every upload */
|
|
131
|
+
includeBlurHash?: boolean;
|
|
132
|
+
}
|
|
133
|
+
type InferredPresetKey<TPresets extends Record<string, UploadPresetConfig>, TIncludeStandard extends boolean = true> = (keyof TPresets & string) | (TIncludeStandard extends false ? never : StandardPresetName) | (string & {});
|
|
134
|
+
interface ImageUploader<TPreset extends string = string> {
|
|
135
|
+
readonly defaultBucket?: string;
|
|
136
|
+
uploadImage(file: File | {
|
|
137
|
+
buffer: Buffer;
|
|
138
|
+
name?: string;
|
|
139
|
+
type: string;
|
|
140
|
+
size?: number;
|
|
141
|
+
}, options?: ImageUploadOptions<TPreset>): Promise<UploadedImageData>;
|
|
142
|
+
processBuffer(buffer: Buffer, options?: ProcessImageBufferOptions): Promise<ProcessedImageBufferResult>;
|
|
143
|
+
deleteImage(path: string, bucket?: string): Promise<void>;
|
|
144
|
+
deleteByUrl(url: string): Promise<boolean>;
|
|
145
|
+
resolvePreset(presetName?: string): UploadPresetConfig | undefined;
|
|
146
|
+
getAllowedBuckets?(): string[];
|
|
147
|
+
getMaxSizeMB?(allowedPresets?: string[]): number;
|
|
148
|
+
parseUrl?(url: string): {
|
|
149
|
+
bucket?: string;
|
|
150
|
+
path: string;
|
|
151
|
+
} | null;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
interface AuthorizeContext {
|
|
155
|
+
action: 'upload' | 'delete';
|
|
156
|
+
request: Request;
|
|
157
|
+
path?: string;
|
|
158
|
+
bucket?: string;
|
|
159
|
+
preset?: string;
|
|
160
|
+
}
|
|
161
|
+
interface AllowClientOverrides {
|
|
162
|
+
/** Allow client `customFilename` field (always sanitized, forced to output extension, never upserted). */
|
|
163
|
+
filename?: boolean;
|
|
164
|
+
/**
|
|
165
|
+
* Allow client `folder` field. Pass `true` to accept sanitized folder names, or a callback
|
|
166
|
+
* `(folder, ctx) => string | null` that returns the scoped folder (or `null` to reject with 400).
|
|
167
|
+
*/
|
|
168
|
+
folder?: boolean | ((folder: string, ctx: AuthorizeContext) => string | null | undefined);
|
|
169
|
+
/** Allow client `maxWidth` / `maxHeight` fields (clamped to the active preset's `maxDimensions`). */
|
|
170
|
+
dimensions?: boolean;
|
|
171
|
+
/** Allow client `outputFormat` field (`jpeg`, `png`, `webp`, `avif`). */
|
|
172
|
+
format?: boolean;
|
|
173
|
+
/** Allow client `quality` field (1–100, clamped to the active preset's `quality` when set). */
|
|
174
|
+
quality?: boolean;
|
|
175
|
+
}
|
|
176
|
+
interface UploadErrorContext {
|
|
177
|
+
action: 'upload' | 'delete';
|
|
178
|
+
request: Request;
|
|
179
|
+
}
|
|
180
|
+
interface UploadHttpHandlerOptions<TPreset extends string = string> {
|
|
181
|
+
uploader: ImageUploader<TPreset>;
|
|
182
|
+
/**
|
|
183
|
+
* Optional authorization check. Return `false` or throw to reject with 401.
|
|
184
|
+
*/
|
|
185
|
+
authorize?: (ctx: AuthorizeContext) => boolean | Promise<boolean>;
|
|
186
|
+
/**
|
|
187
|
+
* Optional whitelist of allowed preset names.
|
|
188
|
+
*/
|
|
189
|
+
allowedPresets?: TPreset[];
|
|
190
|
+
/**
|
|
191
|
+
* Optional CSRF/CORS origin allowlist (`string[]` of origins or predicate).
|
|
192
|
+
* When set, requests with a missing or disallowed `Origin`/`Referer` are rejected with 403.
|
|
193
|
+
*/
|
|
194
|
+
allowedOrigins?: string[] | ((origin: string) => boolean);
|
|
195
|
+
/**
|
|
196
|
+
* Maximum allowed request body size in bytes (enforced via Content-Length precheck and stream cap).
|
|
197
|
+
* Defaults to `1.25 × max(preset.maxSizeMB, defaultMaxSizeMB)` (minimum 1 MB when unset).
|
|
198
|
+
*/
|
|
199
|
+
maxBodyBytes?: number;
|
|
200
|
+
/**
|
|
201
|
+
* Opt-in switches for client-supplied FormData overrides. All default to `false` (ignored).
|
|
202
|
+
*/
|
|
203
|
+
allowClientOverrides?: AllowClientOverrides;
|
|
204
|
+
/**
|
|
205
|
+
* Allow clients to override `bucket` via FormData or DELETE query params. Defaults to `false`.
|
|
206
|
+
*/
|
|
207
|
+
allowClientBucketOverride?: boolean;
|
|
208
|
+
/**
|
|
209
|
+
* Optional explicit allowlist of bucket names permitted for upload and delete operations.
|
|
210
|
+
*/
|
|
211
|
+
allowedBuckets?: string[];
|
|
212
|
+
/**
|
|
213
|
+
* Hook invoked when an unexpected 500 internal error occurs. Raw error details are never sent to clients.
|
|
214
|
+
*/
|
|
215
|
+
onError?: (error: unknown, ctx: UploadErrorContext) => void;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
declare class UploadValidationError extends Error {
|
|
219
|
+
readonly status = 400;
|
|
220
|
+
constructor(message: string);
|
|
221
|
+
}
|
|
222
|
+
declare function isClientValidationError(error: unknown): boolean;
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Standard Web Fetch (`Request` -> `Response`) upload & delete route handlers.
|
|
226
|
+
* Works across Next.js App Router, Remix, React Router, SvelteKit, Astro, Hono, and Node Fetch servers.
|
|
227
|
+
*/
|
|
228
|
+
declare function createUploadHttpHandler<TPreset extends string = string>(options: UploadHttpHandlerOptions<TPreset>): {
|
|
229
|
+
POST: (request: Request) => Promise<Response>;
|
|
230
|
+
DELETE: (request: Request) => Promise<Response>;
|
|
231
|
+
};
|
|
232
|
+
declare const createUploadHandler: typeof createUploadHttpHandler;
|
|
233
|
+
|
|
234
|
+
export { type AllowClientOverrides as A, type BlurHashResult as B, type ColorSamplingMode as C, DEFAULT_LIMIT_INPUT_PIXELS as D, type EdgeColorSet as E, type GenerateBlurOptions as G, type ImageUploaderOptions as I, type OptimizeImageOptions as O, type ProcessImageBufferOptions as P, RETRY_AVIF_EFFORT as R, type StoragePathGenerator as S, type UploadErrorContext as U, WHITE_DOMINANCE_RATIO as W, type OptimizedImageResult as a, type ProcessedImageBufferResult as b, type ImageUploader as c, type InferredPresetKey as d, type StoragePathContext as e, type GeneratedStorageTarget as f, type AuthorizeContext as g, BLUR_PLACEHOLDER_FALLBACK_WIDTH as h, BLUR_PLACEHOLDER_MAX_CHARS as i, BLUR_PLACEHOLDER_QUALITY as j, BLUR_PLACEHOLDER_WIDTH as k, EDGE_COLOR_FALLBACK as l, EDGE_WHITE_FALLBACK as m, type EdgeKey as n, PRIMARY_AVIF_EFFORT as o, type UploadHttpHandlerOptions as p, UploadValidationError as q, createUploadHandler as r, createUploadHttpHandler as s, isClientValidationError as t };
|