@rpcbase/ui 0.261.0 → 0.263.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/dist/assets/sha256.worker-BEf4_Y9w.js.map +1 -0
  2. package/dist/components/FilesUploadField/index.d.ts +19 -6
  3. package/dist/components/FilesUploadField/index.d.ts.map +1 -1
  4. package/dist/components/FilesUploadField/sha256.d.ts +5 -0
  5. package/dist/components/FilesUploadField/sha256.d.ts.map +1 -0
  6. package/dist/components/FilesUploadField/sha256.worker.d.ts +4 -0
  7. package/dist/components/FilesUploadField/sha256.worker.d.ts.map +1 -0
  8. package/dist/components/ImagesField/index.d.ts +4 -2
  9. package/dist/components/ImagesField/index.d.ts.map +1 -1
  10. package/dist/index.js +10 -10
  11. package/dist/index298.js +11 -803
  12. package/dist/index298.js.map +1 -1
  13. package/dist/index299.js +865 -28
  14. package/dist/index299.js.map +1 -1
  15. package/dist/index300.js +26 -510
  16. package/dist/index300.js.map +1 -1
  17. package/dist/index301.js +481 -755
  18. package/dist/index301.js.map +1 -1
  19. package/dist/index302.js +786 -7428
  20. package/dist/index302.js.map +1 -1
  21. package/dist/index303.js +7429 -7
  22. package/dist/index303.js.map +1 -1
  23. package/dist/index304.js +6 -12
  24. package/dist/index304.js.map +1 -1
  25. package/dist/index305.js +12 -5
  26. package/dist/index305.js.map +1 -1
  27. package/dist/index306.js +3 -3
  28. package/dist/index306.js.map +1 -1
  29. package/dist/index307.js +5 -469
  30. package/dist/index307.js.map +1 -1
  31. package/dist/index308.js +464 -32
  32. package/dist/index308.js.map +1 -1
  33. package/dist/index309.js +36 -18
  34. package/dist/index309.js.map +1 -1
  35. package/dist/index310.js +17 -28
  36. package/dist/index310.js.map +1 -1
  37. package/dist/index311.js +30 -4
  38. package/dist/index311.js.map +1 -1
  39. package/dist/index312.js +4 -59
  40. package/dist/index312.js.map +1 -1
  41. package/dist/index313.js +59 -9
  42. package/dist/index313.js.map +1 -1
  43. package/dist/index314.js +9 -5
  44. package/dist/index314.js.map +1 -1
  45. package/dist/index315.js +5 -9
  46. package/dist/index315.js.map +1 -1
  47. package/dist/index316.js +9 -12
  48. package/dist/index316.js.map +1 -1
  49. package/dist/index317.js +13 -3
  50. package/dist/index317.js.map +1 -1
  51. package/dist/index318.js +3 -17
  52. package/dist/index318.js.map +1 -1
  53. package/dist/index319.js +14 -23
  54. package/dist/index319.js.map +1 -1
  55. package/dist/index320.js +23 -39
  56. package/dist/index320.js.map +1 -1
  57. package/dist/index321.js +41 -5
  58. package/dist/index321.js.map +1 -1
  59. package/dist/index322.js +5 -25
  60. package/dist/index322.js.map +1 -1
  61. package/dist/index323.js +24 -18
  62. package/dist/index323.js.map +1 -1
  63. package/dist/index324.js +17 -32
  64. package/dist/index324.js.map +1 -1
  65. package/dist/index325.js +34 -5
  66. package/dist/index325.js.map +1 -1
  67. package/dist/index326.js +5 -9
  68. package/dist/index326.js.map +1 -1
  69. package/dist/index327.js +8 -7
  70. package/dist/index327.js.map +1 -1
  71. package/dist/index328.js +8 -9
  72. package/dist/index328.js.map +1 -1
  73. package/dist/index329.js +9 -10
  74. package/dist/index329.js.map +1 -1
  75. package/dist/index330.js +10 -7
  76. package/dist/index330.js.map +1 -1
  77. package/dist/index331.js +7 -75
  78. package/dist/index331.js.map +1 -1
  79. package/dist/index332.js +66 -153
  80. package/dist/index332.js.map +1 -1
  81. package/dist/index333.js +147 -99
  82. package/dist/index333.js.map +1 -1
  83. package/dist/index334.js +113 -13
  84. package/dist/index334.js.map +1 -1
  85. package/dist/index335.js +12 -78
  86. package/dist/index335.js.map +1 -1
  87. package/dist/index336.js +57 -23
  88. package/dist/index336.js.map +1 -1
  89. package/dist/index337.js +45 -12
  90. package/dist/index337.js.map +1 -1
  91. package/dist/index338.js +13 -16
  92. package/dist/index338.js.map +1 -1
  93. package/dist/index339.js +15 -100
  94. package/dist/index339.js.map +1 -1
  95. package/dist/index340.js +95 -50
  96. package/dist/index340.js.map +1 -1
  97. package/dist/index341.js +5 -57
  98. package/dist/index341.js.map +1 -1
  99. package/dist/index342.js +78 -41
  100. package/dist/index342.js.map +1 -1
  101. package/dist/index343.js +58 -100
  102. package/dist/index343.js.map +1 -1
  103. package/dist/index344.js +104 -46
  104. package/dist/index344.js.map +1 -1
  105. package/dist/index345.js +51 -39
  106. package/dist/index345.js.map +1 -1
  107. package/dist/index346.js +42 -142
  108. package/dist/index346.js.map +1 -1
  109. package/dist/index347.js +123 -120
  110. package/dist/index347.js.map +1 -1
  111. package/dist/index348.js +108 -224
  112. package/dist/index348.js.map +1 -1
  113. package/dist/index349.js +174 -158
  114. package/dist/index349.js.map +1 -1
  115. package/dist/index350.js +144 -213
  116. package/dist/index350.js.map +1 -1
  117. package/dist/index351.js +309 -5
  118. package/dist/index351.js.map +1 -1
  119. package/dist/index352.js +5 -6
  120. package/dist/index352.js.map +1 -1
  121. package/dist/index353.js +6 -7
  122. package/dist/index353.js.map +1 -1
  123. package/dist/index354.js +5 -4
  124. package/dist/index354.js.map +1 -1
  125. package/dist/index355.js +4 -4
  126. package/dist/index355.js.map +1 -1
  127. package/dist/index356.js +6 -21
  128. package/dist/index356.js.map +1 -1
  129. package/dist/index357.js +21 -10
  130. package/dist/index357.js.map +1 -1
  131. package/dist/index358.js +10 -128
  132. package/dist/index358.js.map +1 -1
  133. package/dist/index359.js +122 -36
  134. package/dist/index359.js.map +1 -1
  135. package/dist/index360.js +38 -64
  136. package/dist/index360.js.map +1 -1
  137. package/dist/index361.js +66 -115
  138. package/dist/index361.js.map +1 -1
  139. package/dist/index362.js +112 -485
  140. package/dist/index362.js.map +1 -1
  141. package/dist/index363.js +490 -13
  142. package/dist/index363.js.map +1 -1
  143. package/dist/index364.js +13 -4
  144. package/dist/index364.js.map +1 -1
  145. package/dist/index365.js +4 -47
  146. package/dist/index365.js.map +1 -1
  147. package/dist/index366.js +44 -15
  148. package/dist/index366.js.map +1 -1
  149. package/dist/index367.js +19 -5
  150. package/dist/index367.js.map +1 -1
  151. package/dist/index368.js +5 -27
  152. package/dist/index368.js.map +1 -1
  153. package/dist/index369.js +27 -48
  154. package/dist/index369.js.map +1 -1
  155. package/dist/index370.js +46 -27
  156. package/dist/index370.js.map +1 -1
  157. package/dist/index371.js +27 -16
  158. package/dist/index371.js.map +1 -1
  159. package/dist/index372.js +16 -41
  160. package/dist/index372.js.map +1 -1
  161. package/dist/index373.js +42 -14
  162. package/dist/index373.js.map +1 -1
  163. package/dist/index374.js +14 -10
  164. package/dist/index374.js.map +1 -1
  165. package/dist/index375.js +9 -51
  166. package/dist/index375.js.map +1 -1
  167. package/dist/index376.js +53 -43
  168. package/dist/index376.js.map +1 -1
  169. package/dist/index377.js +43 -16
  170. package/dist/index377.js.map +1 -1
  171. package/dist/index378.js +15 -4
  172. package/dist/index378.js.map +1 -1
  173. package/dist/index379.js +4 -4
  174. package/dist/index379.js.map +1 -1
  175. package/dist/index380.js +4 -9
  176. package/dist/index380.js.map +1 -1
  177. package/dist/index381.js +9 -340
  178. package/dist/index381.js.map +1 -1
  179. package/dist/index382.js +339 -4
  180. package/dist/index382.js.map +1 -1
  181. package/dist/index383.js +5 -16
  182. package/dist/index383.js.map +1 -1
  183. package/dist/index384.js +16 -111
  184. package/dist/index384.js.map +1 -1
  185. package/dist/index385.js +109 -19
  186. package/dist/index385.js.map +1 -1
  187. package/dist/index386.js +18 -18
  188. package/dist/index386.js.map +1 -1
  189. package/dist/index387.js +21 -5
  190. package/dist/index387.js.map +1 -1
  191. package/dist/index388.js +5 -20
  192. package/dist/index388.js.map +1 -1
  193. package/dist/index389.js +19 -13
  194. package/dist/index389.js.map +1 -1
  195. package/dist/index390.js +13 -84
  196. package/dist/index390.js.map +1 -1
  197. package/dist/index391.js +84 -7
  198. package/dist/index391.js.map +1 -1
  199. package/dist/index392.js +9 -29
  200. package/dist/index392.js.map +1 -1
  201. package/dist/index393.js +28 -9
  202. package/dist/index393.js.map +1 -1
  203. package/dist/index394.js +9 -5
  204. package/dist/index394.js.map +1 -1
  205. package/dist/index395.js +6 -252
  206. package/dist/index395.js.map +1 -1
  207. package/dist/index396.js +250 -10
  208. package/dist/index396.js.map +1 -1
  209. package/dist/index397.js +11 -10
  210. package/dist/index397.js.map +1 -1
  211. package/dist/index398.js +10 -6
  212. package/dist/index398.js.map +1 -1
  213. package/dist/index399.js +6 -22
  214. package/dist/index399.js.map +1 -1
  215. package/dist/index400.js +21 -21
  216. package/dist/index400.js.map +1 -1
  217. package/dist/index401.js +21 -107
  218. package/dist/index401.js.map +1 -1
  219. package/dist/index402.js +109 -15
  220. package/dist/index402.js.map +1 -1
  221. package/dist/index403.js +15 -12
  222. package/dist/index403.js.map +1 -1
  223. package/dist/index404.js +10 -8
  224. package/dist/index404.js.map +1 -1
  225. package/dist/index405.js +8 -242
  226. package/dist/index405.js.map +1 -1
  227. package/dist/index406.js +238 -25
  228. package/dist/index406.js.map +1 -1
  229. package/dist/index407.js +29 -51
  230. package/dist/index407.js.map +1 -1
  231. package/dist/index408.js +51 -10
  232. package/dist/index408.js.map +1 -1
  233. package/dist/index409.js +11 -128
  234. package/dist/index409.js.map +1 -1
  235. package/dist/index410.js +124 -35
  236. package/dist/index410.js.map +1 -1
  237. package/dist/index411.js +36 -23
  238. package/dist/index411.js.map +1 -1
  239. package/dist/index412.js +26 -11
  240. package/dist/index412.js.map +1 -1
  241. package/dist/index413.js +11 -23
  242. package/dist/index413.js.map +1 -1
  243. package/dist/index414.js +19 -13
  244. package/dist/index414.js.map +1 -1
  245. package/dist/index415.js +14 -13
  246. package/dist/index415.js.map +1 -1
  247. package/dist/index416.js +14 -322
  248. package/dist/index416.js.map +1 -1
  249. package/dist/index417.js +323 -61
  250. package/dist/index417.js.map +1 -1
  251. package/dist/index418.js +63 -4
  252. package/dist/index418.js.map +1 -1
  253. package/dist/index419.js +4 -28
  254. package/dist/index419.js.map +1 -1
  255. package/dist/index420.js +25 -468
  256. package/dist/index420.js.map +1 -1
  257. package/dist/index421.js +452 -250
  258. package/dist/index421.js.map +1 -1
  259. package/dist/index422.js +272 -0
  260. package/dist/index422.js.map +1 -0
  261. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index298.js","names":["useEffect","useMemo","useRef","useState","ReactNode","createPortal","DragEndEvent","DragStartEvent","DropAnimation","DndContext","DragOverlay","KeyboardSensor","PointerSensor","closestCenter","defaultDropAnimationSideEffects","useSensor","useSensors","SortableContext","arrayMove","rectSortingStrategy","sortableKeyboardCoordinates","useSortable","CSS","Loader2","Maximize2","Plus","X","cn","Image","FilesUploadFieldFile","id","url","alt","uploadKey","FileUploadsInitResponse","ok","error","uploadId","chunkSize","chunksTotal","FileUploadsStatusResponse","status","received","fileId","FileUploadsCompleteResponse","sha256Hex","data","ArrayBuffer","Promise","crypto","subtle","digest","bytes","Array","from","Uint8Array","map","b","toString","padStart","join","postJson","body","options","headers","Record","signal","AbortSignal","T","response","fetch","method","credentials","JSON","stringify","payload","json","catch","getJson","putOctetStream","sha256","defaultUpload","UploadHandler","file","onProgress","initRes","filename","name","mimeType","type","isPublic","totalSize","size","Error","String","Number","doUploadChunk","index","start","end","Math","min","slice","arrayBuffer","sha","res","encodeURIComponent","undefined","uploadChunks","indices","alreadyUploaded","uploaded","idx","pct","floor","allIndices","length","_","i","complete","completeRes","code","statusRes","isArray","present","Set","missing","has","push","SortableTile","t0","$","_c","item","isHovered","enableImagePreview","renderItem","onHoverEnter","onHoverLeave","onRemove","onRetry","startFullscreen","isUploading","isError","tileClasses","disabled","isDraggingExternal","removeButtonAriaLabel","t1","setNodeRef","attributes","listeners","transform","transition","isDragging","tileRef","previewRef","previewPosition","setPreviewPosition","t2","Symbol","for","el","current","rect","getBoundingClientRect","left","width","top","updatePreviewPosition","t3","t4","raf","schedule","cancelAnimationFrame","requestAnimationFrame","window","addEventListener","removeEventListener","t5","Transform","t6","style","t7","fileName","previewUrl","progress","tileContent","t8","node","t9","t10","t11","t12","t13","t14","t15","t16","event","next","relatedTarget","Node","contains","t17","t18","t19","t20","preview","event_0","next_0","document","t21","t22","errorMessage","getErrorLabel","t23","UploadResult","File","FilesUploadFieldRenderItemProps","FilesUploadFieldProps","initialFiles","onChange","files","upload","uploadIsPublic","onUploadingChange","accept","renderHeader","props","addButtonAriaLabel","variant","FileWithState","toPreview","URL","createObjectURL","getErrorMessage","message","startsWith","IMAGE_FILE_NAME_RE","DROP_ANIMATION_FALLBACK_MS","hideDraggedTileDropSideEffects","styles","active","opacity","isImageItem","test","FilesUploadField","fileInputRef","HTMLInputElement","images","setImages","dragActive","setDragActive","fullscreenIndex","setFullscreenIndex","hoveredId","setHoveredId","activeId","setActiveId","dropAnimatingId","setDropAnimatingId","hoverTimeoutRef","dropAnimationFallbackRef","timeout","hasDragOverlayRef","clearDropAnimationRef","dropAnimationRef","sideEffects","args","fallback","clearTimeout","cleanup","skipNotifyRef","imagesRef","lastInitialImagesRef","onChangeRef","onUploadingChangeRef","replacedIdRef","Map","fileRef","abortRef","AbortController","objectUrlRef","sensors","activationConstraint","distance","coordinateGetter","controller","values","abort","clear","revokeObjectURL","cursor","previous","samePropValue","every","img","prepared","preparedRawIds","tempId","finalId","entries","delete","currentIds","hasStaleInitialImages","some","mapped","get","preparedIds","tempUrl","sameLength","sameContent","handleKey","KeyboardEvent","key","handleFiles","FileList","list","uploads","randomUUID","set","updateProgress","value","nextValue","max","finalize","result","aborted","console","allSettled","onFileInputChange","React","ChangeEvent","target","openFileDialog","click","removeImage","filter","retryUpload","existingController","findIndex","clearPendingDropAnimation","scheduleDropAnimationFallback","setTimeout","finishDrag","handleDragStart","handleDragEnd","over","overId","oldIndex","newIndex","handleDragCancel","clearHoverTimeout","fullscreenImage","containerClasses","tileBaseClasses","acceptAttr","tokens","split","trim","Boolean","token","canPreviewItem","toRenderItemProps","dragOverlayContent","activeItem","find","rendered","hasDragOverlay","hiddenDraggedTileId","preventDefault","dataTransfer","overlay"],"sources":["../src/components/FilesUploadField/index.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport type { DragEndEvent, DragStartEvent, DropAnimation } from \"@dnd-kit/core\"\nimport {\n DndContext,\n DragOverlay,\n KeyboardSensor,\n PointerSensor,\n closestCenter,\n defaultDropAnimationSideEffects,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\"\nimport {\n SortableContext,\n arrayMove,\n rectSortingStrategy,\n sortableKeyboardCoordinates,\n useSortable,\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport { Loader2, Maximize2, Plus, X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport { Image } from \"../Image\"\n\n\nexport type FilesUploadFieldFile = {\n id: string\n url: string\n alt?: string\n uploadKey?: string\n}\n\ntype FileUploadsInitResponse = {\n ok: boolean\n error?: string\n uploadId?: string\n uploadKey?: string\n chunkSize?: number\n chunksTotal?: number\n}\n\ntype FileUploadsStatusResponse = {\n ok: boolean\n error?: string\n status?: \"uploading\" | \"assembling\" | \"done\" | \"error\"\n chunkSize?: number\n chunksTotal?: number\n received?: number[]\n fileId?: string\n}\n\ntype FileUploadsCompleteResponse = {\n ok: boolean\n error?: string\n fileId?: string\n}\n\nconst sha256Hex = async (data: ArrayBuffer): Promise<string | null> => {\n if (typeof crypto === \"undefined\" || typeof crypto.subtle === \"undefined\") return null\n try {\n const digest = await crypto.subtle.digest(\"SHA-256\", data)\n const bytes = Array.from(new Uint8Array(digest))\n return bytes.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\")\n } catch {\n return null\n }\n}\n\nconst postJson = async <T,>(\n url: string,\n body: unknown,\n options?: { headers?: Record<string, string>; signal?: AbortSignal },\n): Promise<{ ok: boolean; status: number; data: T }> => {\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...(options?.headers ?? {}) },\n credentials: \"include\",\n body: JSON.stringify(body),\n signal: options?.signal,\n })\n\n const payload = await response.json().catch(() => ({}))\n return { ok: response.ok, status: response.status, data: payload as T }\n}\n\nconst getJson = async <T,>(\n url: string,\n options?: { headers?: Record<string, string>; signal?: AbortSignal },\n): Promise<{ ok: boolean; status: number; data: T }> => {\n const response = await fetch(url, {\n credentials: \"include\",\n headers: options?.headers,\n signal: options?.signal,\n })\n const payload = await response.json().catch(() => ({}))\n return { ok: response.ok, status: response.status, data: payload as T }\n}\n\nconst putOctetStream = async ({\n url,\n body,\n sha256,\n uploadKey,\n signal,\n}: {\n url: string\n body: ArrayBuffer\n sha256?: string\n uploadKey?: string\n signal?: AbortSignal\n}): Promise<{ ok: boolean; status: number }> => {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/octet-stream\",\n }\n if (sha256) headers[\"X-Chunk-SHA256\"] = sha256\n if (uploadKey) headers[\"X-Upload-Key\"] = uploadKey\n\n const response = await fetch(url, {\n method: \"PUT\",\n credentials: \"include\",\n headers,\n body,\n signal,\n })\n\n return { ok: response.ok, status: response.status }\n}\n\nconst defaultUpload: UploadHandler = async (file, onProgress, options) => {\n const initRes = await postJson<FileUploadsInitResponse>(\n \"/api/rb/file-uploads\",\n {\n filename: file.name,\n mimeType: file.type || \"application/octet-stream\",\n ...(typeof options?.isPublic === \"boolean\" ? { isPublic: options.isPublic } : {}),\n totalSize: file.size,\n },\n { signal: options?.signal },\n )\n\n if (!initRes.ok || !(initRes.data as any)?.ok) {\n throw new Error((initRes.data as any)?.error ?? `Init failed (${initRes.status})`)\n }\n\n const uploadId = String((initRes.data as any)?.uploadId ?? \"\")\n const uploadKey = typeof (initRes.data as any)?.uploadKey === \"string\" ? String((initRes.data as any).uploadKey) : null\n const chunkSize = Number((initRes.data as any)?.chunkSize ?? 0)\n const chunksTotal = Number((initRes.data as any)?.chunksTotal ?? 0)\n\n if (!uploadId || !chunkSize || !chunksTotal) {\n throw new Error(\"Upload init missing required fields\")\n }\n\n const doUploadChunk = async (index: number) => {\n const start = index * chunkSize\n const end = Math.min(file.size, start + chunkSize)\n const slice = file.slice(start, end)\n const body = await slice.arrayBuffer()\n const sha = await sha256Hex(body)\n\n const res = await putOctetStream({\n url: `/api/rb/file-uploads/${encodeURIComponent(uploadId)}/chunks/${index}`,\n body,\n sha256: sha ?? undefined,\n uploadKey: uploadKey ?? undefined,\n signal: options?.signal,\n })\n\n if (res.status === 204) return\n throw new Error(`Chunk ${index} failed (${res.status})`)\n }\n\n const uploadChunks = async (indices: number[], alreadyUploaded = 0) => {\n let uploaded = alreadyUploaded\n\n for (const idx of indices) {\n await doUploadChunk(idx)\n uploaded += 1\n const pct = Math.min(99, Math.floor((uploaded / chunksTotal) * 99))\n onProgress(pct)\n }\n }\n\n const allIndices = Array.from({ length: chunksTotal }, (_, i) => i)\n await uploadChunks(allIndices, 0)\n\n const complete = async (): Promise<string> => {\n const completeRes = await postJson<FileUploadsCompleteResponse>(\n `/api/rb/file-uploads/${encodeURIComponent(uploadId)}/complete`,\n {},\n { headers: uploadKey ? { \"X-Upload-Key\": uploadKey } : undefined, signal: options?.signal },\n )\n\n if (completeRes.ok && (completeRes.data as any)?.ok) {\n const fileId = String((completeRes.data as any)?.fileId ?? \"\")\n if (!fileId) throw new Error(\"Upload completed without fileId\")\n return fileId\n }\n\n const code = String((completeRes.data as any)?.error ?? \"\")\n if (completeRes.status !== 409 || code !== \"missing_chunks\") {\n throw new Error(code || `Complete failed (${completeRes.status})`)\n }\n\n const statusRes = await getJson<FileUploadsStatusResponse>(\n `/api/rb/file-uploads/${encodeURIComponent(uploadId)}/status`,\n { headers: uploadKey ? { \"X-Upload-Key\": uploadKey } : undefined, signal: options?.signal },\n )\n\n if (!statusRes.ok || !(statusRes.data as any)?.ok) {\n throw new Error((statusRes.data as any)?.error ?? `Status failed (${statusRes.status})`)\n }\n\n const received = Array.isArray((statusRes.data as any)?.received) ? (statusRes.data as any).received : []\n const present = new Set<number>(received)\n const missing: number[] = []\n for (let i = 0; i < chunksTotal; i += 1) {\n if (!present.has(i)) missing.push(i)\n }\n\n if (!missing.length) {\n throw new Error(\"missing_chunks\")\n }\n\n await uploadChunks(missing, present.size)\n return complete()\n }\n\n const fileId = await complete()\n\n onProgress(100)\n return {\n id: fileId,\n url: `/api/rb/files/${encodeURIComponent(fileId)}`,\n alt: file.name,\n ...(uploadKey ? { uploadKey } : {}),\n }\n}\n\nfunction SortableTile({\n item,\n isHovered,\n enableImagePreview,\n renderItem,\n onHoverEnter,\n onHoverLeave,\n onRemove,\n onRetry,\n startFullscreen,\n isUploading,\n isError,\n tileClasses,\n disabled,\n isDraggingExternal,\n removeButtonAriaLabel,\n}: {\n item: FileWithState\n isHovered: boolean\n enableImagePreview: boolean\n renderItem?: (props: FilesUploadFieldRenderItemProps) => ReactNode\n onHoverEnter: () => void\n onHoverLeave: () => void\n onRemove: (id: string) => void\n onRetry: (id: string) => void\n startFullscreen: (id: string) => void\n isUploading: boolean\n isError: boolean\n tileClasses: string\n disabled: boolean\n isDraggingExternal: boolean\n removeButtonAriaLabel: string\n}) {\n const { setNodeRef, attributes, listeners, transform, transition, isDragging } = useSortable({\n id: item.id,\n disabled,\n })\n\n const tileRef = useRef<HTMLDivElement | null>(null)\n const previewRef = useRef<HTMLDivElement | null>(null)\n const [previewPosition, setPreviewPosition] = useState<{ left: number; top: number } | null>(null)\n\n const updatePreviewPosition = () => {\n const el = tileRef.current\n if (!el) return\n const rect = el.getBoundingClientRect()\n setPreviewPosition({ left: rect.left + rect.width / 2, top: rect.top - 10 })\n }\n\n useEffect(() => {\n if (!enableImagePreview || !isHovered) {\n setPreviewPosition(null)\n return\n }\n\n updatePreviewPosition()\n\n let raf = 0\n const schedule = () => {\n if (raf) cancelAnimationFrame(raf)\n raf = requestAnimationFrame(() => {\n raf = 0\n updatePreviewPosition()\n })\n }\n\n window.addEventListener(\"resize\", schedule)\n window.addEventListener(\"scroll\", schedule, true)\n return () => {\n if (raf) cancelAnimationFrame(raf)\n window.removeEventListener(\"resize\", schedule)\n window.removeEventListener(\"scroll\", schedule, true)\n }\n }, [enableImagePreview, isHovered])\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n }\n\n const tileContent = renderItem\n ? renderItem({\n file: { id: item.id, url: item.url, alt: item.alt, uploadKey: item.uploadKey },\n previewUrl: item.previewUrl,\n status: item.status,\n progress: item.progress,\n fileName: item.fileName,\n })\n : enableImagePreview\n ? (\n <Image\n src={item.previewUrl}\n alt={item.alt ?? \"Uploaded file\"}\n sizes=\"96px\"\n className={cn(\n \"size-full rounded-md object-cover\",\n isUploading && \"opacity-75\",\n isError && \"grayscale\"\n )}\n />\n )\n : (\n <div className=\"flex size-full items-center justify-center rounded-md bg-slate-100 px-2 text-center text-[10px] font-medium text-slate-700 dark:bg-slate-800 dark:text-slate-200\">\n <span className=\"w-full truncate\">{item.fileName ?? item.alt ?? \"Fichier\"}</span>\n </div>\n )\n\n return (\n <div\n ref={(node) => {\n tileRef.current = node\n setNodeRef(node)\n }}\n style={style}\n className={cn(\n tileClasses,\n isDragging && \"z-20 ring-2 ring-primary shadow-xl\",\n isDraggingExternal && \"opacity-0\",\n !disabled && \"cursor-grab active:cursor-grabbing\",\n isDragging && \"cursor-grabbing\",\n disabled && \"cursor-default\"\n )}\n onMouseEnter={() => {\n updatePreviewPosition()\n onHoverEnter()\n }}\n onMouseLeave={(event) => {\n const next = event.relatedTarget\n if (next instanceof Node && previewRef.current?.contains(next)) return\n onHoverLeave()\n }}\n {...attributes}\n {...listeners}\n >\n {tileContent}\n\n <button\n type=\"button\"\n onClick={() => {\n if (disabled) return\n onRemove(item.id)\n }}\n disabled={disabled}\n className=\"absolute right-1 top-1 inline-flex size-6 items-center justify-center rounded-full bg-white text-slate-700 shadow-sm transition hover:scale-105 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary dark:bg-slate-900 dark:text-slate-200\"\n aria-label={removeButtonAriaLabel}\n >\n <X className=\"h-4 w-4\" />\n </button>\n\n {enableImagePreview &&\n isHovered &&\n previewPosition &&\n (() => {\n const preview = (\n <>\n <div\n ref={previewRef}\n className=\"pointer-events-auto fixed z-[60] w-52 -translate-x-1/2 -translate-y-full rounded-xl border border-slate-200 bg-white/95 p-3 shadow-2xl backdrop-blur dark:border-slate-700 dark:bg-slate-900/95\"\n style={{ left: previewPosition.left, top: previewPosition.top }}\n onMouseEnter={() => {\n updatePreviewPosition()\n onHoverEnter()\n }}\n onMouseLeave={(event) => {\n const next = event.relatedTarget\n if (next instanceof Node && tileRef.current?.contains(next)) return\n onHoverLeave()\n }}\n >\n <div className=\"relative overflow-hidden rounded-lg\">\n <Image src={item.url} alt={item.alt ?? \"Preview\"} sizes=\"208px\" className=\"h-40 w-full object-cover\" />\n <button\n type=\"button\"\n onClick={() => startFullscreen(item.id)}\n className=\"absolute right-2 top-2 inline-flex items-center justify-center rounded-full bg-black/70 p-2 text-white transition hover:bg-black\"\n aria-label=\"Plein écran\"\n >\n <Maximize2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n </>\n )\n\n if (typeof document === \"undefined\") return preview\n return createPortal(preview, document.body)\n })()}\n\n {isUploading && (\n <div className=\"absolute inset-0 z-20 flex flex-col items-center justify-center gap-2 rounded-lg bg-black/40 text-white\">\n <Loader2 className=\"h-5 w-5 animate-spin\" />\n <div className=\"h-1.5 w-5/6 rounded-full bg-white/20\">\n <div className=\"h-full rounded-full bg-primary\" style={{ width: `${item.progress}%` }} />\n </div>\n <div className=\"text-xs font-semibold\">{item.progress}%</div>\n </div>\n )}\n\n {isError && (\n <div className=\"absolute inset-0 z-10 flex flex-col items-center justify-center gap-2 rounded-lg bg-red-600/70 text-white\">\n <div className=\"max-w-[92%] break-words text-center text-[10px] font-semibold leading-tight\" title={item.errorMessage}>\n {getErrorLabel(item.errorMessage)}\n </div>\n <button\n type=\"button\"\n onClick={() => onRetry(item.id)}\n disabled={disabled}\n className=\"rounded-full bg-white/90 px-3 py-1 text-xs font-semibold text-red-700 shadow-sm transition hover:bg-white focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white\"\n >\n Réessayer\n </button>\n </div>\n )}\n </div>\n )\n}\n\ntype UploadResult = FilesUploadFieldFile | Promise<FilesUploadFieldFile>\n\ntype UploadHandler = (\n file: File,\n onProgress: (progress: number) => void,\n options?: { signal?: AbortSignal; isPublic?: boolean },\n) => UploadResult\n\nexport type FilesUploadFieldRenderItemProps = {\n file: FilesUploadFieldFile\n previewUrl: string\n status: \"uploaded\" | \"uploading\" | \"error\"\n progress: number\n fileName?: string\n}\n\nexport type FilesUploadFieldProps = {\n initialFiles?: FilesUploadFieldFile[]\n onChange?: (files: FilesUploadFieldFile[]) => void\n upload?: UploadHandler\n uploadIsPublic?: boolean\n disabled?: boolean\n onUploadingChange?: (isUploading: boolean) => void\n accept?: string | string[]\n renderHeader?: () => ReactNode\n renderItem?: (props: FilesUploadFieldRenderItemProps) => ReactNode\n addButtonAriaLabel?: string\n removeButtonAriaLabel?: string\n variant?: \"card\" | \"bare\"\n}\n\ntype FileWithState = FilesUploadFieldFile & {\n previewUrl: string\n status: \"uploaded\" | \"uploading\" | \"error\"\n progress: number\n fileName?: string\n mimeType?: string\n errorMessage?: string\n}\n\nfunction toPreview(file: File) {\n return URL.createObjectURL(file)\n}\n\nconst getErrorMessage = (error: unknown): string => {\n if (error instanceof Error) return error.message\n if (typeof error === \"string\") return error\n return \"Upload failed\"\n}\n\nconst getErrorLabel = (message: string | undefined): string => {\n if (!message) return \"Échec\"\n if (message.startsWith(\"heif_decode_unsupported\")) return \"HEIC/HEVC non supporté\"\n return message\n}\n\nconst IMAGE_FILE_NAME_RE = /\\.(png|jpe?g|gif|webp|avif|heic|heif|svg|bmp)$/i\nconst DROP_ANIMATION_FALLBACK_MS = 350\n\nconst hideDraggedTileDropSideEffects = defaultDropAnimationSideEffects({\n styles: {\n active: {\n opacity: \"0\",\n },\n },\n})\n\nconst isImageItem = (item: FileWithState): boolean => {\n if (item.mimeType) return item.mimeType.startsWith(\"image/\")\n return IMAGE_FILE_NAME_RE.test(item.fileName ?? item.alt ?? \"\")\n}\n\nexport function FilesUploadField({\n initialFiles = [],\n onChange,\n upload = defaultUpload,\n uploadIsPublic = false,\n disabled = false,\n onUploadingChange,\n accept,\n renderHeader,\n renderItem,\n addButtonAriaLabel = \"Ajouter un fichier\",\n removeButtonAriaLabel = \"Supprimer le fichier\",\n variant = \"card\",\n}: FilesUploadFieldProps) {\n const fileInputRef = useRef<HTMLInputElement>(null)\n const [images, setImages] = useState<FileWithState[]>(() =>\n initialFiles.map((file) => ({ ...file, previewUrl: file.url, status: \"uploaded\", progress: 100 }))\n )\n const [dragActive, setDragActive] = useState(false)\n const [fullscreenIndex, setFullscreenIndex] = useState<number | null>(null)\n const [hoveredId, setHoveredId] = useState<string | null>(null)\n const [activeId, setActiveId] = useState<string | null>(null)\n const [dropAnimatingId, setDropAnimatingId] = useState<string | null>(null)\n const hoverTimeoutRef = useRef<number | null>(null)\n const dropAnimationFallbackRef = useRef<{ id: string; timeout: number } | null>(null)\n const hasDragOverlayRef = useRef(false)\n const clearDropAnimationRef = useRef<(id: string) => void>(() => {})\n const dropAnimationRef = useRef<DropAnimation>({\n sideEffects(args) {\n const id = String(args.active.id)\n const fallback = dropAnimationFallbackRef.current\n if (fallback?.id === id) {\n window.clearTimeout(fallback.timeout)\n dropAnimationFallbackRef.current = null\n }\n\n const cleanup = hideDraggedTileDropSideEffects(args)\n\n return () => {\n cleanup?.()\n clearDropAnimationRef.current(id)\n }\n },\n })\n const skipNotifyRef = useRef(true)\n const imagesRef = useRef<FileWithState[]>([])\n const lastInitialImagesRef = useRef<FilesUploadFieldFile[]>(initialFiles)\n const onChangeRef = useRef(onChange)\n const onUploadingChangeRef = useRef(onUploadingChange)\n const replacedIdRef = useRef<Map<string, string>>(new Map())\n const fileRef = useRef<Map<string, File>>(new Map())\n const abortRef = useRef<Map<string, AbortController>>(new Map())\n const objectUrlRef = useRef<Map<string, string>>(new Map())\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })\n )\n\n useEffect(() => {\n return () => {\n for (const controller of abortRef.current.values()) {\n try {\n controller.abort()\n } catch {\n //\n }\n }\n abortRef.current.clear()\n if (dropAnimationFallbackRef.current !== null) {\n window.clearTimeout(dropAnimationFallbackRef.current.timeout)\n dropAnimationFallbackRef.current = null\n }\n fileRef.current.clear()\n replacedIdRef.current.clear()\n\n for (const url of objectUrlRef.current.values()) {\n if (typeof URL !== \"undefined\") {\n try {\n URL.revokeObjectURL(url)\n } catch {\n //\n }\n }\n }\n objectUrlRef.current.clear()\n }\n }, [])\n\n clearDropAnimationRef.current = (id: string) => {\n const fallback = dropAnimationFallbackRef.current\n if (fallback?.id === id) {\n window.clearTimeout(fallback.timeout)\n dropAnimationFallbackRef.current = null\n }\n\n setDropAnimatingId((current) => (current === id ? null : current))\n }\n\n useEffect(() => {\n if (typeof document === \"undefined\") return\n if (activeId) {\n document.body.style.cursor = \"grabbing\"\n return () => {\n document.body.style.cursor = \"\"\n }\n }\n document.body.style.cursor = \"\"\n }, [activeId])\n\n useEffect(() => {\n imagesRef.current = images\n }, [images])\n\n useEffect(() => {\n onChangeRef.current = onChange\n }, [onChange])\n\n useEffect(() => {\n onUploadingChangeRef.current = onUploadingChange\n }, [onUploadingChange])\n\n useEffect(() => {\n const previous = lastInitialImagesRef.current\n const samePropValue =\n previous.length === initialFiles.length &&\n previous.every((img, index) => {\n const next = initialFiles[index]\n return next && img.id === next.id && img.url === next.url && img.alt === next.alt\n })\n\n if (samePropValue) return\n lastInitialImagesRef.current = initialFiles\n\n const prepared: FileWithState[] = initialFiles.map((img) => ({\n ...img,\n previewUrl: img.url,\n status: \"uploaded\",\n progress: 100,\n }))\n\n const preparedRawIds = new Set(prepared.map((img) => img.id))\n for (const [tempId, finalId] of replacedIdRef.current.entries()) {\n if (preparedRawIds.has(finalId)) {\n replacedIdRef.current.delete(tempId)\n }\n }\n\n const currentIds = new Set(imagesRef.current.map((img) => img.id))\n const hasStaleInitialImages = prepared.some((img) => {\n const mapped = replacedIdRef.current.get(img.id)\n return mapped ? currentIds.has(mapped) : false\n })\n if (hasStaleInitialImages) return\n\n const preparedIds = new Set(prepared.map((img) => img.id))\n for (const img of imagesRef.current) {\n if (preparedIds.has(img.id)) continue\n\n const controller = abortRef.current.get(img.id)\n if (controller) {\n abortRef.current.delete(img.id)\n try {\n controller.abort()\n } catch {\n //\n }\n }\n\n fileRef.current.delete(img.id)\n\n const tempUrl = objectUrlRef.current.get(img.id)\n if (tempUrl) {\n objectUrlRef.current.delete(img.id)\n try {\n URL.revokeObjectURL(tempUrl)\n } catch {\n //\n }\n }\n }\n\n setImages((current) => {\n const sameLength = current.length === prepared.length\n const sameContent =\n sameLength &&\n current.every((item, index) => {\n const next = prepared[index]\n return next && item.id === next.id && item.url === next.url && item.alt === next.alt && item.uploadKey === next.uploadKey\n })\n\n if (sameContent) return current\n\n skipNotifyRef.current = true\n return prepared\n })\n }, [initialFiles])\n\n useEffect(() => {\n if (skipNotifyRef.current) {\n skipNotifyRef.current = false\n return\n }\n\n onChangeRef.current?.(images.map(({ id, url, alt, uploadKey }) => ({ id, url, alt, uploadKey })))\n }, [images])\n\n useEffect(() => {\n onUploadingChangeRef.current?.(images.some((img) => img.status === \"uploading\"))\n }, [images])\n\n useEffect(() => {\n if (fullscreenIndex === null) {\n return\n }\n\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setFullscreenIndex(null)\n return\n }\n\n if (event.key === \"ArrowRight\") {\n setFullscreenIndex((current) => {\n if (current === null) return current\n return (current + 1) % images.length\n })\n return\n }\n\n if (event.key === \"ArrowLeft\") {\n setFullscreenIndex((current) => {\n if (current === null) return current\n return (current - 1 + images.length) % images.length\n })\n }\n }\n\n window.addEventListener(\"keydown\", handleKey)\n return () => window.removeEventListener(\"keydown\", handleKey)\n }, [fullscreenIndex, images.length])\n\n const handleFiles = async (files: FileList | File[]) => {\n if (disabled) return\n const list = Array.from(files)\n\n const uploads = list.map((file) => {\n const previewUrl = toPreview(file)\n const tempId = crypto.randomUUID()\n\n objectUrlRef.current.set(tempId, previewUrl)\n fileRef.current.set(tempId, file)\n\n const next: FileWithState = {\n id: tempId,\n url: previewUrl,\n previewUrl,\n alt: file.name,\n status: \"uploading\",\n progress: 0,\n fileName: file.name,\n mimeType: file.type,\n }\n\n setImages((current) => [...current, next])\n\n const updateProgress = (value: number) => {\n const nextValue = Math.max(0, Math.min(99, value))\n setImages((current) =>\n current.map((item) =>\n item.id === tempId ? { ...item, progress: nextValue, status: \"uploading\" } : item\n )\n )\n }\n\n const finalize = async () => {\n const controller = new AbortController()\n abortRef.current.set(tempId, controller)\n\n try {\n const result = await upload(file, updateProgress, { signal: controller.signal, isPublic: uploadIsPublic })\n replacedIdRef.current.set(tempId, result.id)\n\n const tempUrl = objectUrlRef.current.get(tempId)\n if (tempUrl) {\n objectUrlRef.current.delete(tempId)\n try {\n URL.revokeObjectURL(tempUrl)\n } catch {\n //\n }\n }\n\n abortRef.current.delete(tempId)\n fileRef.current.delete(tempId)\n\n setImages((current) =>\n current.map((item) =>\n item.id === tempId\n ? {\n ...item,\n ...result,\n previewUrl: result.url,\n url: result.url,\n status: \"uploaded\",\n progress: 100,\n errorMessage: undefined,\n }\n : item\n )\n )\n } catch (error) {\n abortRef.current.delete(tempId)\n if (controller.signal.aborted) {\n fileRef.current.delete(tempId)\n const tempUrl = objectUrlRef.current.get(tempId)\n if (tempUrl) {\n objectUrlRef.current.delete(tempId)\n try {\n URL.revokeObjectURL(tempUrl)\n } catch {\n //\n }\n }\n return\n }\n console.error(\"Upload failed\", error)\n const errorMessage = getErrorMessage(error)\n setImages((current) =>\n current.map((item) =>\n item.id === tempId\n ? { ...item, status: \"error\", progress: Math.max(0, Math.min(99, item.progress)), errorMessage }\n : item\n )\n )\n }\n }\n\n return finalize()\n })\n\n await Promise.allSettled(uploads)\n }\n\n const onFileInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (!event.target.files) return\n void handleFiles(event.target.files)\n event.target.value = \"\"\n }\n\n const openFileDialog = () => {\n if (disabled) return\n fileInputRef.current?.click()\n }\n\n const removeImage = (id: string) => {\n const controller = abortRef.current.get(id)\n if (controller) {\n abortRef.current.delete(id)\n try {\n controller.abort()\n } catch {\n //\n }\n }\n\n fileRef.current.delete(id)\n\n const tempUrl = objectUrlRef.current.get(id)\n if (tempUrl) {\n objectUrlRef.current.delete(id)\n try {\n URL.revokeObjectURL(tempUrl)\n } catch {\n //\n }\n }\n\n setImages((current) => current.filter((item) => item.id !== id))\n }\n\n const retryUpload = (id: string) => {\n if (disabled) return\n const file = fileRef.current.get(id)\n if (!file) return\n\n const existingController = abortRef.current.get(id)\n if (existingController) {\n try {\n existingController.abort()\n } catch {\n //\n }\n abortRef.current.delete(id)\n }\n\n setImages((current) =>\n current.map((item) => (item.id === id ? { ...item, status: \"uploading\", progress: 0, errorMessage: undefined } : item))\n )\n\n const updateProgress = (value: number) => {\n const nextValue = Math.max(0, Math.min(99, value))\n setImages((current) =>\n current.map((item) => (item.id === id ? { ...item, progress: nextValue, status: \"uploading\" } : item))\n )\n }\n\n const controller = new AbortController()\n abortRef.current.set(id, controller)\n\n void (async () => {\n try {\n const result = await upload(file, updateProgress, { signal: controller.signal, isPublic: uploadIsPublic })\n replacedIdRef.current.set(id, result.id)\n\n const tempUrl = objectUrlRef.current.get(id)\n if (tempUrl) {\n objectUrlRef.current.delete(id)\n try {\n URL.revokeObjectURL(tempUrl)\n } catch {\n //\n }\n }\n\n abortRef.current.delete(id)\n fileRef.current.delete(id)\n\n setImages((current) =>\n current.map((item) =>\n item.id === id\n ? { ...item, ...result, previewUrl: result.url, url: result.url, status: \"uploaded\", progress: 100, errorMessage: undefined }\n : item\n )\n )\n } catch (error) {\n abortRef.current.delete(id)\n if (controller.signal.aborted) return\n console.error(\"Retry failed\", error)\n const errorMessage = getErrorMessage(error)\n setImages((current) => current.map((item) => (item.id === id ? { ...item, status: \"error\", errorMessage } : item)))\n }\n })()\n }\n\n const startFullscreen = (id: string) => {\n const index = images.findIndex((item) => item.id === id)\n if (index !== -1) {\n setFullscreenIndex(index)\n }\n }\n\n const clearPendingDropAnimation = () => {\n if (dropAnimationFallbackRef.current !== null) {\n window.clearTimeout(dropAnimationFallbackRef.current.timeout)\n dropAnimationFallbackRef.current = null\n }\n setDropAnimatingId(null)\n }\n\n const scheduleDropAnimationFallback = (id: string) => {\n if (dropAnimationFallbackRef.current !== null) {\n window.clearTimeout(dropAnimationFallbackRef.current.timeout)\n }\n\n dropAnimationFallbackRef.current = {\n id,\n timeout: window.setTimeout(() => {\n dropAnimationFallbackRef.current = null\n setDropAnimatingId((current) => (current === id ? null : current))\n }, DROP_ANIMATION_FALLBACK_MS),\n }\n }\n\n const finishDrag = (id: string) => {\n if (hasDragOverlayRef.current) {\n setDropAnimatingId(id)\n scheduleDropAnimationFallback(id)\n }\n setActiveId(null)\n }\n\n const handleDragStart = (event: DragStartEvent) => {\n clearPendingDropAnimation()\n setActiveId(String(event.active.id))\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n const activeId = String(active.id)\n\n if (!over) {\n finishDrag(activeId)\n return\n }\n\n const overId = String(over.id)\n\n if (activeId !== overId) {\n setImages((current) => {\n const oldIndex = current.findIndex((item) => item.id === activeId)\n const newIndex = current.findIndex((item) => item.id === overId)\n if (oldIndex === -1 || newIndex === -1) return current\n return arrayMove(current, oldIndex, newIndex)\n })\n }\n\n finishDrag(activeId)\n }\n\n const handleDragCancel = () => {\n if (activeId) {\n finishDrag(activeId)\n return\n }\n\n setActiveId(null)\n }\n\n const clearHoverTimeout = () => {\n if (hoverTimeoutRef.current !== null) {\n window.clearTimeout(hoverTimeoutRef.current)\n hoverTimeoutRef.current = null\n }\n }\n\n const fullscreenImage = useMemo(() => {\n if (fullscreenIndex === null) return null\n return images[fullscreenIndex] ?? null\n }, [fullscreenIndex, images])\n\n const containerClasses = cn(\n variant === \"bare\"\n ? \"rounded-lg transition-colors\"\n : \"rounded-xl border border-dashed border-slate-300 bg-white/70 p-4 shadow-sm transition-colors dark:border-slate-700 dark:bg-slate-900/60\",\n dragActive && (variant === \"bare\" ? \"bg-primary/5 ring-2 ring-primary/50\" : \"border-primary ring-2 ring-primary/50\"),\n disabled && \"opacity-70\"\n )\n\n const tileBaseClasses = \"group relative size-20 overflow-visible rounded-lg border border-slate-200 bg-slate-50 shadow-inner transition hover:shadow md:size-24 dark:border-slate-700 dark:bg-slate-800\"\n\n const acceptAttr = useMemo(() => {\n if (!accept) return undefined\n if (Array.isArray(accept)) return accept.join(\",\")\n return accept\n }, [accept])\n\n const enableImagePreview = useMemo(() => {\n if (renderItem) return false\n if (!acceptAttr) return false\n const tokens = acceptAttr.split(\",\").map((value) => value.trim()).filter(Boolean)\n if (!tokens.length) return false\n return tokens.every((token) =>\n token === \"image/*\" ||\n token.startsWith(\"image/\") ||\n token === \".heic\" ||\n token === \".heif\" ||\n token === \".heics\" ||\n token === \".heifs\"\n )\n }, [acceptAttr, renderItem])\n\n const canPreviewItem = (item: FileWithState) => enableImagePreview || (!renderItem && isImageItem(item))\n\n const toRenderItemProps = (item: FileWithState): FilesUploadFieldRenderItemProps => ({\n file: { id: item.id, url: item.url, alt: item.alt, uploadKey: item.uploadKey },\n previewUrl: item.previewUrl,\n status: item.status,\n progress: item.progress,\n fileName: item.fileName,\n })\n\n const dragOverlayContent = activeId\n ? (() => {\n const activeItem = images.find((item) => item.id === activeId)\n if (!activeItem) return null\n\n if (renderItem) {\n const rendered = renderItem(toRenderItemProps(activeItem))\n if (rendered === null || rendered === undefined || rendered === false) return null\n return (\n <div className=\"pointer-events-none\">\n <div className=\"h-24 w-24 overflow-hidden rounded-lg shadow-2xl\">{rendered}</div>\n </div>\n )\n }\n\n if (!canPreviewItem(activeItem)) return null\n return (\n <div className=\"pointer-events-none\">\n <Image\n src={activeItem.previewUrl}\n alt={activeItem.alt ?? \"Dragged image\"}\n sizes=\"96px\"\n className=\"h-24 w-24 rounded-lg object-cover shadow-2xl\"\n />\n </div>\n )\n })()\n : null\n\n const hasDragOverlay = dragOverlayContent !== null && dragOverlayContent !== undefined\n const hiddenDraggedTileId = hasDragOverlay ? activeId : dropAnimatingId\n hasDragOverlayRef.current = hasDragOverlay\n\n return (\n <div\n onDragOver={(event) => {\n event.preventDefault()\n if (!disabled) {\n setDragActive(true)\n }\n }}\n onDragLeave={() => setDragActive(false)}\n onDrop={(event) => {\n event.preventDefault()\n setDragActive(false)\n if (event.dataTransfer.files?.length) {\n void handleFiles(event.dataTransfer.files)\n }\n }}\n className={containerClasses}\n >\n {renderHeader ? <div className=\"mb-3\">{renderHeader()}</div> : null}\n\n <DndContext\n sensors={disabled ? undefined : sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n <SortableContext items={images.map((item) => item.id)} strategy={rectSortingStrategy}>\n <div className=\"flex flex-wrap gap-3\">\n {images.map((item) => {\n const isUploading = item.status === \"uploading\"\n const isError = item.status === \"error\"\n\n return (\n <SortableTile\n key={item.id}\n item={item}\n isHovered={hoveredId === item.id}\n enableImagePreview={canPreviewItem(item)}\n renderItem={renderItem}\n onHoverEnter={() => {\n clearHoverTimeout()\n setHoveredId(item.id)\n }}\n onHoverLeave={() => {\n clearHoverTimeout()\n hoverTimeoutRef.current = window.setTimeout(() => {\n setHoveredId((current) => (current === item.id ? null : current))\n hoverTimeoutRef.current = null\n }, 120)\n }}\n onRemove={removeImage}\n onRetry={retryUpload}\n startFullscreen={startFullscreen}\n isUploading={isUploading}\n isError={isError}\n tileClasses={tileBaseClasses}\n disabled={disabled}\n isDraggingExternal={hiddenDraggedTileId === item.id}\n removeButtonAriaLabel={removeButtonAriaLabel}\n />\n )\n })}\n\n {variant === \"bare\" && images.length === 0 ? (\n <button\n type=\"button\"\n onClick={openFileDialog}\n disabled={disabled}\n className=\"flex w-full flex-col items-center justify-center gap-1 rounded-lg border border-dashed border-slate-300 px-4 py-6 text-slate-500 transition-colors hover:border-slate-400 hover:bg-slate-50 hover:text-slate-600 dark:border-slate-700 dark:hover:bg-slate-800/50\"\n aria-label={addButtonAriaLabel}\n >\n <Plus className=\"h-5 w-5\" />\n <span className=\"text-xs font-medium\">{addButtonAriaLabel}</span>\n <span className=\"text-[11px] text-slate-400 dark:text-slate-500\">ou glissez-déposez ici</span>\n </button>\n ) : variant === \"bare\" ? (\n <button\n type=\"button\"\n onClick={openFileDialog}\n disabled={disabled}\n className=\"flex size-20 items-center justify-center rounded-lg border border-dashed border-slate-300 text-slate-400 transition-colors hover:border-slate-400 hover:bg-slate-50 hover:text-slate-600 md:size-24 dark:border-slate-700 dark:hover:bg-slate-800/50 dark:hover:text-slate-300\"\n aria-label={addButtonAriaLabel}\n >\n <div className=\"flex flex-col items-center gap-1\">\n <Plus className=\"h-4 w-4\" />\n <span className=\"text-[11px] font-medium\">Ajouter</span>\n </div>\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={openFileDialog}\n disabled={disabled}\n className={cn(\n tileBaseClasses,\n \"flex items-center justify-center border-dashed bg-white text-slate-500 hover:border-slate-300 dark:bg-slate-900\"\n )}\n aria-label={addButtonAriaLabel}\n >\n <div className=\"flex flex-col items-center gap-1\">\n <div className=\"flex size-9 items-center justify-center rounded-full border border-slate-300 bg-slate-100 text-slate-600 shadow-inner dark:border-slate-700 dark:bg-slate-800 dark:text-slate-200\">\n <Plus className=\"h-5 w-5\" />\n </div>\n <span className=\"text-xs font-medium\">Ajouter</span>\n </div>\n </button>\n )}\n </div>\n </SortableContext>\n {(() => {\n const overlay = <DragOverlay dropAnimation={dropAnimationRef.current}>{dragOverlayContent}</DragOverlay>\n\n if (typeof document === \"undefined\") return overlay\n return createPortal(overlay, document.body)\n })()}\n </DndContext>\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={acceptAttr}\n multiple\n className=\"hidden\"\n onChange={onFileInputChange}\n aria-hidden\n />\n\n {fullscreenImage && canPreviewItem(fullscreenImage) && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/90\">\n <button\n type=\"button\"\n className=\"absolute left-6 top-1/2 -translate-y-1/2 rounded-full bg-white/10 p-3 text-white shadow-lg transition hover:bg-white/20 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white\"\n onClick={() =>\n setFullscreenIndex((current) => {\n if (current === null) return current\n return (current - 1 + images.length) % images.length\n })\n }\n aria-label=\"Précédent\"\n >\n <svg viewBox=\"0 0 24 24\" className=\"h-6 w-6\" stroke=\"currentColor\" strokeWidth={2} fill=\"none\">\n <path d=\"M15 18l-6-6 6-6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n <div className=\"relative max-h-[80vh] max-w-4xl\">\n <Image\n src={fullscreenImage.url}\n alt={fullscreenImage.alt ?? \"Fullscreen\"}\n sizes=\"(max-width: 1024px) 100vw, 1024px\"\n className=\"max-h-[80vh] max-w-full rounded-lg object-contain shadow-2xl\"\n />\n <button\n type=\"button\"\n className=\"absolute right-3 top-3 inline-flex size-9 items-center justify-center rounded-full bg-black/70 text-white transition hover:bg-black focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white\"\n onClick={() => setFullscreenIndex(null)}\n aria-label=\"Fermer\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n <button\n type=\"button\"\n className=\"absolute right-6 top-1/2 -translate-y-1/2 rounded-full bg-white/10 p-3 text-white shadow-lg transition hover:bg-white/20 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white\"\n onClick={() =>\n setFullscreenIndex((current) => {\n if (current === null) return current\n return (current + 1) % images.length\n })\n }\n aria-label=\"Suivant\"\n >\n <svg viewBox=\"0 0 24 24\" className=\"h-6 w-6\" stroke=\"currentColor\" strokeWidth={2} fill=\"none\">\n <path d=\"M9 6l6 6-6 6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index298.js","names":[],"sources":[],"mappings":""}