uix-image-magnify 0.2.0 → 0.2.1
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/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/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/useImageMagnify.ts","../src/components/ImageMagnify.tsx","../src/hooks/useImageSlider.ts","../src/components/ImageMagnifyGallery.tsx"],"names":["useLayoutEffect","useEffect","useState","useRef","useCallback","forwardRef","jsxs","jsx","next","useMemo"],"mappings":"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","file":"index.cjs","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 { useCallback, useState } from \"react\";\r\n\r\nexport interface UseImageSliderOptions {\r\n /** Total number of items in the slider. */\r\n length: number;\r\n /** Initial index when uncontrolled. Default `0`. */\r\n defaultIndex?: number;\r\n /** Controlled index. When provided, `defaultIndex` is ignored. */\r\n index?: number;\r\n /** Fired whenever the index changes. */\r\n onIndexChange?: (index: number) => void;\r\n /** Wrap around at the ends. Default `true`. */\r\n loop?: boolean;\r\n}\r\n\r\nexport interface UseImageSliderReturn {\r\n /** Current (clamped) index. */\r\n index: number;\r\n /** Whether a previous item exists (always `true` when `loop`). */\r\n canPrev: boolean;\r\n /** Whether a next item exists (always `true` when `loop`). */\r\n canNext: boolean;\r\n /** Go to a specific index. */\r\n setIndex: (next: number) => void;\r\n /** Go to previous item. */\r\n prev: () => void;\r\n /** Go to next item. */\r\n next: () => void;\r\n}\r\n\r\n/**\r\n * Headless, SSR-safe slider state. No DOM APIs, no browser globals.\r\n */\r\nexport function useImageSlider({\r\n length,\r\n defaultIndex = 0,\r\n index: controlledIndex,\r\n onIndexChange,\r\n loop = true,\r\n}: UseImageSliderOptions): UseImageSliderReturn {\r\n const [internalIndex, setInternalIndex] = useState(defaultIndex);\r\n\r\n const safeLength = Math.max(1, length);\r\n const rawIndex = controlledIndex ?? internalIndex;\r\n const index = Math.max(0, Math.min(safeLength - 1, rawIndex));\r\n\r\n const setIndex = useCallback(\r\n (next: number) => {\r\n if (length <= 0) return;\r\n\r\n let resolved: number;\r\n if (loop) {\r\n resolved = ((next % safeLength) + safeLength) % safeLength;\r\n } else {\r\n resolved = Math.max(0, Math.min(safeLength - 1, next));\r\n }\r\n\r\n if (resolved === index) return;\r\n\r\n if (controlledIndex === undefined) {\r\n setInternalIndex(resolved);\r\n }\r\n onIndexChange?.(resolved);\r\n },\r\n [length, safeLength, loop, index, controlledIndex, onIndexChange],\r\n );\r\n\r\n const prev = useCallback(() => setIndex(index - 1), [setIndex, index]);\r\n const next = useCallback(() => setIndex(index + 1), [setIndex, index]);\r\n\r\n return {\r\n index,\r\n canPrev: loop || index > 0,\r\n canNext: loop || index < safeLength - 1,\r\n setIndex,\r\n prev,\r\n next,\r\n };\r\n}\r\n","import {\r\n forwardRef,\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport type { CSSProperties, ReactNode } from \"react\";\r\nimport { ImageMagnify } from \"./ImageMagnify\";\r\nimport type { ImageMagnifyProps } from \"./ImageMagnify\";\r\nimport { useImageSlider } from \"../hooks/useImageSlider\";\r\n\r\nexport interface ImageMagnifyGalleryProps extends Omit<\r\n ImageMagnifyProps,\r\n \"src\" | \"onLoad\" | \"onError\"\r\n> {\r\n /** Array of image URLs to display in the gallery. */\r\n images: string[];\r\n /** Alt text applied to every image. */\r\n alt: string;\r\n /** Controlled active index. */\r\n activeIndex?: number;\r\n /** Uncontrolled initial index. Default `0`. */\r\n defaultIndex?: number;\r\n /** Fired whenever the active index changes. */\r\n onIndexChange?: (index: number) => void;\r\n\r\n /* ---------- slider behaviour ---------- */\r\n /** Show prev/next arrow buttons. Default `true`. */\r\n showArrows?: boolean;\r\n /** Show the thumbnail strip. Default `true`. */\r\n showThumbnails?: boolean;\r\n /** Show an \"X / Y\" counter badge. Default `false`. */\r\n showCounter?: boolean;\r\n /** Wrap around at the ends. Default `true`. */\r\n loop?: boolean;\r\n /** Enable ← / → keyboard navigation on the viewport. Default `true`. */\r\n enableKeyboard?: boolean;\r\n /** Preload adjacent images. Default `true`. */\r\n preloadAdjacent?: boolean;\r\n\r\n /* ---------- layout / styling ---------- */\r\n /** Extra className applied to the outer wrapper. */\r\n className?: string;\r\n /** Inline style applied to the outer wrapper. */\r\n style?: CSSProperties;\r\n /** className applied to the viewport (element that holds the image + arrows). */\r\n viewportClassName?: string;\r\n /** Inline style applied to the viewport. */\r\n viewportStyle?: CSSProperties;\r\n /** className applied to the thumbnail strip container. */\r\n thumbnailContainerClassName?: string;\r\n /** Inline style applied to the thumbnail strip container. */\r\n thumbnailContainerStyle?: CSSProperties;\r\n /** className applied to *each* thumbnail button. */\r\n thumbnailClassName?: string;\r\n /** className applied to the *active* thumbnail button. */\r\n thumbnailActiveClassName?: string;\r\n /** Inline style applied to *each* thumbnail button. */\r\n thumbnailStyle?: CSSProperties;\r\n /** Inline style applied to the *active* thumbnail button. */\r\n thumbnailActiveStyle?: CSSProperties;\r\n /** className applied to both arrow buttons. */\r\n arrowClassName?: string;\r\n /** Inline style applied to both arrow buttons. */\r\n arrowStyle?: CSSProperties;\r\n /** Thumbnail size in px (square). Default `80`. */\r\n thumbnailSize?: number;\r\n /** Gap between thumbnails in px. Default `8`. */\r\n thumbnailGap?: number;\r\n\r\n /* ---------- custom icons ---------- */\r\n /** Custom content for the previous arrow. */\r\n prevArrow?: ReactNode;\r\n /** Custom content for the next arrow. */\r\n nextArrow?: ReactNode;\r\n}\r\n\r\n/* ---------- default icons (inline SVG — no extra deps) ---------- */\r\nconst ArrowLeftIcon = () => (\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n width=\"20\"\r\n height=\"20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <polyline points=\"15 18 9 12 15 6\" />\r\n </svg>\r\n);\r\n\r\nconst ArrowRightIcon = () => (\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n width=\"20\"\r\n height=\"20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <polyline points=\"9 18 15 12 9 6\" />\r\n </svg>\r\n);\r\n\r\n/* ---------- default styles ---------- */\r\nconst defaultArrowBaseStyle: CSSProperties = {\r\n position: \"absolute\",\r\n top: \"50%\",\r\n transform: \"translateY(-50%)\",\r\n width: 40,\r\n height: 40,\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n border: \"1px solid rgba(0,0,0,0.12)\",\r\n borderRadius: 9999,\r\n boxShadow: \"0 4px 12px rgba(0,0,0,0.15)\",\r\n cursor: \"pointer\",\r\n zIndex: 10,\r\n color: \"#111\",\r\n padding: 0,\r\n transition: \"background 0.15s ease\",\r\n backdropFilter: \"blur(4px)\",\r\n WebkitBackdropFilter: \"blur(4px)\",\r\n};\r\n\r\nconst defaultThumbStripStyle: CSSProperties = {\r\n display: \"flex\",\r\n overflowX: \"auto\",\r\n overflowY: \"hidden\",\r\n paddingBottom: 4,\r\n scrollbarWidth: \"thin\",\r\n WebkitOverflowScrolling: \"touch\",\r\n};\r\n\r\nconst defaultThumbBaseStyle: CSSProperties = {\r\n flexShrink: 0,\r\n padding: 0,\r\n border: \"2px solid #e5e5e5\",\r\n background: \"#fff\",\r\n cursor: \"pointer\",\r\n overflow: \"hidden\",\r\n transition: \"border-color 0.15s ease\",\r\n borderRadius: 2,\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n};\r\n\r\nconst defaultThumbActiveStyle: CSSProperties = {\r\n borderColor: \"#111\",\r\n};\r\n\r\nconst visuallyHidden: CSSProperties = {\r\n position: \"absolute\",\r\n width: 1,\r\n height: 1,\r\n padding: 0,\r\n margin: -1,\r\n overflow: \"hidden\",\r\n clip: \"rect(0,0,0,0)\",\r\n whiteSpace: \"nowrap\",\r\n border: 0,\r\n};\r\n\r\nexport const ImageMagnifyGallery = forwardRef<\r\n HTMLDivElement,\r\n ImageMagnifyGalleryProps\r\n>((props, ref) => {\r\n const {\r\n images,\r\n alt,\r\n activeIndex: controlledActiveIndex,\r\n defaultIndex = 0,\r\n onIndexChange,\r\n showArrows = true,\r\n showThumbnails = true,\r\n showCounter = false,\r\n loop = true,\r\n enableKeyboard = true,\r\n preloadAdjacent = true,\r\n className,\r\n style,\r\n viewportClassName,\r\n viewportStyle,\r\n thumbnailContainerClassName,\r\n thumbnailContainerStyle,\r\n thumbnailClassName,\r\n thumbnailActiveClassName,\r\n thumbnailStyle,\r\n thumbnailActiveStyle,\r\n arrowClassName,\r\n arrowStyle,\r\n thumbnailSize = 80,\r\n thumbnailGap = 8,\r\n prevArrow,\r\n nextArrow,\r\n ...magnifyProps\r\n } = props;\r\n\r\n const { index, canPrev, canNext, setIndex, prev, next } = useImageSlider({\r\n length: images.length,\r\n defaultIndex,\r\n index: controlledActiveIndex,\r\n onIndexChange,\r\n loop,\r\n });\r\n\r\n const currentSrc = images[index] ?? \"\";\r\n\r\n const thumbStripRef = useRef<HTMLDivElement>(null);\r\n const [hoveredThumb, setHoveredThumb] = useState<number | null>(null);\r\n\r\n /* ---------- preload adjacent images ---------- */\r\n useEffect(() => {\r\n if (!preloadAdjacent || typeof window === \"undefined\") return;\r\n if (images.length <= 1) return;\r\n\r\n const targets = new Set<number>();\r\n targets.add((index + 1) % images.length);\r\n targets.add((index - 1 + images.length) % images.length);\r\n\r\n targets.forEach((i) => {\r\n if (images[i]) {\r\n const img = new Image();\r\n img.src = images[i];\r\n }\r\n });\r\n }, [index, images, preloadAdjacent]);\r\n\r\n /* ---------- keep active thumbnail in view ---------- */\r\n useEffect(() => {\r\n const strip = thumbStripRef.current;\r\n if (!strip) return;\r\n const active = strip.children[index] as HTMLElement | undefined;\r\n if (!active) return;\r\n\r\n const sr = strip.getBoundingClientRect();\r\n const ar = active.getBoundingClientRect();\r\n\r\n if (ar.left < sr.left) {\r\n strip.scrollBy({ left: ar.left - sr.left, behavior: \"smooth\" });\r\n } else if (ar.right > sr.right) {\r\n strip.scrollBy({ left: ar.right - sr.right, behavior: \"smooth\" });\r\n }\r\n }, [index]);\r\n\r\n /* ---------- keyboard navigation ---------- */\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent<HTMLDivElement>) => {\r\n if (!enableKeyboard) return;\r\n if (e.key === \"ArrowLeft\") {\r\n if (!canPrev) return;\r\n e.preventDefault();\r\n prev();\r\n } else if (e.key === \"ArrowRight\") {\r\n if (!canNext) return;\r\n e.preventDefault();\r\n next();\r\n }\r\n },\r\n [enableKeyboard, canPrev, canNext, prev, next],\r\n );\r\n\r\n const hasMultiple = images.length > 1;\r\n\r\n const liveText = useMemo(\r\n () => `Image ${index + 1} of ${images.length}`,\r\n [index, images.length],\r\n );\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={className}\r\n style={style}\r\n role=\"region\"\r\n aria-roledescription=\"carousel\"\r\n aria-label={`${alt} — image gallery`}\r\n >\r\n {/* ---------- Viewport ---------- */}\r\n <div\r\n className={viewportClassName}\r\n style={{\r\n position: \"relative\",\r\n width: \"fit-content\",\r\n maxWidth: \"100%\",\r\n ...viewportStyle,\r\n }}\r\n tabIndex={enableKeyboard && hasMultiple ? 0 : undefined}\r\n onKeyDown={handleKeyDown}\r\n >\r\n <ImageMagnify {...magnifyProps} src={currentSrc} alt={alt} />\r\n\r\n {/* Prev arrow */}\r\n {showArrows && hasMultiple && canPrev && (\r\n <button\r\n type=\"button\"\r\n onClick={prev}\r\n className={arrowClassName}\r\n style={{\r\n ...defaultArrowBaseStyle,\r\n left: 12,\r\n ...arrowStyle,\r\n }}\r\n aria-label=\"Previous image\"\r\n >\r\n {prevArrow ?? <ArrowLeftIcon />}\r\n </button>\r\n )}\r\n\r\n {/* Next arrow */}\r\n {showArrows && hasMultiple && canNext && (\r\n <button\r\n type=\"button\"\r\n onClick={next}\r\n className={arrowClassName}\r\n style={{\r\n ...defaultArrowBaseStyle,\r\n right: 12,\r\n ...arrowStyle,\r\n }}\r\n aria-label=\"Next image\"\r\n >\r\n {nextArrow ?? <ArrowRightIcon />}\r\n </button>\r\n )}\r\n\r\n {/* Counter */}\r\n {showCounter && hasMultiple && (\r\n <div\r\n aria-hidden=\"true\"\r\n style={{\r\n position: \"absolute\",\r\n bottom: 12,\r\n right: 12,\r\n background: \"rgba(0,0,0,0.6)\",\r\n color: \"#fff\",\r\n fontSize: 12,\r\n fontWeight: 600,\r\n padding: \"4px 8px\",\r\n borderRadius: 4,\r\n zIndex: 10,\r\n pointerEvents: \"none\",\r\n }}\r\n >\r\n {index + 1} / {images.length}\r\n </div>\r\n )}\r\n\r\n {/* Screen reader live region */}\r\n <div aria-live=\"polite\" aria-atomic=\"true\" style={visuallyHidden}>\r\n {liveText}\r\n </div>\r\n </div>\r\n\r\n {/* ---------- Thumbnail strip ---------- */}\r\n {showThumbnails && hasMultiple && (\r\n <div\r\n ref={thumbStripRef}\r\n className={thumbnailContainerClassName}\r\n role=\"tablist\"\r\n aria-label=\"Choose image\"\r\n style={{\r\n ...defaultThumbStripStyle,\r\n gap: thumbnailGap,\r\n marginTop: 12,\r\n ...thumbnailContainerStyle,\r\n }}\r\n >\r\n {images.map((img, idx) => {\r\n const isActive = idx === index;\r\n const isHovered = idx === hoveredThumb;\r\n\r\n const cls = isActive\r\n ? thumbnailActiveClassName\r\n : thumbnailClassName;\r\n\r\n return (\r\n <button\r\n key={idx}\r\n type=\"button\"\r\n role=\"tab\"\r\n onClick={() => setIndex(idx)}\r\n onMouseEnter={() => setHoveredThumb(idx)}\r\n onMouseLeave={() => setHoveredThumb(null)}\r\n className={cls}\r\n style={{\r\n ...defaultThumbBaseStyle,\r\n width: thumbnailSize,\r\n height: thumbnailSize,\r\n ...thumbnailStyle,\r\n ...(isActive ? defaultThumbActiveStyle : undefined),\r\n ...(isActive ? thumbnailActiveStyle : undefined),\r\n ...(isHovered && !isActive\r\n ? { borderColor: \"#999\" }\r\n : undefined),\r\n }}\r\n aria-label={`View image ${idx + 1} of ${images.length}`}\r\n aria-selected={isActive}\r\n >\r\n <img\r\n src={img}\r\n alt=\"\"\r\n loading=\"lazy\"\r\n draggable={false}\r\n style={{\r\n width: \"100%\",\r\n height: \"100%\",\r\n objectFit: \"contain\",\r\n display: \"block\",\r\n pointerEvents: \"none\",\r\n userSelect: \"none\",\r\n }}\r\n />\r\n </button>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n});\r\n\r\nImageMagnifyGallery.displayName = \"ImageMagnifyGallery\";\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useImageMagnify.ts","../src/hooks/useMediaQuery.ts","../src/components/ImageMagnify.tsx","../src/components/ImageMagnifyGallery.tsx","../src/hooks/useImageSlider.ts"],"names":["useLayoutEffect","useEffect","useState","useRef","useCallback","useIsoLayoutEffect","forwardRef","jsxs","jsx","modules","useMemo","Navigation","Thumbs","Keyboard","Swiper","SwiperSlide","Fragment","next"],"mappings":"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","file":"index.cjs","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 { forwardRef, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport type { CSSProperties, ReactNode } from \"react\";\r\nimport { Swiper, SwiperSlide } from \"swiper/react\";\r\nimport { Navigation, Thumbs, Keyboard } from \"swiper/modules\";\r\nimport type { Swiper as SwiperClass } from \"swiper\";\r\nimport \"swiper/css\";\r\nimport \"swiper/css/navigation\";\r\nimport \"swiper/css/thumbs\";\r\n\r\nimport { ImageMagnify } from \"./ImageMagnify\";\r\nimport type { ImageMagnifyProps } from \"./ImageMagnify\";\r\n\r\nexport interface ImageMagnifyGalleryProps extends Omit<\r\n ImageMagnifyProps,\r\n \"src\" | \"onLoad\" | \"onError\"\r\n> {\r\n images: string[];\r\n alt: string;\r\n activeIndex?: number;\r\n defaultIndex?: number;\r\n onIndexChange?: (index: number) => void;\r\n\r\n showArrows?: boolean;\r\n showThumbnails?: boolean;\r\n showCounter?: boolean;\r\n loop?: boolean;\r\n enableKeyboard?: boolean;\r\n preloadAdjacent?: boolean;\r\n\r\n className?: string;\r\n style?: CSSProperties;\r\n viewportClassName?: string;\r\n viewportStyle?: CSSProperties;\r\n thumbnailContainerClassName?: string;\r\n thumbnailContainerStyle?: CSSProperties;\r\n thumbnailClassName?: string;\r\n thumbnailActiveClassName?: string;\r\n thumbnailStyle?: CSSProperties;\r\n thumbnailActiveStyle?: CSSProperties;\r\n arrowClassName?: string;\r\n arrowStyle?: CSSProperties;\r\n thumbnailSize?: number;\r\n thumbnailGap?: number;\r\n\r\n prevArrow?: ReactNode;\r\n nextArrow?: ReactNode;\r\n}\r\n\r\nconst ArrowLeftIcon = () => (\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n width=\"20\"\r\n height=\"20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <polyline points=\"15 18 9 12 15 6\" />\r\n </svg>\r\n);\r\n\r\nconst ArrowRightIcon = () => (\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n width=\"20\"\r\n height=\"20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <polyline points=\"9 18 15 12 9 6\" />\r\n </svg>\r\n);\r\n\r\nconst defaultArrowBaseStyle: CSSProperties = {\r\n position: \"absolute\",\r\n top: \"50%\",\r\n transform: \"translateY(-50%)\",\r\n width: 40,\r\n height: 40,\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n border: \"1px solid rgba(0,0,0,0.12)\",\r\n borderRadius: 9999,\r\n boxShadow: \"0 4px 12px rgba(0,0,0,0.15)\",\r\n cursor: \"pointer\",\r\n zIndex: 10,\r\n color: \"#111\",\r\n padding: 0,\r\n transition: \"background 0.15s ease\",\r\n backdropFilter: \"blur(4px)\",\r\n WebkitBackdropFilter: \"blur(4px)\",\r\n};\r\n\r\nconst defaultThumbBaseStyle: CSSProperties = {\r\n flexShrink: 0,\r\n padding: 0,\r\n border: \"2px solid #e5e5e5\",\r\n background: \"#fff\",\r\n cursor: \"pointer\",\r\n overflow: \"hidden\",\r\n transition: \"border-color 0.15s ease\",\r\n borderRadius: 2,\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n};\r\n\r\nconst defaultThumbActiveStyle: CSSProperties = {\r\n borderColor: \"#111\",\r\n};\r\n\r\nconst visuallyHidden: CSSProperties = {\r\n position: \"absolute\",\r\n width: 1,\r\n height: 1,\r\n padding: 0,\r\n margin: -1,\r\n overflow: \"hidden\",\r\n clip: \"rect(0,0,0,0)\",\r\n whiteSpace: \"nowrap\",\r\n border: 0,\r\n};\r\n\r\nexport const ImageMagnifyGallery = forwardRef<\r\n HTMLDivElement,\r\n ImageMagnifyGalleryProps\r\n>((props, ref) => {\r\n const {\r\n images,\r\n alt,\r\n activeIndex: controlledActiveIndex,\r\n defaultIndex = 0,\r\n onIndexChange,\r\n showArrows = true,\r\n showThumbnails = true,\r\n showCounter = false,\r\n loop = true,\r\n enableKeyboard = true,\r\n preloadAdjacent = true,\r\n className,\r\n style,\r\n viewportClassName,\r\n viewportStyle,\r\n thumbnailContainerClassName,\r\n thumbnailContainerStyle,\r\n thumbnailClassName,\r\n thumbnailActiveClassName,\r\n thumbnailStyle,\r\n thumbnailActiveStyle,\r\n arrowClassName,\r\n arrowStyle,\r\n thumbnailSize = 80,\r\n thumbnailGap = 8,\r\n prevArrow,\r\n nextArrow,\r\n width,\r\n ...magnifyProps\r\n } = props;\r\n\r\n const [swiper, setSwiper] = useState<SwiperClass | null>(null);\r\n const [thumbsSwiper, setThumbsSwiper] = useState<SwiperClass | null>(null);\r\n const [localIndex, setLocalIndex] = useState(defaultIndex);\r\n\r\n const prevRef = useRef<HTMLButtonElement>(null);\r\n const nextRef = useRef<HTMLButtonElement>(null);\r\n\r\n const isControlled = controlledActiveIndex !== undefined;\r\n const activeIndex = isControlled ? controlledActiveIndex : localIndex;\r\n const hasMultiple = images.length > 1;\r\n\r\n /* ---------- controlled sync ---------- */\r\n useEffect(() => {\r\n if (!swiper || swiper.destroyed) return;\r\n if (isControlled && swiper.activeIndex !== controlledActiveIndex) {\r\n swiper.slideTo(controlledActiveIndex);\r\n }\r\n }, [isControlled, controlledActiveIndex, swiper]);\r\n\r\n /* ---------- preload neighbours ---------- */\r\n useEffect(() => {\r\n if (!preloadAdjacent || typeof window === \"undefined\" || images.length <= 1)\r\n return;\r\n const targets = new Set([\r\n (activeIndex + 1) % images.length,\r\n (activeIndex - 1 + images.length) % images.length,\r\n ]);\r\n targets.forEach((i) => {\r\n if (images[i]) {\r\n const img = new Image();\r\n img.src = images[i];\r\n }\r\n });\r\n }, [activeIndex, images, preloadAdjacent]);\r\n\r\n const modules = useMemo(() => {\r\n const m = [Navigation, Thumbs];\r\n if (enableKeyboard) m.push(Keyboard);\r\n return m;\r\n }, [enableKeyboard]);\r\n\r\n if (images.length === 0) {\r\n return <div ref={ref} className={className} style={style} />;\r\n }\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={className}\r\n style={{ maxWidth: \"100%\", width, ...style }}\r\n role=\"region\"\r\n aria-roledescription=\"carousel\"\r\n aria-label={`${alt} — image gallery`}\r\n >\r\n <div\r\n className={viewportClassName}\r\n style={{ position: \"relative\", width: \"100%\", ...viewportStyle }}\r\n >\r\n <Swiper\r\n modules={modules}\r\n onSwiper={setSwiper}\r\n initialSlide={isControlled ? controlledActiveIndex : defaultIndex}\r\n onSlideChange={(s) => {\r\n if (!isControlled) setLocalIndex(s.activeIndex);\r\n onIndexChange?.(s.activeIndex);\r\n }}\r\n onBeforeInit={(s) => {\r\n if (!showArrows || !hasMultiple) return;\r\n if (\r\n s.params.navigation &&\r\n typeof s.params.navigation === \"object\"\r\n ) {\r\n s.params.navigation.prevEl = prevRef.current;\r\n s.params.navigation.nextEl = nextRef.current;\r\n }\r\n }}\r\n navigation={showArrows && hasMultiple ? {} : false}\r\n keyboard={enableKeyboard ? { enabled: true } : undefined}\r\n thumbs={{\r\n swiper:\r\n thumbsSwiper && !thumbsSwiper.destroyed ? thumbsSwiper : null,\r\n }}\r\n loop={loop && hasMultiple}\r\n autoHeight\r\n spaceBetween={10}\r\n style={\r\n {\r\n width: \"100%\",\r\n \"--swiper-navigation-size\": \"20px\",\r\n ...arrowStyle,\r\n } as CSSProperties\r\n }\r\n >\r\n {images.map((src, idx) => (\r\n <SwiperSlide key={idx}>\r\n <ImageMagnify\r\n {...magnifyProps}\r\n src={src}\r\n alt={alt}\r\n width=\"100%\"\r\n />\r\n </SwiperSlide>\r\n ))}\r\n </Swiper>\r\n\r\n {/* custom arrows overlay */}\r\n {showArrows && hasMultiple && (\r\n <>\r\n <button\r\n ref={prevRef}\r\n type=\"button\"\r\n className={arrowClassName}\r\n style={{ ...defaultArrowBaseStyle, left: 12 }}\r\n aria-label=\"Previous image\"\r\n >\r\n {prevArrow ?? <ArrowLeftIcon />}\r\n </button>\r\n <button\r\n ref={nextRef}\r\n type=\"button\"\r\n className={arrowClassName}\r\n style={{ ...defaultArrowBaseStyle, right: 12 }}\r\n aria-label=\"Next image\"\r\n >\r\n {nextArrow ?? <ArrowRightIcon />}\r\n </button>\r\n </>\r\n )}\r\n\r\n {/* counter */}\r\n {showCounter && hasMultiple && (\r\n <div\r\n aria-hidden=\"true\"\r\n style={{\r\n position: \"absolute\",\r\n top: 12,\r\n right: 12,\r\n background: \"rgba(0,0,0,0.6)\",\r\n color: \"#fff\",\r\n fontSize: 12,\r\n fontWeight: 600,\r\n padding: \"4px 8px\",\r\n borderRadius: 4,\r\n zIndex: 10,\r\n pointerEvents: \"none\",\r\n }}\r\n >\r\n {activeIndex + 1} / {images.length}\r\n </div>\r\n )}\r\n\r\n {/* live region for screen readers */}\r\n <div aria-live=\"polite\" aria-atomic=\"true\" style={visuallyHidden}>\r\n Image {activeIndex + 1} of {images.length}\r\n </div>\r\n </div>\r\n\r\n {/* thumbnails */}\r\n {showThumbnails && hasMultiple && (\r\n <Swiper\r\n modules={modules}\r\n onSwiper={setSwiper}\r\n initialSlide={isControlled ? controlledActiveIndex : defaultIndex}\r\n onSlideChange={(s) => {\r\n if (!isControlled) setLocalIndex(s.activeIndex);\r\n onIndexChange?.(s.activeIndex);\r\n }}\r\n onBeforeInit={(s) => {\r\n if (!showArrows || !hasMultiple) return;\r\n const nav = s.params.navigation;\r\n if (nav && typeof nav === \"object\") {\r\n (nav as { prevEl?: HTMLElement | null }).prevEl = prevRef.current;\r\n (nav as { nextEl?: HTMLElement | null }).nextEl = nextRef.current;\r\n }\r\n }}\r\n navigation={showArrows && hasMultiple ? {} : false}\r\n keyboard={enableKeyboard ? { enabled: true } : undefined}\r\n thumbs={{\r\n swiper:\r\n thumbsSwiper && !thumbsSwiper.destroyed ? thumbsSwiper : null,\r\n }}\r\n loop={loop && hasMultiple}\r\n autoHeight\r\n spaceBetween={10}\r\n style={{ width: \"100%\" }}\r\n >\r\n {images.map((src, idx) => (\r\n <SwiperSlide key={idx}>\r\n <ImageMagnify\r\n {...magnifyProps}\r\n src={src}\r\n alt={alt}\r\n width=\"100%\"\r\n />\r\n </SwiperSlide>\r\n ))}\r\n </Swiper>\r\n )}\r\n </div>\r\n );\r\n});\r\n\r\nImageMagnifyGallery.displayName = \"ImageMagnifyGallery\";\r\n","import { useCallback, useState } from \"react\";\r\n\r\nexport interface UseImageSliderOptions {\r\n /** Total number of items in the slider. */\r\n length: number;\r\n /** Initial index when uncontrolled. Default `0`. */\r\n defaultIndex?: number;\r\n /** Controlled index. When provided, `defaultIndex` is ignored. */\r\n index?: number;\r\n /** Fired whenever the index changes. */\r\n onIndexChange?: (index: number) => void;\r\n /** Wrap around at the ends. Default `true`. */\r\n loop?: boolean;\r\n}\r\n\r\nexport interface UseImageSliderReturn {\r\n /** Current (clamped) index. */\r\n index: number;\r\n /** Whether a previous item exists (always `true` when `loop`). */\r\n canPrev: boolean;\r\n /** Whether a next item exists (always `true` when `loop`). */\r\n canNext: boolean;\r\n /** Go to a specific index. */\r\n setIndex: (next: number) => void;\r\n /** Go to previous item. */\r\n prev: () => void;\r\n /** Go to next item. */\r\n next: () => void;\r\n}\r\n\r\n/**\r\n * Headless, SSR-safe slider state. No DOM APIs, no browser globals.\r\n */\r\nexport function useImageSlider({\r\n length,\r\n defaultIndex = 0,\r\n index: controlledIndex,\r\n onIndexChange,\r\n loop = true,\r\n}: UseImageSliderOptions): UseImageSliderReturn {\r\n const [internalIndex, setInternalIndex] = useState(defaultIndex);\r\n\r\n const safeLength = Math.max(1, length);\r\n const rawIndex = controlledIndex ?? internalIndex;\r\n const index = Math.max(0, Math.min(safeLength - 1, rawIndex));\r\n\r\n const setIndex = useCallback(\r\n (next: number) => {\r\n if (length <= 0) return;\r\n\r\n let resolved: number;\r\n if (loop) {\r\n resolved = ((next % safeLength) + safeLength) % safeLength;\r\n } else {\r\n resolved = Math.max(0, Math.min(safeLength - 1, next));\r\n }\r\n\r\n if (resolved === index) return;\r\n\r\n if (controlledIndex === undefined) {\r\n setInternalIndex(resolved);\r\n }\r\n onIndexChange?.(resolved);\r\n },\r\n [length, safeLength, loop, index, controlledIndex, onIndexChange],\r\n );\r\n\r\n const prev = useCallback(() => setIndex(index - 1), [setIndex, index]);\r\n const next = useCallback(() => setIndex(index + 1), [setIndex, index]);\r\n\r\n return {\r\n index,\r\n canPrev: loop || index > 0,\r\n canNext: loop || index < safeLength - 1,\r\n setIndex,\r\n prev,\r\n next,\r\n };\r\n}\r\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,62 +1,35 @@
|
|
|
1
|
-
import { I as ImageMagnifyProps } from './ImageMagnify-
|
|
2
|
-
export { D as DragMode, a as ImageMagnify, L as LensShape, M as MagnifyMode, P as PanePosition, U as UseImageMagnifyOptions, Z as ZoomType, u as useImageMagnify } from './ImageMagnify-
|
|
1
|
+
import { I as ImageMagnifyProps } from './ImageMagnify-DssaU7jS.cjs';
|
|
2
|
+
export { D as DragMode, a as ImageMagnify, L as LensShape, M as MagnifyMode, P as PanePosition, U as UseImageMagnifyOptions, Z as ZoomType, u as useImageMagnify } from './ImageMagnify-DssaU7jS.cjs';
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { CSSProperties, ReactNode } from 'react';
|
|
5
5
|
|
|
6
6
|
interface ImageMagnifyGalleryProps extends Omit<ImageMagnifyProps, "src" | "onLoad" | "onError"> {
|
|
7
|
-
/** Array of image URLs to display in the gallery. */
|
|
8
7
|
images: string[];
|
|
9
|
-
/** Alt text applied to every image. */
|
|
10
8
|
alt: string;
|
|
11
|
-
/** Controlled active index. */
|
|
12
9
|
activeIndex?: number;
|
|
13
|
-
/** Uncontrolled initial index. Default `0`. */
|
|
14
10
|
defaultIndex?: number;
|
|
15
|
-
/** Fired whenever the active index changes. */
|
|
16
11
|
onIndexChange?: (index: number) => void;
|
|
17
|
-
/** Show prev/next arrow buttons. Default `true`. */
|
|
18
12
|
showArrows?: boolean;
|
|
19
|
-
/** Show the thumbnail strip. Default `true`. */
|
|
20
13
|
showThumbnails?: boolean;
|
|
21
|
-
/** Show an "X / Y" counter badge. Default `false`. */
|
|
22
14
|
showCounter?: boolean;
|
|
23
|
-
/** Wrap around at the ends. Default `true`. */
|
|
24
15
|
loop?: boolean;
|
|
25
|
-
/** Enable ← / → keyboard navigation on the viewport. Default `true`. */
|
|
26
16
|
enableKeyboard?: boolean;
|
|
27
|
-
/** Preload adjacent images. Default `true`. */
|
|
28
17
|
preloadAdjacent?: boolean;
|
|
29
|
-
/** Extra className applied to the outer wrapper. */
|
|
30
18
|
className?: string;
|
|
31
|
-
/** Inline style applied to the outer wrapper. */
|
|
32
19
|
style?: CSSProperties;
|
|
33
|
-
/** className applied to the viewport (element that holds the image + arrows). */
|
|
34
20
|
viewportClassName?: string;
|
|
35
|
-
/** Inline style applied to the viewport. */
|
|
36
21
|
viewportStyle?: CSSProperties;
|
|
37
|
-
/** className applied to the thumbnail strip container. */
|
|
38
22
|
thumbnailContainerClassName?: string;
|
|
39
|
-
/** Inline style applied to the thumbnail strip container. */
|
|
40
23
|
thumbnailContainerStyle?: CSSProperties;
|
|
41
|
-
/** className applied to *each* thumbnail button. */
|
|
42
24
|
thumbnailClassName?: string;
|
|
43
|
-
/** className applied to the *active* thumbnail button. */
|
|
44
25
|
thumbnailActiveClassName?: string;
|
|
45
|
-
/** Inline style applied to *each* thumbnail button. */
|
|
46
26
|
thumbnailStyle?: CSSProperties;
|
|
47
|
-
/** Inline style applied to the *active* thumbnail button. */
|
|
48
27
|
thumbnailActiveStyle?: CSSProperties;
|
|
49
|
-
/** className applied to both arrow buttons. */
|
|
50
28
|
arrowClassName?: string;
|
|
51
|
-
/** Inline style applied to both arrow buttons. */
|
|
52
29
|
arrowStyle?: CSSProperties;
|
|
53
|
-
/** Thumbnail size in px (square). Default `80`. */
|
|
54
30
|
thumbnailSize?: number;
|
|
55
|
-
/** Gap between thumbnails in px. Default `8`. */
|
|
56
31
|
thumbnailGap?: number;
|
|
57
|
-
/** Custom content for the previous arrow. */
|
|
58
32
|
prevArrow?: ReactNode;
|
|
59
|
-
/** Custom content for the next arrow. */
|
|
60
33
|
nextArrow?: ReactNode;
|
|
61
34
|
}
|
|
62
35
|
declare const ImageMagnifyGallery: React.ForwardRefExoticComponent<ImageMagnifyGalleryProps & React.RefAttributes<HTMLDivElement>>;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,62 +1,35 @@
|
|
|
1
|
-
import { I as ImageMagnifyProps } from './ImageMagnify-
|
|
2
|
-
export { D as DragMode, a as ImageMagnify, L as LensShape, M as MagnifyMode, P as PanePosition, U as UseImageMagnifyOptions, Z as ZoomType, u as useImageMagnify } from './ImageMagnify-
|
|
1
|
+
import { I as ImageMagnifyProps } from './ImageMagnify-DssaU7jS.js';
|
|
2
|
+
export { D as DragMode, a as ImageMagnify, L as LensShape, M as MagnifyMode, P as PanePosition, U as UseImageMagnifyOptions, Z as ZoomType, u as useImageMagnify } from './ImageMagnify-DssaU7jS.js';
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { CSSProperties, ReactNode } from 'react';
|
|
5
5
|
|
|
6
6
|
interface ImageMagnifyGalleryProps extends Omit<ImageMagnifyProps, "src" | "onLoad" | "onError"> {
|
|
7
|
-
/** Array of image URLs to display in the gallery. */
|
|
8
7
|
images: string[];
|
|
9
|
-
/** Alt text applied to every image. */
|
|
10
8
|
alt: string;
|
|
11
|
-
/** Controlled active index. */
|
|
12
9
|
activeIndex?: number;
|
|
13
|
-
/** Uncontrolled initial index. Default `0`. */
|
|
14
10
|
defaultIndex?: number;
|
|
15
|
-
/** Fired whenever the active index changes. */
|
|
16
11
|
onIndexChange?: (index: number) => void;
|
|
17
|
-
/** Show prev/next arrow buttons. Default `true`. */
|
|
18
12
|
showArrows?: boolean;
|
|
19
|
-
/** Show the thumbnail strip. Default `true`. */
|
|
20
13
|
showThumbnails?: boolean;
|
|
21
|
-
/** Show an "X / Y" counter badge. Default `false`. */
|
|
22
14
|
showCounter?: boolean;
|
|
23
|
-
/** Wrap around at the ends. Default `true`. */
|
|
24
15
|
loop?: boolean;
|
|
25
|
-
/** Enable ← / → keyboard navigation on the viewport. Default `true`. */
|
|
26
16
|
enableKeyboard?: boolean;
|
|
27
|
-
/** Preload adjacent images. Default `true`. */
|
|
28
17
|
preloadAdjacent?: boolean;
|
|
29
|
-
/** Extra className applied to the outer wrapper. */
|
|
30
18
|
className?: string;
|
|
31
|
-
/** Inline style applied to the outer wrapper. */
|
|
32
19
|
style?: CSSProperties;
|
|
33
|
-
/** className applied to the viewport (element that holds the image + arrows). */
|
|
34
20
|
viewportClassName?: string;
|
|
35
|
-
/** Inline style applied to the viewport. */
|
|
36
21
|
viewportStyle?: CSSProperties;
|
|
37
|
-
/** className applied to the thumbnail strip container. */
|
|
38
22
|
thumbnailContainerClassName?: string;
|
|
39
|
-
/** Inline style applied to the thumbnail strip container. */
|
|
40
23
|
thumbnailContainerStyle?: CSSProperties;
|
|
41
|
-
/** className applied to *each* thumbnail button. */
|
|
42
24
|
thumbnailClassName?: string;
|
|
43
|
-
/** className applied to the *active* thumbnail button. */
|
|
44
25
|
thumbnailActiveClassName?: string;
|
|
45
|
-
/** Inline style applied to *each* thumbnail button. */
|
|
46
26
|
thumbnailStyle?: CSSProperties;
|
|
47
|
-
/** Inline style applied to the *active* thumbnail button. */
|
|
48
27
|
thumbnailActiveStyle?: CSSProperties;
|
|
49
|
-
/** className applied to both arrow buttons. */
|
|
50
28
|
arrowClassName?: string;
|
|
51
|
-
/** Inline style applied to both arrow buttons. */
|
|
52
29
|
arrowStyle?: CSSProperties;
|
|
53
|
-
/** Thumbnail size in px (square). Default `80`. */
|
|
54
30
|
thumbnailSize?: number;
|
|
55
|
-
/** Gap between thumbnails in px. Default `8`. */
|
|
56
31
|
thumbnailGap?: number;
|
|
57
|
-
/** Custom content for the previous arrow. */
|
|
58
32
|
prevArrow?: ReactNode;
|
|
59
|
-
/** Custom content for the next arrow. */
|
|
60
33
|
nextArrow?: ReactNode;
|
|
61
34
|
}
|
|
62
35
|
declare const ImageMagnifyGallery: React.ForwardRefExoticComponent<ImageMagnifyGalleryProps & React.RefAttributes<HTMLDivElement>>;
|