uix-image-magnify 0.2.0 → 0.2.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.
- package/README.md +518 -0
- package/dist/{ImageMagnify-zNjM2jVN.d.cts → ImageMagnify-DssaU7jS.d.cts} +2 -4
- package/dist/{ImageMagnify-zNjM2jVN.d.ts → ImageMagnify-DssaU7jS.d.ts} +2 -4
- package/dist/index.cjs +219 -220
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -29
- package/dist/index.d.ts +2 -29
- package/dist/index.js +221 -222
- package/dist/index.js.map +1 -1
- package/dist/ssr/index.cjs +44 -17
- package/dist/ssr/index.cjs.map +1 -1
- package/dist/ssr/index.d.cts +2 -2
- package/dist/ssr/index.d.ts +2 -2
- package/dist/ssr/index.js +44 -17
- package/dist/ssr/index.js.map +1 -1
- package/package.json +4 -10
package/dist/ssr/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/useImageMagnify.ts","../../src/components/ImageMagnify.tsx","../../src/ssr/index.tsx"],"names":["useState","useEffect","jsx"],"mappings":"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","file":"index.js","sourcesContent":["import {\r\n useCallback,\r\n useEffect,\r\n useLayoutEffect,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport type * as React from \"react\";\r\n\r\nexport type ZoomType =\r\n | \"hover\"\r\n | \"click\"\r\n | \"double-click\"\r\n | \"hold\"\r\n | \"wheel\"\r\n | \"none\";\r\nexport type PanePosition = \"left\" | \"right\" | \"top\" | \"bottom\";\r\nexport type LensShape = \"circle\" | \"square\";\r\nexport type MagnifyMode = \"lens\" | \"side-by-side\" | \"inner\" | \"follow\";\r\nexport type DragMode = \"follow\" | \"pan\";\r\n\r\nexport interface UseImageMagnifyOptions {\r\n /** Base image URL (required when used standalone). */\r\n src?: string;\r\n /** High-resolution image used for the zoomed view. Defaults to `src`. */\r\n zoomSrc?: string;\r\n /** Magnification factor (2 = 200%). */\r\n zoomScale?: number;\r\n /** Minimum scale for wheel/keyboard zoom. Default `1.5`. */\r\n minZoomScale?: number;\r\n /** Maximum scale for wheel/keyboard zoom. Default `5`. */\r\n maxZoomScale?: number;\r\n /** Interaction that activates zoom. */\r\n zoomType?: ZoomType;\r\n /** How the zoomed content is displayed. */\r\n mode?: MagnifyMode;\r\n /** Drag interaction for `inner` mode. */\r\n dragMode?: DragMode;\r\n /** Where the side-by-side pane sits relative to the image. */\r\n panePosition?: PanePosition;\r\n /** Diameter / side length of the lens in px. */\r\n lensSize?: number;\r\n /** Lens shape. */\r\n lensShape?: LensShape;\r\n /** Offset (both axes, px) for `mode=\"follow\"`. */\r\n followOffset?: number;\r\n /** Disable all interaction. */\r\n disabled?: boolean;\r\n /** Preload the high-res image to avoid a flash. */\r\n zoomPreload?: boolean;\r\n /** Reset zoom when the pointer leaves the container. */\r\n resetOnLeave?: boolean;\r\n onZoomStart?: () => void;\r\n onZoomEnd?: () => void;\r\n onZoomChange?: (scale: number) => void;\r\n}\r\n\r\nconst clamp = (v: number, min: number, max: number) =>\r\n Math.max(min, Math.min(max, v));\r\n\r\nconst useIsoLayoutEffect =\r\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\r\n\r\nexport function useImageMagnify(options: UseImageMagnifyOptions = {}) {\r\n const {\r\n src,\r\n zoomSrc,\r\n zoomScale = 2,\r\n minZoomScale = 1.5,\r\n maxZoomScale = 5,\r\n zoomType = \"hover\",\r\n mode = \"side-by-side\",\r\n dragMode = \"follow\",\r\n lensSize = 150,\r\n followOffset = 0,\r\n zoomPreload = true,\r\n disabled = false,\r\n resetOnLeave = false,\r\n onZoomStart,\r\n onZoomEnd,\r\n onZoomChange,\r\n } = options;\r\n\r\n const [isZoomed, setIsZoomed] = useState(false);\r\n const [currentScale, setCurrentScale] = useState(zoomScale);\r\n\r\n const isZoomedRef = useRef(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const imageRef = useRef<HTMLImageElement>(null);\r\n const lensRef = useRef<HTMLDivElement>(null);\r\n const paneRef = useRef<HTMLDivElement>(null);\r\n const cursorRef = useRef<HTMLDivElement>(null);\r\n\r\n const pointerRef = useRef({ x: 0, y: 0 });\r\n const rafRef = useRef(0);\r\n const scaleRef = useRef(zoomScale);\r\n const modeRef = useRef(mode);\r\n const lensSizeRef = useRef(lensSize);\r\n const followOffsetRef = useRef(followOffset);\r\n const dragModeRef = useRef(dragMode);\r\n const txRef = useRef(0);\r\n const tyRef = useRef(0);\r\n const dragStartRef = useRef<{\r\n cursorX: number;\r\n cursorY: number;\r\n tx: number;\r\n ty: number;\r\n } | null>(null);\r\n\r\n const bgImage = zoomSrc || src;\r\n\r\n /* ---------- ref sync (before paint to avoid 1-frame staleness) ---------- */\r\n useIsoLayoutEffect(() => {\r\n scaleRef.current = zoomScale;\r\n setCurrentScale(zoomScale);\r\n }, [zoomScale]);\r\n useIsoLayoutEffect(() => {\r\n modeRef.current = mode;\r\n }, [mode]);\r\n useIsoLayoutEffect(() => {\r\n lensSizeRef.current = lensSize;\r\n }, [lensSize]);\r\n useIsoLayoutEffect(() => {\r\n followOffsetRef.current = followOffset;\r\n }, [followOffset]);\r\n useIsoLayoutEffect(() => {\r\n dragModeRef.current = dragMode;\r\n }, [dragMode]);\r\n\r\n const updatePointer = useCallback((clientX: number, clientY: number) => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n const rect = container.getBoundingClientRect();\r\n if (!rect.width || !rect.height) return;\r\n pointerRef.current = {\r\n x: clamp(clientX - rect.left, 0, rect.width),\r\n y: clamp(clientY - rect.top, 0, rect.height),\r\n };\r\n }, []);\r\n\r\n const setZoomed = useCallback(\r\n (z: boolean) => {\r\n if (disabled) return;\r\n if (isZoomedRef.current === z) return;\r\n isZoomedRef.current = z;\r\n setIsZoomed(z);\r\n if (z) {\r\n onZoomStart?.();\r\n } else {\r\n if (zoomType === \"wheel\") {\r\n scaleRef.current = zoomScale;\r\n setCurrentScale(zoomScale);\r\n }\r\n txRef.current = 0;\r\n tyRef.current = 0;\r\n onZoomEnd?.();\r\n }\r\n },\r\n [disabled, onZoomStart, onZoomEnd, zoomType, zoomScale],\r\n );\r\n\r\n /* ---------- stable DOM writes ---------- */\r\n const apply = useCallback(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n const rect = container.getBoundingClientRect();\r\n if (!rect.width || !rect.height) return;\r\n\r\n const { x, y } = pointerRef.current;\r\n const scale = scaleRef.current;\r\n const ls = lensSizeRef.current;\r\n const md = modeRef.current;\r\n const fo = followOffsetRef.current;\r\n\r\n /* --- inner mode: transform the <img> --- */\r\n const img = imageRef.current;\r\n if (md === \"inner\" && img) {\r\n if (!isZoomedRef.current) {\r\n img.style.transform = \"\";\r\n } else {\r\n const minTx = rect.width * (1 - scale);\r\n const minTy = rect.height * (1 - scale);\r\n let tx: number;\r\n let ty: number;\r\n if (dragModeRef.current === \"pan\") {\r\n tx = clamp(txRef.current, minTx, 0);\r\n ty = clamp(tyRef.current, minTy, 0);\r\n } else {\r\n // follow cursor: pixel under cursor is shown at cursor\r\n tx = x * (1 - scale);\r\n ty = y * (1 - scale);\r\n tx = clamp(tx, minTx, 0);\r\n ty = clamp(ty, minTy, 0);\r\n }\r\n txRef.current = tx;\r\n tyRef.current = ty;\r\n img.style.transform = `translate3d(${tx}px, ${ty}px, 0) scale(${scale})`;\r\n }\r\n }\r\n\r\n /* --- lens / follow --- */\r\n const lens = lensRef.current;\r\n if (lens) {\r\n const maxX = Math.max(0, rect.width - ls);\r\n const maxY = Math.max(0, rect.height - ls);\r\n const offset = md === \"follow\" ? fo : 0;\r\n const lx = clamp(x - ls / 2 + offset, 0, maxX);\r\n const ly = clamp(y - ls / 2 + offset, 0, maxY);\r\n lens.style.transform = `translate3d(${lx}px, ${ly}px, 0)`;\r\n // FIXED: always show the pixel under the cursor, even when the lens\r\n // itself is clamped at the container edge.\r\n lens.style.backgroundPosition = `${ls / 2 - x * scale}px ${\r\n ls / 2 - y * scale\r\n }px`;\r\n }\r\n\r\n /* --- side-by-side pane --- */\r\n const pane = paneRef.current;\r\n if (pane) {\r\n const pw = pane.offsetWidth;\r\n const ph = pane.offsetHeight;\r\n const bgW = rect.width * scale;\r\n const bgH = rect.height * scale;\r\n let bgX = pw / 2 - (x / rect.width) * bgW;\r\n let bgY = ph / 2 - (y / rect.height) * bgH;\r\n if (bgW > pw) bgX = clamp(bgX, pw - bgW, 0);\r\n else bgX = (pw - bgW) / 2;\r\n if (bgH > ph) bgY = clamp(bgY, ph - bgH, 0);\r\n else bgY = (ph - bgH) / 2;\r\n pane.style.backgroundPosition = `${bgX}px ${bgY}px`;\r\n }\r\n\r\n /* --- side-by-side cursor dot --- */\r\n const cursor = cursorRef.current;\r\n if (cursor) {\r\n cursor.style.transform = `translate3d(${x}px, ${y}px, 0)`;\r\n }\r\n }, []);\r\n\r\n const schedule = useCallback(() => {\r\n if (rafRef.current) return;\r\n rafRef.current = requestAnimationFrame(() => {\r\n rafRef.current = 0;\r\n apply();\r\n });\r\n }, [apply]);\r\n\r\n /* ---------- wheel-driven scale ---------- */\r\n const setScale = useCallback(\r\n (next: number) => {\r\n const clamped = clamp(next, minZoomScale, maxZoomScale);\r\n if (scaleRef.current === clamped) return;\r\n scaleRef.current = clamped;\r\n setCurrentScale(clamped);\r\n onZoomChange?.(clamped);\r\n const container = containerRef.current;\r\n if (container) {\r\n const rect = container.getBoundingClientRect();\r\n if (rect.width && rect.height) {\r\n const size = `${rect.width * clamped}px ${rect.height * clamped}px`;\r\n if (lensRef.current) lensRef.current.style.backgroundSize = size;\r\n if (paneRef.current) paneRef.current.style.backgroundSize = size;\r\n }\r\n }\r\n schedule();\r\n },\r\n [minZoomScale, maxZoomScale, onZoomChange, schedule],\r\n );\r\n\r\n /* ---------- effect: reposition after mount / reset on unzoom ---------- */\r\n useEffect(() => {\r\n if (isZoomed) {\r\n schedule();\r\n } else if (mode === \"inner\" && imageRef.current) {\r\n imageRef.current.style.transform = \"\";\r\n txRef.current = 0;\r\n tyRef.current = 0;\r\n }\r\n }, [isZoomed, schedule, mode]);\r\n\r\n /* ---------- effect: reset if disabled while zoomed ---------- */\r\n useEffect(() => {\r\n if (disabled && isZoomedRef.current) {\r\n isZoomedRef.current = false;\r\n setIsZoomed(false);\r\n onZoomEnd?.();\r\n }\r\n }, [disabled, onZoomEnd]);\r\n\r\n /* ---------- effect: background image ---------- */\r\n useEffect(() => {\r\n if (!bgImage) return;\r\n const url = `url(\"${bgImage}\")`;\r\n if (lensRef.current) lensRef.current.style.backgroundImage = url;\r\n if (paneRef.current) paneRef.current.style.backgroundImage = url;\r\n }, [bgImage, isZoomed]);\r\n\r\n /* ---------- effect: background size tracks container / scale ---------- */\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n const update = () => {\r\n const rect = container.getBoundingClientRect();\r\n if (!rect.width || !rect.height) return;\r\n const s = scaleRef.current;\r\n const size = `${rect.width * s}px ${rect.height * s}px`;\r\n if (lensRef.current) lensRef.current.style.backgroundSize = size;\r\n if (paneRef.current) paneRef.current.style.backgroundSize = size;\r\n };\r\n update();\r\n const ro = new ResizeObserver(update);\r\n ro.observe(container);\r\n return () => ro.disconnect();\r\n }, [isZoomed, zoomScale]);\r\n\r\n /* ---------- effect: preload ---------- */\r\n useEffect(() => {\r\n if (!zoomPreload || !bgImage) return;\r\n const img = new Image();\r\n img.src = bgImage;\r\n }, [zoomPreload, bgImage]);\r\n\r\n /* ---------- effect: rAF cleanup ---------- */\r\n useEffect(\r\n () => () => {\r\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\r\n },\r\n [],\r\n );\r\n\r\n /* ---------- effect: wheel listener ---------- */\r\n useEffect(() => {\r\n if (zoomType !== \"wheel\" || disabled) return;\r\n const container = containerRef.current;\r\n if (!container) return;\r\n const onWheel = (e: WheelEvent) => {\r\n e.preventDefault();\r\n updatePointer(e.clientX, e.clientY);\r\n const factor = e.deltaY < 0 ? 1.1 : 1 / 1.1;\r\n setScale(scaleRef.current * factor);\r\n setZoomed(true);\r\n };\r\n container.addEventListener(\"wheel\", onWheel, { passive: false });\r\n return () => container.removeEventListener(\"wheel\", onWheel);\r\n }, [zoomType, disabled, setScale, setZoomed, updatePointer]);\r\n\r\n /* ---------- handlers ---------- */\r\n const beginDrag = (e: React.PointerEvent) => {\r\n if (modeRef.current !== \"inner\" || dragModeRef.current !== \"pan\") return;\r\n if (!isZoomedRef.current) return;\r\n const el = e.currentTarget as HTMLElement;\r\n el.setPointerCapture?.(e.pointerId);\r\n const rect = el.getBoundingClientRect();\r\n const s = scaleRef.current;\r\n dragStartRef.current = {\r\n cursorX: e.clientX,\r\n cursorY: e.clientY,\r\n tx: clamp(txRef.current, rect.width * (1 - s), 0),\r\n ty: clamp(tyRef.current, rect.height * (1 - s), 0),\r\n };\r\n };\r\n\r\n const handlers = {\r\n onPointerEnter: (e: React.PointerEvent) => {\r\n if (disabled || e.pointerType === \"touch\") return;\r\n updatePointer(e.clientX, e.clientY);\r\n if (zoomType === \"hover\") setZoomed(true);\r\n schedule();\r\n },\r\n onPointerLeave: (e: React.PointerEvent) => {\r\n if (disabled || e.pointerType === \"touch\") return;\r\n if (dragStartRef.current) return;\r\n if (zoomType === \"hover\") setZoomed(false);\r\n else if (resetOnLeave) setZoomed(false);\r\n },\r\n onPointerDown: (e: React.PointerEvent) => {\r\n if (disabled) return;\r\n updatePointer(e.clientX, e.clientY);\r\n const isTouch = e.pointerType === \"touch\";\r\n\r\n // Drag takes priority when already zoomed.\r\n if (isZoomedRef.current) {\r\n beginDrag(e);\r\n if (dragStartRef.current) return;\r\n }\r\n\r\n if (zoomType === \"hold\") {\r\n setZoomed(true);\r\n } else if (isTouch) {\r\n // Touch always behaves like tap-to-toggle\r\n setZoomed(!isZoomedRef.current);\r\n } else if (zoomType === \"click\") {\r\n setZoomed(!isZoomedRef.current);\r\n } else if (zoomType === \"wheel\") {\r\n setZoomed(!isZoomedRef.current);\r\n }\r\n schedule();\r\n },\r\n onPointerMove: (e: React.PointerEvent) => {\r\n if (disabled) return;\r\n if (dragStartRef.current) {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n const rect = container.getBoundingClientRect();\r\n const s = scaleRef.current;\r\n const dx = e.clientX - dragStartRef.current.cursorX;\r\n const dy = e.clientY - dragStartRef.current.cursorY;\r\n txRef.current = clamp(\r\n dragStartRef.current.tx + dx,\r\n rect.width * (1 - s),\r\n 0,\r\n );\r\n tyRef.current = clamp(\r\n dragStartRef.current.ty + dy,\r\n rect.height * (1 - s),\r\n 0,\r\n );\r\n schedule();\r\n return;\r\n }\r\n updatePointer(e.clientX, e.clientY);\r\n if (isZoomedRef.current) schedule();\r\n },\r\n onPointerUp: (e: React.PointerEvent) => {\r\n if (dragStartRef.current) {\r\n (e.currentTarget as HTMLElement).releasePointerCapture?.(e.pointerId);\r\n dragStartRef.current = null;\r\n }\r\n if (zoomType === \"hold\") setZoomed(false);\r\n },\r\n onPointerCancel: () => {\r\n dragStartRef.current = null;\r\n if (zoomType === \"hold\") setZoomed(false);\r\n },\r\n onDoubleClick: (e: React.MouseEvent) => {\r\n if (disabled || zoomType !== \"double-click\") return;\r\n updatePointer(e.clientX, e.clientY);\r\n setZoomed(!isZoomedRef.current);\r\n schedule();\r\n },\r\n onKeyDown: (e: React.KeyboardEvent) => {\r\n if (disabled) return;\r\n const container = containerRef.current;\r\n if (!container) return;\r\n const rect = container.getBoundingClientRect();\r\n const step = 20;\r\n\r\n // Start from image centre the first time the user presses a key.\r\n if (\r\n !isZoomedRef.current &&\r\n pointerRef.current.x === 0 &&\r\n pointerRef.current.y === 0\r\n ) {\r\n pointerRef.current.x = rect.width / 2;\r\n pointerRef.current.y = rect.height / 2;\r\n }\r\n\r\n let handled = true;\r\n switch (e.key) {\r\n case \"ArrowLeft\":\r\n pointerRef.current.x = clamp(\r\n pointerRef.current.x - step,\r\n 0,\r\n rect.width,\r\n );\r\n break;\r\n case \"ArrowRight\":\r\n pointerRef.current.x = clamp(\r\n pointerRef.current.x + step,\r\n 0,\r\n rect.width,\r\n );\r\n break;\r\n case \"ArrowUp\":\r\n pointerRef.current.y = clamp(\r\n pointerRef.current.y - step,\r\n 0,\r\n rect.height,\r\n );\r\n break;\r\n case \"ArrowDown\":\r\n pointerRef.current.y = clamp(\r\n pointerRef.current.y + step,\r\n 0,\r\n rect.height,\r\n );\r\n break;\r\n case \"+\":\r\n case \"=\":\r\n if (zoomType === \"wheel\") setScale(scaleRef.current * 1.2);\r\n break;\r\n case \"-\":\r\n case \"_\":\r\n if (zoomType === \"wheel\") setScale(scaleRef.current / 1.2);\r\n break;\r\n case \"Enter\":\r\n case \" \":\r\n setZoomed(!isZoomedRef.current);\r\n break;\r\n case \"Escape\":\r\n setZoomed(false);\r\n break;\r\n default:\r\n handled = false;\r\n }\r\n if (handled) {\r\n e.preventDefault();\r\n schedule();\r\n }\r\n },\r\n onFocus: () => {\r\n if (disabled) return;\r\n if (zoomType === \"hover\") setZoomed(true);\r\n },\r\n onBlur: () => {\r\n if (zoomType === \"hover\") setZoomed(false);\r\n },\r\n };\r\n\r\n return {\r\n isZoomed,\r\n zoomScale: currentScale,\r\n bgImage,\r\n containerRef,\r\n imageRef,\r\n lensRef,\r\n paneRef,\r\n cursorRef,\r\n handlers,\r\n };\r\n}\r\n","import { forwardRef } from \"react\";\r\nimport type { CSSProperties, ImgHTMLAttributes } from \"react\";\r\nimport { useImageMagnify } from \"../hooks/useImageMagnify\";\r\nimport type { UseImageMagnifyOptions } from \"../hooks/useImageMagnify\";\r\n\r\nexport interface ImageMagnifyProps extends UseImageMagnifyOptions {\r\n src: string;\r\n alt: string;\r\n /** Rendered width of the image (height follows aspect ratio). */\r\n width?: number | string;\r\n className?: string;\r\n style?: CSSProperties;\r\n imageClassName?: string;\r\n imageStyle?: CSSProperties;\r\n lensClassName?: string;\r\n lensStyle?: CSSProperties;\r\n paneClassName?: string;\r\n paneStyle?: CSSProperties;\r\n paneWidth?: number;\r\n paneHeight?: number;\r\n lazy?: boolean;\r\n /** Extra attributes forwarded to the underlying <img>. */\r\n imageProps?: Omit<\r\n ImgHTMLAttributes<HTMLImageElement>,\r\n \"src\" | \"alt\" | \"style\"\r\n >;\r\n onLoad?: ImgHTMLAttributes<HTMLImageElement>[\"onLoad\"];\r\n onError?: ImgHTMLAttributes<HTMLImageElement>[\"onError\"];\r\n}\r\n\r\nexport const ImageMagnify = forwardRef<HTMLDivElement, ImageMagnifyProps>(\r\n (props, ref) => {\r\n const {\r\n src,\r\n alt,\r\n width,\r\n mode = \"side-by-side\",\r\n className,\r\n style,\r\n imageClassName,\r\n imageStyle,\r\n lensClassName,\r\n lensStyle,\r\n paneClassName,\r\n paneStyle,\r\n paneWidth = 400,\r\n paneHeight = 400,\r\n lazy,\r\n panePosition = \"right\",\r\n lensSize = 150,\r\n lensShape = \"circle\",\r\n zoomType = \"hover\",\r\n disabled,\r\n imageProps,\r\n onLoad,\r\n onError,\r\n ...hookOptions\r\n } = props;\r\n\r\n const {\r\n isZoomed,\r\n bgImage,\r\n containerRef,\r\n imageRef,\r\n lensRef,\r\n paneRef,\r\n cursorRef,\r\n handlers,\r\n } = useImageMagnify({\r\n src,\r\n zoomType,\r\n lensSize,\r\n mode,\r\n disabled,\r\n ...hookOptions,\r\n });\r\n\r\n /* ---------- pane offset ---------- */\r\n const paneOffset: CSSProperties = {};\r\n if (panePosition === \"right\") {\r\n paneOffset.left = \"calc(100% + 12px)\";\r\n paneOffset.top = 0;\r\n } else if (panePosition === \"left\") {\r\n paneOffset.right = \"calc(100% + 12px)\";\r\n paneOffset.top = 0;\r\n } else if (panePosition === \"top\") {\r\n paneOffset.left = 0;\r\n paneOffset.bottom = \"calc(100% + 12px)\";\r\n } else {\r\n paneOffset.left = 0;\r\n paneOffset.top = \"calc(100% + 12px)\";\r\n }\r\n\r\n const isInner = mode === \"inner\";\r\n const showLens = (mode === \"lens\" || mode === \"follow\") && isZoomed;\r\n const showPane = mode === \"side-by-side\" && isZoomed;\r\n const showCursor = mode === \"side-by-side\" && isZoomed;\r\n\r\n const cursorStyle = disabled\r\n ? \"default\"\r\n : zoomType === \"hover\" || zoomType === \"hold\" || zoomType === \"wheel\"\r\n ? \"crosshair\"\r\n : isZoomed\r\n ? \"zoom-out\"\r\n : \"zoom-in\";\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={className}\r\n style={{\r\n position: \"relative\",\r\n display: \"inline-block\",\r\n lineHeight: 0,\r\n width,\r\n ...style,\r\n }}\r\n >\r\n <div\r\n ref={containerRef}\r\n tabIndex={0}\r\n role=\"img\"\r\n aria-label={alt}\r\n aria-disabled={disabled || undefined}\r\n style={{\r\n position: \"relative\",\r\n overflow: \"hidden\",\r\n width: \"100%\",\r\n cursor: cursorStyle,\r\n // Only block scrolling while zoomed so page scrolling still works.\r\n touchAction: isZoomed ? \"none\" : \"pan-y\",\r\n outline: \"none\",\r\n lineHeight: 0,\r\n }}\r\n {...handlers}\r\n >\r\n <img\r\n {...imageProps}\r\n ref={imageRef}\r\n src={src}\r\n alt=\"\"\r\n aria-hidden=\"true\"\r\n loading={lazy ? \"lazy\" : undefined}\r\n draggable={false}\r\n className={imageClassName}\r\n onLoad={onLoad}\r\n onError={onError}\r\n style={{\r\n display: \"block\",\r\n width: \"100%\",\r\n height: \"auto\",\r\n userSelect: \"none\",\r\n pointerEvents: \"none\",\r\n transformOrigin: \"0 0\",\r\n willChange: isInner ? \"transform\" : undefined,\r\n ...imageStyle,\r\n }}\r\n />\r\n\r\n {showLens && (\r\n <div\r\n ref={lensRef}\r\n className={lensClassName}\r\n aria-hidden=\"true\"\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n width: lensSize,\r\n height: lensSize,\r\n borderRadius: lensShape === \"circle\" ? \"50%\" : 0,\r\n backgroundImage: bgImage ? `url(\"${bgImage}\")` : undefined,\r\n backgroundRepeat: \"no-repeat\",\r\n pointerEvents: \"none\",\r\n boxShadow: \"0 4px 12px rgba(0,0,0,0.25)\",\r\n border: \"1px solid rgba(255,255,255,0.6)\",\r\n willChange: \"transform\",\r\n ...lensStyle,\r\n }}\r\n />\r\n )}\r\n\r\n {showCursor && (\r\n <div\r\n ref={cursorRef}\r\n aria-hidden=\"true\"\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n width: 12,\r\n height: 12,\r\n marginLeft: -6,\r\n marginTop: -6,\r\n borderRadius: \"50%\",\r\n background: \"rgba(255,255,255,0.7)\",\r\n border: \"1px solid rgba(0,0,0,0.5)\",\r\n pointerEvents: \"none\",\r\n boxShadow: \"0 0 0 1px rgba(255,255,255,0.8)\",\r\n willChange: \"transform\",\r\n }}\r\n />\r\n )}\r\n </div>\r\n\r\n {showPane && (\r\n <div\r\n ref={paneRef}\r\n className={paneClassName}\r\n aria-hidden=\"true\"\r\n style={{\r\n position: \"absolute\",\r\n width: paneWidth,\r\n height: paneHeight,\r\n backgroundImage: bgImage ? `url(\"${bgImage}\")` : undefined,\r\n backgroundRepeat: \"no-repeat\",\r\n border: \"1px solid #e5e5e5\",\r\n borderRadius: 4,\r\n boxShadow: \"0 8px 24px rgba(0,0,0,0.12)\",\r\n pointerEvents: \"none\",\r\n ...paneOffset,\r\n ...paneStyle,\r\n }}\r\n />\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nImageMagnify.displayName = \"ImageMagnify\";\r\n","import { useEffect, useState } from \"react\";\r\nimport { ImageMagnify } from \"../components/ImageMagnify\";\r\nimport type { ImageMagnifyProps } from \"../components/ImageMagnify\";\r\n\r\n/**\r\n * Renders a plain <img> on the server and during the first client render,\r\n * then swaps to the interactive component after hydration.\r\n * Prevents hydration mismatches in Next.js App Router / Remix / etc.\r\n */\r\nexport function ImageMagnifySSR(props: ImageMagnifyProps) {\r\n const [mounted, setMounted] = useState(false);\r\n\r\n useEffect(() => {\r\n setMounted(true);\r\n }, []);\r\n\r\n if (!mounted) {\r\n const {\r\n src,\r\n alt,\r\n width,\r\n lazy,\r\n className,\r\n style,\r\n imageClassName,\r\n imageStyle,\r\n imageProps,\r\n onLoad,\r\n onError,\r\n } = props;\r\n return (\r\n <div\r\n className={className}\r\n style={{\r\n position: \"relative\",\r\n display: \"inline-block\",\r\n lineHeight: 0,\r\n width,\r\n ...style,\r\n }}\r\n >\r\n <img\r\n {...imageProps}\r\n src={src}\r\n alt={alt}\r\n loading={lazy ? \"lazy\" : undefined}\r\n draggable={false}\r\n className={imageClassName}\r\n onLoad={onLoad}\r\n onError={onError}\r\n style={{\r\n display: \"block\",\r\n width: \"100%\",\r\n height: \"auto\",\r\n userSelect: \"none\",\r\n pointerEvents: \"none\",\r\n ...imageStyle,\r\n }}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n return <ImageMagnify {...props} />;\r\n}\r\n\r\nexport { ImageMagnify };\r\nexport type { ImageMagnifyProps };\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/useImageMagnify.ts","../../src/hooks/useMediaQuery.ts","../../src/components/ImageMagnify.tsx","../../src/ssr/index.tsx"],"names":["useIsoLayoutEffect","useLayoutEffect","useEffect","useState","jsx"],"mappings":"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","file":"index.js","sourcesContent":["import {\r\n useCallback,\r\n useEffect,\r\n useLayoutEffect,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport type * as React from \"react\";\r\n\r\nexport type ZoomType =\r\n | \"hover\"\r\n | \"click\"\r\n | \"double-click\"\r\n | \"hold\"\r\n | \"wheel\"\r\n | \"none\";\r\nexport type PanePosition = \"left\" | \"right\" | \"top\" | \"bottom\";\r\nexport type LensShape = \"circle\" | \"square\";\r\nexport type MagnifyMode = \"lens\" | \"side-by-side\" | \"inner\" | \"follow\";\r\nexport type DragMode = \"follow\" | \"pan\";\r\n\r\nexport interface UseImageMagnifyOptions {\r\n /** Base image URL (required when used standalone). */\r\n src?: string;\r\n /** High-resolution image used for the zoomed view. Defaults to `src`. */\r\n zoomSrc?: string;\r\n /** Magnification factor (2 = 200%). */\r\n zoomScale?: number;\r\n /** Minimum scale for wheel/keyboard zoom. Default `1.5`. */\r\n minZoomScale?: number;\r\n /** Maximum scale for wheel/keyboard zoom. Default `5`. */\r\n maxZoomScale?: number;\r\n /** Interaction that activates zoom. */\r\n zoomType?: ZoomType;\r\n /** How the zoomed content is displayed. */\r\n mode?: MagnifyMode;\r\n /** Drag interaction for `inner` mode. */\r\n dragMode?: DragMode;\r\n /** Where the side-by-side pane sits relative to the image. */\r\n panePosition?: PanePosition;\r\n /** Diameter / side length of the lens in px. */\r\n lensSize?: number;\r\n /** Lens shape. */\r\n lensShape?: LensShape;\r\n /** Offset (both axes, px) for `mode=\"follow\"`. */\r\n followOffset?: number;\r\n /** Disable all interaction. */\r\n disabled?: boolean;\r\n /** Preload the high-res image to avoid a flash. */\r\n zoomPreload?: boolean;\r\n /** Reset zoom when the pointer leaves the container. */\r\n resetOnLeave?: boolean;\r\n onZoomStart?: () => void;\r\n onZoomEnd?: () => void;\r\n onZoomChange?: (scale: number) => void;\r\n}\r\n\r\nconst clamp = (v: number, min: number, max: number) =>\r\n Math.max(min, Math.min(max, v));\r\n\r\nconst useIsoLayoutEffect =\r\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\r\n\r\nexport function useImageMagnify(options: UseImageMagnifyOptions = {}) {\r\n const {\r\n src,\r\n zoomSrc,\r\n zoomScale = 2,\r\n minZoomScale = 1.5,\r\n maxZoomScale = 5,\r\n zoomType = \"hover\",\r\n mode = \"side-by-side\",\r\n dragMode = \"follow\",\r\n lensSize = 150,\r\n followOffset = 0,\r\n zoomPreload = true,\r\n disabled = false,\r\n resetOnLeave = false,\r\n onZoomStart,\r\n onZoomEnd,\r\n onZoomChange,\r\n } = options;\r\n\r\n const [isZoomed, setIsZoomed] = useState(false);\r\n const [currentScale, setCurrentScale] = useState(zoomScale);\r\n\r\n const isZoomedRef = useRef(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const imageRef = useRef<HTMLImageElement>(null);\r\n const lensRef = useRef<HTMLDivElement>(null);\r\n const paneRef = useRef<HTMLDivElement>(null);\r\n const cursorRef = useRef<HTMLDivElement>(null);\r\n\r\n const pointerRef = useRef({ x: 0, y: 0 });\r\n const rafRef = useRef(0);\r\n const scaleRef = useRef(zoomScale);\r\n const modeRef = useRef(mode);\r\n const lensSizeRef = useRef(lensSize);\r\n const followOffsetRef = useRef(followOffset);\r\n const dragModeRef = useRef(dragMode);\r\n const txRef = useRef(0);\r\n const tyRef = useRef(0);\r\n const dragStartRef = useRef<{\r\n cursorX: number;\r\n cursorY: number;\r\n tx: number;\r\n ty: number;\r\n } | null>(null);\r\n\r\n const bgImage = zoomSrc || src;\r\n\r\n /* ---------- ref sync (before paint to avoid 1-frame staleness) ---------- */\r\n useIsoLayoutEffect(() => {\r\n scaleRef.current = zoomScale;\r\n setCurrentScale(zoomScale);\r\n }, [zoomScale]);\r\n useIsoLayoutEffect(() => {\r\n modeRef.current = mode;\r\n }, [mode]);\r\n useIsoLayoutEffect(() => {\r\n lensSizeRef.current = lensSize;\r\n }, [lensSize]);\r\n useIsoLayoutEffect(() => {\r\n followOffsetRef.current = followOffset;\r\n }, [followOffset]);\r\n useIsoLayoutEffect(() => {\r\n dragModeRef.current = dragMode;\r\n }, [dragMode]);\r\n\r\n const updatePointer = useCallback((clientX: number, clientY: number) => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n const rect = container.getBoundingClientRect();\r\n if (!rect.width || !rect.height) return;\r\n pointerRef.current = {\r\n x: clamp(clientX - rect.left, 0, rect.width),\r\n y: clamp(clientY - rect.top, 0, rect.height),\r\n };\r\n }, []);\r\n\r\n const setZoomed = useCallback(\r\n (z: boolean) => {\r\n if (disabled) return;\r\n if (isZoomedRef.current === z) return;\r\n isZoomedRef.current = z;\r\n setIsZoomed(z);\r\n if (z) {\r\n onZoomStart?.();\r\n } else {\r\n if (zoomType === \"wheel\") {\r\n scaleRef.current = zoomScale;\r\n setCurrentScale(zoomScale);\r\n }\r\n txRef.current = 0;\r\n tyRef.current = 0;\r\n onZoomEnd?.();\r\n }\r\n },\r\n [disabled, onZoomStart, onZoomEnd, zoomType, zoomScale],\r\n );\r\n\r\n /* ---------- stable DOM writes ---------- */\r\n const apply = useCallback(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n const rect = container.getBoundingClientRect();\r\n if (!rect.width || !rect.height) return;\r\n\r\n const { x, y } = pointerRef.current;\r\n const scale = scaleRef.current;\r\n const ls = lensSizeRef.current;\r\n const md = modeRef.current;\r\n const fo = followOffsetRef.current;\r\n\r\n /* --- inner mode: transform the <img> --- */\r\n const img = imageRef.current;\r\n if (md === \"inner\" && img) {\r\n if (!isZoomedRef.current) {\r\n img.style.transform = \"\";\r\n } else {\r\n const minTx = rect.width * (1 - scale);\r\n const minTy = rect.height * (1 - scale);\r\n let tx: number;\r\n let ty: number;\r\n if (dragModeRef.current === \"pan\") {\r\n tx = clamp(txRef.current, minTx, 0);\r\n ty = clamp(tyRef.current, minTy, 0);\r\n } else {\r\n // follow cursor: pixel under cursor is shown at cursor\r\n tx = x * (1 - scale);\r\n ty = y * (1 - scale);\r\n tx = clamp(tx, minTx, 0);\r\n ty = clamp(ty, minTy, 0);\r\n }\r\n txRef.current = tx;\r\n tyRef.current = ty;\r\n img.style.transform = `translate3d(${tx}px, ${ty}px, 0) scale(${scale})`;\r\n }\r\n }\r\n\r\n /* --- lens / follow --- */\r\n const lens = lensRef.current;\r\n if (lens) {\r\n const maxX = Math.max(0, rect.width - ls);\r\n const maxY = Math.max(0, rect.height - ls);\r\n const offset = md === \"follow\" ? fo : 0;\r\n const lx = clamp(x - ls / 2 + offset, 0, maxX);\r\n const ly = clamp(y - ls / 2 + offset, 0, maxY);\r\n lens.style.transform = `translate3d(${lx}px, ${ly}px, 0)`;\r\n // FIXED: always show the pixel under the cursor, even when the lens\r\n // itself is clamped at the container edge.\r\n lens.style.backgroundPosition = `${ls / 2 - x * scale}px ${\r\n ls / 2 - y * scale\r\n }px`;\r\n }\r\n\r\n /* --- side-by-side pane --- */\r\n const pane = paneRef.current;\r\n if (pane) {\r\n const pw = pane.offsetWidth;\r\n const ph = pane.offsetHeight;\r\n const bgW = rect.width * scale;\r\n const bgH = rect.height * scale;\r\n let bgX = pw / 2 - (x / rect.width) * bgW;\r\n let bgY = ph / 2 - (y / rect.height) * bgH;\r\n if (bgW > pw) bgX = clamp(bgX, pw - bgW, 0);\r\n else bgX = (pw - bgW) / 2;\r\n if (bgH > ph) bgY = clamp(bgY, ph - bgH, 0);\r\n else bgY = (ph - bgH) / 2;\r\n pane.style.backgroundPosition = `${bgX}px ${bgY}px`;\r\n }\r\n\r\n /* --- side-by-side cursor dot --- */\r\n const cursor = cursorRef.current;\r\n if (cursor) {\r\n cursor.style.transform = `translate3d(${x}px, ${y}px, 0)`;\r\n }\r\n }, []);\r\n\r\n const schedule = useCallback(() => {\r\n if (rafRef.current) return;\r\n rafRef.current = requestAnimationFrame(() => {\r\n rafRef.current = 0;\r\n apply();\r\n });\r\n }, [apply]);\r\n\r\n /* ---------- wheel-driven scale ---------- */\r\n const setScale = useCallback(\r\n (next: number) => {\r\n const clamped = clamp(next, minZoomScale, maxZoomScale);\r\n if (scaleRef.current === clamped) return;\r\n scaleRef.current = clamped;\r\n setCurrentScale(clamped);\r\n onZoomChange?.(clamped);\r\n const container = containerRef.current;\r\n if (container) {\r\n const rect = container.getBoundingClientRect();\r\n if (rect.width && rect.height) {\r\n const size = `${rect.width * clamped}px ${rect.height * clamped}px`;\r\n if (lensRef.current) lensRef.current.style.backgroundSize = size;\r\n if (paneRef.current) paneRef.current.style.backgroundSize = size;\r\n }\r\n }\r\n schedule();\r\n },\r\n [minZoomScale, maxZoomScale, onZoomChange, schedule],\r\n );\r\n\r\n /* ---------- effect: reposition after mount / reset on unzoom ---------- */\r\n useEffect(() => {\r\n if (isZoomed) {\r\n schedule();\r\n } else if (mode === \"inner\" && imageRef.current) {\r\n imageRef.current.style.transform = \"\";\r\n txRef.current = 0;\r\n tyRef.current = 0;\r\n }\r\n }, [isZoomed, schedule, mode]);\r\n\r\n /* ---------- effect: reset if disabled while zoomed ---------- */\r\n useEffect(() => {\r\n if (disabled && isZoomedRef.current) {\r\n isZoomedRef.current = false;\r\n setIsZoomed(false);\r\n onZoomEnd?.();\r\n }\r\n }, [disabled, onZoomEnd]);\r\n\r\n /* ---------- effect: background image ---------- */\r\n useEffect(() => {\r\n if (!bgImage) return;\r\n const url = `url(\"${bgImage}\")`;\r\n if (lensRef.current) lensRef.current.style.backgroundImage = url;\r\n if (paneRef.current) paneRef.current.style.backgroundImage = url;\r\n }, [bgImage, isZoomed]);\r\n\r\n /* ---------- effect: background size tracks container / scale ---------- */\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n const update = () => {\r\n const rect = container.getBoundingClientRect();\r\n if (!rect.width || !rect.height) return;\r\n const s = scaleRef.current;\r\n const size = `${rect.width * s}px ${rect.height * s}px`;\r\n if (lensRef.current) lensRef.current.style.backgroundSize = size;\r\n if (paneRef.current) paneRef.current.style.backgroundSize = size;\r\n };\r\n update();\r\n const ro = new ResizeObserver(update);\r\n ro.observe(container);\r\n return () => ro.disconnect();\r\n }, [isZoomed, zoomScale]);\r\n\r\n /* ---------- effect: preload ---------- */\r\n useEffect(() => {\r\n if (!zoomPreload || !bgImage) return;\r\n const img = new Image();\r\n img.src = bgImage;\r\n }, [zoomPreload, bgImage]);\r\n\r\n /* ---------- effect: rAF cleanup ---------- */\r\n useEffect(\r\n () => () => {\r\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\r\n },\r\n [],\r\n );\r\n\r\n /* ---------- effect: wheel listener ---------- */\r\n useEffect(() => {\r\n if (zoomType !== \"wheel\" || disabled) return;\r\n const container = containerRef.current;\r\n if (!container) return;\r\n const onWheel = (e: WheelEvent) => {\r\n e.preventDefault();\r\n updatePointer(e.clientX, e.clientY);\r\n const factor = e.deltaY < 0 ? 1.1 : 1 / 1.1;\r\n setScale(scaleRef.current * factor);\r\n setZoomed(true);\r\n };\r\n container.addEventListener(\"wheel\", onWheel, { passive: false });\r\n return () => container.removeEventListener(\"wheel\", onWheel);\r\n }, [zoomType, disabled, setScale, setZoomed, updatePointer]);\r\n\r\n /* ---------- handlers ---------- */\r\n const beginDrag = (e: React.PointerEvent) => {\r\n if (modeRef.current !== \"inner\" || dragModeRef.current !== \"pan\") return;\r\n if (!isZoomedRef.current) return;\r\n const el = e.currentTarget as HTMLElement;\r\n el.setPointerCapture?.(e.pointerId);\r\n const rect = el.getBoundingClientRect();\r\n const s = scaleRef.current;\r\n dragStartRef.current = {\r\n cursorX: e.clientX,\r\n cursorY: e.clientY,\r\n tx: clamp(txRef.current, rect.width * (1 - s), 0),\r\n ty: clamp(tyRef.current, rect.height * (1 - s), 0),\r\n };\r\n };\r\n\r\n const handlers = {\r\n onPointerEnter: (e: React.PointerEvent) => {\r\n if (disabled || e.pointerType === \"touch\") return;\r\n updatePointer(e.clientX, e.clientY);\r\n if (zoomType === \"hover\") setZoomed(true);\r\n schedule();\r\n },\r\n onPointerLeave: (e: React.PointerEvent) => {\r\n if (disabled || e.pointerType === \"touch\") return;\r\n if (dragStartRef.current) return;\r\n if (zoomType === \"hover\") setZoomed(false);\r\n else if (resetOnLeave) setZoomed(false);\r\n },\r\n onPointerDown: (e: React.PointerEvent) => {\r\n if (disabled) return;\r\n updatePointer(e.clientX, e.clientY);\r\n const isTouch = e.pointerType === \"touch\";\r\n\r\n // Drag takes priority when already zoomed.\r\n if (isZoomedRef.current) {\r\n beginDrag(e);\r\n if (dragStartRef.current) return;\r\n }\r\n\r\n if (zoomType === \"hold\") {\r\n setZoomed(true);\r\n } else if (isTouch) {\r\n // Touch always behaves like tap-to-toggle\r\n setZoomed(!isZoomedRef.current);\r\n } else if (zoomType === \"click\") {\r\n setZoomed(!isZoomedRef.current);\r\n } else if (zoomType === \"wheel\") {\r\n setZoomed(!isZoomedRef.current);\r\n }\r\n schedule();\r\n },\r\n onPointerMove: (e: React.PointerEvent) => {\r\n if (disabled) return;\r\n if (dragStartRef.current) {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n const rect = container.getBoundingClientRect();\r\n const s = scaleRef.current;\r\n const dx = e.clientX - dragStartRef.current.cursorX;\r\n const dy = e.clientY - dragStartRef.current.cursorY;\r\n txRef.current = clamp(\r\n dragStartRef.current.tx + dx,\r\n rect.width * (1 - s),\r\n 0,\r\n );\r\n tyRef.current = clamp(\r\n dragStartRef.current.ty + dy,\r\n rect.height * (1 - s),\r\n 0,\r\n );\r\n schedule();\r\n return;\r\n }\r\n updatePointer(e.clientX, e.clientY);\r\n if (isZoomedRef.current) schedule();\r\n },\r\n onPointerUp: (e: React.PointerEvent) => {\r\n if (dragStartRef.current) {\r\n (e.currentTarget as HTMLElement).releasePointerCapture?.(e.pointerId);\r\n dragStartRef.current = null;\r\n }\r\n if (zoomType === \"hold\") setZoomed(false);\r\n },\r\n onPointerCancel: () => {\r\n dragStartRef.current = null;\r\n if (zoomType === \"hold\") setZoomed(false);\r\n },\r\n onDoubleClick: (e: React.MouseEvent) => {\r\n if (disabled || zoomType !== \"double-click\") return;\r\n updatePointer(e.clientX, e.clientY);\r\n setZoomed(!isZoomedRef.current);\r\n schedule();\r\n },\r\n onKeyDown: (e: React.KeyboardEvent) => {\r\n if (disabled) return;\r\n const container = containerRef.current;\r\n if (!container) return;\r\n const rect = container.getBoundingClientRect();\r\n const step = 20;\r\n\r\n // Start from image centre the first time the user presses a key.\r\n if (\r\n !isZoomedRef.current &&\r\n pointerRef.current.x === 0 &&\r\n pointerRef.current.y === 0\r\n ) {\r\n pointerRef.current.x = rect.width / 2;\r\n pointerRef.current.y = rect.height / 2;\r\n }\r\n\r\n let handled = true;\r\n switch (e.key) {\r\n case \"ArrowLeft\":\r\n pointerRef.current.x = clamp(\r\n pointerRef.current.x - step,\r\n 0,\r\n rect.width,\r\n );\r\n break;\r\n case \"ArrowRight\":\r\n pointerRef.current.x = clamp(\r\n pointerRef.current.x + step,\r\n 0,\r\n rect.width,\r\n );\r\n break;\r\n case \"ArrowUp\":\r\n pointerRef.current.y = clamp(\r\n pointerRef.current.y - step,\r\n 0,\r\n rect.height,\r\n );\r\n break;\r\n case \"ArrowDown\":\r\n pointerRef.current.y = clamp(\r\n pointerRef.current.y + step,\r\n 0,\r\n rect.height,\r\n );\r\n break;\r\n case \"+\":\r\n case \"=\":\r\n if (zoomType === \"wheel\") setScale(scaleRef.current * 1.2);\r\n break;\r\n case \"-\":\r\n case \"_\":\r\n if (zoomType === \"wheel\") setScale(scaleRef.current / 1.2);\r\n break;\r\n case \"Enter\":\r\n case \" \":\r\n setZoomed(!isZoomedRef.current);\r\n break;\r\n case \"Escape\":\r\n setZoomed(false);\r\n break;\r\n default:\r\n handled = false;\r\n }\r\n if (handled) {\r\n e.preventDefault();\r\n schedule();\r\n }\r\n },\r\n onFocus: () => {\r\n if (disabled) return;\r\n if (zoomType === \"hover\") setZoomed(true);\r\n },\r\n onBlur: () => {\r\n if (zoomType === \"hover\") setZoomed(false);\r\n },\r\n };\r\n\r\n return {\r\n isZoomed,\r\n zoomScale: currentScale,\r\n bgImage,\r\n containerRef,\r\n imageRef,\r\n lensRef,\r\n paneRef,\r\n cursorRef,\r\n handlers,\r\n };\r\n}\r\n","import { useEffect, useLayoutEffect, useState } from \"react\";\r\n\r\nconst useIsoLayoutEffect =\r\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\r\n\r\n/**\r\n * SSR-safe media query hook. Returns false on the server and during the very\r\n * first client render, then updates to the real value before paint.\r\n */\r\nexport function useMediaQuery(query: string): boolean {\r\n const [matches, setMatches] = useState(false);\r\n\r\n useIsoLayoutEffect(() => {\r\n const media = window.matchMedia(query);\r\n const listener = () => setMatches(media.matches);\r\n listener();\r\n media.addEventListener(\"change\", listener);\r\n return () => media.removeEventListener(\"change\", listener);\r\n }, [query]);\r\n\r\n return matches;\r\n}\r\n","import { forwardRef } from \"react\";\r\nimport type { CSSProperties, ImgHTMLAttributes } from \"react\";\r\nimport { useImageMagnify } from \"../hooks/useImageMagnify\";\r\nimport type {\r\n UseImageMagnifyOptions,\r\n PanePosition,\r\n} from \"../hooks/useImageMagnify\";\r\nimport { useMediaQuery } from \"../hooks/useMediaQuery\";\r\n\r\nexport interface ImageMagnifyProps extends UseImageMagnifyOptions {\r\n src: string;\r\n alt: string;\r\n width?: number | string;\r\n className?: string;\r\n style?: CSSProperties;\r\n imageClassName?: string;\r\n imageStyle?: CSSProperties;\r\n lensClassName?: string;\r\n lensStyle?: CSSProperties;\r\n paneClassName?: string;\r\n paneStyle?: CSSProperties;\r\n paneWidth?: number | string;\r\n paneHeight?: number | string;\r\n lazy?: boolean;\r\n imageProps?: Omit<\r\n ImgHTMLAttributes<HTMLImageElement>,\r\n \"src\" | \"alt\" | \"style\"\r\n >;\r\n onLoad?: ImgHTMLAttributes<HTMLImageElement>[\"onLoad\"];\r\n onError?: ImgHTMLAttributes<HTMLImageElement>[\"onError\"];\r\n}\r\n\r\nconst MOBILE_QUERY = \"(max-width: 768px)\";\r\n\r\nexport const ImageMagnify = forwardRef<HTMLDivElement, ImageMagnifyProps>(\r\n (props, ref) => {\r\n const {\r\n src,\r\n alt,\r\n width,\r\n mode = \"side-by-side\",\r\n className,\r\n style,\r\n imageClassName,\r\n imageStyle,\r\n lensClassName,\r\n lensStyle,\r\n paneClassName,\r\n paneStyle,\r\n paneWidth = 400,\r\n paneHeight = 400,\r\n lazy,\r\n panePosition = \"right\",\r\n lensSize = 150,\r\n lensShape = \"circle\",\r\n zoomType = \"hover\",\r\n disabled,\r\n imageProps,\r\n onLoad,\r\n onError,\r\n ...hookOptions\r\n } = props;\r\n\r\n /* ----- responsive: force the pane below the image on mobile ----- */\r\n const isMobile = useMediaQuery(MOBILE_QUERY);\r\n const responsivePanePosition: PanePosition = isMobile\r\n ? \"bottom\"\r\n : panePosition;\r\n\r\n const {\r\n isZoomed,\r\n bgImage,\r\n containerRef,\r\n imageRef,\r\n lensRef,\r\n paneRef,\r\n cursorRef,\r\n handlers,\r\n } = useImageMagnify({\r\n src,\r\n zoomType,\r\n lensSize,\r\n mode,\r\n disabled,\r\n ...hookOptions,\r\n });\r\n\r\n /* ----- position styles for the pane ----- */\r\n const panePositionStyle: CSSProperties = {};\r\n if (responsivePanePosition === \"right\") {\r\n panePositionStyle.position = \"absolute\";\r\n panePositionStyle.left = \"calc(100% + 12px)\";\r\n panePositionStyle.top = 0;\r\n } else if (responsivePanePosition === \"left\") {\r\n panePositionStyle.position = \"absolute\";\r\n panePositionStyle.right = \"calc(100% + 12px)\";\r\n panePositionStyle.top = 0;\r\n } else if (responsivePanePosition === \"top\") {\r\n panePositionStyle.position = \"absolute\";\r\n panePositionStyle.left = 0;\r\n panePositionStyle.bottom = \"calc(100% + 12px)\";\r\n } else if (isMobile) {\r\n /* On mobile: flow below the image (Amazon style) */\r\n panePositionStyle.position = \"static\";\r\n panePositionStyle.display = \"block\";\r\n panePositionStyle.marginTop = 12;\r\n panePositionStyle.width = \"100%\";\r\n panePositionStyle.boxSizing = \"border-box\";\r\n } else {\r\n /* Desktop bottom: absolute */\r\n panePositionStyle.position = \"absolute\";\r\n panePositionStyle.left = 0;\r\n panePositionStyle.top = \"calc(100% + 12px)\";\r\n }\r\n\r\n const isInner = mode === \"inner\";\r\n const showLens = (mode === \"lens\" || mode === \"follow\") && isZoomed;\r\n const showPane = mode === \"side-by-side\" && isZoomed;\r\n const showCursor = mode === \"side-by-side\" && isZoomed;\r\n\r\n const cursorStyle = disabled\r\n ? \"default\"\r\n : zoomType === \"hover\" || zoomType === \"hold\" || zoomType === \"wheel\"\r\n ? \"crosshair\"\r\n : isZoomed\r\n ? \"zoom-out\"\r\n : \"zoom-in\";\r\n\r\n const outerWidth = isMobile ? \"100%\" : width;\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={className}\r\n style={{\r\n position: \"relative\",\r\n display: \"inline-block\",\r\n lineHeight: 0,\r\n width: outerWidth,\r\n maxWidth: \"100%\",\r\n ...style,\r\n }}\r\n >\r\n <div\r\n ref={containerRef}\r\n tabIndex={0}\r\n role=\"img\"\r\n aria-label={alt}\r\n aria-disabled={disabled || undefined}\r\n style={{\r\n position: \"relative\",\r\n overflow: \"hidden\",\r\n width: \"100%\",\r\n cursor: cursorStyle,\r\n touchAction: isZoomed ? \"none\" : \"pan-y\",\r\n outline: \"none\",\r\n lineHeight: 0,\r\n }}\r\n {...handlers}\r\n >\r\n <img\r\n {...imageProps}\r\n ref={imageRef}\r\n src={src}\r\n alt=\"\"\r\n aria-hidden=\"true\"\r\n loading={lazy ? \"lazy\" : undefined}\r\n draggable={false}\r\n className={imageClassName}\r\n onLoad={onLoad}\r\n onError={onError}\r\n style={{\r\n display: \"block\",\r\n width: \"100%\",\r\n height: \"auto\",\r\n userSelect: \"none\",\r\n pointerEvents: \"none\",\r\n transformOrigin: \"0 0\",\r\n willChange: isInner ? \"transform\" : undefined,\r\n ...imageStyle,\r\n }}\r\n />\r\n\r\n {showLens && (\r\n <div\r\n ref={lensRef}\r\n className={lensClassName}\r\n aria-hidden=\"true\"\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n width: lensSize,\r\n height: lensSize,\r\n borderRadius: lensShape === \"circle\" ? \"50%\" : 0,\r\n backgroundImage: bgImage ? `url(\"${bgImage}\")` : undefined,\r\n backgroundRepeat: \"no-repeat\",\r\n pointerEvents: \"none\",\r\n boxShadow: \"0 4px 12px rgba(0,0,0,0.25)\",\r\n border: \"1px solid rgba(255,255,255,0.6)\",\r\n willChange: \"transform\",\r\n ...lensStyle,\r\n }}\r\n />\r\n )}\r\n\r\n {showCursor && (\r\n <div\r\n ref={cursorRef}\r\n aria-hidden=\"true\"\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n width: 12,\r\n height: 12,\r\n marginLeft: -6,\r\n marginTop: -6,\r\n borderRadius: \"50%\",\r\n background: \"rgba(255,255,255,0.7)\",\r\n border: \"1px solid rgba(0,0,0,0.5)\",\r\n pointerEvents: \"none\",\r\n boxShadow: \"0 0 0 1px rgba(255,255,255,0.8)\",\r\n willChange: \"transform\",\r\n }}\r\n />\r\n )}\r\n </div>\r\n\r\n {showPane && (\r\n <div\r\n ref={paneRef}\r\n className={paneClassName}\r\n aria-hidden=\"true\"\r\n style={{\r\n width:\r\n isMobile && responsivePanePosition === \"bottom\"\r\n ? \"100%\"\r\n : paneWidth,\r\n height: paneHeight,\r\n maxWidth: \"100%\",\r\n boxSizing: \"border-box\",\r\n backgroundImage: bgImage ? `url(\"${bgImage}\")` : undefined,\r\n backgroundRepeat: \"no-repeat\",\r\n border: \"1px solid #e5e5e5\",\r\n borderRadius: 4,\r\n boxShadow: \"0 8px 24px rgba(0,0,0,0.12)\",\r\n pointerEvents: \"none\",\r\n ...panePositionStyle,\r\n ...paneStyle,\r\n }}\r\n />\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nImageMagnify.displayName = \"ImageMagnify\";\r\n","import { useEffect, useState } from \"react\";\r\nimport { ImageMagnify } from \"../components/ImageMagnify\";\r\nimport type { ImageMagnifyProps } from \"../components/ImageMagnify\";\r\n\r\n/**\r\n * Renders a plain <img> on the server and during the first client render,\r\n * then swaps to the interactive component after hydration.\r\n * Prevents hydration mismatches in Next.js App Router / Remix / etc.\r\n */\r\nexport function ImageMagnifySSR(props: ImageMagnifyProps) {\r\n const [mounted, setMounted] = useState(false);\r\n\r\n useEffect(() => {\r\n setMounted(true);\r\n }, []);\r\n\r\n if (!mounted) {\r\n const {\r\n src,\r\n alt,\r\n width,\r\n lazy,\r\n className,\r\n style,\r\n imageClassName,\r\n imageStyle,\r\n imageProps,\r\n onLoad,\r\n onError,\r\n } = props;\r\n return (\r\n <div\r\n className={className}\r\n style={{\r\n position: \"relative\",\r\n display: \"inline-block\",\r\n lineHeight: 0,\r\n width,\r\n ...style,\r\n }}\r\n >\r\n <img\r\n {...imageProps}\r\n src={src}\r\n alt={alt}\r\n loading={lazy ? \"lazy\" : undefined}\r\n draggable={false}\r\n className={imageClassName}\r\n onLoad={onLoad}\r\n onError={onError}\r\n style={{\r\n display: \"block\",\r\n width: \"100%\",\r\n height: \"auto\",\r\n userSelect: \"none\",\r\n pointerEvents: \"none\",\r\n ...imageStyle,\r\n }}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n return <ImageMagnify {...props} />;\r\n}\r\n\r\nexport { ImageMagnify };\r\nexport type { ImageMagnifyProps };\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "uix-image-magnify",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "A fast, accessible, SSR-safe image magnifier for React and Next.js.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -35,6 +35,9 @@
|
|
|
35
35
|
"react": ">=17.0.0",
|
|
36
36
|
"react-dom": ">=17.0.0"
|
|
37
37
|
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"swiper": "^11.1.0"
|
|
40
|
+
},
|
|
38
41
|
"devDependencies": {
|
|
39
42
|
"@types/react": "^18.2.0",
|
|
40
43
|
"@types/react-dom": "^18.2.0",
|
|
@@ -56,15 +59,6 @@
|
|
|
56
59
|
"product-gallery"
|
|
57
60
|
],
|
|
58
61
|
"license": "MIT",
|
|
59
|
-
"author": "Your Name <you@example.com>",
|
|
60
|
-
"repository": {
|
|
61
|
-
"type": "git",
|
|
62
|
-
"url": "git+https://github.com/<you>/uix-image-magnify.git"
|
|
63
|
-
},
|
|
64
|
-
"homepage": "https://github.com/<you>/uix-image-magnify#readme",
|
|
65
|
-
"bugs": {
|
|
66
|
-
"url": "https://github.com/<you>/uix-image-magnify/issues"
|
|
67
|
-
},
|
|
68
62
|
"engines": {
|
|
69
63
|
"node": ">=18"
|
|
70
64
|
}
|