diff --git a/ui/src/views/form/editors/ImageUploadEditorComponent.tsx b/ui/src/views/form/editors/ImageUploadEditorComponent.tsx
index 17da763..424bda8 100644
--- a/ui/src/views/form/editors/ImageUploadEditorComponent.tsx
+++ b/ui/src/views/form/editors/ImageUploadEditorComponent.tsx
@@ -1,6 +1,11 @@
import { ImageUploadOptionsDto } from '@/proxy/form/models'
import { ReactElement, useRef, useState } from 'react'
import { FaSpinner, FaUpload } from 'react-icons/fa'
+import {
+ hideImageHoverPreview,
+ openImageInNewTab,
+ showImageHoverPreview,
+} from './imageHoverPreview'
const ImageUploadEditorComponent = ({
value,
@@ -98,12 +103,17 @@ const ImageUploadEditorComponent = ({
showImageHoverPreview(url, event)}
+ onMouseMove={(event) => showImageHoverPreview(url, event)}
+ onMouseLeave={hideImageHoverPreview}
+ onClick={() => openImageInNewTab(url)}
style={{
width: thumbW,
height: thumbH,
objectFit: 'cover',
borderRadius: 4,
border: '1px solid #ddd',
+ cursor: 'zoom-in',
}}
/>
{!readOnly && (
diff --git a/ui/src/views/form/editors/ImageViewerEditorComponent.tsx b/ui/src/views/form/editors/ImageViewerEditorComponent.tsx
index d321faf..0cc35b3 100644
--- a/ui/src/views/form/editors/ImageViewerEditorComponent.tsx
+++ b/ui/src/views/form/editors/ImageViewerEditorComponent.tsx
@@ -1,5 +1,10 @@
import { ImageUploadOptionsDto } from '@/proxy/form/models'
import { ReactElement } from 'react'
+import {
+ hideImageHoverPreview,
+ openImageInNewTab,
+ showImageHoverPreview,
+} from './imageHoverPreview'
const parseJsonObject = (value: unknown) => {
if (!value) return undefined
@@ -86,26 +91,6 @@ const normalizeImageValue = (value: unknown): string[] => {
return source ? [toImageSource(source)] : []
}
-const openImage = (url: string) => {
- if (!url.startsWith('data:image/')) {
- window.open(url, '_blank', 'noopener,noreferrer')
- return
- }
-
- try {
- const match = url.match(/^data:(image\/[^;]+);base64,(.*)$/)
- if (!match) return
-
- const binary = atob(match[2])
- const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0))
- const blobUrl = URL.createObjectURL(new Blob([bytes], { type: match[1] }))
- window.open(blobUrl, '_blank', 'noopener,noreferrer')
- window.setTimeout(() => URL.revokeObjectURL(blobUrl), 60000)
- } catch {
- window.open(url, '_blank', 'noopener,noreferrer')
- }
-}
-
const ImageViewerEditorComponent = ({
value,
options,
@@ -130,12 +115,15 @@ const ImageViewerEditorComponent = ({