img-upload-kit 2.0.1 → 2.0.2

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.
Files changed (80) hide show
  1. package/CHANGELOG.md +89 -89
  2. package/MIGRATION.md +192 -192
  3. package/README.md +243 -243
  4. package/dist/bin.js +1 -1
  5. package/dist/bin.js.map +1 -1
  6. package/dist/blur.cjs +3 -3
  7. package/dist/blur.cjs.map +1 -1
  8. package/dist/blur.js +2 -2
  9. package/dist/{chunk-XKQMCY5Z.cjs → chunk-2OVNXHTN.cjs} +1 -1
  10. package/dist/chunk-2OVNXHTN.cjs.map +1 -0
  11. package/dist/{chunk-FP5YIWG5.cjs → chunk-3ICG2SLL.cjs} +1 -1
  12. package/dist/chunk-3ICG2SLL.cjs.map +1 -0
  13. package/dist/{chunk-J6A44Y3W.js → chunk-4ASFG3KB.js} +1 -1
  14. package/dist/chunk-4ASFG3KB.js.map +1 -0
  15. package/dist/{chunk-IDLLCVGB.js → chunk-AI3JJLSA.js} +3 -3
  16. package/dist/chunk-AI3JJLSA.js.map +1 -0
  17. package/dist/{chunk-MHGQEBPW.js → chunk-CV23O4YU.js} +1 -1
  18. package/dist/chunk-CV23O4YU.js.map +1 -0
  19. package/dist/{chunk-25GYKQ6J.js → chunk-G7LLSKBV.js} +1 -1
  20. package/dist/chunk-G7LLSKBV.js.map +1 -0
  21. package/dist/{chunk-EWVIL57J.js → chunk-IB3TEDLR.js} +1 -1
  22. package/dist/chunk-IB3TEDLR.js.map +1 -0
  23. package/dist/{chunk-DFCSN3X7.cjs → chunk-KJVYWKIG.cjs} +1 -1
  24. package/dist/chunk-KJVYWKIG.cjs.map +1 -0
  25. package/dist/{chunk-34L4TEE3.cjs → chunk-NEDBIIE3.cjs} +1 -1
  26. package/dist/chunk-NEDBIIE3.cjs.map +1 -0
  27. package/dist/chunk-QHU7FUO4.cjs.map +1 -1
  28. package/dist/{chunk-VYVZVUNI.js → chunk-QQHZJKNA.js} +1 -1
  29. package/dist/chunk-QQHZJKNA.js.map +1 -0
  30. package/dist/{chunk-HILELQGS.js → chunk-TT5C7K3Q.js} +1 -1
  31. package/dist/chunk-TT5C7K3Q.js.map +1 -0
  32. package/dist/{chunk-TA5Y64JM.cjs → chunk-U2TWTEBY.cjs} +24 -24
  33. package/dist/chunk-U2TWTEBY.cjs.map +1 -0
  34. package/dist/{chunk-MBQJ6NVJ.cjs → chunk-WISG74VL.cjs} +1 -1
  35. package/dist/chunk-WISG74VL.cjs.map +1 -0
  36. package/dist/{chunk-LOSVFO56.cjs → chunk-YRXXQUDE.cjs} +1 -1
  37. package/dist/chunk-YRXXQUDE.cjs.map +1 -0
  38. package/dist/cli.cjs +1 -1
  39. package/dist/cli.cjs.map +1 -1
  40. package/dist/cli.js +1 -1
  41. package/dist/cli.js.map +1 -1
  42. package/dist/headless.cjs +4 -4
  43. package/dist/headless.cjs.map +1 -1
  44. package/dist/headless.js +3 -3
  45. package/dist/index.cjs +5 -5
  46. package/dist/index.cjs.map +1 -1
  47. package/dist/index.js +4 -4
  48. package/dist/react.cjs +138 -138
  49. package/dist/react.cjs.map +1 -1
  50. package/dist/react.js +5 -5
  51. package/dist/react.js.map +1 -1
  52. package/dist/server-handler.cjs +2 -2
  53. package/dist/server-handler.cjs.map +1 -1
  54. package/dist/server-handler.js +1 -1
  55. package/dist/server.cjs +30 -30
  56. package/dist/server.cjs.map +1 -1
  57. package/dist/server.js +2 -2
  58. package/dist/server.js.map +1 -1
  59. package/dist/storage.cjs +9 -9
  60. package/dist/storage.cjs.map +1 -1
  61. package/dist/storage.js +1 -1
  62. package/dist/storage.js.map +1 -1
  63. package/dist/styles/animated-image.css +112 -112
  64. package/dist/styles/tokens.css +123 -123
  65. package/dist/styles.css +235 -235
  66. package/package.json +1 -1
  67. package/dist/chunk-25GYKQ6J.js.map +0 -1
  68. package/dist/chunk-34L4TEE3.cjs.map +0 -1
  69. package/dist/chunk-DFCSN3X7.cjs.map +0 -1
  70. package/dist/chunk-EWVIL57J.js.map +0 -1
  71. package/dist/chunk-FP5YIWG5.cjs.map +0 -1
  72. package/dist/chunk-HILELQGS.js.map +0 -1
  73. package/dist/chunk-IDLLCVGB.js.map +0 -1
  74. package/dist/chunk-J6A44Y3W.js.map +0 -1
  75. package/dist/chunk-LOSVFO56.cjs.map +0 -1
  76. package/dist/chunk-MBQJ6NVJ.cjs.map +0 -1
  77. package/dist/chunk-MHGQEBPW.js.map +0 -1
  78. package/dist/chunk-TA5Y64JM.cjs.map +0 -1
  79. package/dist/chunk-VYVZVUNI.js.map +0 -1
  80. package/dist/chunk-XKQMCY5Z.cjs.map +0 -1
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react/hooks/index.ts","../src/react/hooks/useBlurService.ts","../src/react/hooks/useDialog.ts","../src/react/icons.tsx","../src/react/components/AltTextInput.tsx","../src/react/components/AltTextModal.tsx","../src/react/components/BlurImage.tsx","../src/react/components/AnimatedImage/AnimatedImage.tsx","../src/react/components/AnimatedImage/placeholder.ts","../src/react/components/AnimatedImage/useImageReveal.ts","../src/react/components/BlurServiceDebugger.tsx","../src/react/components/BlurVisualizationModal.tsx","../src/react/utils/canvasSampler.ts","../src/react/components/BlurColorControls.tsx","../src/react/components/SaveButton.tsx","../src/react/components/ImageUpload.tsx","../src/react/components/MultiImageUpload.tsx","../src/react/components/MultiDropzoneViews.tsx","../src/react/components/MultiUploadHeaderAlerts.tsx","../src/react/components/PreviewTile.tsx","../src/react/components/QualitySelector.tsx","../src/react/components/UploadProgressPanel.tsx","../src/react/components/SingleImageUpload.tsx","../src/react/components/SingleDropzoneContent.tsx"],"sourcesContent":["import { useEffect } from 'react';\r\nimport {\r\n blurService,\r\n type BlurSize,\r\n useProgressiveBlur,\r\n} from './useBlurService';\r\n\r\nexport * from './useBlurService';\r\nexport {\r\n extractClipboardImageFiles,\r\n type PasteTargetMode,\r\n toFileListLike,\r\n useClipboardPaste,\r\n type UseClipboardPasteOptions,\r\n} from './useClipboardPaste';\r\nexport { useDialog, type UseDialogOptions } from './useDialog';\r\nexport {\r\n useDragAndDrop,\r\n type UseDragAndDropOptions,\r\n} from './useDragAndDrop';\r\nexport { useFilePreview, type UseFilePreviewOptions } from './useFilePreview';\r\nexport {\r\n type UploadCallOptions,\r\n useImageUpload,\r\n type UseImageUploadOptions,\r\n} from './useImageUpload';\r\nexport {\r\n buildUploadFormData,\r\n createUploadAbortError,\r\n isUploadAbortError,\r\n parseErrorPayload,\r\n type UploadFormFields,\r\n uploadViaXhr,\r\n type XhrUploadOptions,\r\n} from './xhrUpload';\r\n\r\nexport const useProgressiveImage = useProgressiveBlur;\r\n\r\nexport function useBlurPreload(\r\n imageSrcs: string[],\r\n size: BlurSize = 'small',\r\n): void {\r\n useEffect(() => {\r\n if (imageSrcs.length > 0) {\r\n blurService.preloadBlurData(imageSrcs, size);\r\n }\r\n }, [imageSrcs, size]);\r\n}\r\n","import { useMemo } from 'react';\nimport { blurService } from '../../blur/blurService';\nimport { DEFAULT_PLACEHOLDERS } from '../../blur/placeholders';\nimport type { BlurPlaceholderType, BlurSize } from '../../blur/types';\n\nexport function useBlurDataURL(\n imageSrc: string | undefined,\n options: {\n type?: BlurPlaceholderType;\n size?: BlurSize;\n } = {},\n): string {\n const { type = 'default', size = 'small' } = options;\n\n return useMemo(() => {\n if (!imageSrc) return DEFAULT_PLACEHOLDERS[type];\n return blurService.getBlurDataURL(imageSrc, { type, size });\n }, [imageSrc, type, size]);\n}\n\nexport function useBulkBlurData(\n imageSrcs: string[],\n options: {\n type?: BlurPlaceholderType;\n size?: BlurSize;\n } = {},\n): Record<string, string> {\n const { type = 'default', size = 'small' } = options;\n\n return useMemo(() => {\n return blurService.getBulkBlurData(imageSrcs, { type, size });\n }, [imageSrcs, type, size]);\n}\n\nexport function useProgressiveBlur(\n imageSrc: string | undefined,\n size: BlurSize = 'small',\n) {\n return useMemo(() => {\n if (!imageSrc) {\n return {\n color: '#E5E7EB',\n blur: DEFAULT_PLACEHOLDERS.default,\n hasBlur: false,\n };\n }\n return blurService.getProgressiveData(imageSrc, size);\n }, [imageSrc, size]);\n}\n\nexport function useHasBlurHash(imageSrc: string | undefined): boolean {\n return useMemo(() => {\n if (!imageSrc) return false;\n return blurService.hasBlurHash(imageSrc);\n }, [imageSrc]);\n}\n\nexport function useDominantColor(imageSrc: string | undefined): string {\n return useMemo(() => {\n if (!imageSrc) return '#E5E7EB';\n return blurService.getDominantColor(imageSrc);\n }, [imageSrc]);\n}\n\nexport function useBlurMetadata() {\n return useMemo(() => {\n return blurService.getMetadata();\n }, []);\n}\n\nexport function useBlurHash(imageSrc: string | undefined): string | null {\n return useMemo(() => {\n if (!imageSrc) return null;\n return blurService.getBlurHash(imageSrc);\n }, [imageSrc]);\n}\n\nexport function useBlurDataWithColor(\n imageSrc: string | undefined,\n size: BlurSize = 'small',\n): {\n blurDataUrl: string;\n blurColor: string;\n hasBlur: boolean;\n} {\n return useMemo(() => {\n if (!imageSrc) {\n return {\n blurDataUrl: DEFAULT_PLACEHOLDERS.default,\n blurColor: '#E5E7EB',\n hasBlur: false,\n };\n }\n const progressive = blurService.getProgressiveData(imageSrc, size);\n return {\n blurDataUrl: progressive.blur,\n blurColor: progressive.color,\n hasBlur: progressive.hasBlur,\n };\n }, [imageSrc, size]);\n}\n\nexport function useBlurVariant(\n imageSrc: string | undefined,\n size: BlurSize = 'small',\n type: BlurPlaceholderType = 'default',\n): string {\n return useMemo(() => {\n if (!imageSrc) return DEFAULT_PLACEHOLDERS[type];\n return blurService.getBlurDataURL(imageSrc, { type, size });\n }, [imageSrc, size, type]);\n}\n\nexport { blurService, DEFAULT_PLACEHOLDERS };\nexport type { BlurPlaceholderType, BlurSize };\n","import { type RefObject, useEffect, useId, useRef } from 'react';\r\n\r\nconst FOCUSABLE_SELECTOR = [\r\n 'button:not(:disabled)',\r\n '[href]',\r\n 'input:not(:disabled):not([type=\"hidden\"])',\r\n 'select:not(:disabled)',\r\n 'textarea:not(:disabled)',\r\n '[tabindex]:not([tabindex=\"-1\"])',\r\n].join(', ');\r\n\r\nexport interface UseDialogOptions {\r\n isOpen: boolean;\r\n onClose?: () => void;\r\n initialFocusRef?: RefObject<HTMLElement | null>;\r\n lockScroll?: boolean;\r\n}\r\n\r\nexport function useDialog({\r\n isOpen,\r\n onClose,\r\n initialFocusRef,\r\n lockScroll = true,\r\n}: UseDialogOptions) {\r\n const dialogRef = useRef<HTMLDivElement | null>(null);\r\n const onCloseRef = useRef(onClose);\r\n onCloseRef.current = onClose;\r\n const titleId = useId();\r\n const descriptionId = useId();\r\n\r\n useEffect(() => {\r\n if (!isOpen || typeof document === 'undefined') return;\r\n\r\n const previouslyFocused =\r\n document.activeElement instanceof HTMLElement\r\n ? document.activeElement\r\n : null;\r\n\r\n const prevOverflow = document.body.style.overflow;\r\n if (lockScroll) {\r\n document.body.style.overflow = 'hidden';\r\n }\r\n\r\n const focusInitial = () => {\r\n const container = dialogRef.current;\r\n if (!container) return;\r\n if (initialFocusRef?.current) {\r\n initialFocusRef.current.focus();\r\n return;\r\n }\r\n if (\r\n document.activeElement &&\r\n container.contains(document.activeElement)\r\n ) {\r\n return;\r\n }\r\n const focusables = Array.from(\r\n container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\r\n );\r\n if (focusables.length > 0) {\r\n focusables[0].focus();\r\n } else {\r\n container.focus();\r\n }\r\n };\r\n\r\n focusInitial();\r\n\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (event.key === 'Escape' && onCloseRef.current) {\r\n event.stopPropagation();\r\n onCloseRef.current();\r\n return;\r\n }\r\n\r\n if (event.key !== 'Tab') return;\r\n const container = dialogRef.current;\r\n if (!container) return;\r\n\r\n const focusables = Array.from(\r\n container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\r\n );\r\n if (focusables.length === 0) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n const first = focusables[0];\r\n const last = focusables[focusables.length - 1];\r\n const active = document.activeElement as HTMLElement | null;\r\n\r\n if (event.shiftKey) {\r\n if (!active || active === first || !container.contains(active)) {\r\n event.preventDefault();\r\n last.focus();\r\n }\r\n } else if (!active || active === last || !container.contains(active)) {\r\n event.preventDefault();\r\n first.focus();\r\n }\r\n };\r\n\r\n document.addEventListener('keydown', handleKeyDown);\r\n return () => {\r\n document.removeEventListener('keydown', handleKeyDown);\r\n if (lockScroll) {\r\n document.body.style.overflow = prevOverflow;\r\n }\r\n if (previouslyFocused && typeof previouslyFocused.focus === 'function') {\r\n try {\r\n previouslyFocused.focus();\r\n } catch {\r\n // Ignore focus restore errors if node was detached\r\n }\r\n }\r\n };\r\n }, [isOpen, lockScroll, initialFocusRef]);\r\n\r\n return {\r\n dialogRef,\r\n titleId,\r\n descriptionId,\r\n };\r\n}\r\n","/**\r\n * Inline SVG icon set (24×24, stroke-based) used by the styled components.\r\n *\r\n * Replaces the former `lucide-react` dependency so consumers do not need to\r\n * install an icon library. Path data is derived from Lucide (ISC license,\r\n * https://lucide.dev/license). The prop API mirrors the subset of Lucide's\r\n * API the kit relied on: `size`, `strokeWidth`, `color`, `className` and any\r\n * other SVG attribute. Icons are decorative (`aria-hidden`) by default unless\r\n * an `aria-label` / `aria-labelledby` is supplied.\r\n */\r\nimport type { JSX, SVGProps } from 'react';\r\n\r\ntype IconTag = 'path' | 'circle';\r\ntype IconNode = ReadonlyArray<readonly [IconTag, Readonly<Record<string, string>>]>;\r\n\r\nexport interface IconProps extends Omit<SVGProps<SVGSVGElement>, 'ref'> {\r\n /** Width & height in px (number) or any CSS length (string). Default 24. */\r\n size?: number | string;\r\n /** Stroke width. Default 2. */\r\n strokeWidth?: number | string;\r\n /** Stroke color. Default `currentColor`. */\r\n color?: string;\r\n}\r\n\r\nexport type IconComponent = ((props: IconProps) => JSX.Element) & {\r\n displayName?: string;\r\n};\r\n\r\nfunction createIcon(name: string, nodes: IconNode): IconComponent {\r\n const Icon = ({\r\n size = 24,\r\n strokeWidth = 2,\r\n color = 'currentColor',\r\n className,\r\n children,\r\n ...rest\r\n }: IconProps) => {\r\n const labelled =\r\n rest['aria-label'] !== undefined || rest['aria-labelledby'] !== undefined;\r\n const baseClass = `iuk-icon iuk-icon--${name}`;\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke={color}\r\n strokeWidth={strokeWidth}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className ? `${baseClass} ${className}` : baseClass}\r\n aria-hidden={labelled ? undefined : true}\r\n focusable=\"false\"\r\n {...rest}\r\n >\r\n {nodes.map(([Tag, attrs], index) => (\r\n <Tag key={index} {...attrs} />\r\n ))}\r\n {children}\r\n </svg>\r\n );\r\n };\r\n Icon.displayName = `Icon(${name})`;\r\n return Icon;\r\n}\r\n\r\nconst p = (d: string) => ['path', { d }] as const;\r\nconst c = (cx: string, cy: string, r: string, fill?: string) => {\r\n const attrs: Record<string, string> = { cx, cy, r };\r\n if (fill) attrs.fill = fill;\r\n return ['circle', attrs] as const;\r\n};\r\n\r\nconst UPLOAD_TRAY = 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4';\r\n\r\nexport const UploadIcon = createIcon('upload', [\r\n p('M12 3v12'),\r\n p('m17 8-5-5-5 5'),\r\n p(UPLOAD_TRAY),\r\n]);\r\n\r\nexport const DownloadIcon = createIcon('download', [\r\n p('M12 15V3'),\r\n p(UPLOAD_TRAY),\r\n p('m7 10 5 5 5-5'),\r\n]);\r\n\r\nexport const ImagePlusIcon = createIcon('image-plus', [\r\n p('M16 5h6'),\r\n p('M19 2v6'),\r\n p('M21 11.5V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h7.5'),\r\n p('m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21'),\r\n c('9', '9', '2'),\r\n]);\r\n\r\nexport const XIcon = createIcon('x', [p('M18 6 6 18'), p('m6 6 12 12')]);\r\n\r\nexport const CheckIcon = createIcon('check', [p('M20 6 9 17l-5-5')]);\r\n\r\nexport const MinusIcon = createIcon('minus', [p('M5 12h14')]);\r\n\r\nexport const LoaderIcon = createIcon('loader', [\r\n p('M21 12a9 9 0 1 1-6.219-8.56'),\r\n]);\r\n\r\nexport const ChevronUpIcon = createIcon('chevron-up', [p('m18 15-6-6-6 6')]);\r\n\r\nexport const ChevronDownIcon = createIcon('chevron-down', [p('m6 9 6 6 6-6')]);\r\n\r\nexport const AlertTriangleIcon = createIcon('alert-triangle', [\r\n p('m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3'),\r\n p('M12 9v4'),\r\n p('M12 17h.01'),\r\n]);\r\n\r\nexport const SaveIcon = createIcon('save', [\r\n p(\r\n 'M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z',\r\n ),\r\n p('M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7'),\r\n p('M7 3v4a1 1 0 0 0 1 1h7'),\r\n]);\r\n\r\nexport const EyeIcon = createIcon('eye', [\r\n p(\r\n 'M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0',\r\n ),\r\n c('12', '12', '3'),\r\n]);\r\n\r\nexport const InfoIcon = createIcon('info', [\r\n c('12', '12', '10'),\r\n p('M12 16v-4'),\r\n p('M12 8h.01'),\r\n]);\r\n\r\nexport const ZapIcon = createIcon('zap', [\r\n p(\r\n 'M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z',\r\n ),\r\n]);\r\n\r\nexport const CheckCircleIcon = createIcon('check-circle', [\r\n c('12', '12', '10'),\r\n p('m9 12 2 2 4-4'),\r\n]);\r\n\r\nexport const XCircleIcon = createIcon('x-circle', [\r\n c('12', '12', '10'),\r\n p('m15 9-6 6'),\r\n p('m9 9 6 6'),\r\n]);\r\n\r\nexport const TypeIcon = createIcon('type', [\r\n p('M12 4v16'),\r\n p('M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2'),\r\n p('M9 20h6'),\r\n]);\r\n\r\nexport const FolderOpenIcon = createIcon('folder-open', [\r\n p(\r\n 'm6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2',\r\n ),\r\n]);\r\n\r\nexport const PenToolIcon = createIcon('pen-tool', [\r\n p(\r\n 'M15.707 21.293a1 1 0 0 1-1.414 0l-1.586-1.586a1 1 0 0 1 0-1.414l5.586-5.586a1 1 0 0 1 1.414 0l1.586 1.586a1 1 0 0 1 0 1.414z',\r\n ),\r\n p(\r\n 'm18 13-1.375-6.874a1 1 0 0 0-.746-.776L3.235 2.028a1 1 0 0 0-1.207 1.207L5.35 15.879a1 1 0 0 0 .776.746L13 18',\r\n ),\r\n p('m2.3 2.3 7.286 7.286'),\r\n c('11', '11', '2'),\r\n]);\r\n\r\nexport const WandIcon = createIcon('wand', [\r\n p(\r\n 'm21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72',\r\n ),\r\n p('m14 7 3 3'),\r\n p('M5 6v4'),\r\n p('M19 14v4'),\r\n p('M10 2v2'),\r\n p('M7 8H3'),\r\n p('M21 16h-4'),\r\n p('M11 3H9'),\r\n]);\r\n\r\nexport const TrashIcon = createIcon('trash', [\r\n p('M10 11v6'),\r\n p('M14 11v6'),\r\n p('M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6'),\r\n p('M3 6h18'),\r\n p('M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2'),\r\n]);\r\n\r\nexport const PaletteIcon = createIcon('palette', [\r\n p(\r\n 'M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z',\r\n ),\r\n c('13.5', '6.5', '.5', 'currentColor'),\r\n c('17.5', '10.5', '.5', 'currentColor'),\r\n c('6.5', '12.5', '.5', 'currentColor'),\r\n c('8.5', '7.5', '.5', 'currentColor'),\r\n]);\r\n","import { TypeIcon } from '../icons';\r\nimport { useId } from 'react';\r\nimport type { UploadLocale } from '../../types';\r\nimport { useImageUploadContext } from '../context';\r\nimport {\r\n normalizeUploadLocale,\r\n resolveTranslations,\r\n type UploadTranslations,\r\n} from '../i18n';\r\nimport { resolveSlotClass } from '../utils/slotStyles';\r\n\r\nexport interface AltTextInputProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n disabled?: boolean;\r\n placeholder?: string;\r\n maxLength?: number;\r\n label?: string;\r\n showHint?: boolean;\r\n locale?: UploadLocale;\r\n translations?: Partial<UploadTranslations>;\r\n unstyled?: boolean;\r\n}\r\n\r\nexport function AltTextInput({\r\n value,\r\n onChange,\r\n disabled = false,\r\n placeholder,\r\n maxLength = 200,\r\n label,\r\n showHint = true,\r\n locale: propLocale,\r\n translations,\r\n unstyled: propUnstyled,\r\n}: AltTextInputProps) {\r\n const ctx = useImageUploadContext();\r\n const isUnstyled = propUnstyled ?? ctx.unstyled;\r\n const locale = normalizeUploadLocale(propLocale || ctx.locale);\r\n const ui = resolveTranslations(locale, translations || ctx.translations);\r\n const resolvedPlaceholder = placeholder || ui.describeImagePlaceholder;\r\n const resolvedLabel = label || ui.addImageDescription;\r\n const inputId = useId();\r\n const hintId = showHint ? `${inputId}-hint` : undefined;\r\n const cls = (defaultClass: string) => resolveSlotClass(defaultClass, isUnstyled);\r\n\r\n return (\r\n <div\r\n data-slot=\"alt-input\"\r\n data-unstyled={isUnstyled || undefined}\r\n className={cls('iuk-alt-input')}\r\n dir={locale === 'ar' ? 'rtl' : 'ltr'}\r\n >\r\n <div className={cls('iuk-alt-input__header')}>\r\n <TypeIcon size={16} />\r\n <label htmlFor={inputId} className={cls('iuk-alt-input__label')}>\r\n {resolvedLabel}\r\n </label>\r\n </div>\r\n <input\r\n id={inputId}\r\n type=\"text\"\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n placeholder={resolvedPlaceholder}\r\n className={cls('iuk-alt-input__field')}\r\n disabled={disabled}\r\n maxLength={maxLength}\r\n aria-describedby={hintId}\r\n />\r\n {showHint && (\r\n <p className={cls('iuk-alt-input__hint')} id={hintId}>\r\n <span>\r\n {value.length}/{maxLength} {ui.characters}\r\n </span>\r\n <span>{ui.usedForA11ySeo}</span>\r\n </p>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default AltTextInput;\r\n","import { CheckCircleIcon as CheckCircle2, TypeIcon, XIcon as X } from '../icons';\r\nimport { useRef, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport type { UploadLocale } from '../../types';\r\nimport { useImageUploadContext } from '../context';\r\nimport { useDialog } from '../hooks/useDialog';\r\nimport {\r\n normalizeUploadLocale,\r\n resolveTranslations,\r\n type UploadTranslations,\r\n} from '../i18n';\r\nimport type { CustomImageRenderer } from '../types';\r\nimport { resolveSlotClass } from '../utils/slotStyles';\r\nimport { BlurImage } from './BlurImage';\r\n\r\nexport interface AltTextModalProps {\r\n imageUrl: string;\r\n initialAltText?: string;\r\n onSave: (altText: string) => void;\r\n onClose: () => void;\r\n locale?: UploadLocale;\r\n translations?: Partial<UploadTranslations>;\r\n renderImage?: CustomImageRenderer;\r\n unstyled?: boolean;\r\n}\r\n\r\nexport function AltTextModal({\r\n imageUrl,\r\n initialAltText = '',\r\n onSave,\r\n onClose,\r\n locale: propLocale,\r\n translations,\r\n renderImage,\r\n unstyled: propUnstyled,\r\n}: AltTextModalProps) {\r\n const ctx = useImageUploadContext();\r\n const isUnstyled = propUnstyled ?? ctx.unstyled;\r\n const locale = normalizeUploadLocale(propLocale || ctx.locale);\r\n const ui = resolveTranslations(locale, translations || ctx.translations);\r\n const [localAltText, setLocalAltText] = useState(initialAltText);\r\n const inputRef = useRef<HTMLInputElement | null>(null);\r\n const { dialogRef, titleId, descriptionId } = useDialog({\r\n isOpen: true,\r\n onClose,\r\n initialFocusRef: inputRef,\r\n });\r\n const cls = (defaultClass: string) => resolveSlotClass(defaultClass, isUnstyled);\r\n\r\n const handleSave = () => {\r\n onSave(localAltText);\r\n onClose();\r\n };\r\n\r\n const content = (\r\n <div\r\n data-slot=\"alt-modal-backdrop\"\r\n data-unstyled={isUnstyled || undefined}\r\n className={cls('iuk-modal-backdrop')}\r\n dir={locale === 'ar' ? 'rtl' : 'ltr'}\r\n onClick={onClose}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby={titleId}\r\n aria-describedby={descriptionId}\r\n >\r\n <div\r\n ref={dialogRef}\r\n data-slot=\"alt-modal\"\r\n className={cls('iuk-alt-modal')}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div className={cls('iuk-alt-modal__header')}>\r\n <div className={cls('iuk-alt-modal__title')}>\r\n <TypeIcon size={18} />\r\n <span id={titleId}>{ui.addImageDescription}</span>\r\n </div>\r\n <button\r\n type=\"button\"\r\n className={cls('iuk-icon-btn')}\r\n onClick={onClose}\r\n title={ui.close}\r\n aria-label={ui.close}\r\n >\r\n <X size={18} />\r\n </button>\r\n </div>\r\n\r\n <div className={cls('iuk-alt-modal__preview')}>\r\n <BlurImage\r\n src={imageUrl}\r\n alt={ui.previewAlt}\r\n objectFit=\"contain\"\r\n renderImage={renderImage}\r\n />\r\n </div>\r\n\r\n <input\r\n ref={inputRef}\r\n type=\"text\"\r\n className={cls('iuk-alt-input__field')}\r\n value={localAltText}\r\n onChange={(e) => setLocalAltText(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') {\r\n e.preventDefault();\r\n handleSave();\r\n }\r\n }}\r\n placeholder={ui.describeImagePlaceholder}\r\n maxLength={200}\r\n aria-labelledby={titleId}\r\n aria-describedby={descriptionId}\r\n />\r\n\r\n <div id={descriptionId} className={cls('iuk-alt-input__hint')}>\r\n <span>\r\n {localAltText.length}/200 {ui.characters}\r\n </span>\r\n <span>{ui.usedForA11ySeo}</span>\r\n </div>\r\n\r\n <div className={cls('iuk-alt-modal__actions')}>\r\n <button\r\n type=\"button\"\r\n className={cls('iuk-btn iuk-btn--secondary')}\r\n onClick={onClose}\r\n >\r\n {ui.cancel}\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={cls('iuk-btn iuk-btn--primary')}\r\n onClick={handleSave}\r\n >\r\n <CheckCircle2 size={16} />\r\n <span>{ui.saveDescription}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n if (typeof document !== 'undefined') {\r\n return createPortal(content, document.body);\r\n }\r\n return content;\r\n}\r\n\r\nexport default AltTextModal;\r\n","import {\r\n type CSSProperties,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react';\r\nimport { decodeBlurHashToDataURL } from '../../blur/blurDataUtils';\r\nimport { useImageUploadContext } from '../context';\r\nimport type { CustomImageRenderer } from '../types';\r\n\r\nexport interface BlurImageProps {\r\n src: string;\r\n alt: string;\r\n blurDataUrl?: string | null;\r\n blurColor?: string | null;\r\n blurHash?: string | null;\r\n objectFit?: CSSProperties['objectFit'];\r\n className?: string;\r\n imageClassName?: string;\r\n style?: CSSProperties;\r\n renderImage?: CustomImageRenderer;\r\n onImageLoad?: (img: HTMLImageElement | null) => void;\r\n}\r\n\r\nexport function BlurImage({\r\n src,\r\n alt,\r\n blurDataUrl,\r\n blurColor,\r\n blurHash,\r\n objectFit = 'cover',\r\n className = '',\r\n imageClassName = '',\r\n style,\r\n renderImage: propRenderImage,\r\n onImageLoad,\r\n}: BlurImageProps) {\r\n const ctx = useImageUploadContext();\r\n const renderImage = propRenderImage || ctx.renderImage;\r\n const [loadedSrc, setLoadedSrc] = useState<string | null>(null);\r\n const [failedSrc, setFailedSrc] = useState<string | null>(null);\r\n const imgRef = useRef<HTMLImageElement | null>(null);\r\n const onImageLoadRef = useRef(onImageLoad);\r\n onImageLoadRef.current = onImageLoad;\r\n\r\n const decodedHashUrl = useMemo(() => {\r\n if (blurDataUrl || !blurHash) return null;\r\n return decodeBlurHashToDataURL(blurHash, 32, 32);\r\n }, [blurDataUrl, blurHash]);\r\n\r\n const effectiveBlurUrl = blurDataUrl || decodedHashUrl || undefined;\r\n const isLoaded = loadedSrc === src;\r\n const hasFailed = failedSrc === src;\r\n\r\n useEffect(() => {\r\n const el = imgRef.current;\r\n if (el && el.complete && el.naturalWidth > 0) {\r\n setLoadedSrc(src);\r\n onImageLoadRef.current?.(el);\r\n }\r\n }, [src]);\r\n\r\n const imgStyle: CSSProperties = {\r\n width: '100%',\r\n height: '100%',\r\n objectFit,\r\n opacity: isLoaded || hasFailed || !effectiveBlurUrl ? 1 : 0,\r\n transition: 'opacity 0.28s ease-out',\r\n };\r\n\r\n const escapedBlurUrl = effectiveBlurUrl ? effectiveBlurUrl.replace(/\"/g, '\\\\\"') : undefined;\r\n\r\n return (\r\n <div\r\n className={`iuk-blur-image-wrap ${className}`.trim()}\r\n style={{\r\n backgroundColor: blurColor || 'var(--iuk-placeholder-bg, #f3f4f6)',\r\n ...style,\r\n }}\r\n >\r\n {escapedBlurUrl && (\r\n <div\r\n aria-hidden=\"true\"\r\n className={`iuk-blur-image-backdrop ${isLoaded ? 'iuk-blur-image-backdrop--hidden' : ''}`}\r\n style={{\r\n backgroundImage: `url(\"${escapedBlurUrl}\")`,\r\n backgroundSize: objectFit === 'contain' ? 'contain' : 'cover',\r\n }}\r\n />\r\n )}\r\n\r\n {renderImage ? (\r\n renderImage({\r\n src,\r\n alt,\r\n className: `iuk-blur-image-el ${imageClassName}`.trim(),\r\n style: imgStyle,\r\n onLoad: (el) => {\r\n setLoadedSrc(src);\r\n onImageLoadRef.current?.(el);\r\n },\r\n })\r\n ) : (\r\n <img\r\n ref={imgRef}\r\n src={src}\r\n alt={alt}\r\n loading=\"lazy\"\r\n decoding=\"async\"\r\n className={`iuk-blur-image-el ${imageClassName}`.trim()}\r\n style={imgStyle}\r\n onLoad={(e) => {\r\n setLoadedSrc(src);\r\n onImageLoadRef.current?.(e.currentTarget);\r\n }}\r\n onError={() => {\r\n setFailedSrc(src);\r\n }}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default BlurImage;\r\n","import { type CSSProperties, type SyntheticEvent, useMemo } from 'react';\r\nimport { cx } from '../../utils/slotStyles';\r\nimport {\r\n DEFAULT_NEUTRAL_COLORS,\r\n resolveBackgroundColor,\r\n resolveIntrinsicPlaceholderUrl,\r\n resolvePlaceholderUrl,\r\n} from './placeholder';\r\nimport type { AnimatedImageObjectFit, AnimatedImageProps } from './types';\r\nimport { useImageReveal } from './useImageReveal';\r\n\r\nconst preventDrag = (event: SyntheticEvent) => event.preventDefault();\r\nconst cn = (...classes: Parameters<typeof cx>) => cx(...classes) || undefined;\r\n\r\n/**\r\n * Blur-up image with a smooth, GPU-friendly crossfade and subtle zoom reveal.\r\n * Matches the Imagine-Global reference design while remaining pure React,\r\n * SSR-safe, and framework-agnostic — plug in `next/image` via `as`.\r\n */\r\nexport function AnimatedImage({\r\n image,\r\n src: srcProp,\r\n alt: altProp,\r\n blurDataUrl: blurDataUrlProp,\r\n blurHash: blurHashProp,\r\n blurColor: blurColorProp,\r\n colorPlaceholder = 'flat',\r\n neutralColors = DEFAULT_NEUTRAL_COLORS,\r\n width: widthProp,\r\n height: heightProp,\r\n fill = false,\r\n priority,\r\n quality,\r\n objectFit = 'cover',\r\n objectPosition = 'center',\r\n showShimmer = false,\r\n animationDuration = 600,\r\n revealScale = 1.02,\r\n fallbackSrc,\r\n renderError,\r\n as: ImageComponent,\r\n imageComponentProps,\r\n unstyled = false,\r\n wrapperClassName,\r\n wrapperStyle,\r\n wrapperProps,\r\n placeholderClassName,\r\n className,\r\n style,\r\n loading: loadingProp,\r\n decoding = 'async',\r\n draggable = false,\r\n onLoad,\r\n onError,\r\n ...imgProps\r\n}: AnimatedImageProps) {\r\n const src = srcProp ?? image?.url ?? '';\r\n const alt = altProp ?? image?.altText ?? '';\r\n const blurDataUrl = blurDataUrlProp ?? image?.blurDataUrl;\r\n const blurHash = blurHashProp ?? image?.blurHash;\r\n const blurColor = blurColorProp ?? image?.blurColor;\r\n const width = widthProp ?? (!fill ? image?.width : undefined);\r\n const height = heightProp ?? (!fill ? image?.height : undefined);\r\n\r\n const {\r\n activeSrc,\r\n retryKey,\r\n isLoaded,\r\n showPlaceholder,\r\n hasError,\r\n imgRef,\r\n handleLoad,\r\n handleError,\r\n retry,\r\n } = useImageReveal({\r\n srcKey: src,\r\n fallbackSrc,\r\n animationDuration,\r\n onLoad,\r\n });\r\n\r\n const state = hasError ? 'error' : isLoaded ? 'loaded' : 'loading';\r\n const resolvedObjectFit =\r\n (style?.objectFit as AnimatedImageObjectFit | undefined) ?? objectFit;\r\n const isContain = resolvedObjectFit === 'contain';\r\n\r\n const placeholderUrl = useMemo(\r\n () =>\r\n colorPlaceholder === 'gradient' || isContain\r\n ? resolvePlaceholderUrl({ blurDataUrl, blurHash, blurColor, neutralColors })\r\n : resolveIntrinsicPlaceholderUrl({ blurDataUrl, blurHash }),\r\n [blurDataUrl, blurHash, blurColor, colorPlaceholder, isContain, neutralColors],\r\n );\r\n const cls = (name: string) => (unstyled ? undefined : name);\r\n const duration = Math.max(0, animationDuration);\r\n const placeholderFadeDuration = Math.round(duration * (5 / 6));\r\n\r\n const containerStyle: CSSProperties = {\r\n backgroundColor:\r\n resolveBackgroundColor(blurColor, neutralColors) ??\r\n (unstyled\r\n ? undefined\r\n : 'var(--iuk-animated-image-bg, var(--background-card, rgba(38, 45, 56, 0.4)))'),\r\n ...(unstyled\r\n ? undefined\r\n : {\r\n ['--iuk-animated-image-duration' as string]: `${duration}ms`,\r\n ['--iuk-ai-ph-dur' as string]: `${placeholderFadeDuration}ms`,\r\n ['--iuk-animated-image-reveal-scale' as string]: String(revealScale),\r\n }),\r\n ...wrapperStyle,\r\n };\r\n\r\n const placeholderStyle: CSSProperties = {\r\n objectFit: 'cover',\r\n transitionDuration: `${placeholderFadeDuration}ms`,\r\n };\r\n\r\n const imageStyle: CSSProperties = {\r\n objectFit: resolvedObjectFit,\r\n objectPosition,\r\n transitionDuration: `${duration}ms`,\r\n ...style,\r\n ...(hasError ? { opacity: 0, visibility: 'hidden' as const } : undefined),\r\n };\r\n\r\n const isCustom = Boolean(ImageComponent);\r\n const loadingAttr = priority\r\n ? isCustom\r\n ? undefined\r\n : 'eager'\r\n : (loadingProp ?? (isCustom ? undefined : 'lazy'));\r\n\r\n const priorityProps = isCustom\r\n ? {\r\n ...(priority !== undefined ? { priority } : {}),\r\n ...(quality !== undefined ? { quality } : {}),\r\n }\r\n : priority\r\n ? { fetchPriority: 'high' as const }\r\n : {};\r\n\r\n const derivedImageSrcSet =\r\n !isCustom && activeSrc === src\r\n ? (image?.srcSet ??\r\n (image?.variants?.length\r\n ? [\r\n ...[...image.variants]\r\n .sort((a, b) => a.width - b.width)\r\n .map((v) => `${v.url} ${v.width}w`),\r\n ...(image.width ? [`${src} ${image.width}w`] : []),\r\n ].join(', ')\r\n : undefined))\r\n : undefined;\r\n const resolvedSrcSet = imgProps.srcSet ?? derivedImageSrcSet;\r\n const resolvedSizes =\r\n !isCustom && resolvedSrcSet && fill && imgProps.sizes === undefined\r\n ? '100vw'\r\n : imgProps.sizes;\r\n\r\n const sharedImgProps = {\r\n ...priorityProps,\r\n ...imgProps,\r\n ...(resolvedSrcSet !== undefined ? { srcSet: resolvedSrcSet } : {}),\r\n ...(resolvedSizes !== undefined ? { sizes: resolvedSizes } : {}),\r\n ...(width !== undefined ? { width } : {}),\r\n ...(height !== undefined ? { height } : {}),\r\n ...(loadingAttr !== undefined ? { loading: loadingAttr } : {}),\r\n src: activeSrc,\r\n alt,\r\n decoding,\r\n draggable,\r\n ref: imgRef,\r\n className: cn(cls('iuk-animated-image__img'), className),\r\n style: imageStyle,\r\n 'data-state': state,\r\n onDragStart: imgProps.onDragStart ?? preventDrag,\r\n onLoad: (event: SyntheticEvent<HTMLImageElement>) =>\r\n handleLoad(event.currentTarget),\r\n onError: (event: SyntheticEvent<HTMLImageElement, Event>) => {\r\n const isTerminal = handleError();\r\n if (isTerminal) {\r\n onError?.(event);\r\n }\r\n },\r\n };\r\n\r\n return (\r\n <div\r\n {...wrapperProps}\r\n className={cn(\r\n cls('iuk-animated-image'),\r\n fill && cls('iuk-animated-image--fill'),\r\n isContain && cls('iuk-animated-image--contain'),\r\n wrapperClassName,\r\n wrapperProps?.className,\r\n )}\r\n style={{ ...containerStyle, ...wrapperProps?.style }}\r\n data-slot=\"animated-image\"\r\n data-state={state}\r\n aria-busy={state === 'loading' || undefined}\r\n >\r\n {(showPlaceholder || isContain) && placeholderUrl && (\r\n <img\r\n src={placeholderUrl}\r\n alt=\"\"\r\n aria-hidden=\"true\"\r\n draggable={false}\r\n onDragStart={preventDrag}\r\n data-slot=\"animated-image-placeholder\"\r\n className={cn(\r\n cls('iuk-animated-image__placeholder'),\r\n isLoaded && !isContain && cls('iuk-animated-image__placeholder--hidden'),\r\n placeholderClassName,\r\n )}\r\n style={placeholderStyle}\r\n />\r\n )}\r\n\r\n {showShimmer && !isLoaded && !hasError && (\r\n <div\r\n aria-hidden=\"true\"\r\n data-slot=\"animated-image-shimmer\"\r\n className={cn(cls('iuk-animated-image__shimmer'))}\r\n />\r\n )}\r\n\r\n {ImageComponent ? (\r\n <ImageComponent\r\n key={retryKey > 0 ? retryKey : undefined}\r\n {...sharedImgProps}\r\n {...(fill ? { fill: true } : {})}\r\n {...imageComponentProps}\r\n />\r\n ) : (\r\n <img key={retryKey > 0 ? retryKey : undefined} {...sharedImgProps} />\r\n )}\r\n\r\n {hasError && renderError ? renderError({ src: activeSrc, retry }) : null}\r\n </div>\r\n );\r\n}\r\n\r\nexport default AnimatedImage;\r\n","import { decodeBlurHashToDataURL } from '../../../blur/blurDataUtils';\r\n\r\n/**\r\n * Default neutral colors that carry no real information about the image (common\r\n * DB defaults or \"empty\" values). Ignored by default so placeholders never\r\n * flash pitch-black or stark white unless `neutralColors={[]}` is passed.\r\n */\r\nexport const DEFAULT_NEUTRAL_COLORS = [\r\n '#1a1a1a',\r\n '#121212',\r\n '#000000',\r\n '#000',\r\n '#e5e7eb',\r\n '#ffffff',\r\n '#fff',\r\n] as const;\r\n\r\nconst HEX_COLOR = /^#(?:[0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\r\nconst FUNC_COLOR = /^(?:rgb|rgba|hsl|hsla|oklch|oklab)\\([\\d\\s.,%/+-]+\\)$/i;\r\nconst CSS_VAR_COLOR = /^var\\(--[a-zA-Z0-9_-]+(?:\\s*,\\s*[^;{}<>()]+)?\\)$/;\r\n\r\nfunction isNeutralColor(value: string, neutralColors: readonly string[]): boolean {\r\n if (neutralColors.length === 0) return false;\r\n const lower = value.toLowerCase();\r\n for (const item of neutralColors) {\r\n if (item.toLowerCase() === lower) return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Returns a safe, meaningful literal color (`#hex`, `rgb(...)`, `hsl(...)`, `oklch(...)`)\r\n * suitable for inline SVG embedding, or `undefined` when empty/neutral/invalid.\r\n * Rejects CSS variables (`var(--*)`) because SVG data URLs cannot resolve host DOM tokens.\r\n */\r\nexport function resolveMeaningfulColor(\r\n color?: string | null,\r\n neutralColors: readonly string[] = DEFAULT_NEUTRAL_COLORS,\r\n): string | undefined {\r\n const value = color?.trim();\r\n if (!value) return undefined;\r\n if (isNeutralColor(value, neutralColors)) return undefined;\r\n if (!HEX_COLOR.test(value) && !FUNC_COLOR.test(value)) return undefined;\r\n return value;\r\n}\r\n\r\n/**\r\n * Returns a safe CSS background-color value for the wrapper element.\r\n * Accepts literal colors AND safe CSS custom property expressions (`var(--token)`),\r\n * while rejecting neutral defaults and CSS injection payloads.\r\n */\r\nexport function resolveBackgroundColor(\r\n color?: string | null,\r\n neutralColors: readonly string[] = DEFAULT_NEUTRAL_COLORS,\r\n): string | undefined {\r\n const value = color?.trim();\r\n if (!value) return undefined;\r\n if (isNeutralColor(value, neutralColors)) return undefined;\r\n if (HEX_COLOR.test(value) || FUNC_COLOR.test(value) || CSS_VAR_COLOR.test(value)) {\r\n return value;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Inline SVG data URL that renders a soft gradient placeholder.\r\n * Uses the dominant color when provided, otherwise a neutral slate gradient.\r\n */\r\nexport function createFallbackBlurSvg(\r\n color?: string | null,\r\n neutralColors: readonly string[] = DEFAULT_NEUTRAL_COLORS,\r\n): string {\r\n const meaningful = resolveMeaningfulColor(color, neutralColors);\r\n const stop1 = meaningful ?? '#2c3340';\r\n const stop2 = meaningful ? '#0f172a' : '#1e242d';\r\n const svg =\r\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\" width=\"100%\" height=\"100%\">' +\r\n '<defs>' +\r\n '<linearGradient id=\"g\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">' +\r\n `<stop offset=\"0%\" stop-color=\"${stop1}\" stop-opacity=\"1\"/>` +\r\n `<stop offset=\"55%\" stop-color=\"${stop1}\" stop-opacity=\"0.78\"/>` +\r\n `<stop offset=\"100%\" stop-color=\"${stop2}\" stop-opacity=\"0.96\"/>` +\r\n '</linearGradient>' +\r\n '<radialGradient id=\"h\" cx=\"24%\" cy=\"22%\" r=\"65%\">' +\r\n '<stop offset=\"0%\" stop-color=\"#ffffff\" stop-opacity=\"0.22\"/>' +\r\n '<stop offset=\"100%\" stop-color=\"#ffffff\" stop-opacity=\"0\"/>' +\r\n '</radialGradient>' +\r\n '</defs>' +\r\n '<rect width=\"100%\" height=\"100%\" fill=\"url(#g)\"/>' +\r\n '<rect width=\"100%\" height=\"100%\" fill=\"url(#h)\"/>' +\r\n '</svg>';\r\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\r\n}\r\n\r\nexport interface PlaceholderSources {\r\n blurDataUrl?: string | null;\r\n blurHash?: string | null;\r\n blurColor?: string | null;\r\n neutralColors?: readonly string[];\r\n}\r\n\r\n/**\r\n * Resolves an intrinsic image placeholder (`blurDataUrl` or decoded `blurHash`)\r\n * without falling back to an SVG gradient. Returns `undefined` when neither is present.\r\n */\r\nexport function resolveIntrinsicPlaceholderUrl({\r\n blurDataUrl,\r\n blurHash,\r\n}: Pick<PlaceholderSources, 'blurDataUrl' | 'blurHash'>): string | undefined {\r\n const dataUrl = blurDataUrl?.trim();\r\n if (dataUrl) return dataUrl;\r\n if (blurHash && typeof document !== 'undefined') {\r\n try {\r\n const decoded = decodeBlurHashToDataURL(blurHash, 32, 32);\r\n if (decoded) return decoded;\r\n } catch {\r\n // Invalid hash: ignore.\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Resolves the best available placeholder URL in priority order:\r\n * 1. `blurDataUrl` (LQIP data URL / remote URL)\r\n * 2. `blurHash` (decoded client-side; browser only)\r\n * 3. Gradient SVG derived from `blurColor` (or neutral fallback)\r\n */\r\nexport function resolvePlaceholderUrl({\r\n blurDataUrl,\r\n blurHash,\r\n blurColor,\r\n neutralColors = DEFAULT_NEUTRAL_COLORS,\r\n}: PlaceholderSources): string {\r\n const intrinsic = resolveIntrinsicPlaceholderUrl({ blurDataUrl, blurHash });\r\n if (intrinsic) return intrinsic;\r\n return createFallbackBlurSvg(blurColor, neutralColors);\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from 'react';\r\n\r\nexport interface UseImageRevealOptions {\r\n /** Identity of the primary source; a change resets the reveal state. */\r\n srcKey: string;\r\n /** Optional fallback URL tried once if `srcKey` fails to load. */\r\n fallbackSrc?: string;\r\n /** Crossfade duration in ms. */\r\n animationDuration: number;\r\n onLoad?: (img: HTMLImageElement | null) => void;\r\n}\r\n\r\nexport interface ImageRevealState {\r\n /** Active image URL (`srcKey` initially, or `fallbackSrc` after primary failure). */\r\n activeSrc: string;\r\n /** Monotonic counter incremented when `retry()` is invoked. */\r\n retryKey: number;\r\n /** True once the sharp image is decoded and ready to fade in. */\r\n isLoaded: boolean;\r\n /** Whether the placeholder layer is still mounted (kept until fade completes, or on error). */\r\n showPlaceholder: boolean;\r\n /** True when the image (and optional `fallbackSrc`) failed to load. */\r\n hasError: boolean;\r\n /** Callback ref to attach to the underlying `<img>` element. */\r\n imgRef: (node: HTMLImageElement | null) => void;\r\n handleLoad: (img?: HTMLImageElement | null) => void;\r\n /** Returns `true` if the error is terminal, or `false` if switching to `fallbackSrc`. */\r\n handleError: () => boolean;\r\n /** Resets error state and retries loading from the primary `srcKey`. */\r\n retry: () => void;\r\n}\r\n\r\nconst PLACEHOLDER_UNMOUNT_BUFFER_MS = 50;\r\n\r\n/**\r\n * Framework-agnostic reveal state machine for blur-up images:\r\n * - resets synchronously when `srcKey` changes (no stale 1-frame flash)\r\n * - pre-decodes via `HTMLImageElement.decode()` before crossfading\r\n * - detects already-cached images after the first paint\r\n * - unmounts placeholder after crossfade (`animationDuration + 50ms`)\r\n * - on error: tries `fallbackSrc` once if provided; on terminal error keeps placeholder visible\r\n */\r\nexport function useImageReveal({\r\n srcKey,\r\n fallbackSrc,\r\n animationDuration,\r\n onLoad,\r\n}: UseImageRevealOptions): ImageRevealState {\r\n const [prevSrc, setPrevSrc] = useState(srcKey);\r\n const [usingFallback, setUsingFallback] = useState(false);\r\n const [retryKey, setRetryKey] = useState(0);\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n const [showPlaceholder, setShowPlaceholder] = useState(true);\r\n const [hasError, setHasError] = useState(false);\r\n const [node, setNode] = useState<HTMLImageElement | null>(null);\r\n\r\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const mountedRef = useRef(true);\r\n const activeSrc = usingFallback && fallbackSrc ? fallbackSrc : srcKey;\r\n const activeSrcRef = useRef(activeSrc);\r\n const onLoadRef = useRef(onLoad);\r\n\r\n useEffect(() => {\r\n onLoadRef.current = onLoad;\r\n }, [onLoad]);\r\n\r\n const clearTimer = useCallback(() => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n timeoutRef.current = null;\r\n }\r\n }, []);\r\n\r\n if (prevSrc !== srcKey) {\r\n setPrevSrc(srcKey);\r\n setUsingFallback(false);\r\n setIsLoaded(false);\r\n setShowPlaceholder(true);\r\n setHasError(false);\r\n }\r\n\r\n useEffect(() => {\r\n activeSrcRef.current = activeSrc;\r\n clearTimer();\r\n }, [activeSrc, clearTimer]);\r\n\r\n useEffect(() => {\r\n mountedRef.current = true;\r\n return () => {\r\n mountedRef.current = false;\r\n clearTimer();\r\n };\r\n }, [clearTimer]);\r\n\r\n const handleLoad = useCallback(\r\n (img?: HTMLImageElement | null) => {\r\n const el = img ?? node;\r\n const loadedFor = activeSrcRef.current;\r\n const reveal = () => {\r\n if (!mountedRef.current || loadedFor !== activeSrcRef.current) return;\r\n setHasError(false);\r\n setIsLoaded(true);\r\n clearTimer();\r\n const duration = Math.max(0, animationDuration);\r\n timeoutRef.current = setTimeout(() => {\r\n if (mountedRef.current) setShowPlaceholder(false);\r\n timeoutRef.current = null;\r\n }, duration + PLACEHOLDER_UNMOUNT_BUFFER_MS);\r\n onLoadRef.current?.(el ?? null);\r\n };\r\n if (el && typeof el.decode === 'function') {\r\n el.decode().then(reveal, reveal);\r\n } else {\r\n reveal();\r\n }\r\n },\r\n [animationDuration, clearTimer, node],\r\n );\r\n\r\n const handleError = useCallback((): boolean => {\r\n if (!mountedRef.current) return false;\r\n clearTimer();\r\n if (fallbackSrc && !usingFallback && fallbackSrc !== srcKey) {\r\n setUsingFallback(true);\r\n setIsLoaded(false);\r\n setShowPlaceholder(true);\r\n setHasError(false);\r\n return false;\r\n }\r\n setHasError(true);\r\n setIsLoaded(false);\r\n setShowPlaceholder(true);\r\n return true;\r\n }, [clearTimer, fallbackSrc, srcKey, usingFallback]);\r\n\r\n const retry = useCallback(() => {\r\n clearTimer();\r\n setUsingFallback(false);\r\n setHasError(false);\r\n setIsLoaded(false);\r\n setShowPlaceholder(true);\r\n setRetryKey((prev) => prev + 1);\r\n }, [clearTimer]);\r\n\r\n useEffect(() => {\r\n if (!node || !node.complete || node.naturalWidth === 0) return;\r\n if (typeof requestAnimationFrame !== 'function') {\r\n handleLoad(node);\r\n return;\r\n }\r\n const rafId = requestAnimationFrame(() => handleLoad(node));\r\n return () => cancelAnimationFrame(rafId);\r\n }, [node, activeSrc, retryKey, handleLoad]);\r\n\r\n return {\r\n activeSrc,\r\n retryKey,\r\n isLoaded,\r\n showPlaceholder,\r\n hasError,\r\n imgRef: setNode,\r\n handleLoad,\r\n handleError,\r\n retry,\r\n };\r\n}\r\n","import { useEffect } from 'react';\r\nimport { blurService } from '../../blur/blurService';\r\n\r\ntype DebugWindow = Window & { blurService?: typeof blurService };\r\n\r\n/**\r\n * Development helper: exposes the shared `blurService` singleton as\r\n * `window.blurService` while mounted, for inspection in the browser console.\r\n * Does not augment the global `Window` type of consuming apps.\r\n */\r\nexport function BlurServiceDebugger() {\r\n useEffect(() => {\r\n if (typeof window === 'undefined') return undefined;\r\n const target = window as DebugWindow;\r\n target.blurService = blurService;\r\n return () => {\r\n if (target.blurService === blurService) {\r\n delete target.blurService;\r\n }\r\n };\r\n }, []);\r\n\r\n return null;\r\n}\r\n\r\nexport default BlurServiceDebugger;\r\n","import { EyeIcon as Eye, XIcon as X } from '../icons';\r\nimport type { ChangeEvent, PointerEvent as ReactPointerEvent } from 'react';\r\nimport { useEffect, useId, useMemo, useRef, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport type { UploadLocale } from '../../types';\r\nimport { normalizeColorInput } from '../../utils/color';\r\nimport { formatFileSize } from '../../utils/formatters';\r\nimport { useImageUploadContext } from '../context';\r\nimport { useDialog } from '../hooks/useDialog';\r\nimport { normalizeUploadLocale, resolveTranslations, type UploadTranslations } from '../i18n';\r\nimport type { CustomImageRenderer } from '../types';\r\nimport { drawImageToCanvas, sampleCanvasPixelHex } from '../utils/canvasSampler';\r\nimport { resolveSlotClass } from '../utils/slotStyles';\r\nimport { BlurColorControls } from './BlurColorControls';\r\nimport { BlurImage } from './BlurImage';\r\nimport { SaveButton } from './SaveButton';\r\n\r\nconst DEBOUNCE_MS = 250;\r\n\r\nexport interface BlurVisualizationModalProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n imageUrl: string;\r\n blurDataUrl?: string;\r\n blurColor?: string;\r\n altText?: string;\r\n originalSize?: number;\r\n optimizedSize?: number | null;\r\n detectedColor?: string;\r\n onChangeColor?: (hex: string) => void;\r\n onUseDetectedColor?: () => void;\r\n onChangeAltText?: (altText: string) => void;\r\n locale?: UploadLocale;\r\n translations?: Partial<UploadTranslations>;\r\n renderImage?: CustomImageRenderer;\r\n unstyled?: boolean;\r\n}\r\n\r\nexport function BlurVisualizationModal({\r\n isOpen, onClose, imageUrl, blurDataUrl, blurColor, altText,\r\n originalSize, optimizedSize, detectedColor, onChangeColor,\r\n onUseDetectedColor, onChangeAltText, locale: propLocale,\r\n translations, renderImage, unstyled: propUnstyled,\r\n}: BlurVisualizationModalProps) {\r\n const ctx = useImageUploadContext();\r\n const isUnstyled = propUnstyled ?? ctx.unstyled;\r\n const locale = normalizeUploadLocale(propLocale || ctx.locale);\r\n const tModal = resolveTranslations(locale, translations || ctx.translations).blurModal;\r\n const cls = (defaultClass: string) => resolveSlotClass(defaultClass, isUnstyled);\r\n\r\n const { dialogRef, titleId } = useDialog({ isOpen, onClose });\r\n const textareaId = useId();\r\n\r\n const baseColor = useMemo(() => (blurColor || detectedColor || '#F5F5F5').toUpperCase(), [blurColor, detectedColor]);\r\n const [localColor, setLocalColor] = useState(baseColor);\r\n const [hexInput, setHexInput] = useState(baseColor.replace('#', ''));\r\n const [sampledColor, setSampledColor] = useState<string | null>(null);\r\n const [penModeActive, setPenModeActive] = useState(false);\r\n const [localAltText, setLocalAltText] = useState(altText || '');\r\n const liveCanvasRef = useRef<HTMLCanvasElement | null>(null);\r\n const colorTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const altTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const pendingColorRef = useRef<string | null>(null);\r\n const pendingAltRef = useRef<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n setLocalColor(baseColor);\r\n setHexInput(baseColor.replace('#', ''));\r\n setLocalAltText(altText || '');\r\n }, [isOpen, baseColor, altText, blurDataUrl, imageUrl, blurColor]);\r\n\r\n useEffect(() => () => {\r\n if (colorTimerRef.current) clearTimeout(colorTimerRef.current);\r\n if (altTimerRef.current) clearTimeout(altTimerRef.current);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n const srcToLoad = imageUrl || blurDataUrl;\r\n if (!srcToLoad) return;\r\n const img = new window.Image();\r\n img.crossOrigin = 'anonymous';\r\n img.onload = () => drawImageToCanvas(img, liveCanvasRef);\r\n img.onerror = () => {\r\n if (blurDataUrl && srcToLoad !== blurDataUrl) {\r\n const fallbackImg = new window.Image();\r\n fallbackImg.onload = () => drawImageToCanvas(fallbackImg, liveCanvasRef);\r\n fallbackImg.src = blurDataUrl;\r\n }\r\n };\r\n img.src = srcToLoad;\r\n return () => { img.onload = null; img.onerror = null; };\r\n }, [imageUrl, blurDataUrl, isOpen]);\r\n\r\n useEffect(() => {\r\n if (!sampledColor) return;\r\n const timer = window.setTimeout(() => setSampledColor(null), 2000);\r\n return () => window.clearTimeout(timer);\r\n }, [sampledColor]);\r\n\r\n if (!isOpen || typeof document === 'undefined') return null;\r\n\r\n const scheduleColorEmit = (hex: string) => {\r\n pendingColorRef.current = hex;\r\n if (colorTimerRef.current) clearTimeout(colorTimerRef.current);\r\n colorTimerRef.current = setTimeout(() => {\r\n colorTimerRef.current = null;\r\n const next = pendingColorRef.current;\r\n pendingColorRef.current = null;\r\n if (next !== null) onChangeColor?.(next);\r\n }, DEBOUNCE_MS);\r\n };\r\n\r\n const scheduleAltEmit = (nextAlt: string) => {\r\n pendingAltRef.current = nextAlt;\r\n if (altTimerRef.current) clearTimeout(altTimerRef.current);\r\n altTimerRef.current = setTimeout(() => {\r\n altTimerRef.current = null;\r\n const next = pendingAltRef.current;\r\n pendingAltRef.current = null;\r\n if (next !== null) onChangeAltText?.(next);\r\n }, DEBOUNCE_MS);\r\n };\r\n\r\n const flushPendingChanges = () => {\r\n if (colorTimerRef.current) {\r\n clearTimeout(colorTimerRef.current);\r\n colorTimerRef.current = null;\r\n }\r\n if (pendingColorRef.current !== null) {\r\n onChangeColor?.(pendingColorRef.current);\r\n pendingColorRef.current = null;\r\n }\r\n if (altTimerRef.current) {\r\n clearTimeout(altTimerRef.current);\r\n altTimerRef.current = null;\r\n }\r\n if (pendingAltRef.current !== null) {\r\n onChangeAltText?.(pendingAltRef.current);\r\n pendingAltRef.current = null;\r\n }\r\n };\r\n\r\n const handleClose = () => {\r\n flushPendingChanges();\r\n onClose();\r\n };\r\n\r\n const syncLocalHex = (hex: string, notify = true) => {\r\n setLocalColor(hex);\r\n setHexInput(hex.replace('#', ''));\r\n if (notify) scheduleColorEmit(hex);\r\n };\r\n\r\n const handleColorPickerChange = (e: ChangeEvent<HTMLInputElement>) => syncLocalHex(e.target.value.toUpperCase());\r\n\r\n const handleHexInputChange = (event: ChangeEvent<HTMLInputElement>) => {\r\n const sanitized = event.target.value.replace(/[^0-9a-fA-F]/g, '').slice(0, 6);\r\n setHexInput(sanitized.toUpperCase());\r\n if (sanitized.length === 3 || sanitized.length === 6) {\r\n const normalized = normalizeColorInput(`#${sanitized}`);\r\n if (normalized) {\r\n setLocalColor(normalized);\r\n scheduleColorEmit(normalized);\r\n }\r\n }\r\n };\r\n\r\n const handlePenSample = (event: ReactPointerEvent<HTMLDivElement>) => {\r\n if (!penModeActive) {\r\n if (event.pointerType === 'pen') setPenModeActive(true);\r\n else return;\r\n }\r\n const sampled = sampleCanvasPixelHex(event, liveCanvasRef);\r\n if (!sampled) return;\r\n setSampledColor(sampled);\r\n syncLocalHex(sampled);\r\n };\r\n\r\n const handleUseDetectedColor = () => {\r\n if (!detectedColor) return;\r\n if (colorTimerRef.current) {\r\n clearTimeout(colorTimerRef.current);\r\n colorTimerRef.current = null;\r\n pendingColorRef.current = null;\r\n }\r\n const normalized = normalizeColorInput(detectedColor) || detectedColor.toUpperCase();\r\n setLocalColor(normalized);\r\n setHexInput(normalized.replace('#', ''));\r\n if (onUseDetectedColor) onUseDetectedColor();\r\n else onChangeColor?.(normalized);\r\n };\r\n\r\n const displayColor = localColor || blurColor || '#F5F5F5';\r\n\r\n return createPortal(\r\n <div\r\n data-slot=\"blur-modal-backdrop\"\r\n data-unstyled={isUnstyled || undefined}\r\n className={cls('iuk-modal-backdrop')}\r\n dir={locale === 'ar' ? 'rtl' : 'ltr'}\r\n onClick={handleClose}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby={titleId}\r\n >\r\n <div\r\n ref={dialogRef}\r\n data-slot=\"blur-modal\"\r\n className={cls('iuk-blur-modal')}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div className={cls('iuk-blur-modal__header')}>\r\n <div className={cls('iuk-blur-modal__title-row')}>\r\n <Eye size={20} className={cls('iuk-blur-modal__title-icon')} />\r\n <h2 id={titleId} className={cls('iuk-blur-modal__title')}>{tModal.title}</h2>\r\n {optimizedSize ? <span className={cls('iuk-badge')}>{formatFileSize(optimizedSize)}</span> : null}\r\n </div>\r\n <button type=\"button\" onClick={handleClose} className={cls('iuk-icon-btn')} aria-label={tModal.closeModal}>\r\n <X size={18} />\r\n </button>\r\n </div>\r\n\r\n <div className={cls('iuk-blur-modal__body')}>\r\n <div className={cls('iuk-blur-modal__grid')}>\r\n <BlurColorControls\r\n localColor={localColor} hexInput={hexInput} penModeActive={penModeActive}\r\n detectedColor={detectedColor} sampledColor={sampledColor} tModal={tModal}\r\n onColorPickerChange={handleColorPickerChange}\r\n onHexInputChange={handleHexInputChange}\r\n onTogglePenMode={() => setPenModeActive((prev) => !prev)}\r\n onUseDetectedColor={handleUseDetectedColor}\r\n />\r\n\r\n <div className={cls('iuk-blur-modal__preview-col')}>\r\n <h3 className={cls('iuk-blur-modal__section-title')}>{tModal.livePreview}</h3>\r\n <div\r\n className={cls(`iuk-blur-modal__stage ${penModeActive ? 'iuk-blur-modal__stage--sampling' : ''}`.trim())}\r\n style={{ backgroundColor: displayColor }}\r\n onPointerDown={handlePenSample}\r\n >\r\n <BlurImage\r\n src={imageUrl} alt={altText || tModal.livePreview}\r\n blurDataUrl={blurDataUrl} blurColor={displayColor}\r\n objectFit=\"contain\" renderImage={renderImage}\r\n onImageLoad={(img) => { if (img) drawImageToCanvas(img, liveCanvasRef); }}\r\n />\r\n {!blurDataUrl && <div className={cls('iuk-blur-modal__no-blur-note')}>{tModal.showingOriginal}</div>}\r\n </div>\r\n\r\n {optimizedSize && originalSize && originalSize > optimizedSize ? (\r\n <div className={cls('iuk-blur-modal__savings')}>\r\n <span>{tModal.saved}</span>\r\n <strong>\r\n {formatFileSize(originalSize - optimizedSize)} (\r\n {Math.round(((originalSize - optimizedSize) / originalSize) * 100)}%)\r\n </strong>\r\n </div>\r\n ) : null}\r\n </div>\r\n </div>\r\n\r\n <div className={cls('iuk-blur-modal__alt-section')}>\r\n <label htmlFor={textareaId} className={cls('iuk-blur-modal__section-title')}>\r\n {tModal.accessibility} — {tModal.altText}\r\n </label>\r\n <textarea\r\n id={textareaId}\r\n value={localAltText}\r\n onChange={(e) => { setLocalAltText(e.target.value); scheduleAltEmit(e.target.value); }}\r\n className={cls('iuk-blur-modal__textarea')}\r\n placeholder={tModal.altTextPlaceholder}\r\n rows={2}\r\n />\r\n </div>\r\n\r\n <canvas ref={liveCanvasRef} style={{ display: 'none' }} aria-hidden=\"true\" />\r\n </div>\r\n\r\n <div className={cls('iuk-blur-modal__footer')}>\r\n <SaveButton unstyled={isUnstyled} onClick={handleClose}>{tModal.saveAndClose}</SaveButton>\r\n </div>\r\n </div>\r\n </div>,\r\n document.body,\r\n );\r\n}\r\n\r\nexport default BlurVisualizationModal;\r\n","import type { PointerEvent as ReactPointerEvent, RefObject } from 'react';\nimport { rgbToHex } from '../../utils/color';\n\nexport function drawImageToCanvas(\n img: HTMLImageElement,\n canvasRef: RefObject<HTMLCanvasElement | null>,\n): void {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext('2d');\n if (!canvas || !ctx) return;\n const width = img.naturalWidth || img.width;\n const height = img.naturalHeight || img.height;\n if (!width || !height) return;\n canvas.width = width;\n canvas.height = height;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n try {\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n } catch {\n // Tainted cross-origin canvas ignored gracefully\n }\n}\n\nexport function sampleCanvasPixelHex(\n event: ReactPointerEvent<HTMLElement>,\n canvasRef: RefObject<HTMLCanvasElement | null>,\n): string | null {\n const canvas = canvasRef.current;\n const context = canvas?.getContext('2d');\n if (!canvas || !context || canvas.width === 0 || canvas.height === 0) {\n return null;\n }\n\n const rect = event.currentTarget.getBoundingClientRect();\n if (!rect.width || !rect.height) return null;\n\n const relX = (event.clientX - rect.left) / rect.width;\n const relY = (event.clientY - rect.top) / rect.height;\n if (relX < 0 || relY < 0 || relX > 1 || relY > 1) return null;\n\n const x = Math.min(\n Math.max(Math.floor(relX * canvas.width), 0),\n canvas.width - 1,\n );\n const y = Math.min(\n Math.max(Math.floor(relY * canvas.height), 0),\n canvas.height - 1,\n );\n\n let pixel: Uint8ClampedArray;\n try {\n pixel = context.getImageData(x, y, 1, 1).data;\n } catch {\n return null;\n }\n\n const [r, g, b, alpha] = pixel;\n if (alpha === 0) return null;\n\n return rgbToHex(r, g, b);\n}\n","import { PenToolIcon as PenTool, WandIcon as Wand2 } from '../icons';\r\nimport type { ChangeEvent } from 'react';\r\nimport type { BlurModalTranslations } from '../i18n';\r\n\r\nexport interface BlurColorControlsProps {\r\n localColor: string;\r\n hexInput: string;\r\n penModeActive: boolean;\r\n detectedColor?: string;\r\n sampledColor: string | null;\r\n tModal: BlurModalTranslations;\r\n onColorPickerChange: (event: ChangeEvent<HTMLInputElement>) => void;\r\n onHexInputChange: (event: ChangeEvent<HTMLInputElement>) => void;\r\n onTogglePenMode: () => void;\r\n onUseDetectedColor: () => void;\r\n}\r\n\r\nexport function BlurColorControls({\r\n localColor,\r\n hexInput,\r\n penModeActive,\r\n detectedColor,\r\n sampledColor,\r\n tModal,\r\n onColorPickerChange,\r\n onHexInputChange,\r\n onTogglePenMode,\r\n onUseDetectedColor,\r\n}: BlurColorControlsProps) {\r\n return (\r\n <div className=\"iuk-blur-modal__controls\">\r\n <h3 className=\"iuk-blur-modal__section-title\">{tModal.adjustColor}</h3>\r\n <p className=\"iuk-blur-modal__subtitle\">\r\n {penModeActive ? `🎨 ${tModal.clickToSample}` : tModal.pickColorNote}\r\n </p>\r\n\r\n <div className=\"iuk-blur-modal__picker-row\">\r\n <label className=\"iuk-blur-modal__color-well\">\r\n <input\r\n type=\"color\"\r\n value={localColor}\r\n onChange={onColorPickerChange}\r\n aria-label={tModal.adjustColor}\r\n />\r\n </label>\r\n\r\n <div className=\"iuk-blur-modal__hex-group\">\r\n <div className=\"iuk-blur-modal__hex-field\">\r\n <span>#</span>\r\n <input\r\n type=\"text\"\r\n value={hexInput}\r\n onChange={onHexInputChange}\r\n maxLength={6}\r\n spellCheck={false}\r\n aria-label={tModal.enterHexColor}\r\n placeholder={tModal.hexPlaceholder}\r\n />\r\n </div>\r\n <div className=\"iuk-blur-modal__swatch-chip\">\r\n <span\r\n className=\"iuk-blur-modal__swatch-dot\"\r\n style={{ backgroundColor: localColor }}\r\n aria-hidden=\"true\"\r\n />\r\n <code>{localColor}</code>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"iuk-blur-modal__actions-row\">\r\n <button\r\n type=\"button\"\r\n onClick={onTogglePenMode}\r\n className={`iuk-btn iuk-btn--secondary ${penModeActive ? 'iuk-btn--active' : ''}`}\r\n aria-label={\r\n penModeActive ? tModal.disablePenMode : tModal.enablePenMode\r\n }\r\n >\r\n <PenTool size={14} />\r\n <span>\r\n {penModeActive ? tModal.penModeActive : tModal.enablePenMode}\r\n </span>\r\n </button>\r\n\r\n {detectedColor && (\r\n <button\r\n type=\"button\"\r\n className=\"iuk-btn iuk-btn--secondary\"\r\n onClick={onUseDetectedColor}\r\n >\r\n <Wand2 size={14} />\r\n <span>{tModal.resetToDetected}</span>\r\n <code>{detectedColor.toUpperCase()}</code>\r\n </button>\r\n )}\r\n\r\n {sampledColor && (\r\n <span className=\"iuk-badge iuk-badge--accent\">\r\n <PenTool size={12} />\r\n <span>\r\n {tModal.sampled} {sampledColor}\r\n </span>\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { resolveSlotClass } from '../utils/slotStyles';\n\nexport interface SaveButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: ReactNode;\n unstyled?: boolean;\n children: ReactNode;\n}\n\nexport function SaveButton({\n icon,\n unstyled = false,\n children,\n className = '',\n type = 'button',\n ...rest\n}: SaveButtonProps) {\n return (\n <button\n type={type}\n className={resolveSlotClass('iuk-save-button', unstyled, className)}\n {...rest}\n >\n {icon && (\n <span className={resolveSlotClass('iuk-save-button__icon', unstyled)}>\n {icon}\n </span>\n )}\n <span>{children}</span>\n </button>\n );\n}\n\nexport default SaveButton;\n","import {\r\n ChevronUpIcon as ChevronUp,\r\n LoaderIcon as Loader2,\r\n MinusIcon as Minus,\r\n XIcon as X,\r\n} from '../icons';\r\nimport {\r\n type ForwardedRef,\r\n forwardRef,\r\n type ReactElement,\r\n type Ref,\r\n useEffect,\r\n useState,\r\n} from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport type { UploadPresetName } from '../../types';\r\nimport { useImageUploadContext } from '../context';\r\nimport { useDialog } from '../hooks/useDialog';\r\nimport { normalizeUploadLocale, resolveTranslations } from '../i18n';\r\nimport type {\r\n ImageUploadHandle,\r\n ImageUploadProps,\r\n MultiImageUploadProps,\r\n SingleImageUploadProps,\r\n} from '../types';\r\nimport { resolveSlotClass } from '../utils/slotStyles';\r\nimport { MultiImageUpload } from './MultiImageUpload';\r\nimport { SingleImageUpload } from './SingleImageUpload';\r\n\r\nfunction ImageUploadInner<TPreset extends string = UploadPresetName>(\r\n props: ImageUploadProps<TPreset>,\r\n ref: ForwardedRef<ImageUploadHandle>,\r\n) {\r\n const ctx = useImageUploadContext();\r\n const isUnstyled = props.unstyled ?? ctx.unstyled;\r\n const uploadLocale = normalizeUploadLocale(props.locale || ctx.locale);\r\n const ui = resolveTranslations(\r\n uploadLocale,\r\n props.translations || ctx.translations,\r\n );\r\n const dir = uploadLocale === 'ar' ? 'rtl' : 'ltr';\r\n const { isOpen, onClose, title, modeVariant } = props;\r\n const [isMinimized, setIsMinimized] = useState(false);\r\n const [dockNode, setDockNode] = useState<HTMLElement | null>(null);\r\n const cls = (defaultClass: string) => resolveSlotClass(defaultClass, isUnstyled);\r\n\r\n useEffect(() => {\r\n if (!isOpen) {\r\n setIsMinimized(false);\r\n }\r\n }, [isOpen]);\r\n\r\n const { dialogRef, titleId } = useDialog({\r\n isOpen: Boolean(isOpen) && !isMinimized,\r\n onClose,\r\n });\r\n\r\n useEffect(() => {\r\n if (typeof window === 'undefined' || !isOpen || !isMinimized) {\r\n setDockNode(null);\r\n return;\r\n }\r\n\r\n const updateDockReference = () => {\r\n const node = document.querySelector('[data-upload-progress-dock]');\r\n setDockNode((prev) =>\r\n node instanceof HTMLElement ? (node === prev ? prev : node) : null,\r\n );\r\n };\r\n\r\n updateDockReference();\r\n\r\n const observer = new MutationObserver(() => updateDockReference());\r\n observer.observe(document.body, {\r\n childList: true,\r\n subtree: true,\r\n });\r\n\r\n return () => observer.disconnect();\r\n }, [isOpen, isMinimized]);\r\n\r\n const content =\r\n props.mode === 'multiple' ? (\r\n <MultiImageUpload ref={ref} {...(props as MultiImageUploadProps<TPreset>)} />\r\n ) : (\r\n <SingleImageUpload ref={ref} {...(props as SingleImageUploadProps<TPreset>)} />\r\n );\r\n\r\n if (isOpen === undefined) {\r\n return (\r\n <div\r\n data-slot=\"upload-root\"\r\n data-unstyled={isUnstyled || undefined}\r\n className={cls('iuk-root')}\r\n dir={dir}\r\n data-upload-locale={uploadLocale}\r\n >\r\n {content}\r\n </div>\r\n );\r\n }\r\n\r\n if (!isOpen) return null;\r\n\r\n const minimizedButton = (\r\n <button\r\n type=\"button\"\r\n data-slot=\"minimized-pill\"\r\n className={cls('iuk-minimized-pill')}\r\n onClick={() => setIsMinimized(false)}\r\n title={ui.restoreUploadWindow}\r\n >\r\n <Loader2 size={16} className={cls('iuk-spin')} />\r\n <span className={cls('iuk-minimized-pill__copy')}>\r\n <span className={cls('iuk-minimized-pill__primary')}>{ui.uploadWindow}</span>\r\n <span className={cls('iuk-minimized-pill__secondary')}>{ui.tapToResume}</span>\r\n </span>\r\n <ChevronUp size={16} />\r\n </button>\r\n );\r\n\r\n return (\r\n <>\r\n <div\r\n data-slot=\"upload-modal-backdrop\"\r\n data-unstyled={isUnstyled || undefined}\r\n className={cls(\r\n `iuk-root iuk-modal-backdrop ${isMinimized ? 'iuk-modal-backdrop--hidden' : ''}`.trim(),\r\n )}\r\n dir={dir}\r\n data-upload-locale={uploadLocale}\r\n role=\"dialog\"\r\n aria-modal={!isMinimized}\r\n aria-hidden={isMinimized}\r\n aria-labelledby={title ? titleId : undefined}\r\n aria-label={!title ? ui.uploadWindow : undefined}\r\n onClick={() => onClose?.()}\r\n >\r\n <div\r\n ref={dialogRef}\r\n data-slot=\"upload-dialog\"\r\n className={cls(\r\n `iuk-upload-dialog ${isMinimized ? 'iuk-upload-dialog--hidden' : ''}`.trim(),\r\n )}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {onClose && (\r\n <div className={cls('iuk-upload-dialog__controls')}>\r\n <button\r\n type=\"button\"\r\n className={cls('iuk-icon-btn iuk-icon-btn--floating')}\r\n onClick={() => setIsMinimized(true)}\r\n aria-label={ui.minimize}\r\n title={ui.minimizeUploader}\r\n >\r\n <Minus size={18} />\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={cls('iuk-icon-btn iuk-icon-btn--floating')}\r\n onClick={onClose}\r\n aria-label={ui.close}\r\n >\r\n <X size={18} />\r\n </button>\r\n </div>\r\n )}\r\n <div\r\n className={cls('iuk-upload-dialog__card')}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {title && (\r\n <h3 id={titleId} className={cls('iuk-upload-dialog__title')}>\r\n {modeVariant === 'edit'\r\n ? ui.editPrefix.replace('{title}', title)\r\n : title}\r\n </h3>\r\n )}\r\n {content}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {isMinimized &&\r\n typeof document !== 'undefined' &&\r\n (dockNode ? (\r\n createPortal(\r\n <div className={cls('iuk-minimized-portal')}>{minimizedButton}</div>,\r\n dockNode,\r\n )\r\n ) : (\r\n <div className={cls('iuk-minimized-dock')}>{minimizedButton}</div>\r\n ))}\r\n </>\r\n );\r\n}\r\n\r\nexport const ImageUpload = forwardRef(ImageUploadInner) as <\r\n TPreset extends string = UploadPresetName,\r\n>(\r\n props: ImageUploadProps<TPreset> & { ref?: Ref<ImageUploadHandle> },\r\n) => ReactElement | null;\r\n\r\nexport const UnifiedImageUpload = ImageUpload;\r\nexport default ImageUpload;\r\n","import {\r\n type ChangeEvent, type ForwardedRef, Fragment, forwardRef, type HTMLAttributes,\r\n type ReactElement, type Ref, useId, useImperativeHandle, useRef,\r\n} from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport type { UploadPresetName } from '../../types';\r\nimport { useImageUploadContext } from '../context';\r\nimport { useClipboardPaste } from '../hooks/useClipboardPaste';\r\nimport { useDragAndDrop } from '../hooks/useDragAndDrop';\r\nimport { useMultiImageState } from '../hooks/useMultiImageState';\r\nimport type { MultiUploadSlot } from '../styling';\r\nimport type { ImageUploadHandle, MultiImageUploadProps } from '../types';\r\nimport { HIDDEN_INPUT_STYLE, resolveSlotClass, resolveSlotStyle, resolveUploadDataState } from '../utils/slotStyles';\r\nimport { AltTextModal } from './AltTextModal';\r\nimport { MultiAddMoreTile, MultiEmptyDropzone } from './MultiDropzoneViews';\r\nimport { MultiFooterSection, MultiUploadHeaderAlerts } from './MultiUploadHeaderAlerts';\r\nimport { PreviewTile } from './PreviewTile';\r\nimport { QualitySelector } from './QualitySelector';\r\nimport { UploadProgressPanel, useRetainedProgressItems } from './UploadProgressPanel';\r\n\r\nconst DEFAULT_ACCEPT = 'image/jpeg,image/png,image/webp,image/avif,image/svg+xml';\r\nconst FOLDER_INPUT_ATTRS: Record<string, string> = { webkitdirectory: '', directory: '' };\r\n\r\nfunction MultiImageUploadInner<TPreset extends string = UploadPresetName>(\r\n props: MultiImageUploadProps<TPreset>,\r\n ref: ForwardedRef<ImageUploadHandle>,\r\n) {\r\n const {\r\n preset, translations, renderImage, label, error, helperText, className, style,\r\n recommendedQuality, qualityNote, isOpen, maxImages = 999,\r\n accept = DEFAULT_ACCEPT, allowFolder = true, disabled = false,\r\n required = false, blurType = 'card', showQualitySelector = true,\r\n capture, enablePaste = true, pasteTarget = 'dropzone', name, onBlur,\r\n classNames: cCls, styles: cSty,\r\n renderHeader, renderEmptyDropzone, renderTile, renderAddMore,\r\n } = props;\r\n\r\n const ctx = useImageUploadContext();\r\n const isUnstyled = props.unstyled ?? ctx.unstyled;\r\n const pCls = ctx.multiClassNames;\r\n const pSty = ctx.multiStyles;\r\n\r\n const slotClass = (slot: MultiUploadSlot, defaultClass?: string) =>\r\n resolveSlotClass(defaultClass, isUnstyled, pCls?.[slot], cCls?.[slot]);\r\n const slotStyle = (slot: MultiUploadSlot) =>\r\n resolveSlotStyle(pSty?.[slot], cSty?.[slot]);\r\n\r\n const state = useMultiImageState(props);\r\n const { locale, ui, previews, selectedPreviews, uploadingPreviews, imagesWithoutAlt, editingTarget } = state;\r\n\r\n const rootRef = useRef<HTMLDivElement>(null);\r\n const labelId = useId();\r\n const inputId = useId();\r\n const statusTextId = useId();\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n const folderInputRef = useRef<HTMLInputElement>(null);\r\n\r\n const dockItems = useRetainedProgressItems(uploadingPreviews, previews);\r\n\r\n const { isDragging, dragHandlers } = useDragAndDrop({\r\n disabled, onDrop: (files) => void state.handleFileSelect(files),\r\n });\r\n\r\n const { onPaste } = useClipboardPaste({\r\n enabled: enablePaste, pasteTarget, disabled, multiple: true,\r\n onPasteFiles: (files) => { void state.handleFileSelect(files); },\r\n });\r\n\r\n const openFilePicker = () => { if (!disabled) fileInputRef.current?.click(); };\r\n const openFolderPicker = () => { if (!disabled) folderInputRef.current?.click(); };\r\n const selectAll = () => state.setSelectedPreviews(new Set(previews.map((p) => p.id)));\r\n const clearSelection = () => state.setSelectedPreviews(new Set());\r\n const retryFailed = () => void state.handleRetryFailed();\r\n\r\n useImperativeHandle(ref, () => ({\r\n focus: () => {\r\n const focusable = rootRef.current?.querySelector<HTMLElement>(\r\n '[data-slot=\"empty-dropzone\"], [data-slot=\"empty-actions\"] button, [data-slot=\"add-more\"] button',\r\n );\r\n (focusable ?? rootRef.current)?.focus();\r\n },\r\n open: openFilePicker,\r\n clear: () => state.handleClearAll(),\r\n }));\r\n\r\n const handleFilesInputChange = (e: ChangeEvent<HTMLInputElement>) => {\r\n if (e.target.files && e.target.files.length > 0) void state.handleFileSelect(e.target.files);\r\n e.target.value = '';\r\n };\r\n\r\n const displayError = error || state.validationError;\r\n const hasError = Boolean(displayError) || state.hasFailedUploads;\r\n const hasStatusText = Boolean(helperText || displayError);\r\n const visualState = resolveUploadDataState({\r\n disabled, hasError, isUploading: state.isUploading, isDragging, hasContent: previews.length > 0,\r\n });\r\n\r\n const dropzoneProps: HTMLAttributes<HTMLElement> & { 'data-state'?: string } = {\r\n ...dragHandlers, onPaste,\r\n role: 'button', tabIndex: disabled ? -1 : 0,\r\n 'aria-label': ui.selectFilesAria, 'aria-disabled': disabled || undefined,\r\n 'aria-required': required || undefined, 'aria-invalid': hasError || undefined,\r\n 'aria-describedby': hasStatusText ? statusTextId : undefined,\r\n 'data-state': visualState,\r\n onClick: () => { if (!disabled) openFilePicker(); },\r\n onKeyDown: (event) => {\r\n if (!disabled && (event.key === 'Enter' || event.key === ' ')) {\r\n event.preventDefault();\r\n openFilePicker();\r\n }\r\n },\r\n };\r\n\r\n const slotStylingProps = {\r\n unstyled: isUnstyled, providerClassNames: pCls, classNames: cCls, providerStyles: pSty, styles: cSty,\r\n };\r\n const hiddenInputClass = resolveSlotClass('iuk-hidden-input', isUnstyled);\r\n const hiddenInputStyle = isUnstyled ? HIDDEN_INPUT_STYLE : undefined;\r\n\r\n return (\r\n <>\r\n <div\r\n ref={rootRef} data-slot=\"multi-root\" data-state={visualState} data-unstyled={isUnstyled || undefined}\r\n className={resolveSlotClass('iuk-multi', isUnstyled, pCls?.root, cCls?.root, className)}\r\n style={resolveSlotStyle(pSty?.root, cSty?.root, style)} dir={locale === 'ar' ? 'rtl' : 'ltr'}\r\n onPaste={onPaste}\r\n onBlur={onBlur ? (e) => { if (!e.currentTarget.contains(e.relatedTarget as Node | null)) onBlur(); } : undefined}\r\n >\r\n {name && (\r\n <input type=\"hidden\" name={name} value={state.serializedFormValue} required={required} data-slot=\"form-input\" />\r\n )}\r\n\r\n {renderHeader ? (\r\n renderHeader({\r\n label, required, disabled, totalCount: previews.length,\r\n selectedCount: selectedPreviews.size, uploadingCount: uploadingPreviews.length,\r\n isUploading: state.isUploading, hasFailedUploads: state.hasFailedUploads,\r\n selectAll, clearSelection, removeSelected: state.handleRemoveSelected,\r\n retryFailed, locale, ui,\r\n })\r\n ) : (\r\n <MultiUploadHeaderAlerts\r\n label={label} labelId={labelId} inputId={inputId} required={required} disabled={disabled}\r\n totalCount={previews.length} selectedCount={selectedPreviews.size}\r\n uploadingCount={uploadingPreviews.length} missingAltCount={imagesWithoutAlt.length}\r\n isUploading={state.isUploading} hasFailedUploads={state.hasFailedUploads}\r\n infoMessage={state.infoMessage} showMissingAltWarning={state.showMissingAltWarning}\r\n uploadStats={state.uploadStats} locale={locale} translations={translations} ui={ui}\r\n onSelectAll={selectAll} onDeselectAll={clearSelection}\r\n onRemoveSelected={state.handleRemoveSelected} onRetryFailed={retryFailed} {...slotStylingProps}\r\n />\r\n )}\r\n\r\n {showQualitySelector && (\r\n <div data-slot=\"quality-selector\" className={slotClass('qualitySelector')} style={slotStyle('qualitySelector')}>\r\n <QualitySelector\r\n value={state.qualityLevel} onChange={state.setQualityLevel}\r\n preset={preset} recommendedLevel={recommendedQuality}\r\n recommendationNote={qualityNote} locale={locale}\r\n disabled={state.isUploading || disabled} unstyled={isUnstyled}\r\n />\r\n </div>\r\n )}\r\n\r\n <input\r\n id={inputId} ref={fileInputRef} type=\"file\" accept={accept} capture={capture}\r\n onChange={handleFilesInputChange} className={hiddenInputClass} style={hiddenInputStyle}\r\n disabled={disabled} multiple aria-label={ui.selectFilesAria}\r\n aria-invalid={hasError || undefined}\r\n aria-describedby={hasStatusText ? statusTextId : undefined}\r\n />\r\n <input\r\n ref={folderInputRef} type=\"file\" accept={accept} onChange={handleFilesInputChange}\r\n className={hiddenInputClass} style={hiddenInputStyle}\r\n disabled={disabled} {...FOLDER_INPUT_ATTRS} aria-label={ui.selectFolderAria}\r\n />\r\n\r\n {previews.length === 0 ? (\r\n renderEmptyDropzone ? (\r\n renderEmptyDropzone({\r\n state: visualState, isDragging, disabled, allowFolder,\r\n maxSizeMB: state.maxSizeMB, maxImages, error: displayError || undefined,\r\n openFileDialog: openFilePicker, openFolderDialog: openFolderPicker,\r\n dropzoneProps, locale, ui,\r\n })\r\n ) : (\r\n <MultiEmptyDropzone\r\n isDragging={isDragging} disabled={disabled} hasError={Boolean(displayError)}\r\n required={required} enablePaste={enablePaste}\r\n visualState={visualState} allowFolder={allowFolder} maxSizeMB={state.maxSizeMB}\r\n ui={ui} dragHandlers={dragHandlers} onPaste={onPaste}\r\n onSelectFiles={openFilePicker} onSelectFolder={openFolderPicker} {...slotStylingProps}\r\n />\r\n )\r\n ) : (\r\n <div data-slot=\"grid\" className={slotClass('grid', 'iuk-multi__grid')} style={slotStyle('grid')}>\r\n {previews.map((item, index) =>\r\n renderTile ? (\r\n <Fragment key={item.id}>\r\n {renderTile({\r\n item, index, isSelected: selectedPreviews.has(item.id), disabled,\r\n toggleSelect: () => state.toggleSelect(item.id),\r\n remove: () => state.handleRemove(item.id),\r\n cancel: () => state.handleCancelUpload(item.id),\r\n retry: () => void state.handleRetryUpload(item.id),\r\n openAltTextModal: () => state.setEditingAltTextId(item.id),\r\n setAltText: (altText) => state.handleAltTextSave(item.id, altText),\r\n setBlurColor: (hex) => state.handleColorChange(item.id, hex),\r\n locale, ui,\r\n })}\r\n </Fragment>\r\n ) : (\r\n <PreviewTile\r\n key={item.id} preview={item} onRemove={state.handleRemove}\r\n onCancel={state.handleCancelUpload}\r\n onRetry={(id) => void state.handleRetryUpload(id)}\r\n disabled={disabled} blurType={blurType} isSelected={selectedPreviews.has(item.id)}\r\n onToggleSelect={state.toggleSelect} onEditAltText={(id) => state.setEditingAltTextId(id)}\r\n onChangeAltText={state.handleAltTextSave} onChangeColor={state.handleColorChange}\r\n locale={locale} translations={translations} renderImage={renderImage}\r\n unstyled={isUnstyled} className={slotClass('tile')} style={slotStyle('tile')}\r\n />\r\n ),\r\n )}\r\n\r\n {renderAddMore ? (\r\n renderAddMore({\r\n isDragging, disabled, allowFolder,\r\n remainingCount: Math.max(0, maxImages - previews.length),\r\n openFileDialog: openFilePicker, openFolderDialog: openFolderPicker,\r\n dropzoneProps, locale, ui,\r\n })\r\n ) : (\r\n <MultiAddMoreTile\r\n isDragging={isDragging} disabled={disabled} allowFolder={allowFolder} ui={ui}\r\n dragHandlers={dragHandlers} onSelectFiles={openFilePicker} onSelectFolder={openFolderPicker}\r\n {...slotStylingProps}\r\n />\r\n )}\r\n </div>\r\n )}\r\n\r\n <MultiFooterSection\r\n helperText={helperText} displayError={displayError} statusTextId={statusTextId} isOpen={isOpen}\r\n hasPreviews={previews.length > 0} hasCompletedPreviews={state.completedPreviews.length > 0}\r\n isUploading={state.isUploading} disabled={disabled} requireAltText={state.requireAltText}\r\n missingAltCount={imagesWithoutAlt.length} onSave={state.handleSaveImages} ui={ui} {...slotStylingProps}\r\n />\r\n </div>\r\n\r\n {editingTarget && (\r\n <AltTextModal\r\n imageUrl={editingTarget.url} initialAltText={editingTarget.altText}\r\n onSave={(nextAlt) => state.handleAltTextSave(editingTarget.id, nextAlt)}\r\n onClose={() => state.setEditingAltTextId(null)}\r\n locale={locale} translations={translations} renderImage={renderImage} unstyled={isUnstyled}\r\n />\r\n )}\r\n\r\n {typeof document !== 'undefined' && dockItems.length > 0 &&\r\n createPortal(\r\n <UploadProgressPanel\r\n items={dockItems} completedCount={state.uploadStats.completed}\r\n totalCount={state.uploadStats.total} locale={locale}\r\n translations={translations} renderImage={renderImage} unstyled={isUnstyled}\r\n />,\r\n document.body,\r\n )}\r\n </>\r\n );\r\n}\r\n\r\nexport const MultiImageUpload = forwardRef(MultiImageUploadInner) as <\r\n TPreset extends string = UploadPresetName,\r\n>(\r\n props: MultiImageUploadProps<TPreset> & { ref?: Ref<ImageUploadHandle> },\r\n) => ReactElement | null;\r\n\r\nexport default MultiImageUpload;\r\n","import {\r\n FolderOpenIcon as FolderOpen,\r\n ImagePlusIcon as ImagePlus,\r\n UploadIcon as Upload,\r\n} from '../icons';\r\nimport type { DragEvent } from 'react';\r\nimport type { UploadTranslations } from '../i18n';\r\nimport type {\r\n MultiUploadClassNames,\r\n MultiUploadSlot,\r\n MultiUploadStyles,\r\n UploadVisualState,\r\n} from '../styling';\r\nimport {\r\n cx,\r\n resolveSlotClass,\r\n resolveSlotStyle,\r\n resolveUploadDataState,\r\n} from '../utils/slotStyles';\r\n\r\nexport interface DropzoneDragHandlers {\r\n onDragEnter: (e: DragEvent) => void;\r\n onDragLeave: (e: DragEvent) => void;\r\n onDragOver: (e: DragEvent) => void;\r\n onDrop: (e: DragEvent) => void;\r\n}\r\n\r\nexport interface MultiDropzoneSlotProps {\r\n unstyled?: boolean;\r\n providerClassNames?: MultiUploadClassNames;\r\n classNames?: MultiUploadClassNames;\r\n providerStyles?: MultiUploadStyles;\r\n styles?: MultiUploadStyles;\r\n}\r\n\r\nexport interface MultiEmptyDropzoneProps extends MultiDropzoneSlotProps {\r\n isDragging: boolean;\r\n disabled?: boolean;\r\n hasError?: boolean;\r\n required?: boolean;\r\n enablePaste?: boolean;\r\n visualState?: UploadVisualState;\r\n allowFolder?: boolean;\r\n maxSizeMB: number;\r\n ui: UploadTranslations;\r\n dragHandlers: DropzoneDragHandlers;\r\n onPaste?: (e: React.ClipboardEvent<HTMLElement>) => void;\r\n onSelectFiles: () => void;\r\n onSelectFolder: () => void;\r\n}\r\n\r\nexport function MultiEmptyDropzone({\r\n isDragging,\r\n disabled = false,\r\n hasError = false,\r\n required = false,\r\n enablePaste = true,\r\n visualState: propVisualState,\r\n allowFolder = true,\r\n maxSizeMB,\r\n ui,\r\n dragHandlers,\r\n onPaste,\r\n onSelectFiles,\r\n onSelectFolder,\r\n unstyled,\r\n providerClassNames: pCls,\r\n classNames: cCls,\r\n providerStyles: pSty,\r\n styles: cSty,\r\n}: MultiEmptyDropzoneProps) {\r\n const visualState =\r\n propVisualState ?? resolveUploadDataState({ disabled, hasError, isDragging });\r\n\r\n const slotClass = (slot: MultiUploadSlot, defaultClass?: string) =>\r\n resolveSlotClass(defaultClass, unstyled, pCls?.[slot], cCls?.[slot]);\r\n const slotStyle = (slot: MultiUploadSlot) =>\r\n resolveSlotStyle(pSty?.[slot], cSty?.[slot]);\r\n\r\n const rootClassName = resolveSlotClass(\r\n cx(\r\n 'iuk-multi__empty',\r\n isDragging && 'iuk-multi__empty--dragging',\r\n disabled && 'iuk-multi__empty--disabled',\r\n hasError && 'iuk-multi__empty--error',\r\n ),\r\n unstyled,\r\n pCls?.emptyDropzone, cCls?.emptyDropzone,\r\n isDragging && pCls?.emptyDropzoneDragging, isDragging && cCls?.emptyDropzoneDragging,\r\n disabled && pCls?.emptyDropzoneDisabled, disabled && cCls?.emptyDropzoneDisabled,\r\n hasError && pCls?.emptyDropzoneError, hasError && cCls?.emptyDropzoneError,\r\n );\r\n\r\n const rootStyle = resolveSlotStyle(\r\n pSty?.emptyDropzone, cSty?.emptyDropzone,\r\n isDragging ? pSty?.emptyDropzoneDragging : undefined,\r\n isDragging ? cSty?.emptyDropzoneDragging : undefined,\r\n disabled ? pSty?.emptyDropzoneDisabled : undefined,\r\n disabled ? cSty?.emptyDropzoneDisabled : undefined,\r\n hasError ? pSty?.emptyDropzoneError : undefined,\r\n hasError ? cSty?.emptyDropzoneError : undefined,\r\n );\r\n\r\n return (\r\n <div\r\n data-slot=\"empty-dropzone\"\r\n data-state={visualState}\r\n data-dragging={isDragging || undefined}\r\n data-disabled={disabled || undefined}\r\n data-error={hasError || undefined}\r\n tabIndex={disabled ? -1 : 0}\r\n aria-required={required || undefined}\r\n aria-invalid={hasError || undefined}\r\n className={rootClassName}\r\n style={rootStyle}\r\n onPaste={onPaste}\r\n {...dragHandlers}\r\n >\r\n <div className={resolveSlotClass('iuk-dropzone__prompt', unstyled)}>\r\n <div className={resolveSlotClass('iuk-dropzone__icon', unstyled)}>\r\n <ImagePlus size={40} strokeWidth={1.5} />\r\n </div>\r\n <h3\r\n data-slot=\"empty-title\"\r\n className={slotClass('emptyTitle', 'iuk-multi__title')}\r\n style={slotStyle('emptyTitle')}\r\n >\r\n {isDragging ? ui.dropImagesHere : ui.uploadImages}\r\n </h3>\r\n <p\r\n data-slot=\"empty-hint\"\r\n className={slotClass('emptyHint', 'iuk-dropzone__hint')}\r\n style={slotStyle('emptyHint')}\r\n >\r\n {isDragging\r\n ? ui.releaseToUpload\r\n : `${ui.dragDropOrChoose}${enablePaste ? ` (${ui.pasteHint})` : ''}`}\r\n </p>\r\n\r\n {!isDragging && (\r\n <div\r\n data-slot=\"empty-actions\"\r\n className={slotClass('emptyActions', 'iuk-multi__btn-row')}\r\n style={slotStyle('emptyActions')}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={onSelectFiles}\r\n className={slotClass('primaryButton', 'iuk-btn iuk-btn--primary')}\r\n style={slotStyle('primaryButton')}\r\n disabled={disabled}\r\n >\r\n <Upload size={16} />\r\n <span>{ui.selectFiles}</span>\r\n </button>\r\n {allowFolder && (\r\n <button\r\n type=\"button\"\r\n onClick={onSelectFolder}\r\n className={slotClass('secondaryButton', 'iuk-btn iuk-btn--secondary')}\r\n style={slotStyle('secondaryButton')}\r\n disabled={disabled}\r\n >\r\n <FolderOpen size={16} />\r\n <span>{ui.selectFolder}</span>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {!isDragging && (\r\n <p\r\n data-slot=\"empty-subtext\"\r\n className={slotClass('emptySubtext', 'iuk-multi__subtext')}\r\n style={slotStyle('emptySubtext')}\r\n >\r\n {ui.supportsFormats} •{' '}\r\n {ui.maxPerFile.replace('{size}', String(maxSizeMB))}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport interface MultiAddMoreTileProps extends MultiDropzoneSlotProps {\r\n isDragging: boolean;\r\n disabled?: boolean;\r\n allowFolder?: boolean;\r\n ui: UploadTranslations;\r\n dragHandlers: DropzoneDragHandlers;\r\n onSelectFiles: () => void;\r\n onSelectFolder: () => void;\r\n}\r\n\r\nexport function MultiAddMoreTile({\r\n isDragging,\r\n disabled = false,\r\n allowFolder = true,\r\n ui,\r\n dragHandlers,\r\n onSelectFiles,\r\n onSelectFolder,\r\n unstyled,\r\n providerClassNames: pCls,\r\n classNames: cCls,\r\n providerStyles: pSty,\r\n styles: cSty,\r\n}: MultiAddMoreTileProps) {\r\n const slotClass = (slot: MultiUploadSlot, defaultClass?: string) =>\r\n resolveSlotClass(defaultClass, unstyled, pCls?.[slot], cCls?.[slot]);\r\n const slotStyle = (slot: MultiUploadSlot) =>\r\n resolveSlotStyle(pSty?.[slot], cSty?.[slot]);\r\n\r\n const rootClassName = resolveSlotClass(\r\n cx(\r\n 'iuk-tile iuk-tile--add-more',\r\n isDragging && 'iuk-tile--dragging',\r\n disabled && 'iuk-tile--disabled',\r\n ),\r\n unstyled,\r\n pCls?.addMoreTile, cCls?.addMoreTile,\r\n isDragging && pCls?.addMoreTileDragging, isDragging && cCls?.addMoreTileDragging,\r\n );\r\n\r\n const rootStyle = resolveSlotStyle(\r\n pSty?.addMoreTile, cSty?.addMoreTile,\r\n isDragging ? pSty?.addMoreTileDragging : undefined,\r\n isDragging ? cSty?.addMoreTileDragging : undefined,\r\n );\r\n\r\n return (\r\n <div\r\n data-slot=\"add-more\"\r\n data-dragging={isDragging || undefined}\r\n data-disabled={disabled || undefined}\r\n className={rootClassName}\r\n style={rootStyle}\r\n {...dragHandlers}\r\n >\r\n <div\r\n data-slot=\"add-more-content\"\r\n className={slotClass('addMoreContent', 'iuk-tile__add-content')}\r\n style={slotStyle('addMoreContent')}\r\n >\r\n <ImagePlus size={28} strokeWidth={1.5} />\r\n <p>{isDragging ? ui.dropHere : ui.addMore}</p>\r\n {!isDragging && (\r\n <div\r\n data-slot=\"add-more-actions\"\r\n className={slotClass('addMoreActions', 'iuk-tile__add-btns')}\r\n style={slotStyle('addMoreActions')}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={onSelectFiles}\r\n className={slotClass('secondaryButton', 'iuk-btn iuk-btn--secondary iuk-btn--sm')}\r\n style={slotStyle('secondaryButton')}\r\n disabled={disabled}\r\n >\r\n <Upload size={13} />\r\n <span>{ui.files}</span>\r\n </button>\r\n {allowFolder && (\r\n <button\r\n type=\"button\"\r\n onClick={onSelectFolder}\r\n className={slotClass('secondaryButton', 'iuk-btn iuk-btn--secondary iuk-btn--sm')}\r\n style={slotStyle('secondaryButton')}\r\n disabled={disabled}\r\n >\r\n <FolderOpen size={13} />\r\n <span>{ui.folder}</span>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import {\r\n AlertTriangleIcon as AlertTriangle,\r\n CheckCircleIcon as CheckCircle2,\r\n LoaderIcon as Loader2,\r\n SaveIcon as Save,\r\n TrashIcon as Trash2,\r\n XCircleIcon as XCircle,\r\n} from '../icons';\r\nimport type { MultiUploadStats } from '../hooks/useMultiImageState';\r\nimport {\r\n formatNeedsAltMessage,\r\n formatUploadingCount,\r\n type UploadLocale,\r\n type UploadTranslations,\r\n} from '../i18n';\r\nimport type {\r\n MultiUploadClassNames, MultiUploadSlot, MultiUploadStyles,\r\n} from '../styling';\r\nimport { cx, resolveSlotClass, resolveSlotStyle } from '../utils/slotStyles';\r\nimport { SaveButton } from './SaveButton';\r\n\r\nexport interface MultiSlotStylingProps {\r\n unstyled?: boolean;\r\n providerClassNames?: MultiUploadClassNames;\r\n classNames?: MultiUploadClassNames;\r\n providerStyles?: MultiUploadStyles;\r\n styles?: MultiUploadStyles;\r\n}\r\n\r\nexport interface MultiUploadHeaderAlertsProps extends MultiSlotStylingProps {\r\n label?: string;\r\n labelId?: string;\r\n inputId?: string;\r\n required?: boolean;\r\n disabled?: boolean;\r\n totalCount: number;\r\n selectedCount: number;\r\n uploadingCount: number;\r\n missingAltCount: number;\r\n isUploading: boolean;\r\n hasFailedUploads: boolean;\r\n infoMessage: string;\r\n showMissingAltWarning: boolean;\r\n uploadStats: MultiUploadStats;\r\n locale?: UploadLocale;\r\n translations?: Partial<UploadTranslations>;\r\n ui: UploadTranslations;\r\n onSelectAll: () => void;\r\n onDeselectAll: () => void;\r\n onRemoveSelected: () => void;\r\n onRetryFailed: () => void;\r\n}\r\n\r\nexport function MultiUploadHeaderAlerts({\r\n label, labelId, inputId, required = false, disabled = false,\r\n totalCount, selectedCount, uploadingCount, missingAltCount,\r\n isUploading, hasFailedUploads, infoMessage, showMissingAltWarning,\r\n uploadStats, locale = 'en', translations, ui,\r\n onSelectAll, onDeselectAll, onRemoveSelected, onRetryFailed,\r\n unstyled, providerClassNames, classNames, providerStyles, styles,\r\n}: MultiUploadHeaderAlertsProps) {\r\n const slotClass = (slot: MultiUploadSlot, defaultClass?: string) =>\r\n resolveSlotClass(defaultClass, unstyled, providerClassNames?.[slot], classNames?.[slot]);\r\n const slotStyle = (slot: MultiUploadSlot) =>\r\n resolveSlotStyle(providerStyles?.[slot], styles?.[slot]);\r\n\r\n return (\r\n <>\r\n <div data-slot=\"header\" className={slotClass('header', 'iuk-multi__header')} style={slotStyle('header')}>\r\n {(label || ui.uploadImages) && (\r\n <label\r\n id={labelId}\r\n htmlFor={inputId}\r\n data-slot=\"label\"\r\n className={slotClass('label', 'iuk-label')}\r\n style={slotStyle('label')}\r\n >\r\n <span>{label || ui.uploadImages}</span>\r\n {required && <span className={resolveSlotClass('iuk-required', unstyled)}>*</span>}\r\n {totalCount > 0 && (\r\n <span data-slot=\"count\" className={slotClass('count', 'iuk-multi__count')} style={slotStyle('count')}>\r\n ({totalCount})\r\n </span>\r\n )}\r\n </label>\r\n )}\r\n\r\n {totalCount > 0 && (\r\n <div data-slot=\"bulk-actions\" className={slotClass('bulkActions', 'iuk-multi__bulk')} style={slotStyle('bulkActions')}>\r\n {selectedCount === 0 ? (\r\n <button\r\n type=\"button\" onClick={onSelectAll} disabled={disabled}\r\n className={slotClass('bulkButton', 'iuk-btn iuk-btn--secondary iuk-btn--sm')}\r\n style={slotStyle('bulkButton')}\r\n >\r\n {ui.selectAll}\r\n </button>\r\n ) : (\r\n <>\r\n <button\r\n type=\"button\" onClick={onDeselectAll} disabled={disabled}\r\n className={slotClass('bulkButton', 'iuk-btn iuk-btn--secondary iuk-btn--sm')}\r\n style={slotStyle('bulkButton')}\r\n >\r\n {ui.deselectAll} ({selectedCount})\r\n </button>\r\n <button\r\n type=\"button\" onClick={onRemoveSelected} disabled={disabled}\r\n className={slotClass('bulkDangerButton', 'iuk-btn iuk-btn--danger iuk-btn--sm')}\r\n style={slotStyle('bulkDangerButton')}\r\n >\r\n <Trash2 size={14} />\r\n <span>{ui.removeSelected}</span>\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {isUploading && (\r\n <div\r\n data-slot=\"alert\"\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n className={slotClass('alert', 'iuk-alert iuk-alert--info')}\r\n style={slotStyle('alert')}\r\n >\r\n <span className={resolveSlotClass('iuk-alert__row', unstyled)}>\r\n <Loader2 size={16} className={resolveSlotClass('iuk-spin', unstyled)} />\r\n <span>{formatUploadingCount(ui, uploadingCount, locale, translations)}...</span>\r\n </span>\r\n {uploadStats.total > 0 && (\r\n <strong>\r\n {uploadStats.completed + uploadStats.failed} / {uploadStats.total}\r\n </strong>\r\n )}\r\n </div>\r\n )}\r\n\r\n {hasFailedUploads && (\r\n <div\r\n data-slot=\"alert\"\r\n role=\"alert\"\r\n className={slotClass('alert', 'iuk-alert iuk-alert--error')}\r\n style={slotStyle('alert')}\r\n >\r\n <XCircle size={16} />\r\n <span>\r\n {ui.someUploadsFailed}{' '}\r\n <button\r\n type=\"button\"\r\n onClick={onRetryFailed}\r\n disabled={isUploading || disabled}\r\n className={resolveSlotClass('iuk-link-btn', unstyled)}\r\n >\r\n {ui.retryFailedUploads}\r\n </button>\r\n </span>\r\n </div>\r\n )}\r\n\r\n {infoMessage && (\r\n <div\r\n data-slot=\"alert\"\r\n role=\"status\"\r\n className={slotClass('alert', 'iuk-alert iuk-alert--success')}\r\n style={slotStyle('alert')}\r\n >\r\n <CheckCircle2 size={16} />\r\n <span>{infoMessage}</span>\r\n </div>\r\n )}\r\n\r\n {showMissingAltWarning && missingAltCount > 0 && (\r\n <div\r\n data-slot=\"alert\"\r\n role=\"alert\"\r\n className={slotClass('alert', 'iuk-alert iuk-alert--warning')}\r\n style={slotStyle('alert')}\r\n >\r\n <AlertTriangle size={16} />\r\n <span>{formatNeedsAltMessage(ui, missingAltCount, locale)}</span>\r\n </div>\r\n )}\r\n </>\r\n );\r\n}\r\n\r\nexport interface MultiFooterSectionProps extends MultiSlotStylingProps {\r\n helperText?: string;\r\n displayError?: string;\r\n statusTextId?: string;\r\n isOpen?: boolean;\r\n hasPreviews: boolean;\r\n hasCompletedPreviews: boolean;\r\n isUploading: boolean;\r\n disabled: boolean;\r\n requireAltText: boolean;\r\n missingAltCount: number;\r\n onSave: () => void;\r\n ui: UploadTranslations;\r\n}\r\n\r\nexport function MultiFooterSection({\r\n helperText, displayError, statusTextId, isOpen, hasPreviews, hasCompletedPreviews,\r\n isUploading, disabled, requireAltText, missingAltCount, onSave, ui,\r\n unstyled, providerClassNames, classNames, providerStyles, styles,\r\n}: MultiFooterSectionProps) {\r\n const slotClass = (slot: MultiUploadSlot, defaultClass?: string) =>\r\n resolveSlotClass(defaultClass, unstyled, providerClassNames?.[slot], classNames?.[slot]);\r\n const slotStyle = (slot: MultiUploadSlot) =>\r\n resolveSlotStyle(providerStyles?.[slot], styles?.[slot]);\r\n\r\n return (\r\n <>\r\n {(helperText || displayError) && (\r\n <p\r\n id={statusTextId}\r\n role={displayError ? 'alert' : undefined}\r\n data-slot={displayError ? 'error-text' : 'helper-text'}\r\n className={resolveSlotClass(\r\n cx('iuk-helper-text', Boolean(displayError) && 'iuk-helper-text--error'),\r\n unstyled,\r\n providerClassNames?.helperText, classNames?.helperText,\r\n Boolean(displayError) && providerClassNames?.errorText,\r\n Boolean(displayError) && classNames?.errorText,\r\n )}\r\n style={resolveSlotStyle(\r\n providerStyles?.helperText, styles?.helperText,\r\n displayError ? providerStyles?.errorText : undefined,\r\n displayError ? styles?.errorText : undefined,\r\n )}\r\n >\r\n {displayError || helperText}\r\n </p>\r\n )}\r\n\r\n {isOpen && hasPreviews && (\r\n <div data-slot=\"commit-bar\" className={slotClass('commitBar', 'iuk-commit-bar')} style={slotStyle('commitBar')}>\r\n {requireAltText && missingAltCount > 0 && (\r\n <div className={resolveSlotClass('iuk-badge iuk-badge--warning', unstyled)}>\r\n <AlertTriangle size={13} />\r\n <span>{ui.withoutAltText.replace('{count}', String(missingAltCount))}</span>\r\n </div>\r\n )}\r\n <SaveButton\r\n unstyled={unstyled}\r\n className={slotClass('saveButton')}\r\n style={slotStyle('saveButton')}\r\n onClick={onSave}\r\n disabled={\r\n isUploading || disabled || !hasCompletedPreviews ||\r\n (requireAltText && missingAltCount > 0)\r\n }\r\n icon={<Save size={16} />}\r\n >\r\n {ui.saveImages}\r\n </SaveButton>\r\n </div>\r\n )}\r\n </>\r\n );\r\n}\r\n","import {\r\n CheckCircleIcon as CheckCircle2,\r\n LoaderIcon as Loader2,\r\n PaletteIcon as Palette,\r\n TypeIcon,\r\n XIcon as X,\r\n XCircleIcon as XCircle,\r\n} from '../icons';\r\nimport { type CSSProperties, useMemo, useState } from 'react';\r\nimport type { BlurPlaceholderType } from '../../blur/types';\r\nimport type { UploadLocale } from '../../types';\r\nimport { useImageUploadContext } from '../context';\r\nimport { useBlurDataURL } from '../hooks/useBlurService';\r\nimport {\r\n normalizeUploadLocale,\r\n resolveTranslations,\r\n type UploadTranslations,\r\n} from '../i18n';\r\nimport type { CustomImageRenderer, ImagePreview } from '../types';\r\nimport { appendCacheBuster } from '../utils/sessionMetaCache';\r\nimport { cx, resolveSlotClass, resolveUploadDataState } from '../utils/slotStyles';\r\nimport { BlurImage } from './BlurImage';\r\nimport { BlurVisualizationModal } from './BlurVisualizationModal';\r\n\r\nexport interface PreviewTileProps {\r\n preview: ImagePreview;\r\n onRemove: (id: string) => void;\r\n onCancel?: (id: string) => void;\r\n onRetry?: (id: string) => void;\r\n disabled?: boolean;\r\n blurType?: BlurPlaceholderType;\r\n isSelected?: boolean;\r\n onToggleSelect?: (id: string) => void;\r\n onEditAltText?: (id: string) => void;\r\n showCheckbox?: boolean;\r\n onAdjustColor?: (id: string) => void;\r\n onChangeColor?: (id: string, color: string) => void;\r\n onChangeAltText?: (id: string, altText: string) => void;\r\n appendCacheBuster?: boolean;\r\n locale?: UploadLocale;\r\n translations?: Partial<UploadTranslations>;\r\n renderImage?: CustomImageRenderer;\r\n unstyled?: boolean;\r\n className?: string;\r\n style?: CSSProperties;\r\n}\r\n\r\nexport function PreviewTile({\r\n preview, onRemove, onCancel, onRetry, disabled = false, blurType = 'card', isSelected = false,\r\n onToggleSelect, onEditAltText, showCheckbox = true, onAdjustColor,\r\n onChangeColor, onChangeAltText, appendCacheBuster: appendBuster = false,\r\n locale: propLocale, translations, renderImage,\r\n unstyled: propUnstyled, className, style,\r\n}: PreviewTileProps) {\r\n const ctx = useImageUploadContext();\r\n const isUnstyled = propUnstyled ?? ctx.unstyled;\r\n const locale = normalizeUploadLocale(propLocale || ctx.locale);\r\n const ui = resolveTranslations(locale, translations || ctx.translations);\r\n const [showBlurModal, setShowBlurModal] = useState(false);\r\n const cls = (defaultClass: string) => resolveSlotClass(defaultClass, isUnstyled);\r\n\r\n const isSvg = Boolean(\r\n preview.url?.toLowerCase().includes('.svg') ||\r\n preview.data?.format === 'svg' ||\r\n preview.url?.includes('image/svg+xml'),\r\n );\r\n\r\n const displayUrl = useMemo(\r\n () =>\r\n appendCacheBuster(preview.url, {\r\n enabled: appendBuster,\r\n token: preview.data?.contentHash || preview.data?.uploadedAt,\r\n }),\r\n [preview.url, preview.data?.contentHash, preview.data?.uploadedAt, appendBuster],\r\n );\r\n\r\n const fallbackBlurDataURL = useBlurDataURL(preview.url, { type: blurType, size: 'small' });\r\n const actualBlurDataUrl = preview.data?.blurDataUrl || fallbackBlurDataURL;\r\n const actualBlurColor = preview.blurColor || preview.data?.blurColor;\r\n\r\n const isUploading = Boolean(preview.isUploading);\r\n const hasError = Boolean(preview.error);\r\n const visualState = resolveUploadDataState({\r\n disabled, hasError, isUploading, hasContent: true,\r\n });\r\n const isSuccess = Boolean(\r\n !isUploading && !hasError && preview.originalSize && preview.optimizedSize,\r\n );\r\n const reductionPercent =\r\n isSuccess && preview.originalSize && preview.optimizedSize\r\n ? Math.round(\r\n ((preview.originalSize - preview.optimizedSize) / preview.originalSize) * 100,\r\n )\r\n : 0;\r\n\r\n return (\r\n <div\r\n data-slot=\"tile\"\r\n data-state={visualState}\r\n data-selected={isSelected || undefined}\r\n data-uploading={isUploading || undefined}\r\n data-error={hasError || undefined}\r\n className={resolveSlotClass(\r\n cx('iuk-tile', isSelected && 'iuk-tile--selected', hasError && 'iuk-tile--error'),\r\n isUnstyled,\r\n className,\r\n )}\r\n style={style}\r\n onClick={() => onToggleSelect && !disabled && onToggleSelect(preview.id)}\r\n >\r\n <div data-slot=\"tile-media\" className={cls('iuk-tile__media')}>\r\n <BlurImage\r\n src={displayUrl}\r\n alt={preview.altText || ui.previewAlt}\r\n blurDataUrl={!isSvg ? actualBlurDataUrl : undefined}\r\n blurColor={actualBlurColor}\r\n blurHash={preview.data?.blurHash}\r\n objectFit={isSvg ? 'contain' : 'cover'}\r\n style={isSvg ? { padding: '8px' } : undefined}\r\n renderImage={renderImage}\r\n />\r\n\r\n {showCheckbox && !disabled && !isUploading && onToggleSelect && (\r\n <div\r\n data-slot=\"tile-checkbox\"\r\n className={cls('iuk-tile__checkbox')}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n checked={isSelected}\r\n onChange={() => onToggleSelect(preview.id)}\r\n aria-label={ui.selectImageAria}\r\n />\r\n </div>\r\n )}\r\n\r\n {!disabled && onEditAltText && (\r\n <button\r\n type=\"button\"\r\n data-slot=\"tile-alt-btn\"\r\n className={cls(\r\n cx(\r\n 'iuk-tile__action iuk-tile__action--alt',\r\n Boolean(preview.altText) && 'iuk-tile__action--has-alt',\r\n ),\r\n )}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onEditAltText(preview.id);\r\n }}\r\n aria-label={preview.altText ? ui.editAltTextAria : ui.addAltTextAria}\r\n title={\r\n preview.altText\r\n ? ui.editPrefix.replace('{title}', preview.altText)\r\n : ui.addDescriptionForA11y\r\n }\r\n >\r\n {preview.altText ? <CheckCircle2 size={14} /> : <TypeIcon size={14} />}\r\n </button>\r\n )}\r\n\r\n {!disabled && !isUploading && (\r\n <button\r\n type=\"button\"\r\n data-slot=\"tile-blur-btn\"\r\n className={cls('iuk-tile__action iuk-tile__action--blur')}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n if (onAdjustColor) onAdjustColor(preview.id);\r\n else setShowBlurModal(true);\r\n }}\r\n aria-label={ui.adjustBlurColorAria}\r\n title={ui.adjustBlurColorTitle}\r\n >\r\n <Palette size={14} />\r\n </button>\r\n )}\r\n\r\n {!disabled && !isUploading && (\r\n <button\r\n type=\"button\"\r\n data-slot=\"tile-remove-btn\"\r\n className={cls('iuk-tile__action iuk-tile__action--remove')}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onRemove(preview.id);\r\n }}\r\n aria-label={ui.removeImageAria}\r\n >\r\n <X size={15} />\r\n </button>\r\n )}\r\n\r\n {isUploading && (\r\n <div data-slot=\"tile-overlay\" className={cls('iuk-tile__overlay')}>\r\n <Loader2 size={24} className={cls('iuk-spin')} />\r\n <p className={cls('iuk-tile__status')}>\r\n {preview.uploadMessage || `${ui.uploading}...`}\r\n </p>\r\n {preview.progress !== undefined && preview.progress > 0 && (\r\n <div\r\n role=\"progressbar\"\r\n aria-valuenow={Math.round(preview.progress)}\r\n aria-valuemin={0}\r\n aria-valuemax={100}\r\n aria-label={ui.uploading}\r\n className={cls('iuk-progress-bar')}\r\n >\r\n <div\r\n className={cls('iuk-progress-bar__fill')}\r\n style={{ width: `${preview.progress}%` }}\r\n />\r\n </div>\r\n )}\r\n {!disabled && (\r\n <button\r\n type=\"button\"\r\n data-slot=\"tile-cancel\"\r\n className={cls('iuk-btn iuk-btn--secondary iuk-btn--sm iuk-tile__cancel-btn')}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n (onCancel ?? onRemove)(preview.id);\r\n }}\r\n aria-label={ui.cancelUpload}\r\n >\r\n <X size={13} />\r\n <span>{ui.cancelUpload}</span>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {isSuccess && (\r\n <div data-slot=\"tile-badge\" className={cls('iuk-tile__badge iuk-tile__badge--success')}>\r\n <CheckCircle2 size={13} />\r\n {reductionPercent > 0 && <span>-{reductionPercent}%</span>}\r\n </div>\r\n )}\r\n\r\n {!disabled && !isUploading && !hasError && actualBlurColor && (\r\n <div data-slot=\"tile-color-badge\" className={cls('iuk-tile__badge iuk-tile__badge--color')}>\r\n <span className={cls('iuk-tile__color-dot')} style={{ backgroundColor: actualBlurColor }} />\r\n <code>{actualBlurColor.toUpperCase()}</code>\r\n </div>\r\n )}\r\n\r\n {hasError && (\r\n <div\r\n data-slot=\"tile-error\"\r\n role=\"alert\"\r\n className={cls('iuk-tile__overlay iuk-tile__overlay--error')}\r\n >\r\n <XCircle size={22} />\r\n <p>{preview.error}</p>\r\n {!disabled && onRetry && (\r\n <button\r\n type=\"button\"\r\n data-slot=\"tile-retry\"\r\n className={cls('iuk-btn iuk-btn--secondary iuk-btn--sm iuk-tile__retry-btn')}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onRetry(preview.id);\r\n }}\r\n aria-label={ui.retryUpload}\r\n >\r\n <span>{ui.retryUpload}</span>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <BlurVisualizationModal\r\n isOpen={showBlurModal}\r\n onClose={() => setShowBlurModal(false)}\r\n imageUrl={preview.url}\r\n blurDataUrl={actualBlurDataUrl}\r\n blurColor={actualBlurColor}\r\n detectedColor={preview.data?.blurColor}\r\n altText={preview.altText}\r\n originalSize={preview.originalSize}\r\n optimizedSize={preview.optimizedSize}\r\n locale={locale}\r\n translations={translations}\r\n renderImage={renderImage}\r\n unstyled={isUnstyled}\r\n onChangeColor={(hex) => onChangeColor?.(preview.id, hex)}\r\n onUseDetectedColor={\r\n onChangeColor && preview.data?.blurColor\r\n ? () => onChangeColor(preview.id, preview.data!.blurColor!)\r\n : undefined\r\n }\r\n onChangeAltText={(nextAlt) => onChangeAltText?.(preview.id, nextAlt)}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nexport default PreviewTile;\r\n","import { CheckIcon as Check, InfoIcon as Info, ZapIcon as Zap } from '../icons';\r\nimport type { KeyboardEvent } from 'react';\r\nimport type {\r\n QualityLevel,\r\n StandardPresetName,\r\n UploadLocale,\r\n} from '../../types';\r\nimport { QUALITY_PRESETS, STANDARD_PRESETS } from '../../types';\r\nimport { estimateOutputSize } from '../../utils/formatters';\r\nimport {\r\n normalizeUploadLocale,\r\n resolveTranslations,\r\n type UploadTranslations,\r\n} from '../i18n';\r\nimport { cx, resolveSlotClass } from '../utils/slotStyles';\r\n\r\nfunction formatBytesCompact(bytes: number): string {\r\n if (bytes < 1024) return `${bytes} B`;\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\r\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\r\n}\r\n\r\nexport interface QualitySelectorProps {\r\n value: QualityLevel;\r\n onChange: (level: QualityLevel) => void;\r\n preset?: string;\r\n recommendedLevel?: QualityLevel;\r\n recommendationNote?: { en: string; ar?: string };\r\n originalFileSize?: number;\r\n locale?: UploadLocale;\r\n translations?: Partial<UploadTranslations>;\r\n disabled?: boolean;\r\n unstyled?: boolean;\r\n}\r\n\r\nexport function QualitySelector({\r\n value,\r\n onChange,\r\n preset,\r\n recommendedLevel,\r\n recommendationNote,\r\n originalFileSize,\r\n locale,\r\n translations,\r\n disabled = false,\r\n unstyled = false,\r\n}: QualitySelectorProps) {\r\n const resolvedLocale = normalizeUploadLocale(locale);\r\n const isAr = resolvedLocale === 'ar';\r\n const ui = resolveTranslations(resolvedLocale, translations);\r\n const cls = (defaultClass: string) => resolveSlotClass(defaultClass, unstyled);\r\n\r\n const standardPreset = preset\r\n ? STANDARD_PRESETS[preset as StandardPresetName]\r\n : undefined;\r\n\r\n const recommended: QualityLevel =\r\n recommendedLevel || standardPreset?.recommendedQualityLevel || 'high';\r\n const note = recommendationNote || standardPreset?.recommendationNote;\r\n\r\n const selected = QUALITY_PRESETS[value];\r\n const levels = Object.keys(QUALITY_PRESETS) as QualityLevel[];\r\n const estimatedSize =\r\n originalFileSize !== undefined\r\n ? estimateOutputSize(originalFileSize, value)\r\n : null;\r\n const saving = Math.round((1 - selected.compressionRatio) * 100);\r\n\r\n const handleRadioGroupKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\r\n if (disabled) return;\r\n const currentIndex = Math.max(0, levels.indexOf(value));\r\n let nextIndex = -1;\r\n\r\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\r\n const step = event.key === 'ArrowRight' && isAr ? -1 : 1;\r\n nextIndex = (currentIndex + step + levels.length) % levels.length;\r\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\r\n const step = event.key === 'ArrowLeft' && isAr ? 1 : -1;\r\n nextIndex = (currentIndex + step + levels.length) % levels.length;\r\n } else if (event.key === 'Home') {\r\n nextIndex = 0;\r\n } else if (event.key === 'End') {\r\n nextIndex = levels.length - 1;\r\n }\r\n\r\n if (nextIndex >= 0) {\r\n event.preventDefault();\r\n const nextLevel = levels[nextIndex];\r\n onChange(nextLevel);\r\n const buttons = event.currentTarget.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]');\r\n buttons[nextIndex]?.focus();\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n data-slot=\"quality-root\"\r\n data-unstyled={unstyled || undefined}\r\n className={cls('iuk-quality')}\r\n dir={isAr ? 'rtl' : 'ltr'}\r\n >\r\n <div className={cls('iuk-quality__header')}>\r\n <span className={cls('iuk-quality__title')}>\r\n {ui.qualityTitle}\r\n </span>\r\n <span className={cls(`iuk-quality__pill iuk-quality__pill--${value}`)}>\r\n {isAr ? selected.labelAr : selected.label} · Q{selected.value}\r\n </span>\r\n </div>\r\n\r\n <div\r\n className={cls('iuk-quality__tabs')}\r\n role=\"radiogroup\"\r\n aria-label={ui.qualityLevelAria}\r\n onKeyDown={handleRadioGroupKeyDown}\r\n >\r\n {levels.map((level) => {\r\n const item = QUALITY_PRESETS[level];\r\n const isSelected = value === level;\r\n const isRecommended = level === recommended;\r\n return (\r\n <button\r\n key={level}\r\n type=\"button\"\r\n role=\"radio\"\r\n aria-checked={isSelected}\r\n tabIndex={disabled ? -1 : isSelected ? 0 : -1}\r\n disabled={disabled}\r\n onClick={() => !disabled && onChange(level)}\r\n className={cls(\r\n cx(\r\n 'iuk-quality__tab',\r\n isSelected && 'iuk-quality__tab--selected',\r\n isRecommended && !isSelected && 'iuk-quality__tab--recommended',\r\n disabled && 'iuk-quality__tab--disabled',\r\n ),\r\n )}\r\n >\r\n {isSelected && (\r\n <Check size={11} strokeWidth={3} aria-hidden=\"true\" />\r\n )}\r\n <span>{isAr ? item.labelAr : item.label}</span>\r\n {isRecommended && !isSelected && (\r\n <span className={cls('iuk-quality__star')} aria-hidden=\"true\">\r\n ★\r\n </span>\r\n )}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n\r\n <div className={cls(`iuk-quality__detail iuk-quality__detail--${value}`)}>\r\n <p className={cls('iuk-quality__desc')}>\r\n {isAr ? selected.descriptionAr : selected.description}\r\n </p>\r\n <div className={cls('iuk-quality__meta')}>\r\n <span className={cls('iuk-quality__tag')}>Q{selected.value}</span>\r\n {estimatedSize !== null && (\r\n <>\r\n <span className={cls('iuk-quality__dot')} aria-hidden=\"true\" />\r\n <Zap size={11} aria-hidden=\"true\" />\r\n <span>~{formatBytesCompact(estimatedSize)}</span>\r\n <span className={cls('iuk-quality__dot')} aria-hidden=\"true\" />\r\n <span className={cls('iuk-quality__saving')}>\r\n {saving}% {ui.qualitySaved}\r\n </span>\r\n </>\r\n )}\r\n {value === recommended && (\r\n <span className={cls('iuk-quality__rec-badge')}>\r\n ⭐ {ui.qualityRecommended}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {note && (\r\n <div className={cls('iuk-quality__note')}>\r\n <Info size={12} aria-hidden=\"true\" className={cls('iuk-quality__note-icon')} />\r\n <span>{isAr ? note.ar || note.en : note.en}</span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default QualitySelector;\r\n","import {\r\n ChevronDownIcon as ChevronDown,\r\n ChevronUpIcon as ChevronUp,\r\n LoaderIcon as Loader2,\r\n} from '../icons';\r\nimport { useEffect, useRef, useState } from 'react';\r\nimport type { UploadLocale } from '../../types';\r\nimport { useImageUploadContext } from '../context';\r\nimport {\r\n formatUploadingCount,\r\n normalizeUploadLocale,\r\n resolveTranslations,\r\n type UploadTranslations,\r\n} from '../i18n';\r\nimport type { CustomImageRenderer, ImagePreview } from '../types';\r\nimport { cx, resolveSlotClass } from '../utils/slotStyles';\r\nimport { BlurImage } from './BlurImage';\r\n\r\nconst PROGRESS_PANEL_DISMISS_DELAY_MS = 2500;\r\n\r\nexport interface UploadItem {\r\n id: string;\r\n url: string;\r\n fileName?: string;\r\n message?: string;\r\n progress?: number;\r\n}\r\n\r\nexport function useRetainedProgressItems(\r\n uploadingPreviews: ImagePreview[],\r\n previews: ImagePreview[],\r\n): UploadItem[] {\r\n const [retainedItems, setRetainedItems] = useState<UploadItem[] | null>(null);\r\n const activeBatchRef = useRef<Map<string, UploadItem>>(new Map());\r\n const dismissTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const prevUploadingCountRef = useRef(0);\r\n const isUploading = uploadingPreviews.length > 0;\r\n\r\n useEffect(() => {\r\n if (isUploading) {\r\n if (dismissTimerRef.current) {\r\n clearTimeout(dismissTimerRef.current);\r\n dismissTimerRef.current = null;\r\n activeBatchRef.current.clear();\r\n }\r\n setRetainedItems(null);\r\n for (const p of uploadingPreviews) {\r\n activeBatchRef.current.set(p.id, {\r\n id: p.id,\r\n url: p.url,\r\n fileName: p.fileName || p.file?.name,\r\n message: p.uploadMessage || undefined,\r\n progress: p.progress,\r\n });\r\n }\r\n } else if (prevUploadingCountRef.current > 0 && activeBatchRef.current.size > 0) {\r\n const completed: UploadItem[] = Array.from(activeBatchRef.current.values()).map((it) => {\r\n const found = previews.find((p) => p.id === it.id);\r\n return {\r\n ...it,\r\n progress: found?.progress ?? 100,\r\n message: found?.error ? found.error : (found?.uploadMessage || undefined),\r\n };\r\n });\r\n setRetainedItems(completed);\r\n dismissTimerRef.current = setTimeout(() => {\r\n setRetainedItems(null);\r\n activeBatchRef.current.clear();\r\n dismissTimerRef.current = null;\r\n }, PROGRESS_PANEL_DISMISS_DELAY_MS);\r\n }\r\n prevUploadingCountRef.current = uploadingPreviews.length;\r\n }, [isUploading, uploadingPreviews, previews]);\r\n\r\n useEffect(() => () => {\r\n if (dismissTimerRef.current) clearTimeout(dismissTimerRef.current);\r\n }, []);\r\n\r\n return isUploading\r\n ? uploadingPreviews.map((p) => ({\r\n id: p.id,\r\n url: p.url,\r\n fileName: p.fileName || p.file?.name,\r\n message: p.uploadMessage || undefined,\r\n progress: p.progress,\r\n }))\r\n : (retainedItems ?? []);\r\n}\r\n\r\nexport interface UploadProgressPanelProps {\r\n items: UploadItem[];\r\n completedCount: number;\r\n totalCount: number;\r\n locale?: UploadLocale;\r\n translations?: Partial<UploadTranslations>;\r\n renderImage?: CustomImageRenderer;\r\n unstyled?: boolean;\r\n}\r\n\r\nexport function UploadProgressPanel({\r\n items,\r\n completedCount,\r\n totalCount,\r\n locale: propLocale,\r\n translations,\r\n renderImage,\r\n unstyled: propUnstyled,\r\n}: UploadProgressPanelProps) {\r\n const ctx = useImageUploadContext();\r\n const isUnstyled = propUnstyled ?? ctx.unstyled;\r\n const locale = normalizeUploadLocale(propLocale || ctx.locale);\r\n const effectiveOverrides = translations || ctx.translations;\r\n const ui = resolveTranslations(locale, effectiveOverrides);\r\n const [isMinimized, setIsMinimized] = useState(false);\r\n const uploadingCount = items.length;\r\n const cls = (defaultClass: string) => resolveSlotClass(defaultClass, isUnstyled);\r\n\r\n if (uploadingCount === 0) return null;\r\n\r\n return (\r\n <div\r\n data-upload-progress-dock\r\n data-slot=\"progress-dock\"\r\n data-unstyled={isUnstyled || undefined}\r\n dir={locale === 'ar' ? 'rtl' : 'ltr'}\r\n className={cls(\r\n cx('iuk-progress-dock', isMinimized && 'iuk-progress-dock--collapsed'),\r\n )}\r\n >\r\n <div\r\n className={cls(\r\n cx('iuk-progress-panel', isMinimized && 'iuk-progress-panel--minimized'),\r\n )}\r\n >\r\n <button\r\n type=\"button\"\r\n className={cls('iuk-progress-panel__header')}\r\n aria-expanded={!isMinimized}\r\n onClick={() => setIsMinimized((prev) => !prev)}\r\n >\r\n <span className={cls('iuk-progress-panel__title')}>\r\n <Loader2 size={16} className={cls('iuk-spin')} />\r\n <span>\r\n {formatUploadingCount(ui, uploadingCount, locale, effectiveOverrides)}\r\n </span>\r\n {totalCount > 0 && (\r\n <span className={cls('iuk-progress-panel__count')}>\r\n ({completedCount}/{totalCount})\r\n </span>\r\n )}\r\n </span>\r\n {isMinimized ? <ChevronUp size={18} /> : <ChevronDown size={18} />}\r\n </button>\r\n\r\n {!isMinimized && (\r\n <div className={cls('iuk-progress-panel__body')}>\r\n {items.map((item) => (\r\n <div key={item.id} className={cls('iuk-progress-item')}>\r\n <div className={cls('iuk-progress-item__thumb')}>\r\n <BlurImage\r\n src={item.url}\r\n alt={ui.uploadingAlt}\r\n objectFit=\"cover\"\r\n renderImage={renderImage}\r\n />\r\n </div>\r\n <div className={cls('iuk-progress-item__info')}>\r\n <div className={cls('iuk-progress-item__name')}>\r\n {item.fileName || ui.image}\r\n </div>\r\n <div className={cls('iuk-progress-item__status')}>\r\n {item.message || ui.processing}\r\n </div>\r\n {item.progress !== undefined && item.progress > 0 && (\r\n <div\r\n role=\"progressbar\"\r\n aria-valuenow={Math.round(item.progress)}\r\n aria-valuemin={0}\r\n aria-valuemax={100}\r\n aria-label={item.fileName || ui.uploading}\r\n className={cls('iuk-progress-bar')}\r\n >\r\n <div\r\n className={cls('iuk-progress-bar__fill')}\r\n style={{ width: `${item.progress}%` }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default UploadProgressPanel;\r\n","import {\r\n type ChangeEvent, type ForwardedRef, forwardRef, type HTMLAttributes,\r\n type ReactElement, type Ref, useId, useImperativeHandle, useRef,\r\n} from 'react';\r\nimport type { UploadPresetName } from '../../types';\r\nimport { useImageUploadContext } from '../context';\r\nimport { useClipboardPaste } from '../hooks/useClipboardPaste';\r\nimport { useDragAndDrop } from '../hooks/useDragAndDrop';\r\nimport { useSingleImageState } from '../hooks/useSingleImageState';\r\nimport type { SingleUploadSlot } from '../styling';\r\nimport type { ImageUploadHandle, SingleImageUploadProps } from '../types';\r\nimport {\r\n HIDDEN_INPUT_STYLE, resolveSlotClass, resolveSlotStyle, resolveUploadDataState,\r\n} from '../utils/slotStyles';\r\nimport { AltTextModal } from './AltTextModal';\r\nimport { BlurVisualizationModal } from './BlurVisualizationModal';\r\nimport { PreviewTile } from './PreviewTile';\r\nimport { QualitySelector } from './QualitySelector';\r\nimport {\r\n resolveSingleDropzoneSlot, SingleDropzoneEmptyPrompt, SingleStatusFooter,\r\n} from './SingleDropzoneContent';\r\n\r\nfunction SingleImageUploadInner<TPreset extends string = UploadPresetName>(\r\n props: SingleImageUploadProps<TPreset>,\r\n ref: ForwardedRef<ImageUploadHandle>,\r\n) {\r\n const {\r\n preset, translations, renderImage, label, error, helperText, className, style,\r\n accept = 'image/jpeg,image/png,image/webp,image/avif,image/svg+xml',\r\n disabled = false, required = false, blurType = 'card',\r\n showProgress = false, showQualitySelector = true,\r\n recommendedQuality, qualityNote, isOpen,\r\n capture, enablePaste = true, pasteTarget = 'dropzone', name, onBlur,\r\n classNames: cCls, styles: cSty, renderDropzone, renderPreview,\r\n } = props;\r\n\r\n const ctx = useImageUploadContext();\r\n const isUnstyled = props.unstyled ?? ctx.unstyled;\r\n const pCls = ctx.singleClassNames;\r\n const pSty = ctx.singleStyles;\r\n\r\n const slotClass = (slot: SingleUploadSlot, defaultClass?: string) =>\r\n resolveSlotClass(defaultClass, isUnstyled, pCls?.[slot], cCls?.[slot]);\r\n const slotStyle = (slot: SingleUploadSlot) =>\r\n resolveSlotStyle(pSty?.[slot], cSty?.[slot]);\r\n\r\n const state = useSingleImageState(props);\r\n const { isDragging, dragHandlers } = useDragAndDrop({ disabled, onDrop: state.handleFileSelect });\r\n const { onPaste } = useClipboardPaste({\r\n enabled: enablePaste, pasteTarget, disabled, multiple: false,\r\n onPasteFiles: (files) => { void state.handleFileSelect(files); },\r\n });\r\n\r\n const dropzoneRef = useRef<HTMLDivElement>(null);\r\n const labelId = useId();\r\n const inputId = useId();\r\n const statusTextId = useId();\r\n\r\n const openFileDialog = () => { if (!disabled) state.fileInputRef.current?.click(); };\r\n\r\n useImperativeHandle(ref, () => ({\r\n focus: () => { dropzoneRef.current?.focus(); },\r\n open: openFileDialog,\r\n clear: () => state.handleRemoveTile(),\r\n }));\r\n\r\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\r\n const files = event.target.files;\r\n if (files && files.length > 0) void state.handleFileSelect(files);\r\n event.target.value = '';\r\n };\r\n\r\n const displayError = error || state.validationError;\r\n const hasPreview = Boolean(state.preview);\r\n const hasError = Boolean(displayError);\r\n const hasLabel = Boolean(label || state.ui.uploadImage);\r\n const hasStatusText = Boolean(helperText || displayError);\r\n const visualState = resolveUploadDataState({\r\n disabled, hasError, isUploading: state.isUploading, isDragging, hasContent: hasPreview,\r\n });\r\n\r\n const dropzoneProps: HTMLAttributes<HTMLElement> = hasPreview\r\n ? { ...dragHandlers, onPaste, 'aria-disabled': disabled || undefined }\r\n : {\r\n ...dragHandlers, onPaste,\r\n onClick: () => { if (!disabled) openFileDialog(); },\r\n onKeyDown: (event) => {\r\n if (!disabled && (event.key === 'Enter' || event.key === ' ')) {\r\n event.preventDefault();\r\n openFileDialog();\r\n }\r\n },\r\n role: 'button', tabIndex: disabled ? -1 : 0,\r\n 'aria-label': state.ui.uploadImageAria,\r\n 'aria-labelledby': hasLabel ? labelId : undefined,\r\n 'aria-required': required || undefined,\r\n 'aria-invalid': hasError || undefined,\r\n 'aria-describedby': hasStatusText ? statusTextId : undefined,\r\n 'aria-disabled': disabled || undefined,\r\n };\r\n\r\n const slotStylingProps = {\r\n unstyled: isUnstyled, providerClassNames: pCls, classNames: cCls, providerStyles: pSty, styles: cSty,\r\n };\r\n const dropzoneSlot = resolveSingleDropzoneSlot(\r\n { isDragging, hasPreview, disabled, hasError }, slotStylingProps,\r\n );\r\n\r\n return (\r\n <div\r\n data-slot=\"single-root\" data-state={visualState} data-unstyled={isUnstyled || undefined}\r\n className={resolveSlotClass('iuk-single', isUnstyled, pCls?.root, cCls?.root, className)}\r\n style={resolveSlotStyle(pSty?.root, cSty?.root, style)}\r\n dir={state.locale === 'ar' ? 'rtl' : 'ltr'}\r\n onBlur={onBlur ? (e) => { if (!e.currentTarget.contains(e.relatedTarget as Node | null)) onBlur(); } : undefined}\r\n >\r\n <div role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" style={HIDDEN_INPUT_STYLE}>\r\n {state.liveAnnouncement}\r\n </div>\r\n\r\n {name && (\r\n <input type=\"hidden\" name={name} value={state.serializedFormValue} required={required} data-slot=\"form-input\" />\r\n )}\r\n\r\n {hasLabel && (\r\n <label id={labelId} htmlFor={inputId} data-slot=\"label\" className={slotClass('label', 'iuk-label')} style={slotStyle('label')}>\r\n <span>{label || state.ui.uploadImage}</span>\r\n {required && <span className={resolveSlotClass('iuk-required', isUnstyled)}>*</span>}\r\n </label>\r\n )}\r\n\r\n {showQualitySelector && (\r\n <div data-slot=\"quality-selector\" className={slotClass('qualitySelector')} style={slotStyle('qualitySelector')}>\r\n <QualitySelector\r\n value={state.qualityLevel} onChange={state.setQualityLevel} preset={preset}\r\n recommendedLevel={recommendedQuality} recommendationNote={qualityNote}\r\n originalFileSize={state.selectedFile?.size} locale={state.locale}\r\n disabled={disabled || state.isUploading} unstyled={isUnstyled}\r\n />\r\n </div>\r\n )}\r\n\r\n <input\r\n id={inputId} ref={state.fileInputRef} type=\"file\" accept={accept} capture={capture}\r\n onChange={handleInputChange}\r\n className={resolveSlotClass('iuk-hidden-input', isUnstyled)}\r\n style={isUnstyled ? HIDDEN_INPUT_STYLE : undefined}\r\n disabled={disabled} aria-label={state.ui.fileInputAria}\r\n aria-invalid={hasError || undefined}\r\n aria-describedby={hasStatusText ? statusTextId : undefined}\r\n />\r\n\r\n {!state.preview && renderDropzone ? (\r\n renderDropzone({\r\n state: visualState, isDragging, isUploading: state.isUploading,\r\n progress: state.progress, uploadMessage: state.uploadMessage,\r\n maxSizeMB: state.maxSizeMB, disabled, error: displayError || undefined,\r\n qualityLevel: state.qualityLevel, setQualityLevel: state.setQualityLevel,\r\n openFileDialog, dropzoneProps, locale: state.locale, ui: state.ui,\r\n })\r\n ) : (\r\n <div\r\n ref={dropzoneRef} data-slot=\"dropzone\" data-state={visualState}\r\n data-dragging={isDragging || undefined} data-uploading={state.isUploading || undefined}\r\n data-disabled={disabled || undefined} data-error={hasError || undefined}\r\n className={dropzoneSlot.className} style={dropzoneSlot.style} {...dropzoneProps}\r\n >\r\n {state.preview ? (\r\n <div\r\n data-slot=\"preview-wrap\" className={slotClass('previewWrap', 'iuk-single__preview-wrap')}\r\n style={slotStyle('previewWrap')} onClick={(event) => event.stopPropagation()}\r\n >\r\n {renderPreview ? (\r\n renderPreview({\r\n previewUrl: state.preview, uploadedData: state.uploadedData, altText: state.altText,\r\n blurColor: state.uploadedData?.blurColor ?? state.blurColor,\r\n blurDataUrl: state.blurDataUrlState || state.currentImageData?.blurDataUrl || '',\r\n isUploading: state.isUploading, progress: state.progress,\r\n uploadMessage: state.uploadMessage, sizeInfo: state.sizeInfo, disabled,\r\n openFileDialog, remove: () => state.handleRemoveTile(),\r\n cancel: () => state.handleCancelUpload(),\r\n openAltTextModal: () => state.setEditingAltText(true),\r\n openBlurInspector: () => state.setIsBlurModalOpen(true),\r\n download: state.handleDownload, locale: state.locale, ui: state.ui,\r\n })\r\n ) : (\r\n <PreviewTile\r\n preview={{\r\n id: 'single', url: state.preview, altText: state.altText,\r\n isUploading: state.isUploading, progress: state.progress,\r\n uploadMessage: state.uploadMessage || null,\r\n originalSize: state.sizeInfo?.original,\r\n optimizedSize: state.sizeInfo?.optimized ?? null,\r\n data: state.uploadedData ?? undefined,\r\n blurColor: state.uploadedData?.blurColor ?? state.blurColor,\r\n }}\r\n onRemove={() => state.handleRemoveTile()} onCancel={() => state.handleCancelUpload()}\r\n disabled={disabled} blurType={blurType} showCheckbox={false}\r\n onEditAltText={() => state.setEditingAltText(true)}\r\n onAdjustColor={() => state.setIsBlurModalOpen(true)}\r\n locale={state.locale} translations={translations} renderImage={renderImage}\r\n unstyled={isUnstyled} className={slotClass('tile')} style={slotStyle('tile')}\r\n />\r\n )}\r\n </div>\r\n ) : (\r\n <SingleDropzoneEmptyPrompt\r\n isUploading={state.isUploading} uploadMessage={state.uploadMessage}\r\n showProgress={showProgress} progress={state.progress}\r\n maxSizeMB={state.maxSizeMB} enablePaste={enablePaste} ui={state.ui} {...slotStylingProps}\r\n />\r\n )}\r\n </div>\r\n )}\r\n\r\n <SingleStatusFooter\r\n showMissingAltWarning={state.showMissingAltWarning}\r\n hasPreview={hasPreview} hasAltText={Boolean(state.altText?.trim())}\r\n uploadMessage={state.uploadMessage} isUploading={state.isUploading}\r\n sizeInfo={state.sizeInfo} canDownload={state.canDownload}\r\n onDownload={() => void state.handleDownload()}\r\n helperText={helperText} displayError={displayError} statusTextId={statusTextId}\r\n isOpen={isOpen} requireAltText={state.requireAltText}\r\n disabled={disabled} onSave={state.handleSaveImage}\r\n ui={state.ui} {...slotStylingProps}\r\n />\r\n\r\n {state.editingAltText && state.preview && (\r\n <AltTextModal\r\n imageUrl={state.preview} initialAltText={state.altText}\r\n onSave={state.handleAltTextSave} onClose={() => state.setEditingAltText(false)}\r\n locale={state.locale} translations={translations} renderImage={renderImage}\r\n />\r\n )}\r\n\r\n {state.preview && (\r\n <BlurVisualizationModal\r\n isOpen={state.isBlurModalOpen} onClose={() => state.setIsBlurModalOpen(false)}\r\n imageUrl={state.preview}\r\n blurDataUrl={state.blurDataUrlState || state.currentImageData?.blurDataUrl}\r\n blurColor={state.blurColor} altText={state.altText}\r\n originalSize={state.sizeInfo?.original ?? state.currentImageData?.originalSize}\r\n optimizedSize={state.sizeInfo?.optimized ?? state.currentImageData?.size ?? null}\r\n detectedColor={state.detectedBlurColor}\r\n onChangeColor={(hex) => state.applyBlurColor(hex)}\r\n onUseDetectedColor={state.handleResetColor}\r\n onChangeAltText={(nextAlt) => state.handleAltTextSave(nextAlt)}\r\n locale={state.locale} translations={translations} renderImage={renderImage}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport const SingleImageUpload = forwardRef(SingleImageUploadInner) as <\r\n TPreset extends string = UploadPresetName,\r\n>(\r\n props: SingleImageUploadProps<TPreset> & { ref?: Ref<ImageUploadHandle> },\r\n) => ReactElement | null;\r\n\r\nexport default SingleImageUpload;\r\n","import {\r\n AlertTriangleIcon as AlertTriangle,\r\n DownloadIcon as Download,\r\n ImagePlusIcon as ImagePlus,\r\n SaveIcon as Save,\r\n UploadIcon as Upload,\r\n} from '../icons';\r\nimport type { CSSProperties } from 'react';\r\nimport type { UploadTranslations } from '../i18n';\r\nimport type {\r\n SingleUploadClassNames,\r\n SingleUploadSlot,\r\n SingleUploadStyles,\r\n} from '../styling';\r\nimport { cx, resolveSlotClass, resolveSlotStyle } from '../utils/slotStyles';\r\nimport { SaveButton } from './SaveButton';\r\n\r\nfunction formatCompactBytes(bytes: number): string {\r\n if (bytes < 1024) return `${bytes} B`;\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\r\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\r\n}\r\n\r\nexport interface SingleSlotStylingProps {\r\n unstyled?: boolean;\r\n providerClassNames?: SingleUploadClassNames;\r\n classNames?: SingleUploadClassNames;\r\n providerStyles?: SingleUploadStyles;\r\n styles?: SingleUploadStyles;\r\n}\r\n\r\nexport function resolveSingleDropzoneSlot(\r\n flags: {\r\n isDragging: boolean;\r\n hasPreview: boolean;\r\n disabled: boolean;\r\n hasError: boolean;\r\n },\r\n styling: SingleSlotStylingProps,\r\n): { className?: string; style?: CSSProperties } {\r\n const { isDragging, hasPreview, disabled, hasError } = flags;\r\n const { unstyled, providerClassNames: pCls, classNames: cCls, providerStyles: pSty, styles: cSty } = styling;\r\n return {\r\n className: resolveSlotClass(\r\n cx(\r\n 'iuk-dropzone',\r\n isDragging && 'iuk-dropzone--dragging',\r\n hasPreview && 'iuk-dropzone--has-image',\r\n disabled && 'iuk-dropzone--disabled',\r\n hasError && 'iuk-dropzone--error',\r\n ),\r\n unstyled,\r\n pCls?.dropzone, cCls?.dropzone,\r\n isDragging && pCls?.dropzoneDragging, isDragging && cCls?.dropzoneDragging,\r\n hasPreview && pCls?.dropzoneHasImage, hasPreview && cCls?.dropzoneHasImage,\r\n disabled && pCls?.dropzoneDisabled, disabled && cCls?.dropzoneDisabled,\r\n hasError && pCls?.dropzoneError, hasError && cCls?.dropzoneError,\r\n ),\r\n style: resolveSlotStyle(\r\n pSty?.dropzone, cSty?.dropzone,\r\n isDragging ? pSty?.dropzoneDragging : undefined, isDragging ? cSty?.dropzoneDragging : undefined,\r\n hasPreview ? pSty?.dropzoneHasImage : undefined, hasPreview ? cSty?.dropzoneHasImage : undefined,\r\n disabled ? pSty?.dropzoneDisabled : undefined, disabled ? cSty?.dropzoneDisabled : undefined,\r\n hasError ? pSty?.dropzoneError : undefined, hasError ? cSty?.dropzoneError : undefined,\r\n ),\r\n };\r\n}\r\n\r\nexport interface SingleDropzoneEmptyPromptProps extends SingleSlotStylingProps {\r\n isUploading: boolean;\r\n uploadMessage: string;\r\n showProgress: boolean;\r\n progress: number;\r\n maxSizeMB: number;\r\n enablePaste?: boolean;\r\n ui: UploadTranslations;\r\n}\r\n\r\nexport function SingleDropzoneEmptyPrompt({\r\n isUploading, uploadMessage, showProgress, progress, maxSizeMB, enablePaste = true, ui,\r\n unstyled, providerClassNames, classNames, providerStyles, styles,\r\n}: SingleDropzoneEmptyPromptProps) {\r\n const slotClass = (slot: SingleUploadSlot, defaultClass?: string) =>\r\n resolveSlotClass(defaultClass, unstyled, providerClassNames?.[slot], classNames?.[slot]);\r\n const slotStyle = (slot: SingleUploadSlot) =>\r\n resolveSlotStyle(providerStyles?.[slot], styles?.[slot]);\r\n\r\n return (\r\n <div\r\n data-slot=\"dropzone-prompt\"\r\n className={slotClass('dropzonePrompt', 'iuk-dropzone__prompt')}\r\n style={slotStyle('dropzonePrompt')}\r\n >\r\n <div\r\n data-slot=\"dropzone-icon\"\r\n className={slotClass('dropzoneIcon', 'iuk-dropzone__icon')}\r\n style={slotStyle('dropzoneIcon')}\r\n >\r\n {isUploading ? (\r\n <div className={resolveSlotClass('iuk-spinner', unstyled)} />\r\n ) : (\r\n <ImagePlus size={36} strokeWidth={1.5} />\r\n )}\r\n </div>\r\n <p\r\n data-slot=\"dropzone-text\"\r\n className={slotClass('dropzoneText', 'iuk-dropzone__text')}\r\n style={slotStyle('dropzoneText')}\r\n >\r\n {isUploading ? uploadMessage || `${ui.uploading}...` : ui.dragDropOrClickToUpload}\r\n </p>\r\n {isUploading && showProgress && progress > 0 && (\r\n <p\r\n data-slot=\"dropzone-progress\"\r\n role=\"progressbar\"\r\n aria-valuenow={Math.round(progress)}\r\n aria-valuemin={0}\r\n aria-valuemax={100}\r\n aria-label={ui.uploading}\r\n className={slotClass('dropzoneProgress', 'iuk-dropzone__progress')}\r\n style={slotStyle('dropzoneProgress')}\r\n >\r\n {progress}%\r\n </p>\r\n )}\r\n {!isUploading && (\r\n <>\r\n <p\r\n data-slot=\"dropzone-hint\"\r\n className={slotClass('dropzoneHint', 'iuk-dropzone__hint')}\r\n style={slotStyle('dropzoneHint')}\r\n >\r\n {ui.upToSizeMB.replace('{size}', String(maxSizeMB))}\r\n {enablePaste ? ` • ${ui.pasteHint}` : ''}\r\n </p>\r\n <span\r\n data-slot=\"browse-button\"\r\n className={slotClass('browseButton', 'iuk-btn iuk-btn--secondary')}\r\n style={slotStyle('browseButton')}\r\n >\r\n <Upload size={15} />\r\n <span>{ui.browseFiles}</span>\r\n </span>\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport interface SingleStatusFooterProps extends SingleSlotStylingProps {\r\n showMissingAltWarning: boolean;\r\n hasPreview: boolean;\r\n hasAltText: boolean;\r\n uploadMessage: string;\r\n isUploading: boolean;\r\n sizeInfo: { original: number; optimized: number } | null;\r\n canDownload: boolean;\r\n onDownload: () => void;\r\n helperText?: string;\r\n displayError?: string;\r\n statusTextId?: string;\r\n isOpen?: boolean;\r\n requireAltText?: boolean;\r\n disabled?: boolean;\r\n onSave?: () => void;\r\n ui: UploadTranslations;\r\n}\r\n\r\nexport function SingleStatusFooter({\r\n showMissingAltWarning, hasPreview, hasAltText, uploadMessage, isUploading,\r\n sizeInfo, canDownload, onDownload, helperText, displayError, statusTextId,\r\n isOpen, requireAltText, disabled, onSave, ui,\r\n unstyled, providerClassNames, classNames, providerStyles, styles,\r\n}: SingleStatusFooterProps) {\r\n const slotClass = (slot: SingleUploadSlot, defaultClass?: string) =>\r\n resolveSlotClass(defaultClass, unstyled, providerClassNames?.[slot], classNames?.[slot]);\r\n const slotStyle = (slot: SingleUploadSlot) =>\r\n resolveSlotStyle(providerStyles?.[slot], styles?.[slot]);\r\n\r\n return (\r\n <>\r\n {showMissingAltWarning && hasPreview && !hasAltText && (\r\n <div\r\n data-slot=\"alert\"\r\n role=\"alert\"\r\n className={slotClass('alert', 'iuk-alert iuk-alert--warning')}\r\n style={slotStyle('alert')}\r\n >\r\n <AlertTriangle size={16} />\r\n <span>{ui.addAltBeforeSaving}</span>\r\n </div>\r\n )}\r\n\r\n {uploadMessage && !isUploading && sizeInfo && (\r\n <div\r\n data-slot=\"alert\"\r\n role=\"status\"\r\n className={slotClass('alert', 'iuk-alert iuk-alert--success')}\r\n style={slotStyle('alert')}\r\n >\r\n <span>{uploadMessage}</span>\r\n </div>\r\n )}\r\n\r\n {hasPreview && canDownload && (\r\n <button\r\n type=\"button\"\r\n data-slot=\"download-button\"\r\n className={slotClass('downloadButton', 'iuk-btn iuk-btn--secondary iuk-single__download')}\r\n style={slotStyle('downloadButton')}\r\n onClick={onDownload}\r\n disabled={isUploading}\r\n aria-label={ui.downloadImage}\r\n >\r\n <Download size={15} aria-hidden=\"true\" />\r\n <span>{ui.downloadImage}</span>\r\n {sizeInfo && (\r\n <span className={resolveSlotClass('iuk-badge', unstyled)}>\r\n {formatCompactBytes(sizeInfo.optimized)}\r\n </span>\r\n )}\r\n </button>\r\n )}\r\n\r\n {(helperText || displayError) && (\r\n <p\r\n id={statusTextId}\r\n role={displayError ? 'alert' : undefined}\r\n data-slot={displayError ? 'error-text' : 'helper-text'}\r\n className={resolveSlotClass(\r\n cx('iuk-helper-text', Boolean(displayError) && 'iuk-helper-text--error'),\r\n unstyled,\r\n providerClassNames?.helperText, classNames?.helperText,\r\n Boolean(displayError) && providerClassNames?.errorText,\r\n Boolean(displayError) && classNames?.errorText,\r\n )}\r\n style={resolveSlotStyle(\r\n providerStyles?.helperText, styles?.helperText,\r\n displayError ? providerStyles?.errorText : undefined,\r\n displayError ? styles?.errorText : undefined,\r\n )}\r\n >\r\n {displayError || helperText}\r\n </p>\r\n )}\r\n\r\n {isOpen && hasPreview && onSave && (\r\n <div\r\n data-slot=\"commit-bar\"\r\n className={slotClass('commitBar', 'iuk-commit-bar')}\r\n style={slotStyle('commitBar')}\r\n >\r\n {requireAltText && !hasAltText && (\r\n <div className={resolveSlotClass('iuk-badge iuk-badge--warning', unstyled)}>\r\n <AlertTriangle size={13} />\r\n <span>{ui.missingDescription}</span>\r\n </div>\r\n )}\r\n <SaveButton\r\n unstyled={unstyled}\r\n className={slotClass('saveButton')}\r\n style={slotStyle('saveButton')}\r\n onClick={onSave}\r\n disabled={isUploading || disabled || Boolean(requireAltText && !hasAltText)}\r\n icon={<Save size={16} />}\r\n >\r\n {ui.saveImage}\r\n </SaveButton>\r\n </div>\r\n )}\r\n </>\r\n );\r\n}\r\n"],"mappings":"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","names":["useEffect","useEffect","cx","useId","jsx","jsxs","useId","useRef","useState","useEffect","useMemo","useRef","jsx","jsxs","useRef","useMemo","useEffect","jsx","jsxs","useState","useRef","useMemo","useEffect","useRef","useState","jsx","jsxs","useMemo","useEffect","useEffect","useEffect","useId","useMemo","useRef","useState","createPortal","jsx","jsxs","jsx","jsxs","jsx","jsxs","useId","useMemo","useState","useRef","useEffect","createPortal","forwardRef","useEffect","useState","createPortal","Fragment","useId","useRef","createPortal","jsx","jsxs","jsx","jsxs","useMemo","useState","jsx","jsxs","useState","useMemo","Fragment","jsx","jsxs","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","p","Fragment","jsx","jsxs","useRef","useId","p","createPortal","forwardRef","useId","useImperativeHandle","useRef","Fragment","jsx","jsxs","jsx","jsxs","useRef","useId","useImperativeHandle","forwardRef","Fragment","jsx","jsxs","useState","useEffect","createPortal","forwardRef"]}
1
+ {"version":3,"sources":["../src/react/hooks/index.ts","../src/react/hooks/useBlurService.ts","../src/react/hooks/useDialog.ts","../src/react/icons.tsx","../src/react/components/AltTextInput.tsx","../src/react/components/AltTextModal.tsx","../src/react/components/BlurImage.tsx","../src/react/components/AnimatedImage/AnimatedImage.tsx","../src/react/components/AnimatedImage/placeholder.ts","../src/react/components/AnimatedImage/useImageReveal.ts","../src/react/components/BlurServiceDebugger.tsx","../src/react/components/BlurVisualizationModal.tsx","../src/react/utils/canvasSampler.ts","../src/react/components/BlurColorControls.tsx","../src/react/components/SaveButton.tsx","../src/react/components/ImageUpload.tsx","../src/react/components/MultiImageUpload.tsx","../src/react/components/MultiDropzoneViews.tsx","../src/react/components/MultiUploadHeaderAlerts.tsx","../src/react/components/PreviewTile.tsx","../src/react/components/QualitySelector.tsx","../src/react/components/UploadProgressPanel.tsx","../src/react/components/SingleImageUpload.tsx","../src/react/components/SingleDropzoneContent.tsx"],"sourcesContent":["import { useEffect } from 'react';\nimport {\n blurService,\n type BlurSize,\n useProgressiveBlur,\n} from './useBlurService';\n\nexport * from './useBlurService';\nexport {\n extractClipboardImageFiles,\n type PasteTargetMode,\n toFileListLike,\n useClipboardPaste,\n type UseClipboardPasteOptions,\n} from './useClipboardPaste';\nexport { useDialog, type UseDialogOptions } from './useDialog';\nexport {\n useDragAndDrop,\n type UseDragAndDropOptions,\n} from './useDragAndDrop';\nexport { useFilePreview, type UseFilePreviewOptions } from './useFilePreview';\nexport {\n type UploadCallOptions,\n useImageUpload,\n type UseImageUploadOptions,\n} from './useImageUpload';\nexport {\n buildUploadFormData,\n createUploadAbortError,\n isUploadAbortError,\n parseErrorPayload,\n type UploadFormFields,\n uploadViaXhr,\n type XhrUploadOptions,\n} from './xhrUpload';\n\nexport const useProgressiveImage = useProgressiveBlur;\n\nexport function useBlurPreload(\n imageSrcs: string[],\n size: BlurSize = 'small',\n): void {\n useEffect(() => {\n if (imageSrcs.length > 0) {\n blurService.preloadBlurData(imageSrcs, size);\n }\n }, [imageSrcs, size]);\n}\n","import { useMemo } from 'react';\nimport { blurService } from '../../blur/blurService';\nimport { DEFAULT_PLACEHOLDERS } from '../../blur/placeholders';\nimport type { BlurPlaceholderType, BlurSize } from '../../blur/types';\n\nexport function useBlurDataURL(\n imageSrc: string | undefined,\n options: {\n type?: BlurPlaceholderType;\n size?: BlurSize;\n } = {},\n): string {\n const { type = 'default', size = 'small' } = options;\n\n return useMemo(() => {\n if (!imageSrc) return DEFAULT_PLACEHOLDERS[type];\n return blurService.getBlurDataURL(imageSrc, { type, size });\n }, [imageSrc, type, size]);\n}\n\nexport function useBulkBlurData(\n imageSrcs: string[],\n options: {\n type?: BlurPlaceholderType;\n size?: BlurSize;\n } = {},\n): Record<string, string> {\n const { type = 'default', size = 'small' } = options;\n\n return useMemo(() => {\n return blurService.getBulkBlurData(imageSrcs, { type, size });\n }, [imageSrcs, type, size]);\n}\n\nexport function useProgressiveBlur(\n imageSrc: string | undefined,\n size: BlurSize = 'small',\n) {\n return useMemo(() => {\n if (!imageSrc) {\n return {\n color: '#E5E7EB',\n blur: DEFAULT_PLACEHOLDERS.default,\n hasBlur: false,\n };\n }\n return blurService.getProgressiveData(imageSrc, size);\n }, [imageSrc, size]);\n}\n\nexport function useHasBlurHash(imageSrc: string | undefined): boolean {\n return useMemo(() => {\n if (!imageSrc) return false;\n return blurService.hasBlurHash(imageSrc);\n }, [imageSrc]);\n}\n\nexport function useDominantColor(imageSrc: string | undefined): string {\n return useMemo(() => {\n if (!imageSrc) return '#E5E7EB';\n return blurService.getDominantColor(imageSrc);\n }, [imageSrc]);\n}\n\nexport function useBlurMetadata() {\n return useMemo(() => {\n return blurService.getMetadata();\n }, []);\n}\n\nexport function useBlurHash(imageSrc: string | undefined): string | null {\n return useMemo(() => {\n if (!imageSrc) return null;\n return blurService.getBlurHash(imageSrc);\n }, [imageSrc]);\n}\n\nexport function useBlurDataWithColor(\n imageSrc: string | undefined,\n size: BlurSize = 'small',\n): {\n blurDataUrl: string;\n blurColor: string;\n hasBlur: boolean;\n} {\n return useMemo(() => {\n if (!imageSrc) {\n return {\n blurDataUrl: DEFAULT_PLACEHOLDERS.default,\n blurColor: '#E5E7EB',\n hasBlur: false,\n };\n }\n const progressive = blurService.getProgressiveData(imageSrc, size);\n return {\n blurDataUrl: progressive.blur,\n blurColor: progressive.color,\n hasBlur: progressive.hasBlur,\n };\n }, [imageSrc, size]);\n}\n\nexport function useBlurVariant(\n imageSrc: string | undefined,\n size: BlurSize = 'small',\n type: BlurPlaceholderType = 'default',\n): string {\n return useMemo(() => {\n if (!imageSrc) return DEFAULT_PLACEHOLDERS[type];\n return blurService.getBlurDataURL(imageSrc, { type, size });\n }, [imageSrc, size, type]);\n}\n\nexport { blurService, DEFAULT_PLACEHOLDERS };\nexport type { BlurPlaceholderType, BlurSize };\n","import { type RefObject, useEffect, useId, useRef } from 'react';\n\nconst FOCUSABLE_SELECTOR = [\n 'button:not(:disabled)',\n '[href]',\n 'input:not(:disabled):not([type=\"hidden\"])',\n 'select:not(:disabled)',\n 'textarea:not(:disabled)',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(', ');\n\nexport interface UseDialogOptions {\n isOpen: boolean;\n onClose?: () => void;\n initialFocusRef?: RefObject<HTMLElement | null>;\n lockScroll?: boolean;\n}\n\nexport function useDialog({\n isOpen,\n onClose,\n initialFocusRef,\n lockScroll = true,\n}: UseDialogOptions) {\n const dialogRef = useRef<HTMLDivElement | null>(null);\n const onCloseRef = useRef(onClose);\n onCloseRef.current = onClose;\n const titleId = useId();\n const descriptionId = useId();\n\n useEffect(() => {\n if (!isOpen || typeof document === 'undefined') return;\n\n const previouslyFocused =\n document.activeElement instanceof HTMLElement\n ? document.activeElement\n : null;\n\n const prevOverflow = document.body.style.overflow;\n if (lockScroll) {\n document.body.style.overflow = 'hidden';\n }\n\n const focusInitial = () => {\n const container = dialogRef.current;\n if (!container) return;\n if (initialFocusRef?.current) {\n initialFocusRef.current.focus();\n return;\n }\n if (\n document.activeElement &&\n container.contains(document.activeElement)\n ) {\n return;\n }\n const focusables = Array.from(\n container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n );\n if (focusables.length > 0) {\n focusables[0].focus();\n } else {\n container.focus();\n }\n };\n\n focusInitial();\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && onCloseRef.current) {\n event.stopPropagation();\n onCloseRef.current();\n return;\n }\n\n if (event.key !== 'Tab') return;\n const container = dialogRef.current;\n if (!container) return;\n\n const focusables = Array.from(\n container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n );\n if (focusables.length === 0) {\n event.preventDefault();\n return;\n }\n\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n const active = document.activeElement as HTMLElement | null;\n\n if (event.shiftKey) {\n if (!active || active === first || !container.contains(active)) {\n event.preventDefault();\n last.focus();\n }\n } else if (!active || active === last || !container.contains(active)) {\n event.preventDefault();\n first.focus();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n if (lockScroll) {\n document.body.style.overflow = prevOverflow;\n }\n if (previouslyFocused && typeof previouslyFocused.focus === 'function') {\n try {\n previouslyFocused.focus();\n } catch {\n // Ignore focus restore errors if node was detached\n }\n }\n };\n }, [isOpen, lockScroll, initialFocusRef]);\n\n return {\n dialogRef,\n titleId,\n descriptionId,\n };\n}\n","/**\n * Inline SVG icon set (24×24, stroke-based) used by the styled components.\n *\n * Replaces the former `lucide-react` dependency so consumers do not need to\n * install an icon library. Path data is derived from Lucide (ISC license,\n * https://lucide.dev/license). The prop API mirrors the subset of Lucide's\n * API the kit relied on: `size`, `strokeWidth`, `color`, `className` and any\n * other SVG attribute. Icons are decorative (`aria-hidden`) by default unless\n * an `aria-label` / `aria-labelledby` is supplied.\n */\nimport type { JSX, SVGProps } from 'react';\n\ntype IconTag = 'path' | 'circle';\ntype IconNode = ReadonlyArray<readonly [IconTag, Readonly<Record<string, string>>]>;\n\nexport interface IconProps extends Omit<SVGProps<SVGSVGElement>, 'ref'> {\n /** Width & height in px (number) or any CSS length (string). Default 24. */\n size?: number | string;\n /** Stroke width. Default 2. */\n strokeWidth?: number | string;\n /** Stroke color. Default `currentColor`. */\n color?: string;\n}\n\nexport type IconComponent = ((props: IconProps) => JSX.Element) & {\n displayName?: string;\n};\n\nfunction createIcon(name: string, nodes: IconNode): IconComponent {\n const Icon = ({\n size = 24,\n strokeWidth = 2,\n color = 'currentColor',\n className,\n children,\n ...rest\n }: IconProps) => {\n const labelled =\n rest['aria-label'] !== undefined || rest['aria-labelledby'] !== undefined;\n const baseClass = `iuk-icon iuk-icon--${name}`;\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className ? `${baseClass} ${className}` : baseClass}\n aria-hidden={labelled ? undefined : true}\n focusable=\"false\"\n {...rest}\n >\n {nodes.map(([Tag, attrs], index) => (\n <Tag key={index} {...attrs} />\n ))}\n {children}\n </svg>\n );\n };\n Icon.displayName = `Icon(${name})`;\n return Icon;\n}\n\nconst p = (d: string) => ['path', { d }] as const;\nconst c = (cx: string, cy: string, r: string, fill?: string) => {\n const attrs: Record<string, string> = { cx, cy, r };\n if (fill) attrs.fill = fill;\n return ['circle', attrs] as const;\n};\n\nconst UPLOAD_TRAY = 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4';\n\nexport const UploadIcon = createIcon('upload', [\n p('M12 3v12'),\n p('m17 8-5-5-5 5'),\n p(UPLOAD_TRAY),\n]);\n\nexport const DownloadIcon = createIcon('download', [\n p('M12 15V3'),\n p(UPLOAD_TRAY),\n p('m7 10 5 5 5-5'),\n]);\n\nexport const ImagePlusIcon = createIcon('image-plus', [\n p('M16 5h6'),\n p('M19 2v6'),\n p('M21 11.5V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h7.5'),\n p('m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21'),\n c('9', '9', '2'),\n]);\n\nexport const XIcon = createIcon('x', [p('M18 6 6 18'), p('m6 6 12 12')]);\n\nexport const CheckIcon = createIcon('check', [p('M20 6 9 17l-5-5')]);\n\nexport const MinusIcon = createIcon('minus', [p('M5 12h14')]);\n\nexport const LoaderIcon = createIcon('loader', [\n p('M21 12a9 9 0 1 1-6.219-8.56'),\n]);\n\nexport const ChevronUpIcon = createIcon('chevron-up', [p('m18 15-6-6-6 6')]);\n\nexport const ChevronDownIcon = createIcon('chevron-down', [p('m6 9 6 6 6-6')]);\n\nexport const AlertTriangleIcon = createIcon('alert-triangle', [\n p('m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3'),\n p('M12 9v4'),\n p('M12 17h.01'),\n]);\n\nexport const SaveIcon = createIcon('save', [\n p(\n 'M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z',\n ),\n p('M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7'),\n p('M7 3v4a1 1 0 0 0 1 1h7'),\n]);\n\nexport const EyeIcon = createIcon('eye', [\n p(\n 'M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0',\n ),\n c('12', '12', '3'),\n]);\n\nexport const InfoIcon = createIcon('info', [\n c('12', '12', '10'),\n p('M12 16v-4'),\n p('M12 8h.01'),\n]);\n\nexport const ZapIcon = createIcon('zap', [\n p(\n 'M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z',\n ),\n]);\n\nexport const CheckCircleIcon = createIcon('check-circle', [\n c('12', '12', '10'),\n p('m9 12 2 2 4-4'),\n]);\n\nexport const XCircleIcon = createIcon('x-circle', [\n c('12', '12', '10'),\n p('m15 9-6 6'),\n p('m9 9 6 6'),\n]);\n\nexport const TypeIcon = createIcon('type', [\n p('M12 4v16'),\n p('M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2'),\n p('M9 20h6'),\n]);\n\nexport const FolderOpenIcon = createIcon('folder-open', [\n p(\n 'm6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2',\n ),\n]);\n\nexport const PenToolIcon = createIcon('pen-tool', [\n p(\n 'M15.707 21.293a1 1 0 0 1-1.414 0l-1.586-1.586a1 1 0 0 1 0-1.414l5.586-5.586a1 1 0 0 1 1.414 0l1.586 1.586a1 1 0 0 1 0 1.414z',\n ),\n p(\n 'm18 13-1.375-6.874a1 1 0 0 0-.746-.776L3.235 2.028a1 1 0 0 0-1.207 1.207L5.35 15.879a1 1 0 0 0 .776.746L13 18',\n ),\n p('m2.3 2.3 7.286 7.286'),\n c('11', '11', '2'),\n]);\n\nexport const WandIcon = createIcon('wand', [\n p(\n 'm21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72',\n ),\n p('m14 7 3 3'),\n p('M5 6v4'),\n p('M19 14v4'),\n p('M10 2v2'),\n p('M7 8H3'),\n p('M21 16h-4'),\n p('M11 3H9'),\n]);\n\nexport const TrashIcon = createIcon('trash', [\n p('M10 11v6'),\n p('M14 11v6'),\n p('M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6'),\n p('M3 6h18'),\n p('M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2'),\n]);\n\nexport const PaletteIcon = createIcon('palette', [\n p(\n 'M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z',\n ),\n c('13.5', '6.5', '.5', 'currentColor'),\n c('17.5', '10.5', '.5', 'currentColor'),\n c('6.5', '12.5', '.5', 'currentColor'),\n c('8.5', '7.5', '.5', 'currentColor'),\n]);\n","import { TypeIcon } from '../icons';\nimport { useId } from 'react';\nimport type { UploadLocale } from '../../types';\nimport { useImageUploadContext } from '../context';\nimport {\n normalizeUploadLocale,\n resolveTranslations,\n type UploadTranslations,\n} from '../i18n';\nimport { resolveSlotClass } from '../utils/slotStyles';\n\nexport interface AltTextInputProps {\n value: string;\n onChange: (value: string) => void;\n disabled?: boolean;\n placeholder?: string;\n maxLength?: number;\n label?: string;\n showHint?: boolean;\n locale?: UploadLocale;\n translations?: Partial<UploadTranslations>;\n unstyled?: boolean;\n}\n\nexport function AltTextInput({\n value,\n onChange,\n disabled = false,\n placeholder,\n maxLength = 200,\n label,\n showHint = true,\n locale: propLocale,\n translations,\n unstyled: propUnstyled,\n}: AltTextInputProps) {\n const ctx = useImageUploadContext();\n const isUnstyled = propUnstyled ?? ctx.unstyled;\n const locale = normalizeUploadLocale(propLocale || ctx.locale);\n const ui = resolveTranslations(locale, translations || ctx.translations);\n const resolvedPlaceholder = placeholder || ui.describeImagePlaceholder;\n const resolvedLabel = label || ui.addImageDescription;\n const inputId = useId();\n const hintId = showHint ? `${inputId}-hint` : undefined;\n const cls = (defaultClass: string) => resolveSlotClass(defaultClass, isUnstyled);\n\n return (\n <div\n data-slot=\"alt-input\"\n data-unstyled={isUnstyled || undefined}\n className={cls('iuk-alt-input')}\n dir={locale === 'ar' ? 'rtl' : 'ltr'}\n >\n <div className={cls('iuk-alt-input__header')}>\n <TypeIcon size={16} />\n <label htmlFor={inputId} className={cls('iuk-alt-input__label')}>\n {resolvedLabel}\n </label>\n </div>\n <input\n id={inputId}\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={resolvedPlaceholder}\n className={cls('iuk-alt-input__field')}\n disabled={disabled}\n maxLength={maxLength}\n aria-describedby={hintId}\n />\n {showHint && (\n <p className={cls('iuk-alt-input__hint')} id={hintId}>\n <span>\n {value.length}/{maxLength} {ui.characters}\n </span>\n <span>{ui.usedForA11ySeo}</span>\n </p>\n )}\n </div>\n );\n}\n\nexport default AltTextInput;\n","import { CheckCircleIcon as CheckCircle2, TypeIcon, XIcon as X } from '../icons';\nimport { useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { UploadLocale } from '../../types';\nimport { useImageUploadContext } from '../context';\nimport { useDialog } from '../hooks/useDialog';\nimport {\n normalizeUploadLocale,\n resolveTranslations,\n type UploadTranslations,\n} from '../i18n';\nimport type { CustomImageRenderer } from '../types';\nimport { resolveSlotClass } from '../utils/slotStyles';\nimport { BlurImage } from './BlurImage';\n\nexport interface AltTextModalProps {\n imageUrl: string;\n initialAltText?: string;\n onSave: (altText: string) => void;\n onClose: () => void;\n locale?: UploadLocale;\n translations?: Partial<UploadTranslations>;\n renderImage?: CustomImageRenderer;\n unstyled?: boolean;\n}\n\nexport function AltTextModal({\n imageUrl,\n initialAltText = '',\n onSave,\n onClose,\n locale: propLocale,\n translations,\n renderImage,\n unstyled: propUnstyled,\n}: AltTextModalProps) {\n const ctx = useImageUploadContext();\n const isUnstyled = propUnstyled ?? ctx.unstyled;\n const locale = normalizeUploadLocale(propLocale || ctx.locale);\n const ui = resolveTranslations(locale, translations || ctx.translations);\n const [localAltText, setLocalAltText] = useState(initialAltText);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const { dialogRef, titleId, descriptionId } = useDialog({\n isOpen: true,\n onClose,\n initialFocusRef: inputRef,\n });\n const cls = (defaultClass: string) => resolveSlotClass(defaultClass, isUnstyled);\n\n const handleSave = () => {\n onSave(localAltText);\n onClose();\n };\n\n const content = (\n <div\n data-slot=\"alt-modal-backdrop\"\n data-unstyled={isUnstyled || undefined}\n className={cls('iuk-modal-backdrop')}\n dir={locale === 'ar' ? 'rtl' : 'ltr'}\n onClick={onClose}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n >\n <div\n ref={dialogRef}\n data-slot=\"alt-modal\"\n className={cls('iuk-alt-modal')}\n onClick={(e) => e.stopPropagation()}\n >\n <div className={cls('iuk-alt-modal__header')}>\n <div className={cls('iuk-alt-modal__title')}>\n <TypeIcon size={18} />\n <span id={titleId}>{ui.addImageDescription}</span>\n </div>\n <button\n type=\"button\"\n className={cls('iuk-icon-btn')}\n onClick={onClose}\n title={ui.close}\n aria-label={ui.close}\n >\n <X size={18} />\n </button>\n </div>\n\n <div className={cls('iuk-alt-modal__preview')}>\n <BlurImage\n src={imageUrl}\n alt={ui.previewAlt}\n objectFit=\"contain\"\n renderImage={renderImage}\n />\n </div>\n\n <input\n ref={inputRef}\n type=\"text\"\n className={cls('iuk-alt-input__field')}\n value={localAltText}\n onChange={(e) => setLocalAltText(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSave();\n }\n }}\n placeholder={ui.describeImagePlaceholder}\n maxLength={200}\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n />\n\n <div id={descriptionId} className={cls('iuk-alt-input__hint')}>\n <span>\n {localAltText.length}/200 {ui.characters}\n </span>\n <span>{ui.usedForA11ySeo}</span>\n </div>\n\n <div className={cls('iuk-alt-modal__actions')}>\n <button\n type=\"button\"\n className={cls('iuk-btn iuk-btn--secondary')}\n onClick={onClose}\n >\n {ui.cancel}\n </button>\n <button\n type=\"button\"\n className={cls('iuk-btn iuk-btn--primary')}\n onClick={handleSave}\n >\n <CheckCircle2 size={16} />\n <span>{ui.saveDescription}</span>\n </button>\n </div>\n </div>\n </div>\n );\n\n if (typeof document !== 'undefined') {\n return createPortal(content, document.body);\n }\n return content;\n}\n\nexport default AltTextModal;\n","import {\n type CSSProperties,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { decodeBlurHashToDataURL } from '../../blur/blurDataUtils';\nimport { useImageUploadContext } from '../context';\nimport type { CustomImageRenderer } from '../types';\n\nexport interface BlurImageProps {\n src: string;\n alt: string;\n blurDataUrl?: string | null;\n blurColor?: string | null;\n blurHash?: string | null;\n objectFit?: CSSProperties['objectFit'];\n className?: string;\n imageClassName?: string;\n style?: CSSProperties;\n renderImage?: CustomImageRenderer;\n onImageLoad?: (img: HTMLImageElement | null) => void;\n}\n\nexport function BlurImage({\n src,\n alt,\n blurDataUrl,\n blurColor,\n blurHash,\n objectFit = 'cover',\n className = '',\n imageClassName = '',\n style,\n renderImage: propRenderImage,\n onImageLoad,\n}: BlurImageProps) {\n const ctx = useImageUploadContext();\n const renderImage = propRenderImage || ctx.renderImage;\n const [loadedSrc, setLoadedSrc] = useState<string | null>(null);\n const [failedSrc, setFailedSrc] = useState<string | null>(null);\n const imgRef = useRef<HTMLImageElement | null>(null);\n const onImageLoadRef = useRef(onImageLoad);\n onImageLoadRef.current = onImageLoad;\n\n const decodedHashUrl = useMemo(() => {\n if (blurDataUrl || !blurHash) return null;\n return decodeBlurHashToDataURL(blurHash, 32, 32);\n }, [blurDataUrl, blurHash]);\n\n const effectiveBlurUrl = blurDataUrl || decodedHashUrl || undefined;\n const isLoaded = loadedSrc === src;\n const hasFailed = failedSrc === src;\n\n useEffect(() => {\n const el = imgRef.current;\n if (el && el.complete && el.naturalWidth > 0) {\n setLoadedSrc(src);\n onImageLoadRef.current?.(el);\n }\n }, [src]);\n\n const imgStyle: CSSProperties = {\n width: '100%',\n height: '100%',\n objectFit,\n opacity: isLoaded || hasFailed || !effectiveBlurUrl ? 1 : 0,\n transition: 'opacity 0.28s ease-out',\n };\n\n const escapedBlurUrl = effectiveBlurUrl ? effectiveBlurUrl.replace(/\"/g, '\\\\\"') : undefined;\n\n return (\n <div\n className={`iuk-blur-image-wrap ${className}`.trim()}\n style={{\n backgroundColor: blurColor || 'var(--iuk-placeholder-bg, #f3f4f6)',\n ...style,\n }}\n >\n {escapedBlurUrl && (\n <div\n aria-hidden=\"true\"\n className={`iuk-blur-image-backdrop ${isLoaded ? 'iuk-blur-image-backdrop--hidden' : ''}`}\n style={{\n backgroundImage: `url(\"${escapedBlurUrl}\")`,\n backgroundSize: objectFit === 'contain' ? 'contain' : 'cover',\n }}\n />\n )}\n\n {renderImage ? (\n renderImage({\n src,\n alt,\n className: `iuk-blur-image-el ${imageClassName}`.trim(),\n style: imgStyle,\n onLoad: (el) => {\n setLoadedSrc(src);\n onImageLoadRef.current?.(el);\n },\n })\n ) : (\n <img\n ref={imgRef}\n src={src}\n alt={alt}\n loading=\"lazy\"\n decoding=\"async\"\n className={`iuk-blur-image-el ${imageClassName}`.trim()}\n style={imgStyle}\n onLoad={(e) => {\n setLoadedSrc(src);\n onImageLoadRef.current?.(e.currentTarget);\n }}\n onError={() => {\n setFailedSrc(src);\n }}\n />\n )}\n </div>\n );\n}\n\nexport default BlurImage;\n","import { type CSSProperties, type SyntheticEvent, useMemo } from 'react';\nimport { cx } from '../../utils/slotStyles';\nimport {\n DEFAULT_NEUTRAL_COLORS,\n resolveBackgroundColor,\n resolveIntrinsicPlaceholderUrl,\n resolvePlaceholderUrl,\n} from './placeholder';\nimport type { AnimatedImageObjectFit, AnimatedImageProps } from './types';\nimport { useImageReveal } from './useImageReveal';\n\nconst preventDrag = (event: SyntheticEvent) => event.preventDefault();\nconst cn = (...classes: Parameters<typeof cx>) => cx(...classes) || undefined;\n\n/**\n * Blur-up image with a smooth, GPU-friendly crossfade and subtle zoom reveal.\n * Matches the Imagine-Global reference design while remaining pure React,\n * SSR-safe, and framework-agnostic — plug in `next/image` via `as`.\n */\nexport function AnimatedImage({\n image,\n src: srcProp,\n alt: altProp,\n blurDataUrl: blurDataUrlProp,\n blurHash: blurHashProp,\n blurColor: blurColorProp,\n colorPlaceholder = 'flat',\n neutralColors = DEFAULT_NEUTRAL_COLORS,\n width: widthProp,\n height: heightProp,\n fill = false,\n priority,\n quality,\n objectFit = 'cover',\n objectPosition = 'center',\n showShimmer = false,\n animationDuration = 600,\n revealScale = 1.02,\n fallbackSrc,\n renderError,\n as: ImageComponent,\n imageComponentProps,\n unstyled = false,\n wrapperClassName,\n wrapperStyle,\n wrapperProps,\n placeholderClassName,\n className,\n style,\n loading: loadingProp,\n decoding = 'async',\n draggable = false,\n onLoad,\n onError,\n ...imgProps\n}: AnimatedImageProps) {\n const src = srcProp ?? image?.url ?? '';\n const alt = altProp ?? image?.altText ?? '';\n const blurDataUrl = blurDataUrlProp ?? image?.blurDataUrl;\n const blurHash = blurHashProp ?? image?.blurHash;\n const blurColor = blurColorProp ?? image?.blurColor;\n const width = widthProp ?? (!fill ? image?.width : undefined);\n const height = heightProp ?? (!fill ? image?.height : undefined);\n\n const {\n activeSrc,\n retryKey,\n isLoaded,\n showPlaceholder,\n hasError,\n imgRef,\n handleLoad,\n handleError,\n retry,\n } = useImageReveal({\n srcKey: src,\n fallbackSrc,\n animationDuration,\n onLoad,\n });\n\n const state = hasError ? 'error' : isLoaded ? 'loaded' : 'loading';\n const resolvedObjectFit =\n (style?.objectFit as AnimatedImageObjectFit | undefined) ?? objectFit;\n const isContain = resolvedObjectFit === 'contain';\n\n const placeholderUrl = useMemo(\n () =>\n colorPlaceholder === 'gradient' || isContain\n ? resolvePlaceholderUrl({ blurDataUrl, blurHash, blurColor, neutralColors })\n : resolveIntrinsicPlaceholderUrl({ blurDataUrl, blurHash }),\n [blurDataUrl, blurHash, blurColor, colorPlaceholder, isContain, neutralColors],\n );\n const cls = (name: string) => (unstyled ? undefined : name);\n const duration = Math.max(0, animationDuration);\n const placeholderFadeDuration = Math.round(duration * (5 / 6));\n\n const containerStyle: CSSProperties = {\n backgroundColor:\n resolveBackgroundColor(blurColor, neutralColors) ??\n (unstyled\n ? undefined\n : 'var(--iuk-animated-image-bg, var(--background-card, rgba(38, 45, 56, 0.4)))'),\n ...(unstyled\n ? undefined\n : {\n ['--iuk-animated-image-duration' as string]: `${duration}ms`,\n ['--iuk-ai-ph-dur' as string]: `${placeholderFadeDuration}ms`,\n ['--iuk-animated-image-reveal-scale' as string]: String(revealScale),\n }),\n ...wrapperStyle,\n };\n\n const placeholderStyle: CSSProperties = {\n objectFit: 'cover',\n transitionDuration: `${placeholderFadeDuration}ms`,\n };\n\n const imageStyle: CSSProperties = {\n objectFit: resolvedObjectFit,\n objectPosition,\n transitionDuration: `${duration}ms`,\n ...style,\n ...(hasError ? { opacity: 0, visibility: 'hidden' as const } : undefined),\n };\n\n const isCustom = Boolean(ImageComponent);\n const loadingAttr = priority\n ? isCustom\n ? undefined\n : 'eager'\n : (loadingProp ?? (isCustom ? undefined : 'lazy'));\n\n const priorityProps = isCustom\n ? {\n ...(priority !== undefined ? { priority } : {}),\n ...(quality !== undefined ? { quality } : {}),\n }\n : priority\n ? { fetchPriority: 'high' as const }\n : {};\n\n const derivedImageSrcSet =\n !isCustom && activeSrc === src\n ? (image?.srcSet ??\n (image?.variants?.length\n ? [\n ...[...image.variants]\n .sort((a, b) => a.width - b.width)\n .map((v) => `${v.url} ${v.width}w`),\n ...(image.width ? [`${src} ${image.width}w`] : []),\n ].join(', ')\n : undefined))\n : undefined;\n const resolvedSrcSet = imgProps.srcSet ?? derivedImageSrcSet;\n const resolvedSizes =\n !isCustom && resolvedSrcSet && fill && imgProps.sizes === undefined\n ? '100vw'\n : imgProps.sizes;\n\n const sharedImgProps = {\n ...priorityProps,\n ...imgProps,\n ...(resolvedSrcSet !== undefined ? { srcSet: resolvedSrcSet } : {}),\n ...(resolvedSizes !== undefined ? { sizes: resolvedSizes } : {}),\n ...(width !== undefined ? { width } : {}),\n ...(height !== undefined ? { height } : {}),\n ...(loadingAttr !== undefined ? { loading: loadingAttr } : {}),\n src: activeSrc,\n alt,\n decoding,\n draggable,\n ref: imgRef,\n className: cn(cls('iuk-animated-image__img'), className),\n style: imageStyle,\n 'data-state': state,\n onDragStart: imgProps.onDragStart ?? preventDrag,\n onLoad: (event: SyntheticEvent<HTMLImageElement>) =>\n handleLoad(event.currentTarget),\n onError: (event: SyntheticEvent<HTMLImageElement, Event>) => {\n const isTerminal = handleError();\n if (isTerminal) {\n onError?.(event);\n }\n },\n };\n\n return (\n <div\n {...wrapperProps}\n className={cn(\n cls('iuk-animated-image'),\n fill && cls('iuk-animated-image--fill'),\n isContain && cls('iuk-animated-image--contain'),\n wrapperClassName,\n wrapperProps?.className,\n )}\n style={{ ...containerStyle, ...wrapperProps?.style }}\n data-slot=\"animated-image\"\n data-state={state}\n aria-busy={state === 'loading' || undefined}\n >\n {(showPlaceholder || isContain) && placeholderUrl && (\n <img\n src={placeholderUrl}\n alt=\"\"\n aria-hidden=\"true\"\n draggable={false}\n onDragStart={preventDrag}\n data-slot=\"animated-image-placeholder\"\n className={cn(\n cls('iuk-animated-image__placeholder'),\n isLoaded && !isContain && cls('iuk-animated-image__placeholder--hidden'),\n placeholderClassName,\n )}\n style={placeholderStyle}\n />\n )}\n\n {showShimmer && !isLoaded && !hasError && (\n <div\n aria-hidden=\"true\"\n data-slot=\"animated-image-shimmer\"\n className={cn(cls('iuk-animated-image__shimmer'))}\n />\n )}\n\n {ImageComponent ? (\n <ImageComponent\n key={retryKey > 0 ? retryKey : undefined}\n {...sharedImgProps}\n {...(fill ? { fill: true } : {})}\n {...imageComponentProps}\n />\n ) : (\n <img key={retryKey > 0 ? retryKey : undefined} {...sharedImgProps} />\n )}\n\n {hasError && renderError ? renderError({ src: activeSrc, retry }) : null}\n </div>\n );\n}\n\nexport default AnimatedImage;\n","import { decodeBlurHashToDataURL } from '../../../blur/blurDataUtils';\n\n/**\n * Default neutral colors that carry no real information about the image (common\n * DB defaults or \"empty\" values). Ignored by default so placeholders never\n * flash pitch-black or stark white unless `neutralColors={[]}` is passed.\n */\nexport const DEFAULT_NEUTRAL_COLORS = [\n '#1a1a1a',\n '#121212',\n '#000000',\n '#000',\n '#e5e7eb',\n '#ffffff',\n '#fff',\n] as const;\n\nconst HEX_COLOR = /^#(?:[0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\nconst FUNC_COLOR = /^(?:rgb|rgba|hsl|hsla|oklch|oklab)\\([\\d\\s.,%/+-]+\\)$/i;\nconst CSS_VAR_COLOR = /^var\\(--[a-zA-Z0-9_-]+(?:\\s*,\\s*[^;{}<>()]+)?\\)$/;\n\nfunction isNeutralColor(value: string, neutralColors: readonly string[]): boolean {\n if (neutralColors.length === 0) return false;\n const lower = value.toLowerCase();\n for (const item of neutralColors) {\n if (item.toLowerCase() === lower) return true;\n }\n return false;\n}\n\n/**\n * Returns a safe, meaningful literal color (`#hex`, `rgb(...)`, `hsl(...)`, `oklch(...)`)\n * suitable for inline SVG embedding, or `undefined` when empty/neutral/invalid.\n * Rejects CSS variables (`var(--*)`) because SVG data URLs cannot resolve host DOM tokens.\n */\nexport function resolveMeaningfulColor(\n color?: string | null,\n neutralColors: readonly string[] = DEFAULT_NEUTRAL_COLORS,\n): string | undefined {\n const value = color?.trim();\n if (!value) return undefined;\n if (isNeutralColor(value, neutralColors)) return undefined;\n if (!HEX_COLOR.test(value) && !FUNC_COLOR.test(value)) return undefined;\n return value;\n}\n\n/**\n * Returns a safe CSS background-color value for the wrapper element.\n * Accepts literal colors AND safe CSS custom property expressions (`var(--token)`),\n * while rejecting neutral defaults and CSS injection payloads.\n */\nexport function resolveBackgroundColor(\n color?: string | null,\n neutralColors: readonly string[] = DEFAULT_NEUTRAL_COLORS,\n): string | undefined {\n const value = color?.trim();\n if (!value) return undefined;\n if (isNeutralColor(value, neutralColors)) return undefined;\n if (HEX_COLOR.test(value) || FUNC_COLOR.test(value) || CSS_VAR_COLOR.test(value)) {\n return value;\n }\n return undefined;\n}\n\n/**\n * Inline SVG data URL that renders a soft gradient placeholder.\n * Uses the dominant color when provided, otherwise a neutral slate gradient.\n */\nexport function createFallbackBlurSvg(\n color?: string | null,\n neutralColors: readonly string[] = DEFAULT_NEUTRAL_COLORS,\n): string {\n const meaningful = resolveMeaningfulColor(color, neutralColors);\n const stop1 = meaningful ?? '#2c3340';\n const stop2 = meaningful ? '#0f172a' : '#1e242d';\n const svg =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\" width=\"100%\" height=\"100%\">' +\n '<defs>' +\n '<linearGradient id=\"g\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">' +\n `<stop offset=\"0%\" stop-color=\"${stop1}\" stop-opacity=\"1\"/>` +\n `<stop offset=\"55%\" stop-color=\"${stop1}\" stop-opacity=\"0.78\"/>` +\n `<stop offset=\"100%\" stop-color=\"${stop2}\" stop-opacity=\"0.96\"/>` +\n '</linearGradient>' +\n '<radialGradient id=\"h\" cx=\"24%\" cy=\"22%\" r=\"65%\">' +\n '<stop offset=\"0%\" stop-color=\"#ffffff\" stop-opacity=\"0.22\"/>' +\n '<stop offset=\"100%\" stop-color=\"#ffffff\" stop-opacity=\"0\"/>' +\n '</radialGradient>' +\n '</defs>' +\n '<rect width=\"100%\" height=\"100%\" fill=\"url(#g)\"/>' +\n '<rect width=\"100%\" height=\"100%\" fill=\"url(#h)\"/>' +\n '</svg>';\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n\nexport interface PlaceholderSources {\n blurDataUrl?: string | null;\n blurHash?: string | null;\n blurColor?: string | null;\n neutralColors?: readonly string[];\n}\n\n/**\n * Resolves an intrinsic image placeholder (`blurDataUrl` or decoded `blurHash`)\n * without falling back to an SVG gradient. Returns `undefined` when neither is present.\n */\nexport function resolveIntrinsicPlaceholderUrl({\n blurDataUrl,\n blurHash,\n}: Pick<PlaceholderSources, 'blurDataUrl' | 'blurHash'>): string | undefined {\n const dataUrl = blurDataUrl?.trim();\n if (dataUrl) return dataUrl;\n if (blurHash && typeof document !== 'undefined') {\n try {\n const decoded = decodeBlurHashToDataURL(blurHash, 32, 32);\n if (decoded) return decoded;\n } catch {\n // Invalid hash: ignore.\n }\n }\n return undefined;\n}\n\n/**\n * Resolves the best available placeholder URL in priority order:\n * 1. `blurDataUrl` (LQIP data URL / remote URL)\n * 2. `blurHash` (decoded client-side; browser only)\n * 3. Gradient SVG derived from `blurColor` (or neutral fallback)\n */\nexport function resolvePlaceholderUrl({\n blurDataUrl,\n blurHash,\n blurColor,\n neutralColors = DEFAULT_NEUTRAL_COLORS,\n}: PlaceholderSources): string {\n const intrinsic = resolveIntrinsicPlaceholderUrl({ blurDataUrl, blurHash });\n if (intrinsic) return intrinsic;\n return createFallbackBlurSvg(blurColor, neutralColors);\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface UseImageRevealOptions {\n /** Identity of the primary source; a change resets the reveal state. */\n srcKey: string;\n /** Optional fallback URL tried once if `srcKey` fails to load. */\n fallbackSrc?: string;\n /** Crossfade duration in ms. */\n animationDuration: number;\n onLoad?: (img: HTMLImageElement | null) => void;\n}\n\nexport interface ImageRevealState {\n /** Active image URL (`srcKey` initially, or `fallbackSrc` after primary failure). */\n activeSrc: string;\n /** Monotonic counter incremented when `retry()` is invoked. */\n retryKey: number;\n /** True once the sharp image is decoded and ready to fade in. */\n isLoaded: boolean;\n /** Whether the placeholder layer is still mounted (kept until fade completes, or on error). */\n showPlaceholder: boolean;\n /** True when the image (and optional `fallbackSrc`) failed to load. */\n hasError: boolean;\n /** Callback ref to attach to the underlying `<img>` element. */\n imgRef: (node: HTMLImageElement | null) => void;\n handleLoad: (img?: HTMLImageElement | null) => void;\n /** Returns `true` if the error is terminal, or `false` if switching to `fallbackSrc`. */\n handleError: () => boolean;\n /** Resets error state and retries loading from the primary `srcKey`. */\n retry: () => void;\n}\n\nconst PLACEHOLDER_UNMOUNT_BUFFER_MS = 50;\n\n/**\n * Framework-agnostic reveal state machine for blur-up images:\n * - resets synchronously when `srcKey` changes (no stale 1-frame flash)\n * - pre-decodes via `HTMLImageElement.decode()` before crossfading\n * - detects already-cached images after the first paint\n * - unmounts placeholder after crossfade (`animationDuration + 50ms`)\n * - on error: tries `fallbackSrc` once if provided; on terminal error keeps placeholder visible\n */\nexport function useImageReveal({\n srcKey,\n fallbackSrc,\n animationDuration,\n onLoad,\n}: UseImageRevealOptions): ImageRevealState {\n const [prevSrc, setPrevSrc] = useState(srcKey);\n const [usingFallback, setUsingFallback] = useState(false);\n const [retryKey, setRetryKey] = useState(0);\n const [isLoaded, setIsLoaded] = useState(false);\n const [showPlaceholder, setShowPlaceholder] = useState(true);\n const [hasError, setHasError] = useState(false);\n const [node, setNode] = useState<HTMLImageElement | null>(null);\n\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const mountedRef = useRef(true);\n const activeSrc = usingFallback && fallbackSrc ? fallbackSrc : srcKey;\n const activeSrcRef = useRef(activeSrc);\n const onLoadRef = useRef(onLoad);\n\n useEffect(() => {\n onLoadRef.current = onLoad;\n }, [onLoad]);\n\n const clearTimer = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }, []);\n\n if (prevSrc !== srcKey) {\n setPrevSrc(srcKey);\n setUsingFallback(false);\n setIsLoaded(false);\n setShowPlaceholder(true);\n setHasError(false);\n }\n\n useEffect(() => {\n activeSrcRef.current = activeSrc;\n clearTimer();\n }, [activeSrc, clearTimer]);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n clearTimer();\n };\n }, [clearTimer]);\n\n const handleLoad = useCallback(\n (img?: HTMLImageElement | null) => {\n const el = img ?? node;\n const loadedFor = activeSrcRef.current;\n const reveal = () => {\n if (!mountedRef.current || loadedFor !== activeSrcRef.current) return;\n setHasError(false);\n setIsLoaded(true);\n clearTimer();\n const duration = Math.max(0, animationDuration);\n timeoutRef.current = setTimeout(() => {\n if (mountedRef.current) setShowPlaceholder(false);\n timeoutRef.current = null;\n }, duration + PLACEHOLDER_UNMOUNT_BUFFER_MS);\n onLoadRef.current?.(el ?? null);\n };\n if (el && typeof el.decode === 'function') {\n el.decode().then(reveal, reveal);\n } else {\n reveal();\n }\n },\n [animationDuration, clearTimer, node],\n );\n\n const handleError = useCallback((): boolean => {\n if (!mountedRef.current) return false;\n clearTimer();\n if (fallbackSrc && !usingFallback && fallbackSrc !== srcKey) {\n setUsingFallback(true);\n setIsLoaded(false);\n setShowPlaceholder(true);\n setHasError(false);\n return false;\n }\n setHasError(true);\n setIsLoaded(false);\n setShowPlaceholder(true);\n return true;\n }, [clearTimer, fallbackSrc, srcKey, usingFallback]);\n\n const retry = useCallback(() => {\n clearTimer();\n setUsingFallback(false);\n setHasError(false);\n setIsLoaded(false);\n setShowPlaceholder(true);\n setRetryKey((prev) => prev + 1);\n }, [clearTimer]);\n\n useEffect(() => {\n if (!node || !node.complete || node.naturalWidth === 0) return;\n if (typeof requestAnimationFrame !== 'function') {\n handleLoad(node);\n return;\n }\n const rafId = requestAnimationFrame(() => handleLoad(node));\n return () => cancelAnimationFrame(rafId);\n }, [node, activeSrc, retryKey, handleLoad]);\n\n return {\n activeSrc,\n retryKey,\n isLoaded,\n showPlaceholder,\n hasError,\n imgRef: setNode,\n handleLoad,\n handleError,\n retry,\n };\n}\n","import { useEffect } from 'react';\nimport { blurService } from '../../blur/blurService';\n\ntype DebugWindow = Window & { blurService?: typeof blurService };\n\n/**\n * Development helper: exposes the shared `blurService` singleton as\n * `window.blurService` while mounted, for inspection in the browser console.\n * Does not augment the global `Window` type of consuming apps.\n */\nexport function BlurServiceDebugger() {\n useEffect(() => {\n if (typeof window === 'undefined') return undefined;\n const target = window as DebugWindow;\n target.blurService = blurService;\n return () => {\n if (target.blurService === blurService) {\n delete target.blurService;\n }\n };\n }, []);\n\n return null;\n}\n\nexport default BlurServiceDebugger;\n","import { EyeIcon as Eye, XIcon as X } from '../icons';\nimport type { ChangeEvent, PointerEvent as ReactPointerEvent } from 'react';\nimport { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { UploadLocale } from '../../types';\nimport { normalizeColorInput } from '../../utils/color';\nimport { formatFileSize } from '../../utils/formatters';\nimport { useImageUploadContext } from '../context';\nimport { useDialog } from '../hooks/useDialog';\nimport { normalizeUploadLocale, resolveTranslations, type UploadTranslations } from '../i18n';\nimport type { CustomImageRenderer } from '../types';\nimport { drawImageToCanvas, sampleCanvasPixelHex } from '../utils/canvasSampler';\nimport { resolveSlotClass } from '../utils/slotStyles';\nimport { BlurColorControls } from './BlurColorControls';\nimport { BlurImage } from './BlurImage';\nimport { SaveButton } from './SaveButton';\n\nconst DEBOUNCE_MS = 250;\n\nexport interface BlurVisualizationModalProps {\n isOpen: boolean;\n onClose: () => void;\n imageUrl: string;\n blurDataUrl?: string;\n blurColor?: string;\n altText?: string;\n originalSize?: number;\n optimizedSize?: number | null;\n detectedColor?: string;\n onChangeColor?: (hex: string) => void;\n onUseDetectedColor?: () => void;\n onChangeAltText?: (altText: string) => void;\n locale?: UploadLocale;\n translations?: Partial<UploadTranslations>;\n renderImage?: CustomImageRenderer;\n unstyled?: boolean;\n}\n\nexport function BlurVisualizationModal({\n isOpen, onClose, imageUrl, blurDataUrl, blurColor, altText,\n originalSize, optimizedSize, detectedColor, onChangeColor,\n onUseDetectedColor, onChangeAltText, locale: propLocale,\n translations, renderImage, unstyled: propUnstyled,\n}: BlurVisualizationModalProps) {\n const ctx = useImageUploadContext();\n const isUnstyled = propUnstyled ?? ctx.unstyled;\n const locale = normalizeUploadLocale(propLocale || ctx.locale);\n const tModal = resolveTranslations(locale, translations || ctx.translations).blurModal;\n const cls = (defaultClass: string) => resolveSlotClass(defaultClass, isUnstyled);\n\n const { dialogRef, titleId } = useDialog({ isOpen, onClose });\n const textareaId = useId();\n\n const baseColor = useMemo(() => (blurColor || detectedColor || '#F5F5F5').toUpperCase(), [blurColor, detectedColor]);\n const [localColor, setLocalColor] = useState(baseColor);\n const [hexInput, setHexInput] = useState(baseColor.replace('#', ''));\n const [sampledColor, setSampledColor] = useState<string | null>(null);\n const [penModeActive, setPenModeActive] = useState(false);\n const [localAltText, setLocalAltText] = useState(altText || '');\n const liveCanvasRef = useRef<HTMLCanvasElement | null>(null);\n const colorTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const altTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pendingColorRef = useRef<string | null>(null);\n const pendingAltRef = useRef<string | null>(null);\n\n useEffect(() => {\n if (!isOpen) return;\n setLocalColor(baseColor);\n setHexInput(baseColor.replace('#', ''));\n setLocalAltText(altText || '');\n }, [isOpen, baseColor, altText, blurDataUrl, imageUrl, blurColor]);\n\n useEffect(() => () => {\n if (colorTimerRef.current) clearTimeout(colorTimerRef.current);\n if (altTimerRef.current) clearTimeout(altTimerRef.current);\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n const srcToLoad = imageUrl || blurDataUrl;\n if (!srcToLoad) return;\n const img = new window.Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => drawImageToCanvas(img, liveCanvasRef);\n img.onerror = () => {\n if (blurDataUrl && srcToLoad !== blurDataUrl) {\n const fallbackImg = new window.Image();\n fallbackImg.onload = () => drawImageToCanvas(fallbackImg, liveCanvasRef);\n fallbackImg.src = blurDataUrl;\n }\n };\n img.src = srcToLoad;\n return () => { img.onload = null; img.onerror = null; };\n }, [imageUrl, blurDataUrl, isOpen]);\n\n useEffect(() => {\n if (!sampledColor) return;\n const timer = window.setTimeout(() => setSampledColor(null), 2000);\n return () => window.clearTimeout(timer);\n }, [sampledColor]);\n\n if (!isOpen || typeof document === 'undefined') return null;\n\n const scheduleColorEmit = (hex: string) => {\n pendingColorRef.current = hex;\n if (colorTimerRef.current) clearTimeout(colorTimerRef.current);\n colorTimerRef.current = setTimeout(() => {\n colorTimerRef.current = null;\n const next = pendingColorRef.current;\n pendingColorRef.current = null;\n if (next !== null) onChangeColor?.(next);\n }, DEBOUNCE_MS);\n };\n\n const scheduleAltEmit = (nextAlt: string) => {\n pendingAltRef.current = nextAlt;\n if (altTimerRef.current) clearTimeout(altTimerRef.current);\n altTimerRef.current = setTimeout(() => {\n altTimerRef.current = null;\n const next = pendingAltRef.current;\n pendingAltRef.current = null;\n if (next !== null) onChangeAltText?.(next);\n }, DEBOUNCE_MS);\n };\n\n const flushPendingChanges = () => {\n if (colorTimerRef.current) {\n clearTimeout(colorTimerRef.current);\n colorTimerRef.current = null;\n }\n if (pendingColorRef.current !== null) {\n onChangeColor?.(pendingColorRef.current);\n pendingColorRef.current = null;\n }\n if (altTimerRef.current) {\n clearTimeout(altTimerRef.current);\n altTimerRef.current = null;\n }\n if (pendingAltRef.current !== null) {\n onChangeAltText?.(pendingAltRef.current);\n pendingAltRef.current = null;\n }\n };\n\n const handleClose = () => {\n flushPendingChanges();\n onClose();\n };\n\n const syncLocalHex = (hex: string, notify = true) => {\n setLocalColor(hex);\n setHexInput(hex.replace('#', ''));\n if (notify) scheduleColorEmit(hex);\n };\n\n const handleColorPickerChange = (e: ChangeEvent<HTMLInputElement>) => syncLocalHex(e.target.value.toUpperCase());\n\n const handleHexInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n const sanitized = event.target.value.replace(/[^0-9a-fA-F]/g, '').slice(0, 6);\n setHexInput(sanitized.toUpperCase());\n if (sanitized.length === 3 || sanitized.length === 6) {\n const normalized = normalizeColorInput(`#${sanitized}`);\n if (normalized) {\n setLocalColor(normalized);\n scheduleColorEmit(normalized);\n }\n }\n };\n\n const handlePenSample = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (!penModeActive) {\n if (event.pointerType === 'pen') setPenModeActive(true);\n else return;\n }\n const sampled = sampleCanvasPixelHex(event, liveCanvasRef);\n if (!sampled) return;\n setSampledColor(sampled);\n syncLocalHex(sampled);\n };\n\n const handleUseDetectedColor = () => {\n if (!detectedColor) return;\n if (colorTimerRef.current) {\n clearTimeout(colorTimerRef.current);\n colorTimerRef.current = null;\n pendingColorRef.current = null;\n }\n const normalized = normalizeColorInput(detectedColor) || detectedColor.toUpperCase();\n setLocalColor(normalized);\n setHexInput(normalized.replace('#', ''));\n if (onUseDetectedColor) onUseDetectedColor();\n else onChangeColor?.(normalized);\n };\n\n const displayColor = localColor || blurColor || '#F5F5F5';\n\n return createPortal(\n <div\n data-slot=\"blur-modal-backdrop\"\n data-unstyled={isUnstyled || undefined}\n className={cls('iuk-modal-backdrop')}\n dir={locale === 'ar' ? 'rtl' : 'ltr'}\n onClick={handleClose}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n >\n <div\n ref={dialogRef}\n data-slot=\"blur-modal\"\n className={cls('iuk-blur-modal')}\n onClick={(e) => e.stopPropagation()}\n >\n <div className={cls('iuk-blur-modal__header')}>\n <div className={cls('iuk-blur-modal__title-row')}>\n <Eye size={20} className={cls('iuk-blur-modal__title-icon')} />\n <h2 id={titleId} className={cls('iuk-blur-modal__title')}>{tModal.title}</h2>\n {optimizedSize ? <span className={cls('iuk-badge')}>{formatFileSize(optimizedSize)}</span> : null}\n </div>\n <button type=\"button\" onClick={handleClose} className={cls('iuk-icon-btn')} aria-label={tModal.closeModal}>\n <X size={18} />\n </button>\n </div>\n\n <div className={cls('iuk-blur-modal__body')}>\n <div className={cls('iuk-blur-modal__grid')}>\n <BlurColorControls\n localColor={localColor} hexInput={hexInput} penModeActive={penModeActive}\n detectedColor={detectedColor} sampledColor={sampledColor} tModal={tModal}\n onColorPickerChange={handleColorPickerChange}\n onHexInputChange={handleHexInputChange}\n onTogglePenMode={() => setPenModeActive((prev) => !prev)}\n onUseDetectedColor={handleUseDetectedColor}\n />\n\n <div className={cls('iuk-blur-modal__preview-col')}>\n <h3 className={cls('iuk-blur-modal__section-title')}>{tModal.livePreview}</h3>\n <div\n className={cls(`iuk-blur-modal__stage ${penModeActive ? 'iuk-blur-modal__stage--sampling' : ''}`.trim())}\n style={{ backgroundColor: displayColor }}\n onPointerDown={handlePenSample}\n >\n <BlurImage\n src={imageUrl} alt={altText || tModal.livePreview}\n blurDataUrl={blurDataUrl} blurColor={displayColor}\n objectFit=\"contain\" renderImage={renderImage}\n onImageLoad={(img) => { if (img) drawImageToCanvas(img, liveCanvasRef); }}\n />\n {!blurDataUrl && <div className={cls('iuk-blur-modal__no-blur-note')}>{tModal.showingOriginal}</div>}\n </div>\n\n {optimizedSize && originalSize && originalSize > optimizedSize ? (\n <div className={cls('iuk-blur-modal__savings')}>\n <span>{tModal.saved}</span>\n <strong>\n {formatFileSize(originalSize - optimizedSize)} (\n {Math.round(((originalSize - optimizedSize) / originalSize) * 100)}%)\n </strong>\n </div>\n ) : null}\n </div>\n </div>\n\n <div className={cls('iuk-blur-modal__alt-section')}>\n <label htmlFor={textareaId} className={cls('iuk-blur-modal__section-title')}>\n {tModal.accessibility} — {tModal.altText}\n </label>\n <textarea\n id={textareaId}\n value={localAltText}\n onChange={(e) => { setLocalAltText(e.target.value); scheduleAltEmit(e.target.value); }}\n className={cls('iuk-blur-modal__textarea')}\n placeholder={tModal.altTextPlaceholder}\n rows={2}\n />\n </div>\n\n <canvas ref={liveCanvasRef} style={{ display: 'none' }} aria-hidden=\"true\" />\n </div>\n\n <div className={cls('iuk-blur-modal__footer')}>\n <SaveButton unstyled={isUnstyled} onClick={handleClose}>{tModal.saveAndClose}</SaveButton>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n\nexport default BlurVisualizationModal;\n","import type { PointerEvent as ReactPointerEvent, RefObject } from 'react';\nimport { rgbToHex } from '../../utils/color';\n\nexport function drawImageToCanvas(\n img: HTMLImageElement,\n canvasRef: RefObject<HTMLCanvasElement | null>,\n): void {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext('2d');\n if (!canvas || !ctx) return;\n const width = img.naturalWidth || img.width;\n const height = img.naturalHeight || img.height;\n if (!width || !height) return;\n canvas.width = width;\n canvas.height = height;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n try {\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n } catch {\n // Tainted cross-origin canvas ignored gracefully\n }\n}\n\nexport function sampleCanvasPixelHex(\n event: ReactPointerEvent<HTMLElement>,\n canvasRef: RefObject<HTMLCanvasElement | null>,\n): string | null {\n const canvas = canvasRef.current;\n const context = canvas?.getContext('2d');\n if (!canvas || !context || canvas.width === 0 || canvas.height === 0) {\n return null;\n }\n\n const rect = event.currentTarget.getBoundingClientRect();\n if (!rect.width || !rect.height) return null;\n\n const relX = (event.clientX - rect.left) / rect.width;\n const relY = (event.clientY - rect.top) / rect.height;\n if (relX < 0 || relY < 0 || relX > 1 || relY > 1) return null;\n\n const x = Math.min(\n Math.max(Math.floor(relX * canvas.width), 0),\n canvas.width - 1,\n );\n const y = Math.min(\n Math.max(Math.floor(relY * canvas.height), 0),\n canvas.height - 1,\n );\n\n let pixel: Uint8ClampedArray;\n try {\n pixel = context.getImageData(x, y, 1, 1).data;\n } catch {\n return null;\n }\n\n const [r, g, b, alpha] = pixel;\n if (alpha === 0) return null;\n\n return rgbToHex(r, g, b);\n}\n","import { PenToolIcon as PenTool, WandIcon as Wand2 } from '../icons';\nimport type { ChangeEvent } from 'react';\nimport type { BlurModalTranslations } from '../i18n';\n\nexport interface BlurColorControlsProps {\n localColor: string;\n hexInput: string;\n penModeActive: boolean;\n detectedColor?: string;\n sampledColor: string | null;\n tModal: BlurModalTranslations;\n onColorPickerChange: (event: ChangeEvent<HTMLInputElement>) => void;\n onHexInputChange: (event: ChangeEvent<HTMLInputElement>) => void;\n onTogglePenMode: () => void;\n onUseDetectedColor: () => void;\n}\n\nexport function BlurColorControls({\n localColor,\n hexInput,\n penModeActive,\n detectedColor,\n sampledColor,\n tModal,\n onColorPickerChange,\n onHexInputChange,\n onTogglePenMode,\n onUseDetectedColor,\n}: BlurColorControlsProps) {\n return (\n <div className=\"iuk-blur-modal__controls\">\n <h3 className=\"iuk-blur-modal__section-title\">{tModal.adjustColor}</h3>\n <p className=\"iuk-blur-modal__subtitle\">\n {penModeActive ? `🎨 ${tModal.clickToSample}` : tModal.pickColorNote}\n </p>\n\n <div className=\"iuk-blur-modal__picker-row\">\n <label className=\"iuk-blur-modal__color-well\">\n <input\n type=\"color\"\n value={localColor}\n onChange={onColorPickerChange}\n aria-label={tModal.adjustColor}\n />\n </label>\n\n <div className=\"iuk-blur-modal__hex-group\">\n <div className=\"iuk-blur-modal__hex-field\">\n <span>#</span>\n <input\n type=\"text\"\n value={hexInput}\n onChange={onHexInputChange}\n maxLength={6}\n spellCheck={false}\n aria-label={tModal.enterHexColor}\n placeholder={tModal.hexPlaceholder}\n />\n </div>\n <div className=\"iuk-blur-modal__swatch-chip\">\n <span\n className=\"iuk-blur-modal__swatch-dot\"\n style={{ backgroundColor: localColor }}\n aria-hidden=\"true\"\n />\n <code>{localColor}</code>\n </div>\n </div>\n </div>\n\n <div className=\"iuk-blur-modal__actions-row\">\n <button\n type=\"button\"\n onClick={onTogglePenMode}\n className={`iuk-btn iuk-btn--secondary ${penModeActive ? 'iuk-btn--active' : ''}`}\n aria-label={\n penModeActive ? tModal.disablePenMode : tModal.enablePenMode\n }\n >\n <PenTool size={14} />\n <span>\n {penModeActive ? tModal.penModeActive : tModal.enablePenMode}\n </span>\n </button>\n\n {detectedColor && (\n <button\n type=\"button\"\n className=\"iuk-btn iuk-btn--secondary\"\n onClick={onUseDetectedColor}\n >\n <Wand2 size={14} />\n <span>{tModal.resetToDetected}</span>\n <code>{detectedColor.toUpperCase()}</code>\n </button>\n )}\n\n {sampledColor && (\n <span className=\"iuk-badge iuk-badge--accent\">\n <PenTool size={12} />\n <span>\n {tModal.sampled} {sampledColor}\n </span>\n </span>\n )}\n </div>\n </div>\n );\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { resolveSlotClass } from '../utils/slotStyles';\n\nexport interface SaveButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: ReactNode;\n unstyled?: boolean;\n children: ReactNode;\n}\n\nexport function SaveButton({\n icon,\n unstyled = false,\n children,\n className = '',\n type = 'button',\n ...rest\n}: SaveButtonProps) {\n return (\n <button\n type={type}\n className={resolveSlotClass('iuk-save-button', unstyled, className)}\n {...rest}\n >\n {icon && (\n <span className={resolveSlotClass('iuk-save-button__icon', unstyled)}>\n {icon}\n </span>\n )}\n <span>{children}</span>\n </button>\n );\n}\n\nexport default SaveButton;\n","import {\n ChevronUpIcon as ChevronUp,\n LoaderIcon as Loader2,\n MinusIcon as Minus,\n XIcon as X,\n} from '../icons';\nimport {\n type ForwardedRef,\n forwardRef,\n type ReactElement,\n type Ref,\n useEffect,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport type { UploadPresetName } from '../../types';\nimport { useImageUploadContext } from '../context';\nimport { useDialog } from '../hooks/useDialog';\nimport { normalizeUploadLocale, resolveTranslations } from '../i18n';\nimport type {\n ImageUploadHandle,\n ImageUploadProps,\n MultiImageUploadProps,\n SingleImageUploadProps,\n} from '../types';\nimport { resolveSlotClass } from '../utils/slotStyles';\nimport { MultiImageUpload } from './MultiImageUpload';\nimport { SingleImageUpload } from './SingleImageUpload';\n\nfunction ImageUploadInner<TPreset extends string = UploadPresetName>(\n props: ImageUploadProps<TPreset>,\n ref: ForwardedRef<ImageUploadHandle>,\n) {\n const ctx = useImageUploadContext();\n const isUnstyled = props.unstyled ?? ctx.unstyled;\n const uploadLocale = normalizeUploadLocale(props.locale || ctx.locale);\n const ui = resolveTranslations(\n uploadLocale,\n props.translations || ctx.translations,\n );\n const dir = uploadLocale === 'ar' ? 'rtl' : 'ltr';\n const { isOpen, onClose, title, modeVariant } = props;\n const [isMinimized, setIsMinimized] = useState(false);\n const [dockNode, setDockNode] = useState<HTMLElement | null>(null);\n const cls = (defaultClass: string) => resolveSlotClass(defaultClass, isUnstyled);\n\n useEffect(() => {\n if (!isOpen) {\n setIsMinimized(false);\n }\n }, [isOpen]);\n\n const { dialogRef, titleId } = useDialog({\n isOpen: Boolean(isOpen) && !isMinimized,\n onClose,\n });\n\n useEffect(() => {\n if (typeof window === 'undefined' || !isOpen || !isMinimized) {\n setDockNode(null);\n return;\n }\n\n const updateDockReference = () => {\n const node = document.querySelector('[data-upload-progress-dock]');\n setDockNode((prev) =>\n node instanceof HTMLElement ? (node === prev ? prev : node) : null,\n );\n };\n\n updateDockReference();\n\n const observer = new MutationObserver(() => updateDockReference());\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n return () => observer.disconnect();\n }, [isOpen, isMinimized]);\n\n const content =\n props.mode === 'multiple' ? (\n <MultiImageUpload ref={ref} {...(props as MultiImageUploadProps<TPreset>)} />\n ) : (\n <SingleImageUpload ref={ref} {...(props as SingleImageUploadProps<TPreset>)} />\n );\n\n if (isOpen === undefined) {\n return (\n <div\n data-slot=\"upload-root\"\n data-unstyled={isUnstyled || undefined}\n className={cls('iuk-root')}\n dir={dir}\n data-upload-locale={uploadLocale}\n >\n {content}\n </div>\n );\n }\n\n if (!isOpen) return null;\n\n const minimizedButton = (\n <button\n type=\"button\"\n data-slot=\"minimized-pill\"\n className={cls('iuk-minimized-pill')}\n onClick={() => setIsMinimized(false)}\n title={ui.restoreUploadWindow}\n >\n <Loader2 size={16} className={cls('iuk-spin')} />\n <span className={cls('iuk-minimized-pill__copy')}>\n <span className={cls('iuk-minimized-pill__primary')}>{ui.uploadWindow}</span>\n <span className={cls('iuk-minimized-pill__secondary')}>{ui.tapToResume}</span>\n </span>\n <ChevronUp size={16} />\n </button>\n );\n\n return (\n <>\n <div\n data-slot=\"upload-modal-backdrop\"\n data-unstyled={isUnstyled || undefined}\n className={cls(\n `iuk-root iuk-modal-backdrop ${isMinimized ? 'iuk-modal-backdrop--hidden' : ''}`.trim(),\n )}\n dir={dir}\n data-upload-locale={uploadLocale}\n role=\"dialog\"\n aria-modal={!isMinimized}\n aria-hidden={isMinimized}\n aria-labelledby={title ? titleId : undefined}\n aria-label={!title ? ui.uploadWindow : undefined}\n onClick={() => onClose?.()}\n >\n <div\n ref={dialogRef}\n data-slot=\"upload-dialog\"\n className={cls(\n `iuk-upload-dialog ${isMinimized ? 'iuk-upload-dialog--hidden' : ''}`.trim(),\n )}\n onClick={(e) => e.stopPropagation()}\n >\n {onClose && (\n <div className={cls('iuk-upload-dialog__controls')}>\n <button\n type=\"button\"\n className={cls('iuk-icon-btn iuk-icon-btn--floating')}\n onClick={() => setIsMinimized(true)}\n aria-label={ui.minimize}\n title={ui.minimizeUploader}\n >\n <Minus size={18} />\n </button>\n <button\n type=\"button\"\n className={cls('iuk-icon-btn iuk-icon-btn--floating')}\n onClick={onClose}\n aria-label={ui.close}\n >\n <X size={18} />\n </button>\n </div>\n )}\n <div\n className={cls('iuk-upload-dialog__card')}\n onClick={(e) => e.stopPropagation()}\n >\n {title && (\n <h3 id={titleId} className={cls('iuk-upload-dialog__title')}>\n {modeVariant === 'edit'\n ? ui.editPrefix.replace('{title}', title)\n : title}\n </h3>\n )}\n {content}\n </div>\n </div>\n </div>\n\n {isMinimized &&\n typeof document !== 'undefined' &&\n (dockNode ? (\n createPortal(\n <div className={cls('iuk-minimized-portal')}>{minimizedButton}</div>,\n dockNode,\n )\n ) : (\n <div className={cls('iuk-minimized-dock')}>{minimizedButton}</div>\n ))}\n </>\n );\n}\n\nexport const ImageUpload = forwardRef(ImageUploadInner) as <\n TPreset extends string = UploadPresetName,\n>(\n props: ImageUploadProps<TPreset> & { ref?: Ref<ImageUploadHandle> },\n) => ReactElement | null;\n\nexport const UnifiedImageUpload = ImageUpload;\nexport default ImageUpload;\n","import {\n type ChangeEvent, type ForwardedRef, Fragment, forwardRef, type HTMLAttributes,\n type ReactElement, type Ref, useId, useImperativeHandle, useRef,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport type { UploadPresetName } from '../../types';\nimport { useImageUploadContext } from '../context';\nimport { useClipboardPaste } from '../hooks/useClipboardPaste';\nimport { useDragAndDrop } from '../hooks/useDragAndDrop';\nimport { useMultiImageState } from '../hooks/useMultiImageState';\nimport type { MultiUploadSlot } from '../styling';\nimport type { ImageUploadHandle, MultiImageUploadProps } from '../types';\nimport { HIDDEN_INPUT_STYLE, resolveSlotClass, resolveSlotStyle, resolveUploadDataState } from '../utils/slotStyles';\nimport { AltTextModal } from './AltTextModal';\nimport { MultiAddMoreTile, MultiEmptyDropzone } from './MultiDropzoneViews';\nimport { MultiFooterSection, MultiUploadHeaderAlerts } from './MultiUploadHeaderAlerts';\nimport { PreviewTile } from './PreviewTile';\nimport { QualitySelector } from './QualitySelector';\nimport { UploadProgressPanel, useRetainedProgressItems } from './UploadProgressPanel';\n\nconst DEFAULT_ACCEPT = 'image/jpeg,image/png,image/webp,image/avif,image/svg+xml';\nconst FOLDER_INPUT_ATTRS: Record<string, string> = { webkitdirectory: '', directory: '' };\n\nfunction MultiImageUploadInner<TPreset extends string = UploadPresetName>(\n props: MultiImageUploadProps<TPreset>,\n ref: ForwardedRef<ImageUploadHandle>,\n) {\n const {\n preset, translations, renderImage, label, error, helperText, className, style,\n recommendedQuality, qualityNote, isOpen, maxImages = 999,\n accept = DEFAULT_ACCEPT, allowFolder = true, disabled = false,\n required = false, blurType = 'card', showQualitySelector = true,\n capture, enablePaste = true, pasteTarget = 'dropzone', name, onBlur,\n classNames: cCls, styles: cSty,\n renderHeader, renderEmptyDropzone, renderTile, renderAddMore,\n } = props;\n\n const ctx = useImageUploadContext();\n const isUnstyled = props.unstyled ?? ctx.unstyled;\n const pCls = ctx.multiClassNames;\n const pSty = ctx.multiStyles;\n\n const slotClass = (slot: MultiUploadSlot, defaultClass?: string) =>\n resolveSlotClass(defaultClass, isUnstyled, pCls?.[slot], cCls?.[slot]);\n const slotStyle = (slot: MultiUploadSlot) =>\n resolveSlotStyle(pSty?.[slot], cSty?.[slot]);\n\n const state = useMultiImageState(props);\n const { locale, ui, previews, selectedPreviews, uploadingPreviews, imagesWithoutAlt, editingTarget } = state;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const labelId = useId();\n const inputId = useId();\n const statusTextId = useId();\n const fileInputRef = useRef<HTMLInputElement>(null);\n const folderInputRef = useRef<HTMLInputElement>(null);\n\n const dockItems = useRetainedProgressItems(uploadingPreviews, previews);\n\n const { isDragging, dragHandlers } = useDragAndDrop({\n disabled, onDrop: (files) => void state.handleFileSelect(files),\n });\n\n const { onPaste } = useClipboardPaste({\n enabled: enablePaste, pasteTarget, disabled, multiple: true,\n onPasteFiles: (files) => { void state.handleFileSelect(files); },\n });\n\n const openFilePicker = () => { if (!disabled) fileInputRef.current?.click(); };\n const openFolderPicker = () => { if (!disabled) folderInputRef.current?.click(); };\n const selectAll = () => state.setSelectedPreviews(new Set(previews.map((p) => p.id)));\n const clearSelection = () => state.setSelectedPreviews(new Set());\n const retryFailed = () => void state.handleRetryFailed();\n\n useImperativeHandle(ref, () => ({\n focus: () => {\n const focusable = rootRef.current?.querySelector<HTMLElement>(\n '[data-slot=\"empty-dropzone\"], [data-slot=\"empty-actions\"] button, [data-slot=\"add-more\"] button',\n );\n (focusable ?? rootRef.current)?.focus();\n },\n open: openFilePicker,\n clear: () => state.handleClearAll(),\n }));\n\n const handleFilesInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) void state.handleFileSelect(e.target.files);\n e.target.value = '';\n };\n\n const displayError = error || state.validationError;\n const hasError = Boolean(displayError) || state.hasFailedUploads;\n const hasStatusText = Boolean(helperText || displayError);\n const visualState = resolveUploadDataState({\n disabled, hasError, isUploading: state.isUploading, isDragging, hasContent: previews.length > 0,\n });\n\n const dropzoneProps: HTMLAttributes<HTMLElement> & { 'data-state'?: string } = {\n ...dragHandlers, onPaste,\n role: 'button', tabIndex: disabled ? -1 : 0,\n 'aria-label': ui.selectFilesAria, 'aria-disabled': disabled || undefined,\n 'aria-required': required || undefined, 'aria-invalid': hasError || undefined,\n 'aria-describedby': hasStatusText ? statusTextId : undefined,\n 'data-state': visualState,\n onClick: () => { if (!disabled) openFilePicker(); },\n onKeyDown: (event) => {\n if (!disabled && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n openFilePicker();\n }\n },\n };\n\n const slotStylingProps = {\n unstyled: isUnstyled, providerClassNames: pCls, classNames: cCls, providerStyles: pSty, styles: cSty,\n };\n const hiddenInputClass = resolveSlotClass('iuk-hidden-input', isUnstyled);\n const hiddenInputStyle = isUnstyled ? HIDDEN_INPUT_STYLE : undefined;\n\n return (\n <>\n <div\n ref={rootRef} data-slot=\"multi-root\" data-state={visualState} data-unstyled={isUnstyled || undefined}\n className={resolveSlotClass('iuk-multi', isUnstyled, pCls?.root, cCls?.root, className)}\n style={resolveSlotStyle(pSty?.root, cSty?.root, style)} dir={locale === 'ar' ? 'rtl' : 'ltr'}\n onPaste={onPaste}\n onBlur={onBlur ? (e) => { if (!e.currentTarget.contains(e.relatedTarget as Node | null)) onBlur(); } : undefined}\n >\n {name && (\n <input type=\"hidden\" name={name} value={state.serializedFormValue} required={required} data-slot=\"form-input\" />\n )}\n\n {renderHeader ? (\n renderHeader({\n label, required, disabled, totalCount: previews.length,\n selectedCount: selectedPreviews.size, uploadingCount: uploadingPreviews.length,\n isUploading: state.isUploading, hasFailedUploads: state.hasFailedUploads,\n selectAll, clearSelection, removeSelected: state.handleRemoveSelected,\n retryFailed, locale, ui,\n })\n ) : (\n <MultiUploadHeaderAlerts\n label={label} labelId={labelId} inputId={inputId} required={required} disabled={disabled}\n totalCount={previews.length} selectedCount={selectedPreviews.size}\n uploadingCount={uploadingPreviews.length} missingAltCount={imagesWithoutAlt.length}\n isUploading={state.isUploading} hasFailedUploads={state.hasFailedUploads}\n infoMessage={state.infoMessage} showMissingAltWarning={state.showMissingAltWarning}\n uploadStats={state.uploadStats} locale={locale} translations={translations} ui={ui}\n onSelectAll={selectAll} onDeselectAll={clearSelection}\n onRemoveSelected={state.handleRemoveSelected} onRetryFailed={retryFailed} {...slotStylingProps}\n />\n )}\n\n {showQualitySelector && (\n <div data-slot=\"quality-selector\" className={slotClass('qualitySelector')} style={slotStyle('qualitySelector')}>\n <QualitySelector\n value={state.qualityLevel} onChange={state.setQualityLevel}\n preset={preset} recommendedLevel={recommendedQuality}\n recommendationNote={qualityNote} locale={locale}\n disabled={state.isUploading || disabled} unstyled={isUnstyled}\n />\n </div>\n )}\n\n <input\n id={inputId} ref={fileInputRef} type=\"file\" accept={accept} capture={capture}\n onChange={handleFilesInputChange} className={hiddenInputClass} style={hiddenInputStyle}\n disabled={disabled} multiple aria-label={ui.selectFilesAria}\n aria-invalid={hasError || undefined}\n aria-describedby={hasStatusText ? statusTextId : undefined}\n />\n <input\n ref={folderInputRef} type=\"file\" accept={accept} onChange={handleFilesInputChange}\n className={hiddenInputClass} style={hiddenInputStyle}\n disabled={disabled} {...FOLDER_INPUT_ATTRS} aria-label={ui.selectFolderAria}\n />\n\n {previews.length === 0 ? (\n renderEmptyDropzone ? (\n renderEmptyDropzone({\n state: visualState, isDragging, disabled, allowFolder,\n maxSizeMB: state.maxSizeMB, maxImages, error: displayError || undefined,\n openFileDialog: openFilePicker, openFolderDialog: openFolderPicker,\n dropzoneProps, locale, ui,\n })\n ) : (\n <MultiEmptyDropzone\n isDragging={isDragging} disabled={disabled} hasError={Boolean(displayError)}\n required={required} enablePaste={enablePaste}\n visualState={visualState} allowFolder={allowFolder} maxSizeMB={state.maxSizeMB}\n ui={ui} dragHandlers={dragHandlers} onPaste={onPaste}\n onSelectFiles={openFilePicker} onSelectFolder={openFolderPicker} {...slotStylingProps}\n />\n )\n ) : (\n <div data-slot=\"grid\" className={slotClass('grid', 'iuk-multi__grid')} style={slotStyle('grid')}>\n {previews.map((item, index) =>\n renderTile ? (\n <Fragment key={item.id}>\n {renderTile({\n item, index, isSelected: selectedPreviews.has(item.id), disabled,\n toggleSelect: () => state.toggleSelect(item.id),\n remove: () => state.handleRemove(item.id),\n cancel: () => state.handleCancelUpload(item.id),\n retry: () => void state.handleRetryUpload(item.id),\n openAltTextModal: () => state.setEditingAltTextId(item.id),\n setAltText: (altText) => state.handleAltTextSave(item.id, altText),\n setBlurColor: (hex) => state.handleColorChange(item.id, hex),\n locale, ui,\n })}\n </Fragment>\n ) : (\n <PreviewTile\n key={item.id} preview={item} onRemove={state.handleRemove}\n onCancel={state.handleCancelUpload}\n onRetry={(id) => void state.handleRetryUpload(id)}\n disabled={disabled} blurType={blurType} isSelected={selectedPreviews.has(item.id)}\n onToggleSelect={state.toggleSelect} onEditAltText={(id) => state.setEditingAltTextId(id)}\n onChangeAltText={state.handleAltTextSave} onChangeColor={state.handleColorChange}\n locale={locale} translations={translations} renderImage={renderImage}\n unstyled={isUnstyled} className={slotClass('tile')} style={slotStyle('tile')}\n />\n ),\n )}\n\n {renderAddMore ? (\n renderAddMore({\n isDragging, disabled, allowFolder,\n remainingCount: Math.max(0, maxImages - previews.length),\n openFileDialog: openFilePicker, openFolderDialog: openFolderPicker,\n dropzoneProps, locale, ui,\n })\n ) : (\n <MultiAddMoreTile\n isDragging={isDragging} disabled={disabled} allowFolder={allowFolder} ui={ui}\n dragHandlers={dragHandlers} onSelectFiles={openFilePicker} onSelectFolder={openFolderPicker}\n {...slotStylingProps}\n />\n )}\n </div>\n )}\n\n <MultiFooterSection\n helperText={helperText} displayError={displayError} statusTextId={statusTextId} isOpen={isOpen}\n hasPreviews={previews.length > 0} hasCompletedPreviews={state.completedPreviews.length > 0}\n isUploading={state.isUploading} disabled={disabled} requireAltText={state.requireAltText}\n missingAltCount={imagesWithoutAlt.length} onSave={state.handleSaveImages} ui={ui} {...slotStylingProps}\n />\n </div>\n\n {editingTarget && (\n <AltTextModal\n imageUrl={editingTarget.url} initialAltText={editingTarget.altText}\n onSave={(nextAlt) => state.handleAltTextSave(editingTarget.id, nextAlt)}\n onClose={() => state.setEditingAltTextId(null)}\n locale={locale} translations={translations} renderImage={renderImage} unstyled={isUnstyled}\n />\n )}\n\n {typeof document !== 'undefined' && dockItems.length > 0 &&\n createPortal(\n <UploadProgressPanel\n items={dockItems} completedCount={state.uploadStats.completed}\n totalCount={state.uploadStats.total} locale={locale}\n translations={translations} renderImage={renderImage} unstyled={isUnstyled}\n />,\n document.body,\n )}\n </>\n );\n}\n\nexport const MultiImageUpload = forwardRef(MultiImageUploadInner) as <\n TPreset extends string = UploadPresetName,\n>(\n props: MultiImageUploadProps<TPreset> & { ref?: Ref<ImageUploadHandle> },\n) => ReactElement | null;\n\nexport default MultiImageUpload;\n","import {\n FolderOpenIcon as FolderOpen,\n ImagePlusIcon as ImagePlus,\n UploadIcon as Upload,\n} from '../icons';\nimport type { DragEvent } from 'react';\nimport type { UploadTranslations } from '../i18n';\nimport type {\n MultiUploadClassNames,\n MultiUploadSlot,\n MultiUploadStyles,\n UploadVisualState,\n} from '../styling';\nimport {\n cx,\n resolveSlotClass,\n resolveSlotStyle,\n resolveUploadDataState,\n} from '../utils/slotStyles';\n\nexport interface DropzoneDragHandlers {\n onDragEnter: (e: DragEvent) => void;\n onDragLeave: (e: DragEvent) => void;\n onDragOver: (e: DragEvent) => void;\n onDrop: (e: DragEvent) => void;\n}\n\nexport interface MultiDropzoneSlotProps {\n unstyled?: boolean;\n providerClassNames?: MultiUploadClassNames;\n classNames?: MultiUploadClassNames;\n providerStyles?: MultiUploadStyles;\n styles?: MultiUploadStyles;\n}\n\nexport interface MultiEmptyDropzoneProps extends MultiDropzoneSlotProps {\n isDragging: boolean;\n disabled?: boolean;\n hasError?: boolean;\n required?: boolean;\n enablePaste?: boolean;\n visualState?: UploadVisualState;\n allowFolder?: boolean;\n maxSizeMB: number;\n ui: UploadTranslations;\n dragHandlers: DropzoneDragHandlers;\n onPaste?: (e: React.ClipboardEvent<HTMLElement>) => void;\n onSelectFiles: () => void;\n onSelectFolder: () => void;\n}\n\nexport function MultiEmptyDropzone({\n isDragging,\n disabled = false,\n hasError = false,\n required = false,\n enablePaste = true,\n visualState: propVisualState,\n allowFolder = true,\n maxSizeMB,\n ui,\n dragHandlers,\n onPaste,\n onSelectFiles,\n onSelectFolder,\n unstyled,\n providerClassNames: pCls,\n classNames: cCls,\n providerStyles: pSty,\n styles: cSty,\n}: MultiEmptyDropzoneProps) {\n const visualState =\n propVisualState ?? resolveUploadDataState({ disabled, hasError, isDragging });\n\n const slotClass = (slot: MultiUploadSlot, defaultClass?: string) =>\n resolveSlotClass(defaultClass, unstyled, pCls?.[slot], cCls?.[slot]);\n const slotStyle = (slot: MultiUploadSlot) =>\n resolveSlotStyle(pSty?.[slot], cSty?.[slot]);\n\n const rootClassName = resolveSlotClass(\n cx(\n 'iuk-multi__empty',\n isDragging && 'iuk-multi__empty--dragging',\n disabled && 'iuk-multi__empty--disabled',\n hasError && 'iuk-multi__empty--error',\n ),\n unstyled,\n pCls?.emptyDropzone, cCls?.emptyDropzone,\n isDragging && pCls?.emptyDropzoneDragging, isDragging && cCls?.emptyDropzoneDragging,\n disabled && pCls?.emptyDropzoneDisabled, disabled && cCls?.emptyDropzoneDisabled,\n hasError && pCls?.emptyDropzoneError, hasError && cCls?.emptyDropzoneError,\n );\n\n const rootStyle = resolveSlotStyle(\n pSty?.emptyDropzone, cSty?.emptyDropzone,\n isDragging ? pSty?.emptyDropzoneDragging : undefined,\n isDragging ? cSty?.emptyDropzoneDragging : undefined,\n disabled ? pSty?.emptyDropzoneDisabled : undefined,\n disabled ? cSty?.emptyDropzoneDisabled : undefined,\n hasError ? pSty?.emptyDropzoneError : undefined,\n hasError ? cSty?.emptyDropzoneError : undefined,\n );\n\n return (\n <div\n data-slot=\"empty-dropzone\"\n data-state={visualState}\n data-dragging={isDragging || undefined}\n data-disabled={disabled || undefined}\n data-error={hasError || undefined}\n tabIndex={disabled ? -1 : 0}\n aria-required={required || undefined}\n aria-invalid={hasError || undefined}\n className={rootClassName}\n style={rootStyle}\n onPaste={onPaste}\n {...dragHandlers}\n >\n <div className={resolveSlotClass('iuk-dropzone__prompt', unstyled)}>\n <div className={resolveSlotClass('iuk-dropzone__icon', unstyled)}>\n <ImagePlus size={40} strokeWidth={1.5} />\n </div>\n <h3\n data-slot=\"empty-title\"\n className={slotClass('emptyTitle', 'iuk-multi__title')}\n style={slotStyle('emptyTitle')}\n >\n {isDragging ? ui.dropImagesHere : ui.uploadImages}\n </h3>\n <p\n data-slot=\"empty-hint\"\n className={slotClass('emptyHint', 'iuk-dropzone__hint')}\n style={slotStyle('emptyHint')}\n >\n {isDragging\n ? ui.releaseToUpload\n : `${ui.dragDropOrChoose}${enablePaste ? ` (${ui.pasteHint})` : ''}`}\n </p>\n\n {!isDragging && (\n <div\n data-slot=\"empty-actions\"\n className={slotClass('emptyActions', 'iuk-multi__btn-row')}\n style={slotStyle('emptyActions')}\n >\n <button\n type=\"button\"\n onClick={onSelectFiles}\n className={slotClass('primaryButton', 'iuk-btn iuk-btn--primary')}\n style={slotStyle('primaryButton')}\n disabled={disabled}\n >\n <Upload size={16} />\n <span>{ui.selectFiles}</span>\n </button>\n {allowFolder && (\n <button\n type=\"button\"\n onClick={onSelectFolder}\n className={slotClass('secondaryButton', 'iuk-btn iuk-btn--secondary')}\n style={slotStyle('secondaryButton')}\n disabled={disabled}\n >\n <FolderOpen size={16} />\n <span>{ui.selectFolder}</span>\n </button>\n )}\n </div>\n )}\n\n {!isDragging && (\n <p\n data-slot=\"empty-subtext\"\n className={slotClass('emptySubtext', 'iuk-multi__subtext')}\n style={slotStyle('emptySubtext')}\n >\n {ui.supportsFormats} •{' '}\n {ui.maxPerFile.replace('{size}', String(maxSizeMB))}\n </p>\n )}\n </div>\n </div>\n );\n}\n\nexport interface MultiAddMoreTileProps extends MultiDropzoneSlotProps {\n isDragging: boolean;\n disabled?: boolean;\n allowFolder?: boolean;\n ui: UploadTranslations;\n dragHandlers: DropzoneDragHandlers;\n onSelectFiles: () => void;\n onSelectFolder: () => void;\n}\n\nexport function MultiAddMoreTile({\n isDragging,\n disabled = false,\n allowFolder = true,\n ui,\n dragHandlers,\n onSelectFiles,\n onSelectFolder,\n unstyled,\n providerClassNames: pCls,\n classNames: cCls,\n providerStyles: pSty,\n styles: cSty,\n}: MultiAddMoreTileProps) {\n const slotClass = (slot: MultiUploadSlot, defaultClass?: string) =>\n resolveSlotClass(defaultClass, unstyled, pCls?.[slot], cCls?.[slot]);\n const slotStyle = (slot: MultiUploadSlot) =>\n resolveSlotStyle(pSty?.[slot], cSty?.[slot]);\n\n const rootClassName = resolveSlotClass(\n cx(\n 'iuk-tile iuk-tile--add-more',\n isDragging && 'iuk-tile--dragging',\n disabled && 'iuk-tile--disabled',\n ),\n unstyled,\n pCls?.addMoreTile, cCls?.addMoreTile,\n isDragging && pCls?.addMoreTileDragging, isDragging && cCls?.addMoreTileDragging,\n );\n\n const rootStyle = resolveSlotStyle(\n pSty?.addMoreTile, cSty?.addMoreTile,\n isDragging ? pSty?.addMoreTileDragging : undefined,\n isDragging ? cSty?.addMoreTileDragging : undefined,\n );\n\n return (\n <div\n data-slot=\"add-more\"\n data-dragging={isDragging || undefined}\n data-disabled={disabled || undefined}\n className={rootClassName}\n style={rootStyle}\n {...dragHandlers}\n >\n <div\n data-slot=\"add-more-content\"\n className={slotClass('addMoreContent', 'iuk-tile__add-content')}\n style={slotStyle('addMoreContent')}\n >\n <ImagePlus size={28} strokeWidth={1.5} />\n <p>{isDragging ? ui.dropHere : ui.addMore}</p>\n {!isDragging && (\n <div\n data-slot=\"add-more-actions\"\n className={slotClass('addMoreActions', 'iuk-tile__add-btns')}\n style={slotStyle('addMoreActions')}\n >\n <button\n type=\"button\"\n onClick={onSelectFiles}\n className={slotClass('secondaryButton', 'iuk-btn iuk-btn--secondary iuk-btn--sm')}\n style={slotStyle('secondaryButton')}\n disabled={disabled}\n >\n <Upload size={13} />\n <span>{ui.files}</span>\n </button>\n {allowFolder && (\n <button\n type=\"button\"\n onClick={onSelectFolder}\n className={slotClass('secondaryButton', 'iuk-btn iuk-btn--secondary iuk-btn--sm')}\n style={slotStyle('secondaryButton')}\n disabled={disabled}\n >\n <FolderOpen size={13} />\n <span>{ui.folder}</span>\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import {\n AlertTriangleIcon as AlertTriangle,\n CheckCircleIcon as CheckCircle2,\n LoaderIcon as Loader2,\n SaveIcon as Save,\n TrashIcon as Trash2,\n XCircleIcon as XCircle,\n} from '../icons';\nimport type { MultiUploadStats } from '../hooks/useMultiImageState';\nimport {\n formatNeedsAltMessage,\n formatUploadingCount,\n type UploadLocale,\n type UploadTranslations,\n} from '../i18n';\nimport type {\n MultiUploadClassNames, MultiUploadSlot, MultiUploadStyles,\n} from '../styling';\nimport { cx, resolveSlotClass, resolveSlotStyle } from '../utils/slotStyles';\nimport { SaveButton } from './SaveButton';\n\nexport interface MultiSlotStylingProps {\n unstyled?: boolean;\n providerClassNames?: MultiUploadClassNames;\n classNames?: MultiUploadClassNames;\n providerStyles?: MultiUploadStyles;\n styles?: MultiUploadStyles;\n}\n\nexport interface MultiUploadHeaderAlertsProps extends MultiSlotStylingProps {\n label?: string;\n labelId?: string;\n inputId?: string;\n required?: boolean;\n disabled?: boolean;\n totalCount: number;\n selectedCount: number;\n uploadingCount: number;\n missingAltCount: number;\n isUploading: boolean;\n hasFailedUploads: boolean;\n infoMessage: string;\n showMissingAltWarning: boolean;\n uploadStats: MultiUploadStats;\n locale?: UploadLocale;\n translations?: Partial<UploadTranslations>;\n ui: UploadTranslations;\n onSelectAll: () => void;\n onDeselectAll: () => void;\n onRemoveSelected: () => void;\n onRetryFailed: () => void;\n}\n\nexport function MultiUploadHeaderAlerts({\n label, labelId, inputId, required = false, disabled = false,\n totalCount, selectedCount, uploadingCount, missingAltCount,\n isUploading, hasFailedUploads, infoMessage, showMissingAltWarning,\n uploadStats, locale = 'en', translations, ui,\n onSelectAll, onDeselectAll, onRemoveSelected, onRetryFailed,\n unstyled, providerClassNames, classNames, providerStyles, styles,\n}: MultiUploadHeaderAlertsProps) {\n const slotClass = (slot: MultiUploadSlot, defaultClass?: string) =>\n resolveSlotClass(defaultClass, unstyled, providerClassNames?.[slot], classNames?.[slot]);\n const slotStyle = (slot: MultiUploadSlot) =>\n resolveSlotStyle(providerStyles?.[slot], styles?.[slot]);\n\n return (\n <>\n <div data-slot=\"header\" className={slotClass('header', 'iuk-multi__header')} style={slotStyle('header')}>\n {(label || ui.uploadImages) && (\n <label\n id={labelId}\n htmlFor={inputId}\n data-slot=\"label\"\n className={slotClass('label', 'iuk-label')}\n style={slotStyle('label')}\n >\n <span>{label || ui.uploadImages}</span>\n {required && <span className={resolveSlotClass('iuk-required', unstyled)}>*</span>}\n {totalCount > 0 && (\n <span data-slot=\"count\" className={slotClass('count', 'iuk-multi__count')} style={slotStyle('count')}>\n ({totalCount})\n </span>\n )}\n </label>\n )}\n\n {totalCount > 0 && (\n <div data-slot=\"bulk-actions\" className={slotClass('bulkActions', 'iuk-multi__bulk')} style={slotStyle('bulkActions')}>\n {selectedCount === 0 ? (\n <button\n type=\"button\" onClick={onSelectAll} disabled={disabled}\n className={slotClass('bulkButton', 'iuk-btn iuk-btn--secondary iuk-btn--sm')}\n style={slotStyle('bulkButton')}\n >\n {ui.selectAll}\n </button>\n ) : (\n <>\n <button\n type=\"button\" onClick={onDeselectAll} disabled={disabled}\n className={slotClass('bulkButton', 'iuk-btn iuk-btn--secondary iuk-btn--sm')}\n style={slotStyle('bulkButton')}\n >\n {ui.deselectAll} ({selectedCount})\n </button>\n <button\n type=\"button\" onClick={onRemoveSelected} disabled={disabled}\n className={slotClass('bulkDangerButton', 'iuk-btn iuk-btn--danger iuk-btn--sm')}\n style={slotStyle('bulkDangerButton')}\n >\n <Trash2 size={14} />\n <span>{ui.removeSelected}</span>\n </button>\n </>\n )}\n </div>\n )}\n </div>\n\n {isUploading && (\n <div\n data-slot=\"alert\"\n role=\"status\"\n aria-live=\"polite\"\n className={slotClass('alert', 'iuk-alert iuk-alert--info')}\n style={slotStyle('alert')}\n >\n <span className={resolveSlotClass('iuk-alert__row', unstyled)}>\n <Loader2 size={16} className={resolveSlotClass('iuk-spin', unstyled)} />\n <span>{formatUploadingCount(ui, uploadingCount, locale, translations)}...</span>\n </span>\n {uploadStats.total > 0 && (\n <strong>\n {uploadStats.completed + uploadStats.failed} / {uploadStats.total}\n </strong>\n )}\n </div>\n )}\n\n {hasFailedUploads && (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={slotClass('alert', 'iuk-alert iuk-alert--error')}\n style={slotStyle('alert')}\n >\n <XCircle size={16} />\n <span>\n {ui.someUploadsFailed}{' '}\n <button\n type=\"button\"\n onClick={onRetryFailed}\n disabled={isUploading || disabled}\n className={resolveSlotClass('iuk-link-btn', unstyled)}\n >\n {ui.retryFailedUploads}\n </button>\n </span>\n </div>\n )}\n\n {infoMessage && (\n <div\n data-slot=\"alert\"\n role=\"status\"\n className={slotClass('alert', 'iuk-alert iuk-alert--success')}\n style={slotStyle('alert')}\n >\n <CheckCircle2 size={16} />\n <span>{infoMessage}</span>\n </div>\n )}\n\n {showMissingAltWarning && missingAltCount > 0 && (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={slotClass('alert', 'iuk-alert iuk-alert--warning')}\n style={slotStyle('alert')}\n >\n <AlertTriangle size={16} />\n <span>{formatNeedsAltMessage(ui, missingAltCount, locale)}</span>\n </div>\n )}\n </>\n );\n}\n\nexport interface MultiFooterSectionProps extends MultiSlotStylingProps {\n helperText?: string;\n displayError?: string;\n statusTextId?: string;\n isOpen?: boolean;\n hasPreviews: boolean;\n hasCompletedPreviews: boolean;\n isUploading: boolean;\n disabled: boolean;\n requireAltText: boolean;\n missingAltCount: number;\n onSave: () => void;\n ui: UploadTranslations;\n}\n\nexport function MultiFooterSection({\n helperText, displayError, statusTextId, isOpen, hasPreviews, hasCompletedPreviews,\n isUploading, disabled, requireAltText, missingAltCount, onSave, ui,\n unstyled, providerClassNames, classNames, providerStyles, styles,\n}: MultiFooterSectionProps) {\n const slotClass = (slot: MultiUploadSlot, defaultClass?: string) =>\n resolveSlotClass(defaultClass, unstyled, providerClassNames?.[slot], classNames?.[slot]);\n const slotStyle = (slot: MultiUploadSlot) =>\n resolveSlotStyle(providerStyles?.[slot], styles?.[slot]);\n\n return (\n <>\n {(helperText || displayError) && (\n <p\n id={statusTextId}\n role={displayError ? 'alert' : undefined}\n data-slot={displayError ? 'error-text' : 'helper-text'}\n className={resolveSlotClass(\n cx('iuk-helper-text', Boolean(displayError) && 'iuk-helper-text--error'),\n unstyled,\n providerClassNames?.helperText, classNames?.helperText,\n Boolean(displayError) && providerClassNames?.errorText,\n Boolean(displayError) && classNames?.errorText,\n )}\n style={resolveSlotStyle(\n providerStyles?.helperText, styles?.helperText,\n displayError ? providerStyles?.errorText : undefined,\n displayError ? styles?.errorText : undefined,\n )}\n >\n {displayError || helperText}\n </p>\n )}\n\n {isOpen && hasPreviews && (\n <div data-slot=\"commit-bar\" className={slotClass('commitBar', 'iuk-commit-bar')} style={slotStyle('commitBar')}>\n {requireAltText && missingAltCount > 0 && (\n <div className={resolveSlotClass('iuk-badge iuk-badge--warning', unstyled)}>\n <AlertTriangle size={13} />\n <span>{ui.withoutAltText.replace('{count}', String(missingAltCount))}</span>\n </div>\n )}\n <SaveButton\n unstyled={unstyled}\n className={slotClass('saveButton')}\n style={slotStyle('saveButton')}\n onClick={onSave}\n disabled={\n isUploading || disabled || !hasCompletedPreviews ||\n (requireAltText && missingAltCount > 0)\n }\n icon={<Save size={16} />}\n >\n {ui.saveImages}\n </SaveButton>\n </div>\n )}\n </>\n );\n}\n","import {\n CheckCircleIcon as CheckCircle2,\n LoaderIcon as Loader2,\n PaletteIcon as Palette,\n TypeIcon,\n XIcon as X,\n XCircleIcon as XCircle,\n} from '../icons';\nimport { type CSSProperties, useMemo, useState } from 'react';\nimport type { BlurPlaceholderType } from '../../blur/types';\nimport type { UploadLocale } from '../../types';\nimport { useImageUploadContext } from '../context';\nimport { useBlurDataURL } from '../hooks/useBlurService';\nimport {\n normalizeUploadLocale,\n resolveTranslations,\n type UploadTranslations,\n} from '../i18n';\nimport type { CustomImageRenderer, ImagePreview } from '../types';\nimport { appendCacheBuster } from '../utils/sessionMetaCache';\nimport { cx, resolveSlotClass, resolveUploadDataState } from '../utils/slotStyles';\nimport { BlurImage } from './BlurImage';\nimport { BlurVisualizationModal } from './BlurVisualizationModal';\n\nexport interface PreviewTileProps {\n preview: ImagePreview;\n onRemove: (id: string) => void;\n onCancel?: (id: string) => void;\n onRetry?: (id: string) => void;\n disabled?: boolean;\n blurType?: BlurPlaceholderType;\n isSelected?: boolean;\n onToggleSelect?: (id: string) => void;\n onEditAltText?: (id: string) => void;\n showCheckbox?: boolean;\n onAdjustColor?: (id: string) => void;\n onChangeColor?: (id: string, color: string) => void;\n onChangeAltText?: (id: string, altText: string) => void;\n appendCacheBuster?: boolean;\n locale?: UploadLocale;\n translations?: Partial<UploadTranslations>;\n renderImage?: CustomImageRenderer;\n unstyled?: boolean;\n className?: string;\n style?: CSSProperties;\n}\n\nexport function PreviewTile({\n preview, onRemove, onCancel, onRetry, disabled = false, blurType = 'card', isSelected = false,\n onToggleSelect, onEditAltText, showCheckbox = true, onAdjustColor,\n onChangeColor, onChangeAltText, appendCacheBuster: appendBuster = false,\n locale: propLocale, translations, renderImage,\n unstyled: propUnstyled, className, style,\n}: PreviewTileProps) {\n const ctx = useImageUploadContext();\n const isUnstyled = propUnstyled ?? ctx.unstyled;\n const locale = normalizeUploadLocale(propLocale || ctx.locale);\n const ui = resolveTranslations(locale, translations || ctx.translations);\n const [showBlurModal, setShowBlurModal] = useState(false);\n const cls = (defaultClass: string) => resolveSlotClass(defaultClass, isUnstyled);\n\n const isSvg = Boolean(\n preview.url?.toLowerCase().includes('.svg') ||\n preview.data?.format === 'svg' ||\n preview.url?.includes('image/svg+xml'),\n );\n\n const displayUrl = useMemo(\n () =>\n appendCacheBuster(preview.url, {\n enabled: appendBuster,\n token: preview.data?.contentHash || preview.data?.uploadedAt,\n }),\n [preview.url, preview.data?.contentHash, preview.data?.uploadedAt, appendBuster],\n );\n\n const fallbackBlurDataURL = useBlurDataURL(preview.url, { type: blurType, size: 'small' });\n const actualBlurDataUrl = preview.data?.blurDataUrl || fallbackBlurDataURL;\n const actualBlurColor = preview.blurColor || preview.data?.blurColor;\n\n const isUploading = Boolean(preview.isUploading);\n const hasError = Boolean(preview.error);\n const visualState = resolveUploadDataState({\n disabled, hasError, isUploading, hasContent: true,\n });\n const isSuccess = Boolean(\n !isUploading && !hasError && preview.originalSize && preview.optimizedSize,\n );\n const reductionPercent =\n isSuccess && preview.originalSize && preview.optimizedSize\n ? Math.round(\n ((preview.originalSize - preview.optimizedSize) / preview.originalSize) * 100,\n )\n : 0;\n\n return (\n <div\n data-slot=\"tile\"\n data-state={visualState}\n data-selected={isSelected || undefined}\n data-uploading={isUploading || undefined}\n data-error={hasError || undefined}\n className={resolveSlotClass(\n cx('iuk-tile', isSelected && 'iuk-tile--selected', hasError && 'iuk-tile--error'),\n isUnstyled,\n className,\n )}\n style={style}\n onClick={() => onToggleSelect && !disabled && onToggleSelect(preview.id)}\n >\n <div data-slot=\"tile-media\" className={cls('iuk-tile__media')}>\n <BlurImage\n src={displayUrl}\n alt={preview.altText || ui.previewAlt}\n blurDataUrl={!isSvg ? actualBlurDataUrl : undefined}\n blurColor={actualBlurColor}\n blurHash={preview.data?.blurHash}\n objectFit={isSvg ? 'contain' : 'cover'}\n style={isSvg ? { padding: '8px' } : undefined}\n renderImage={renderImage}\n />\n\n {showCheckbox && !disabled && !isUploading && onToggleSelect && (\n <div\n data-slot=\"tile-checkbox\"\n className={cls('iuk-tile__checkbox')}\n onClick={(e) => e.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={() => onToggleSelect(preview.id)}\n aria-label={ui.selectImageAria}\n />\n </div>\n )}\n\n {!disabled && onEditAltText && (\n <button\n type=\"button\"\n data-slot=\"tile-alt-btn\"\n className={cls(\n cx(\n 'iuk-tile__action iuk-tile__action--alt',\n Boolean(preview.altText) && 'iuk-tile__action--has-alt',\n ),\n )}\n onClick={(e) => {\n e.stopPropagation();\n onEditAltText(preview.id);\n }}\n aria-label={preview.altText ? ui.editAltTextAria : ui.addAltTextAria}\n title={\n preview.altText\n ? ui.editPrefix.replace('{title}', preview.altText)\n : ui.addDescriptionForA11y\n }\n >\n {preview.altText ? <CheckCircle2 size={14} /> : <TypeIcon size={14} />}\n </button>\n )}\n\n {!disabled && !isUploading && (\n <button\n type=\"button\"\n data-slot=\"tile-blur-btn\"\n className={cls('iuk-tile__action iuk-tile__action--blur')}\n onClick={(e) => {\n e.stopPropagation();\n if (onAdjustColor) onAdjustColor(preview.id);\n else setShowBlurModal(true);\n }}\n aria-label={ui.adjustBlurColorAria}\n title={ui.adjustBlurColorTitle}\n >\n <Palette size={14} />\n </button>\n )}\n\n {!disabled && !isUploading && (\n <button\n type=\"button\"\n data-slot=\"tile-remove-btn\"\n className={cls('iuk-tile__action iuk-tile__action--remove')}\n onClick={(e) => {\n e.stopPropagation();\n onRemove(preview.id);\n }}\n aria-label={ui.removeImageAria}\n >\n <X size={15} />\n </button>\n )}\n\n {isUploading && (\n <div data-slot=\"tile-overlay\" className={cls('iuk-tile__overlay')}>\n <Loader2 size={24} className={cls('iuk-spin')} />\n <p className={cls('iuk-tile__status')}>\n {preview.uploadMessage || `${ui.uploading}...`}\n </p>\n {preview.progress !== undefined && preview.progress > 0 && (\n <div\n role=\"progressbar\"\n aria-valuenow={Math.round(preview.progress)}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={ui.uploading}\n className={cls('iuk-progress-bar')}\n >\n <div\n className={cls('iuk-progress-bar__fill')}\n style={{ width: `${preview.progress}%` }}\n />\n </div>\n )}\n {!disabled && (\n <button\n type=\"button\"\n data-slot=\"tile-cancel\"\n className={cls('iuk-btn iuk-btn--secondary iuk-btn--sm iuk-tile__cancel-btn')}\n onClick={(e) => {\n e.stopPropagation();\n (onCancel ?? onRemove)(preview.id);\n }}\n aria-label={ui.cancelUpload}\n >\n <X size={13} />\n <span>{ui.cancelUpload}</span>\n </button>\n )}\n </div>\n )}\n\n {isSuccess && (\n <div data-slot=\"tile-badge\" className={cls('iuk-tile__badge iuk-tile__badge--success')}>\n <CheckCircle2 size={13} />\n {reductionPercent > 0 && <span>-{reductionPercent}%</span>}\n </div>\n )}\n\n {!disabled && !isUploading && !hasError && actualBlurColor && (\n <div data-slot=\"tile-color-badge\" className={cls('iuk-tile__badge iuk-tile__badge--color')}>\n <span className={cls('iuk-tile__color-dot')} style={{ backgroundColor: actualBlurColor }} />\n <code>{actualBlurColor.toUpperCase()}</code>\n </div>\n )}\n\n {hasError && (\n <div\n data-slot=\"tile-error\"\n role=\"alert\"\n className={cls('iuk-tile__overlay iuk-tile__overlay--error')}\n >\n <XCircle size={22} />\n <p>{preview.error}</p>\n {!disabled && onRetry && (\n <button\n type=\"button\"\n data-slot=\"tile-retry\"\n className={cls('iuk-btn iuk-btn--secondary iuk-btn--sm iuk-tile__retry-btn')}\n onClick={(e) => {\n e.stopPropagation();\n onRetry(preview.id);\n }}\n aria-label={ui.retryUpload}\n >\n <span>{ui.retryUpload}</span>\n </button>\n )}\n </div>\n )}\n </div>\n\n <BlurVisualizationModal\n isOpen={showBlurModal}\n onClose={() => setShowBlurModal(false)}\n imageUrl={preview.url}\n blurDataUrl={actualBlurDataUrl}\n blurColor={actualBlurColor}\n detectedColor={preview.data?.blurColor}\n altText={preview.altText}\n originalSize={preview.originalSize}\n optimizedSize={preview.optimizedSize}\n locale={locale}\n translations={translations}\n renderImage={renderImage}\n unstyled={isUnstyled}\n onChangeColor={(hex) => onChangeColor?.(preview.id, hex)}\n onUseDetectedColor={\n onChangeColor && preview.data?.blurColor\n ? () => onChangeColor(preview.id, preview.data!.blurColor!)\n : undefined\n }\n onChangeAltText={(nextAlt) => onChangeAltText?.(preview.id, nextAlt)}\n />\n </div>\n );\n}\n\nexport default PreviewTile;\n","import { CheckIcon as Check, InfoIcon as Info, ZapIcon as Zap } from '../icons';\nimport type { KeyboardEvent } from 'react';\nimport type {\n QualityLevel,\n StandardPresetName,\n UploadLocale,\n} from '../../types';\nimport { QUALITY_PRESETS, STANDARD_PRESETS } from '../../types';\nimport { estimateOutputSize } from '../../utils/formatters';\nimport {\n normalizeUploadLocale,\n resolveTranslations,\n type UploadTranslations,\n} from '../i18n';\nimport { cx, resolveSlotClass } from '../utils/slotStyles';\n\nfunction formatBytesCompact(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n}\n\nexport interface QualitySelectorProps {\n value: QualityLevel;\n onChange: (level: QualityLevel) => void;\n preset?: string;\n recommendedLevel?: QualityLevel;\n recommendationNote?: { en: string; ar?: string };\n originalFileSize?: number;\n locale?: UploadLocale;\n translations?: Partial<UploadTranslations>;\n disabled?: boolean;\n unstyled?: boolean;\n}\n\nexport function QualitySelector({\n value,\n onChange,\n preset,\n recommendedLevel,\n recommendationNote,\n originalFileSize,\n locale,\n translations,\n disabled = false,\n unstyled = false,\n}: QualitySelectorProps) {\n const resolvedLocale = normalizeUploadLocale(locale);\n const isAr = resolvedLocale === 'ar';\n const ui = resolveTranslations(resolvedLocale, translations);\n const cls = (defaultClass: string) => resolveSlotClass(defaultClass, unstyled);\n\n const standardPreset = preset\n ? STANDARD_PRESETS[preset as StandardPresetName]\n : undefined;\n\n const recommended: QualityLevel =\n recommendedLevel || standardPreset?.recommendedQualityLevel || 'high';\n const note = recommendationNote || standardPreset?.recommendationNote;\n\n const selected = QUALITY_PRESETS[value];\n const levels = Object.keys(QUALITY_PRESETS) as QualityLevel[];\n const estimatedSize =\n originalFileSize !== undefined\n ? estimateOutputSize(originalFileSize, value)\n : null;\n const saving = Math.round((1 - selected.compressionRatio) * 100);\n\n const handleRadioGroupKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n const currentIndex = Math.max(0, levels.indexOf(value));\n let nextIndex = -1;\n\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n const step = event.key === 'ArrowRight' && isAr ? -1 : 1;\n nextIndex = (currentIndex + step + levels.length) % levels.length;\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n const step = event.key === 'ArrowLeft' && isAr ? 1 : -1;\n nextIndex = (currentIndex + step + levels.length) % levels.length;\n } else if (event.key === 'Home') {\n nextIndex = 0;\n } else if (event.key === 'End') {\n nextIndex = levels.length - 1;\n }\n\n if (nextIndex >= 0) {\n event.preventDefault();\n const nextLevel = levels[nextIndex];\n onChange(nextLevel);\n const buttons = event.currentTarget.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]');\n buttons[nextIndex]?.focus();\n }\n };\n\n return (\n <div\n data-slot=\"quality-root\"\n data-unstyled={unstyled || undefined}\n className={cls('iuk-quality')}\n dir={isAr ? 'rtl' : 'ltr'}\n >\n <div className={cls('iuk-quality__header')}>\n <span className={cls('iuk-quality__title')}>\n {ui.qualityTitle}\n </span>\n <span className={cls(`iuk-quality__pill iuk-quality__pill--${value}`)}>\n {isAr ? selected.labelAr : selected.label} · Q{selected.value}\n </span>\n </div>\n\n <div\n className={cls('iuk-quality__tabs')}\n role=\"radiogroup\"\n aria-label={ui.qualityLevelAria}\n onKeyDown={handleRadioGroupKeyDown}\n >\n {levels.map((level) => {\n const item = QUALITY_PRESETS[level];\n const isSelected = value === level;\n const isRecommended = level === recommended;\n return (\n <button\n key={level}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n tabIndex={disabled ? -1 : isSelected ? 0 : -1}\n disabled={disabled}\n onClick={() => !disabled && onChange(level)}\n className={cls(\n cx(\n 'iuk-quality__tab',\n isSelected && 'iuk-quality__tab--selected',\n isRecommended && !isSelected && 'iuk-quality__tab--recommended',\n disabled && 'iuk-quality__tab--disabled',\n ),\n )}\n >\n {isSelected && (\n <Check size={11} strokeWidth={3} aria-hidden=\"true\" />\n )}\n <span>{isAr ? item.labelAr : item.label}</span>\n {isRecommended && !isSelected && (\n <span className={cls('iuk-quality__star')} aria-hidden=\"true\">\n ★\n </span>\n )}\n </button>\n );\n })}\n </div>\n\n <div className={cls(`iuk-quality__detail iuk-quality__detail--${value}`)}>\n <p className={cls('iuk-quality__desc')}>\n {isAr ? selected.descriptionAr : selected.description}\n </p>\n <div className={cls('iuk-quality__meta')}>\n <span className={cls('iuk-quality__tag')}>Q{selected.value}</span>\n {estimatedSize !== null && (\n <>\n <span className={cls('iuk-quality__dot')} aria-hidden=\"true\" />\n <Zap size={11} aria-hidden=\"true\" />\n <span>~{formatBytesCompact(estimatedSize)}</span>\n <span className={cls('iuk-quality__dot')} aria-hidden=\"true\" />\n <span className={cls('iuk-quality__saving')}>\n {saving}% {ui.qualitySaved}\n </span>\n </>\n )}\n {value === recommended && (\n <span className={cls('iuk-quality__rec-badge')}>\n ⭐ {ui.qualityRecommended}\n </span>\n )}\n </div>\n </div>\n\n {note && (\n <div className={cls('iuk-quality__note')}>\n <Info size={12} aria-hidden=\"true\" className={cls('iuk-quality__note-icon')} />\n <span>{isAr ? note.ar || note.en : note.en}</span>\n </div>\n )}\n </div>\n );\n}\n\nexport default QualitySelector;\n","import {\n ChevronDownIcon as ChevronDown,\n ChevronUpIcon as ChevronUp,\n LoaderIcon as Loader2,\n} from '../icons';\nimport { useEffect, useRef, useState } from 'react';\nimport type { UploadLocale } from '../../types';\nimport { useImageUploadContext } from '../context';\nimport {\n formatUploadingCount,\n normalizeUploadLocale,\n resolveTranslations,\n type UploadTranslations,\n} from '../i18n';\nimport type { CustomImageRenderer, ImagePreview } from '../types';\nimport { cx, resolveSlotClass } from '../utils/slotStyles';\nimport { BlurImage } from './BlurImage';\n\nconst PROGRESS_PANEL_DISMISS_DELAY_MS = 2500;\n\nexport interface UploadItem {\n id: string;\n url: string;\n fileName?: string;\n message?: string;\n progress?: number;\n}\n\nexport function useRetainedProgressItems(\n uploadingPreviews: ImagePreview[],\n previews: ImagePreview[],\n): UploadItem[] {\n const [retainedItems, setRetainedItems] = useState<UploadItem[] | null>(null);\n const activeBatchRef = useRef<Map<string, UploadItem>>(new Map());\n const dismissTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const prevUploadingCountRef = useRef(0);\n const isUploading = uploadingPreviews.length > 0;\n\n useEffect(() => {\n if (isUploading) {\n if (dismissTimerRef.current) {\n clearTimeout(dismissTimerRef.current);\n dismissTimerRef.current = null;\n activeBatchRef.current.clear();\n }\n setRetainedItems(null);\n for (const p of uploadingPreviews) {\n activeBatchRef.current.set(p.id, {\n id: p.id,\n url: p.url,\n fileName: p.fileName || p.file?.name,\n message: p.uploadMessage || undefined,\n progress: p.progress,\n });\n }\n } else if (prevUploadingCountRef.current > 0 && activeBatchRef.current.size > 0) {\n const completed: UploadItem[] = Array.from(activeBatchRef.current.values()).map((it) => {\n const found = previews.find((p) => p.id === it.id);\n return {\n ...it,\n progress: found?.progress ?? 100,\n message: found?.error ? found.error : (found?.uploadMessage || undefined),\n };\n });\n setRetainedItems(completed);\n dismissTimerRef.current = setTimeout(() => {\n setRetainedItems(null);\n activeBatchRef.current.clear();\n dismissTimerRef.current = null;\n }, PROGRESS_PANEL_DISMISS_DELAY_MS);\n }\n prevUploadingCountRef.current = uploadingPreviews.length;\n }, [isUploading, uploadingPreviews, previews]);\n\n useEffect(() => () => {\n if (dismissTimerRef.current) clearTimeout(dismissTimerRef.current);\n }, []);\n\n return isUploading\n ? uploadingPreviews.map((p) => ({\n id: p.id,\n url: p.url,\n fileName: p.fileName || p.file?.name,\n message: p.uploadMessage || undefined,\n progress: p.progress,\n }))\n : (retainedItems ?? []);\n}\n\nexport interface UploadProgressPanelProps {\n items: UploadItem[];\n completedCount: number;\n totalCount: number;\n locale?: UploadLocale;\n translations?: Partial<UploadTranslations>;\n renderImage?: CustomImageRenderer;\n unstyled?: boolean;\n}\n\nexport function UploadProgressPanel({\n items,\n completedCount,\n totalCount,\n locale: propLocale,\n translations,\n renderImage,\n unstyled: propUnstyled,\n}: UploadProgressPanelProps) {\n const ctx = useImageUploadContext();\n const isUnstyled = propUnstyled ?? ctx.unstyled;\n const locale = normalizeUploadLocale(propLocale || ctx.locale);\n const effectiveOverrides = translations || ctx.translations;\n const ui = resolveTranslations(locale, effectiveOverrides);\n const [isMinimized, setIsMinimized] = useState(false);\n const uploadingCount = items.length;\n const cls = (defaultClass: string) => resolveSlotClass(defaultClass, isUnstyled);\n\n if (uploadingCount === 0) return null;\n\n return (\n <div\n data-upload-progress-dock\n data-slot=\"progress-dock\"\n data-unstyled={isUnstyled || undefined}\n dir={locale === 'ar' ? 'rtl' : 'ltr'}\n className={cls(\n cx('iuk-progress-dock', isMinimized && 'iuk-progress-dock--collapsed'),\n )}\n >\n <div\n className={cls(\n cx('iuk-progress-panel', isMinimized && 'iuk-progress-panel--minimized'),\n )}\n >\n <button\n type=\"button\"\n className={cls('iuk-progress-panel__header')}\n aria-expanded={!isMinimized}\n onClick={() => setIsMinimized((prev) => !prev)}\n >\n <span className={cls('iuk-progress-panel__title')}>\n <Loader2 size={16} className={cls('iuk-spin')} />\n <span>\n {formatUploadingCount(ui, uploadingCount, locale, effectiveOverrides)}\n </span>\n {totalCount > 0 && (\n <span className={cls('iuk-progress-panel__count')}>\n ({completedCount}/{totalCount})\n </span>\n )}\n </span>\n {isMinimized ? <ChevronUp size={18} /> : <ChevronDown size={18} />}\n </button>\n\n {!isMinimized && (\n <div className={cls('iuk-progress-panel__body')}>\n {items.map((item) => (\n <div key={item.id} className={cls('iuk-progress-item')}>\n <div className={cls('iuk-progress-item__thumb')}>\n <BlurImage\n src={item.url}\n alt={ui.uploadingAlt}\n objectFit=\"cover\"\n renderImage={renderImage}\n />\n </div>\n <div className={cls('iuk-progress-item__info')}>\n <div className={cls('iuk-progress-item__name')}>\n {item.fileName || ui.image}\n </div>\n <div className={cls('iuk-progress-item__status')}>\n {item.message || ui.processing}\n </div>\n {item.progress !== undefined && item.progress > 0 && (\n <div\n role=\"progressbar\"\n aria-valuenow={Math.round(item.progress)}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={item.fileName || ui.uploading}\n className={cls('iuk-progress-bar')}\n >\n <div\n className={cls('iuk-progress-bar__fill')}\n style={{ width: `${item.progress}%` }}\n />\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport default UploadProgressPanel;\n","import {\n type ChangeEvent, type ForwardedRef, forwardRef, type HTMLAttributes,\n type ReactElement, type Ref, useId, useImperativeHandle, useRef,\n} from 'react';\nimport type { UploadPresetName } from '../../types';\nimport { useImageUploadContext } from '../context';\nimport { useClipboardPaste } from '../hooks/useClipboardPaste';\nimport { useDragAndDrop } from '../hooks/useDragAndDrop';\nimport { useSingleImageState } from '../hooks/useSingleImageState';\nimport type { SingleUploadSlot } from '../styling';\nimport type { ImageUploadHandle, SingleImageUploadProps } from '../types';\nimport {\n HIDDEN_INPUT_STYLE, resolveSlotClass, resolveSlotStyle, resolveUploadDataState,\n} from '../utils/slotStyles';\nimport { AltTextModal } from './AltTextModal';\nimport { BlurVisualizationModal } from './BlurVisualizationModal';\nimport { PreviewTile } from './PreviewTile';\nimport { QualitySelector } from './QualitySelector';\nimport {\n resolveSingleDropzoneSlot, SingleDropzoneEmptyPrompt, SingleStatusFooter,\n} from './SingleDropzoneContent';\n\nfunction SingleImageUploadInner<TPreset extends string = UploadPresetName>(\n props: SingleImageUploadProps<TPreset>,\n ref: ForwardedRef<ImageUploadHandle>,\n) {\n const {\n preset, translations, renderImage, label, error, helperText, className, style,\n accept = 'image/jpeg,image/png,image/webp,image/avif,image/svg+xml',\n disabled = false, required = false, blurType = 'card',\n showProgress = false, showQualitySelector = true,\n recommendedQuality, qualityNote, isOpen,\n capture, enablePaste = true, pasteTarget = 'dropzone', name, onBlur,\n classNames: cCls, styles: cSty, renderDropzone, renderPreview,\n } = props;\n\n const ctx = useImageUploadContext();\n const isUnstyled = props.unstyled ?? ctx.unstyled;\n const pCls = ctx.singleClassNames;\n const pSty = ctx.singleStyles;\n\n const slotClass = (slot: SingleUploadSlot, defaultClass?: string) =>\n resolveSlotClass(defaultClass, isUnstyled, pCls?.[slot], cCls?.[slot]);\n const slotStyle = (slot: SingleUploadSlot) =>\n resolveSlotStyle(pSty?.[slot], cSty?.[slot]);\n\n const state = useSingleImageState(props);\n const { isDragging, dragHandlers } = useDragAndDrop({ disabled, onDrop: state.handleFileSelect });\n const { onPaste } = useClipboardPaste({\n enabled: enablePaste, pasteTarget, disabled, multiple: false,\n onPasteFiles: (files) => { void state.handleFileSelect(files); },\n });\n\n const dropzoneRef = useRef<HTMLDivElement>(null);\n const labelId = useId();\n const inputId = useId();\n const statusTextId = useId();\n\n const openFileDialog = () => { if (!disabled) state.fileInputRef.current?.click(); };\n\n useImperativeHandle(ref, () => ({\n focus: () => { dropzoneRef.current?.focus(); },\n open: openFileDialog,\n clear: () => state.handleRemoveTile(),\n }));\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files;\n if (files && files.length > 0) void state.handleFileSelect(files);\n event.target.value = '';\n };\n\n const displayError = error || state.validationError;\n const hasPreview = Boolean(state.preview);\n const hasError = Boolean(displayError);\n const hasLabel = Boolean(label || state.ui.uploadImage);\n const hasStatusText = Boolean(helperText || displayError);\n const visualState = resolveUploadDataState({\n disabled, hasError, isUploading: state.isUploading, isDragging, hasContent: hasPreview,\n });\n\n const dropzoneProps: HTMLAttributes<HTMLElement> = hasPreview\n ? { ...dragHandlers, onPaste, 'aria-disabled': disabled || undefined }\n : {\n ...dragHandlers, onPaste,\n onClick: () => { if (!disabled) openFileDialog(); },\n onKeyDown: (event) => {\n if (!disabled && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n openFileDialog();\n }\n },\n role: 'button', tabIndex: disabled ? -1 : 0,\n 'aria-label': state.ui.uploadImageAria,\n 'aria-labelledby': hasLabel ? labelId : undefined,\n 'aria-required': required || undefined,\n 'aria-invalid': hasError || undefined,\n 'aria-describedby': hasStatusText ? statusTextId : undefined,\n 'aria-disabled': disabled || undefined,\n };\n\n const slotStylingProps = {\n unstyled: isUnstyled, providerClassNames: pCls, classNames: cCls, providerStyles: pSty, styles: cSty,\n };\n const dropzoneSlot = resolveSingleDropzoneSlot(\n { isDragging, hasPreview, disabled, hasError }, slotStylingProps,\n );\n\n return (\n <div\n data-slot=\"single-root\" data-state={visualState} data-unstyled={isUnstyled || undefined}\n className={resolveSlotClass('iuk-single', isUnstyled, pCls?.root, cCls?.root, className)}\n style={resolveSlotStyle(pSty?.root, cSty?.root, style)}\n dir={state.locale === 'ar' ? 'rtl' : 'ltr'}\n onBlur={onBlur ? (e) => { if (!e.currentTarget.contains(e.relatedTarget as Node | null)) onBlur(); } : undefined}\n >\n <div role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" style={HIDDEN_INPUT_STYLE}>\n {state.liveAnnouncement}\n </div>\n\n {name && (\n <input type=\"hidden\" name={name} value={state.serializedFormValue} required={required} data-slot=\"form-input\" />\n )}\n\n {hasLabel && (\n <label id={labelId} htmlFor={inputId} data-slot=\"label\" className={slotClass('label', 'iuk-label')} style={slotStyle('label')}>\n <span>{label || state.ui.uploadImage}</span>\n {required && <span className={resolveSlotClass('iuk-required', isUnstyled)}>*</span>}\n </label>\n )}\n\n {showQualitySelector && (\n <div data-slot=\"quality-selector\" className={slotClass('qualitySelector')} style={slotStyle('qualitySelector')}>\n <QualitySelector\n value={state.qualityLevel} onChange={state.setQualityLevel} preset={preset}\n recommendedLevel={recommendedQuality} recommendationNote={qualityNote}\n originalFileSize={state.selectedFile?.size} locale={state.locale}\n disabled={disabled || state.isUploading} unstyled={isUnstyled}\n />\n </div>\n )}\n\n <input\n id={inputId} ref={state.fileInputRef} type=\"file\" accept={accept} capture={capture}\n onChange={handleInputChange}\n className={resolveSlotClass('iuk-hidden-input', isUnstyled)}\n style={isUnstyled ? HIDDEN_INPUT_STYLE : undefined}\n disabled={disabled} aria-label={state.ui.fileInputAria}\n aria-invalid={hasError || undefined}\n aria-describedby={hasStatusText ? statusTextId : undefined}\n />\n\n {!state.preview && renderDropzone ? (\n renderDropzone({\n state: visualState, isDragging, isUploading: state.isUploading,\n progress: state.progress, uploadMessage: state.uploadMessage,\n maxSizeMB: state.maxSizeMB, disabled, error: displayError || undefined,\n qualityLevel: state.qualityLevel, setQualityLevel: state.setQualityLevel,\n openFileDialog, dropzoneProps, locale: state.locale, ui: state.ui,\n })\n ) : (\n <div\n ref={dropzoneRef} data-slot=\"dropzone\" data-state={visualState}\n data-dragging={isDragging || undefined} data-uploading={state.isUploading || undefined}\n data-disabled={disabled || undefined} data-error={hasError || undefined}\n className={dropzoneSlot.className} style={dropzoneSlot.style} {...dropzoneProps}\n >\n {state.preview ? (\n <div\n data-slot=\"preview-wrap\" className={slotClass('previewWrap', 'iuk-single__preview-wrap')}\n style={slotStyle('previewWrap')} onClick={(event) => event.stopPropagation()}\n >\n {renderPreview ? (\n renderPreview({\n previewUrl: state.preview, uploadedData: state.uploadedData, altText: state.altText,\n blurColor: state.uploadedData?.blurColor ?? state.blurColor,\n blurDataUrl: state.blurDataUrlState || state.currentImageData?.blurDataUrl || '',\n isUploading: state.isUploading, progress: state.progress,\n uploadMessage: state.uploadMessage, sizeInfo: state.sizeInfo, disabled,\n openFileDialog, remove: () => state.handleRemoveTile(),\n cancel: () => state.handleCancelUpload(),\n openAltTextModal: () => state.setEditingAltText(true),\n openBlurInspector: () => state.setIsBlurModalOpen(true),\n download: state.handleDownload, locale: state.locale, ui: state.ui,\n })\n ) : (\n <PreviewTile\n preview={{\n id: 'single', url: state.preview, altText: state.altText,\n isUploading: state.isUploading, progress: state.progress,\n uploadMessage: state.uploadMessage || null,\n originalSize: state.sizeInfo?.original,\n optimizedSize: state.sizeInfo?.optimized ?? null,\n data: state.uploadedData ?? undefined,\n blurColor: state.uploadedData?.blurColor ?? state.blurColor,\n }}\n onRemove={() => state.handleRemoveTile()} onCancel={() => state.handleCancelUpload()}\n disabled={disabled} blurType={blurType} showCheckbox={false}\n onEditAltText={() => state.setEditingAltText(true)}\n onAdjustColor={() => state.setIsBlurModalOpen(true)}\n locale={state.locale} translations={translations} renderImage={renderImage}\n unstyled={isUnstyled} className={slotClass('tile')} style={slotStyle('tile')}\n />\n )}\n </div>\n ) : (\n <SingleDropzoneEmptyPrompt\n isUploading={state.isUploading} uploadMessage={state.uploadMessage}\n showProgress={showProgress} progress={state.progress}\n maxSizeMB={state.maxSizeMB} enablePaste={enablePaste} ui={state.ui} {...slotStylingProps}\n />\n )}\n </div>\n )}\n\n <SingleStatusFooter\n showMissingAltWarning={state.showMissingAltWarning}\n hasPreview={hasPreview} hasAltText={Boolean(state.altText?.trim())}\n uploadMessage={state.uploadMessage} isUploading={state.isUploading}\n sizeInfo={state.sizeInfo} canDownload={state.canDownload}\n onDownload={() => void state.handleDownload()}\n helperText={helperText} displayError={displayError} statusTextId={statusTextId}\n isOpen={isOpen} requireAltText={state.requireAltText}\n disabled={disabled} onSave={state.handleSaveImage}\n ui={state.ui} {...slotStylingProps}\n />\n\n {state.editingAltText && state.preview && (\n <AltTextModal\n imageUrl={state.preview} initialAltText={state.altText}\n onSave={state.handleAltTextSave} onClose={() => state.setEditingAltText(false)}\n locale={state.locale} translations={translations} renderImage={renderImage}\n />\n )}\n\n {state.preview && (\n <BlurVisualizationModal\n isOpen={state.isBlurModalOpen} onClose={() => state.setIsBlurModalOpen(false)}\n imageUrl={state.preview}\n blurDataUrl={state.blurDataUrlState || state.currentImageData?.blurDataUrl}\n blurColor={state.blurColor} altText={state.altText}\n originalSize={state.sizeInfo?.original ?? state.currentImageData?.originalSize}\n optimizedSize={state.sizeInfo?.optimized ?? state.currentImageData?.size ?? null}\n detectedColor={state.detectedBlurColor}\n onChangeColor={(hex) => state.applyBlurColor(hex)}\n onUseDetectedColor={state.handleResetColor}\n onChangeAltText={(nextAlt) => state.handleAltTextSave(nextAlt)}\n locale={state.locale} translations={translations} renderImage={renderImage}\n />\n )}\n </div>\n );\n}\n\nexport const SingleImageUpload = forwardRef(SingleImageUploadInner) as <\n TPreset extends string = UploadPresetName,\n>(\n props: SingleImageUploadProps<TPreset> & { ref?: Ref<ImageUploadHandle> },\n) => ReactElement | null;\n\nexport default SingleImageUpload;\n","import {\n AlertTriangleIcon as AlertTriangle,\n DownloadIcon as Download,\n ImagePlusIcon as ImagePlus,\n SaveIcon as Save,\n UploadIcon as Upload,\n} from '../icons';\nimport type { CSSProperties } from 'react';\nimport type { UploadTranslations } from '../i18n';\nimport type {\n SingleUploadClassNames,\n SingleUploadSlot,\n SingleUploadStyles,\n} from '../styling';\nimport { cx, resolveSlotClass, resolveSlotStyle } from '../utils/slotStyles';\nimport { SaveButton } from './SaveButton';\n\nfunction formatCompactBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n}\n\nexport interface SingleSlotStylingProps {\n unstyled?: boolean;\n providerClassNames?: SingleUploadClassNames;\n classNames?: SingleUploadClassNames;\n providerStyles?: SingleUploadStyles;\n styles?: SingleUploadStyles;\n}\n\nexport function resolveSingleDropzoneSlot(\n flags: {\n isDragging: boolean;\n hasPreview: boolean;\n disabled: boolean;\n hasError: boolean;\n },\n styling: SingleSlotStylingProps,\n): { className?: string; style?: CSSProperties } {\n const { isDragging, hasPreview, disabled, hasError } = flags;\n const { unstyled, providerClassNames: pCls, classNames: cCls, providerStyles: pSty, styles: cSty } = styling;\n return {\n className: resolveSlotClass(\n cx(\n 'iuk-dropzone',\n isDragging && 'iuk-dropzone--dragging',\n hasPreview && 'iuk-dropzone--has-image',\n disabled && 'iuk-dropzone--disabled',\n hasError && 'iuk-dropzone--error',\n ),\n unstyled,\n pCls?.dropzone, cCls?.dropzone,\n isDragging && pCls?.dropzoneDragging, isDragging && cCls?.dropzoneDragging,\n hasPreview && pCls?.dropzoneHasImage, hasPreview && cCls?.dropzoneHasImage,\n disabled && pCls?.dropzoneDisabled, disabled && cCls?.dropzoneDisabled,\n hasError && pCls?.dropzoneError, hasError && cCls?.dropzoneError,\n ),\n style: resolveSlotStyle(\n pSty?.dropzone, cSty?.dropzone,\n isDragging ? pSty?.dropzoneDragging : undefined, isDragging ? cSty?.dropzoneDragging : undefined,\n hasPreview ? pSty?.dropzoneHasImage : undefined, hasPreview ? cSty?.dropzoneHasImage : undefined,\n disabled ? pSty?.dropzoneDisabled : undefined, disabled ? cSty?.dropzoneDisabled : undefined,\n hasError ? pSty?.dropzoneError : undefined, hasError ? cSty?.dropzoneError : undefined,\n ),\n };\n}\n\nexport interface SingleDropzoneEmptyPromptProps extends SingleSlotStylingProps {\n isUploading: boolean;\n uploadMessage: string;\n showProgress: boolean;\n progress: number;\n maxSizeMB: number;\n enablePaste?: boolean;\n ui: UploadTranslations;\n}\n\nexport function SingleDropzoneEmptyPrompt({\n isUploading, uploadMessage, showProgress, progress, maxSizeMB, enablePaste = true, ui,\n unstyled, providerClassNames, classNames, providerStyles, styles,\n}: SingleDropzoneEmptyPromptProps) {\n const slotClass = (slot: SingleUploadSlot, defaultClass?: string) =>\n resolveSlotClass(defaultClass, unstyled, providerClassNames?.[slot], classNames?.[slot]);\n const slotStyle = (slot: SingleUploadSlot) =>\n resolveSlotStyle(providerStyles?.[slot], styles?.[slot]);\n\n return (\n <div\n data-slot=\"dropzone-prompt\"\n className={slotClass('dropzonePrompt', 'iuk-dropzone__prompt')}\n style={slotStyle('dropzonePrompt')}\n >\n <div\n data-slot=\"dropzone-icon\"\n className={slotClass('dropzoneIcon', 'iuk-dropzone__icon')}\n style={slotStyle('dropzoneIcon')}\n >\n {isUploading ? (\n <div className={resolveSlotClass('iuk-spinner', unstyled)} />\n ) : (\n <ImagePlus size={36} strokeWidth={1.5} />\n )}\n </div>\n <p\n data-slot=\"dropzone-text\"\n className={slotClass('dropzoneText', 'iuk-dropzone__text')}\n style={slotStyle('dropzoneText')}\n >\n {isUploading ? uploadMessage || `${ui.uploading}...` : ui.dragDropOrClickToUpload}\n </p>\n {isUploading && showProgress && progress > 0 && (\n <p\n data-slot=\"dropzone-progress\"\n role=\"progressbar\"\n aria-valuenow={Math.round(progress)}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={ui.uploading}\n className={slotClass('dropzoneProgress', 'iuk-dropzone__progress')}\n style={slotStyle('dropzoneProgress')}\n >\n {progress}%\n </p>\n )}\n {!isUploading && (\n <>\n <p\n data-slot=\"dropzone-hint\"\n className={slotClass('dropzoneHint', 'iuk-dropzone__hint')}\n style={slotStyle('dropzoneHint')}\n >\n {ui.upToSizeMB.replace('{size}', String(maxSizeMB))}\n {enablePaste ? ` • ${ui.pasteHint}` : ''}\n </p>\n <span\n data-slot=\"browse-button\"\n className={slotClass('browseButton', 'iuk-btn iuk-btn--secondary')}\n style={slotStyle('browseButton')}\n >\n <Upload size={15} />\n <span>{ui.browseFiles}</span>\n </span>\n </>\n )}\n </div>\n );\n}\n\nexport interface SingleStatusFooterProps extends SingleSlotStylingProps {\n showMissingAltWarning: boolean;\n hasPreview: boolean;\n hasAltText: boolean;\n uploadMessage: string;\n isUploading: boolean;\n sizeInfo: { original: number; optimized: number } | null;\n canDownload: boolean;\n onDownload: () => void;\n helperText?: string;\n displayError?: string;\n statusTextId?: string;\n isOpen?: boolean;\n requireAltText?: boolean;\n disabled?: boolean;\n onSave?: () => void;\n ui: UploadTranslations;\n}\n\nexport function SingleStatusFooter({\n showMissingAltWarning, hasPreview, hasAltText, uploadMessage, isUploading,\n sizeInfo, canDownload, onDownload, helperText, displayError, statusTextId,\n isOpen, requireAltText, disabled, onSave, ui,\n unstyled, providerClassNames, classNames, providerStyles, styles,\n}: SingleStatusFooterProps) {\n const slotClass = (slot: SingleUploadSlot, defaultClass?: string) =>\n resolveSlotClass(defaultClass, unstyled, providerClassNames?.[slot], classNames?.[slot]);\n const slotStyle = (slot: SingleUploadSlot) =>\n resolveSlotStyle(providerStyles?.[slot], styles?.[slot]);\n\n return (\n <>\n {showMissingAltWarning && hasPreview && !hasAltText && (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={slotClass('alert', 'iuk-alert iuk-alert--warning')}\n style={slotStyle('alert')}\n >\n <AlertTriangle size={16} />\n <span>{ui.addAltBeforeSaving}</span>\n </div>\n )}\n\n {uploadMessage && !isUploading && sizeInfo && (\n <div\n data-slot=\"alert\"\n role=\"status\"\n className={slotClass('alert', 'iuk-alert iuk-alert--success')}\n style={slotStyle('alert')}\n >\n <span>{uploadMessage}</span>\n </div>\n )}\n\n {hasPreview && canDownload && (\n <button\n type=\"button\"\n data-slot=\"download-button\"\n className={slotClass('downloadButton', 'iuk-btn iuk-btn--secondary iuk-single__download')}\n style={slotStyle('downloadButton')}\n onClick={onDownload}\n disabled={isUploading}\n aria-label={ui.downloadImage}\n >\n <Download size={15} aria-hidden=\"true\" />\n <span>{ui.downloadImage}</span>\n {sizeInfo && (\n <span className={resolveSlotClass('iuk-badge', unstyled)}>\n {formatCompactBytes(sizeInfo.optimized)}\n </span>\n )}\n </button>\n )}\n\n {(helperText || displayError) && (\n <p\n id={statusTextId}\n role={displayError ? 'alert' : undefined}\n data-slot={displayError ? 'error-text' : 'helper-text'}\n className={resolveSlotClass(\n cx('iuk-helper-text', Boolean(displayError) && 'iuk-helper-text--error'),\n unstyled,\n providerClassNames?.helperText, classNames?.helperText,\n Boolean(displayError) && providerClassNames?.errorText,\n Boolean(displayError) && classNames?.errorText,\n )}\n style={resolveSlotStyle(\n providerStyles?.helperText, styles?.helperText,\n displayError ? providerStyles?.errorText : undefined,\n displayError ? styles?.errorText : undefined,\n )}\n >\n {displayError || helperText}\n </p>\n )}\n\n {isOpen && hasPreview && onSave && (\n <div\n data-slot=\"commit-bar\"\n className={slotClass('commitBar', 'iuk-commit-bar')}\n style={slotStyle('commitBar')}\n >\n {requireAltText && !hasAltText && (\n <div className={resolveSlotClass('iuk-badge iuk-badge--warning', unstyled)}>\n <AlertTriangle size={13} />\n <span>{ui.missingDescription}</span>\n </div>\n )}\n <SaveButton\n unstyled={unstyled}\n className={slotClass('saveButton')}\n style={slotStyle('saveButton')}\n onClick={onSave}\n disabled={isUploading || disabled || Boolean(requireAltText && !hasAltText)}\n icon={<Save size={16} />}\n >\n {ui.saveImage}\n </SaveButton>\n </div>\n )}\n </>\n );\n}\n"],"mappings":"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","names":["useEffect","useEffect","cx","useId","jsx","jsxs","useId","useRef","useState","useEffect","useMemo","useRef","jsx","jsxs","useRef","useMemo","useEffect","jsx","jsxs","useState","useRef","useMemo","useEffect","useRef","useState","jsx","jsxs","useMemo","useEffect","useEffect","useEffect","useId","useMemo","useRef","useState","createPortal","jsx","jsxs","jsx","jsxs","jsx","jsxs","useId","useMemo","useState","useRef","useEffect","createPortal","forwardRef","useEffect","useState","createPortal","Fragment","useId","useRef","createPortal","jsx","jsxs","jsx","jsxs","useMemo","useState","jsx","jsxs","useState","useMemo","Fragment","jsx","jsxs","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","p","Fragment","jsx","jsxs","useRef","useId","p","createPortal","forwardRef","useId","useImperativeHandle","useRef","Fragment","jsx","jsxs","jsx","jsxs","useRef","useId","useImperativeHandle","forwardRef","Fragment","jsx","jsxs","useState","useEffect","createPortal","forwardRef"]}