react-motion-gallery 2.0.2 → 2.0.4
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/FullscreenRuntime-CEYIXWZZ.mjs +2666 -0
- package/dist/FullscreenRuntime-CEYIXWZZ.mjs.map +1 -0
- package/dist/FullscreenRuntime-D6G3BRAU.css +123 -0
- package/dist/FullscreenRuntime-D6G3BRAU.css.map +1 -0
- package/dist/chunk-HOCUKMYX.mjs +2634 -0
- package/dist/chunk-HOCUKMYX.mjs.map +1 -0
- package/dist/index.css +16 -16
- package/dist/index.css.map +1 -1
- package/dist/index.d.mts +5 -5
- package/dist/index.mjs +2791 -8037
- package/dist/index.mjs.map +1 -1
- package/dist/metafile-esm.json +1 -1
- package/package.json +5 -6
- package/dist/index.d.ts +0 -534
- package/dist/index.js +0 -12669
- package/dist/index.js.map +0 -1
- package/dist/metafile-cjs.json +0 -1
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/Gallery/index.tsx","../src/Gallery/fullscreen/FullscreenSlider.tsx","../src/Gallery/fullscreen/FullscreenSlider.module.css","../src/Gallery/shared/input/dragTracker.ts","../src/Gallery/shared/motion/vector1d.ts","../src/Gallery/shared/motion/scrollBody.ts","../src/Gallery/shared/motion/limit.ts","../src/Gallery/shared/motion/scrollLooper.ts","../src/Gallery/shared/motion/scrollTarget.ts","../src/Gallery/shared/motion/eventStore.ts","../src/Gallery/shared/motion/animations.ts","../src/Gallery/shared/input/pointerTypes.ts","../src/Gallery/shared/types/axis.ts","../src/Gallery/shared/motion/translate.ts","../src/Gallery/shared/motion/baseLimit.ts","../src/Gallery/shared/motion/counter.ts","../src/Gallery/fullscreen/FullscreenModal.tsx","../src/Gallery/shared/transitions/objectPosition.ts","../src/Gallery/shared/transitions/objectFitTransform.ts","../src/Gallery/slider/Slider.tsx","../src/Gallery/slider/Slider.module.css","../src/Gallery/slider/sliderSub.tsx","../src/Gallery/shared/motion/scrollBounds.ts","../src/Gallery/shared/slideContext.tsx","../src/Gallery/fullscreen/gestureShield.ts","../src/Gallery/shared/responsive.ts","../src/Gallery/shared/skeleton/buildScopedSkeletonCountCss.ts","../src/Gallery/slider/effects/useParallaxEffect.ts","../src/Gallery/slider/effects/useScaleEffect.ts","../src/Gallery/slider/effects/useFadeEffect.ts","../src/Gallery/slider/controls/arrows.tsx","../src/Gallery/slider/controls/dots.tsx","../src/Gallery/slider/controls/progress.tsx","../src/Gallery/fullscreen/fullscreenIntro.tsx","../src/Gallery/index.module.css","../src/Gallery/slider/thumbnails/ThumbnailSlider.tsx","../src/Gallery/slider/thumbnails/ThumbnailSlider.module.css","../src/Gallery/fullscreen/fullscreenSliderSub.tsx","../src/Gallery/fullscreen/FullscreenThumbnailSlider.tsx","../src/Gallery/grid/GridLayout.tsx","../src/Gallery/shared/hooks/useInViewOnce.ts","../src/Gallery/shared/hooks/useMediaReady.ts","../src/Gallery/masonry/MasonryLayout.tsx","../src/Gallery/masonry/Masonry.tsx","../src/Gallery/entries/defaults.ts","../src/Gallery/entries/hooks/useEntryInView.ts","../src/Gallery/entries/hooks/useEntryDecodeReady.ts","../src/Gallery/entries/normalize.ts","../src/Gallery/entries/components/EntryList.tsx","../src/Gallery/entries/components/EntrySkeleton.tsx","../src/Gallery/shared/hooks/useViewportWidth.ts","../src/Gallery/shared/normalize/normalizeLoading.ts","../src/Gallery/shared/normalize/normalizeIntro.ts","../src/Gallery/entries/overlay/useFsEntryOverlay.tsx","../src/Gallery/entries/overlay/FsEntryOverlayMount.tsx","../src/Gallery/masonry/buildMasonryChildren.tsx","../src/Gallery/zoomPan/core/utils.ts","../src/Gallery/zoomPan/core/dom.ts","../src/Gallery/zoomPan/zoom/zoomTo.ts","../src/Gallery/zoomPan/zoom/handleZoomToggle.ts","../src/Gallery/zoomPan/core/rebuildPanBodies.ts","../src/Gallery/zoomPan/pan/usePanAnimation.ts","../src/Gallery/zoomPan/pan/usePanDrag.ts","../src/Gallery/zoomPan/pan/index.ts","../src/Gallery/video/plyr.ts","../src/Gallery/zoomPan/zoom/forceResetZoom.ts","../src/Gallery/zoomPan/zoom/resetZoomForSlideChange.ts","../src/Gallery/zoomPan/pan/resetPanForScale1.ts","../src/Gallery/zoomPan/core/boundsForCurrent.ts","../src/Gallery/fullscreen/hooks/useWrappedItemsAndRefs.ts","../src/Gallery/shared/hooks/useWindowSize.ts","../src/Gallery/video/usePlyrProps.ts","../src/Gallery/video/plyrGuards.ts","../src/Gallery/video/LazyPlyr.tsx","../src/Gallery/fullscreen/renderFullscreenSlides.tsx","../src/Gallery/fullscreen/transforms.ts","../src/Gallery/zoomPan/zoom/useGlobalPinchZoom.ts","../src/Gallery/shared/types/media.ts","../src/Gallery/fullscreen/defaults.ts","../src/Gallery/slider/thumbnails/defaults.ts","../src/Gallery/slider/defaults.ts","../src/Gallery/grid/defaults.ts","../src/Gallery/masonry/defaults.ts","../src/Gallery/video/fullscreenPlayerStyle.ts","../src/Gallery/video/RmgPlyrVideo.tsx"],"sourcesContent":["export { default as Gallery } from \"./Gallery/index\";\nexport { RmgPlyrVideo } from \"./Gallery/video/RmgPlyrVideo\";","/* eslint-disable @typescript-eslint/no-explicit-any */\n'use client'\n\nimport React, { useState, useEffect, useRef, useCallback, useMemo, ReactNode, useImperativeHandle } from \"react\";\nimport FullscreenSlider, { FullscreenSliderHandle } from \"./fullscreen/FullscreenSlider\";\nimport FullscreenModal from \"./fullscreen/FullscreenModal\";\nimport Slider from './slider/Slider';\nimport styles from './index.module.css';\nimport type { APITypes } from \"plyr-react\";\nimport ThumbnailSlider from \"./slider/thumbnails/ThumbnailSlider\";\nimport createIndexChannel from \"./slider/sliderSub\";\nimport { createFullscreenSliderSub } from './fullscreen/fullscreenSliderSub';\nimport FullscreenThumbnailSlider from \"./fullscreen/FullscreenThumbnailSlider\";\nimport { createRoot } from 'react-dom/client';\nimport { ScrollBody, ScrollBodyType } from \"./shared/motion/scrollBody\";\nimport { AnimationsType } from \"./shared/motion/animations\";\nimport { ScrollBounds, ScrollBoundsType } from \"./shared/motion/scrollBounds\";\nimport { Vector1D, Vector1DType } from \"./shared/motion/vector1d\";\nimport { GridLayout } from \"./grid/GridLayout\";\nimport { MasonryLayout } from \"./masonry/MasonryLayout\";\nimport { BREAKPOINT_MAP, BreakpointMap, resolveNumberFromResponsive, resolvePositionFromResponsive } from \"./shared/responsive\";\nimport { DEFAULT_ENTRIES, EntriesOptions, EntryList, MediaEntryLink, SlideOwner } from \"./entries\";\nimport { useViewportWidth } from \"./shared/hooks/useViewportWidth\";\nimport { normalizeLoading } from \"./shared/normalize/normalizeLoading\";\nimport { normalizeIntro } from \"./shared/normalize/normalizeIntro\";\nimport { createGestureShield } from \"./fullscreen/gestureShield\";\nimport { useFsEntryOverlay } from \"./entries/overlay/useFsEntryOverlay\";\nimport { FsEntryOverlayMount } from \"./entries/overlay/FsEntryOverlayMount\";\nimport { buildMasonryChildren } from \"./masonry/buildMasonryChildren\";\nimport { baseFitSizeC, distance, midpoint } from \"./zoomPan/core/utils\";\nimport { findImgAtPoint, getPrimaryImgEl, readDataIndex } from \"./zoomPan/core/dom\";\nimport { zoomTo } from \"./zoomPan/zoom/zoomTo\";\nimport { handleZoomToggle } from \"./zoomPan/zoom/handleZoomToggle\";\nimport { rebuildPanBodiesFn } from \"./zoomPan/core/rebuildPanBodies\";\nimport { usePanRuntime } from \"./zoomPan/pan\";\nimport { forceResetZoom as forceResetZoomFn } from \"./zoomPan/zoom/forceResetZoom\";\nimport { resetZoomForSlideChange as resetZoomForSlideChangeFn } from \"./zoomPan/zoom/resetZoomForSlideChange\";\nimport { resetPanForScale1 as resetPanForScale1Fn } from \"./zoomPan/pan/resetPanForScale1\";\nimport { boundsForCurrent as boundsForCurrentFn } from \"./zoomPan/core/boundsForCurrent\";\nimport { useWrappedItemsAndRefs } from \"./fullscreen/hooks/useWrappedItemsAndRefs\";\nimport { useWindowSize } from \"./shared/hooks/useWindowSize\";\nimport { usePlyrProps } from \"./video/usePlyrProps\";\nimport { renderFullscreenSlides } from \"./fullscreen/renderFullscreenSlides\";\nimport { createSingleTransform, createWrappedTransform } from \"./fullscreen/transforms\";\nimport { useGlobalPinchZoom } from \"./zoomPan/zoom/useGlobalPinchZoom\";\nimport { MediaItem, toMediaItems } from \"./shared/types/media\";\nimport { ElementStyle } from \"./shared/types/elements\";\nimport { FsCaptionPlacement, FullscreenOptions } from \"./fullscreen/types\";\nimport { MasonryOptions } from \"./masonry/types\";\nimport { GridOptions } from \"./grid/types\";\nimport { SliderHandle, SliderOptions } from \"./slider/types\";\nimport { GalleryApi, IndexMode } from \"./api/types\";\nimport { DEFAULT_FULLSCREEN } from \"./fullscreen/defaults\";\nimport { DEFAULT_SLIDER } from \"./slider/defaults\";\nimport { DEFAULT_GRID } from \"./grid/defaults\";\nimport { DEFAULT_MASONRY } from \"./masonry/defaults\";\nimport { defaultPlayerStyle } from \"./video/fullscreenPlayerStyle\";\nimport { runFullscreenIntro } from \"./fullscreen/fullscreenIntro\";\nimport { PanAxis as Axis, PanAxisType as AxisType } from \"./shared/types/axis\";\n\nfunction useOpenEpoch(open: boolean) {\n const [epoch, setEpoch] = useState(0);\n const prev = useRef(open);\n useEffect(() => {\n if (open && !prev.current) setEpoch(e => e + 1);\n prev.current = open;\n }, [open]);\n return epoch;\n}\n\ntype Props = { \n children?: ReactNode;\n fullscreen?: FullscreenOptions;\n slider?: SliderOptions;\n layout?: 'slider' | 'grid' | 'masonry' | 'entries';\n grid?: GridOptions;\n masonry?: MasonryOptions;\n entries?: EntriesOptions;\n breakpoints?: BreakpointMap;\n root?: ElementStyle;\n container?: ElementStyle;\n};\n\nconst Gallery = React.forwardRef<GalleryApi, Props>(function Gallery({ \n children,\n fullscreen,\n slider,\n layout = \"slider\",\n grid,\n masonry,\n entries,\n breakpoints,\n root,\n container,\n}: Props, ref) {\n const indexChannel = useMemo(() => createIndexChannel(), [])\n const fsSub = useMemo(() => createFullscreenSliderSub(0), []);\n const [slideIndex, setSlideIndex] = useState(0);\n const isClick = useRef(false);\n const isZoomClick = useRef(false);\n const imageRefs = useRef<React.RefObject<HTMLDivElement | null>[]>([]);\n const [showFullscreenSlider, setShowFullscreenSlider] = useState(false);\n const fullscreenSliderApi = useRef<FullscreenSliderHandle>(null);\n const isZooming = useRef(false);\n const expandableImgRefs = useRef<any>([]);\n const overlayDivRef = useRef<HTMLDivElement | null>(null);\n const duplicateImgRef = useRef<HTMLElement | null>(null);\n const closeButtonRef = useRef<HTMLElement | null>(null);\n const counterRef = useRef<HTMLElement | null>(null);\n const leftChevronRef = useRef<HTMLElement | null>(null);\n const rightChevronRef = useRef<HTMLElement | null>(null);\n const [showFullscreenModal, setShowFullscreenModal] = useState(false);\n const [wrappedItems, setWrappedItems] = useState<MediaItem[]>([]);\n const windowSize = useWindowSize();\n const scaleRef = useRef(1);\n const panRef = useRef({ x: 0, y: 0 });\n const previousZoom = useRef({ x: 0, y: 0 });\n const sliderForFullscreen = useRef<HTMLDivElement | null>(null)\n const slidesForFullscreen = useRef<{ cells: { element: HTMLElement; index: number }[]; target: number }[]>([]);\n const visibleImagesForFullscreen = useRef<number>(1);\n const selectedIndexForFullscreen = useRef<number>(0);\n const sliderXForFullscreen = useRef<number>(0);\n const sliderVelocityForFullscreen = useRef<number>(0);\n const isWrappingForFullscreen = useRef<boolean>(false);\n const fsIndexRef = useRef<number>(fsSub.get());\n const [fsFadeOpening, setFsFadeOpening] = useState(false);\n const entryMapRef = useRef<MediaEntryLink[] | null>(null);\n const entryFlatIndexRef = useRef<number[][] | null>(null);\n const fsOwnersRef = useRef<SlideOwner[]>([]);\n const [closingModal, setClosingModal] = useState(false);\n const changingSlides = useRef(false);\n const [isZoomed, setIsZoomed] = useState(false);\n const isZoomedRef = useRef(false);\n const currentImage = useRef<HTMLDivElement | null>(null);\n const aspectRatioRef = useRef(1);\n const axisRef = useRef<AxisType | null>(null);\n const pointerDownRef = useRef(false);\n const interactionModeRef = useRef<'idle' | 'drag' | 'wheel' | 'programmatic'>('idle');\n const locX = useRef<Vector1DType | null>(null);\n const locY = useRef<Vector1DType | null>(null);\n const prevX = useRef<Vector1DType | null>(null);\n const prevY = useRef<Vector1DType | null>(null);\n const offX = useRef<Vector1DType | null>(null);\n const offY = useRef<Vector1DType | null>(null);\n const tgtX = useRef<Vector1DType | null>(null);\n const tgtY = useRef<Vector1DType | null>(null);\n const sliderApiRef = useRef<SliderHandle>(null);\n const entrySliderRefs = useRef<(SliderHandle | null)[]>([]);\n const overlayCaptionRef = useRef<HTMLDivElement | null>(null);\n const overlayCaptionRootRef = useRef<ReturnType<typeof createRoot> | null>(null);\n const fsThumbContainerRef = useRef<HTMLDivElement | null>(null);\n const epoch = useOpenEpoch(showFullscreenModal);\n const [isReady, setIsReady] = useState(false);\n const suppressLoopRef = useRef(false);\n const shieldCleanupRef = React.useRef<null | (() => void)>(null);\n const shieldRef = useRef<ReturnType<typeof createGestureShield> | null>(null);\n const bodyX = useRef<ScrollBodyType | null>(null);\n const bodyY = useRef<ScrollBodyType | null>(null);\n const boundsX = useRef<ScrollBoundsType | null>(null);\n const boundsY = useRef<ScrollBoundsType | null>(null);\n const isAnimatingRef = useRef(false);\n const animRef = useRef<AnimationsType | null>(null);\n const wrappedModePlyrRefs = useRef<(APITypes | null)[]>([]);\n const singleModePlyrRefs = useRef<(APITypes | null)[]>([]);\n const suppressNextClickRef = useRef(false);\n const cells = useRef<{ element: HTMLElement, index: number }[]>([]);\n const idSeqRef = useRef(0);\n type Cell = { id: string; node: React.ReactNode };\n const asArray = <T,>(x: T | T[]) => (Array.isArray(x) ? x : [x]);\n const newId = useCallback(() => `rmg-${++idSeqRef.current}`, []);\n\n function nodeFromMedia(m: MediaItem): React.ReactNode {\n if (m.kind === 'image') return <img src={m.src} alt={m.alt ?? ''} />;\n if (m.kind === 'video') {\n return <video src={m.src} controls preload=\"metadata\" />;\n }\n return null;\n }\n\n const initialCells = useMemo<Cell[]>(() => {\n const kids = React.Children.toArray(children);\n if (kids.length > 0) return kids.map((n) => ({ id: newId(), node: n }));\n\n if (flattenedEntryMedia && flattenedEntryMedia.length && flattenedEntryMap) {\n const cells: Cell[] = [];\n const links: MediaEntryLink[] = [];\n\n flattenedEntryMedia.forEach((m, flatIdx) => {\n const link = flattenedEntryMap[flatIdx];\n if (!link) return;\n\n const entry = entriesObject.items?.[link.entryIndex];\n if (!entry) return;\n\n const node =\n typeof entriesObject.render?.media === 'function'\n ? entriesObject.render.media({\n entry,\n entryIndex: link.entryIndex,\n media: m,\n mediaIndex: link.mediaIndex,\n })\n : nodeFromMedia(m);\n\n cells.push({ id: newId(), node });\n links.push(link);\n });\n\n entryMapRef.current = links;\n return cells;\n }\n\n if (normalizedItems.length) {\n return normalizedItems.map((mi) => ({ id: newId(), node: nodeFromMedia(mi) }));\n }\n\n return [];\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const cellsRef = React.useRef<Cell[]>(initialCells);\n const [cellsState, setCellsState] = React.useState<Cell[]>(initialCells);\n\n const effectiveBreakpoints = useMemo(\n () => ({ ...BREAKPOINT_MAP, ...(breakpoints || {}) }),\n [breakpoints]\n );\n\n const fs = {\n ...DEFAULT_FULLSCREEN,\n ...(fullscreen ?? {}),\n slider: { ...DEFAULT_FULLSCREEN.slider, ...(fullscreen?.slider ?? {}) },\n zoom: { ...DEFAULT_FULLSCREEN.zoom, ...(fullscreen?.zoom ?? {}) },\n effects: { ...DEFAULT_FULLSCREEN.effects, ...(fullscreen?.effects ?? {}) },\n controls: { ...(fullscreen?.controls ?? {}) },\n };\n\n const sliderObject = {\n ...DEFAULT_SLIDER,\n ...(slider ?? {}),\n layout: { ...DEFAULT_SLIDER.layout, ...(slider?.layout ?? {}) },\n direction: { ...DEFAULT_SLIDER.direction, ...(slider?.direction ?? {}) },\n align: slider?.align ?? DEFAULT_SLIDER.align,\n scroll: { ...DEFAULT_SLIDER.scroll, ...(slider?.scroll ?? {}) },\n controls: {\n ...DEFAULT_SLIDER.controls,\n ...(slider?.controls ?? {}),\n arrows: {\n ...DEFAULT_SLIDER.controls.arrows,\n ...(slider?.controls?.arrows ?? {}),\n arrow: {\n ...DEFAULT_SLIDER.controls.arrows.arrow,\n ...(slider?.controls?.arrows?.arrow ?? {}),\n },\n prev: {\n ...DEFAULT_SLIDER.controls.arrows.prev,\n ...(slider?.controls?.arrows?.prev ?? {}),\n },\n next: {\n ...DEFAULT_SLIDER.controls.arrows.next,\n ...(slider?.controls?.arrows?.next ?? {}),\n }\n },\n dots: {\n ...DEFAULT_SLIDER.controls.dots,\n ...(slider?.controls?.dots ?? {}),\n root: {\n ...DEFAULT_SLIDER.controls.dots.root,\n ...(slider?.controls?.dots?.root ?? {}),\n },\n dot: {\n ...DEFAULT_SLIDER.controls.dots.dot,\n ...(slider?.controls?.dots?.dot ?? {}),\n },\n },\n progress: {\n ...DEFAULT_SLIDER.controls.progress,\n ...(slider?.controls?.progress ?? {}),\n root: {\n ...DEFAULT_SLIDER.controls.progress.root,\n ...(slider?.controls?.progress?.root ?? {}),\n },\n bar: {\n ...DEFAULT_SLIDER.controls.progress.bar,\n ...(slider?.controls?.progress?.bar ?? {}),\n },\n },\n ripple: {\n ...DEFAULT_SLIDER.controls.ripple,\n ...(slider?.controls?.ripple ?? {}),\n },\n },\n thumbnails: { ...DEFAULT_SLIDER.thumbnails, ...(slider?.thumbnails ?? {}) },\n lazyLoad: slider?.lazyLoad ?? DEFAULT_SLIDER.lazyLoad,\n auto: {\n ...DEFAULT_SLIDER.auto,\n ...(slider?.auto ?? {}),\n play: { ...DEFAULT_SLIDER.auto.play, ...(slider?.auto?.play ?? {}) },\n scroll: { ...DEFAULT_SLIDER.auto.scroll, ...(slider?.auto?.scroll ?? {}) },\n },\n motion: { ...DEFAULT_SLIDER.motion, ...(slider?.motion ?? {}) }\n };\n\n const gridObject: GridOptions = {\n ...grid,\n minColumnWidth: grid?.minColumnWidth ?? DEFAULT_GRID.minColumnWidth,\n gap: grid?.gap ?? DEFAULT_GRID.gap,\n };\n\n const masonryObject: MasonryOptions = {\n ...masonry,\n placement: masonry?.placement ?? DEFAULT_MASONRY.placement,\n };\n\n const entriesObject: EntriesOptions = {\n ...entries,\n mediaLayout: entries?.mediaLayout ?? DEFAULT_ENTRIES.mediaLayout,\n };\n\n const { flattenedEntryMedia, flattenedEntryMap } = useMemo(() => {\n if (!entriesObject.items || entriesObject.items.length === 0) {\n entryFlatIndexRef.current = null;\n fsOwnersRef.current = [];\n return {\n flattenedEntryMedia: null as MediaItem[] | null,\n flattenedEntryMap: null as MediaEntryLink[] | null,\n };\n }\n\n const media: MediaItem[] = [];\n const map: MediaEntryLink[] = [];\n const indexByEntry: number[][] = [];\n const owners: SlideOwner[] = [];\n\n entriesObject.items.forEach((ent, rIdx) => {\n indexByEntry[rIdx] = [];\n (ent.media ?? []).forEach((m, mIdx) => {\n const flatIndex = media.length;\n media.push(m);\n map.push({ entryIndex: rIdx, mediaIndex: mIdx });\n\n owners.push({ entryIndex: rIdx });\n indexByEntry[rIdx][mIdx] = flatIndex;\n });\n });\n\n entryFlatIndexRef.current = indexByEntry;\n fsOwnersRef.current = owners;\n\n return { flattenedEntryMedia: media, flattenedEntryMap: map };\n }, [entries]);\n\n const isStringArray = (v: unknown): v is string[] =>\n Array.isArray(v) && v.every((x) => typeof x === \"string\");\n\n type FullscreenItemsInput = MediaItem[] | string[];\n\n const normalizeFsItems = (v: FullscreenItemsInput | undefined): MediaItem[] => {\n if (!v || !v.length) return [];\n return isStringArray(v) ? toMediaItems(v) : v;\n };\n\n const [normalizedItems, setNormalizedItems] = useState<MediaItem[]>(() => {\n const fs = normalizeFsItems(fullscreen?.items);\n if (fs.length) return fs;\n if (flattenedEntryMedia?.length) return flattenedEntryMedia;\n return [];\n });\n\n function usePredecodeImages(urls: string[], enabled: boolean): boolean {\n const [ready, setReady] = useState(\n !enabled || urls.length === 0\n );\n\n useEffect(() => {\n if (!enabled || !urls.length) {\n setReady(true);\n return;\n }\n\n let cancelled = false;\n setReady(false);\n\n const decodeUrl = (url: string) =>\n new Promise<void>((resolve) => {\n const img = new Image() as HTMLImageElement;\n img.src = url;\n\n const hasDecode =\n typeof (img as any).decode === 'function';\n\n if (hasDecode) {\n (img as any)\n .decode()\n .catch(() => {})\n .finally(() => {\n if (!cancelled) resolve();\n });\n } else {\n if (img.complete) {\n if (!cancelled) resolve();\n return;\n }\n\n const done = () => {\n img.onload = null;\n img.onerror = null;\n if (!cancelled) resolve();\n };\n\n img.onload = done;\n img.onerror = done;\n }\n });\n\n (async () => {\n for (const url of urls) {\n if (cancelled) break;\n await decodeUrl(url);\n }\n if (!cancelled) {\n setReady(true);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [enabled, urls]);\n\n return ready;\n }\n\n const fullscreenImageUrls = useMemo(\n () => normalizedItems.filter(m => m.kind === 'image').map(m => m.src),\n [normalizedItems]\n );\n\n usePredecodeImages(\n fullscreenImageUrls,\n fs.enabled\n );\n\n const sliderImageUrls = useMemo(\n () => normalizedItems\n .filter(m => m.kind === 'image')\n .map(m => m.src),\n [normalizedItems]\n );\n\n const sliderImagesReady = usePredecodeImages(\n sliderImageUrls,\n sliderImageUrls.length > 0\n );\n\n function syncFullscreenSourceFromIndex(nextIndex: number) {\n fsIndexRef.current = nextIndex;\n\n if (layout === 'entries' && entriesObject.items?.length && fsOwnersRef.current.length) {\n const owner = fsOwnersRef.current[nextIndex];\n const entryHandle = owner ? entrySliderRefs.current[owner.entryIndex] : null;\n const internals = entryHandle?.getInternals?.();\n if (!internals) return;\n\n sliderForFullscreen.current = internals.slider.current;\n slidesForFullscreen.current = internals.slides.current;\n visibleImagesForFullscreen.current = internals.visibleImages.current;\n selectedIndexForFullscreen.current = internals.selectedIndex.current;\n sliderXForFullscreen.current = internals.sliderX.current;\n sliderVelocityForFullscreen.current = internals.sliderVelocity.current;\n isWrappingForFullscreen.current = internals.isWrapping.current;\n return;\n }\n\n const internals = sliderApiRef.current?.getInternals?.();\n console.log('internals', internals)\n if (!internals) return;\n\n sliderForFullscreen.current = internals.slider.current;\n slidesForFullscreen.current = internals.slides.current;\n visibleImagesForFullscreen.current = internals.visibleImages.current;\n selectedIndexForFullscreen.current = internals.selectedIndex.current;\n sliderXForFullscreen.current = internals.sliderX.current;\n sliderVelocityForFullscreen.current = internals.sliderVelocity.current;\n isWrappingForFullscreen.current = internals.isWrapping.current;\n }\n\n useEffect(() => {\n if (!showFullscreenModal) return;\n\n const start = fsSub.get();\n fsIndexRef.current = start;\n\n syncFullscreenSourceFromIndex(start);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [showFullscreenModal, fsSub]);\n\n const { setMountEl: setFsEntryOverlayMountEl, setOpacity: setFsEntryOverlayOpacity } = useFsEntryOverlay({\n enabled: !!showFullscreenModal && layout === 'entries',\n fsSub,\n entriesObject,\n entryMapRef,\n syncFullscreenSourceFromIndex,\n resetAllZoomDom: resetZoomForSlideChange,\n closing: !!closingModal\n });\n\n const setScale = useCallback((newScale: number) => {\n scaleRef.current = newScale;\n const prev = isZoomedRef.current;\n const next = newScale > 1.01;\n if (next !== prev) {\n isZoomedRef.current = next;\n setIsZoomed(next);\n }\n }, []);\n\n const attachEntrySliderRef = useCallback(\n (entryIndex: number) =>\n (instance: SliderHandle | null) => {\n entrySliderRefs.current[entryIndex] = instance;\n },\n []\n );\n\n function resolveFsCaptionPlacement(\n placement: FsCaptionPlacement | undefined,\n breakpoint: number | undefined,\n viewportWidth: number\n ): FsCaptionPlacement | null {\n if (!placement) return null;\n\n if (breakpoint != null && viewportWidth < breakpoint) {\n return 'bottom';\n }\n return placement;\n }\n\n type AnyElement = React.ReactElement<\n Record<string, any>,\n string | React.JSXElementConstructor<any>\n >;\n\n function isForwardRefType(t: any): t is { $$typeof: symbol; render: (p: any, r: any) => React.ReactNode } {\n return t && typeof t === 'object' && 'render' in t;\n }\n\n function cellsToMediaItems(next: Cell[]): MediaItem[] {\n const extract = (node: React.ReactNode): MediaItem | null => {\n if (!React.isValidElement(node)) return null;\n\n const n = node as AnyElement;\n const p = (n.props ?? {}) as Record<string, any>;\n\n const keyStr = String(n.key ?? \"\");\n const decodedKey = keyStr.replace(/=2/g, \":\").replace(/=0/g, \"=\");\n const cleanedKey = decodedKey.replace(/^\\.\\$/, \"\");\n\n if (typeof n.type === \"string\" && n.type.toLowerCase() === \"img\") {\n const src = p.src ?? \"\";\n if (!src) return null;\n return { kind: \"image\", src, alt: p.alt ?? \"\" };\n }\n\n const videoMatch = cleanedKey.match(/https?:\\/\\/[^\\s'\")]+?\\.(mp4|webm|mov|m4v)(\\?|#|$)/i);\n if (videoMatch) {\n return { kind: \"video\", src: videoMatch[0], alt: p.alt ?? \"\", thumb: p.src ?? \"\" };\n }\n\n if (typeof n.type === \"string\" && n.type.toLowerCase() === \"video\") {\n const src = p.src ?? \"\";\n if (!src) return null;\n return { kind: \"video\", src, alt: p.alt ?? \"\", thumb: p.thumb ?? p.poster ?? \"\" };\n }\n\n const t = n.type;\n\n if (isForwardRefType(t)) {\n try { return extract(t.render(p, null)); } catch {}\n }\n\n if (typeof t === \"function\" && !(t as any).prototype?.isReactComponent) {\n try { return extract((t as (props: any) => React.ReactNode)(p)); } catch {}\n }\n\n if (p.children) {\n for (const child of React.Children.toArray(p.children)) {\n const res = extract(child);\n if (res) return res;\n }\n }\n\n return null;\n };\n\n const out: MediaItem[] = [];\n for (const cell of next) {\n const media = extract(cell.node);\n if (media) out.push(media);\n }\n return out;\n }\n\n function commit(next: Cell[], opts?: { adjustIndex?: (cur: number) => number }) {\n cellsRef.current = next;\n setCellsState(next);\n\n setNormalizedItems(() => {\n const fromCells = cellsToMediaItems(next);\n if (fromCells.length) return fromCells;\n\n // fallback only if cells didn’t yield anything\n const fs = normalizeFsItems(fullscreen?.items);\n if (fs.length) return fs;\n\n if (flattenedEntryMedia?.length) return flattenedEntryMedia;\n return [];\n });\n\n if (!next.length) {\n indexChannel.set(0, 'instant');\n return;\n }\n\n if (opts?.adjustIndex) {\n const cur = sliderApiRef.current?.getIndex() ?? 0;\n const adj = opts.adjustIndex(cur);\n if (adj !== cur) sliderApiRef.current?.setIndex(adj as any, 'instant');\n }\n }\n\n function clamp(n: number, lo: number, hi: number) { return Math.max(lo, Math.min(hi, n)); }\n\n function append(nodes: React.ReactNode | React.ReactNode[]) {\n const add = asArray(nodes).map((n) => ({ id: newId(), node: n }));\n const next = [...cellsRef.current, ...add];\n commit(next);\n return next.length;\n }\n\n function prepend(nodes: React.ReactNode | React.ReactNode[]) {\n const add = asArray(nodes).map((n) => ({ id: newId(), node: n }));\n const prevLen = cellsRef.current.length;\n const addLen = add.length;\n\n commit([...add, ...cellsRef.current], {\n adjustIndex: (cur) => clamp(cur + addLen, 0, prevLen + addLen - 1),\n });\n return prevLen + addLen;\n }\n\n function insert(index: number, nodes: React.ReactNode | React.ReactNode[]) {\n const arr = cellsRef.current.slice();\n const add = asArray(nodes).map((n) => ({ id: newId(), node: n }));\n const to = clamp(index | 0, 0, arr.length);\n const next = [...arr.slice(0, to), ...add, ...arr.slice(to)];\n const addLen = add.length;\n\n commit(next, {\n adjustIndex: (cur) => (cur >= to ? cur + addLen : cur),\n });\n\n return next.length;\n }\n\n function remove(indexOrPredicate: number | ((i: number) => boolean)) {\n const arr = cellsRef.current;\n if (!arr.length) return 0;\n\n let predicate: (i: number) => boolean;\n if (typeof indexOrPredicate === 'number') {\n const idx = clamp(indexOrPredicate, 0, arr.length - 1);\n predicate = (i) => i === idx;\n } else {\n predicate = indexOrPredicate;\n }\n\n const curIndex = sliderApiRef.current?.getIndex() ?? 0;\n\n const next: Cell[] = [];\n let removedBeforeOrAt = 0;\n arr.forEach((c, i) => {\n const isRemoved = predicate(i);\n if (!isRemoved) next.push(c);\n if (isRemoved && i <= curIndex) removedBeforeOrAt++;\n });\n\n commit(next, {\n adjustIndex: (cur) => clamp(cur - Math.max(0, removedBeforeOrAt), 0, Math.max(0, next.length - 1)),\n });\n\n return next.length;\n }\n\n function replace(index: number, node: React.ReactNode) {\n const arr = cellsRef.current;\n if (!arr.length) return;\n\n const i = clamp(index | 0, 0, arr.length - 1);\n\n const keepId = arr[i].id;\n const next = arr.slice();\n next[i] = { id: keepId, node };\n\n commit(next);\n }\n\n function setItems(input: React.ReactNode[]) {\n let nextCells: { id: string; node: React.ReactNode }[] = [];\n\n const nodes = (input as React.ReactNode[]) ?? [];\n nextCells = nodes.map(n => ({ id: newId(), node: n }));\n\n commit(nextCells, {\n adjustIndex: (cur) => clamp(cur, 0, Math.max(0, nextCells.length - 1)),\n });\n\n return nextCells.length;\n }\n\n useImperativeHandle(ref, () => {\n return {\n rootNode() {\n return sliderApiRef.current?.getRootNode() ?? null;\n },\n containerNode() {\n return sliderApiRef.current?.getContainerNode() ?? null;\n },\n slideNodes() {\n return sliderApiRef.current?.getSlideNodes() ?? [];\n },\n onReady: (cb) => sliderApiRef.current?.onSlidesBuilt(cb) ?? (() => {}),\n whenReady: () => sliderApiRef.current?.whenSlidesBuilt() ?? Promise.resolve([]),\n isReady: () => sliderApiRef.current?.isSlidesBuilt() ?? false,\n scrollTo(index: number, jump?: boolean) {\n const len = normalizedItems.length;\n if (!len) return;\n const cur = indexChannel.get().index ?? 0;\n const next = index;\n if (next === cur) return;\n indexChannel.set(next, jump ? 'instant' : 'animated');\n },\n\n scrollNext() {\n const api = sliderApiRef.current;\n if (!api) return;\n api.scrollNext();\n },\n scrollPrev() {\n const api = sliderApiRef.current;\n if (!api) return;\n api.scrollPrev();\n },\n canScrollNext() {\n return sliderApiRef.current?.canScrollNext() ?? false;\n },\n canScrollPrev() {\n return sliderApiRef.current?.canScrollPrev() ?? false;\n },\n\n cellsInView() {\n return sliderApiRef.current?.cellsInView() ?? [];\n },\n scrollProgress() {\n return sliderApiRef.current?.scrollProgress() ?? 0;\n },\n\n selectCell(index: number, jump?: boolean) {\n const sliderApi = sliderApiRef.current;\n const lenCells = normalizedItems.length;\n if (!sliderApi || !lenCells) return;\n\n const slideIdx = sliderApi.slideIndexForCell\n ? sliderApi.slideIndexForCell(index)\n : ((index % lenCells) + lenCells) % lenCells;\n\n const cur = indexChannel.get().index ?? 0;\n const next = slideIdx;\n\n if (!sliderObject.scroll.loop && next === cur) return;\n if (next !== cur) {\n indexChannel.set(next, jump ? 'instant' : 'animated');\n }\n },\n\n getIndex() {\n return indexChannel.get().index ?? 0;\n },\n\n onIndexChange(cb) {\n const off = indexChannel.onEvent(ev => {\n if (ev.type === 'set' || ev.type === 'bump') {\n cb(indexChannel.get().index, { mode: ev.mode });\n }\n });\n return off;\n },\n\n append,\n prepend,\n insert,\n remove,\n replace,\n setItems\n } as GalleryApi;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [indexChannel, cellsState.length, sliderObject.scroll.loop]);\n\n const renderedCells = React.useMemo(() => {\n return cellsState.map((c) => {\n const n = c.node;\n return React.isValidElement(n)\n ? React.cloneElement(n as React.ReactElement, { key: c.id })\n : <span key={c.id} style={{ display: 'block' }}>{n as any}</span>;\n });\n }, [cellsState]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n shieldRef.current = createGestureShield(10000);\n }, []);\n\n const addShield = useCallback((timeoutMs?: number) => {\n shieldCleanupRef.current?.();\n const teardown = shieldRef.current?.add(timeoutMs);\n shieldCleanupRef.current = teardown ?? null;\n }, []);\n\n const openFullscreenAt = useCallback(\n (gridIndex: number, originEl?: HTMLElement | null) => {\n if (!fs.enabled) return;\n\n if (\n layout === 'entries' &&\n entriesObject.mediaLayout === 'slider' &&\n entryMapRef.current\n ) {\n const link = entryMapRef.current[gridIndex];\n if (link) {\n const { entryIndex } = link;\n\n const entryHandle = entrySliderRefs.current[entryIndex];\n const internals = entryHandle?.getInternals?.();\n\n const ownerSlider = entrySliderRefs.current[entryIndex] as any;\n\n const sel = internals?.selectedIndex?.current;\n\n if (ownerSlider && typeof ownerSlider.setIndex === 'function' && typeof sel === 'number') {\n ownerSlider.setIndex(sel, 'animated');\n }\n }\n }\n\n const imageCount = normalizedItems.length;\n if (!imageCount) return;\n\n let imgEl: HTMLImageElement | null = null;\n\n if (originEl) {\n imgEl =\n originEl.tagName === 'IMG'\n ? (originEl as HTMLImageElement)\n : originEl.querySelector('img');\n }\n\n if (!imgEl) {\n imgEl = (expandableImgRefs.current[gridIndex] ?? null) as HTMLImageElement | null;\n }\n\n if (!imgEl) return;\n\n let fullscreenIndex = gridIndex;\n if (layout === 'grid' || layout === 'masonry') fullscreenIndex = gridIndex;\n\n isClick.current = true;\n setShowFullscreenModal(true);\n\n runFullscreenIntro({\n origImg: imgEl,\n index: fullscreenIndex,\n normalizedItems,\n isRtl: sliderObject.direction.dir === \"rtl\",\n styles,\n fs,\n overlayDivRef,\n duplicateImgRef,\n overlayCaptionRef,\n overlayCaptionRootRef,\n closeButtonRef,\n counterRef,\n leftChevronRef,\n rightChevronRef,\n fsThumbContainerRef,\n setShowFullscreenSlider,\n setFsFadeOpening,\n addShield,\n resolveFsCaptionPlacement,\n closestSelector: \".rmg__grid-item\"\n });\n\n setSlideIndex(fullscreenIndex);\n },\n [fs.enabled, normalizedItems.length, layout, entriesObject.mediaLayout]\n );\n\n function registerExpandableImg(index: number, node: HTMLElement | null) {\n if (!node) {\n expandableImgRefs.current[index] = null;\n return;\n }\n\n let img: HTMLImageElement | null = null;\n\n if (node.tagName === 'IMG') {\n img = node as HTMLImageElement;\n } else {\n img = node.querySelector('img');\n }\n\n expandableImgRefs.current[index] = img;\n }\n\n const viewportWidth = useViewportWidth();\n const gridLoading = useMemo(() => normalizeLoading(gridObject.loading), [gridObject.loading]);\n const gridIntro = useMemo(() => normalizeIntro(gridObject.intro), [gridObject.intro]);\n\n const masonryLoading = useMemo(() => normalizeLoading(masonryObject.loading), [masonryObject.loading]);\n const masonryIntro = useMemo(() => normalizeIntro(masonryObject.intro), [masonryObject.intro]);\n\n const resolvedCellsPerSlide = useMemo(() => {\n if (layout !== 'slider') return undefined;\n\n const hasCellsPerSlideProp = sliderObject.layout.cellsPerSlide != null;\n\n if (!hasCellsPerSlideProp) {\n return undefined;\n }\n\n const source = hasCellsPerSlideProp ? sliderObject.layout.cellsPerSlide : undefined;\n\n const raw = resolveNumberFromResponsive(\n source,\n 1,\n viewportWidth,\n effectiveBreakpoints\n );\n\n const n = Math.max(1, raw | 0);\n return n;\n }, [sliderObject.layout.cellsPerSlide, viewportWidth, effectiveBreakpoints, layout]);\n\n const hasUserCellsPerSlide =\n sliderObject.layout.cellsPerSlide != null;\n\n const sliderResponsiveColumns =\n hasUserCellsPerSlide && typeof resolvedCellsPerSlide === 'number'\n ? resolvedCellsPerSlide\n : undefined;\n\n const resolvedGap = useMemo(() => {\n\n const raw = resolveNumberFromResponsive(\n sliderObject.layout.gap,\n 20,\n viewportWidth,\n effectiveBreakpoints\n );\n\n return Math.max(0, raw | 0);\n }, [sliderObject.layout.gap, viewportWidth, effectiveBreakpoints]);\n\n const fsEnabled = fs.enabled;\n\n const openFullscreenAtStable = useCallback(\n (index: number) => {\n openFullscreenAt(index);\n },\n [openFullscreenAt]\n );\n\n const registerExpandableImgStable = useCallback(\n (index: number, node: HTMLElement) => {\n registerExpandableImg(index, node);\n },\n [registerExpandableImg]\n );\n\n const itemClassName = masonryObject.classNames?.item ?? \"\";\n\n const masonryChildren = useMemo(() => {\n return buildMasonryChildren({\n cells: cellsState,\n fsEnabled,\n openFullscreenAt: openFullscreenAtStable,\n registerExpandableImg: registerExpandableImgStable,\n itemBaseClass: \"rmg__masonry-item\",\n itemBaseStyleClass: \"\",\n itemClassName,\n });\n }, [\n cellsState,\n fsEnabled,\n openFullscreenAtStable,\n registerExpandableImgStable,\n itemClassName,\n ]);\n\n const isRtl = sliderObject.direction.dir === 'rtl' ? true : false\n const sign = isRtl ? -1 : 1;\n\n useEffect(() => {\n if (animRef.current) {\n animRef.current.stop()\n setScale(1);;\n previousZoom.current.x = 0; previousZoom.current.y = 0;\n panRef.current = { x: 0, y: 0 }\n scaleRef.current = 1\n setFsEntryOverlayOpacity(0);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [closingModal])\n\n function boundsForCurrent(\n scale: number,\n imgW: number,\n imgH: number,\n viewW?: number,\n viewH?: number\n ) {\n return boundsForCurrentFn({\n scale,\n imgW,\n imgH,\n currentImageEl: currentImage.current,\n viewW,\n viewH\n });\n }\n\n function renderPan(xPx: number, yPx: number) {\n if (!currentImage.current) return\n const img = currentImage.current.children[0] as HTMLElement | null\n if (!img) return\n img.style.transform = `translate3d(${xPx}px, ${yPx}px, 0) scale(${scaleRef.current})`\n }\n\n useEffect(() => {\n axisRef.current = Axis()\n }, []);\n\n const wrappedPlyrProps = usePlyrProps({\n items: wrappedItems,\n source: fs.video?.source,\n options: fs.video?.options,\n });\n\n const singlePlyrProps = usePlyrProps({\n items: normalizedItems,\n source: fs.video?.source,\n options: fs.video?.options,\n });\n\n const rebuildPanBodies = useCallback(() => {\n rebuildPanBodiesFn({\n fs,\n currentImage,\n scaleRef,\n locX, prevX, offX, tgtX,\n locY, prevY, offY, tgtY,\n bodyX, bodyY,\n boundsX, boundsY,\n Vector1D,\n ScrollBody,\n ScrollBounds,\n boundsForCurrent,\n } as any);\n }, [fs.zoom.panDuration, fs.zoom.panFriction]);\n\n const zoomCtx = useMemo(() => ({\n fs,\n currentImage,\n scaleRef,\n setScale,\n previousZoom,\n suppressLoopRef,\n locX, prevX, offX, tgtX,\n locY, prevY, offY, tgtY,\n bodyX, bodyY,\n boundsX, boundsY,\n Vector1D,\n ScrollBody,\n ScrollBounds,\n boundsForCurrent,\n renderPan,\n animRef,\n panRef,\n resetAllZoomDom: resetZoomForSlideChange,\n }), [\n fs,\n setScale,\n Vector1D,\n ScrollBody,\n ScrollBounds,\n boundsForCurrent,\n renderPan,\n ]);\n\n const pan = usePanRuntime({\n fs,\n isZoomed,\n zoomCtx,\n currentImage,\n getImageAspectRatio,\n rebuildPanBodies,\n renderPan,\n handleZoomToggle,\n suppressNextClickRef,\n pointerDownRef,\n interactionModeRef,\n boundsX, boundsY,\n bodyX, bodyY,\n locX, locY,\n prevX, prevY,\n offX, offY,\n tgtX, tgtY,\n axisRef,\n animRef,\n });\n\n const wrappedTransform = React.useMemo(\n () => createWrappedTransform({ length: wrappedItems.length, sign }),\n [wrappedItems.length, sign]\n );\n\n const singleTransform = React.useMemo(\n () => createSingleTransform(),\n []\n );\n\n const wrappedFullscreenImages = renderFullscreenSlides({\n items: wrappedItems,\n plyrList: wrappedPlyrProps,\n getTransform: wrappedTransform,\n\n imageRefs,\n playerRefs: wrappedModePlyrRefs,\n cells,\n\n isZoomed,\n showFullscreenSlider,\n defaultPlayerStyle,\n fsVideoStyle: fs.video?.style,\n fsVideoClassName: fs.video?.className,\n\n onPanPointerDown: (e, imageRef) => pan.handlePanPointerStart(e, imageRef),\n onSuppressNextClickCapture: (e) => {\n if (suppressNextClickRef.current) {\n suppressNextClickRef.current = false;\n e.preventDefault();\n (e as any).stopPropagation?.();\n }\n },\n\n renderCaption: fs.caption?.render,\n captionClassName: fs.caption?.className,\n captionStyle: fs.caption?.style,\n fsCaptionPlacement: fs.caption?.placement,\n fsCaptionWidth: fs.caption?.width,\n fsCaptionHeight: fs.caption?.height,\n fsCaptionBreakpoint: fs.caption?.breakpoint,\n resolveFsCaptionPlacement,\n\n styles: {\n imgMargin: styles.imgMargin,\n fullscreenImages: styles.fullscreenImages,\n },\n\n renderImage: fs.renderImage as any,\n });\n\n const oneFullscreenImage = renderFullscreenSlides({\n items: normalizedItems,\n plyrList: singlePlyrProps,\n getTransform: singleTransform,\n\n imageRefs,\n playerRefs: singleModePlyrRefs,\n cells,\n\n isZoomed,\n showFullscreenSlider,\n defaultPlayerStyle,\n fsVideoStyle: fs.video?.style,\n fsVideoClassName: fs.video?.className,\n\n onPanPointerDown: (e, imageRef) => pan.handlePanPointerStart(e, imageRef),\n onSuppressNextClickCapture: (e) => {\n if (suppressNextClickRef.current) {\n suppressNextClickRef.current = false;\n e.preventDefault();\n (e as any).stopPropagation?.();\n }\n },\n\n renderCaption: fs.caption?.render,\n captionClassName: fs.caption?.className,\n captionStyle: fs.caption?.style,\n fsCaptionPlacement: fs.caption?.placement,\n fsCaptionWidth: fs.caption?.width,\n fsCaptionHeight: fs.caption?.height,\n fsCaptionBreakpoint: fs.caption?.breakpoint,\n resolveFsCaptionPlacement,\n\n styles: {\n imgMargin: styles.imgMargin,\n fullscreenImages: styles.fullscreenImages,\n },\n\n renderImage: fs.renderImage as any,\n });\n\n function resetPanForScale1() {\n resetPanForScale1Fn({\n currentImage,\n locX,\n prevX,\n offX,\n tgtX,\n locY,\n prevY,\n offY,\n tgtY,\n bodyX,\n bodyY,\n boundsX,\n boundsY,\n ScrollBody,\n ScrollBounds,\n baseFitSizeC,\n boundsForCurrent,\n panDuration: fs.zoom.panDuration,\n panFriction: fs.zoom.panFriction,\n animRef,\n });\n }\n\n function onForceResetZoom() {\n forceResetZoomFn({\n setScale,\n zoomState: {\n previousZoom,\n panRef,\n scaleRef,\n },\n imageRefs,\n resetPan: resetPanForScale1,\n });\n }\n\n function resetZoomForSlideChange() {\n resetZoomForSlideChangeFn({\n setScale,\n zoomState: {\n previousZoom,\n panRef,\n scaleRef,\n suppressLoopRef,\n changingSlides,\n },\n imageRefs,\n resetPan: resetPanForScale1,\n });\n }\n\n useWrappedItemsAndRefs({\n normalizedItems,\n wrappedItems,\n setWrappedItems,\n imageRefs,\n });\n\n function getImageAspectRatio(image: HTMLDivElement | null) {\n if (!image) return;\n const imgElement = getPrimaryImgEl(image);\n if (imgElement && imgElement.naturalWidth && imgElement.naturalHeight) {\n aspectRatioRef.current = imgElement.naturalWidth / imgElement.naturalHeight;\n }\n }\n\n const { isPinching, isTouchPinching } = useGlobalPinchZoom({\n scaleRef,\n zoomCtx,\n zoomTo,\n isZoomed,\n currentImage,\n imageRefs,\n fullscreenSliderApi,\n rebuildPanBodies,\n baseFitSizeC,\n boundsForCurrent,\n ScrollBounds,\n boundsX,\n boundsY,\n offX,\n offY,\n tgtX,\n tgtY,\n bodyX,\n bodyY,\n animRef,\n panDuration: fs.zoom.panDuration,\n findImgAtPoint,\n readDataIndex,\n distance,\n midpoint,\n });\n\n function getSliderHandleForFullscreen() {\n const idx = fsIndexRef.current;\n\n if (layout === 'entries' && entriesObject.items?.length && fsOwnersRef.current.length) {\n const owner = fsOwnersRef.current[idx];\n if (!owner) return null;\n return entrySliderRefs.current[owner.entryIndex] ?? null;\n }\n\n return sliderApiRef.current ?? null;\n }\n\n const centerSliderForFullscreen = () => {\n const handle = getSliderHandleForFullscreen();\n handle?.centerSlider?.();\n };\n\n const setSliderIndexForFullscreen = (index: number, mode: IndexMode) => {\n const handle = getSliderHandleForFullscreen();\n handle?.setIndex?.(index, mode);\n };\n\n const flexDirection =\n fs.thumbnails?.layout?.position === 'left'\n ? 'row-reverse'\n : fs.thumbnails?.layout?.position === 'right'\n ? 'row'\n : fs.thumbnails?.layout?.position === 'top'\n ? 'column-reverse'\n : 'column';\n\n const fsThumbsOpen = showFullscreenModal && !closingModal\n const fsThumbFadeDuration = fs.effects.thumbnailsFadeDuration\n const fsThumbFadeEasing = fs.effects.thumbnailsFadeEasing\n\n const vw = useViewportWidth();\n\n const resolvedThumbPos = useMemo(() => {\n if (!slider?.thumbnails?.layout?.position) return undefined;\n\n return resolvePositionFromResponsive(\n slider?.thumbnails?.layout?.position,\n \"bottom\",\n vw,\n effectiveBreakpoints\n );\n }, [slider?.thumbnails?.layout?.position, vw, effectiveBreakpoints]);\n\n const fsResolvedThumbPos = useMemo(\n () =>\n resolvePositionFromResponsive(\n fs.thumbnails?.layout?.position,\n 'bottom',\n vw,\n effectiveBreakpoints\n ),\n [fs.thumbnails?.layout?.position, vw, effectiveBreakpoints]\n );\n\n\n return (\n <>\n <div className={root?.className} style={root?.style}>\n {layout === 'slider' && (resolvedThumbPos === 'top' || resolvedThumbPos === 'left') && (\n <ThumbnailSlider\n indexChannel={indexChannel}\n position={resolvedThumbPos}\n thumbnailWidth={sliderObject.thumbnails.layout?.thumbnail?.width}\n thumbnailHeight={sliderObject.thumbnails.layout?.thumbnail?.height}\n thumbnailsCenter={sliderObject.thumbnails.layout?.center}\n thumbnailsContainerWidth={sliderObject.thumbnails.layout?.container?.width}\n thumbnailsContainerHeight={sliderObject.thumbnails.layout?.container?.height}\n thumbnailsContainerStyle={sliderObject.thumbnails.elements?.container?.style}\n thumbnailsContainerClassName={sliderObject.thumbnails.elements?.container?.className}\n thumbnailItemStyle={sliderObject.thumbnails.elements?.thumbnail?.style}\n thumbnailItemClassName={sliderObject.thumbnails.elements?.thumbnail?.className}\n gap={sliderObject.thumbnails.layout?.gap}\n freeScroll={sliderObject.thumbnails.scroll?.freeScroll}\n groupCells={sliderObject.thumbnails.scroll?.groupCells}\n loop={sliderObject.thumbnails.scroll?.loop}\n skipSnaps={sliderObject.thumbnails.scroll?.skipSnaps}\n centerActiveThumb={sliderObject.thumbnails.scroll?.centerActiveThumb}\n selectDuration={sliderObject.thumbnails.motion?.selectDuration}\n freeScrollDuration={sliderObject.thumbnails.motion?.freeScrollDuration}\n sliderFriction={sliderObject.thumbnails.motion?.friction}\n loadingOptions={sliderObject.thumbnails.transitions?.loading}\n introOptions={sliderObject.thumbnails.transitions?.intro}\n breakpointMap={sliderObject.thumbnails.breakpointMap}\n rippleEnabled={sliderObject.thumbnails.controls?.ripple?.enabled}\n rippleClassName={sliderObject.thumbnails.controls?.ripple?.className}\n showArrows={sliderObject.thumbnails.controls?.enabled}\n arrowStyles={sliderObject.thumbnails.controls?.arrow?.style}\n arrowClassName={sliderObject.thumbnails.controls?.arrow?.className}\n prevArrowStyles={sliderObject.thumbnails.controls?.prev?.style}\n prevArrowClassName={sliderObject.thumbnails.controls?.prev?.className}\n nextArrowStyles={sliderObject.thumbnails.controls?.next?.style}\n nextArrowClassName={sliderObject.thumbnails.controls?.next?.className}\n renderArrows={sliderObject.thumbnails.controls?.render}\n renderPrevArrow={sliderObject.thumbnails.controls?.renderPrev}\n renderNextArrow={sliderObject.thumbnails.controls?.renderNext}\n >\n {sliderObject.thumbnails.children}\n </ThumbnailSlider>\n )}\n <div className={container?.className} style={container?.style}>\n {layout === 'slider' ? (\n <Slider\n imageCount={cellsState.length}\n isClick={isClick}\n expandableImgRefs={expandableImgRefs}\n overlayDivRef={overlayDivRef}\n setSlideIndex={setSlideIndex}\n setShowFullscreenModal={setShowFullscreenModal}\n setShowFullscreenSlider={setShowFullscreenSlider}\n showFullscreenSlider={showFullscreenSlider}\n duplicateImgRef={duplicateImgRef}\n closeButtonRef={closeButtonRef}\n counterRef={counterRef}\n leftChevronRef={leftChevronRef}\n rightChevronRef={rightChevronRef}\n isReady={isReady}\n setIsReady={setIsReady}\n loop={sliderObject.scroll.loop}\n freeScroll={sliderObject.scroll.freeScroll}\n autoPlay={sliderObject.auto.play.enabled}\n autoPlaySpeed={sliderObject.auto.play.speedMs}\n autoPlayPause={sliderObject.auto.play.pauseMs}\n autoScroll={sliderObject.auto.scroll.enabled}\n autoScrollSpeed={sliderObject.auto.scroll.speedMs}\n autoScrollPause={sliderObject.auto.scroll.pauseMs}\n pauseAutoPlayOnHover={sliderObject.auto.play.pauseOnHover}\n pauseAutoScrollOnHover={sliderObject.auto.scroll.pauseOnHover}\n groupCells={sliderObject.scroll.groupCells}\n centerAlign={sliderObject.align === 'center'}\n gap={resolvedGap}\n sliderViewportStyles={sliderObject.elements?.viewport?.style}\n sliderViewportClassName={sliderObject.elements?.viewport?.className}\n sliderContainerStyles={sliderObject.elements?.container?.style}\n sliderContainerClassName={sliderObject.elements?.container?.className}\n sliderHeight={sliderObject.size?.height}\n responsiveHeights={sliderObject.size?.heightRules}\n arrowStyles={sliderObject.controls.arrows.arrow.style}\n arrowClassName={sliderObject.controls.arrows.arrow.className}\n prevArrowStyles={sliderObject.controls.arrows.prev.style}\n prevArrowClassName={sliderObject.controls.arrows.prev.className}\n nextArrowStyles={sliderObject.controls.arrows.next.style}\n nextArrowClassName={sliderObject.controls.arrows.next.className}\n dotsContainerStyles={sliderObject.controls.dots.root.style}\n dotsContainerClassName={sliderObject.controls.dots.root.className}\n dotsStyles={sliderObject.controls.dots.dot.style}\n dotsClassName={sliderObject.controls.dots.dot.className}\n renderArrows={sliderObject.controls.arrows.render}\n renderPrevArrow={sliderObject.controls.arrows.renderPrev}\n renderNextArrow={sliderObject.controls.arrows.renderNext}\n renderDots={sliderObject.controls.dots.render}\n showArrows={sliderObject.controls.arrows.enabled}\n showDots={sliderObject.controls.dots.enabled}\n enableFullscreen={fs.enabled}\n showProgress={sliderObject.controls.progress.enabled}\n progressClassName={sliderObject.controls.progress.root.className}\n progressStyle={sliderObject.controls.progress.root.style}\n progressInnerClassName={sliderObject.controls.progress.bar.className}\n progressInnerStyle={sliderObject.controls.progress.bar.style}\n renderProgress={sliderObject.controls.progress.render}\n fullscreenControls={{\n close: fs.controls.close,\n arrows: {\n arrow: fs.controls.arrows?.arrow,\n prev: fs.controls.arrows?.prev,\n next: fs.controls.arrows?.next,\n },\n counter: fs.controls.counter,\n }}\n showFsArrows={fs.controls.arrows?.enabled}\n showFsClose={fs.controls.close?.enabled}\n renderFsClose={fs.controls.close?.render}\n renderFsArrows={fs.controls.arrows?.render}\n renderFsPrev={fs.controls.arrows?.renderPrev}\n renderFsNext={fs.controls.arrows?.renderNext}\n showFsCounter={fs.controls.counter?.enabled}\n renderFsCounter={fs.controls.counter?.render}\n parallax={sliderObject.effects?.parallax?.enabled}\n parallaxBleedPct={sliderObject.effects?.parallax?.bleedPct}\n parallaxBorderRadius={sliderObject.effects?.parallax?.borderRadius}\n parallaxSideWidth={sliderObject.effects?.parallax?.sideWidth}\n ref={sliderApiRef}\n scaleEffect={sliderObject.effects?.scale?.enabled}\n scaleAmount={sliderObject.effects?.scale?.amount}\n fadeEffect={sliderObject.effects?.fade?.enabled}\n initialHeight={sliderObject.size?.initialHeight}\n cellsPerSlide={sliderResponsiveColumns}\n direction={sliderObject.direction.dir}\n axis={sliderObject.direction.axis}\n skipSnaps={sliderObject.scroll.skipSnaps}\n selectDuration={sliderObject.motion.selectDuration}\n freeScrollDuration={sliderObject.motion.freeScrollDuration}\n sliderFriction={sliderObject.motion.friction}\n indexChannel={indexChannel}\n loadingOptions={sliderObject.transitions?.loading}\n introOptions={sliderObject.transitions?.intro}\n lazyLoad={sliderObject.lazyLoad}\n rippleEnabled={sliderObject.controls.ripple.enabled}\n rippleClassName={sliderObject.controls.ripple.className}\n fsCaptionPlacement={fs.caption?.placement}\n fsCaptionWidth={fs.caption?.width}\n fsCaptionHeight={fs.caption?.height}\n fsCaptionBreakpoint={fs.caption?.breakpoint}\n renderFsCaption={fs.caption?.render}\n normalizedItems={normalizedItems}\n fsThumbContainerRef={fsThumbContainerRef}\n fullscreenThumbnails={fsResolvedThumbPos}\n sliderImagesReady={sliderImagesReady}\n fullscreenIntroFade={fs.effects.introFade}\n setFsFadeOpening={setFsFadeOpening}\n breakpointMap={effectiveBreakpoints}\n fsIntroDuration={fs.effects.introDuration}\n fsIntroEasing={fs.effects.introEasing}\n >\n {renderedCells}\n </Slider>\n ) : layout === 'masonry' ? (\n <MasonryLayout\n items={masonryChildren}\n masonry={masonryObject}\n breakpoints={effectiveBreakpoints}\n viewportWidth={viewportWidth}\n loading={masonryLoading}\n intro={masonryIntro}\n skeletonCount={cellsState.length}\n />\n ) : layout === 'entries' ? (\n <EntryList\n enabled={layout === \"entries\"}\n entries={entriesObject}\n fsEnabled={!!fs.enabled}\n openFullscreenAt={openFullscreenAt}\n entryFlatIndexRef={entryFlatIndexRef}\n nodeFromMedia={nodeFromMedia}\n isClickRef={isClick}\n registerExpandableImg={registerExpandableImg}\n renderMediaContainer={({ entryIndex, mediaNodes }) => {\n if (entriesObject.mediaLayout === \"masonry\") {\n return (\n <div className={styles.entryMasonry}>\n <MasonryLayout\n items={mediaNodes}\n masonry={masonryObject}\n breakpoints={effectiveBreakpoints}\n viewportWidth={viewportWidth}\n loading={masonryLoading}\n intro={masonryIntro}\n skeletonCount={mediaNodes.length}\n />\n </div>\n );\n }\n\n if (entriesObject.mediaLayout === \"slider\") {\n return (\n <Slider\n imageCount={mediaNodes.length}\n isClick={isClick}\n overlayDivRef={overlayDivRef}\n setSlideIndex={setSlideIndex}\n setShowFullscreenModal={setShowFullscreenModal}\n setShowFullscreenSlider={setShowFullscreenSlider}\n showFullscreenSlider={showFullscreenSlider}\n duplicateImgRef={duplicateImgRef}\n closeButtonRef={closeButtonRef}\n counterRef={counterRef}\n leftChevronRef={leftChevronRef}\n rightChevronRef={rightChevronRef}\n isReady={true}\n setIsReady={() => {}}\n loadingOptions={{ isLoading: false }}\n loop={sliderObject.scroll.loop}\n freeScroll={sliderObject.scroll.freeScroll}\n autoPlay={sliderObject.auto.play.enabled}\n autoPlaySpeed={sliderObject.auto.play.speedMs ?? 3000}\n autoPlayPause={sliderObject.auto.play.pauseMs ?? 1000}\n autoScroll={sliderObject.auto.scroll.enabled}\n autoScrollSpeed={sliderObject.auto.scroll.speedMs ?? 3000}\n autoScrollPause={sliderObject.auto.scroll.pauseMs ?? 1000}\n pauseAutoPlayOnHover={sliderObject.auto.play.pauseOnHover}\n pauseAutoScrollOnHover={sliderObject.auto.scroll.pauseOnHover}\n groupCells={sliderObject.scroll.groupCells}\n centerAlign={sliderObject.align === 'center'}\n gap={resolvedGap}\n sliderViewportStyles={sliderObject.elements?.viewport?.style}\n sliderViewportClassName={sliderObject.elements?.viewport?.className}\n sliderContainerStyles={sliderObject.elements?.container?.style}\n sliderContainerClassName={sliderObject.elements?.container?.className}\n sliderHeight={sliderObject.size?.height}\n responsiveHeights={sliderObject.size?.heightRules}\n arrowStyles={sliderObject.controls.arrows.arrow.style}\n arrowClassName={sliderObject.controls.arrows.arrow.className}\n prevArrowStyles={sliderObject.controls.arrows.prev.style}\n prevArrowClassName={sliderObject.controls.arrows.prev.className}\n nextArrowStyles={sliderObject.controls.arrows.next.style}\n nextArrowClassName={sliderObject.controls.arrows.next.className}\n dotsContainerStyles={sliderObject.controls.dots.root.style}\n dotsContainerClassName={sliderObject.controls.dots.root.className}\n dotsStyles={sliderObject.controls.dots.dot.style}\n dotsClassName={sliderObject.controls.dots.dot.className}\n renderArrows={sliderObject.controls.arrows.render}\n renderPrevArrow={sliderObject.controls.arrows.renderPrev}\n renderNextArrow={sliderObject.controls.arrows.renderNext}\n renderDots={sliderObject.controls.dots.render}\n showArrows={sliderObject.controls.arrows.enabled}\n showDots={sliderObject.controls.dots.enabled}\n enableFullscreen={fs.enabled}\n showProgress={sliderObject.controls.progress.enabled}\n progressClassName={sliderObject.controls.progress.root.className}\n progressStyle={sliderObject.controls.progress.root.style}\n progressInnerClassName={sliderObject.controls.progress.bar.className}\n progressInnerStyle={sliderObject.controls.progress.bar.style}\n renderProgress={sliderObject.controls.progress.render}\n fullscreenControls={{\n close: fs.controls.close,\n arrows: {\n arrow: fs.controls.arrows?.arrow,\n prev: fs.controls.arrows?.prev,\n next: fs.controls.arrows?.next,\n },\n counter: fs.controls.counter,\n }}\n showFsArrows={fs.controls.arrows?.enabled}\n showFsClose={fs.controls.close?.enabled}\n renderFsClose={fs.controls.close?.render}\n renderFsArrows={fs.controls.arrows?.render}\n renderFsPrev={fs.controls.arrows?.renderPrev}\n renderFsNext={fs.controls.arrows?.renderNext}\n showFsCounter={fs.controls.counter?.enabled}\n renderFsCounter={fs.controls.counter?.render}\n parallax={sliderObject.effects?.parallax?.enabled}\n parallaxBleedPct={sliderObject.effects?.parallax?.bleedPct}\n parallaxBorderRadius={sliderObject.effects?.parallax?.borderRadius}\n parallaxSideWidth={sliderObject.effects?.parallax?.sideWidth}\n ref={attachEntrySliderRef(entryIndex)}\n scaleEffect={sliderObject.effects?.scale?.enabled}\n scaleAmount={sliderObject.effects?.scale?.amount}\n fadeEffect={sliderObject.effects?.fade?.enabled}\n initialHeight={sliderObject.size?.initialHeight}\n cellsPerSlide={sliderResponsiveColumns}\n direction={sliderObject.direction.dir}\n axis={sliderObject.direction.axis}\n skipSnaps={sliderObject.scroll.skipSnaps}\n selectDuration={sliderObject.motion.selectDuration}\n freeScrollDuration={sliderObject.motion.freeScrollDuration}\n sliderFriction={sliderObject.motion.friction}\n introOptions={sliderObject.transitions?.intro}\n lazyLoad={sliderObject.lazyLoad}\n rippleEnabled={sliderObject.controls.ripple.enabled}\n rippleClassName={sliderObject.controls.ripple.className}\n renderFsCaption={fs.caption?.render}\n normalizedItems={normalizedItems}\n fsThumbContainerRef={fsThumbContainerRef}\n fullscreenThumbnails={fsResolvedThumbPos}\n sliderImagesReady={sliderImagesReady}\n fullscreenIntroFade={fs.effects.introFade}\n setFsFadeOpening={setFsFadeOpening}\n breakpointMap={effectiveBreakpoints}\n fsIntroDuration={fs.effects.introDuration}\n fsIntroEasing={fs.effects.introEasing}\n >\n {mediaNodes}\n </Slider>\n );\n }\n\n const cells = mediaNodes.map((node, i) => ({\n id: `entry-${entryIndex}-media-${i}`,\n node,\n }));\n\n return (\n <GridLayout\n cells={cells}\n grid={{\n ...gridObject,\n rootClassName: [gridObject.rootClassName, styles.gridEntryRoot].filter(Boolean).join(\" \"),\n itemClassName: [gridObject.itemClassName, styles.gridEntryItem].filter(Boolean).join(\" \"),\n }}\n renderMode=\"passthrough\"\n gridItemBaseClass=\"\"\n breakpoints={effectiveBreakpoints}\n viewportWidth={viewportWidth}\n loading={{ isLoading: false }}\n intro={gridIntro}\n enableFullscreen={false}\n onOpen={() => {}}\n registerExpandableImg={() => {}}\n />\n );\n }}\n />\n ) : layout === 'grid' ? (\n <GridLayout\n cells={cellsState}\n grid={gridObject}\n breakpoints={effectiveBreakpoints}\n viewportWidth={viewportWidth}\n loading={gridLoading}\n intro={gridIntro}\n enableFullscreen={!!fs.enabled}\n onOpen={openFullscreenAt}\n registerExpandableImg={registerExpandableImg}\n />\n ) : null}\n </div>\n {layout === 'slider' && (resolvedThumbPos === 'bottom' || resolvedThumbPos === 'right') && (\n <ThumbnailSlider\n indexChannel={indexChannel}\n position={resolvedThumbPos}\n thumbnailWidth={sliderObject.thumbnails.layout?.thumbnail?.width}\n thumbnailHeight={sliderObject.thumbnails.layout?.thumbnail?.height}\n thumbnailsCenter={sliderObject.thumbnails.layout?.center}\n thumbnailsContainerWidth={sliderObject.thumbnails.layout?.container?.width}\n thumbnailsContainerHeight={sliderObject.thumbnails.layout?.container?.height}\n thumbnailsContainerStyle={sliderObject.thumbnails.elements?.container?.style}\n thumbnailsContainerClassName={sliderObject.thumbnails.elements?.container?.className}\n thumbnailItemStyle={sliderObject.thumbnails.elements?.thumbnail?.style}\n thumbnailItemClassName={sliderObject.thumbnails.elements?.thumbnail?.className}\n gap={sliderObject.thumbnails.layout?.gap}\n freeScroll={sliderObject.thumbnails.scroll?.freeScroll}\n groupCells={sliderObject.thumbnails.scroll?.groupCells}\n loop={sliderObject.thumbnails.scroll?.loop}\n skipSnaps={sliderObject.thumbnails.scroll?.skipSnaps}\n centerActiveThumb={sliderObject.thumbnails.scroll?.centerActiveThumb}\n selectDuration={sliderObject.thumbnails.motion?.selectDuration}\n freeScrollDuration={sliderObject.thumbnails.motion?.freeScrollDuration}\n sliderFriction={sliderObject.thumbnails.motion?.friction}\n loadingOptions={sliderObject.thumbnails.transitions?.loading}\n introOptions={sliderObject.thumbnails.transitions?.intro}\n breakpointMap={sliderObject.thumbnails.breakpointMap}\n rippleEnabled={sliderObject.thumbnails.controls?.ripple?.enabled}\n rippleClassName={sliderObject.thumbnails.controls?.ripple?.className}\n showArrows={sliderObject.thumbnails.controls?.enabled}\n arrowStyles={sliderObject.thumbnails.controls?.arrow?.style}\n arrowClassName={sliderObject.thumbnails.controls?.arrow?.className}\n prevArrowStyles={sliderObject.thumbnails.controls?.prev?.style}\n prevArrowClassName={sliderObject.thumbnails.controls?.prev?.className}\n nextArrowStyles={sliderObject.thumbnails.controls?.next?.style}\n nextArrowClassName={sliderObject.thumbnails.controls?.next?.className}\n renderArrows={sliderObject.thumbnails.controls?.render}\n renderPrevArrow={sliderObject.thumbnails.controls?.renderPrev}\n renderNextArrow={sliderObject.thumbnails.controls?.renderNext}\n >\n {sliderObject.thumbnails.children}\n </ThumbnailSlider>\n )}\n </div>\n {fs.enabled && (\n <FullscreenModal\n fsSub={fsSub}\n open={showFullscreenModal}\n onClose={() => setShowFullscreenModal(false)}\n isClick={isClick}\n isAnimating={isAnimatingRef}\n overlayDivRef={overlayDivRef}\n cells={cells}\n setShowFullscreenSlider={setShowFullscreenSlider}\n imageCount={cellsState.length}\n slides={slidesForFullscreen}\n slider={sliderForFullscreen}\n visibleImagesRef={visibleImagesForFullscreen}\n selectedIndex={selectedIndexForFullscreen}\n sliderX={sliderXForFullscreen}\n sliderVelocity={sliderVelocityForFullscreen}\n isWrapping={isWrappingForFullscreen}\n wrappedItems={wrappedItems}\n setClosingModal={setClosingModal}\n closeButtonRef={closeButtonRef}\n counterRef={counterRef}\n leftChevronRef={leftChevronRef}\n rightChevronRef={rightChevronRef}\n centerAlign={sliderObject.align === 'center'}\n centerSlider={centerSliderForFullscreen}\n setSliderIndex={setSliderIndexForFullscreen}\n onForceResetZoom={() => onForceResetZoom()}\n layout={layout}\n expandableImgRefs={expandableImgRefs}\n entryMapRef={entryMapRef}\n entryMediaLayout={entriesObject.mediaLayout}\n introFade={fs.effects.introFade}\n introDuration={fs.effects.introDuration}\n introEasing={fs.effects.introEasing}\n >\n <div\n style={{\n position: 'absolute',\n inset: 0,\n display: 'flex',\n flexDirection\n }}\n >\n <div\n style={{\n flex: '1 1 auto',\n position: 'relative',\n minHeight: 0,\n }}\n >\n <FullscreenSlider\n key={epoch}\n sub={fsSub}\n ref={fullscreenSliderApi}\n imageCount={cellsState.length}\n slideIndex={slideIndex}\n isClick={isZoomClick}\n isZoomed={isZoomed}\n windowSize={windowSize}\n show={showFullscreenModal}\n handleZoomToggle={(e, imageRef) =>\n handleZoomToggle(zoomCtx as any, e as any, imageRef as any)\n }\n imageRefs={imageRefs.current}\n cells={cells}\n isPinching={isPinching}\n scale={scaleRef.current}\n isTouchPinching={isTouchPinching}\n showFullscreenSlider={showFullscreenSlider}\n isZooming={isZooming}\n plyrRefs={wrappedModePlyrRefs}\n plyrRef={singleModePlyrRefs}\n closingModal={closingModal}\n closeButtonRef={closeButtonRef}\n counterRef={counterRef}\n leftChevronRef={leftChevronRef}\n rightChevronRef={rightChevronRef}\n overlayDivRef={overlayDivRef}\n direction={sliderObject.direction.dir}\n isWrapping={isWrappingForFullscreen}\n sliderDuration={fs.slider.duration}\n sliderFriction={fs.slider.friction}\n suppressLoopRef={suppressLoopRef}\n fadeOpening={fsFadeOpening}\n introFade={fs.effects.introFade}\n slideFade={fs.effects.slideFade}\n slideFadeDuration={fs.effects.slideFadeDuration}\n slideFadeEasing={fs.effects.slideFadeEasing}\n normalizedItems={normalizedItems}\n introDuration={fs.effects.introDuration}\n introEasing={fs.effects.introEasing}\n resetAllZoomDom={() => resetZoomForSlideChange()}\n >\n {normalizedItems.length > 1 ? wrappedFullscreenImages : oneFullscreenImage}\n </FullscreenSlider>\n </div>\n {\n fs.thumbnails?.layout?.position !== undefined && (\n <div\n ref={fsThumbContainerRef}\n className={fs.thumbnails.elements?.container?.className}\n style={{\n flex: fs.thumbnails?.layout?.position === 'left' || fs.thumbnails?.layout?.position === 'right'\n ? '0 0 auto'\n : '0 0 auto',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding:\n fs.thumbnails?.layout?.position === 'top' || fs.thumbnails?.layout?.position === 'bottom'\n ? '0.75rem 1rem'\n : '0.75rem 0.5rem',\n transition: `background-color ${fsThumbFadeDuration}ms ${fsThumbFadeEasing}`,\n backgroundColor: fsThumbsOpen\n ? 'rgba(255,255,255,1)'\n : 'rgba(255,255,255,0)',\n ...(fs.thumbnails.elements?.container?.style || {})\n }}\n >\n {normalizedItems.length > 1 && (\n <FullscreenThumbnailSlider\n items={normalizedItems.map((item) => ({\n thumbSrc: (item as any).thumbSrc ?? (item as any).src,\n alt: (item as any).alt,\n }))}\n position={fsResolvedThumbPos}\n fsSub={fsSub}\n thumbnailWidth={fs.thumbnails.layout?.thumbnail?.width}\n thumbnailHeight={fs.thumbnails.layout?.thumbnail?.height}\n thumbnailsCenter={fs.thumbnails.layout?.center}\n thumbnailsContainerWidth={fs.thumbnails.layout?.container?.width}\n thumbnailsContainerHeight={fs.thumbnails.layout?.container?.height}\n visible={showFullscreenModal}\n invisible={closingModal}\n thumbnailItemClassName={fs.thumbnails.elements?.thumbnail?.className}\n thumbnailItemStyle={fs.thumbnails.elements?.thumbnail?.style}\n gap={fs.thumbnails.layout?.gap}\n freeScroll={fs.thumbnails.scroll?.freeScroll}\n groupCells={fs.thumbnails.scroll?.groupCells}\n loop={fs.thumbnails.scroll?.loop}\n direction={sliderObject.direction.dir}\n skipSnaps={fs.thumbnails.scroll?.skipSnaps}\n centerActiveThumb={fs.thumbnails.scroll?.centerActiveThumb}\n selectDuration={fs.thumbnails.motion?.selectDuration}\n freeScrollDuration={fs.thumbnails.motion?.freeScrollDuration}\n sliderFriction={fs.thumbnails.motion?.friction}\n breakpointMap={fs.thumbnails.breakpointMap}\n rippleEnabled={fs.thumbnails.controls?.ripple?.enabled}\n rippleClassName={fs.thumbnails.controls?.ripple?.className}\n showArrows={fs.thumbnails.controls?.enabled}\n arrowStyles={sliderObject.thumbnails.controls?.arrow?.style}\n arrowClassName={sliderObject.thumbnails.controls?.arrow?.className}\n prevArrowStyles={fs.thumbnails.controls?.prev?.style}\n prevArrowClassName={fs.thumbnails.controls?.prev?.className}\n nextArrowStyles={fs.thumbnails.controls?.next?.style}\n nextArrowClassName={fs.thumbnails.controls?.next?.className}\n renderArrows={sliderObject.thumbnails.controls?.render}\n renderPrevArrow={fs.thumbnails.controls?.renderPrev}\n renderNextArrow={fs.thumbnails.controls?.renderNext}\n />\n )}\n </div>\n )\n }\n </div>\n {showFullscreenModal && layout === 'entries' ? (\n <FsEntryOverlayMount setMountEl={setFsEntryOverlayMountEl} />\n ) : null}\n </FullscreenModal>\n )}\n </>\n );\n})\n\nexport default Gallery;","/* eslint-disable react-hooks/exhaustive-deps */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n'use client'\n\nimport {\n useRef,\n useEffect,\n ReactNode,\n Children,\n RefObject,\n useCallback,\n useImperativeHandle,\n forwardRef\n} from 'react'\nimport type { APITypes } from 'plyr-react'\nimport styles from './FullscreenSlider.module.css'\nimport type { FullscreenSliderSub, FSRequest } from './fullscreenSliderSub'\nimport { createDragTracker } from '../shared/input/dragTracker'\nimport { Vector1D, Vector1DType } from '../shared/motion/vector1d'\nimport { ScrollBody, ScrollBodyType } from '../shared/motion/scrollBody'\nimport { Limit } from '../shared/motion/limit'\nimport { ScrollLooper } from '../shared/motion/scrollLooper'\nimport { BaseTarget, factorAbs, mathSign, ScrollTarget, ScrollTargetType } from '../shared/motion/scrollTarget'\nimport { Animations, AnimationsType } from '../shared/motion/animations'\nimport { EventStore } from '../shared/motion/eventStore'\nimport { MediaItem } from '../shared/types/media'\nimport { isMouseEvent } from '../shared/input/pointerTypes'\nimport { WindowType } from '../shared/input/pointerTypes'\nimport { FullscreenAxisType as AxisType, FullscreenAxis as Axis, FullscreenAxisLike as AxisLike } from '../shared/types/axis'\nimport { TranslateFullscreen as Translate } from '../shared/motion/translate'\nimport { createBaseLimit } from '../shared/motion/baseLimit'\nimport { Counter, CounterType } from '../shared/motion/counter'\n\nconst mathAbs = Math.abs\nconst clamp01 = (n: number) => Math.max(0, Math.min(1, n))\nconst easeOutCubic = (t: number) => 1 - Math.pow(1 - t, 3)\n\nfunction DragTracker(axis: AxisLike, ownerWindow: WindowType) {\n return createDragTracker({\n ownerWindow,\n axis,\n })\n}\n\ntype FsScrollTo = {\n distance: (n: number, snap: boolean) => void\n index: (n: number, direction: number) => void\n}\n\ntype FsLimit = {\n min: number\n max: number\n reachedAny: (n: number) => boolean\n constrain: (n: number) => number\n removeOffset: (n: number) => number\n}\n\ninterface FullscreenSliderProps {\n sub: FullscreenSliderSub\n children: ReactNode\n imageCount: number\n slideIndex: number\n isClick: React.RefObject<boolean>\n isZoomed: boolean\n windowSize: { width: number; height: number }\n show: boolean\n handleZoomToggle: (\n e:\n | React.PointerEvent<HTMLDivElement>\n | React.TouchEvent<HTMLDivElement>,\n imageRef: React.RefObject<HTMLDivElement | null>\n ) => void\n imageRefs: React.RefObject<HTMLDivElement | null>[]\n cells: RefObject<{ element: HTMLElement; index: number }[]>\n isPinching: React.RefObject<boolean>\n scale: number\n isTouchPinching: React.RefObject<boolean>\n showFullscreenSlider: boolean\n isZooming: RefObject<boolean>\n plyrRefs: RefObject<(APITypes | null)[]>\n plyrRef: RefObject<(APITypes | null)[]>\n closingModal: boolean\n counterRef: RefObject<HTMLElement | null>\n leftChevronRef: RefObject<HTMLElement | null>\n rightChevronRef: RefObject<HTMLElement | null>\n closeButtonRef: RefObject<HTMLElement | null>\n overlayDivRef: RefObject<HTMLDivElement | null>\n direction?: 'ltr' | 'rtl';\n isWrapping: RefObject<boolean>\n sliderDuration: number;\n sliderFriction: number;\n suppressLoopRef: React.RefObject<boolean>;\n fadeOpening: boolean;\n introFade?: boolean;\n slideFade?: boolean;\n slideFadeDuration?: number;\n slideFadeEasing?: string;\n normalizedItems: MediaItem[];\n introDuration?: number;\n introEasing?: string;\n resetAllZoomDom: () => void;\n}\n\nexport interface FullscreenSliderHandle {\n centerSlider(): void\n}\n\nconst FullscreenSlider = forwardRef<FullscreenSliderHandle, FullscreenSliderProps>(\n (\n {\n sub,\n children,\n imageCount,\n slideIndex,\n isClick,\n isZoomed,\n windowSize,\n show,\n handleZoomToggle,\n imageRefs,\n cells,\n isPinching,\n isTouchPinching,\n showFullscreenSlider,\n isZooming,\n plyrRefs,\n plyrRef,\n closingModal,\n counterRef,\n leftChevronRef,\n rightChevronRef,\n closeButtonRef,\n overlayDivRef,\n direction,\n isWrapping,\n sliderDuration,\n sliderFriction,\n suppressLoopRef,\n fadeOpening,\n introFade,\n slideFade = false,\n slideFadeDuration = 120,\n slideFadeEasing = 'cubic-bezier(.4,0,.22,1)',\n normalizedItems,\n introDuration = 300,\n introEasing = 'cubic-bezier(.4,0,.22,1)',\n resetAllZoomDom\n },\n ref\n ) => {\n const isRtl = direction === 'rtl' ? true : false\n const rtlCls = isRtl ? styles.rtl : '';\n const sign = isRtl ? -1 : 1;\n const viewportRef = useRef<HTMLDivElement | null>(null)\n const slider = useRef<HTMLDivElement | null>(null)\n const axisRef = useRef<AxisType | null>(null)\n const locationRef = useRef<Vector1DType | null>(null)\n const previousLocationRef = useRef<Vector1DType | null>(null)\n const offsetLocationRef = useRef<Vector1DType | null>(null)\n const targetRef = useRef<Vector1DType | null>(null)\n const bodyRef = useRef<ScrollBodyType | null>(null)\n const translateRef = useRef<ReturnType<typeof Translate> | null>(null)\n const animRef = useRef<AnimationsType | null>(null)\n const isAnimatingRef = useRef(false)\n const pointerDownRef = useRef(false)\n const yTemp = useRef(0)\n const dragThreshold = 5\n const FADE_DISTANCE = 300\n const selectedIndex = useRef(0)\n const hasPositioned = useRef<boolean>(false)\n const perSlideRef = useRef(0)\n const contentSizeRef = useRef(0)\n const loopLimitRef = useRef<ReturnType<typeof Limit> | null>(null)\n const scrollSnapsRef = useRef<number[]>([])\n const scrollContentSizeRef = useRef(0)\n const scrollLimitRef = useRef<FsLimit | null>(null)\n const scrollTargetRef = useRef<ScrollTargetType | null>(null)\n const scrollToRef = useRef<FsScrollTo | null>(null)\n const slides = useRef<{ cells: { element: HTMLElement }[] }[]>([])\n const indexCurrentRef = useRef<CounterType | null>(null)\n const indexPreviousRef = useRef<CounterType | null>(null)\n const isPointerDown = useRef(false)\n const isVerticalScroll = useRef(false)\n const isScrolling = useRef(false)\n const isClosing = useRef(false)\n const clickedImgMargin = useRef(false)\n const dragStartY = useRef(0)\n const dragYForClose = useRef(0)\n const x = useRef(0)\n const y = useRef(0)\n const velocityX = useRef(0)\n const dragX = useRef(0)\n const previousDragX = useRef(0)\n const dragMoveTime = useRef<Date | null>(null)\n const activeTouchCount = useRef(0)\n const wasPinch = useRef(false)\n const appliedYRef = useRef(0)\n type DragMode = 'none' | 'x' | 'y'\n const dragMode = useRef<DragMode>('none')\n\n function useLatest<T>(value: T) {\n const r = useRef(value)\n useEffect(() => { r.current = value }, [value])\n return r\n }\n const isZoomedRef = useLatest(isZoomed)\n\n const recenterWithAnchor = useCallback(() => {\n const track = slider.current;\n if (\n !track ||\n !locationRef.current ||\n !previousLocationRef.current ||\n !offsetLocationRef.current ||\n !targetRef.current\n ) {\n return;\n }\n\n const per = track.clientWidth || 1;\n perSlideRef.current = per;\n\n const len = slides.current.length || 1;\n const W = per * len;\n\n contentSizeRef.current = W;\n loopLimitRef.current = Limit(-W, 0);\n\n const snaps = Array.from({ length: len }, (_, i) => -per * i);\n scrollSnapsRef.current = snaps;\n\n const fsLimit = createBaseLimit(-W, 0);\n scrollLimitRef.current = fsLimit;\n\n if (loopLimitRef.current) {\n scrollTargetRef.current = ScrollTarget(\n true,\n snaps,\n W,\n loopLimitRef.current,\n targetRef.current\n );\n }\n\n const idx =\n indexCurrentRef.current?.get() ??\n selectedIndex.current ??\n 0;\n\n const nx = -per * idx;\n\n setAllX(nx);\n setTranslateX(nx, 0);\n animRef.current?.resetBlend();\n }, []);\n \n useEffect(() => {\n const el = slider.current;\n if (!el) return;\n\n const update = () => {\n recenterWithAnchor();\n };\n\n update();\n\n const ro = new ResizeObserver(update);\n ro.observe(el);\n\n return () => ro.disconnect();\n }, [show, recenterWithAnchor]);\n\n useEffect(() => {\n const childrenArray = Children.toArray(children)\n slides.current = []\n if (imageCount > 1) {\n for (let i = 1; i < childrenArray.length - 1; i++) {\n slides.current.push({ cells: [cells.current[i]] as any })\n }\n } else {\n for (let i = 0; i < childrenArray.length; i++) {\n slides.current.push({ cells: [cells.current[i]] as any })\n }\n }\n }, [children])\n\n function commitIndexChange(idx: number) {\n selectedIndex.current = idx;\n indexCurrentRef.current?.set(idx);\n sub.setLocalIndex(idx);\n updateCounterFromIndex(idx);\n\n resetAllZoomDom();\n }\n \n const GLOBAL_DRAG_ATTR = 'data-rmg-global-drag';\n const GLOBAL_DRAG_STYLE_ID = 'rmg-global-drag-style';\n\n function ensureGlobalDragStyle() {\n if (document.getElementById(GLOBAL_DRAG_STYLE_ID)) return;\n const style = document.createElement('style');\n style.id = GLOBAL_DRAG_STYLE_ID;\n style.textContent = `\n html[${GLOBAL_DRAG_ATTR}] * { cursor: grabbing !important; }\n html[${GLOBAL_DRAG_ATTR}] { cursor: grabbing !important; }\n `;\n document.head.appendChild(style);\n }\n\n function setGlobalGrabbing(on: boolean) {\n const html = document.documentElement;\n if (!html) return;\n if (on) html.setAttribute(GLOBAL_DRAG_ATTR, '');\n else html.removeAttribute(GLOBAL_DRAG_ATTR);\n }\n\n function useGlobalGrabbingGuards() {\n const guardsRef = useRef<ReturnType<typeof EventStore> | null>(null);\n\n const start = () => {\n if (guardsRef.current) return;\n ensureGlobalDragStyle();\n setGlobalGrabbing(true);\n guardsRef.current = EventStore()\n .add(window, 'mouseup', stop, true)\n .add(window, 'pointerup', stop, true)\n .add(window, 'touchend', stop, { passive: true })\n .add(window, 'touchcancel', stop, { passive: true })\n .add(window, 'blur', stop, true)\n .add(document, 'visibilitychange', () => { if (document.hidden) stop(); });\n };\n\n const stop = () => {\n guardsRef.current?.clear();\n guardsRef.current = null;\n setGlobalGrabbing(false);\n };\n\n useEffect(() => stop, []);\n\n return { start, stop };\n }\n\n const { start: startGrabbing, stop: stopGrabbing } = useGlobalGrabbingGuards();\n\n const slideFadeBusyRef = useRef(false);\n\n const SLIDE_FADE_MS = slideFadeDuration;\n const SLIDE_FADE_EASING = slideFadeEasing\n\n function jumpToIndexInstant(idx: number) {\n const per = perSlide();\n const nx = -per * idx;\n\n animRef.current?.stop();\n bodyRef.current?.useDuration(0).useFriction(1);\n\n setAllX(nx);\n setTranslateX(nx, 0);\n\n commitIndexChange(idx);\n }\n\n function fadeToIndex(idx: number) {\n if (!slideFade) return;\n\n const track = slider.current;\n if (!track) return;\n\n if (!showFullscreenSlider) return;\n\n slideFadeBusyRef.current = true;\n\n const prevTransition = track.style.transition;\n const prevOpacity = track.style.opacity;\n\n track.style.transition = `opacity ${SLIDE_FADE_MS}ms ${SLIDE_FADE_EASING}`;\n\n const computed = window.getComputedStyle(track).opacity;\n track.style.opacity = computed;\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n (track as any).offsetWidth;\n\n track.style.opacity = '0';\n\n const t1 = window.setTimeout(() => {\n\n jumpToIndexInstant(idx);\n\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n (track as any).offsetWidth;\n\n track.style.opacity = '1';\n\n const t2 = window.setTimeout(() => {\n track.style.transition = prevTransition;\n if (!prevTransition) track.style.opacity = prevOpacity;\n\n slideFadeBusyRef.current = false;\n window.clearTimeout(t2);\n }, SLIDE_FADE_MS + 40);\n\n window.clearTimeout(t1);\n }, SLIDE_FADE_MS + 20);\n }\n\n function perSlide() {\n return perSlideRef.current || slider.current?.clientWidth || 1\n }\n function slideCount() {\n return slides.current.length || 1\n }\n\n function commitXY(canonicalX: number, ny: number) {\n const nx = Math.round(canonicalX) * sign;\n translateRef.current?.to(nx, ny)\n if (overlayDivRef.current) {\n const progress = clamp01(Math.abs(ny) / FADE_DISTANCE)\n const o = 1 - easeOutCubic(progress)\n overlayDivRef.current.style.opacity = String(o)\n }\n }\n\n useEffect(() => {\n if (closingModal) {\n animRef.current?.stop()\n pointerDownRef.current = false\n }\n }, [closingModal])\n\n useEffect(() => {\n if (!slider.current || hasPositioned.current) return\n\n if (counterRef.current) {\n counterRef.current.textContent = `${\n !isWrapping.current ? slideIndex + 1 : slideIndex\n } / ${imageCount}`\n }\n\n if ((slideIndex === 1 && isWrapping.current === true) || (slideIndex === 0 && !isWrapping.current)) {\n selectedIndex.current = 0\n sub.setLocalIndex(0)\n setTimeout(() => {\n if (!slider.current) return\n const startX = 0\n x.current = startX\n y.current = 0\n if (locationRef.current && previousLocationRef.current && offsetLocationRef.current && targetRef.current) {\n locationRef.current.set(startX)\n previousLocationRef.current.set(startX)\n offsetLocationRef.current.set(startX)\n targetRef.current.set(startX)\n setTranslateX(startX, 0)\n } else {\n const sx = Math.round(startX) * sign\n slider.current.style.transform = `translate3d(${sx}px, 0, 0)`\n }\n }, 100)\n hasPositioned.current = true\n return\n }\n\n let actualIndex = slideIndex - 1\n actualIndex = ((actualIndex % imageCount) + imageCount) % imageCount\n if (actualIndex === 0) actualIndex = imageCount\n const finalIndex = isWrapping.current === true ? actualIndex : slideIndex\n\n selectedIndex.current = finalIndex\n sub.setLocalIndex(finalIndex)\n\n setTimeout(() => {\n if (!slider.current) return\n const per = perSlideRef.current || slider.current.clientWidth\n const startX = -per * finalIndex\n x.current = startX\n y.current = 0\n if (locationRef.current && previousLocationRef.current && offsetLocationRef.current && targetRef.current) {\n locationRef.current.set(startX)\n previousLocationRef.current.set(startX)\n offsetLocationRef.current.set(startX)\n targetRef.current.set(startX)\n setTranslateX(startX, 0)\n } else {\n const sx = Math.round(startX) * sign\n slider.current.style.transform = `translate3d(${sx}px, 0, 0)`\n }\n }, 100)\n\n hasPositioned.current = true\n }, [show, slides.current])\n\n const ySnapTweenId = { current: 0 }\n function snapBackY(ms = 300) {\n const startId = ++ySnapTweenId.current\n const fromY = yTemp.current || 0\n const start = performance.now()\n const step = (now: number) => {\n if (startId !== ySnapTweenId.current || isPointerDown.current) return\n const t = Math.min(1, (now - start) / ms)\n const k = easeOutCubic(t)\n yTemp.current = fromY + (0 - fromY) * k\n const xNow = offsetLocationRef.current!.get()\n y.current = yTemp.current\n commitXY(xNow, y.current)\n if (t < 1) requestAnimationFrame(step)\n }\n requestAnimationFrame(step)\n }\n\n function disableOverlayTransition() {\n if (overlayDivRef.current) overlayDivRef.current.style.transition = 'opacity 0s'\n }\n function restoreOverlayTransition() {\n if (overlayDivRef.current) overlayDivRef.current.style.transition = ''\n }\n\n function scrollToIndex(\n requested: number,\n opts: { jump?: boolean; direction?: number } = {}\n ) {\n const { jump = false, direction } = opts;\n\n const indexCurrent = indexCurrentRef.current;\n const fsScrollTo = scrollToRef.current;\n const body = bodyRef.current;\n\n if (!fsScrollTo || !body || !indexCurrent) return;\n\n const len = slideCount();\n const from = ((selectedIndex.current || 0) % len + len) % len;\n const to = ((requested || 0) % len + len) % len;\n\n const crossesSeam =\n len > 1 &&\n ((from === 0 && to === len - 1) || (from === len - 1 && to === 0));\n\n if (\n crossesSeam &&\n isZoomedRef.current &&\n imageCount > 1 &&\n selectedIndex.current === 0\n ) {\n const refs = imageRefs;\n\n const firstRealImg =\n refs[1]?.current?.querySelector('img') as HTMLElement | null;\n\n const firstCloneImg =\n refs[imageCount + 1]?.current?.querySelector('img') as HTMLElement | null;\n\n if (firstRealImg && firstCloneImg) {\n const extractScale = (el: HTMLElement | null): number => {\n if (!el) return 1;\n const tr = el.style.transform || '';\n const m = tr.match(/scale\\(([^)]+)\\)/);\n if (!m) return 1;\n const v = parseFloat(m[1]);\n return Number.isFinite(v) ? v : 1;\n };\n\n const readTransform = (el: HTMLElement): string => {\n let transform = el.style.transform;\n if (!transform) {\n const cs = window.getComputedStyle(el);\n transform = cs.transform !== 'none' ? cs.transform : '';\n }\n return transform || '';\n };\n\n const realScale = extractScale(firstRealImg);\n const cloneScale = extractScale(firstCloneImg);\n\n if (realScale > 1.01 && cloneScale <= 1.01) {\n const transform = readTransform(firstRealImg);\n firstCloneImg.style.transition = 'none';\n firstCloneImg.style.transform = transform;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n (firstCloneImg as any).offsetWidth;\n }\n\n // Copy clone -> real if clone is zoomed but real isn't\n if (cloneScale > 1.01 && realScale <= 1.01) {\n const transform = readTransform(firstCloneImg);\n firstRealImg.style.transition = 'none';\n firstRealImg.style.transform = transform;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n (firstRealImg as any).offsetWidth;\n }\n }\n }\n\n const targetIndex = indexCurrent.clone().set(requested).get();\n\n if (jump) {\n body.useDuration(0);\n } else {\n body.useBaseDuration().useBaseFriction();\n }\n\n const dir = typeof direction === 'number' ? direction : 0;\n fsScrollTo.index(targetIndex, dir);\n }\n\n function previous() {\n isVerticalScroll.current = false;\n isScrolling.current = false;\n isPinching.current = false;\n isTouchPinching.current = false;\n\n if (isZoomedRef.current && imageCount > 1 && selectedIndex.current === 0) {\n const refs = imageRefs;\n\n const firstRealImg =\n refs[1]?.current?.querySelector('img') as HTMLElement | null;\n const firstCloneImg =\n refs[imageCount + 1]?.current?.querySelector('img') as HTMLElement | null;\n\n if (firstRealImg && firstCloneImg) {\n const extractScale = (el: HTMLElement | null): number => {\n if (!el) return 1;\n const tr = el.style.transform || '';\n const m = tr.match(/scale\\(([^)]+)\\)/);\n if (!m) return 1;\n const v = parseFloat(m[1]);\n return Number.isFinite(v) ? v : 1;\n };\n\n const realScale = extractScale(firstRealImg);\n const cloneScale = extractScale(firstCloneImg);\n\n if (realScale > 1.01 && cloneScale <= 1.01) {\n let transform = firstRealImg.style.transform;\n if (!transform) {\n const cs = window.getComputedStyle(firstRealImg);\n transform = cs.transform !== 'none' ? cs.transform : '';\n }\n\n firstCloneImg.style.transition = 'none';\n firstCloneImg.style.transform = transform;\n\n (firstCloneImg as any).offsetWidth;\n }\n\n if (cloneScale > 1.01 && realScale <= 1.01) {\n let transform = firstCloneImg.style.transform;\n if (!transform) {\n const cs = window.getComputedStyle(firstCloneImg);\n transform = cs.transform !== 'none' ? cs.transform : '';\n }\n\n firstRealImg.style.transition = 'none';\n firstRealImg.style.transform = transform;\n\n (firstRealImg as any).offsetWidth;\n }\n }\n }\n\n const len = slideCount();\n const cur = selectedIndex.current || 0;\n const nextIdx = ((cur - 1) % len + len) % len;\n\n if (slideFade) {\n fadeToIndex(nextIdx);\n return;\n }\n\n const fsScrollTo = scrollToRef.current;\n const body = bodyRef.current;\n if (!fsScrollTo || !body) return;\n\n const step = perSlide();\n\n body.useBaseDuration().useBaseFriction();\n fsScrollTo.distance(step, true);\n }\n\n function next() {\n isVerticalScroll.current = false;\n isScrolling.current = false;\n isPinching.current = false;\n isTouchPinching.current = false;\n\n if (isZoomedRef.current && imageCount > 1 && selectedIndex.current === 0) {\n const refs = imageRefs;\n\n const firstRealImg =\n refs[1]?.current?.querySelector('img') as HTMLElement | null;\n const firstCloneImg =\n refs[imageCount + 1]?.current?.querySelector('img') as HTMLElement | null;\n\n if (firstRealImg && firstCloneImg) {\n const extractScale = (el: HTMLElement | null): number => {\n if (!el) return 1;\n const tr = el.style.transform || '';\n const m = tr.match(/scale\\(([^)]+)\\)/);\n if (!m) return 1;\n const v = parseFloat(m[1]);\n return Number.isFinite(v) ? v : 1;\n };\n\n const realScale = extractScale(firstRealImg);\n const cloneScale = extractScale(firstCloneImg);\n\n if (realScale > 1.01 && cloneScale <= 1.01) {\n let transform = firstRealImg.style.transform;\n if (!transform) {\n const cs = window.getComputedStyle(firstRealImg);\n transform = cs.transform !== 'none' ? cs.transform : '';\n }\n\n firstCloneImg.style.transition = 'none';\n firstCloneImg.style.transform = transform;\n\n (firstCloneImg as any).offsetWidth;\n }\n\n if (cloneScale > 1.01 && realScale <= 1.01) {\n let transform = firstCloneImg.style.transform;\n if (!transform) {\n const cs = window.getComputedStyle(firstCloneImg);\n transform = cs.transform !== 'none' ? cs.transform : '';\n }\n\n firstRealImg.style.transition = 'none';\n firstRealImg.style.transform = transform;\n\n (firstRealImg as any).offsetWidth;\n }\n }\n }\n\n const len = slideCount();\n const cur = selectedIndex.current || 0;\n const nextIdx = ((cur + 1) % len + len) % len;\n\n if (slideFade) {\n fadeToIndex(nextIdx);\n return;\n }\n\n const fsScrollTo = scrollToRef.current;\n const body = bodyRef.current;\n if (!fsScrollTo || !body) return;\n\n const step = perSlide();\n\n body.useBaseDuration().useBaseFriction();\n fsScrollTo.distance(-step, true);\n }\n\n function updateCounterFromIndex(canonicalIndex: number) {\n const len = slides.current.length || 1\n\n let actualIndex = canonicalIndex + 1\n actualIndex = ((actualIndex % len) + len) % len\n\n if (actualIndex === 0) actualIndex = imageCount\n\n if (counterRef.current) {\n counterRef.current.textContent = `${actualIndex} / ${imageCount}`\n }\n }\n\n function toggleActiveVideoPlay() {\n const idx = selectedIndex.current ?? 0\n\n const actualIndex = idx + 1\n\n const api = plyrRefs.current[actualIndex] || plyrRef.current[0]\n const p = api?.plyr\n if (!p) return\n\n if (p.playing) p.pause()\n else p.play()\n }\n\n function isPlyrControlsEl(el: HTMLElement | null) {\n return !!el?.closest?.(\n [\n '.plyr__controls',\n '.plyr__control--overlaid',\n '.plyr__menu__container',\n '.plyr__tooltip',\n '.plyr__captions',\n ].join(',')\n );\n }\n\n function getClientXY(evt: any) {\n const t = evt.changedTouches?.[0] ?? evt.touches?.[0];\n if (t) return { x: t.clientX, y: t.clientY };\n return { x: evt.clientX, y: evt.clientY };\n }\n\n function clickedVideoSurface(evt: any): boolean {\n const { x, y } = getClientXY(evt);\n\n const under = document.elementFromPoint(x, y) as HTMLElement | null;\n if (!under) return false;\n\n const slide = under.closest('[data-rmg-fs-slide=\"true\"]') as HTMLElement | null;\n if (!slide) return false;\n\n const plyrRoot = slide.querySelector('.plyr') as HTMLElement | null;\n if (!plyrRoot) return false;\n\n const wrap = plyrRoot.querySelector('.plyr__video-wrapper') as HTMLElement | null;\n if (!wrap) return false;\n\n const r = wrap.getBoundingClientRect();\n const inside =\n x >= r.left && x <= r.right &&\n y >= r.top && y <= r.bottom;\n\n if (under.closest('.plyr__controls')) return false;\n\n return inside;\n }\n\n function isYouTubeVideoEvent(evt: Event): boolean {\n const target = evt.target as HTMLElement | null;\n if (!target) return false;\n\n const slide = target.closest('[data-rmg-fs-slide=\"true\"]') as HTMLElement | null;\n if (!slide) return false;\n\n const plyrRoot = slide.querySelector('.rmg__player') as HTMLElement | null;\n if (!plyrRoot) return false;\n\n return plyrRoot.getAttribute('data-rmg-plyr-provider') === 'youtube';\n }\n\n useEffect(() => {\n const root = viewportRef.current;\n const track = slider.current;\n if (!root || !track) return;\n\n const axis = Axis();\n axisRef.current = axis;\n\n const per = perSlideRef.current || track.clientWidth || 1;\n const len = slides.current.length || 1;\n const W = per * len;\n\n const counterMax = len - 1;\n const startIndex = selectedIndex.current || 0;\n\n const location = Vector1D(0);\n const previousLocation = Vector1D(0);\n const offsetLocation = Vector1D(0);\n const target = Vector1D(0);\n\n locationRef.current = location;\n previousLocationRef.current = previousLocation;\n offsetLocationRef.current = offsetLocation;\n targetRef.current = target;\n\n const scrollSnaps = Array.from({ length: len }, (_, i) => -per * i);\n scrollSnapsRef.current = scrollSnaps;\n\n const initialSnap = scrollSnaps[startIndex] ?? 0;\n\n location.set(initialSnap);\n previousLocation.set(initialSnap);\n offsetLocation.set(initialSnap);\n target.set(initialSnap);\n x.current = initialSnap;\n\n translateRef.current = Translate(track);\n setTranslateX(initialSnap, 0);\n\n const indexCurrent = Counter(counterMax, startIndex, true);\n const indexPrevious = Counter(counterMax, startIndex, true);\n\n indexCurrentRef.current = indexCurrent;\n indexPreviousRef.current = indexPrevious;\n\n selectedIndex.current = startIndex;\n sub.setLocalIndex(startIndex);\n updateCounterFromIndex(startIndex);\n\n contentSizeRef.current = W;\n loopLimitRef.current = Limit(-W, 0);\n scrollContentSizeRef.current = W;\n\n const fsLimit = createBaseLimit(-W, 0);\n scrollLimitRef.current = fsLimit;\n\n if (loopLimitRef.current) {\n scrollTargetRef.current = ScrollTarget(\n true,\n scrollSnaps,\n W,\n loopLimitRef.current,\n target\n );\n }\n\n function scrollTo(target: BaseTarget): void {\n const indexCurrent = indexCurrentRef.current;\n const indexPrevious = indexPreviousRef.current;\n if (!indexCurrent || !indexPrevious) return;\n\n const distanceDiff = target.distance;\n const indexDiff = target.index !== indexCurrent.get();\n\n targetRef.current!.add(distanceDiff);\n\n if (distanceDiff) {\n if (bodyRef.current!.duration()) {\n animRef.current!.start();\n } else {\n bodyRef.current!.seek();\n positionSlider();\n }\n }\n\n if (indexDiff) {\n indexPrevious.set(indexCurrent.get());\n indexCurrent.set(target.index);\n\n const idx = indexCurrent.get();\n commitIndexChange(idx);\n }\n }\n\n const fsScrollTo: FsScrollTo = {\n distance(n, snap) {\n const st = scrollTargetRef.current;\n if (!st) return;\n const target = st.byDistance(n, snap);\n scrollTo(target);\n },\n index(n, direction) {\n const st = scrollTargetRef.current;\n const indexCurrent = indexCurrentRef.current;\n if (!st || !indexCurrent) return;\n\n const targetIndex = indexCurrent.clone().set(n).get();\n const target = st.byIndex(targetIndex, direction);\n\n scrollTo(target);\n },\n };\n\n scrollToRef.current = fsScrollTo;\n\n const looper = ScrollLooper(\n contentSizeRef.current,\n loopLimitRef.current,\n location,\n [location, previousLocation, offsetLocation, target]\n )\n\n const body = ScrollBody(location, offsetLocation, previousLocation, target, sliderDuration, sliderFriction)\n bodyRef.current = body\n\n const anim = Animations(\n document,\n window as WindowType,\n () => {\n bodyRef.current?.seek()\n\n const body = bodyRef.current!\n const dir = body.direction() || Math.sign(target.get() - location.get()) || 0\n if (!suppressLoopRef.current && imageCount > 1 && W > 0) {\n looper.loop(dir);\n }\n\n x.current = location.get()\n },\n (alpha) => {\n const cur = location.get()\n const prev = previousLocation.get()\n const loc = cur * alpha + prev * (1 - alpha)\n\n offsetLocation.set(loc)\n x.current = loc\n y.current = isVerticalScroll.current ? yTemp.current : y.current\n\n positionSlider()\n\n const settled = bodyRef.current?.settled()\n if (settled && !pointerDownRef.current) {\n animRef.current?.stop()\n isAnimatingRef.current = false\n }\n if (!isZoomedRef.current && !isAnimatingRef.current) {\n updateActiveIndexFromX(loc)\n }\n }\n )\n animRef.current = anim\n anim.init()\n\n const dragStore = EventStore()\n const moveStore = EventStore()\n const trackerX = DragTracker(axis, window as WindowType)\n\n const axisY: AxisLike = {\n scroll: 'y',\n cross: 'x',\n direction(n: number) { return n },\n measureSize: (r: DOMRect) => r.height\n }\n const trackerY = DragTracker(axisY, window as WindowType)\n\n let isMouse = false\n let preventScroll = false\n let startPX = 0\n let startPY = 0\n const dragThresholdLocal = dragThreshold\n\n function addDragEvents() {\n const node: any = isMouse ? document : root\n moveStore\n .add(node, 'touchmove', onMove as any, { passive: false })\n .add(node, 'touchend', onUp as any)\n .add(node, 'mousemove', onMove as any, { passive: false })\n .add(node, 'mouseup', onUp as any)\n }\n\n function onDown(evt: PointerEvent) {\n const targetEl = evt.target as HTMLElement;\n if (isPlyrControlsEl(targetEl)) return;\n\n if (isZoomedRef.current || closingModal) return\n const isMouseEvt = isMouseEvent(evt as any, window as any)\n isMouse = isMouseEvt\n if (isMouseEvt && (evt as MouseEvent).button !== 0) return\n\n startGrabbing();\n\n wasPinch.current = false\n isTouchPinching.current = false\n activeTouchCount.current = !isMouseEvt\n ? ((evt as unknown as TouchEvent).touches?.length ?? 1)\n : 0\n\n pointerDownRef.current = true\n isPointerDown.current = true\n isScrolling.current = false\n isPinching.current = false\n isTouchPinching.current = false\n isClick.current = true\n dragMode.current = 'none'\n yTemp.current = 0\n dragStartY.current = 0\n dragYForClose.current = 0\n\n trackerX.pointerDown(evt as any)\n trackerY.pointerDown(evt as any)\n\n startPX = trackerX.readPoint(evt as any, 'x')\n startPY = trackerY.readPoint(evt as any, 'y')\n\n bodyRef.current!.useFriction(0).useDuration(0)\n targetRef.current!.set(locationRef.current!.get())\n\n addDragEvents()\n animRef.current?.start()\n }\n\n function onMove(evt: PointerEvent) {\n if (isZoomedRef.current) return\n const isTouchEvt = !isMouseEvent(evt as any, window as any)\n if (isTouchEvt) {\n const t = evt as unknown as TouchEvent\n activeTouchCount.current = t.touches?.length ?? 1\n if (activeTouchCount.current >= 2) {\n wasPinch.current = true\n isTouchPinching.current = true\n isClick.current = false\n dragMode.current = 'none'\n animRef.current?.stop()\n if (t.cancelable) {\n t.preventDefault()\n }\n return\n }\n }\n\n const lastScroll = trackerX.readPoint(evt as any, 'x')\n const lastCross = trackerY.readPoint(evt as any, 'y')\n const dxAbs = Math.abs(lastScroll - startPX)\n const dyAbs = Math.abs(lastCross - startPY)\n\n if (dragMode.current === 'none') {\n if (dxAbs > dragThresholdLocal || dyAbs > dragThresholdLocal) {\n dragMode.current = dxAbs >= dyAbs ? 'x' : 'y'\n isClick.current = false\n if (dragMode.current === 'y') {\n isVerticalScroll.current = true\n dragStartY.current = lastCross\n yTemp.current = 0\n }\n }\n }\n\n disableOverlayTransition()\n\n const diffX = trackerX.pointerMove(evt as any).dx * sign\n trackerY.pointerMove(evt as any)\n\n previousDragX.current = dragX.current\n dragX.current = lastScroll * sign\n velocityX.current = diffX\n dragMoveTime.current = new Date()\n\n if (!preventScroll && !isMouse && dragMode.current === 'x') {\n if (!('cancelable' in evt) || !(evt as any).cancelable) return\n preventScroll = dxAbs > dyAbs\n if (!preventScroll) return\n }\n\n if (dragMode.current === 'y') {\n const dy = lastCross - dragStartY.current\n dragYForClose.current = dy\n yTemp.current = dy * 0.5\n y.current = yTemp.current\n const xNow = offsetLocationRef.current!.get()\n commitXY(xNow, y.current)\n\n if (overlayDivRef.current) {\n const progress = clamp01(Math.abs(dy) / FADE_DISTANCE)\n overlayDivRef.current.style.opacity = String(1 - progress)\n }\n\n evt.preventDefault?.()\n return\n }\n\n bodyRef.current!.useFriction(0.3).useDuration(0.75)\n const delta = axisRef.current!.direction(diffX)\n targetRef.current!.add(delta)\n animRef.current?.start()\n\n if ((evt as any).cancelable) evt.preventDefault()\n }\n\n function onUp(evt: PointerEvent) {\n const isTouchEvt = !isMouseEvent(evt as any, window as any)\n if (isTouchEvt && (isTouchPinching.current || wasPinch.current)) {\n const t = evt as unknown as TouchEvent\n activeTouchCount.current = t.touches?.length ?? 0\n\n if (activeTouchCount.current > 0) {\n return\n }\n\n stopGrabbing();\n\n isTouchPinching.current = false\n wasPinch.current = false\n pointerDownRef.current = false\n isPointerDown.current = false\n isClick.current = false\n dragMode.current = 'none'\n isVerticalScroll.current = false\n yTemp.current = 0\n moveStore.clear()\n preventScroll = false\n return\n }\n\n isPointerDown.current = false\n pointerDownRef.current = false\n moveStore.clear()\n preventScroll = false\n\n if (isClick.current) {\n const target = evt.target as HTMLElement\n if (clickedVideoSurface(evt) && !isYouTubeVideoEvent(evt)) {\n evt.preventDefault?.();\n (evt as any).stopPropagation?.();\n\n toggleActiveVideoPlay();\n dragMode.current = 'none';\n suppressLoopRef.current = true\n goToCanonical(selectedIndex.current)\n return;\n }\n\n if (target.closest(\"[class*='plyr__']\")) return\n\n const t = evt as unknown as TouchEvent\n const clickedImg = target.closest('img')\n\n if (!clickedImg) {\n restoreOverlayTransition()\n clickedImgMargin.current = true\n animRef.current?.stop()\n closeButtonRef.current?.click()\n if (t.cancelable) {\n t.preventDefault()\n }\n return\n }\n\n const imgIndex = (clickedImg as HTMLImageElement).dataset.index\n if (imgIndex == null) return\n const matchedRef = imageRefs[parseInt(imgIndex)]\n\n const idx = selectedIndex.current\n if (idx === imageCount - 1 && Number(imgIndex) === imageCount + 1) {\n suppressLoopRef.current = true\n goToCanonical(0)\n return\n }\n if (idx !== Number(imgIndex) && Number(imgIndex) !== idx + 2) {\n isZooming.current = true\n handleZoomToggle(evt as any, matchedRef)\n }\n if (idx === imageCount - 1 && Number(imgIndex) === imageCount + 1) {\n isZooming.current = true\n handleZoomToggle(evt as any, matchedRef)\n }\n if (slider.current && slider.current.children.length === 1) {\n isZooming.current = true\n handleZoomToggle(evt as any, matchedRef)\n }\n suppressLoopRef.current = true\n goToCanonical(idx)\n return\n }\n\n if (dragMode.current === 'y') {\n const rawY = trackerY.pointerUp(evt as any).fy\n const tinyFlick = Math.abs(rawY) > 0.15\n if (tinyFlick) {\n anim?.stop()\n translateRef.current?.lockY(yTemp.current)\n restoreOverlayTransition()\n isClosing.current = true\n closeButtonRef.current?.click()\n yTemp.current = 0\n isVerticalScroll.current = false\n return\n }\n const dy = dragYForClose.current\n const distanceThreshold = windowSize.height * 0.3\n if (Math.abs(dy) > distanceThreshold) {\n anim?.stop()\n translateRef.current?.lockY(yTemp.current)\n restoreOverlayTransition()\n isClosing.current = true\n closeButtonRef.current?.click()\n yTemp.current = 0\n isVerticalScroll.current = false\n return\n }\n snapBackY(300)\n dragMode.current = 'none'\n isVerticalScroll.current = false\n } else {\n const end = trackerX.pointerUp(evt as any)\n let rawForce = end.fx\n\n if (isRtl) rawForce = -rawForce\n\n const isMouseEvt = isMouseEvent(evt as any, window as any)\n const snapForceBoost = { mouse: 300, touch: 400 }\n const boost = snapForceBoost[isMouseEvt ? 'mouse' : 'touch']\n\n const boostedForce = rawForce * boost\n\n const fsScrollTarget = scrollTargetRef.current\n const fsScrollTo = scrollToRef.current\n const body = bodyRef.current\n\n if (!fsScrollTarget || !fsScrollTo || !body) {\n dragMode.current = 'none'\n return\n }\n\n function allowedForce(force: number): number {\n const len = slides.current.length || 1\n const curIndex = selectedIndex.current || 0\n\n const dirIndex = mathSign(force) * -1\n const nextIndex = ((curIndex + dirIndex) % len + len) % len\n\n const dirBump = slides.current.length === 2 ? mathSign(force) : 0;\n const nextTarget = fsScrollTarget!.byIndex(nextIndex, dirBump)\n return nextTarget.distance\n }\n \n const force = allowedForce(boostedForce)\n\n const baseSpeed = sliderDuration\n const baseFriction = sliderFriction\n const forceFactor = factorAbs(boostedForce, force)\n const speed = baseSpeed - 10 * forceFactor\n const friction = baseFriction + forceFactor / 50\n\n body.useDuration(speed).useFriction(friction)\n\n fsScrollTo.distance(force, true)\n }\n\n dragMode.current = 'none'\n }\n\n dragStore\n .add(root, 'dragstart', (evt) => (evt as Event).preventDefault(), { passive: false })\n .add(root, 'touchstart', onDown as any)\n .add(root, 'mousedown', onDown as any, { passive: true })\n .add(root, 'touchcancel', () => {\n isTouchPinching.current = false\n wasPinch.current = false\n pointerDownRef.current = false\n isPointerDown.current = false\n dragMode.current = 'none'\n isVerticalScroll.current = false\n yTemp.current = 0\n moveStore.clear()\n })\n .add(root, 'contextmenu', onUp as any)\n\n return () => {\n dragStore.clear()\n moveStore.clear()\n animRef.current?.destroy()\n animRef.current = null\n }\n }, [show, imageCount])\n\n function goToCanonical(canonicalIdx: number, mode: 'instant' | 'animated' = 'animated') {\n scrollToIndex(canonicalIdx, { jump: mode === 'instant' })\n }\n\n useEffect(() => {\n const root = viewportRef.current\n if (!root) return\n let wheelTimer: number | null = null\n function onWheel(e: WheelEvent) {\n if (isZoomed) return\n const track = slider.current\n if (!track) return\n const containerWidth = track.clientWidth\n const contentWidth = (slides.current.length || 1) * (perSlideRef.current || containerWidth)\n const canScrollHorizontally = contentWidth > containerWidth\n const isHorizontal = Math.abs(e.deltaX) > Math.abs(e.deltaY)\n if (!isHorizontal || !canScrollHorizontally) return\n e.preventDefault()\n const cur = (offsetLocationRef.current?.get() ?? 0) - (e.deltaX * sign)\n const next = cur\n\n targetRef.current?.set(next)\n bodyRef.current?.useDuration(0).useFriction(1)\n\n animRef.current?.start()\n x.current = next\n positionSlider()\n updateActiveIndexFromX(next)\n\n if (wheelTimer) clearTimeout(wheelTimer as any)\n wheelTimer = window.setTimeout(() => {}, 120)\n }\n root.addEventListener('wheel', onWheel as any, { passive: false })\n return () => root.removeEventListener('wheel', onWheel as any)\n }, [isZoomed])\n\n function updateActiveIndexFromX(loc: number) {\n const per = perSlide()\n const len = slideCount()\n let idx = Math.round(Math.abs(loc) / per)\n idx = ((idx % len) + len) % len\n\n if (selectedIndex.current !== idx) {\n selectedIndex.current = idx\n indexCurrentRef.current?.set(idx)\n\n sub.setLocalIndex(idx)\n let actualIndex = ((idx + 1) % imageCount + imageCount) % imageCount\n if (actualIndex === 0) actualIndex = imageCount\n if (counterRef.current) {\n counterRef.current.textContent = `${actualIndex} / ${imageCount}`\n }\n }\n }\n\n function setTranslateX(tx: number, ty: number) {\n if (!slider.current) return\n let ny: number\n if (isVerticalScroll.current) {\n ny = Math.round(ty)\n } else {\n const currentY = appliedYRef.current\n const easedY = currentY + (0 - currentY) * 0.2\n ny = Math.round(easedY)\n appliedYRef.current = ny\n }\n commitXY(tx, ny)\n }\n\n function positionSlider() {\n setTranslateX(x.current, y.current)\n }\n\n useEffect(() => {\n const left = leftChevronRef.current;\n const right = rightChevronRef.current;\n\n const onClick = (ev: Event) => {\n const target = ev.currentTarget as HTMLButtonElement | null;\n const action = target?.dataset.action;\n if (action === 'prev') previous();\n else if (action === 'next') next();\n };\n\n if (left) left.addEventListener('click', onClick);\n if (right) right.addEventListener('click', onClick);\n\n return () => {\n if (left) left.removeEventListener('click', onClick);\n if (right) right.removeEventListener('click', onClick);\n };\n }, [leftChevronRef.current, rightChevronRef.current, showFullscreenSlider, isRtl]);\n\n function setAllX(nx: number) {\n locationRef.current?.set(nx);\n previousLocationRef.current?.set(nx);\n offsetLocationRef.current?.set(nx);\n targetRef.current?.set(nx);\n x.current = nx;\n }\n\n useEffect(() => {\n let raf = 0;\n function onResize() {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(() => {\n animRef.current?.stop();\n recenterWithAnchor();\n });\n }\n\n onResize();\n\n const roViewport = new ResizeObserver(onResize);\n if (viewportRef.current) roViewport.observe(viewportRef.current);\n\n window.addEventListener('orientationchange', onResize, { passive: true });\n\n return () => {\n cancelAnimationFrame(raf);\n window.removeEventListener('orientationchange', onResize);\n roViewport.disconnect();\n };\n }, [windowSize, recenterWithAnchor]);\n\n useEffect(() => {\n const offReq = sub.onRequest((req: FSRequest) => {\n switch (req.type) {\n case 'requestSet': {\n const mode = req.mode ?? 'animated';\n if (mode === 'instant') {\n const per = perSlide();\n const nx = -per * req.index;\n setAllX(nx);\n setTranslateX(nx, 0);\n animRef.current?.stop();\n const idx = ((req.index % slideCount()) + slideCount()) % slideCount();\n commitIndexChange(idx);\n if (counterRef.current) {\n let actual = selectedIndex.current + 1;\n const len = slideCount();\n actual = ((actual % len) + len) % len;\n if (actual === 0) actual = imageCount;\n counterRef.current.textContent = `${actual} / ${imageCount}`;\n }\n } else {\n const mode = req.mode ?? 'animated'\n const jump = mode === 'instant'\n scrollToIndex(req.index, { jump });\n }\n break;\n }\n case 'requestPrev':\n previous();\n break;\n case 'requestNext':\n next();\n break;\n case 'center':\n recenterWithAnchor();\n break;\n }\n });\n\n const offEvt = sub.onEvent(() => { /* noop here */ });\n\n return () => {\n offReq();\n offEvt();\n };\n }, [sub]);\n\n function centerSlider() {\n scrollToIndex(selectedIndex.current, { jump: false })\n }\n\n useImperativeHandle(ref, () => ({ centerSlider: centerSlider }), [centerSlider]);\n\n function isVideoItem(item: MediaItem | undefined | null) {\n if (!item) return false;\n\n const any = item as any;\n\n if (any.type === 'video') return true;\n if (any.kind === 'video') return true;\n if (any.mediaType === 'video') return true;\n\n if (any.videoSrc) return true;\n if (any.src && typeof any.src === 'string' && any.src.match(/\\.(mp4|webm|mov)(\\?|#|$)/i)) return true;\n\n if (any.plyrSource) return true;\n if (any.sources?.video) return true;\n\n return false;\n }\n\n const len = normalizedItems?.length || imageCount || 1;\n\n const openingIndex =\n ((slideIndex ?? 0) % len + len) % len;\n\n const isVideoSlide =\n isVideoItem(normalizedItems?.[openingIndex]);\n\n\n return (\n <div\n ref={viewportRef}\n className={`fs_viewport ${rtlCls}`}\n dir={isRtl ? 'rtl' : undefined}\n style={{\n position: 'absolute',\n inset: 0,\n overflow: 'hidden',\n }}\n >\n <div\n ref={slider}\n className={`fullscreen_slider ${rtlCls}`}\n style={{\n position: 'absolute',\n inset: 0,\n overflow: 'visible',\n cursor: 'grab',\n userSelect: 'none',\n willChange: 'opacity, transform',\n backfaceVisibility: 'hidden',\n transition: introFade || isVideoSlide\n ? `opacity ${introDuration}ms ${introEasing}`\n : undefined,\n opacity: showFullscreenSlider\n ? introFade || isVideoSlide\n ? (fadeOpening ? 0 : 1)\n : 1\n : 0,\n }}\n >\n {children}\n </div>\n </div>\n )\n }\n)\n\nFullscreenSlider.displayName = 'FullscreenSlider'\nexport default FullscreenSlider",".rtl {}\n\n.track { position: relative; left: 0; }\n.rtl .track { left: auto; right: 0; }\n\n[data-rmg-plyr-provider='mp4'] :global(.plyr__video-wrapper),\n[data-rmg-plyr-provider='vimeo'] :global(.plyr__video-wrapper) {\n pointer-events: none !important;\n}","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AxisKey, PointerEventType, WindowType } from \"./pointerTypes\"\n\nexport type DragAxis = {\n scroll: AxisKey\n cross?: AxisKey\n}\n\nexport type DragTrackerOptions = {\n axis: DragAxis\n ownerWindow: WindowType\n windowMs?: number\n recentMs?: number\n releaseFreshMs?: number\n stillMs?: number\n moveEps?: number\n flickVel?: number\n flickDist?: number\n minVel?: number\n}\n\nexport function createDragTracker(opts: DragTrackerOptions) {\n const {\n axis,\n ownerWindow,\n windowMs = 120,\n recentMs = 90,\n releaseFreshMs = 180,\n stillMs = 140,\n moveEps = 0.5,\n flickVel = 0.1,\n flickDist = 1,\n minVel = 0.06,\n } = opts\n\n const EPS = 1e-6\n\n type Sample = { t: number; dx: number; dy: number }\n let samples: Sample[] = []\n\n let startX = 0, startY = 0\n let lastX = 0, lastY = 0, lastT = 0\n let lastActiveT = 0\n\n function now(evt: PointerEventType): number {\n const ts = (evt as any).timeStamp as number | undefined\n const perf = ownerWindow?.performance?.now ? ownerWindow.performance.now() : Date.now()\n return (typeof ts === 'number' && ts > 0) ? ts : perf\n }\n\n function isMouse(evt: PointerEventType): evt is MouseEvent {\n return (ownerWindow as any).MouseEvent\n ? evt instanceof (ownerWindow as any).MouseEvent\n : 'clientX' in evt && !('touches' in (evt as any))\n }\n\n function readPoint(evt: PointerEventType, axisKey: AxisKey = axis.scroll) {\n const coord = axisKey === 'x' ? 'clientX' : 'clientY'\n if (isMouse(evt)) return (evt as MouseEvent)[coord]\n\n const te = evt as TouchEvent\n const touch =\n (te.touches && te.touches[0]) ||\n (te.changedTouches && te.changedTouches[0])\n\n return touch ? (touch as any)[coord] as number : (axisKey === 'x' ? lastX : lastY)\n }\n\n function trimTo(t: number) {\n const earliest = t - windowMs * 1.5\n while (samples.length && samples[0].t < earliest) samples.shift()\n }\n\n function velocityInWindow(endT: number, spanMs: number) {\n const startT = endT - spanMs\n let sumDx = 0, sumDy = 0\n let firstT = Number.POSITIVE_INFINITY, lastT = Number.NEGATIVE_INFINITY\n\n for (let i = samples.length - 1; i >= 0; i--) {\n const s = samples[i]\n if (s.t < startT) break\n\n firstT = Math.min(firstT, s.t)\n lastT = Math.max(lastT, s.t)\n\n const age = s.t - startT\n const w = 0.5 + 0.5 * (age / Math.max(spanMs, 1))\n\n sumDx += s.dx * w\n sumDy += s.dy * w\n }\n\n const dt = Math.max(lastT - firstT, EPS)\n return { vx: sumDx / dt, vy: sumDy / dt }\n }\n\n function displacementInWindow(endT: number, spanMs: number) {\n const startT = endT - spanMs\n let dx = 0, dy = 0\n\n for (let i = samples.length - 1; i >= 0; i--) {\n const s = samples[i]\n if (s.t < startT) break\n dx += s.dx\n dy += s.dy\n }\n\n return { dx, dy }\n }\n\n return {\n axis,\n\n pointerDown(evt: PointerEventType) {\n samples = []\n startX = lastX = readPoint(evt, 'x')\n startY = lastY = readPoint(evt, 'y')\n return { x: startX, y: startY }\n },\n\n pointerMove(evt: PointerEventType) {\n const t = now(evt)\n const x = readPoint(evt, 'x')\n const y = readPoint(evt, 'y')\n\n const dx = x - lastX\n const dy = y - lastY\n\n samples.push({ t, dx, dy })\n trimTo(t)\n\n if (Math.abs(dx) >= moveEps || Math.abs(dy) >= moveEps) lastActiveT = t\n\n lastX = x\n lastY = y\n lastT = t\n\n return { dx, dy }\n },\n\n pointerUp(evt: PointerEventType) {\n const t = now(evt)\n samples.push({ t, dx: 0, dy: 0 })\n trimTo(t)\n\n const sinceLastMove = t - lastT\n const idleMs = t - lastActiveT\n\n const releasedFresh = sinceLastMove <= releaseFreshMs\n const wasStill = idleMs > stillMs\n\n if (wasStill) return { fx: 0, fy: 0 }\n\n const { vx: vxRecent, vy: vyRecent } = velocityInWindow(t, recentMs)\n const { dx: dxRecent, dy: dyRecent } = displacementInWindow(t, recentMs)\n\n const intentX = releasedFresh && (Math.abs(vxRecent) >= flickVel || Math.abs(dxRecent) >= flickDist)\n const intentY = releasedFresh && (Math.abs(vyRecent) >= flickVel || Math.abs(dyRecent) >= flickDist)\n\n const { vx, vy } = velocityInWindow(t, windowMs)\n\n let fx = intentX ? vx : 0\n let fy = intentY ? vy : 0\n\n if (intentX && Math.abs(fx) < minVel) fx = (dxRecent >= 0 ? 1 : -1) * minVel\n if (intentY && Math.abs(fy) < minVel) fy = (dyRecent >= 0 ? 1 : -1) * minVel\n\n return { fx, fy }\n },\n\n readPoint,\n }\n}","export type Vector1DType = {\n get: () => number\n set: (n: number) => void\n add: (n: number) => void\n}\n\nexport function Vector1D(initial: number): Vector1DType {\n let v = initial\n return {\n get: () => v,\n set: (n) => {\n v = n\n },\n add: (n) => {\n v += n\n },\n }\n}","import type { Vector1DType } from './vector1d'\n\nexport type ScrollBodyType = ReturnType<typeof ScrollBody>\n\nexport function ScrollBody(\n location: Vector1DType,\n offsetLocation: Vector1DType,\n previousLocation: Vector1DType,\n target: Vector1DType,\n baseDuration: number,\n baseFriction: number\n) {\n let vel = 0\n let dir = 0\n let duration = baseDuration\n let friction = baseFriction\n let raw = location.get()\n let rawPrev = 0\n const mathAbs = Math.abs\n return {\n sync() { raw = location.get(); rawPrev = raw; return this },\n resetVelocity() { vel = 0; return this },\n useDuration(n: number) { duration = n; return this },\n useFriction(n: number) { friction = n; return this },\n useBaseDuration() { return this.useDuration(baseDuration) },\n useBaseFriction() { return this.useFriction(baseFriction) },\n duration() { return duration },\n frictionFactor() { return friction },\n direction() { return dir },\n velocity() { return vel },\n seek() {\n const curLoc = location.get()\n const curTgt = target.get()\n const disp = curTgt - curLoc\n const instant = !duration\n let d = 0\n if (instant) {\n vel = 0\n previousLocation.set(curTgt)\n location.set(curTgt)\n d = disp\n } else {\n previousLocation.set(curLoc)\n vel += disp / duration\n vel *= friction\n raw += vel\n location.add(vel)\n d = raw - rawPrev\n }\n dir = Math.sign(d)\n rawPrev = raw\n return this\n },\n settled() {\n const diff = target.get() - offsetLocation.get()\n return mathAbs(diff) < 0.001\n },\n }\n}","export type LimitType = ReturnType<typeof Limit>\n\nexport function Limit(min: number, max: number) {\n const span = max - min || 1\n\n return {\n min,\n max,\n reachedMin(n: number) { return n < min },\n reachedMax(n: number) { return n > max },\n constrain(n: number) { return Math.max(min, Math.min(max, n)) },\n\n reachedAny(n: number) {\n return n < min || n > max\n },\n removeOffset(n: number) {\n let x = n\n while (x < min) x += span\n while (x > max) x -= span\n return x\n },\n }\n}","import { Limit, LimitType } from \"./limit\"\nimport { Vector1DType } from \"./vector1d\"\n\nexport function ScrollLooper(\n contentSize: number,\n limit: LimitType,\n location: Vector1DType,\n vectors: Vector1DType[]\n) {\n const jointSafety = 0.1\n const min = limit.min + jointSafety\n const max = limit.max + jointSafety\n const l = Limit(min, max)\n\n function shouldLoop(direction: number) {\n if (direction === 1) return l.reachedMax(location.get())\n if (direction === -1) return l.reachedMin(location.get())\n return false\n }\n\n return {\n loop(direction: number) {\n if (!shouldLoop(direction)) return\n const shift = contentSize * (direction * -1)\n vectors.forEach(v => v.add(shift))\n }\n }\n}","import { Limit } from \"./limit\"\nimport { Vector1DType } from \"./vector1d\"\n\nexport type BaseTarget = {\n distance: number\n index: number\n}\n\nexport type ScrollTargetType = {\n byIndex: (target: number, direction: number) => BaseTarget\n byDistance: (force: number, snap: boolean) => BaseTarget\n shortcut: (target: number, direction: number) => number\n}\n\nexport function ScrollTarget(\n loop: boolean,\n scrollSnaps: number[],\n contentSize: number,\n limit: ReturnType<typeof Limit>,\n targetVector: Vector1DType\n): ScrollTargetType {\n const { reachedAny, removeOffset, constrain } = limit\n\n function minDistance(distances: number[]): number {\n return distances\n .concat()\n .sort((a, b) => Math.abs(a) - Math.abs(b))[0]\n }\n\n function shortcut(target: number, direction: number): number {\n const targets = [target, target + contentSize, target - contentSize]\n\n if (!loop) return target\n if (!direction) return minDistance(targets)\n\n const dir = Math.sign(direction)\n const matchingTargets = targets.filter((t) => Math.sign(t) === dir)\n\n if (matchingTargets.length) return minDistance(matchingTargets)\n return arrayLast(targets) - contentSize\n }\n\n function findTargetSnap(target: number): BaseTarget {\n const distance = loop ? removeOffset(target) : constrain(target)\n const ascDiffsToSnaps = scrollSnaps\n .map((snap, index) => ({\n diff: shortcut(snap - distance, 0),\n index,\n }))\n .sort((d1, d2) => Math.abs(d1.diff) - Math.abs(d2.diff))\n\n const { index } = ascDiffsToSnaps[0]\n return { index, distance }\n }\n\n function byIndex(index: number, direction: number): BaseTarget {\n const diffToSnap = scrollSnaps[index] - targetVector.get()\n const distance = shortcut(diffToSnap, direction)\n return { index, distance }\n }\n\n function byDistance(distance: number, snap: boolean): BaseTarget {\n const target = targetVector.get() + distance\n const { index, distance: targetSnapDistance } = findTargetSnap(target)\n const reachedBound = !loop && reachedAny(target)\n\n if (!snap || reachedBound) return { index, distance }\n\n const diffToSnap = scrollSnaps[index] - targetSnapDistance\n const snapDistance = distance + shortcut(diffToSnap, 0)\n\n return { index, distance: snapDistance }\n }\n\n return { byDistance, byIndex, shortcut }\n}\n\nconst mathAbs = Math.abs\n\nexport const mathSign = (n: number) => (n === 0 ? 0 : n > 0 ? 1 : -1)\n\nexport function deltaAbs(valueB: number, valueA: number): number {\n return mathAbs(valueB - valueA)\n}\n\nexport function factorAbs(valueB: number, valueA: number): number {\n if (valueB === 0 || valueA === 0) return 0\n if (mathAbs(valueB) <= mathAbs(valueA)) return 0\n const diff = deltaAbs(mathAbs(valueB), mathAbs(valueA))\n return mathAbs(diff / valueB)\n}\n\nexport function arrayLast<Type>(array: Type[]): Type {\n return array[arrayLastIndex(array)]\n}\n\nexport function arrayLastIndex<Type>(array: Type[]): number {\n return Math.max(0, array.length - 1)\n}","/* eslint-disable @typescript-eslint/no-explicit-any */\nexport function EventStore() {\n const listeners: Array<() => void> = []\n return {\n add<T extends EventTarget>(\n t: T,\n type: string,\n fn: EventListenerOrEventListenerObject,\n opts?: AddEventListenerOptions | boolean\n ) {\n t.addEventListener(type, fn as any, opts as any)\n listeners.push(() => t.removeEventListener(type, fn as any, opts as any))\n return this\n },\n clear() {\n while (listeners.length) listeners.pop()?.()\n },\n }\n}","import { WindowType } from \"../input/pointerTypes\"\nimport { EventStore } from \"./eventStore\"\n\nexport type AnimationsType = {\n start: () => void\n stop: () => void\n init: () => void\n destroy: () => void\n resetBlend: () => void\n}\n\nexport function Animations(doc: Document, win: WindowType, update: () => void, render: (a: number) => void): AnimationsType {\n const fixed = 1000 / 60\n const visible = EventStore()\n let last: number | null = null\n let acc = 0\n let animId = 0\n function reset() {\n last = null\n acc = 0\n }\n function animate(ts: number) {\n if (!animId) return\n if (last == null) {\n last = ts\n update()\n update()\n }\n const dt = ts - (last as number)\n last = ts\n acc += dt\n while (acc >= fixed) {\n update()\n acc -= fixed\n }\n const alpha = acc / fixed\n render(alpha)\n if (animId) animId = win.requestAnimationFrame(animate)\n }\n return {\n init() {\n visible.add(doc, 'visibilitychange', () => {\n if (doc.hidden) reset()\n })\n },\n destroy() {\n this.stop()\n visible.clear()\n },\n start() {\n if (animId) return\n animId = win.requestAnimationFrame(animate)\n },\n stop() {\n win.cancelAnimationFrame(animId)\n animId = 0\n reset()\n },\n resetBlend() {\n reset()\n },\n }\n}","export type WindowType = Window & typeof globalThis\nexport type AxisKey = 'x' | 'y'\nexport type PointerEventType = PointerEvent | MouseEvent | TouchEvent\n\nexport function isMouseEvent(evt: PointerEventType, ownerWindow: WindowType): evt is MouseEvent {\n return typeof ownerWindow.MouseEvent !== 'undefined' && evt instanceof ownerWindow.MouseEvent\n}","export type AXSpec = {\n main: 'x' | 'y';\n cross: 'x' | 'y';\n sizeKey: 'width' | 'height';\n clientKey: 'clientWidth' | 'clientHeight';\n startKey: 'left' | 'top';\n endKey: 'right' | 'bottom';\n translate: (n: number) => string;\n place: (n: number) => string;\n wheelDelta: (e: WheelEvent) => number;\n};\n\ntype AxisKey = 'x' | 'y'\n\nexport function Axis(isHorizontal: boolean): {\n scroll: AxisKey; cross: AxisKey; measureSize: (rect: DOMRect) => number;\n} {\n const scroll: AxisKey = isHorizontal ? 'x' : 'y'\n const cross: AxisKey = isHorizontal ? 'y' : 'x'\n return {\n scroll, cross,\n measureSize(rect: DOMRect) { return isHorizontal ? rect.width : rect.height },\n }\n}\nexport type AxisType = ReturnType<typeof Axis>\n\nexport function FullscreenAxis() {\n return {\n scroll: 'x' as const,\n cross: 'y' as const,\n direction(n: number) {\n return n\n },\n measureSize(rect: DOMRect) {\n return rect.width\n }\n }\n}\nexport type FullscreenAxisType = ReturnType<typeof FullscreenAxis>\n\nexport type FullscreenAxisLike = {\n scroll: 'x' | 'y'\n cross: 'x' | 'y'\n direction: (n: number) => number\n measureSize?: (rect: DOMRect) => number\n}\n\nexport function PanAxis() {\n return {\n scroll: 'x' as const,\n cross: 'y' as const,\n direction(n: number) {\n return n\n },\n }\n}\nexport type PanAxisType = ReturnType<typeof PanAxis>","import { AXSpec } from \"../types/axis\";\n\nexport function Translate(container: HTMLElement, AX: AXSpec) {\n let prev = NaN;\n function write(n: number) {\n if (n === prev) return;\n container.style.transform = AX.translate(n);\n prev = n;\n }\n return {\n to(target: number) { write(target); },\n get() { return prev; },\n resetCache() { prev = NaN; },\n };\n}\n\nexport function TranslateFullscreen(container: HTMLElement) {\n let prevX = NaN\n let prevY = NaN\n let lockY = false\n let lockedY = 0\n let suspended = false\n const round2 = (n: number) => Math.round(n * 100) / 100\n\n function write(nx: number, ny: number) {\n if (nx === prevX && ny === prevY) return\n container.style.transform = `translate3d(${nx}px, ${ny}px, 0)`\n prevX = nx\n prevY = ny\n }\n\n return {\n to(targetX: number, targetY = 0) {\n if (suspended) return\n const nx = round2(targetX)\n const ny = lockY ? lockedY : targetY\n write(nx, ny)\n },\n lockY(value?: number) {\n lockY = true\n lockedY = Math.round((value ?? prevY) || 0)\n write(prevX || 0, lockedY)\n },\n unlockY() { lockY = false },\n suspend(on = true) { suspended = on },\n get() { return { x: prevX, y: prevY } },\n resetCache() { prevX = NaN; prevY = NaN }\n }\n}","export type BaseLimit = {\n min: number\n max: number\n reachedAny: (n: number) => boolean\n constrain: (n: number) => number\n removeOffset: (n: number) => number\n}\n\nexport function createBaseLimit(min: number, max: number): BaseLimit {\n const range = max - min || 1\n\n function constrain(n: number) {\n return Math.max(min, Math.min(max, n))\n }\n\n function reachedAny(n: number) {\n return n < min || n > max\n }\n\n function removeOffset(n: number) {\n let x = n\n while (x < min) x += range\n while (x > max) x -= range\n return x\n }\n\n return { min, max, constrain, reachedAny, removeOffset }\n}","import { Limit } from \"./limit\"\n\nexport type CounterType = {\n get: () => number\n set: (n: number) => CounterType\n add: (n: number) => CounterType\n clone: () => CounterType\n}\n\nconst mathAbs = Math.abs\n\nexport function Counter(max: number, start: number, loop: boolean): CounterType {\n const { constrain } = Limit(0, max)\n const loopEnd = max + 1\n let counter = withinLimit(start)\n\n function withinLimit(n: number): number {\n return !loop ? constrain(n) : mathAbs((loopEnd + n) % loopEnd)\n }\n\n function get(): number {\n return counter\n }\n\n function set(n: number): CounterType {\n counter = withinLimit(n)\n return self\n }\n\n function add(n: number): CounterType {\n return clone().set(get() + n)\n }\n\n function clone(): CounterType {\n return Counter(max, get(), loop)\n }\n\n const self: CounterType = {\n get,\n set,\n add,\n clone\n }\n return self\n}","/* eslint-disable @typescript-eslint/no-explicit-any */\n'use client'\n\nimport React, {\n Dispatch,\n RefObject,\n SetStateAction,\n useEffect,\n} from 'react'\nimport type { FullscreenSliderSub } from './fullscreenSliderSub'\nimport { parseObjectPosition } from '../shared/transitions/objectPosition';\nimport { containTransformForRect, coverTransformForRect, objectFitContentRect } from '../shared/transitions/objectFitTransform';\nimport { MediaItem } from '../shared/types/media';\nimport { IndexMode } from '../api/types';\nimport { MediaEntryLink } from '../entries';\n\ninterface FullscreenModalProps {\n fsSub: FullscreenSliderSub\n open: boolean\n onClose: () => void\n isClick: RefObject<boolean>\n isAnimating: RefObject<boolean>\n overlayDivRef: RefObject<HTMLDivElement | null>\n closeButtonRef: RefObject<HTMLElement | null>\n counterRef: RefObject<HTMLElement | null>\n leftChevronRef: RefObject<HTMLElement | null>\n rightChevronRef: RefObject<HTMLElement | null>\n children: React.ReactNode\n cells: RefObject<{ element: HTMLElement; index: number }[]>\n setShowFullscreenSlider: Dispatch<SetStateAction<boolean>>\n imageCount: number\n setClosingModal: Dispatch<SetStateAction<boolean>>\n slides: RefObject<{ cells: { element: HTMLElement; index: number }[]; target: number }[]>\n slider: RefObject<HTMLDivElement | null>\n visibleImagesRef: RefObject<number>\n selectedIndex: RefObject<number>\n sliderX: RefObject<number>\n sliderVelocity: RefObject<number>\n isWrapping: RefObject<boolean>\n wrappedItems: MediaItem[]\n centerAlign: boolean\n centerSlider?: () => void;\n setSliderIndex: (i: number, mode: IndexMode) => void;\n onForceResetZoom: () => void;\n layout?: 'slider' | 'grid' | 'masonry' | 'entries';\n expandableImgRefs: RefObject<RefObject<HTMLImageElement | null>[]>\n entryMapRef?: RefObject<MediaEntryLink[] | null>;\n entryMediaLayout?: string;\n introFade?: boolean;\n introDuration?: number;\n introEasing?: string;\n}\n\nfunction freezeRect(el: HTMLElement) {\n const r = el.getBoundingClientRect()\n el.style.width = `${Math.max(1, Math.round(r.width))}px`\n el.style.height = `${Math.max(1, Math.round(r.height))}px`\n}\n\nconst px = (n: number) => `${Math.round(n)}px`\n\nfunction getViewportEl(track: HTMLDivElement | null): HTMLElement | null {\n if (!track) return null\n return (track.parentElement as HTMLElement) ?? track\n}\n\nfunction getTotalCellsWidth(slides: { cells: { element: HTMLElement; index: number }[] }[] | undefined): number {\n if (!slides) return 0\n let totalWidth = 0\n slides.forEach(slide => {\n slide.cells.forEach(cell => {\n totalWidth += cell.element.offsetWidth\n })\n })\n return totalWidth\n}\n\nfunction isCellVisible(\n cellEl: HTMLElement,\n viewportEl: HTMLElement,\n allowPartial = true\n): boolean {\n const c = viewportEl.getBoundingClientRect()\n const r = cellEl.getBoundingClientRect()\n const fully = r.left >= c.left && r.right <= c.right && r.top >= c.top && r.bottom <= c.bottom\n const intersects = r.right > c.left && r.left < c.right && r.bottom > c.top && r.top < c.bottom\n return allowPartial ? intersects : fully\n}\n\ntype ClipperArgs = {\n DURATION_MS: number;\n EASING: string;\n};\n\nfunction createClipper({ DURATION_MS, EASING }: ClipperArgs): HTMLDivElement {\n const clipper = document.createElement('div')\n Object.assign(clipper.style, {\n position: 'fixed',\n inset: '0',\n clipPath: 'inset(0px 0px 0px 0px)',\n willChange: 'clip-path',\n pointerEvents: 'none',\n transition: `clip-path ${DURATION_MS}ms ${EASING}`,\n zIndex: '9998',\n background: 'transparent',\n } as CSSStyleDeclaration)\n document.body.appendChild(clipper)\n void clipper.offsetWidth\n return clipper\n}\n\nfunction insetForRect(r: DOMRect): string {\n const vw = window.innerWidth\n const vh = window.innerHeight\n const top = r.top\n const left = r.left\n const right = vw - (r.left + r.width)\n const bottom = vh - (r.top + r.height)\n return `inset(${px(top)} ${px(right)} ${px(bottom)} ${px(left)})`\n}\n\nfunction findThumbInfoEnsuringVisible(\n wrapIndex: number,\n centerAlign: boolean,\n sliderRef: RefObject<HTMLDivElement | null>,\n slidesRef: RefObject<{ cells: { element: HTMLElement; index: number }[]; target: number }[]>,\n selectedIndex: RefObject<number>,\n sliderX: RefObject<number>,\n sliderVelocity: RefObject<number>,\n centerSlider: (() => void) | undefined,\n isWrappingRef: RefObject<boolean>,\n visibleImagesRef: RefObject<number>,\n setSliderIndex: (i: number, mode: IndexMode) => void\n): ThumbInfo | null {\n const slider = sliderRef.current\n const slides = slidesRef.current\n if (!slider || !slides?.length) return null\n\n const matchSlide = slides.find(s => s.cells.some(c => c.index === wrapIndex))\n if (!matchSlide) return null\n\n const slideIdx = slides.indexOf(matchSlide)\n const targetCell =\n matchSlide.cells.find(c => c.index === wrapIndex)?.element ??\n matchSlide.cells[0]?.element ??\n null\n if (!targetCell) return null\n\n const viewport = getViewportEl(slider)\n if (!viewport) return null\n\n const fullyVisible = isCellVisible(targetCell, viewport, /*allowPartial*/ false)\n\n if (!fullyVisible) {\n moveBaseSliderToSlide(\n centerAlign,\n sliderRef,\n slidesRef,\n selectedIndex,\n sliderX,\n sliderVelocity,\n centerSlider,\n slideIdx,\n setSliderIndex\n )\n\n void slider.offsetWidth\n }\n\n const isWrapping = !!isWrappingRef.current\n const visibleImages = visibleImagesRef.current\n const cloneOffset = isWrapping ? (visibleImages || 0) : 0\n const domSlideIdx = isWrapping ? (slideIdx + cloneOffset) : slideIdx\n\n const cropRect = targetCell.getBoundingClientRect()\n\n const imgEl = targetCell.querySelector('img') as HTMLImageElement | null\n const cs = imgEl ? getComputedStyle(imgEl) : null\n const objPos = parseObjectPosition(cs?.objectPosition ?? null) ?? { x: 0.5, y: 0.5 };\n const renderedRect = imgEl?.getBoundingClientRect() ?? null\n const renderedW = renderedRect ? renderedRect.width : 0\n const renderedH = renderedRect ? renderedRect.height : 0\n\n return {\n slideIdx,\n domSlideIdx,\n cropRect,\n imgEl,\n objPos,\n renderedW,\n renderedH,\n renderedRect\n }\n}\n\ntype ThumbInfo = {\n slideIdx: number\n domSlideIdx: number\n cropRect: DOMRect\n imgEl: HTMLImageElement | null\n objPos: { x: number; y: number }\n renderedW: number\n renderedH: number\n renderedRect: DOMRect | null\n}\n\nfunction moveBaseSliderToSlide(\n centerAlign: boolean,\n sliderRef: RefObject<HTMLDivElement | null>,\n slidesRef: RefObject<{ cells: { element: HTMLElement; index: number }[]; target: number }[]>,\n selectedIndex: RefObject<number>,\n sliderX: RefObject<number>,\n sliderVelocity: RefObject<number>,\n centerSlider: (() => void) | undefined,\n newIndex: number,\n setSliderIndex: (i: number, mode: IndexMode) => void\n) {\n const slider = sliderRef.current\n const slides = slidesRef.current\n if (!slider || !slides) return\n const viewport = getViewportEl(slider)\n if (!viewport) return\n\n const totalWidth = getTotalCellsWidth(slides)\n const containerWidth = viewport.clientWidth\n const firstCellWidthOfSlide = slides[newIndex].cells[0].element.clientWidth\n const center = centerAlign ? (containerWidth - firstCellWidthOfSlide) / 2 : 0\n\n const matchSlide = slides[newIndex]\n selectedIndex.current = newIndex\n setSliderIndex(newIndex, 'instant');\n\n sliderX.current = totalWidth <= containerWidth ? 0 : -matchSlide.target + center\n\n sliderVelocity.current = 0\n slider.style.transform = `translate3d(${px(sliderX.current)},0,0)`\n\n centerSlider?.()\n}\n\nasync function captureVideoFrame(video: HTMLVideoElement): Promise<HTMLImageElement | null> {\n try {\n const w = video.videoWidth || Math.round(video.getBoundingClientRect().width) || 1\n const h = video.videoHeight || Math.round(video.getBoundingClientRect().height) || 1\n if (!w || !h) return null\n const canvas = document.createElement('canvas')\n canvas.width = w\n canvas.height = h\n const ctx = canvas.getContext('2d')\n if (!ctx) return null\n ctx.drawImage(video, 0, 0, w, h)\n const dataURL = canvas.toDataURL('image/png')\n const img = new Image()\n img.decoding = 'async'\n img.src = dataURL\n await img.decode().catch(() => {})\n return img\n } catch {\n return null\n }\n}\n\nfunction extractPlyrPoster(wrapperEl: HTMLElement | null): string | null {\n if (!wrapperEl) return null\n const v = wrapperEl.querySelector('video') as HTMLVideoElement | null\n if (v?.poster) return v.poster\n const posterEl = wrapperEl.querySelector('.plyr__poster') as HTMLElement | null\n if (posterEl) {\n const bg = getComputedStyle(posterEl).backgroundImage\n const match = bg && /url\\([\"']?(.*?)[\"']?\\)/.exec(bg)\n if (match?.[1]) return match[1]\n }\n return null\n}\n\nasync function makeVideoProxy(\n movingVideo: HTMLVideoElement,\n wrapperEl: HTMLElement | null\n): Promise<HTMLImageElement> {\n const frame = await captureVideoFrame(movingVideo)\n if (frame) return frame\n\n const posterURL = extractPlyrPoster(wrapperEl)\n const img = new Image()\n img.decoding = 'async'\n if (posterURL) {\n img.src = posterURL\n try { await img.decode() } catch {}\n } else {\n const w = movingVideo.videoWidth || 1\n const h = movingVideo.videoHeight || 1\n const c = document.createElement('canvas')\n c.width = Math.max(1, w)\n c.height = Math.max(1, h)\n img.src = c.toDataURL('image/png')\n }\n return img\n}\n\nfunction getVideoObjPos(videoEl: HTMLVideoElement | null): { x: number; y: number } {\n if (!videoEl) return { x: 0.5, y: 0.5 };\n const cs = getComputedStyle(videoEl);\n return parseObjectPosition(cs?.objectPosition ?? null);\n}\n\nfunction styleProxyImage(\n img: HTMLImageElement,\n objPos: { x: number; y: number }\n) {\n img.decoding = 'async';\n (img as any).loading = 'eager';\n img.draggable = false;\n img.style.pointerEvents = 'none';\n img.style.objectFit = 'cover';\n img.style.objectPosition = `${Math.round(objPos.x * 100)}% ${Math.round(objPos.y * 100)}%`;\n}\n\nfunction isElementOnScreen(el: HTMLElement, visibleThreshold = 0.4): boolean {\n const rect = el.getBoundingClientRect()\n const vh = window.innerHeight || document.documentElement.clientHeight\n\n const visibleHeight = Math.min(rect.bottom, vh) - Math.max(rect.top, 0)\n if (visibleHeight <= 0) return false\n\n return visibleHeight >= rect.height * visibleThreshold\n}\n\nasync function scrollEntrySectionIntoView(entryIndex: number): Promise<void> {\n if (typeof window === 'undefined') return\n\n const section = document.querySelector<HTMLElement>(\n `[data-rmg-entry-owner=\"${entryIndex}\"]`\n )\n\n if (!section) return\n\n if (isElementOnScreen(section, 0.5)) return\n\n const rect = section.getBoundingClientRect()\n const currentScroll = window.scrollY || document.documentElement.scrollTop || 0\n\n const viewportHeight = window.innerHeight || document.documentElement.clientHeight || rect.height\n const targetTop =\n rect.top + currentScroll - (viewportHeight - rect.height) / 2\n\n window.scrollTo({\n top: targetTop,\n behavior: 'instant',\n })\n}\n\nasync function scrollElementIntoCenterView(el: HTMLElement | null): Promise<void> {\n if (!el) return;\n\n if (isElementOnScreen(el, 0.5)) return;\n\n const rect = el.getBoundingClientRect();\n const scrollY =\n window.scrollY ||\n document.documentElement.scrollTop ||\n 0;\n\n const viewportHeight =\n window.innerHeight ||\n document.documentElement.clientHeight ||\n rect.height;\n\n const targetTop =\n rect.top + scrollY - (viewportHeight - rect.height) / 2;\n\n window.scrollTo({\n top: targetTop,\n behavior: 'instant',\n });\n}\n\ntype VideoProxyCloseArgs = {\n fsSliderEl: HTMLElement;\n nodeIdx: number;\n thumbCropRect: DOMRect;\n endObjPos: { x: number; y: number };\n captionClone: HTMLElement | null;\n\n safeTeardown: () => void;\n onCaptionCloneGone?: () => void;\n DURATION_MS: number;\n EASING: string;\n};\n\nasync function animateVideoCloseProxy({\n fsSliderEl,\n nodeIdx,\n thumbCropRect,\n endObjPos,\n captionClone,\n safeTeardown,\n onCaptionCloneGone,\n DURATION_MS,\n EASING\n}: VideoProxyCloseArgs): Promise<void> {\n const wrapperEl =\n (fsSliderEl.querySelector(`.rmg__player[data-index=\"${nodeIdx}\"]`) as HTMLElement | null) ||\n (fsSliderEl.querySelector('.rmg__player') as HTMLElement | null) ||\n null;\n\n const fsVideo = wrapperEl?.querySelector('video') as HTMLVideoElement | null;\n\n const fsRect =\n wrapperEl?.getBoundingClientRect?.() ||\n fsVideo?.getBoundingClientRect?.();\n\n if (!fsRect) {\n safeTeardown();\n return;\n }\n\n if (wrapperEl) {\n freezeRect(wrapperEl);\n wrapperEl.style.visibility = 'hidden';\n wrapperEl.style.opacity = '0';\n const poster = wrapperEl.querySelector('.plyr__poster') as HTMLElement | null;\n if (poster) poster.style.opacity = '0';\n const controls = wrapperEl.querySelector('.plyr__controls') as HTMLElement | null;\n if (controls) controls.style.opacity = '0';\n }\n\n if (fsVideo) {\n try { fsVideo.pause(); } catch {}\n fsVideo.muted = true;\n }\n\n const vidForProxy =\n fsVideo || (wrapperEl?.querySelector('video') as HTMLVideoElement | null);\n\n if (!vidForProxy) {\n safeTeardown();\n return;\n }\n\n const proxyImg = await makeVideoProxy(vidForProxy, wrapperEl);\n\n styleProxyImage(proxyImg, endObjPos);\n\n const natW = proxyImg.naturalWidth || 1;\n const natH = proxyImg.naturalHeight || 1;\n\n const startObjPos = getVideoObjPos(fsVideo);\n\n const startT = coverTransformForRect(natW, natH, fsRect, startObjPos);\n const endT = coverTransformForRect(natW, natH, thumbCropRect, endObjPos);\n\n const movingProxy = proxyImg as unknown as HTMLElement;\n\n Object.assign(movingProxy.style, {\n position: 'fixed',\n left: '0',\n top: '0',\n width: `${natW}px`,\n height: `${natH}px`,\n maxWidth: 'none',\n maxHeight: 'none',\n transformOrigin: '50% 50%',\n willChange: 'transform',\n zIndex: '2147483601',\n opacity: '1',\n transition: 'none',\n } as CSSStyleDeclaration);\n\n movingProxy.style.transform =\n `translate3d(${startT.cx}px, ${startT.cy}px, 0)` +\n ` translate3d(${-natW / 2}px, ${-natH / 2}px, 0)` +\n ` scale(${startT.scale})`;\n\n const clipper = createClipper({DURATION_MS, EASING});\n clipper.style.clipPath = insetForRect(fsRect);\n clipper.appendChild(movingProxy);\n\n void movingProxy.offsetWidth;\n void clipper.offsetWidth;\n\n const cleanup = () => {\n if (captionClone) {\n try { captionClone.remove(); } catch {}\n onCaptionCloneGone?.();\n }\n try { document.body.removeChild(clipper); } catch {}\n try { (movingProxy as HTMLElement).remove(); } catch {}\n safeTeardown();\n };\n\n const onEnd = (ev: TransitionEvent) => {\n if (ev.propertyName !== 'transform') return;\n (movingProxy as HTMLElement).removeEventListener('transitionend', onEnd as any);\n cleanup();\n };\n\n requestAnimationFrame(() => {\n clipper.style.clipPath = insetForRect(thumbCropRect);\n (movingProxy as HTMLElement).style.transition = `transform ${DURATION_MS}ms ${EASING}`;\n (movingProxy as HTMLElement).style.transform =\n `translate3d(${endT.cx}px, ${endT.cy}px, 0)` +\n ` translate3d(${-natW / 2}px, ${-natH / 2}px, 0)` +\n ` scale(${endT.scale})`;\n\n (movingProxy as HTMLElement).addEventListener('transitionend', onEnd as any, { once: true });\n\n window.setTimeout(() => {\n (movingProxy as HTMLElement).removeEventListener('transitionend', onEnd as any);\n cleanup();\n }, DURATION_MS + 120);\n });\n}\n\nconst FullscreenModal: React.FC<FullscreenModalProps> = ({\n children,\n fsSub,\n open,\n onClose,\n isClick,\n isAnimating,\n overlayDivRef,\n closeButtonRef,\n counterRef,\n leftChevronRef,\n rightChevronRef,\n cells,\n setShowFullscreenSlider,\n imageCount,\n setClosingModal,\n slides,\n slider,\n visibleImagesRef,\n selectedIndex,\n sliderX,\n sliderVelocity,\n isWrapping,\n wrappedItems,\n centerAlign,\n centerSlider,\n setSliderIndex,\n onForceResetZoom,\n layout,\n expandableImgRefs,\n entryMapRef,\n entryMediaLayout,\n introFade,\n introDuration = 300,\n introEasing = 'cubic-bezier(.4,0,.22,1)'\n}) => {\n const DURATION_MS = introDuration\n const EASING = introEasing\n\n const modalRef = React.useRef<HTMLDivElement | null>(null);\n const pointerDownX = React.useRef<number>(0)\n const pointerDownY = React.useRef<number>(0)\n\n const shieldRef = React.useRef<HTMLDivElement | null>(null);\n\n function mountShield() {\n if (shieldRef.current) return;\n\n const shield = document.createElement('div');\n shield.setAttribute('data-rmg-fs-shield', 'true');\n\n Object.assign(shield.style, {\n position: 'fixed',\n inset: '0',\n zIndex: '2147483606',\n background: 'transparent',\n pointerEvents: 'auto',\n touchAction: 'none',\n cursor: 'default',\n } as CSSStyleDeclaration);\n\n const stop = (e: Event) => {\n e.preventDefault?.();\n e.stopPropagation?.();\n };\n\n shield.addEventListener('pointerdown', stop, { capture: true });\n shield.addEventListener('pointerup', stop, { capture: true });\n shield.addEventListener('pointermove', stop, { capture: true });\n shield.addEventListener('click', stop, { capture: true });\n shield.addEventListener('dblclick', stop, { capture: true });\n shield.addEventListener('contextmenu', stop, { capture: true });\n shield.addEventListener('touchstart', stop, { capture: true, passive: false } as any);\n shield.addEventListener('touchmove', stop, { capture: true, passive: false } as any);\n shield.addEventListener('touchend', stop, { capture: true, passive: false } as any);\n shield.addEventListener('wheel', stop, { capture: true, passive: false } as any);\n\n shield.addEventListener(\n 'keydown',\n stop,\n { capture: true } as any\n );\n\n document.body.appendChild(shield);\n shieldRef.current = shield;\n }\n\n function unmountShield() {\n const shield = shieldRef.current;\n if (!shield) return;\n try { shield.remove(); } catch {}\n shieldRef.current = null;\n }\n\n useEffect(() => {\n return () => unmountShield();\n }, []);\n\n function withinFs<T extends Element = HTMLElement>(sel: string): T | null {\n const root = modalRef.current;\n return root ? (root.querySelector(sel) as T | null) : null;\n }\n\n useEffect(() => {\n const btn = closeButtonRef.current\n if (!btn) return\n const handler = (ev: Event) => handleClose(ev as MouseEvent)\n btn.addEventListener('click', handler)\n return () => btn.removeEventListener('click', handler)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\") return;\n e.preventDefault();\n e.stopPropagation();\n proceedToClose();\n };\n\n window.addEventListener(\"keydown\", onKeyDown, { capture: true });\n return () => window.removeEventListener(\"keydown\", onKeyDown, { capture: true } as any);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n function handleClose(e: MouseEvent) {\n const clickedImg = (e.target as HTMLElement)?.closest('img')\n if (clickedImg) return\n proceedToClose()\n }\n\n function nodeIdxFromFs(fsIdx: number, imageCount: number) {\n const fsSlider = withinFs<HTMLElement>('.fullscreen_slider');\n if (!fsSlider) return Math.max(0, Math.min(imageCount + 1, fsIdx + 1));\n\n let currentTranslateX = 0;\n const transform = getComputedStyle(fsSlider).transform;\n if (transform !== 'none') {\n const matrix = new DOMMatrixReadOnly(transform);\n currentTranslateX = matrix.m41;\n }\n\n if (imageCount === 1) return 0;\n if (fsIdx === 0 && Math.abs(currentTranslateX) >= fsSlider.getBoundingClientRect().width) return imageCount + 1;\n if (fsIdx === 0) return 1;\n if (fsIdx === imageCount + 1) return imageCount + 1;\n return Math.max(1, Math.min(imageCount, fsIdx + 1));\n }\n\n function cloneFsCaptionForNode(\n fsRoot: HTMLElement | null,\n nodeIdx: number\n ): HTMLElement | null {\n if (!fsRoot) return null\n\n const activeMediaEl =\n fsRoot.querySelector<HTMLElement>(`[data-index=\"${nodeIdx}\"]`) ?? null\n\n const activeSlideEl = activeMediaEl\n ? (activeMediaEl.closest('[data-rmg-fs-slide=\"true\"]') as HTMLElement | null)\n : null\n\n const activeCaptionEl =\n activeSlideEl?.querySelector<HTMLElement>('[data-rmg-fs-caption=\"true\"]') ?? null\n\n if (!activeCaptionEl) return null\n\n const r = activeCaptionEl.getBoundingClientRect()\n\n const captionClone = activeCaptionEl.cloneNode(true) as HTMLElement\n Object.assign(captionClone.style, {\n position: 'fixed',\n left: `${Math.round(r.left)}px`,\n top: `${Math.round(r.top)}px`,\n width: `${Math.round(r.width)}px`,\n height: `${Math.round(r.height)}px`,\n margin: '0',\n transform: 'none',\n zIndex: '2147483602',\n pointerEvents: 'none',\n } as CSSStyleDeclaration)\n\n document.body.appendChild(captionClone)\n\n activeCaptionEl.style.visibility = 'hidden'\n\n return captionClone\n }\n\n function fadeChrome() {\n const els = [leftChevronRef.current, rightChevronRef.current, counterRef.current, closeButtonRef.current];\n els.forEach(el => {\n if (!el) return;\n el.style.transition = `opacity ${DURATION_MS}ms ${EASING}`;\n el.style.opacity = '0';\n });\n }\n\n function fadeNonActiveSlides(fsSlider: HTMLElement, nodeIdx: number, targetImg: HTMLImageElement | null, isVideoSlide: boolean) {\n if (isVideoSlide) {\n fsSlider.querySelectorAll<HTMLElement>('[data-index]').forEach(el => {\n if (el.dataset.index === String(nodeIdx)) return;\n el.style.transition = 'opacity 0.3s cubic-bezier(.4,0,.22,1)';\n el.style.opacity = '0';\n });\n return;\n }\n\n fsSlider.querySelectorAll<HTMLElement>('[data-rmg-fs-slide=\"true\"]').forEach(slide => {\n if (targetImg && slide.contains(targetImg)) return;\n slide.style.transition = 'opacity 0.3s cubic-bezier(.4,0,.22,1)';\n slide.style.opacity = '0';\n });\n }\n\n function fadeOverlay() {\n const ov = overlayDivRef.current;\n if (!ov) return;\n ov.style.transition = `opacity ${DURATION_MS}ms ${EASING}`;\n ov.style.opacity = '0';\n ov.style.pointerEvents = 'none';\n }\n\n function isVideoItem(m: MediaItem | null | undefined): boolean {\n if (!m) return false;\n return (m as any).kind === 'video' || /\\.(mp4|webm|ogg)$/i.test((m as any).src || '');\n }\n\n function fadeCloseAndTeardown() {\n fadeChrome()\n\n fadeOverlay()\n\n const fsSlider = withinFs<HTMLElement>('.fullscreen_slider');\n if (fsSlider) {\n fsSlider.style.transition = `opacity ${DURATION_MS}ms ${EASING}`;\n fsSlider.style.opacity = '0';\n }\n\n const modal = withinFs<HTMLElement>('.fs_modal');\n if (modal) {\n modal.style.transition = `opacity ${DURATION_MS}ms ${EASING}`;\n modal.style.opacity = '0';\n modal.style.pointerEvents = 'none';\n }\n\n window.setTimeout(() => {\n safeTeardown();\n }, DURATION_MS + 40);\n }\n\n async function proceedToClose() {\n if (!open) return;\n\n mountShield();\n isAnimating.current = false;\n isClick.current = false;\n cells.current = [];\n setClosingModal(true);\n\n const originals = wrappedItems.slice(1, wrappedItems.length - 1);\n if (!originals.length) {\n safeTeardown();\n return;\n }\n\n const fsIdx = fsSub.get();\n\n const isGridish =\n layout === \"grid\" ||\n layout === \"masonry\" ||\n entryMediaLayout === \"grid\" ||\n entryMediaLayout === \"masonry\";\n\n const computeThumbCropRectFromImg = (img: HTMLImageElement): { cropRect: DOMRect; objPos: { x: number; y: number } } => {\n const box = img.getBoundingClientRect();\n const cs = getComputedStyle(img);\n const objPos = parseObjectPosition(cs?.objectPosition ?? null) ?? { x: 0.5, y: 0.5 };\n const fit = (cs?.objectFit ?? \"cover\") as \"contain\" | \"cover\";\n\n if (fit !== \"contain\") return { cropRect: box, objPos };\n\n const natW = Math.max(1, img.naturalWidth || 0);\n const natH = Math.max(1, img.naturalHeight || 0);\n const cropRect = objectFitContentRect(natW, natH, box, \"contain\", objPos);\n return { cropRect, objPos };\n };\n\n const animateCloseToThumb = async (args: {\n thumbCropRect: DOMRect;\n endObjPos: { x: number; y: number };\n isVideoSlide: boolean;\n }) => {\n const fsSlider = withinFs<HTMLElement>(\".fullscreen_slider\");\n if (!fsSlider) {\n safeTeardown();\n return;\n }\n\n const nodeIdx = nodeIdxFromFs(fsSub.get(), imageCount);\n\n const targetImg =\n !args.isVideoSlide\n ? fsSlider.querySelector<HTMLImageElement>(`img[data-index=\"${nodeIdx}\"]`) ?? null\n : null;\n\n if (!targetImg && !args.isVideoSlide) {\n safeTeardown();\n return;\n }\n\n fadeNonActiveSlides(fsSlider, nodeIdx, targetImg, args.isVideoSlide);\n\n let captionClone: HTMLElement | null = cloneFsCaptionForNode(fsSlider, nodeIdx);\n if (captionClone) {\n captionClone.style.transition = `opacity ${DURATION_MS}ms ${EASING}`;\n void captionClone.offsetWidth;\n captionClone.style.opacity = \"0\";\n }\n\n // video path\n if (args.isVideoSlide) {\n await animateVideoCloseProxy({\n fsSliderEl: fsSlider,\n nodeIdx,\n thumbCropRect: args.thumbCropRect,\n endObjPos: args.endObjPos ?? { x: 0.5, y: 0.5 },\n captionClone,\n safeTeardown,\n DURATION_MS,\n EASING,\n });\n return;\n }\n\n // image path\n const movingEl = targetImg as unknown as HTMLElement;\n if (!movingEl) {\n safeTeardown();\n return;\n }\n\n const restoreIntoParent = movingEl.parentNode || null;\n const restoreNextSibling = movingEl.nextSibling || null;\n\n const fsCS = targetImg ? getComputedStyle(targetImg) : null;\n const fsObjPos = parseObjectPosition(fsCS?.objectPosition ?? null);\n\n const imgEl = movingEl as HTMLImageElement;\n const fsFit = ((getComputedStyle(targetImg!).objectFit || \"contain\") as \"contain\" | \"cover\");\n const curRect = movingEl.getBoundingClientRect();\n const natW = imgEl.naturalWidth || curRect.width || 1;\n const natH = imgEl.naturalHeight || curRect.height || 1;\n\n const startT =\n fsFit === \"contain\"\n ? containTransformForRect(natW, natH, curRect, fsObjPos)\n : coverTransformForRect(natW, natH, curRect, fsObjPos);\n\n const endT = coverTransformForRect(natW, natH, args.thumbCropRect, args.endObjPos);\n\n const clipper = createClipper({ DURATION_MS, EASING });\n\n const previous = {\n position: movingEl.style.position,\n left: movingEl.style.left,\n top: movingEl.style.top,\n width: movingEl.style.width,\n height: movingEl.style.height,\n maxWidth: movingEl.style.maxWidth,\n maxHeight: movingEl.style.maxHeight,\n transformOrigin: movingEl.style.transformOrigin,\n transform: movingEl.style.transform,\n transition: movingEl.style.transition,\n willChange: movingEl.style.willChange,\n zIndex: (movingEl.style as any).zIndex,\n opacity: movingEl.style.opacity,\n };\n\n Object.assign(movingEl.style, {\n position: \"fixed\",\n left: \"0\",\n top: \"0\",\n width: `${natW}px`,\n height: `${natH}px`,\n maxWidth: \"none\",\n maxHeight: \"none\",\n transformOrigin: \"50% 50%\",\n willChange: \"transform\",\n zIndex: \"1\",\n opacity: \"1\",\n transition: \"none\",\n } as CSSStyleDeclaration);\n\n movingEl.style.transform =\n `translate3d(${startT.cx}px, ${startT.cy}px, 0)` +\n ` translate3d(${-natW / 2}px, ${-natH / 2}px, 0)` +\n ` scale(${startT.scale})`;\n\n clipper.appendChild(movingEl);\n\n void movingEl.offsetWidth;\n void clipper.offsetWidth;\n\n const targetInset = insetForRect(args.thumbCropRect);\n requestAnimationFrame(() => {\n clipper.style.clipPath = targetInset;\n movingEl.style.transition = `transform ${DURATION_MS}ms ${EASING}`;\n movingEl.style.transform =\n `translate3d(${endT.cx}px, ${endT.cy}px, 0)` +\n ` translate3d(${-natW / 2}px, ${-natH / 2}px, 0)` +\n ` scale(${endT.scale})`;\n });\n\n const finish = () => {\n if (captionClone) {\n try { captionClone.remove(); } catch {}\n captionClone = null;\n }\n\n movingEl.removeEventListener(\"transitionend\", onEnd as any);\n\n try {\n if (restoreIntoParent) {\n if (restoreNextSibling) (restoreIntoParent as Node).insertBefore(movingEl, restoreNextSibling);\n else (restoreIntoParent as Node).appendChild(movingEl);\n }\n } catch {}\n\n try { document.body.removeChild(clipper); } catch {}\n Object.assign(movingEl.style, previous);\n safeTeardown();\n };\n\n const onEnd = (ev: TransitionEvent) => {\n if (ev.propertyName !== \"transform\") return;\n finish();\n };\n\n movingEl.addEventListener(\"transitionend\", onEnd as any, { once: true });\n window.setTimeout(() => finish(), DURATION_MS + 80);\n };\n\n // ---- resolve canonicalIdx + destination thumb info (layout-specific) ----\n let canonicalIdx = 0;\n let localSlideIdx = 0;\n\n if (!isGridish) {\n // slider canonical logic\n if (!slider.current || !slides.current?.length) return;\n\n const fsIndex = fsIdx;\n if (isWrapping.current) {\n if (\n slider.current &&\n fsIndex >= slider.current.children.length - (visibleImagesRef.current || 0) * 2 &&\n layout !== \"entries\"\n ) {\n canonicalIdx = 0;\n } else {\n canonicalIdx = fsIndex;\n }\n } else {\n const maxMedia = Math.max(0, originals.length - 1);\n canonicalIdx = Math.min(Math.max(0, fsIndex), maxMedia);\n }\n\n localSlideIdx = canonicalIdx;\n\n if (layout === \"entries\" && entryMapRef?.current) {\n const link = entryMapRef.current[canonicalIdx];\n if (link) {\n localSlideIdx = link.mediaIndex;\n await scrollEntrySectionIntoView(link.entryIndex);\n }\n }\n } else {\n // grid canonical logic\n canonicalIdx = Math.max(0, Math.min(originals.length - 1, fsIdx));\n localSlideIdx = canonicalIdx;\n\n // center the grid cell + entries section if needed\n const el = document.querySelector<HTMLElement>(`[data-rmg-idx=\"${canonicalIdx}\"]`);\n await scrollElementIntoCenterView(el);\n\n if (layout === \"entries\" && entryMapRef?.current) {\n const link = entryMapRef.current[canonicalIdx];\n if (link) {\n await scrollEntrySectionIntoView(link.entryIndex);\n }\n }\n }\n\n const url = originals[canonicalIdx];\n const isVideoSlide = isVideoItem(url);\n\n if (introFade || isVideoSlide) {\n fadeCloseAndTeardown();\n return;\n }\n\n // shared chrome fade\n fadeChrome();\n fadeOverlay();\n\n // ---- compute thumb rect + objPos, then animate ----\n if (!isGridish) {\n // slider destination: ensure thumb visible (may move slider), then measure\n if (!slider.current || !slides.current?.length) {\n safeTeardown();\n return;\n }\n\n const viewport = getViewportEl(slider.current);\n if (!viewport) {\n safeTeardown();\n return;\n }\n\n const slideArr = slides.current!;\n let matchSlide = slideArr.find((s) => s.cells.some((c) => c.index === localSlideIdx));\n let newIndex = matchSlide ? slideArr.indexOf(matchSlide) : -1;\n\n if (newIndex < 0) {\n newIndex = slideArr.length - 1;\n matchSlide = slideArr[slideArr.length - 1];\n }\n\n if (!matchSlide) {\n safeTeardown();\n return;\n }\n\n const targetCellEl =\n matchSlide.cells.find((c) => c.index === localSlideIdx)?.element ??\n matchSlide.cells[0]?.element ??\n null;\n\n const shouldMove = !!(viewport && targetCellEl) && !isCellVisible(targetCellEl!, viewport, true);\n\n const measureAndAnimate = async () => {\n const thumbInfo = findThumbInfoEnsuringVisible(\n localSlideIdx,\n centerAlign,\n slider,\n slides,\n selectedIndex,\n sliderX,\n sliderVelocity,\n centerSlider,\n isWrapping,\n visibleImagesRef,\n setSliderIndex\n );\n\n if (!thumbInfo) {\n safeTeardown();\n return;\n }\n\n // Prefer the actual image content rect if present\n let thumbCropRect = thumbInfo.cropRect;\n let endObjPos = thumbInfo.objPos ?? { x: 0.5, y: 0.5 };\n\n if (thumbInfo.imgEl) {\n const { cropRect, objPos } = computeThumbCropRectFromImg(thumbInfo.imgEl);\n thumbCropRect = cropRect;\n endObjPos = objPos;\n }\n\n await animateCloseToThumb({\n thumbCropRect,\n endObjPos,\n isVideoSlide: false,\n });\n };\n\n if (shouldMove) {\n moveBaseSliderToSlide(\n centerAlign,\n slider,\n slides,\n selectedIndex,\n sliderX,\n sliderVelocity,\n centerSlider,\n newIndex,\n setSliderIndex\n );\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => { void measureAndAnimate(); });\n });\n } else {\n await measureAndAnimate();\n }\n\n return;\n }\n\n // grid destination: use expandableImgRefs\n if (!expandableImgRefs?.current) {\n safeTeardown();\n return;\n }\n\n const origImgRef =\n (expandableImgRefs.current?.[canonicalIdx] as unknown as HTMLImageElement | null) ?? null;\n\n if (!origImgRef) {\n safeTeardown();\n return;\n }\n\n const { cropRect: thumbCropRect, objPos: endObjPos } = computeThumbCropRectFromImg(origImgRef);\n\n await animateCloseToThumb({\n thumbCropRect,\n endObjPos,\n isVideoSlide: false,\n });\n }\n\n function safeTeardown() {\n unmountShield();\n [leftChevronRef.current, rightChevronRef.current, counterRef.current, closeButtonRef.current]\n .forEach(el => el?.remove())\n leftChevronRef.current = null\n rightChevronRef.current = null\n counterRef.current = null\n closeButtonRef.current = null\n\n if (!introFade) {\n const fsSlider = withinFs<HTMLElement>('.fullscreen_slider');\n if (fsSlider) fsSlider.style.opacity = '0';\n\n const modal = withinFs<HTMLElement>('.fs_modal');\n if (modal) {\n modal.style.opacity = '0';\n modal.style.pointerEvents = 'none';\n }\n }\n\n overlayDivRef.current?.remove()\n overlayDivRef.current = null\n\n onForceResetZoom()\n onClose()\n setShowFullscreenSlider(false)\n setClosingModal(false)\n }\n\n return (\n <div\n ref={modalRef}\n onPointerDown={(e: React.PointerEvent<HTMLDivElement>) => {\n pointerDownX.current = e.clientX\n pointerDownY.current = e.clientY\n }}\n className='fs_modal'\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n opacity: open ? 1 : 0,\n pointerEvents: open ? 'auto' : 'none',\n zIndex: 9999,\n display: 'block',\n touchAction: 'none',\n contain: 'layout style size',\n overflow: 'hidden',\n }}\n >\n {children}\n </div>\n )\n}\n\nexport default FullscreenModal","export function parseObjectPosition(op: string | null): { x: number; y: number } {\n if (!op) return { x: 0.5, y: 0.5 }\n const mapKW = (kw: string, isX: boolean) => {\n const lower = kw.toLowerCase()\n if (isX) {\n if (lower === 'left') return 0\n if (lower === 'center') return 0.5\n if (lower === 'right') return 1\n } else {\n if (lower === 'top') return 0\n if (lower === 'center') return 0.5\n if (lower === 'bottom') return 1\n }\n return NaN\n }\n const parts = op.trim().split(/\\s+/)\n let xf = 0.5, yf = 0.5\n if (parts.length >= 1) {\n const p0 = parts[0]\n if (p0.endsWith('%')) xf = Math.min(1, Math.max(0, parseFloat(p0) / 100))\n else {\n const m0 = mapKW(p0, true)\n if (!Number.isNaN(m0)) xf = m0\n }\n }\n if (parts.length >= 2) {\n const p1 = parts[1]\n if (p1.endsWith('%')) yf = Math.min(1, Math.max(0, parseFloat(p1) / 100))\n else {\n const m1 = mapKW(p1, false)\n if (!Number.isNaN(m1)) yf = m1\n }\n }\n return { x: xf, y: yf }\n }","export function coverTransformForRect(\n natW: number,\n natH: number,\n cropRect: DOMRect,\n objPos: { x: number; y: number } | null\n ) {\n const cropW = Math.max(1, cropRect.width);\n const cropH = Math.max(1, cropRect.height);\n\n const s = Math.max(cropW / Math.max(1, natW), cropH / Math.max(1, natH));\n\n const scaledW = natW * s;\n const scaledH = natH * s;\n\n const ox = objPos?.x ?? 0.5;\n const oy = objPos?.y ?? 0.5;\n\n const overflowX = Math.max(0, scaledW - cropW);\n const overflowY = Math.max(0, scaledH - cropH);\n\n const dx = (0.5 - ox) * overflowX;\n const dy = (0.5 - oy) * overflowY;\n\n const cx = cropRect.left + cropW / 2 + dx;\n const cy = cropRect.top + cropH / 2 + dy;\n\n return { cx, cy, scale: s };\n }\n\n export function containTransformForRect(\n natW: number,\n natH: number,\n cropRect: DOMRect,\n objPos: { x: number; y: number } | null\n ) {\n const cropW = Math.max(1, cropRect.width);\n const cropH = Math.max(1, cropRect.height);\n\n const s = Math.min(cropW / Math.max(1, natW), cropH / Math.max(1, natH));\n\n const scaledW = natW * s;\n const scaledH = natH * s;\n\n const ox = objPos?.x ?? 0.5;\n const oy = objPos?.y ?? 0.5;\n\n const extraX = Math.max(0, cropW - scaledW);\n const extraY = Math.max(0, cropH - scaledH);\n\n const left = cropRect.left + extraX * ox;\n const top = cropRect.top + extraY * oy;\n\n const cx = left + scaledW / 2;\n const cy = top + scaledH / 2;\n\n return { cx, cy, scale: s };\n }\n\n export function objectFitContentRect(\n natW: number,\n natH: number,\n box: DOMRect,\n fit: 'contain' | 'cover',\n objPos: { x: number; y: number }\n ) {\n const scale =\n fit === 'contain'\n ? Math.min(box.width / natW, box.height / natH)\n : Math.max(box.width / natW, box.height / natH);\n\n const w = natW * scale;\n const h = natH * scale;\n\n const left = box.left + (box.width - w) * objPos.x;\n const top = box.top + (box.height - h) * objPos.y;\n\n return new DOMRect(left, top, w, h);\n }","/* eslint-disable @typescript-eslint/no-explicit-any */\n'use client'\n\nimport {\n useRef,\n useEffect,\n useLayoutEffect,\n useState,\n createRef,\n cloneElement,\n Children,\n ReactNode,\n ReactElement,\n HTMLAttributes,\n ClassAttributes,\n Dispatch,\n SetStateAction,\n RefObject,\n isValidElement,\n useCallback,\n useId,\n useMemo,\n Ref,\n useImperativeHandle,\n forwardRef,\n} from 'react'\nimport styles from './Slider.module.css'\nimport createIndexChannel from './sliderSub'\nimport { createRoot } from 'react-dom/client';\nimport { AxisKey, isMouseEvent } from '../shared/input/pointerTypes';\nimport { createDragTracker } from '../shared/input/dragTracker';\nimport { Vector1D, Vector1DType } from '../shared/motion/vector1d';\nimport { ScrollBody, ScrollBodyType } from '../shared/motion/scrollBody';\nimport { Limit, LimitType } from '../shared/motion/limit';\nimport { ScrollLooper } from '../shared/motion/scrollLooper';\nimport { ScrollBounds, ScrollBoundsType, PercentOfView, PercentOfViewType } from '../shared/motion/scrollBounds';\nimport { BaseTarget, factorAbs, mathSign, ScrollTarget, ScrollTargetType } from '../shared/motion/scrollTarget';\nimport { EventStore } from '../shared/motion/eventStore';\nimport { Animations, AnimationsType } from '../shared/motion/animations';\nimport type { APITypes } from 'plyr-react';\nimport { RmgSlideProvider } from '../shared/slideContext';\nimport { ResponsiveHeightRule, SliderHandle, SliderIntroOptions, SliderLoadingOptions } from './types';\nimport { ArrowRenderArgs, DotsRenderArgs, ProgressRenderArgs } from '../shared/types/controls';\nimport { ElementStyle } from '../shared/types/elements';\nimport { FsCaptionPlacement, FsCaptionRenderArgs, FsCounterArgs } from '../fullscreen/types';\nimport { MediaItem } from '../shared/types/media';\nimport { ThumbnailPosition } from './thumbnails/types';\nimport { BreakpointMap } from '../shared/responsive';\nimport { IndexMode } from '../api/types';\nimport { Counter, CounterType } from '../shared/motion/counter';\nimport { createGestureShield } from '../fullscreen/gestureShield';\nimport { buildScopedSkeletonCountCss } from '../shared/skeleton/buildScopedSkeletonCountCss';\nimport { useParallaxEffect } from './effects/useParallaxEffect';\nimport { useScaleEffect } from './effects/useScaleEffect';\nimport { useFadeEffect } from './effects/useFadeEffect';\nimport { BaseLimit, createBaseLimit } from '../shared/motion/baseLimit';\nimport { RmgArrows } from './controls/arrows';\nimport { buildDotsNode } from './controls/dots';\nimport { buildProgressNode } from './controls/progress';\nimport { FullscreenOptions } from '../fullscreen/types';\nimport { createSliderFullscreenIntroRunner } from '../fullscreen/fullscreenIntro';\nimport { WindowType } from '../shared/input/pointerTypes'\nimport { AXSpec } from '../shared/types/axis';\nimport { Translate } from '../shared/motion/translate';\n\nfunction DragTracker(main: AxisKey | undefined, ownerWindow: WindowType) {\n const scroll: AxisKey = main ?? 'x'\n const cross: AxisKey = scroll === 'x' ? 'y' : 'x'\n\n return createDragTracker({\n ownerWindow,\n axis: { scroll, cross },\n })\n}\n\ntype BaseScrollTo = {\n distance: (n: number, snap: boolean) => void\n index: (n: number, direction: number) => void\n}\n\ninterface SliderProps {\n children: ReactNode\n imageCount: number\n isClick: RefObject<boolean>\n expandableImgRefs?: RefObject<RefObject<HTMLImageElement | null>[]>\n overlayDivRef: RefObject<HTMLDivElement | null>\n setSlideIndex: (index: number) => void\n setShowFullscreenModal: (show: boolean) => void\n setShowFullscreenSlider: Dispatch<SetStateAction<boolean>>\n showFullscreenSlider: boolean\n duplicateImgRef: RefObject<HTMLElement | null>\n closeButtonRef: RefObject<HTMLElement | null>\n counterRef: RefObject<HTMLElement | null>\n leftChevronRef: RefObject<HTMLElement | null>\n rightChevronRef: RefObject<HTMLElement | null>\n isReady: boolean\n setIsReady: Dispatch<SetStateAction<boolean>>\n loop?: boolean\n freeScroll?: boolean\n autoPlay?: boolean\n autoPlaySpeed: number\n autoPlayPause: number\n autoScroll?: boolean\n autoScrollSpeed: number\n autoScrollPause: number\n pauseAutoPlayOnHover?: boolean;\n pauseAutoScrollOnHover?: boolean;\n groupCells?: boolean\n centerAlign?: boolean\n gap: number;\n sliderViewportStyles?: React.CSSProperties;\n sliderViewportClassName?: string;\n sliderContainerStyles?: React.CSSProperties;\n sliderContainerClassName?: string;\n backgroundColor?: string\n sliderHeight?: string;\n responsiveHeights?: ResponsiveHeightRule[];\n arrowStyles?: React.CSSProperties;\n arrowClassName?: string;\n prevArrowStyles?: React.CSSProperties;\n prevArrowClassName?: string;\n nextArrowStyles?: React. CSSProperties;\n nextArrowClassName?: string;\n dotsContainerStyles?: React.CSSProperties;\n dotsContainerClassName?: string;\n dotsStyles?: React.CSSProperties;\n dotsClassName?: string;\n renderArrows?: (args: ArrowRenderArgs & { dir: \"prev\" | \"next\" }) => React.ReactNode;\n renderPrevArrow?: (args: ArrowRenderArgs) => React.ReactNode;\n renderNextArrow?: (args: ArrowRenderArgs) => React.ReactNode;\n renderDots?: (args: DotsRenderArgs) => React.ReactNode;\n showArrows?: boolean;\n showDots?: boolean;\n enableFullscreen?: boolean;\n showProgress?: boolean;\n progressClassName?: string;\n progressStyle?: React.CSSProperties;\n progressInnerClassName?: string;\n progressInnerStyle?: React.CSSProperties;\n renderProgress?: (args: ProgressRenderArgs) => React.ReactNode;\n fullscreenControls?: {\n close?: ElementStyle;\n arrows?: {\n arrow?: ElementStyle;\n prev?: ElementStyle;\n next?: ElementStyle;\n };\n counter?: ElementStyle;\n };\n showFsArrows?: boolean;\n showFsClose?: boolean;\n renderFsClose?: () => HTMLElement | null;\n renderFsArrows?: (args: { dir: \"prev\" | \"next\" }) => HTMLElement | null;\n renderFsPrev?: () => HTMLElement | null;\n renderFsNext?: () => HTMLElement | null;\n showFsCounter?: boolean;\n renderFsCounter?: (args: FsCounterArgs) => HTMLElement | null;\n fsCaptionPlacement?: FsCaptionPlacement;\n fsCaptionWidth?: number;\n fsCaptionHeight?: number;\n fsCaptionBreakpoint?: number;\n parallax?: boolean;\n parallaxBleedPct?: string;\n parallaxBorderRadius?: string;\n parallaxSideWidth?: string;\n scaleEffect?: boolean;\n scaleAmount?: number;\n fadeEffect?: boolean;\n initialHeight?: number | string;\n cellsPerSlide?: number;\n direction?: 'ltr' | 'rtl';\n axis?: 'x' | 'y';\n skipSnaps?: boolean;\n selectDuration: number;\n freeScrollDuration: number;\n sliderFriction: number;\n indexChannel?: ReturnType<typeof createIndexChannel>;\n loadingOptions?: SliderLoadingOptions;\n introOptions?: SliderIntroOptions;\n lazyLoad?: boolean;\n rippleEnabled?: boolean;\n rippleClassName?: string;\n renderFsCaption?: (args: FsCaptionRenderArgs) => React.ReactNode;\n normalizedItems: MediaItem[];\n fsThumbContainerRef?: RefObject<HTMLDivElement | null>\n fullscreenThumbnails?: ThumbnailPosition;\n sliderImagesReady?: boolean;\n fullscreenIntroFade?: boolean;\n setFsFadeOpening: Dispatch<SetStateAction<boolean>>;\n breakpointMap: BreakpointMap;\n fsIntroDuration?: number;\n fsIntroEasing?: string;\n}\n\ntype CarouselChildProps = HTMLAttributes<HTMLElement> &\n ClassAttributes<HTMLElement> & {\n style?: React.CSSProperties\n }\n\nconst RMG_BLANK =\n 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==';\n\nfunction markLazyShell(slideEl: HTMLElement) {\n slideEl.setAttribute('data-rmg-lazyload', '');\n slideEl.setAttribute('aria-busy', 'true');\n\n const targets = slideEl.querySelectorAll<HTMLElement>('[data-rmg-src]');\n targets.forEach((t) => {\n if (t instanceof HTMLImageElement) {\n if (!t.getAttribute('src')) t.src = RMG_BLANK;\n const s = t.style as CSSStyleDeclaration;\n if (!s.opacity) s.opacity = '0';\n if (!s.transition) s.transition = 'opacity 220ms ease';\n t.addEventListener('error', () => {\n if (!t.src.endsWith('/rmg-blank.png')) t.src = '/rmg-blank.png';\n }, { once: true });\n } else {\n t.style.opacity = '0';\n }\n });\n}\n\nfunction revealSlide(slideEl: HTMLElement) {\n const targets = slideEl.querySelectorAll<HTMLElement>('[data-rmg-src]');\n targets.forEach((t) => {\n const src = t.getAttribute('data-rmg-src');\n if (!src) return;\n\n if (t instanceof HTMLImageElement) {\n t.src = src;\n t.removeAttribute('data-rmg-src');\n t.style.opacity = '1';\n } else {\n (t.style as any).backgroundImage = `url(\"${src}\")`;\n t.removeAttribute('data-rmg-src');\n t.style.opacity = '1';\n }\n });\n\n slideEl.setAttribute('data-rmg-lazyloaded', 'true');\n slideEl.removeAttribute('aria-busy');\n\n const sp = slideEl.querySelector<HTMLElement>('[data-rmg-spinner]');\n if (sp) sp.style.display = 'none';\n}\n\nfunction detectKindFromDom(slideEl: HTMLElement): 'video' | 'image' {\n // Plyr root\n if (slideEl.querySelector('.plyr')) return 'video';\n\n // Native video\n if (slideEl.querySelector('video')) return 'video';\n\n // Common embed patterns (YouTube/Vimeo)\n if (slideEl.querySelector('iframe')) return 'video';\n\n // (Optional) Plyr sometimes marks provider on iframe\n if (slideEl.querySelector('[data-plyr-provider], [data-plyr-embed-id]')) return 'video';\n\n return 'image';\n}\n\ntype PlyrApi = APITypes | null;\n\ntype PlyrRefsByIndex = React.RefObject<Record<number, PlyrApi>>;\n\nfunction cloneSlide(\n child: ReactElement<any>,\n key: string,\n elementIndex: number,\n cells: React.RefObject<{ element: HTMLElement; index: number }[]>,\n enableParallax?: boolean,\n imageCountForIdx?: number,\n lazyLoad?: boolean,\n extraStyle?: React.CSSProperties,\n fullscreen?: boolean,\n isClone?: boolean,\n plyrRefsByIdx?: PlyrRefsByIndex\n): ReactElement<CarouselChildProps> {\n const normIdx =\n imageCountForIdx != null\n ? ((elementIndex % imageCountForIdx) + imageCountForIdx) % imageCountForIdx\n : elementIndex;\n\n const ctxVal = {\n normIdx,\n isClone: !!isClone,\n registerPlyr: (api: APITypes | null) => {\n if (isClone || !plyrRefsByIdx) return;\n if (api) plyrRefsByIdx.current[normIdx] = api;\n else delete plyrRefsByIdx.current[normIdx];\n },\n };\n\n const shellProps = {\n ['data-rmg-slide' as any]: 'true',\n ['data-rmg-idx' as any]: String(normIdx),\n ['data-rmg-kind' as any]: 'image',\n ['data-rmg-clone' as any]: isClone ? 'true' : 'false',\n ref: (el: HTMLElement | null) => {\n if (el && !cells.current.some((c) => c.element === el)) {\n cells.current.push({ element: el, index: elementIndex });\n }\n if (el && lazyLoad) markLazyShell(el);\n\n if (el) {\n const kind = detectKindFromDom(el);\n if (el.getAttribute('data-rmg-kind') !== kind) {\n el.setAttribute('data-rmg-kind', kind);\n }\n }\n },\n style: {\n position: 'absolute',\n top: 0,\n left: 0,\n ...(extraStyle || {}),\n userSelect: 'none',\n ...(fullscreen ? { cursor: 'zoom-in' } : {}),\n } as React.CSSProperties,\n };\n\n let contentNode: React.ReactNode = child;\n\n if (\n !isClone &&\n lazyLoad &&\n typeof child.type === 'string' &&\n child.type.toLowerCase() === 'img'\n ) {\n const imgProps = child.props || {};\n const realSrc = imgProps.src;\n const alt = imgProps.alt ?? '';\n\n contentNode = cloneElement(child, {\n src: RMG_BLANK,\n alt,\n ['data-rmg-src']: realSrc,\n decoding: 'async',\n style: {\n ...(imgProps.style || {}),\n opacity: 0,\n transition: 'opacity 220ms ease',\n },\n });\n }\n\n if (!enableParallax) {\n return (\n <div key={key} {...shellProps}>\n <RmgSlideProvider value={ctxVal}>{contentNode}</RmgSlideProvider>\n </div>\n );\n }\n\n return (\n <div key={key} {...shellProps} className=\"rmg__slide\">\n <RmgSlideProvider value={ctxVal}>\n <div className=\"rmg__parallax\">\n <div className=\"rmg__parallax__layer\">{contentNode}</div>\n </div>\n </RmgSlideProvider>\n </div>\n );\n}\n\nconst Slider = forwardRef<SliderHandle, SliderProps>(function Slider(\n {\n children,\n imageCount,\n isClick,\n expandableImgRefs,\n overlayDivRef,\n setSlideIndex,\n setShowFullscreenModal,\n setShowFullscreenSlider,\n showFullscreenSlider,\n duplicateImgRef,\n closeButtonRef,\n counterRef,\n leftChevronRef,\n rightChevronRef,\n isReady,\n setIsReady,\n loop,\n freeScroll,\n autoPlay,\n autoPlaySpeed,\n autoPlayPause,\n autoScroll,\n autoScrollSpeed,\n autoScrollPause,\n pauseAutoPlayOnHover,\n pauseAutoScrollOnHover,\n groupCells,\n centerAlign,\n gap,\n sliderViewportStyles,\n sliderViewportClassName,\n sliderContainerStyles,\n sliderContainerClassName,\n sliderHeight,\n responsiveHeights,\n arrowStyles,\n arrowClassName,\n prevArrowStyles,\n prevArrowClassName,\n nextArrowStyles,\n nextArrowClassName,\n dotsContainerStyles,\n dotsContainerClassName,\n dotsStyles,\n dotsClassName,\n renderArrows,\n renderPrevArrow,\n renderNextArrow,\n renderDots,\n showArrows,\n showDots,\n enableFullscreen,\n showProgress,\n progressClassName,\n progressStyle,\n progressInnerClassName,\n progressInnerStyle,\n renderProgress,\n fullscreenControls = {},\n showFsArrows,\n showFsClose,\n renderFsClose,\n renderFsArrows,\n renderFsPrev,\n renderFsNext,\n showFsCounter,\n renderFsCounter,\n fsCaptionPlacement,\n fsCaptionWidth,\n fsCaptionHeight,\n fsCaptionBreakpoint,\n parallax,\n parallaxBleedPct,\n parallaxBorderRadius,\n parallaxSideWidth,\n scaleEffect,\n scaleAmount,\n fadeEffect,\n initialHeight,\n cellsPerSlide,\n direction,\n axis,\n skipSnaps,\n selectDuration,\n freeScrollDuration,\n sliderFriction,\n indexChannel: externalIndexChannel,\n loadingOptions,\n introOptions,\n lazyLoad,\n rippleEnabled,\n rippleClassName,\n renderFsCaption,\n normalizedItems,\n fsThumbContainerRef,\n fullscreenThumbnails,\n sliderImagesReady,\n fullscreenIntroFade,\n setFsFadeOpening,\n breakpointMap,\n fsIntroDuration = 300,\n fsIntroEasing = 'cubic-bezier(.4,0,.22,1)'\n }: SliderProps,\n ref: Ref<SliderHandle>\n) {\n const slider = useRef<HTMLDivElement | null>(null);\n const slides = useRef<{ cells: { element: HTMLElement, index: number }[], target: number }[]>([]);\n const visibleImagesRef = useRef(0);\n const selectedIndex = useRef(0);\n const sliderX = useRef(0);\n const sliderVelocity = useRef(0);\n const isWrapping = useRef(true);\n const sliderContainer = useRef<HTMLDivElement | null>(null)\n const prevButtonRef = useRef<HTMLDivElement>(null)\n const nextButtonRef = useRef<HTMLDivElement>(null)\n const dotRefs = useRef<(HTMLDivElement | null)[]>([])\n const dotsContainerRef = useRef<HTMLDivElement | null>(null)\n const [clonedChildren, setClonedChildren] = useState<React.ReactElement[]>([])\n const clonesCountRef = useRef(0)\n const [visibleImages, setVisibleImages] = useState(1)\n const [slidesState, setSlidesState] = useState<{ cells: { element: HTMLElement }[] }[]>([])\n const [isMeasured, setIsMeasured] = useState(false)\n const [inView, setInView] = useState(false)\n const [wrap, setWrap] = useState(false)\n const progressHolderRef = useRef<HTMLDivElement | null>(null);\n const progressInnerRef = useRef<HTMLDivElement | null>(null);\n const lastProgressRef = useRef(0);\n const cellToSlideRef = useRef<number[]>([]);\n const builtOnceRef = useRef(false);\n const slideBuildSubs = useRef(new Set<(nodes: HTMLElement[]) => void>());\n const [layoutReady, setLayoutReady] = useState(false);\n const [engineReady, setEngineReady] = useState(false);\n const overlayCaptionRef = useRef<HTMLDivElement | null>(null);\n const overlayCaptionRootRef = useRef<ReturnType<typeof createRoot> | null>(null);\n const locationRef = useRef<Vector1DType | null>(null)\n const previousLocationRef = useRef<Vector1DType | null>(null)\n const offsetLocationRef = useRef<Vector1DType | null>(null)\n const targetRef = useRef<Vector1DType | null>(null)\n const bodyRef = useRef<ScrollBodyType | null>(null)\n const translateRef = useRef<ReturnType<typeof Translate> | null>(null)\n const animRef = useRef<AnimationsType | null>(null)\n const limitRef = useRef<LimitType | null>(null)\n const pointerDownRef = useRef(false)\n const isAnimatingRef = useRef(false)\n const isPointerDown = useRef(false)\n const isScrolling = useRef(false)\n const xRef = useRef(0)\n const dragX = useRef(0)\n const previousDragX = useRef(0)\n const dragMoveTime = useRef<Date | null>(null)\n const boundsRef = useRef<ScrollBoundsType | null>(null)\n const povRef = useRef<PercentOfViewType | null>(null)\n const cells = useRef<{ element: HTMLElement; index: number }[]>([])\n const sliderWidth = useRef(0)\n const hasPositioned = useRef<boolean>(false)\n const getSnapTargets: () => number[] = () => (slides.current || []).map((s) => s.target)\n const totalWidth = () => sliderWidth.current || 0\n const contentSizeRef = useRef(0)\n const loopLimitRef = useRef<ReturnType<typeof Limit> | null>(null)\n const scrollSnapsRef = useRef<number[]>([])\n const scrollContentSizeRef = useRef(0)\n const scrollLimitRef = useRef<BaseLimit | null>(null)\n const scrollTargetRef = useRef<ScrollTargetType | null>(null)\n const scrollToRef = useRef<BaseScrollTo | null>(null)\n const indexCurrentRef = useRef<CounterType | null>(null)\n const indexPreviousRef = useRef<CounterType | null>(null)\n const layoutRef = useRef<{\n originals: { el: HTMLElement; start: number; end: any; size: any }[];\n cw: number;\n } | null>(null);\n const draggingAttr = 'data-rmg-drag';\n const activePointerIdRef = useRef<number | null>(null);\n const guardsStoreRef = useRef<ReturnType<typeof EventStore> | null>(null);\n const isHoveringRef = useRef(false);\n const lastPointerUpTime = useRef<number>(performance.now() - 1000);\n const autoScrollPauseUntil = useRef(0);\n const [buildKey, setBuildKey] = useState(0);\n const loopStableRef = useRef<boolean | null>(null);\n const [geomKey, setGeomKey] = useState(0);\n const lastGeomSigRef = useRef<string>(\"\");\n const plyrRefsByIdx = useRef<Record<number, any>>({});\n const lastCloneSigRef = useRef<string>(\"\");\n const shieldCleanupRef = useRef<null | (() => void)>(null);\n const shieldRef = useRef<ReturnType<typeof createGestureShield> | null>(null);\n const internalIndexChannel = useMemo(() => createIndexChannel(), []);\n const indexChannel = externalIndexChannel ?? internalIndexChannel;\n const isRtl = direction === 'rtl' ? true : false\n const rtlCls = isRtl ? styles.rtl : '';\n const sign = axis === 'x' && isRtl ? -1 : 1;\n const [responsiveSliderHeight, setResponsiveSliderHeight] = useState<string>(() => {\n if (typeof initialHeight === 'number' && initialHeight > 0) {\n return `${initialHeight}px`;\n }\n\n if (typeof initialHeight === 'string' && initialHeight.trim() !== '') {\n return initialHeight;\n }\n\n return '0px';\n });\n\n const lastNonZeroHeightRef = useRef<number>(\n typeof initialHeight === 'number' && initialHeight > 0 ? initialHeight : 1\n );\n\n const scopeId = useId().replace(/:/g, \"-\");\n\n const AX: AXSpec = useMemo(() => {\n const main = axis!;\n const cross = axis === 'x' ? 'y' : 'x';\n const sizeKey = axis === 'x' ? 'width' : 'height';\n const clientKey = axis === 'x' ? 'clientWidth' : 'clientHeight';\n const startKey = axis === 'x' ? 'left' : 'top';\n const endKey = axis === 'x' ? 'right' : 'bottom';\n\n const translate = (n: number) =>\n axis === 'x' ? `translate3d(${n}px,0,0)` : `translate3d(0,${n}px,0)`;\n\n const place = (n: number) =>\n axis === 'x'\n ? `translateX(${n}px) scale(var(--rmg-scale, 1))`\n : `translateY(${n}px) scale(var(--rmg-scale, 1))`;\n\n const wheelDelta = (e: WheelEvent) => (axis === 'x' ? e.deltaX : e.deltaY);\n\n return { main, cross, sizeKey, clientKey, startKey, endKey, translate, place, wheelDelta };\n }, [axis]);\n\n const responsiveCss = useMemo<string>(() => {\n const rules: ResponsiveHeightRule[] = Array.isArray(responsiveHeights)\n ? responsiveHeights\n : [];\n\n if (rules.length === 0) return \"\";\n\n const rootSel = `#${scopeId}`;\n\n return rules\n .map((r) => `@media ${r.query} { ${rootSel} { --rmg-slider-height: ${r.height} !important; } }`)\n .join(\"\\n\");\n }, [responsiveHeights, scopeId]);\n\n const hasResponsiveHeights =\n Array.isArray(responsiveHeights) && responsiveHeights.length > 0;\n\n const heightVarValue =\n sliderHeight\n ? sliderHeight\n : hasResponsiveHeights\n ? undefined\n : responsiveSliderHeight;\n\n const baseCss = useMemo(() => {\n const root = `#${scopeId}`;\n return `\n ${root} .rmg__slide {\n position: absolute;\n left: 0;\n width: ${parallaxSideWidth};\n height: 100dvh;\n overflow: hidden;\n border-radius: ${parallaxBorderRadius};\n }\n\n ${root} .rmg__parallax {\n width: 100%;\n height: 100%;\n }\n\n ${root} .rmg__parallax__layer {\n width: 100%;\n height: 100%;\n will-change: transform;\n transform: ${\n axis === 'x' ? 'translateX(0%)' : 'translateY(0%)'\n }\n }\n\n ${root} .rmg__parallax__layer > img,\n ${root} .rmg__parallax__layer > picture,\n ${root} .rmg__parallax__layer > video {\n display: block;\n height: 100%;\n width: ${parallaxBleedPct};\n max-width: none;\n object-fit: cover;\n margin-left: calc((100% - ${parallaxBleedPct}) / 2);\n }\n `;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scopeId, parallaxBleedPct, parallaxBorderRadius, parallaxSideWidth]);\n\n const progressApi = buildProgressNode({\n AX,\n slider,\n sliderWidth,\n wrap,\n offsetLocationRef,\n lastProgressRef,\n progressHolderRef,\n progressInnerRef,\n showProgress,\n renderProgress,\n progressClassName,\n progressStyle,\n progressInnerClassName,\n progressInnerStyle,\n });\n\n const progressNode = progressApi.progressNode;\n\n function resolveFsCaptionPlacement(\n placement: FsCaptionPlacement | undefined,\n breakpoint: number | undefined,\n viewportWidth: number\n ): FsCaptionPlacement | null {\n if (!placement) return null;\n\n if (breakpoint != null && viewportWidth < breakpoint) {\n return 'bottom';\n }\n return placement;\n }\n\n const childrenKey = useMemo(() => {\n const arr = Children.toArray(children) as any[];\n // only keys, so this doesn’t change on every render\n return arr.map((c) => String(c?.key ?? \"\")).join(\"|\");\n }, [children]);\n\n useEffect(() => {\n setEngineReady(false);\n setLayoutReady(false);\n hasPositioned.current = false;\n setIsReady(false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [imageCount, childrenKey, loop, axis]);\n\n function getOriginalNodes(): HTMLElement[] {\n const track = slider.current;\n if (!track) return [];\n const kids = Array.from(track.children) as HTMLElement[];\n const before = clonesCountRef.current || 0;\n const after = before;\n return kids.slice(before, kids.length - after);\n }\n\n function clampIndex(i: number, len: number) {\n return Math.max(0, Math.min(len - 1, i))\n }\n\n useEffect(() => {\n isWrapping.current = wrap\n }, [wrap, isWrapping])\n\n function ensureDragStyle(scopeId: string) {\n const id = 'rmg-drag-style-' + scopeId;\n if (document.getElementById(id)) return;\n const style = document.createElement('style');\n style.id = id;\n style.textContent = `\n /* Only while data-rmg-drag is present on this slider root */\n #${scopeId}[data-rmg-drag] { cursor: grabbing !important; }\n #${scopeId}[data-rmg-drag] * { cursor: grabbing !important; }\n `;\n document.head.appendChild(style);\n }\n\n useEffect(() => {\n if (sliderContainer.current) ensureDragStyle(scopeId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [sliderContainer.current, scopeId]);\n\n function setDragCursor(on: boolean) {\n const root = sliderContainer.current;\n if (!root) return;\n\n if (on) {\n if (!root.hasAttribute(draggingAttr)) root.setAttribute(draggingAttr, '');\n return;\n }\n\n if (root.hasAttribute(draggingAttr)) root.removeAttribute(draggingAttr);\n activePointerIdRef.current = null;\n guardsStoreRef.current?.clear();\n guardsStoreRef.current = null;\n }\n\n useEffect(() => {\n const root = sliderContainer.current;\n if (!root) return;\n\n const onLeave = () => {\n if (pointerDownRef.current) setDragCursor(false);\n };\n const onEnter = () => {\n if (pointerDownRef.current && activePointerIdRef.current != null) setDragCursor(true);\n };\n\n root.addEventListener('mouseleave', onLeave, { passive: true });\n root.addEventListener('mouseenter', onEnter, { passive: true });\n return () => {\n root.removeEventListener('mouseleave', onLeave as any);\n root.removeEventListener('mouseenter', onEnter as any);\n };\n }, []);\n\n function getCenterOffsetForIndex(idx: number) {\n const track = slider.current;\n if (!track || !slides.current?.[idx]?.cells?.[0]?.element) return 0;\n const containerSize = (track as any)[AX.clientKey] as number;\n const cellSize = slides.current[idx].cells[0].element.getBoundingClientRect()[AX.sizeKey];\n return centerAlign ? (containerSize - cellSize) / 2 : 0;\n }\n\n useEffect(() => {\n const root = sliderContainer.current;\n if (!root) return;\n\n const onEnter = () => {\n isHoveringRef.current = true;\n };\n\n const onLeave = () => {\n isHoveringRef.current = false;\n };\n\n root.addEventListener('mouseenter', onEnter);\n root.addEventListener('mouseleave', onLeave);\n\n return () => {\n root.removeEventListener('mouseenter', onEnter);\n root.removeEventListener('mouseleave', onLeave);\n };\n }, []);\n\n useEffect(() => {\n const id = window.setInterval(() => {\n const now = performance.now();\n if (\n isPointerDown.current ||\n showFullscreenSlider ||\n !isWrapping.current ||\n !autoPlay ||\n !isReady ||\n (pauseAutoPlayOnHover && isHoveringRef.current)\n ) {\n return;\n }\n\n if (now - lastPointerUpTime.current < autoPlayPause) return;\n\n if (isRtl) {\n previous();\n } else {\n next();\n }\n }, autoPlaySpeed);\n\n return () => {\n window.clearInterval(id);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [showFullscreenSlider, slidesState, clonedChildren, isWrapping.current]);\n\n useEffect(() => {\n let lastTime = performance.now();\n let frameId: number;\n\n function loop(now: number) {\n frameId = requestAnimationFrame(loop);\n\n const dt = now - lastTime;\n lastTime = now;\n\n if (\n !slider.current ||\n !isWrapping.current ||\n isPointerDown.current ||\n isAnimatingRef.current ||\n showFullscreenSlider ||\n !autoScroll ||\n (pauseAutoScrollOnHover && isHoveringRef.current)\n ) {\n return;\n }\n\n if (now < autoScrollPauseUntil.current) return;\n\n const dir = isRtl ? +1 : -1;\n const offset = offsetLocationRef.current?.get() ?? 0;\n const next = offset + dir * autoScrollSpeed * dt;\n\n targetRef.current?.set(next);\n bodyRef.current?.useDuration(0).useFriction(1);\n\n animRef.current?.start();\n xRef.current = next;\n positionSlider();\n progressApi.updateProgressInFrame();\n tweenParallax();\n updateActiveIndexFromX(next);\n }\n\n frameId = requestAnimationFrame(loop);\n return () => cancelAnimationFrame(frameId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [showFullscreenSlider]);\n\n function setWrapSafe(next: boolean) {\n if (loopStableRef.current === next) return;\n loopStableRef.current = next;\n setWrap(next);\n isWrapping.current = next;\n\n hasPositioned.current = false;\n setLayoutReady(false);\n\n setBuildKey(k => k + 1);\n }\n\n function getPlyrInstance(api: any) {\n return api?.plyr ?? api ?? null;\n }\n\n function togglePlyr(api: any) {\n const inst = getPlyrInstance(api);\n if (!inst) return;\n\n const isPaused =\n typeof inst.paused === 'boolean'\n ? inst.paused\n : (inst.media?.paused ?? true);\n\n if (isPaused) inst.play?.();\n else inst.pause?.();\n }\n\n function toggleActiveVideoPlay() {\n const active = selectedIndex.current;\n const api = plyrRefsByIdx.current[active];\n if (!api) return;\n togglePlyr(api);\n }\n\n function isPlyrControlsEl(el: HTMLElement | null) {\n return !!el?.closest?.(\n [\n '.plyr__controls',\n '.plyr__control--overlaid',\n '.plyr__menu__container',\n '.plyr__tooltip',\n '.plyr__captions',\n ].join(',')\n );\n }\n\n function getClientXY(evt: any) {\n const t = evt.changedTouches?.[0] ?? evt.touches?.[0];\n if (t) return { x: t.clientX, y: t.clientY };\n return { x: evt.clientX, y: evt.clientY };\n }\n\n function clickedVideoSurface(evt: any): boolean {\n const { x, y } = getClientXY(evt);\n\n const under = document.elementFromPoint(x, y) as HTMLElement | null;\n if (!under) return false;\n\n const slide = under.closest('[data-rmg-slide=\"true\"]') as HTMLElement | null;\n if (!slide) return false;\n\n const host = slide.querySelector('[data-rmg-plyr=\"true\"]') as HTMLElement | null;\n if (!host) return false;\n\n const r = host.getBoundingClientRect();\n const inside =\n x >= r.left && x <= r.right &&\n y >= r.top && y <= r.bottom;\n\n if (!inside) return false;\n\n if (under.closest('.plyr__controls')) return false;\n\n return true;\n }\n\n function computeCloneSig(originals: number, per: number, useCols: boolean, cellSize?: number) {\n return `${originals}|per=${per}|cols=${useCols ? cellsPerSlide : 0}|cell=${cellSize ?? 0}|wrap=${wrap ? 1 : 0}`;\n }\n\n useEffect(() => {\n const el = slider.current;\n if (!el) return;\n\n const ro = new ResizeObserver(() => {\n const rawKids = Children\n .toArray(children)\n .filter(isValidElement) as ReactElement<any>[];\n\n const originals = rawKids.length;\n if (originals < 1) {\n clonesCountRef.current = 0;\n cells.current = [];\n setClonedChildren([]);\n sliderWidth.current = 0;\n layoutRef.current = null;\n\n setWrapSafe(false);\n slides.current = [];\n setSlidesState([]);\n cellToSlideRef.current = [];\n\n return;\n }\n\n const allEls = Array.from(el.children) as HTMLElement[];\n const clonesBefore = clonesCountRef.current;\n const clonesAfter = clonesBefore;\n const originalEls = allEls.slice(clonesBefore, allEls.length - clonesAfter);\n\n const cw = (el as any)[AX.clientKey] as number;\n\n const useCols =\n typeof cellsPerSlide === 'number' && cellsPerSlide > 0;\n\n let cols = 1;\n let cellSize: number | undefined;\n\n if (useCols) {\n cols = Math.max(1, Math.min(originals, cellsPerSlide as number));\n const totalGap = gap * Math.max(0, cols - 1);\n cellSize = (cw - totalGap) / cols;\n }\n\n let sum = 0;\n let count = 0;\n for (const slot of originalEls) {\n const w = slot.getBoundingClientRect()[AX.sizeKey];\n if (w === 0) {\n requestAnimationFrame(() => ro.observe(el));\n return;\n }\n if (sum + w <= cw) {\n sum += w;\n count++;\n } else {\n count++;\n break;\n }\n }\n\n const per = useCols\n ? Math.max(1, Math.min(originals, cols))\n : Math.max(2, Math.min(originals, count));\n\n const shouldLoop = wrap;\n clonesCountRef.current = shouldLoop ? per : 0;\n if (visibleImagesRef.current !== per) {\n setVisibleImages(per);\n visibleImagesRef.current = per;\n }\n\n const sig = computeCloneSig(originals, per, useCols, cellSize);\n if (sig === lastCloneSigRef.current) return;\n lastCloneSigRef.current = sig;\n\n const enableParallax = !!parallax;\n const slidesArr: ReactElement<any>[] = [];\n cells.current = [];\n\n const extraStyle: React.CSSProperties | undefined =\n useCols && cellSize != null\n ? {\n flex: '0 0 auto',\n [AX.sizeKey]: `${cellSize}px`,\n } as any\n : undefined;\n\n if (shouldLoop) {\n slidesArr.push(\n ...rawKids\n .slice(-per)\n .map((c, i) =>\n cloneSlide(\n c,\n `before-${i}`,\n -per + i,\n cells,\n enableParallax,\n imageCount,\n lazyLoad,\n extraStyle,\n enableFullscreen,\n true,\n plyrRefsByIdx\n )\n )\n );\n }\n\n slidesArr.push(\n ...rawKids.map((c, i) =>\n cloneSlide(\n c,\n `original-${i}`,\n i,\n cells,\n enableParallax,\n imageCount,\n lazyLoad,\n extraStyle,\n enableFullscreen,\n false,\n plyrRefsByIdx\n )\n )\n );\n\n if (shouldLoop) {\n slidesArr.push(\n ...rawKids\n .slice(0, per)\n .map((c, i) =>\n cloneSlide(\n c,\n `after-${i}`,\n originals + i,\n cells,\n enableParallax,\n imageCount,\n lazyLoad,\n extraStyle,\n enableFullscreen,\n true,\n plyrRefsByIdx\n )\n )\n );\n }\n\n setClonedChildren(slidesArr);\n });\n\n ro.observe(el);\n return () => ro.disconnect();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n imageCount,\n slider,\n visibleImagesRef,\n cellsPerSlide,\n buildKey,\n wrap,\n ]);\n\n useEffect(() => {\n const track = slider.current;\n if (!track) return;\n\n const schedule = () => {\n measureAndPosition()\n };\n\n function measureAndPosition() {\n const trackEl = slider.current;\n if (!trackEl) return;\n\n const slideEls = Array.from(trackEl.children) as HTMLElement[];\n if (slideEls.length === 0) return;\n\n const sizes = slideEls.map((sl) => sl.getBoundingClientRect()[AX.sizeKey]);\n if (sizes.some((s) => s === 0)) {\n setTimeout(measureAndPosition, 0);\n return;\n }\n\n const contentSize =\n AX.main === \"x\" ? trackEl.scrollWidth : trackEl.scrollHeight;\n\n const clonesBefore = clonesCountRef.current;\n const beforeSizes = sizes.slice(0, clonesBefore);\n let running = -(beforeSizes.reduce((s, w) => s + w, 0) + gap * clonesBefore);\n slideEls.forEach((sl, i) => {\n sl.style.transformOrigin = 'center';\n sl.style.transform = AX.place(running * sign);\n running += sizes[i] + gap;\n });\n\n const origSizes = sizes.slice(clonesBefore, sizes.length - clonesBefore);\n let m0 = 0;\n const originalsForLayout = slideEls\n .slice(clonesBefore, slideEls.length - clonesBefore)\n .map((sl, i) => {\n const s = origSizes[i];\n const start = m0;\n const end = m0 + s;\n m0 += s + gap;\n return { el: sl, start, end, size: s };\n });\n\n layoutRef.current = {\n originals: originalsForLayout,\n cw: (trackEl as any)[AX.clientKey] as number,\n };\n\n const originalsCount = layoutRef.current?.originals?.length ?? 0;\n const innerGaps = Math.max(0, originalsCount - 1);\n const baseWidth = origSizes.reduce((sum, s) => sum + s, 0) + gap * innerGaps;\n sliderWidth.current = wrap ? baseWidth + (originalsCount > 0 ? gap : 0) : baseWidth;\n\n const cw = (trackEl as any)[AX.clientKey] as number;\n\n const wantLoop = !!loop && originalsCount > 1 && contentSize > cw;\n\n const origSizesCsv = originalsForLayout.map((o) => o.size).join(\",\");\n const sig = `${origSizesCsv}|gap=${gap}|cw=${cw}|W=${contentSize}`;\n\n if (sig !== lastGeomSigRef.current) {\n lastGeomSigRef.current = sig;\n setGeomKey((k) => k + 1)\n }\n\n setWrapSafe(wantLoop);\n setIsMeasured(true);\n }\n\n const ro = new ResizeObserver(schedule);\n\n ro.observe(track);\n\n if (sliderContainer.current) {\n ro.observe(sliderContainer.current);\n }\n\n const vv = typeof window !== \"undefined\" ? window.visualViewport : null;\n vv?.addEventListener(\"resize\", schedule);\n\n window.addEventListener(\"resize\", schedule, { passive: true });\n\n schedule();\n\n return () => {\n ro.disconnect();\n vv?.removeEventListener(\"resize\", schedule);\n window.removeEventListener(\"resize\", schedule);\n };\n }, [imageCount, clonedChildren, visibleImages, cellsPerSlide, gap, wrap, loop, AX, sign]);\n\n useEffect(() => {\n if (isReady) return;\n\n const imagesOk = lazyLoad ? true : sliderImagesReady;\n if (!engineReady || !imagesOk) return;\n\n setIsReady(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [lazyLoad, sliderImagesReady, engineReady, isReady]);\n\n useLayoutEffect(() => {\n if (\n !slider.current ||\n cells.current.length === 0 ||\n sliderWidth.current === 0 ||\n !slides.current ||\n !slides.current[0] ||\n !slides.current[0].cells[0]?.element\n ) return;\n\n const containerSize = (slider.current as any)[AX.clientKey] as number;\n\n if (!wrap && sliderWidth.current <= containerSize) {\n sliderX.current = (containerSize - sliderWidth.current) / 2;\n translateRef.current?.to(Math.round(sliderX.current));\n }\n\n updateControlsImperatively();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [slidesState, wrap]);\n\n useEffect(() => {\n const containerEl = slider.current\n if (!containerEl) return\n\n let canceled = false\n\n let retryTimer: number | null = null\n let tries = 0\n const MAX_TRIES = 5\n\n function retry() {\n if (canceled) return\n if (tries++ >= MAX_TRIES) return\n if (retryTimer != null) window.clearTimeout(retryTimer)\n retryTimer = window.setTimeout(() => {\n buildPages()\n }, 0)\n }\n\n const rawKids = Children.toArray(children).filter(isValidElement)\n const childCount = rawKids.length\n const clonesBefore = wrap ? visibleImages : 0\n const clonesAfter = clonesBefore\n const cw = (containerEl as any)[AX.clientKey] as number\n\n function buildPages() {\n if (canceled || !containerEl) return\n\n const allEls = Array.from(containerEl.children) as HTMLElement[]\n const originals = allEls.slice(clonesBefore, allEls.length - clonesAfter)\n const idxMap = new Map<HTMLElement, number>(originals.map((el, i) => [el, i]))\n\n const start0 = containerEl.getBoundingClientRect()[AX.startKey]\n const data = originals.map((el) => {\n const r = el.getBoundingClientRect()\n return {\n el,\n start: r[AX.startKey] - start0,\n end: r[AX.endKey] - start0,\n }\n })\n\n const pages: { els: HTMLElement[]; target: number }[] = []\n let i = 0\n\n if (groupCells) {\n while (i < childCount) {\n const startLeft = data[i]?.start ?? 0\n const viewRight = startLeft + cw\n\n let j = i\n while (j < childCount && (data[j]?.end ?? 0) <= viewRight) j++\n if (j === i) j++\n\n const slice = originals.slice(i, j)\n const isLast = j >= childCount\n\n let target = startLeft\n if (isLast && !wrap) {\n target = Math.max(0, (sliderWidth.current || 0) - cw)\n }\n if (i === 0) target = 0\n\n pages.push({ els: slice, target })\n i = j\n }\n } else {\n const L = layoutRef.current\n if (!L || !L.originals?.length) {\n retry()\n return\n }\n\n const data = L.originals\n const cw = L.cw\n\n const maxTarget = Math.max(0, (sliderWidth.current || 0) - cw)\n const EPS = 0.5\n\n if (wrap) {\n data.forEach((d, idx) => {\n const t = idx === 0 ? 0 : d.start\n pages.push({ els: [d.el], target: t })\n })\n } else {\n for (let idx = 0; idx < data.length; idx++) {\n const d = data[idx]\n let t = idx === 0 ? 0 : d.start\n t = Math.min(t, maxTarget)\n\n if (!pages.length || Math.abs(t - pages[pages.length - 1].target) > EPS) {\n pages.push({ els: [d.el], target: t })\n }\n\n if (Math.abs(t - maxTarget) <= EPS) break\n }\n\n const winStart = maxTarget - EPS\n const winEnd = maxTarget + cw + EPS\n\n const lastEls = data\n .filter((d) => d.start < winEnd && d.end > winStart)\n .map((d) => d.el)\n\n if (lastEls.length) {\n const lastT = pages[pages.length - 1]?.target ?? -1\n if (Math.abs(lastT - maxTarget) > EPS) {\n pages.push({ els: lastEls, target: maxTarget })\n } else {\n const uniq = new Set(pages[pages.length - 1].els.concat(lastEls))\n pages[pages.length - 1].els = Array.from(uniq)\n }\n } else {\n let safeIdx = -1\n for (let i = data.length - 1; i >= 0; i--) {\n if (data[i].start <= maxTarget + EPS) {\n safeIdx = i\n break\n }\n }\n const fallback = data[Math.max(0, safeIdx)]\n if (fallback) {\n const lastT = pages[pages.length - 1]?.target ?? -1\n if (Math.abs(lastT - maxTarget) > EPS) {\n pages.push({ els: [fallback.el], target: maxTarget })\n }\n }\n }\n }\n }\n\n const newSlides = pages.map((page) => ({\n target: page.target,\n cells: page.els.map((el) => ({\n element: el,\n index: idxMap.get(el)!,\n })),\n }))\n\n const hasNaN = newSlides.some((s) => Number.isNaN(s.target))\n const unstable = hasNaN || (wrap && newSlides.length === 1)\n if (unstable) {\n retry()\n return\n }\n\n const pagesAllowLoop = newSlides.length > 1\n\n setWrap(!!loop && pagesAllowLoop && sliderWidth.current > cw)\n isWrapping.current = !!loop && pagesAllowLoop && sliderWidth.current > cw\n\n slides.current = newSlides\n setSlidesState(newSlides)\n\n setLayoutReady(true)\n\n const map: number[] = []\n newSlides.forEach((s, slideIdx) => {\n s.cells.forEach((c) => {\n map[c.index] = slideIdx\n })\n })\n cellToSlideRef.current = map\n\n window.setTimeout(() => {\n if (canceled) return\n const nodes = getOriginalNodes()\n if (nodes.length) {\n builtOnceRef.current = true\n slideBuildSubs.current.forEach((fn) => fn(nodes))\n }\n }, 0)\n }\n\n buildPages()\n\n return () => {\n canceled = true\n if (retryTimer != null) window.clearTimeout(retryTimer)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [imageCount, children, clonedChildren, visibleImages, cellsPerSlide, geomKey]);\n\n useEffect(() => {\n if (!lazyLoad) return;\n if (!layoutReady) return;\n const root = sliderContainer.current;\n const track = slider.current;\n if (!root || !track) return;\n\n const io = new IntersectionObserver(\n (entries) => {\n for (const ent of entries) {\n const slideEl = ent.target as HTMLElement;\n if (slideEl.getAttribute('data-rmg-lazyloaded') === 'true') {\n io.unobserve(slideEl);\n continue;\n }\n if (ent.isIntersecting && ent.intersectionRatio >= 0.6) {\n revealSlide(slideEl);\n io.unobserve(slideEl);\n }\n }\n },\n {\n root: root,\n rootMargin: '0px',\n threshold: [0, 0.25, 0.5, 0.6, 0.75, 1],\n }\n );\n\n const slidesToObserve = Array.from(track.children).filter((el) =>\n (el as HTMLElement).hasAttribute('data-rmg-lazyload')\n );\n slidesToObserve.forEach((el) => io.observe(el));\n\n return () => io.disconnect();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [lazyLoad, clonedChildren, wrap, AX.main]);\n\n useEffect(() => {\n if (!slider.current) return\n const childrenArray = Children.toArray(children)\n const imgOffset = !wrap ? 0 : visibleImages * 2\n if (clonedChildren.length !== Children.toArray(children).length + imgOffset) return\n if (!expandableImgRefs) return;\n\n expandableImgRefs.current = []\n expandableImgRefs.current = Array(childrenArray.length + imgOffset)\n .fill(null)\n .map(() => createRef<HTMLImageElement>())\n\n const images = slider.current.querySelectorAll('img')\n images.forEach((img, index) => {\n if (expandableImgRefs.current[index]) {\n ;(expandableImgRefs.current[index] as any).current = img\n }\n })\n return () => {\n expandableImgRefs.current = []\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [children, clonedChildren, visibleImages, wrap]);\n\n useLayoutEffect(() => {\n if (hasResponsiveHeights) return;\n\n if (sliderHeight) return;\n\n if (typeof initialHeight === 'number' && initialHeight > 0) return;\n\n if (typeof initialHeight === 'string' && initialHeight.trim() !== '') return;\n\n if (typeof cellsPerSlide !== 'number' || cellsPerSlide <= 0) return;\n\n if (axis !== 'x') return;\n\n const root = sliderContainer.current;\n if (!root) return;\n\n const updateFromWidth = () => {\n if (!sliderContainer.current) return;\n const cw = sliderContainer.current.getBoundingClientRect().width;\n if (!cw || cw <= 0) return;\n\n const cols = Math.max(1, cellsPerSlide);\n const totalGap = gap * Math.max(0, cols - 1);\n const cellSize = (cw - totalGap) / cols;\n\n if (cellSize <= 0) return;\n\n if (Math.abs(cellSize - lastNonZeroHeightRef.current) >= 1) {\n lastNonZeroHeightRef.current = cellSize;\n setResponsiveSliderHeight(cellSize + 'px');\n }\n };\n\n updateFromWidth();\n\n const ro = new ResizeObserver(() => {\n updateFromWidth();\n });\n\n ro.observe(root);\n\n return () => {\n ro.disconnect();\n };\n }, [\n sliderHeight,\n initialHeight,\n cellsPerSlide,\n axis,\n gap,\n sliderContainer,\n hasResponsiveHeights\n ]);\n\n useEffect(() => {\n if (inView) return;\n if (!sliderContainer.current || !layoutReady || !engineReady || !isReady || !isMeasured) return;\n\n const el = sliderContainer.current;\n\n const io = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setInView(true);\n io.disconnect();\n }\n },\n { threshold: 0.2 }\n );\n\n io.observe(el);\n return () => io.disconnect();\n }, [layoutReady, engineReady, isReady, isMeasured, inView]);\n\n function scrollToIndex(\n requested: number,\n opts: { jump?: boolean; direction?: number } = {}\n ) {\n const { jump = false, direction } = opts\n const indexCurrent = indexCurrentRef.current\n if (!scrollToRef.current || !bodyRef.current || !indexCurrent) return\n\n const targetIndex = indexCurrent.clone().set(requested).get()\n\n if (jump) {\n bodyRef.current.useDuration(0)\n } else {\n bodyRef.current.useBaseDuration().useBaseFriction()\n }\n\n const dir = typeof direction === 'number' ? direction : 0\n\n scrollToRef.current.index(targetIndex, dir)\n }\n\n function previous() {\n const scrollTo = scrollToRef.current\n const body = bodyRef.current\n const indexCur = indexCurrentRef.current\n const len = slides.current?.length ?? 0\n if (!scrollTo || !body || !indexCur || !len) return\n\n const cur = indexCur.get()\n const target = wrap\n ? ((cur - 1) % len + len) % len\n : clampIndex(cur - 1, len)\n\n body.useBaseDuration().useBaseFriction()\n scrollToIndex(target, { direction: 1 })\n }\n\n function next() {\n const scrollTo = scrollToRef.current\n const body = bodyRef.current\n const indexCur = indexCurrentRef.current\n const len = slides.current?.length ?? 0\n if (!scrollTo || !body || !indexCur || !len) return\n\n const cur = indexCur.get()\n const target = wrap\n ? ((cur + 1) % len + len) % len\n : clampIndex(cur + 1, len)\n\n body.useBaseDuration().useBaseFriction()\n scrollToIndex(target, { direction: -1 })\n }\n\n function indexFromX(loc: number) {\n const x = -loc\n const targets = getSnapTargets()\n const W = totalWidth()\n if (!targets.length) return 0\n let best = 0\n let min = Infinity\n for (let i = 0; i < targets.length; i++) {\n const base = targets[i]\n const candidates = !W || !wrap ? [base] : [base, base + W, base - W]\n for (const c of candidates) {\n const d = Math.abs(c - x)\n if (d < min) {\n min = d\n best = i\n }\n }\n }\n return best\n }\n\n function positionSlider(loc?: number) {\n const x = loc ?? xRef.current\n translateRef.current?.to(x * sign)\n }\n\n function updateActiveIndexFromX(loc: number) {\n const indexCurrent = indexCurrentRef.current\n if (!indexCurrent) return\n\n const idxFromLoc = indexFromX(loc)\n const canonical = indexCurrent.get()\n updateControlsImperatively()\n\n if (idxFromLoc === canonical) return\n\n if (!pointerDownRef.current && isAnimatingRef.current) {\n return\n }\n\n indexCurrent.set(idxFromLoc)\n selectedIndex.current = idxFromLoc\n indexChannel.set(idxFromLoc, 'animated')\n }\n\n function goToIndex(idx: number, opts: { preserveTiming?: boolean } = {}) {\n const { preserveTiming = false } = opts\n if (!bodyRef.current || !targetRef.current) return\n if (!preserveTiming) bodyRef.current.useBaseDuration().useBaseFriction()\n scrollToIndex(idx)\n }\n\n useEffect(() => {\n const ch: any = indexChannel;\n const len = () => slides.current?.length ?? 0;\n\n const handle = (ev: any) => {\n const L = len(); if (!L) return;\n const cur = selectedIndex.current;\n const signed = (n: number) => (isRtl ? -n : n);\n\n if (ev.type === 'set') {\n const nextC = wrap ? ((ev.index % L) + L) % L : clampIndex(ev.index, L);\n if (nextC === cur) return;\n scrollToIndex(nextC, ev.mode);\n return;\n }\n\n if (ev.type === 'bump') {\n const delta = signed(ev.delta | 0);\n if (!delta) return;\n if (!wrap) {\n const bounded = clampIndex(cur + delta, L);\n if (bounded === cur) return;\n scrollToIndex(bounded, ev.mode);\n } else {\n const targetC = ((cur + delta) % L + L) % L;\n scrollToIndex(targetC, ev.mode);\n }\n return;\n }\n\n if (typeof ev.index === 'number') {\n const nextC = wrap ? ((ev.index % L) + L) % L : clampIndex(ev.index, L);\n if (nextC !== cur) scrollToIndex(nextC, ev.mode || 'animated');\n }\n };\n\n if (typeof ch.onEvent === 'function') {\n return ch.onEvent(handle);\n } else {\n return ch.subscribe(() => {\n const { index, mode } = ch.get();\n handle({ type: 'set', index, mode });\n });\n }\n }, [indexChannel, wrap, isRtl]);\n\n function isYouTubeVideoEvent(evt: Event): boolean {\n const target = evt.target as HTMLElement | null;\n if (!target) return false;\n\n const plyrRoot = target.closest('[data-rmg-plyr=\"true\"]') as HTMLElement | null;\n if (!plyrRoot) return false;\n\n return plyrRoot.getAttribute('data-rmg-plyr-provider') === 'youtube';\n }\n\n useEffect(() => {\n const root = sliderContainer.current\n const track = slider.current\n if (\n !root ||\n !track ||\n !slides.current?.length ||\n !layoutReady ||\n !isMeasured ||\n sliderWidth.current === 0\n ) {\n return;\n }\n\n const startIdx = selectedIndex.current || 0;\n\n const location = Vector1D(0);\n const previousLocation = Vector1D(0);\n const offsetLocation = Vector1D(0);\n const target = Vector1D(0);\n\n locationRef.current = location;\n previousLocationRef.current = previousLocation;\n offsetLocationRef.current = offsetLocation;\n targetRef.current = target;\n\n const W = sliderWidth.current || 0\n\n const len = slides.current.length || 1\n const counterMax = len - 1\n const startIndex = selectedIndex.current || 0\n\n const indexCurrent = Counter(counterMax, startIndex, true)\n const indexPrevious = Counter(counterMax, startIndex, true)\n\n indexCurrentRef.current = indexCurrent\n indexPreviousRef.current = indexPrevious\n\n contentSizeRef.current = W\n scrollContentSizeRef.current = W\n\n const scrollSnaps = slides.current.map((slide, i) => {\n const centerOffset = getCenterOffsetForIndex(i)\n return -(slide.target) + centerOffset\n })\n scrollSnapsRef.current = scrollSnaps\n\n const initialSnap = scrollSnaps[startIdx] ?? 0;\n\n location.set(initialSnap);\n previousLocation.set(initialSnap);\n offsetLocation.set(initialSnap);\n target.set(initialSnap);\n xRef.current = initialSnap;\n\n translateRef.current = Translate(track, AX);\n translateRef.current.to(initialSnap * sign);\n\n selectedIndex.current = startIdx;\n indexChannel.set(startIdx, 'instant');\n\n const minSnap = Math.min(...scrollSnaps)\n const maxSnap = Math.max(...scrollSnaps)\n\n loopLimitRef.current = wrap ? Limit(-W, 0) : Limit(minSnap, maxSnap)\n\n const baseLimit = wrap ? createBaseLimit(-W, 0) : createBaseLimit(minSnap, maxSnap)\n scrollLimitRef.current = baseLimit\n\n if (loopLimitRef.current) {\n scrollTargetRef.current = ScrollTarget(\n wrap,\n scrollSnaps,\n W,\n loopLimitRef.current,\n target\n )\n }\n\n function scrollTo(target: BaseTarget): void {\n const indexCurrent = indexCurrentRef.current\n const indexPrevious = indexPreviousRef.current\n if (!indexCurrent || !indexPrevious) return\n\n const distanceDiff = target.distance\n const indexDiff = target.index !== indexCurrent.get()\n\n targetRef.current!.add(distanceDiff)\n\n if (distanceDiff) {\n if (bodyRef.current!.duration()) {\n isAnimatingRef.current = true;\n animRef.current!.start()\n } else {\n bodyRef.current!.seek()\n positionSlider()\n }\n }\n\n if (indexDiff) {\n indexPrevious.set(indexCurrent.get())\n indexCurrent.set(target.index)\n\n const idx = indexCurrent.get()\n selectedIndex.current = idx\n\n const mode = bodyRef.current?.duration() ? 'animated' : 'instant'\n indexChannel.set(idx, mode)\n }\n }\n\n const baseScrollTo: BaseScrollTo = {\n distance(n, snap) {\n const st = scrollTargetRef.current\n if (!st) return\n const target = st.byDistance(n, snap)\n scrollTo(target)\n },\n index(n, direction) {\n const st = scrollTargetRef.current\n const indexCurrent = indexCurrentRef.current\n if (!st || !indexCurrent) return\n\n const targetIndex = indexCurrent.clone().set(n)\n const target = st.byIndex(targetIndex.get(), direction)\n\n scrollTo(target)\n },\n }\n\n scrollToRef.current = baseScrollTo\n\n const loLimit = Limit(-W, 0)\n const looper = wrap && W > 0\n ? ScrollLooper(\n W,\n loLimit,\n locationRef.current!,\n [locationRef.current!, previousLocationRef.current!, offsetLocationRef.current!, targetRef.current!]\n )\n : null\n\n const body = ScrollBody(location, offsetLocation, previousLocation, target, selectDuration, sliderFriction)\n bodyRef.current = body\n\n if (!wrap) {\n const cw = (track as any)[AX.clientKey] as number;\n const min = -(Math.max(0, sliderWidth.current - cw))\n const max = 0\n limitRef.current = Limit(isNaN(min) ? 0 : min, max)\n\n povRef.current = PercentOfView(cw)\n boundsRef.current = ScrollBounds(\n limitRef.current,\n offsetLocationRef.current!,\n targetRef.current!,\n bodyRef.current!,\n povRef.current,\n selectDuration\n )\n } else {\n limitRef.current = null\n boundsRef.current = null\n povRef.current = null\n }\n\n const anim = Animations(\n document,\n window as WindowType,\n () => {\n if (!wrap) {\n boundsRef.current?.constrain(pointerDownRef.current)\n }\n\n bodyRef.current?.seek()\n\n if (wrap && W > 0) {\n const body = bodyRef.current!\n const dir = body.direction() || Math.sign(targetRef.current!.get() - locationRef.current!.get()) || 0\n looper?.loop(dir)\n }\n\n xRef.current = locationRef.current!.get()\n },\n (alpha) => {\n const body = bodyRef.current\n const shouldSettle = body ? body.settled() : true\n const idle = shouldSettle && !pointerDownRef.current\n if (idle) {\n animRef.current?.stop()\n isAnimatingRef.current = false\n }\n const cur = locationRef.current!.get()\n const prev = previousLocationRef.current!.get()\n const loc = cur * alpha + prev * (1 - alpha)\n offsetLocationRef.current!.set(loc)\n xRef.current = loc\n positionSlider()\n applyPairScaleTween()\n applyFadeTween();\n progressApi.updateProgressInFrame();\n tweenParallax();\n updateActiveIndexFromX(loc)\n }\n )\n animRef.current = anim\n anim.init()\n\n const dragStore = EventStore()\n const moveStore = EventStore()\n const tracker = DragTracker(AX.main, window as WindowType);\n\n let isMouse = false\n let startMain = 0\n let startCross = 0\n let preventScroll = false\n const freeBoost = { mouse: 500, touch: 600 }\n\n function addDragEvents() {\n const node: any = isMouse ? document : root\n moveStore\n .add(node, 'touchmove', onMove as any)\n .add(node, 'touchend', onUp as any)\n .add(node, 'mousemove', onMove as any, { passive: false })\n .add(node, 'mouseup', onUp as any)\n }\n\n function forceBoost(rawForce: number) {\n const type = isMouse ? 'mouse' : 'touch'\n return rawForce * (freeBoost[type as 'mouse' | 'touch'])\n }\n\n function onDown(evt: PointerEvent) {\n const targetEl = evt.target as HTMLElement;\n if (isPlyrControlsEl(targetEl)) return;\n const hit = (evt.target as Node)\n\n if (prevButtonRef.current?.contains(hit)) return\n if (nextButtonRef.current?.contains(hit)) return\n const dotIndex = dotRefs.current.findIndex((dot) => dot?.contains(hit))\n if (dotIndex >= 0) return\n if (dotsContainerRef.current?.contains(hit)) return\n\n const isMouseEvt = isMouseEvent(evt as any, window as any)\n isMouse = isMouseEvt\n if (isMouseEvt && (evt as MouseEvent).button !== 0) return\n\n setDragCursor(true);\n\n pointerDownRef.current = true\n isPointerDown.current = true\n isScrolling.current = false\n isClick.current = true\n\n tracker.pointerDown(evt as any)\n startMain = tracker.readPoint(evt as any, AX.main)\n startCross = tracker.readPoint(evt as any, AX.cross)\n\n bodyRef.current!.useFriction(0).useDuration(0)\n targetRef.current!.set(locationRef.current!.get())\n\n addDragEvents()\n animRef.current?.start()\n }\n\n function onMove(evt: PointerEvent) {\n const isTouchEvt = !isMouseEvent(evt as any, window as any)\n if (isTouchEvt && (evt as any).touches?.length >= 2) return onUp(evt)\n\n if (pointerDownRef.current && activePointerIdRef.current != null) setDragCursor(true);\n\n const lastMain = tracker.readPoint(evt as any, AX.main)\n const lastCross = tracker.readPoint(evt as any, AX.cross)\n const diffMain = Math.abs(lastMain - startMain)\n const diffCross = Math.abs(lastCross - startCross)\n\n if (diffMain > 5 || diffCross > 5) isClick.current = false\n\n if (!preventScroll && !isMouse) {\n if (!('cancelable' in evt) || !(evt as any).cancelable) return onUp(evt)\n preventScroll = diffMain > diffCross\n if (!preventScroll) return onUp(evt)\n }\n\n const { dx, dy } = tracker.pointerMove(evt as any)\n const deltaMain = (AX.main === 'x' ? dx : dy) * sign\n\n previousDragX.current = dragX.current;\n dragX.current = lastMain * sign\n\n sliderVelocity.current = deltaMain;\n dragMoveTime.current = new Date();\n\n bodyRef.current!.useFriction(0.3).useDuration(0.75);\n targetRef.current!.add(deltaMain);\n\n animRef.current?.start()\n if ((evt as any).cancelable) evt.preventDefault?.()\n }\n\n function onUp(evt: PointerEvent) {\n isPointerDown.current = false\n preventScroll = false\n pointerDownRef.current = false\n moveStore.clear()\n\n setDragCursor(false);\n\n if (isClick.current && enableFullscreen) {\n const target = evt.target as HTMLElement\n const img = target.closest('img') as HTMLImageElement | null\n if (img) {\n if (!expandableImgRefs) return;\n const index = expandableImgRefs.current.findIndex((ref) => ref.current === img)\n if (index >= 0) handleImageClick(evt as any, index)\n scrollToIndex(selectedIndex.current)\n return\n }\n if (clickedVideoSurface(evt) && !isYouTubeVideoEvent(evt)) {\n evt.preventDefault?.();\n (evt as any).stopPropagation?.();\n\n toggleActiveVideoPlay();\n scrollToIndex(selectedIndex.current)\n return;\n }\n }\n\n autoScrollPauseUntil.current = performance.now() + autoScrollPause;\n\n if (freeScroll === false) {\n const end = tracker.pointerUp(evt as any)\n let rawForce = (AX.main === 'x' ? end.fx : end.fy)\n\n if (isRtl) rawForce = -rawForce\n\n const isMouseEvt = isMouseEvent(evt as any, window as any)\n const snapForceBoost = { mouse: 300, touch: 400 }\n const boost = snapForceBoost[isMouseEvt ? 'mouse' : 'touch']\n\n const boostedForce = rawForce * boost\n\n const baseScrollTarget = scrollTargetRef.current\n const baseScrollTo = scrollToRef.current\n const body = bodyRef.current\n\n if (!baseScrollTarget || !baseScrollTo || !body) {\n return\n }\n\n function allowedForce(force: number): number {\n const len = slides.current.length || 1\n if (!len || !baseScrollTarget) return 0\n\n const curIndex = selectedIndex.current || 0\n const dir = mathSign(force)\n\n if (dir === 0) return 0\n\n if (!skipSnaps) {\n const dirIndex = dir * -1\n let nextIndex = curIndex + dirIndex\n\n if (!wrap) {\n if (nextIndex < 0 || nextIndex > len - 1) {\n nextIndex = curIndex\n }\n } else {\n nextIndex = ((nextIndex % len) + len) % len\n }\n\n const dirBump = slides.current.length === 2 ? dir : 0;\n const nextTarget = baseScrollTarget.byIndex(nextIndex, dirBump)\n return nextTarget.distance\n }\n\n const baseTarget = baseScrollTarget.byDistance(force, true)\n let { index: proposedIndex } = baseTarget\n const { distance } = baseTarget\n\n const currentIndex = curIndex\n\n if (proposedIndex !== currentIndex) {\n if (!wrap) {\n proposedIndex = Math.max(0, Math.min(len - 1, proposedIndex))\n const clamped = baseScrollTarget.byIndex(proposedIndex, dir)\n return clamped.distance\n }\n return distance\n }\n\n const dirIndex = dir * -1\n let nextIndex = currentIndex + dirIndex\n\n if (wrap) {\n nextIndex = ((nextIndex % len) + len) % len\n } else {\n nextIndex = Math.max(0, Math.min(len - 1, nextIndex))\n if (nextIndex === currentIndex) {\n return 0\n }\n }\n\n const dirBump = slides.current.length === 2 ? dir : 0;\n\n const forced = baseScrollTarget.byIndex(nextIndex, dirBump)\n return forced.distance\n }\n \n const force = allowedForce(boostedForce)\n\n const baseSpeed = selectDuration\n const baseFriction = sliderFriction\n const forceFactor = factorAbs(boostedForce, force)\n const speed = baseSpeed - 10 * forceFactor\n const friction = baseFriction + forceFactor / 50\n\n body.useDuration(speed).useFriction(friction)\n\n baseScrollTo.distance(force, true)\n } else {\n const end = tracker.pointerUp(evt as any)\n const raw = (AX.main === 'x' ? end.fx : end.fy)\n const boosted = forceBoost(raw)\n const force = boosted\n const factor = Math.min(1, Math.abs(raw) > 0 ? Math.abs((Math.abs(boosted) - Math.abs(force)) / (raw || 1)) : 0)\n const speed = freeScrollDuration - 10 * factor\n const friction = sliderFriction + factor / 50\n bodyRef.current!.useDuration(speed).useFriction(friction)\n\n targetRef.current!.add(force)\n\n anim.start()\n isMouse = false\n }\n }\n\n dragStore\n .add(root, 'dragstart', (evt) => (evt as Event).preventDefault(), { passive: false })\n .add(root, 'touchstart', onDown as any)\n .add(root, 'mousedown', onDown as any, { passive: true })\n .add(root, 'touchcancel', onUp as any)\n .add(root, 'contextmenu', onUp as any)\n\n function onWheel(e: WheelEvent) {\n const trackEl = slider.current;\n if (!trackEl) return;\n\n const containerSize = (trackEl as any)[AX.clientKey] as number;\n const contentSize = sliderWidth.current;\n const canScrollMain = contentSize > containerSize;\n\n const isMain = AX.main === 'x'\n ? Math.abs(e.deltaX) > Math.abs(e.deltaY)\n : Math.abs(e.deltaY) >= Math.abs(e.deltaX);\n\n if (!isMain || !canScrollMain) return;\n\n autoScrollPauseUntil.current = performance.now() + 100;\n\n const cur = (offsetLocationRef.current?.get() ?? 0) - (AX.wheelDelta(e) * sign);\n let next = cur;\n if (!wrap && limitRef.current) next = limitRef.current.constrain(cur);\n\n targetRef.current?.set(next);\n bodyRef.current?.useDuration(0).useFriction(1);\n\n animRef.current?.start();\n xRef.current = next;\n positionSlider();\n if ((e as any).cancelable) e.preventDefault?.();\n }\n\n root.addEventListener('wheel', onWheel as any, { passive: false })\n\n requestAnimationFrame(() => {\n if (!slider.current || !slides.current?.length) return;\n setEngineReady(true);\n });\n\n hasPositioned.current = true;\n\n return () => {\n dragStore.clear()\n moveStore.clear()\n root.removeEventListener('wheel', onWheel as any)\n animRef.current?.destroy()\n animRef.current = null\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n slidesState.length,\n wrap,\n cellsPerSlide,\n geomKey,\n layoutReady,\n isMeasured,\n ]);\n\n const { tweenParallax } = useParallaxEffect({\n enabled: parallax,\n wrap,\n axisMain: AX.main,\n sliderRef: slider,\n sliderWidthRef: sliderWidth,\n offsetLocationRef,\n visibleImagesRef,\n slidesLen: slidesState.length,\n clonedLen: clonedChildren.length,\n isReady,\n });\n\n const { applyPairScaleTween } = useScaleEffect({\n enabled: scaleEffect,\n scaleAmount,\n wrap,\n sliderRef: slider,\n sliderWidthRef: sliderWidth,\n offsetLocationRef,\n slidesRef: slides,\n getCenterOffsetForIndex,\n slidesLen: slidesState.length,\n clonedLen: clonedChildren.length,\n });\n\n const { applyFadeTween } = useFadeEffect({\n enabled: fadeEffect,\n wrap,\n sliderRef: slider,\n sliderWidthRef: sliderWidth,\n offsetLocationRef,\n slidesRef: slides,\n getCenterOffsetForIndex,\n slidesLen: slidesState.length,\n clonedLen: clonedChildren.length,\n });\n\n const centerSlider = useCallback(() => {\n const track = slider.current\n if (!track) return\n const idx = selectedIndex.current || 0\n const x = -(slides.current?.[idx]?.target ?? 0) + getCenterOffsetForIndex(idx)\n locationRef.current?.set(x)\n previousLocationRef.current?.set(x)\n offsetLocationRef.current?.set(x)\n targetRef.current?.set(x)\n xRef.current = x\n positionSlider()\n progressApi.updateProgressInFrame()\n tweenParallax();\n applyFadeTween();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n function cellsInViewInternal(): number[] {\n const L = layoutRef.current;\n const track = slider.current;\n if (!L || !track) return [];\n\n const cellsMeta = L.originals;\n const cw = L.cw;\n if (!cellsMeta.length || cw <= 0) return [];\n\n const loc = -(offsetLocationRef.current?.get() ?? 0);\n\n if (!wrap) {\n const viewStart = loc;\n const viewEnd = loc + cw;\n const res: number[] = [];\n\n cellsMeta.forEach((m, i) => {\n const cellStart = m.start;\n const cellEnd = m.end;\n if (cellEnd > viewStart && cellStart < viewEnd) {\n res.push(i);\n }\n });\n\n return res;\n }\n\n const W = sliderWidth.current || 0;\n if (W <= 0) return [];\n\n const world = ((loc % W) + W) % W;\n\n const resSet = new Set<number>();\n\n const view1Start = world;\n const view1End = Math.min(world + cw, W);\n\n const checkSegment = (vStart: number, vEnd: number) => {\n cellsMeta.forEach((m, i) => {\n const cellStart = m.start;\n const cellEnd = m.end;\n if (cellEnd > vStart && cellStart < vEnd) {\n resSet.add(i);\n }\n });\n };\n\n checkSegment(view1Start, view1End);\n\n if (world + cw > W) {\n const spill = (world + cw) - W;\n const view2Start = 0;\n const view2End = spill;\n checkSegment(view2Start, view2End);\n }\n\n return Array.from(resSet);\n }\n\n useImperativeHandle(\n ref,\n () => {\n const getSafeIndex = () => indexChannel.get().index ?? 0;\n\n const slideCount = () => slides.current?.length ?? 0;\n\n function canScrollNextInternal(): boolean {\n const L = slideCount();\n if (L <= 1) return false;\n if (wrap) return true;\n\n const atFirst = getSafeIndex() <= 0;\n const atLast = getSafeIndex() >= Math.max(0, L - 1);\n\n return !(isRtl ? atFirst : atLast);\n }\n\n function canScrollPrevInternal(): boolean {\n const L = slideCount();\n if (L <= 1) return false;\n if (wrap) return true;\n\n const atFirst = getSafeIndex() <= 0;\n const atLast = getSafeIndex() >= Math.max(0, L - 1);\n\n return !(isRtl ? atLast : atFirst);\n }\n\n function scrollProgressInternal(): number {\n return lastProgressRef.current;\n }\n\n function getInternals() {\n return {\n slides: slides ?? [],\n slider: slider,\n\n visibleImages: visibleImagesRef,\n selectedIndex: selectedIndex,\n\n sliderX: sliderX,\n sliderVelocity: sliderVelocity,\n\n isWrapping: isWrapping,\n };\n }\n\n return {\n centerSlider: () => centerSlider(),\n\n getIndex: () => getSafeIndex(),\n\n setIndex: (i: number, mode: IndexMode = 'animated') => {\n scrollToIndex(i, { jump: mode === 'animated' ? false : true });\n },\n\n subscribeIndex: (fn: () => void) => indexChannel.subscribe(fn),\n\n slideIndexForCell: (cellIndex: number) => {\n const Lcells = imageCount;\n const Lslides = slideCount();\n if (!Lcells || !Lslides) return 0;\n\n const ci = ((cellIndex % Lcells) + Lcells) % Lcells;\n const s = cellToSlideRef.current[ci];\n return typeof s === 'number' ? s : Math.min(ci, Lslides - 1);\n },\n\n getRootNode: () => sliderContainer.current,\n getContainerNode: () => slider.current,\n\n getSlideNodes: () => {\n return getOriginalNodes();\n },\n\n onSlidesBuilt: (cb: (nodes: HTMLElement[]) => void) => {\n slideBuildSubs.current.add(cb);\n if (builtOnceRef.current) cb(getOriginalNodes());\n return () => slideBuildSubs.current.delete(cb);\n },\n\n whenSlidesBuilt: () => {\n if (builtOnceRef.current) {\n return Promise.resolve(getOriginalNodes());\n }\n return new Promise<HTMLElement[]>((resolve) => {\n const handler = (nodes: HTMLElement[]) => {\n slideBuildSubs.current.delete(handler);\n resolve(nodes);\n };\n slideBuildSubs.current.add(handler);\n });\n },\n\n isSlidesBuilt: () => builtOnceRef.current,\n\n scrollNext: () => {\n if (!canScrollNextInternal()) return;\n next();\n },\n\n scrollPrev: () => {\n if (!canScrollPrevInternal()) return;\n previous();\n },\n\n canScrollNext: () => canScrollNextInternal(),\n canScrollPrev: () => canScrollPrevInternal(),\n\n scrollProgress: () => scrollProgressInternal(),\n\n cellsInView: () => cellsInViewInternal(),\n\n getInternals,\n } as SliderHandle;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [centerSlider, indexChannel, wrap, imageCount, isRtl, showFullscreenSlider]\n );\n \n function updateControlsImperatively() {\n const count = slides.current?.length ?? 0;\n const idx = selectedIndex.current;\n const atFirst = !wrap && idx <= 0;\n const atLast = !wrap && idx >= Math.max(0, count - 1);\n\n const setArrow = (el: HTMLElement | null, disabled: boolean) => {\n if (!el) return;\n el.style.cursor = disabled ? 'default' : 'pointer',\n el.style.opacity = disabled ? '0.35' : '1';\n el.setAttribute('aria-disabled', disabled ? 'true' : 'false');\n };\n setArrow(prevButtonRef.current, (isRtl ? atLast : atFirst));\n setArrow(nextButtonRef.current, (isRtl ? atFirst : atLast));\n\n const L = dotRefs.current.length;\n for (let i = 0; i < L; i++) {\n const el = dotRefs.current[i];\n if (!el) continue;\n el.classList.toggle(styles.active, i === idx);\n el.classList.toggle(styles.inactive, i !== idx);\n }\n }\n\n useEffect(() => {\n const track = slider.current;\n if (!track) return;\n\n const ro = new ResizeObserver(() => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n const cw = (track as any)[AX.clientKey] as number\n const contentW = sliderWidth.current || 0;\n\n if (!isWrapping.current) {\n if (contentW <= cw) {\n const center = Math.round((cw - contentW) / 2);\n\n const newLimit = Limit(center, center);\n limitRef.current = newLimit;\n povRef.current = PercentOfView(cw);\n boundsRef.current = ScrollBounds(\n newLimit,\n offsetLocationRef.current!,\n targetRef.current!,\n bodyRef.current!,\n povRef.current!,\n selectDuration\n );\n\n locationRef.current?.set(center);\n previousLocationRef.current?.set(center);\n offsetLocationRef.current?.set(center);\n targetRef.current?.set(center);\n translateRef.current?.to(center);\n xRef.current = center;\n sliderX.current = center;\n } else {\n const min = -(contentW - cw);\n const max = 0;\n\n const newLimit = Limit(min, max);\n limitRef.current = newLimit;\n povRef.current = PercentOfView(cw);\n boundsRef.current = ScrollBounds(\n newLimit,\n offsetLocationRef.current!,\n targetRef.current!,\n bodyRef.current!,\n povRef.current!,\n selectDuration\n );\n\n const cur = offsetLocationRef.current?.get() ?? 0;\n const constrained = newLimit.constrain(cur);\n\n locationRef.current?.set(constrained);\n previousLocationRef.current?.set(constrained);\n offsetLocationRef.current?.set(constrained);\n targetRef.current?.set(constrained);\n translateRef.current?.to(constrained);\n xRef.current = constrained;\n sliderX.current = constrained;\n }\n } else {\n limitRef.current = null;\n povRef.current = null;\n boundsRef.current = null;\n\n const a = offsetLocationRef.current?.get() ?? xRef.current ?? 0;\n const W = sliderWidth.current || 0;\n if (W > 0) {\n const normalized = ((a % W) + W) % W - W;\n const delta = normalized - a;\n\n locationRef.current?.add(delta);\n previousLocationRef.current?.add(delta);\n offsetLocationRef.current?.add(delta);\n targetRef.current?.add(delta);\n xRef.current += delta;\n\n translateRef.current?.to(xRef.current);\n }\n }\n });\n });\n });\n\n ro.observe(track);\n return () => ro.disconnect();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [wrap]);\n\n useEffect(() => {\n const track = slider.current;\n if (!track || sliderHeight) return;\n\n const ro = new ResizeObserver(() => {\n centerSlider()\n });\n\n ro.observe(track);\n return () => ro.disconnect();\n }, [clonedChildren, visibleImages, wrap, cellsPerSlide, slider, sliderHeight, centerSlider, slidesState]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n shieldRef.current = createGestureShield(10000);\n }, []);\n\n const addShield = useCallback((timeoutMs?: number) => {\n shieldCleanupRef.current?.();\n const teardown = shieldRef.current?.add(timeoutMs);\n shieldCleanupRef.current = teardown ?? null;\n }, []);\n\n function handleImageClick(e: React.PointerEvent | MouseEvent, parsedImgIndex: number) {\n isClick.current = true\n const originalIndex = ((parsedImgIndex - visibleImagesRef.current) % imageCount + imageCount) % imageCount\n const fullscreenIndex = originalIndex + 1\n const finalIndex = !wrap ? parsedImgIndex : fullscreenIndex\n setShowFullscreenModal(true)\n if (!expandableImgRefs) return;\n runSlideFullscreenIntro(e as React.PointerEvent<HTMLDivElement>, expandableImgRefs.current[parsedImgIndex], finalIndex)\n setSlideIndex(finalIndex)\n }\n\n const fsForIntro = useMemo<FullscreenOptions>(() => {\n return {\n effects: {\n introDuration: fsIntroDuration,\n introEasing: fsIntroEasing,\n introFade: fullscreenIntroFade,\n },\n caption: {\n placement: fsCaptionPlacement,\n breakpoint: fsCaptionBreakpoint,\n width: fsCaptionWidth,\n height: fsCaptionHeight,\n render: renderFsCaption,\n },\n thumbnails: {\n layout: { position: fullscreenThumbnails } as any,\n } as any,\n controls: {\n close: {\n enabled: showFsClose !== false,\n render: renderFsClose ?? undefined,\n style: fullscreenControls?.close?.style as any,\n className: fullscreenControls?.close?.className,\n },\n counter: {\n enabled: showFsCounter !== false,\n render: renderFsCounter ?? undefined,\n style: fullscreenControls?.counter?.style as any,\n className: fullscreenControls?.counter?.className,\n },\n arrows: {\n enabled: showFsArrows !== false,\n render: renderFsArrows ?? undefined,\n renderPrev: renderFsPrev ?? undefined,\n renderNext: renderFsNext ?? undefined,\n arrow: fullscreenControls?.arrows?.arrow,\n prev: fullscreenControls?.arrows?.prev,\n next: fullscreenControls?.arrows?.next,\n },\n },\n };\n }, [\n fsIntroDuration,\n fsIntroEasing,\n fullscreenIntroFade,\n fsCaptionPlacement,\n fsCaptionBreakpoint,\n fsCaptionWidth,\n fsCaptionHeight,\n fullscreenThumbnails,\n showFsClose,\n showFsCounter,\n showFsArrows,\n fullscreenControls,\n renderFsCaption,\n renderFsClose,\n renderFsCounter,\n renderFsArrows,\n renderFsPrev,\n renderFsNext,\n ]);\n\n const runSlideFullscreenIntro = useMemo(() => {\n return createSliderFullscreenIntroRunner({\n normalizedItems,\n isRtl: direction === \"rtl\",\n styles,\n fs: fsForIntro,\n overlayDivRef,\n duplicateImgRef,\n overlayCaptionRef,\n overlayCaptionRootRef,\n closeButtonRef,\n leftChevronRef,\n rightChevronRef,\n counterRef,\n fsThumbContainerRef,\n setShowFullscreenSlider,\n setFsFadeOpening,\n addShield,\n resolveFsCaptionPlacement,\n closestSelector: \".rmg__slide\",\n });\n }, [\n normalizedItems,\n direction,\n styles,\n fsForIntro,\n overlayDivRef,\n duplicateImgRef,\n overlayCaptionRef,\n overlayCaptionRootRef,\n closeButtonRef,\n leftChevronRef,\n rightChevronRef,\n counterRef,\n fsThumbContainerRef,\n setShowFullscreenSlider,\n setFsFadeOpening,\n addShield,\n resolveFsCaptionPlacement,\n ]);\n\n function onTouchStart(e: TouchEvent) {\n const t0 = e.touches[0]\n ;(onTouchStart as any)._sx = t0.clientX\n ;(onTouchStart as any)._sy = t0.clientY\n }\n function onTouchMove(e: TouchEvent) {\n if (e.touches.length !== 1) return;\n const t0 = e.touches[0];\n const sx = (onTouchStart as any)._sx ?? t0.clientX;\n const sy = (onTouchStart as any)._sy ?? t0.clientY;\n const dx = t0.clientX - sx;\n const dy = t0.clientY - sy;\n\n const mainMag = AX.main === 'x' ? Math.abs(dx) : Math.abs(dy);\n const crossMag = AX.main === 'x' ? Math.abs(dy) : Math.abs(dx);\n\n if (mainMag > crossMag) e.preventDefault();\n }\n useEffect(() => {\n const el = sliderContainer.current!\n el.addEventListener('touchstart', onTouchStart, { passive: false })\n el.addEventListener('touchmove', onTouchMove, { passive: false })\n return () => {\n el.removeEventListener('touchstart', onTouchStart as any)\n el.removeEventListener('touchmove', onTouchMove as any)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const effectiveRippleEnabled = rippleEnabled !== false;\n const effectiveRippleClass = (rippleClassName && rippleClassName.trim().length > 0)\n ? rippleClassName\n : styles.ripple;\n\n const createRipple = useCallback((container: HTMLElement) => {\n if (!effectiveRippleEnabled || !container) return;\n\n const old = container.querySelector<HTMLElement>('[data-rmg-ripple]');\n if (old) old.remove();\n\n const rect = container.getBoundingClientRect();\n const diameter = Math.max(rect.width, rect.height);\n const radius = diameter / 2;\n const x = rect.width / 2 - radius;\n const y = rect.height / 2 - radius;\n\n const span = document.createElement('span');\n span.setAttribute('data-rmg-ripple', '');\n if (effectiveRippleClass) {\n span.className = effectiveRippleClass;\n }\n\n span.style.width = `${diameter}px`;\n span.style.height = `${diameter}px`;\n span.style.left = `${x}px`;\n span.style.top = `${y}px`;\n\n container.appendChild(span);\n span.addEventListener('animationend', () => span.remove(), { once: true });\n }, [effectiveRippleEnabled, effectiveRippleClass]);\n\n const arrowNodes = (\n <RmgArrows\n axisMain={AX.main}\n clientKey={AX.clientKey}\n wrap={wrap}\n isRtl={isRtl}\n showArrows={showArrows}\n selectedIndex={selectedIndex.current}\n slideCount={slides.current?.length ?? 0}\n measureRef={slider}\n viewportMainSizeRef={sliderWidth}\n previous={previous}\n next={next}\n prevButtonRef={prevButtonRef}\n nextButtonRef={nextButtonRef}\n createRipple={createRipple}\n arrowStyles={arrowStyles}\n prevArrowStyles={prevArrowStyles}\n nextArrowStyles={nextArrowStyles}\n arrowClassName={arrowClassName}\n prevArrowClassName={prevArrowClassName}\n nextArrowClassName={nextArrowClassName}\n renderPrevArrow={renderPrevArrow}\n renderNextArrow={renderNextArrow}\n renderArrows={renderArrows}\n />\n );\n\n const { dotsNode } = buildDotsNode({\n AX,\n slider,\n sliderWidth,\n wrap,\n showDots,\n selectedIndex,\n slides,\n dotsContainerRef,\n dotRefs,\n isScrolling,\n goToIndex,\n renderDots,\n createRipple,\n styles,\n dotsContainerStyles,\n dotsStyles,\n dotsContainerClassName,\n dotsClassName,\n });\n\n useEffect(() => {\n if (hasResponsiveHeights) return;\n \n const el = slider.current;\n if (!el) return;\n\n if (!isReady) return;\n\n const ro = new ResizeObserver(entries => {\n let max = 0;\n for (const ent of entries) {\n max = Math.max(max, ent.contentRect.height || 0);\n }\n\n if (max < 1) return;\n\n if (Math.abs(max - lastNonZeroHeightRef.current) >= 1) {\n lastNonZeroHeightRef.current = max;\n setResponsiveSliderHeight(max + 'px');\n }\n });\n\n Array.from(el.children).forEach(child => ro.observe(child as Element));\n\n return () => ro.disconnect();\n }, [clonedChildren, visibleImages, wrap, isReady, hasResponsiveHeights]);\n\n const normalizedLoading = useMemo(() => {\n const src = loadingOptions ?? {};\n return {\n isLoading: src.isLoading,\n skeletonCount: src.skeletonCount,\n renderLoading: src.renderLoading,\n };\n }, [loadingOptions]);\n\n const normalizedIntro = useMemo(() => {\n const src = introOptions ?? {};\n return {\n renderIntro: src.renderIntro,\n staggerMs: src.staggerMs ?? 40,\n transform: src.transform ?? 10,\n durationMs: src.durationMs ?? 300,\n easing: src.easing ?? 'cubic-bezier(.2,.7,.2,1)',\n };\n }, [introOptions]);\n\n const introChildren = useMemo(\n () =>\n clonedChildren.map((child, i) => {\n if (!isValidElement(child)) return child;\n\n const el = child as React.ReactElement<any>;\n const prevStyle = (el.props?.style || {}) as React.CSSProperties;\n\n return cloneElement<any>(el, {\n ...el.props,\n 'data-rmg-idx': i,\n style: {\n ...prevStyle,\n ['--rmg-intro-index' as any]: i,\n } as React.CSSProperties & Record<string, any>,\n });\n }),\n [clonedChildren]\n );\n\n const inner = (\n <>\n {arrowNodes}\n <div \n className={[\n styles.viewport,\n sliderViewportClassName ?? \"\",\n ].join(\" \")}\n style={{\n ...sliderViewportStyles,\n }}\n >\n <div\n ref={slider}\n className={`${styles.track} ${rtlCls}`}\n style={{ gap: `${gap}px`, [AX.sizeKey]: '100%' }}\n >\n {introChildren}\n </div>\n </div>\n {dotsNode}\n {progressNode}\n </>\n );\n\n const baseContainerProps: React.HTMLAttributes<HTMLDivElement> = {\n className: [\n styles.fade_container,\n rtlCls,\n (isReady && inView) ? styles.fadeInActive : styles.fadeInStart,\n ].join(' '),\n style: {\n position: 'relative',\n ...(heightVarValue != null ? { ['--rmg-slider-height' as any]: heightVarValue } : {}),\n },\n 'aria-busy': !isReady ? true : undefined,\n };\n\n const columnsForSkeleton =\n typeof cellsPerSlide === 'number' && cellsPerSlide > 0\n ? cellsPerSlide\n : (visibleImages || visibleImagesRef.current || 1);\n\n const MAX_SKELETONS = 12;\n\n const bpMap = breakpointMap\n\n const { cssText: skeletonCss, ssrBaseCount: skeletonCountBase } = useMemo(() => {\n return buildScopedSkeletonCountCss({\n scopeId,\n responsiveCount: normalizedLoading.skeletonCount,\n fallbackCount: columnsForSkeleton,\n breakpointMap: bpMap,\n maxSlots: MAX_SKELETONS,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scopeId, normalizedLoading.skeletonCount, columnsForSkeleton, bpMap]);\n\n const defaultSliderSkeleton = (\n <div className={styles.sliderSkeletonOverlay} data-rmg-skel-part=\"overlay\">\n <div className={styles.sliderSkeletonRow} data-rmg-skel-part=\"row\">\n {Array.from({ length: MAX_SKELETONS }).map((_, i) => (\n <div\n key={`rmg-slider-skel-${i}`}\n className={styles.sliderSkeleton}\n data-rmg-skel-slot={i + 1}\n />\n ))}\n </div>\n </div>\n );\n\n const loadingNode = (!isReady)\n ? (\n normalizedLoading.renderLoading\n ? normalizedLoading.renderLoading({\n layout: 'slider',\n count: skeletonCountBase,\n })\n : defaultSliderSkeleton\n )\n : null;\n\n const introWrapped = normalizedIntro.renderIntro\n ? (\n <div {...baseContainerProps}>\n {normalizedIntro.renderIntro(\n { active: isReady && inView, containerProps: baseContainerProps },\n inner\n )}\n </div>\n )\n : (\n <div {...baseContainerProps}>{inner}</div>\n );\n\n\n return (\n <>\n {responsiveCss && <style dangerouslySetInnerHTML={{ __html: responsiveCss }} />}\n {baseCss && <style dangerouslySetInnerHTML={{ __html: baseCss }} />}\n {skeletonCss && <style dangerouslySetInnerHTML={{ __html: skeletonCss }} />}\n\n <div\n id={scopeId}\n data-rmg-scope={scopeId}\n ref={sliderContainer}\n className={[\n styles.slider_container,\n rtlCls,\n sliderContainerClassName ?? \"\",\n ].join(\" \")}\n dir={isRtl ? 'rtl' : undefined}\n style={{\n position: 'relative',\n ...(heightVarValue != null ? { ['--rmg-slider-height' as any]: heightVarValue } : {}),\n ['--rmg-intro-stagger' as any]: `${normalizedIntro.staggerMs}ms`,\n ['--rmg-intro-transform' as any]: `${normalizedIntro.transform}px`,\n ['--rmg-intro-duration' as any]: `${normalizedIntro.durationMs}ms`,\n ['--rmg-intro-easing' as any]: normalizedIntro.easing,\n zIndex: 1,\n ...sliderContainerStyles,\n }}\n >\n {loadingNode}\n {introWrapped}\n </div>\n </>\n );\n});\n\nexport default Slider",".rtl {}\n\n.track { position: relative; left: 0; }\n.rtl .track { left: auto; right: 0; }\n\n.slider_container,\n.fade_container {\n height: var(--rmg-slider-height);\n cursor: grab;\n}\n\n.viewport {\n overflow: hidden;\n height: 100%;\n width: 100%;\n position: relative;\n}\n\n.track {\n position: relative;\n height: 100%;\n width: 100%;\n will-change: transform;\n transform: translate3d(0,0,0);\n backface-visibility: hidden;\n}\n\n.fadeInStart {\n opacity: 0;\n}\n\n.fadeInActive {\n opacity: 1;\n transition:\n opacity var(--rmg-intro-duration, 420ms)\n var(--rmg-intro-easing, cubic-bezier(.2,.7,.2,1));\n}\n\n.shimmerOverlay {\n position: absolute;\n inset: 0;\n border-radius: var(--rmg-shimmer-radius, 10px);\n overflow: hidden;\n\n background: linear-gradient(\n 90deg,\n var(--rmg-shimmer-c1, #f0f2f5) 25%,\n var(--rmg-shimmer-c2, #e6e9ef) 37%,\n var(--rmg-shimmer-c3, #f0f2f5) 63%\n );\n\n background-size: var(--rmg-shimmer-size, 400% 100%);\n animation: rmgShimmer var(--rmg-shimmer-duration, 1.2s)\n infinite var(--rmg-shimmer-timing, linear);\n}\n\n@keyframes rmgShimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fadeInActive { transition: none; }\n .shimmerOverlay { animation: none; }\n}\n\n.pagination_dot {\n position: relative;\n width: 14px;\n height: 14px;\n overflow: hidden;\n border-radius: 50%;\n margin: 5px 5px 5px 5px;\n cursor: pointer;\n transition: \n transform 0.2s ease, \n background-color 0.3s ease, \n box-shadow 0.3s ease;\n}\n\n.pagination_dot:hover {\n transform: scale(1.2);\n}\n\n.pagination_dot.active {\n background-color: rgb(80, 163, 255);\n box-shadow: 0 0 8px rgba(80, 163, 255, 0.6);\n}\n\n.pagination_dot.inactive {\n background-color: lightgray;\n}\n\n.ripple {\n position: absolute;\n border-radius: 50%;\n transform: scale(0);\n animation: ripple 600ms linear;\n background-color: rgba(0, 0, 0, 0.3);\n pointer-events: none;\n}\n\n@keyframes ripple {\n to {\n transform: scale(4);\n opacity: 0;\n }\n}\n\n.fullscreenOverlay {\n position: fixed;\n inset: 0;\n opacity: 0;\n pointer-events: none;\n background-color: rgba(0,0,0,0.8);\n transition: opacity 300ms cubic-bezier(.4,0,.22,1);\n will-change: opacity;\n z-index: 8999;\n transform: translateZ(0);\n backface-visibility: hidden;\n contain: paint;\n}\n\n.open {\n opacity: 1;\n pointer-events: auto;\n}\n\n.duplicateImg {\n position: fixed;\n display: none;\n transform-origin: top left;\n transition: transform 0.3s cubic-bezier(.4,0,.22,1);\n z-index: 9998;\n will-change: transform;\n}\n\n.closeBtn,\n.leftChevron,\n.rightChevron,\n.counter {\n position: fixed;\n display: none;\n opacity: 0;\n transition: opacity 0.3s cubic-bezier(.4,0,.22,1);\n z-index: 2147483602;\n}\n\n.closeBtn.open,\n.leftChevron.open,\n.rightChevron.open,\n.counter.open {\n display: block;\n opacity: 1;\n}\n\n.closeBtn {\n top: 12px;\n right: 12px;\n background: transparent;\n border: none;\n padding: 0;\n width: 35px;\n height: 35px;\n cursor: pointer;\n}\n\n.leftChevron,\n.rightChevron {\n top: 45.5%;\n width: 50px;\n height: 50px;\n cursor: pointer;\n background-color: transparent;\n border: none;\n}\n\n.leftChevron { left: 0; transform: rotate(180deg); }\n.rightChevron { right: 0; }\n\n.counter {\n top: 15px;\n left: 16px;\n color: #fff;\n font-size: 14px;\n line-height: 32px;\n user-select: none;\n text-shadow: 1px 1px 3px #4f4f4f;\n}\n\n.fsOverlayCaption {\n position: fixed;\n padding: 1rem 1.5rem;\n color: #fff;\n font-size: 0.875rem;\n pointer-events: none;\n opacity: 0;\n transform: translateY(8px);\n transition:\n opacity 300ms cubic-bezier(.4,0,.22,1),\n transform 300ms cubic-bezier(.4,0,.22,1);\n z-index: 9999;\n}\n\n.fsOverlayCaption.open {\n opacity: 1;\n transform: translateY(0);\n}\n\n.sliderSkeletonOverlay {\n position: absolute;\n inset: 0;\n z-index: 5;\n pointer-events: none;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 1rem;\n}\n\n.sliderSkeletonRow {\n display: flex;\n width: 100%;\n gap: 0.75rem;\n height: var(--rmg-slider-height, 320px);\n}\n\n.sliderSkeleton {\n flex: 1 1 0;\n height: 100%;\n border-radius: var(--rmg-shimmer-radius, 10px);\n overflow: hidden;\n position: relative;\n\n background: linear-gradient(\n 90deg,\n var(--rmg-shimmer-c1, #f0f2f5) 25%,\n var(--rmg-shimmer-c2, #e6e9ef) 37%,\n var(--rmg-shimmer-c3, #f0f2f5) 63%\n );\n\n background-size: var(--rmg-shimmer-size, 400% 100%);\n animation: rmgShimmer var(--rmg-shimmer-duration, 1.2s)\n infinite var(--rmg-shimmer-timing, linear);\n}\n\n.fade_container [data-rmg-idx] > * {\n opacity: 0;\n transform: translateY(var(--rmg-intro-offset, 10px));\n\n transition:\n opacity var(--rmg-intro-duration, 300)\n var(--rmg-intro-easing, cubic-bezier(.2,.7,.2,1)),\n transform var(--rmg-intro-duration, 300)\n var(--rmg-intro-easing, cubic-bezier(.2,.7,.2,1));\n\n transition-delay: calc(\n var(--rmg-intro-index, 0) * var(--rmg-intro-stagger, 40ms)\n );\n\n will-change: opacity, transform;\n}\n\n.fade_container.fadeInActive [data-rmg-idx] > * {\n opacity: 1;\n transform: translateY(0);\n}","import { IndexMode } from \"../api/types\";\n\ntype IndexListener = () => void;\n\nexport type IndexEvent =\n | { type: 'set'; index: number; mode: IndexMode }\n | { type: 'bump'; delta: number; mode: IndexMode };\n\ntype EventListener = (ev: IndexEvent) => void;\n\nexport default function createIndexChannel(initialIndex = 0, initialMode: IndexMode = 'animated') {\n let index = initialIndex;\n let mode: IndexMode = initialMode;\n let lastEvent: IndexEvent = { type: 'set', index: initialIndex, mode: initialMode };\n\n const subs = new Set<IndexListener>();\n const evtSubs = new Set<EventListener>();\n\n let raf = 0;\n const schedule = () => {\n if (raf) return;\n raf = requestAnimationFrame(() => {\n raf = 0;\n const ev = lastEvent;\n evtSubs.forEach(fn => fn(ev));\n subs.forEach(fn => fn());\n });\n };\n\n return {\n get() { return { index, mode }; },\n\n set(next: number, m: IndexMode = 'animated', opts?: { silent?: boolean }) {\n index = next;\n mode = m;\n lastEvent = { type: 'set', index, mode: m };\n if (!opts?.silent) schedule();\n },\n\n bump(delta: number, m: IndexMode = 'animated', opts?: { silent?: boolean }) {\n lastEvent = { type: 'bump', delta: (delta | 0), mode: m };\n if (!opts?.silent) schedule();\n },\n\n subscribe(fn: IndexListener): () => void {\n subs.add(fn);\n return () => { subs.delete(fn); };\n },\n\n onEvent(fn: EventListener): () => void {\n evtSubs.add(fn);\n return () => { evtSubs.delete(fn); };\n },\n };\n}","import { Limit, LimitType } from \"./limit\"\nimport { ScrollBodyType } from \"./scrollBody\"\nimport { Vector1DType } from \"./vector1d\"\n\nexport type ScrollBoundsType = ReturnType<typeof ScrollBounds>\n\nexport function ScrollBounds(\n limit: LimitType,\n location: Vector1DType,\n target: Vector1DType,\n body: ScrollBodyType,\n pov: PercentOfViewType,\n selectDuration: number\n) {\n const pullBack = pov.measure(10)\n const edgeTol = pov.measure(50)\n const fricLim = Limit(0.1, 0.99)\n\n function reached() {\n return limit.reachedAny(target.get()) && limit.reachedAny(location.get())\n }\n\n return {\n reached,\n constrain(pointerDown: boolean) {\n if (!reached()) return\n const edge = limit.reachedMin(location.get()) ? 'min' : 'max'\n const distToEdge = Math.abs(limit[edge] - location.get())\n const distToTarget = target.get() - location.get()\n const f = fricLim.constrain(distToEdge / edgeTol)\n\n target.set(target.get() - distToTarget * f)\n\n if (!pointerDown && Math.abs(distToTarget) < pullBack) {\n target.set(limit.constrain(target.get()))\n body.useDuration(selectDuration).useBaseFriction()\n }\n },\n }\n}\n\nexport type PercentOfViewType = ReturnType<typeof PercentOfView>\n\nexport function PercentOfView(viewSize: number) {\n return {\n measure(n: number) {\n return (viewSize * n) / 100\n },\n }\n}","'use client';\n\nimport * as React from 'react';\n\nexport type RmgSlideContextValue = {\n normIdx: number;\n isClone: boolean;\n registerPlyr?: (api: any | null) => void;\n};\n\nconst RmgSlideContext = React.createContext<RmgSlideContextValue | null>(null);\n\nexport function RmgSlideProvider({\n value,\n children,\n}: {\n value: RmgSlideContextValue;\n children: React.ReactNode;\n}) {\n return <RmgSlideContext.Provider value={value}>{children}</RmgSlideContext.Provider>;\n}\n\nexport function useRmgSlide() {\n return React.useContext(RmgSlideContext);\n}","export type GestureShield = {\n add: (timeoutMs?: number) => () => void;\n};\n\nexport function createGestureShield(zIndex = 10000): GestureShield {\n let cleanup: null | (() => void) = null;\n\n function add(timeoutMs = 400) {\n cleanup?.();\n\n const shield = document.createElement(\"div\");\n Object.assign(shield.style, {\n position: \"fixed\",\n inset: \"0\",\n zIndex: String(zIndex),\n background: \"transparent\",\n touchAction: \"none\",\n pointerEvents: \"auto\",\n } as CSSStyleDeclaration);\n\n document.body.appendChild(shield);\n\n const remove = () => {\n if (shield.parentNode) shield.remove();\n };\n\n const timer = window.setTimeout(() => {\n remove();\n cleanup = null;\n }, timeoutMs);\n\n const teardown = () => {\n window.clearTimeout(timer);\n remove();\n cleanup = null;\n };\n\n cleanup = teardown;\n return teardown;\n }\n\n return { add };\n}","import { ThumbnailPosition } from \"../slider/thumbnails/types\";\n\nexport const BREAKPOINT_MAP: Record<string, number> = {\n xs: 0,\n sm: 600,\n md: 900,\n lg: 1200,\n xl: 1536,\n};\n\nexport type BreakpointMap = Record<string, number>;\n\nexport type ResponsiveNumber =\n | number\n | string\n | Array<number | string>\n | Record<string, number | string>;\n\nexport type ResponsivePosition =\n | ThumbnailPosition\n | Array<ThumbnailPosition>\n | Record<string, ThumbnailPosition>;\n\nexport function parseNumberLike(v: number | string | undefined, fallback: number): number {\n if (v == null) return fallback;\n if (typeof v === 'number') return v;\n const n = parseFloat(v);\n return Number.isNaN(n) ? fallback : n;\n}\n\nexport function effectiveViewportWidth(raw: number): number {\n if (raw > 0) return raw;\n if (typeof window !== 'undefined' && window.innerWidth > 0) return window.innerWidth;\n return 1024;\n}\n\nexport function resolveNumberFromResponsive(\n value: ResponsiveNumber | undefined,\n fallback: number,\n viewportWidth: number,\n breakpointMap: BreakpointMap = BREAKPOINT_MAP\n): number {\n const vw = effectiveViewportWidth(viewportWidth);\n\n if (value == null) return fallback;\n\n if (typeof value === 'number' || typeof value === 'string') {\n return parseNumberLike(value as any, fallback);\n }\n\n if (Array.isArray(value)) {\n return resolveNumberFromResponsive(value[0] as any, fallback, vw, breakpointMap);\n }\n\n const entries = Object.entries(value)\n .map(([key, v]) => {\n const bp = breakpointMap[key] ?? (Number.isNaN(parseFloat(key)) ? 0 : parseFloat(key));\n return { minWidth: bp, value: v };\n })\n .sort((a, b) => a.minWidth - b.minWidth);\n\n let result = fallback;\n\n for (const bp of entries) {\n if (vw >= bp.minWidth) {\n result = resolveNumberFromResponsive(bp.value as any, result, vw, breakpointMap);\n }\n }\n\n return result;\n}\n\nexport function resolvePositionFromResponsive(\n value: ResponsivePosition | undefined,\n fallback: ThumbnailPosition,\n viewportWidth: number,\n breakpointMap: BreakpointMap = BREAKPOINT_MAP\n): ThumbnailPosition {\n const vw = effectiveViewportWidth(viewportWidth);\n\n if (value == null) return fallback;\n if (typeof value === 'string') return value;\n\n if (Array.isArray(value)) {\n return (value[0] ?? fallback) as ThumbnailPosition;\n }\n\n const entries = Object.entries(value)\n .map(([key, v]) => {\n const bp = breakpointMap[key] ?? (Number.isNaN(parseFloat(key)) ? 0 : parseFloat(key));\n return { minWidth: bp, value: v };\n })\n .sort((a, b) => a.minWidth - b.minWidth);\n\n let result: ThumbnailPosition = fallback;\n\n for (const bp of entries) {\n if (vw >= bp.minWidth) {\n result = resolvePositionFromResponsive(bp.value as any, result, vw, breakpointMap);\n }\n }\n\n return result;\n}\n\nexport function normalizeResponsiveToMinWidthRules(\n value: ResponsiveNumber | undefined,\n fallback: number,\n breakpointMap: BreakpointMap\n ): Array<{ minWidth: number; count: number }> {\n if (value == null) return [{ minWidth: 0, count: fallback }];\n\n if (typeof value === 'number' || typeof value === 'string') {\n const n = Math.floor(parseNumberLike(value as any, fallback));\n return [{ minWidth: 0, count: Math.max(0, n) }];\n }\n\n if (Array.isArray(value)) {\n return normalizeResponsiveToMinWidthRules(value[0] as any, fallback, breakpointMap);\n }\n\n const entries = Object.entries(value)\n .map(([key, v]) => {\n const bp =\n breakpointMap[key] ??\n (Number.isNaN(parseFloat(key)) ? 0 : parseFloat(key));\n const n = Math.floor(parseNumberLike(v as any, fallback));\n return { minWidth: bp, count: Math.max(0, n) };\n })\n .sort((a, b) => a.minWidth - b.minWidth);\n\n if (entries.length === 0) return [{ minWidth: 0, count: fallback }];\n\n if (entries[0].minWidth > 0) {\n entries.unshift({ minWidth: 0, count: fallback });\n } else if (entries[0].minWidth < 0) {\n entries[0] = { ...entries[0], minWidth: 0 };\n }\n\n return entries;\n }","import { BreakpointMap, normalizeResponsiveToMinWidthRules, ResponsiveNumber } from \"../responsive\";\n\nexport function buildScopedSkeletonCountCss(args: {\n scopeId: string;\n responsiveCount: ResponsiveNumber | undefined;\n fallbackCount: number;\n breakpointMap: BreakpointMap;\n maxSlots: number;\n}): { cssText: string; ssrBaseCount: number } {\n const { scopeId, responsiveCount, fallbackCount, breakpointMap, maxSlots } = args;\n\n const rules = normalizeResponsiveToMinWidthRules(responsiveCount, fallbackCount, breakpointMap);\n\n const clamp = (n: number) => Math.max(0, Math.min(maxSlots, Math.floor(n)));\n\n const baseCount = clamp(rules[0]?.count ?? fallbackCount);\n\n const rootSel = `[data-rmg-scope=\"${scopeId}\"]`;\n const slotSel = `${rootSel} [data-rmg-skel-slot]`;\n\n const lines: string[] = [];\n\n lines.push(`${slotSel}{ display:none; }`);\n\n const showFirstN = (count: number) => {\n const c = clamp(count);\n if (c <= 0) return '';\n return Array.from({ length: c })\n .map((_, i) => `${rootSel} [data-rmg-skel-slot=\"${i + 1}\"]{ display:block; }`)\n .join('\\n');\n };\n\n lines.push(showFirstN(baseCount));\n\n for (const r of rules.slice(1)) {\n const c = clamp(r.count);\n lines.push(`@media (min-width:${r.minWidth}px){\\n${showFirstN(c)}\\n}`);\n }\n\n return { cssText: lines.join('\\n'), ssrBaseCount: baseCount };\n}","import * as React from \"react\";\n\nconst TWEEN_FACTOR_BASE = 0.2;\n\ntype AxisMain = \"x\" | \"y\";\n\ntype Gettable = { get(): number };\n\ntype Args = {\n enabled?: boolean;\n wrap: boolean;\n axisMain: AxisMain;\n sliderRef: React.RefObject<HTMLElement | null>;\n sliderWidthRef: React.RefObject<number>;\n offsetLocationRef: React.RefObject<Gettable | null>;\n visibleImagesRef: React.RefObject<number>;\n slidesLen: number;\n clonedLen: number;\n isReady: boolean;\n};\n\nfunction mod(n: number, m: number) {\n return ((n % m) + m) % m;\n}\n\nexport function useParallaxEffect({\n enabled,\n wrap,\n axisMain,\n sliderRef,\n sliderWidthRef,\n offsetLocationRef,\n visibleImagesRef,\n slidesLen,\n clonedLen,\n isReady,\n}: Args) {\n const tweenNodesRef = React.useRef<HTMLElement[]>([]);\n const parallaxNodesRef = React.useRef<HTMLElement[]>([]);\n const parallaxSnapsRef = React.useRef<number[]>([]);\n\n const collectParallaxForAll = React.useCallback(() => {\n const track = sliderRef.current;\n if (!track) return;\n\n const W = sliderWidthRef.current || 0;\n const nodes: HTMLElement[] = [];\n const snaps: number[] = [];\n\n const kids = Array.from(track.children) as HTMLElement[];\n\n for (const el of kids) {\n const layer = el.querySelector<HTMLElement>(\".rmg__parallax__layer\");\n if (!layer) continue;\n\n // your original behavior: read translateX(...) if present, else offsetLeft\n const m = /translateX\\((-?\\d+(\\.\\d+)?)px\\)/.exec(el.style.transform || \"\");\n const baseX = m ? parseFloat(m[1]) : el.offsetLeft;\n\n const n = W > 0 ? mod(baseX, W) / W : 0;\n\n nodes.push(layer);\n snaps.push(n);\n }\n\n tweenNodesRef.current = nodes;\n parallaxNodesRef.current = nodes;\n parallaxSnapsRef.current = snaps;\n }, [sliderRef, sliderWidthRef]);\n\n const currentTweenFactor = React.useCallback(() => {\n const count = parallaxSnapsRef.current.length || 1;\n const visible = Math.max(visibleImagesRef.current || 1, 1);\n return TWEEN_FACTOR_BASE * (count / visible);\n }, [visibleImagesRef]);\n\n const scrollProgressNorm = React.useCallback((): number => {\n const track = sliderRef.current;\n const W = sliderWidthRef.current || 0;\n if (!track) return 0;\n\n const loc = -(offsetLocationRef.current?.get() ?? 0);\n\n if (!wrap) {\n const max = Math.max(0, W - track.clientWidth);\n if (max <= 0) return 0;\n return Math.min(1, Math.max(0, loc / max));\n }\n\n if (W <= 0) return 0;\n const world = mod(loc, W);\n return world / W;\n }, [sliderRef, sliderWidthRef, offsetLocationRef, wrap]);\n\n const tweenParallax = React.useCallback(() => {\n if (!enabled) return;\n\n const nodes = parallaxNodesRef.current;\n const snaps = parallaxSnapsRef.current;\n if (!nodes.length || nodes.length !== snaps.length) return;\n\n const p = scrollProgressNorm();\n const factor = currentTweenFactor();\n\n function circDiff(a: number, b: number) {\n let d = a - b;\n if (d > 0.5) d -= 1;\n if (d < -0.5) d += 1;\n return d;\n }\n\n for (let i = 0; i < nodes.length; i++) {\n const snap = snaps[i];\n const diff = wrap ? circDiff(snap, p) : snap - p;\n const translatePct = diff * (-1 * factor) * 100;\n\n nodes[i].style.transform =\n axisMain === \"x\"\n ? `translateX(${translatePct}%)`\n : `translateY(${translatePct}%)`;\n }\n }, [enabled, wrap, axisMain, scrollProgressNorm, currentTweenFactor]);\n\n // collect whenever structure changes\n React.useEffect(() => {\n if (!enabled) return;\n collectParallaxForAll();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, slidesLen, clonedLen, wrap, isReady, collectParallaxForAll]);\n\n // cleanup styles when disabled\n React.useEffect(() => {\n if (enabled) return;\n tweenNodesRef.current.forEach((n) => n && n.removeAttribute(\"style\"));\n }, [enabled]);\n\n // initial tween after paint\n React.useEffect(() => {\n if (!enabled) return;\n if (!slidesLen) return;\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n tweenParallax();\n });\n });\n }, [enabled, slidesLen, clonedLen, wrap, tweenParallax, isReady]);\n\n return {\n collectParallaxForAll,\n tweenParallax,\n parallaxNodesRef,\n parallaxSnapsRef,\n };\n}","import * as React from \"react\";\n\ntype Gettable = { get(): number };\n\ntype SlideLike = { target: number };\n\ntype Args = {\n enabled?: boolean;\n scaleAmount?: number;\n wrap: boolean;\n sliderRef: React.RefObject<HTMLElement | null>;\n sliderWidthRef: React.RefObject<number>;\n offsetLocationRef: React.RefObject<Gettable | null>;\n slidesRef: React.RefObject<SlideLike[] | null>;\n getCenterOffsetForIndex: (logicalIdx: number) => number;\n slidesLen: number;\n clonedLen: number;\n};\n\nfunction clamp01(n: number) {\n return Math.max(0, Math.min(1, n));\n}\n\nexport function useScaleEffect({\n enabled,\n scaleAmount,\n wrap,\n sliderRef,\n sliderWidthRef,\n offsetLocationRef,\n slidesRef,\n getCenterOffsetForIndex,\n slidesLen,\n clonedLen,\n}: Args) {\n const slideCenterX = React.useCallback(\n (logicalIdx: number) => {\n const s = slidesRef.current?.[logicalIdx];\n if (!s || !sliderRef.current) return 0;\n const centerOffset = getCenterOffsetForIndex(logicalIdx);\n return s.target - centerOffset;\n },\n [slidesRef, sliderRef, getCenterOffsetForIndex]\n );\n\n const getCenters = React.useCallback((): number[] => {\n const L = slidesRef.current?.length ?? 0;\n const arr: number[] = [];\n for (let i = 0; i < L; i++) arr.push(slideCenterX(i));\n return arr;\n }, [slidesRef, slideCenterX]);\n\n const findBoundingPair = React.useCallback(\n (loc: number) => {\n const centers = getCenters();\n const L = centers.length;\n if (!L) return { iL: 0, iR: 0, t: 0 };\n\n const W = sliderWidthRef.current || 0;\n const useWrap = wrap && W > 0;\n\n type Node = { x: number; i: number };\n const nodes: Node[] = [];\n for (let i = 0; i < L; i++) {\n const base = centers[i];\n if (useWrap) {\n nodes.push({ x: base - W, i });\n nodes.push({ x: base, i });\n nodes.push({ x: base + W, i });\n } else {\n nodes.push({ x: base, i });\n }\n }\n nodes.sort((a, b) => a.x - b.x);\n\n let leftIdx = 0,\n rightIdx = 0;\n for (let k = 0; k < nodes.length - 1; k++) {\n const a = nodes[k],\n b = nodes[k + 1];\n if (loc >= a.x && loc <= b.x) {\n leftIdx = k;\n rightIdx = k + 1;\n break;\n }\n }\n\n if (loc < nodes[0].x) {\n leftIdx = 0;\n rightIdx = 1;\n }\n if (loc > nodes[nodes.length - 1].x) {\n leftIdx = nodes.length - 2;\n rightIdx = nodes.length - 1;\n }\n\n const left = nodes[leftIdx];\n const right = nodes[rightIdx];\n\n const span = Math.max(1, right.x - left.x);\n const t = clamp01((loc - left.x) / span);\n\n return { iL: left.i, iR: right.i, t };\n },\n [getCenters, sliderWidthRef, wrap]\n );\n\n const applyPairScaleTween = React.useCallback(() => {\n if (!enabled || !sliderRef.current || !slidesRef.current?.length || !scaleAmount) return;\n\n const track = sliderRef.current;\n const kids = Array.from(track.children) as HTMLElement[];\n const loc = -(offsetLocationRef.current?.get() ?? 0);\n\n const { iL, iR, t } = findBoundingPair(loc);\n const wL = 1 - t;\n const wR = t;\n\n const L = slidesRef.current.length;\n const sByIdx = new Array<number>(L).fill(1);\n sByIdx[iL] = 1 + (scaleAmount - 1) * wL;\n sByIdx[iR] = 1 + (scaleAmount - 1) * wR;\n\n for (const el of kids) {\n const idxAttr = el.getAttribute(\"data-rmg-idx\");\n if (!idxAttr) {\n el.style.setProperty(\"--rmg-scale\", \"1\");\n el.style.zIndex = \"0\";\n continue;\n }\n\n const li = Number(idxAttr);\n const s = sByIdx[li] ?? 1;\n\n el.style.setProperty(\"--rmg-scale\", String(s));\n el.style.zIndex = s > 1.0001 ? \"1\" : \"0\";\n if (!el.style.transformOrigin) el.style.transformOrigin = \"center\";\n if (!el.style.transition) el.style.transition = \"transform 120ms linear\";\n }\n }, [enabled, sliderRef, slidesRef, scaleAmount, offsetLocationRef, findBoundingPair]);\n\n // run when key stuff changes\n React.useEffect(() => {\n applyPairScaleTween();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, scaleAmount, slidesLen, clonedLen]);\n\n // optional cleanup when disabled\n React.useEffect(() => {\n if (enabled) return;\n const track = sliderRef.current;\n if (!track) return;\n const kids = Array.from(track.children) as HTMLElement[];\n for (const el of kids) {\n el.style.setProperty(\"--rmg-scale\", \"1\");\n el.style.zIndex = \"0\";\n }\n }, [enabled, sliderRef]);\n\n return { applyPairScaleTween, getCenters };\n}","import * as React from \"react\";\n\ntype Gettable = { get(): number };\n\ntype SlideLike = { target: number };\n\ntype Args = {\n enabled?: boolean;\n wrap: boolean;\n sliderRef: React.RefObject<HTMLElement | null>;\n sliderWidthRef: React.RefObject<number>;\n offsetLocationRef: React.RefObject<Gettable | null>;\n slidesRef: React.RefObject<SlideLike[] | null>;\n getCenterOffsetForIndex: (logicalIdx: number) => number;\n slidesLen: number;\n clonedLen: number;\n};\n\nconst MIN_FADE_OPACITY = 0.5;\n\nfunction circularDist(x: number, c: number, W: number) {\n let d = Math.abs(x - c);\n if (W > 0) {\n d = Math.min(d, Math.abs(x - (c - W)), Math.abs(x - (c + W)));\n }\n return d;\n}\n\nexport function useFadeEffect({\n enabled,\n wrap,\n sliderRef,\n sliderWidthRef,\n offsetLocationRef,\n slidesRef,\n getCenterOffsetForIndex,\n slidesLen,\n clonedLen,\n}: Args) {\n const slideCenterX = React.useCallback(\n (logicalIdx: number) => {\n const s = slidesRef.current?.[logicalIdx];\n if (!s || !sliderRef.current) return 0;\n const centerOffset = getCenterOffsetForIndex(logicalIdx);\n return s.target - centerOffset;\n },\n [slidesRef, sliderRef, getCenterOffsetForIndex]\n );\n\n const getCenters = React.useCallback((): number[] => {\n const L = slidesRef.current?.length ?? 0;\n const arr: number[] = [];\n for (let i = 0; i < L; i++) arr.push(slideCenterX(i));\n return arr;\n }, [slidesRef, slideCenterX]);\n\n const applyFadeTween = React.useCallback(() => {\n if (!enabled || !sliderRef.current || !slidesRef.current?.length) return;\n\n const track = sliderRef.current;\n const kids = Array.from(track.children) as HTMLElement[];\n const loc = -(offsetLocationRef.current?.get() ?? 0);\n\n const centers = getCenters();\n const L = centers.length;\n if (!L) return;\n\n const W = sliderWidthRef.current || 0;\n const useWrap = wrap && W > 0;\n\n type Node = { x: number; i: number };\n const nodes: Node[] = [];\n for (let i = 0; i < L; i++) {\n const base = centers[i];\n if (useWrap) {\n nodes.push({ x: base - W, i });\n nodes.push({ x: base, i });\n nodes.push({ x: base + W, i });\n } else {\n nodes.push({ x: base, i });\n }\n }\n nodes.sort((a, b) => a.x - b.x);\n\n let leftIdx = 0,\n rightIdx = 1;\n for (let k = 0; k < nodes.length - 1; k++) {\n const a = nodes[k],\n b = nodes[k + 1];\n if (loc >= a.x && loc <= b.x) {\n leftIdx = k;\n rightIdx = k + 1;\n break;\n }\n }\n\n const span = Math.max(1, nodes[rightIdx].x - nodes[leftIdx].x);\n\n const opacityByIdx = new Array<number>(L).fill(MIN_FADE_OPACITY);\n for (let i = 0; i < L; i++) {\n const c = centers[i];\n const d = useWrap ? circularDist(loc, c, W) : Math.abs(loc - c);\n const t = Math.max(0, Math.min(1, 1 - d / span));\n const op = MIN_FADE_OPACITY + (1 - MIN_FADE_OPACITY) * t;\n opacityByIdx[i] = op;\n }\n\n for (const el of kids) {\n const idxAttr = el.getAttribute(\"data-rmg-idx\");\n if (!idxAttr) {\n el.style.opacity = \"1\";\n continue;\n }\n const li = Number(idxAttr);\n const op = opacityByIdx[li] ?? 1;\n el.style.opacity = String(op);\n if (!el.style.transition) el.style.transition = \"opacity 120ms linear\";\n }\n }, [\n enabled,\n sliderRef,\n slidesRef,\n offsetLocationRef,\n getCenters,\n sliderWidthRef,\n wrap,\n ]);\n\n // run when key stuff changes\n React.useEffect(() => {\n applyFadeTween();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, slidesLen, clonedLen, wrap]);\n\n // cleanup when disabled\n React.useEffect(() => {\n if (enabled) return;\n const track = sliderRef.current;\n if (!track) return;\n const kids = Array.from(track.children) as HTMLElement[];\n for (const el of kids) el.style.opacity = \"1\";\n }, [enabled, sliderRef]);\n\n return { applyFadeTween, getCenters };\n}","import * as React from \"react\";\n\nexport type ArrowRenderArgs = {\n ref: React.RefObject<HTMLDivElement | null>;\n onClick: () => void;\n hidden: boolean;\n disabled: boolean;\n createRipple: (el: HTMLElement) => void;\n className?: string;\n};\n\nexport type ArrowsRenderArgs = ArrowRenderArgs & { dir: \"prev\" | \"next\" };\n\nexport type RmgArrowsProps = {\n axisMain: \"x\" | \"y\";\n clientKey: \"clientWidth\" | \"clientHeight\";\n wrap: boolean;\n isRtl: boolean;\n showArrows?: boolean;\n selectedIndex: number;\n slideCount: number;\n measureRef: React.RefObject<HTMLElement | null>;\n viewportMainSizeRef: React.RefObject<number>;\n previous: () => void;\n next: () => void;\n prevButtonRef: React.RefObject<HTMLDivElement | null>;\n nextButtonRef: React.RefObject<HTMLDivElement | null>;\n createRipple: (el: HTMLElement) => void;\n arrowStyles?: React.CSSProperties;\n prevArrowStyles?: React.CSSProperties;\n nextArrowStyles?: React.CSSProperties;\n arrowClassName?: string;\n prevArrowClassName?: string;\n nextArrowClassName?: string;\n renderPrevArrow?: (args: ArrowRenderArgs) => React.ReactNode;\n renderNextArrow?: (args: ArrowRenderArgs) => React.ReactNode;\n renderArrows?: (args: ArrowsRenderArgs) => React.ReactNode;\n};\n\nfunction DefaultChevron({\n axisMain,\n direction,\n size = 32,\n}: {\n axisMain: \"x\" | \"y\";\n direction: \"prev\" | \"next\";\n size?: number;\n}) {\n const pathPrev = <path d=\"M15.41 16.59L10.83 12l4.58-4.59L14 6l-6 6 6 6z\" />;\n const pathNext = <path d=\"M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6z\" />;\n\n if (axisMain === \"y\") {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width={size}\n height={size}\n fill=\"#000\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n style={{ transform: \"rotate(90deg)\", transformOrigin: \"50% 50%\" }}\n >\n {direction === \"prev\" ? pathPrev : pathNext}\n </svg>\n );\n }\n\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width={size}\n height={size}\n fill=\"#000\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n >\n {direction === \"prev\" ? pathPrev : pathNext}\n </svg>\n );\n}\n\nconst baseArrowStyle: React.CSSProperties = {\n position: \"absolute\",\n overflow: \"hidden\",\n backgroundColor: \"rgba(255, 255, 255, 0.75)\",\n boxShadow: \"0 0 5px rgba(0, 0, 0, 0.5)\",\n borderRadius: \"100%\",\n zIndex: 2,\n width: 36,\n height: 36,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n transition: \"opacity 120ms\",\n};\n\nfunction prevPlacement(axisMain: \"x\" | \"y\"): React.CSSProperties {\n return axisMain === \"y\"\n ? { left: \"50%\", top: 10, transform: \"translateX(-50%)\" }\n : { left: 10, top: \"50%\", transform: \"translateY(-50%)\" };\n}\n\nfunction nextPlacement(axisMain: \"x\" | \"y\"): React.CSSProperties {\n return axisMain === \"y\"\n ? { left: \"50%\", bottom: 10, transform: \"translateX(-50%)\" }\n : { right: 10, top: \"50%\", transform: \"translateY(-50%)\" };\n}\n\nexport function RmgArrows(props: RmgArrowsProps) {\n const {\n axisMain,\n clientKey,\n wrap,\n isRtl,\n showArrows,\n selectedIndex,\n slideCount,\n measureRef,\n viewportMainSizeRef,\n previous,\n next,\n prevButtonRef,\n nextButtonRef,\n createRipple,\n arrowStyles,\n prevArrowStyles,\n nextArrowStyles,\n arrowClassName,\n prevArrowClassName,\n nextArrowClassName,\n renderPrevArrow,\n renderNextArrow,\n renderArrows,\n } = props;\n\n const atFirst = !wrap && selectedIndex <= 0;\n const atLast = !wrap && selectedIndex >= Math.max(0, slideCount - 1);\n\n const clientMain = measureRef.current\n ? ((measureRef.current as any)[clientKey] as number)\n : 0;\n\n const arrowsAutoHidden =\n !(slideCount > 1 && measureRef.current && viewportMainSizeRef.current > clientMain);\n\n const arrowsHidden = !showArrows || arrowsAutoHidden;\n\n const prevDisabled = arrowsHidden || (!wrap && (isRtl ? atLast : atFirst));\n const nextDisabled = arrowsHidden || (!wrap && (isRtl ? atFirst : atLast));\n\n const prevArrowStylesEffective: React.CSSProperties = {\n ...(arrowStyles ?? {}),\n ...(prevArrowStyles ?? {}),\n };\n\n const nextArrowStylesEffective: React.CSSProperties = {\n ...(arrowStyles ?? {}),\n ...(nextArrowStyles ?? {}),\n };\n\n const prevArrowClassNameEffective = [arrowClassName, prevArrowClassName]\n .filter(Boolean)\n .join(\" \");\n\n const nextArrowClassNameEffective = [arrowClassName, nextArrowClassName]\n .filter(Boolean)\n .join(\" \");\n\n function makeArrowOnClick(dir: \"prev\" | \"next\", hidden: boolean) {\n return () => {\n if (hidden) return;\n requestAnimationFrame(() => {\n if (dir === \"prev\") previous();\n else next();\n });\n };\n }\n\n const DefaultArrow = ({\n dir,\n ref,\n onClick,\n hidden,\n disabled,\n className,\n }: ArrowRenderArgs & { dir: \"prev\" | \"next\" }) => {\n const dim = disabled ? 0.35 : 1;\n const placement = dir === \"prev\" ? prevPlacement(axisMain) : nextPlacement(axisMain);\n const perDirStyles = dir === \"prev\" ? prevArrowStylesEffective : nextArrowStylesEffective;\n\n return (\n <div\n ref={ref}\n className={`rmgArrow rmgArrow--${dir} ${className ?? \"\"}`}\n onClick={(evt) => {\n if (hidden) return;\n createRipple(evt.currentTarget as HTMLElement);\n requestAnimationFrame(() => onClick());\n }}\n style={{\n ...baseArrowStyle,\n ...placement,\n ...perDirStyles,\n cursor: disabled ? \"default\" : \"pointer\",\n opacity: hidden ? 0 : dim,\n pointerEvents: hidden ? \"none\" : \"auto\",\n visibility: hidden ? \"hidden\" : \"visible\",\n }}\n aria-label={dir === \"prev\" ? \"Previous slide\" : \"Next slide\"}\n role=\"button\"\n title={\n disabled\n ? dir === \"prev\"\n ? \"At first slide\"\n : \"At last slide\"\n : dir === \"prev\"\n ? \"Previous\"\n : \"Next\"\n }\n >\n <DefaultChevron axisMain={axisMain} direction={dir} size={32} />\n </div>\n );\n };\n\n const renderArrow = (dir: \"prev\" | \"next\", args: ArrowRenderArgs) => {\n if (dir === \"prev\" && renderPrevArrow) return renderPrevArrow(args);\n if (dir === \"next\" && renderNextArrow) return renderNextArrow(args);\n if (renderArrows) return renderArrows({ ...args, dir });\n return DefaultArrow({ ...args, dir });\n };\n\n const prevArrowNode = renderArrow(\"prev\", {\n ref: prevButtonRef,\n hidden: arrowsHidden,\n disabled: prevDisabled,\n onClick: makeArrowOnClick(\"prev\", arrowsHidden),\n createRipple,\n className: prevArrowClassNameEffective,\n });\n\n const nextArrowNode = renderArrow(\"next\", {\n ref: nextButtonRef,\n hidden: arrowsHidden,\n disabled: nextDisabled,\n onClick: makeArrowOnClick(\"next\", arrowsHidden),\n createRipple,\n className: nextArrowClassNameEffective,\n });\n\n return (\n <>\n {prevArrowNode}\n {nextArrowNode}\n </>\n );\n}","'use client';\n\nimport * as React from 'react';\nimport { DotsRenderArgs } from '../../shared/types/controls';\n\nexport type BuildDotsNodeArgs = {\n AX: { main: 'x' | 'y'; clientKey: string };\n slider: React.RefObject<HTMLElement | null>;\n sliderWidth: React.RefObject<number>;\n wrap: boolean;\n showDots?: boolean;\n selectedIndex: React.RefObject<number>;\n slides: React.RefObject<{ cells: { element: HTMLElement; index: number; }[]; target: number; }[]>\n dotsContainerRef: React.RefObject<HTMLDivElement | null>;\n dotRefs: React.RefObject<Array<HTMLElement | null>>;\n isScrolling: React.RefObject<boolean>;\n goToIndex: (i: number) => void;\n renderDots?: (args: DotsRenderArgs) => React.ReactNode;\n createRipple: (el: HTMLElement) => void;\n styles: Record<string, string>;\n dotsContainerStyles?: React.CSSProperties;\n dotsStyles?: React.CSSProperties;\n dotsContainerClassName?: string;\n dotsClassName?: string;\n};\n\nexport function getDotsHidden(args: {\n AX: { clientKey: string };\n slider: React.RefObject<HTMLElement | null>;\n sliderWidth: React.RefObject<number>;\n showDots?: boolean;\n}) {\n const { AX, slider, sliderWidth, showDots } = args;\n\n const clientMain = slider.current ? ((slider.current as any)[AX.clientKey] as number) : 0;\n\n const dotsAutoHidden = !!(slider.current && (sliderWidth.current <= clientMain));\n const dotsHidden = !showDots || dotsAutoHidden;\n\n return { clientMain, dotsAutoHidden, dotsHidden };\n}\n\nexport function DefaultDotsFactory(\n args: Pick<BuildDotsNodeArgs, 'AX' | 'createRipple' | 'styles' | 'dotsContainerStyles' | 'dotsStyles'>\n) {\n const { AX, createRipple, styles, dotsContainerStyles, dotsStyles } = args;\n\n return function DefaultDots({\n ref,\n count,\n activeIndex,\n hidden,\n goTo,\n getDotRef,\n classNameContainer,\n classNameDot,\n }: DotsRenderArgs) {\n const pos: React.CSSProperties =\n AX.main === 'y'\n ? { top: '50%', left: 10, transform: 'translateY(-50%)', flexDirection: 'column' }\n : { left: '50%', bottom: 10, transform: 'translateX(-50%)', flexDirection: 'row' };\n\n return (\n <div\n ref={ref}\n className={`rmgDots ${classNameContainer ?? ''}`}\n style={{\n display: 'flex',\n justifyContent: 'center',\n position: 'absolute',\n zIndex: 10,\n background: 'rgba(0, 0, 0, 0.5)',\n padding: AX.main === 'y' ? '8px 4px' : '4px 8px',\n borderRadius: '9999px',\n cursor: 'auto',\n opacity: hidden ? 0 : 1,\n pointerEvents: hidden ? 'none' : 'auto',\n visibility: hidden ? 'hidden' : 'visible',\n ...pos,\n ...(dotsContainerStyles || {}),\n }}\n >\n {Array.from({ length: count }).map((_, index) => {\n const isActive = activeIndex === index;\n return (\n <div\n key={index}\n ref={getDotRef(index)}\n onMouseDown={(e) => {\n createRipple(e.currentTarget as HTMLElement);\n }}\n onClick={() => goTo(index)}\n className={[\n styles.pagination_dot,\n isActive ? styles.active : styles.inactive,\n 'rmgDot',\n classNameDot ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n style={{\n ...(dotsStyles || {}),\n }}\n />\n );\n })}\n </div>\n );\n };\n}\n\nexport function buildDotsNode(args: BuildDotsNodeArgs) {\n const {\n AX,\n slider,\n sliderWidth,\n showDots,\n selectedIndex,\n slides,\n dotsContainerRef,\n dotRefs,\n isScrolling,\n goToIndex,\n renderDots,\n createRipple,\n styles,\n dotsContainerStyles,\n dotsStyles,\n dotsContainerClassName,\n dotsClassName,\n } = args;\n\n const { dotsHidden } = getDotsHidden({ AX, slider, sliderWidth, showDots });\n\n const DefaultDots = DefaultDotsFactory({\n AX,\n createRipple,\n styles,\n dotsContainerStyles,\n dotsStyles,\n });\n\n const node = (renderDots ?? DefaultDots)({\n ref: dotsContainerRef,\n count: slides.current?.length ?? 0,\n activeIndex: selectedIndex.current,\n hidden: dotsHidden,\n goTo: (i: number) => {\n isScrolling.current = false;\n requestAnimationFrame(() => goToIndex(i));\n },\n getDotRef: (i: number) => (el: HTMLDivElement | null) => {\n dotRefs.current[i] = el;\n },\n createRipple,\n classNameContainer: dotsContainerClassName,\n classNameDot: dotsClassName,\n } as any);\n\n return { dotsHidden, dotsNode: node };\n}","'use client';\n\nimport * as React from 'react';\nimport { ProgressRenderArgs } from '../../shared/types/controls';\n\nexport type BuildProgressNodeArgs = {\n AX: { main: 'x' | 'y'; clientKey: string };\n slider: React.RefObject<HTMLElement | null>;\n sliderWidth: React.RefObject<number>;\n wrap: boolean;\n offsetLocationRef: React.RefObject<{ get: () => number } | null>;\n lastProgressRef: React.RefObject<number>;\n progressHolderRef: React.RefObject<HTMLDivElement | null>;\n progressInnerRef: React.RefObject<HTMLDivElement | null>;\n showProgress?: boolean;\n renderProgress?: (args: ProgressRenderArgs) => React.ReactNode;\n progressClassName?: string;\n progressStyle?: React.CSSProperties;\n progressInnerClassName?: string;\n progressInnerStyle?: React.CSSProperties;\n};\n\nexport function clamp01(n: number) {\n return Math.max(0, Math.min(1, n));\n}\n\nexport function setProgressDom(args: {\n AX: { main: 'x' | 'y' };\n lastProgressRef: React.MutableRefObject<number>;\n progressHolderRef: React.RefObject<HTMLDivElement | null>;\n progressInnerRef: React.RefObject<HTMLDivElement | null>;\n p: number;\n}) {\n const { AX, lastProgressRef, progressHolderRef, progressInnerRef, p } = args;\n\n const v = clamp01(p);\n lastProgressRef.current = v;\n\n const holder = progressHolderRef.current;\n const inner = progressInnerRef.current;\n\n if (holder) {\n holder.style.setProperty('--rmg-progress', String(v));\n holder.setAttribute('data-rmg-progress', String(v));\n holder.setAttribute('aria-valuenow', String(Math.round(v * 100)));\n }\n\n if (inner && AX.main === 'x') {\n inner.style.width = `${v * 100}%`;\n } else if (inner && AX.main === 'y') {\n inner.style.height = `${v * 100}%`;\n }\n}\n\nexport function updateProgressInFrame(args: {\n AX: { main: 'x' | 'y'; clientKey: string };\n slider: React.RefObject<HTMLElement | null>;\n sliderWidth: React.RefObject<number>;\n wrap: boolean;\n offsetLocationRef: React.RefObject<{ get: () => number } | null>;\n lastProgressRef: React.MutableRefObject<number>;\n progressHolderRef: React.RefObject<HTMLDivElement | null>;\n progressInnerRef: React.RefObject<HTMLDivElement | null>;\n}) {\n const {\n AX,\n slider,\n sliderWidth,\n wrap,\n offsetLocationRef,\n lastProgressRef,\n progressHolderRef,\n progressInnerRef,\n } = args;\n\n const track = slider.current;\n const content = sliderWidth.current || 0;\n\n if (!track) {\n setProgressDom({ AX, lastProgressRef, progressHolderRef, progressInnerRef, p: 0 });\n return;\n }\n\n const cw = (track as any)[AX.clientKey] as number;\n\n if (!wrap) {\n const max = Math.max(0, content - cw);\n if (max <= 0) {\n setProgressDom({ AX, lastProgressRef, progressHolderRef, progressInnerRef, p: 1 });\n return;\n }\n const loc = -(offsetLocationRef.current?.get() ?? 0);\n setProgressDom({ AX, lastProgressRef, progressHolderRef, progressInnerRef, p: Math.min(1, Math.max(0, loc / max)) });\n } else {\n const W = sliderWidth.current || 0;\n if (W <= 0) {\n setProgressDom({ AX, lastProgressRef, progressHolderRef, progressInnerRef, p: 0 });\n return;\n }\n const world = ((-(offsetLocationRef.current?.get() ?? 0) % W) + W) % W;\n setProgressDom({\n AX,\n lastProgressRef,\n progressHolderRef,\n progressInnerRef,\n p: Math.round(world) === Math.round(W) ? 0 : world / W,\n });\n }\n}\n\nexport function DefaultProgress({\n ref,\n innerRef,\n hidden,\n progress,\n axis,\n className,\n style,\n innerClassName,\n innerStyle,\n}: ProgressRenderArgs) {\n if (hidden) return null;\n\n const isY = axis === 'y';\n\n return (\n <div\n ref={ref as any}\n className={className}\n style={{\n position: 'absolute',\n left: isY ? 6 : '50%',\n top: isY ? '50%' : undefined,\n bottom: isY ? undefined : 6,\n transform: isY ? 'translateY(-50%)' : 'translateX(-50%)',\n width: isY ? 4 : '60%',\n height: isY ? '60%' : 4,\n background: 'rgba(0,0,0,0.3)',\n borderRadius: 9999,\n overflow: 'hidden',\n zIndex: 10,\n pointerEvents: 'none',\n ['--rmg-progress' as any]: progress,\n ...(style || {}),\n }}\n aria-hidden\n data-rmg-progress={String(progress)}\n >\n <div\n ref={innerRef as any}\n className={innerClassName}\n style={{\n width: isY ? '100%' : 'calc(var(--rmg-progress, 0) * 100%)',\n height: isY ? 'calc(var(--rmg-progress, 0) * 100%)' : '100%',\n background: 'rgb(80,163,255)',\n transition: 'none',\n ...(innerStyle || {}),\n }}\n />\n </div>\n );\n}\n\nexport function buildProgressNode(args: BuildProgressNodeArgs) {\n const {\n AX,\n slider,\n sliderWidth,\n wrap,\n offsetLocationRef,\n lastProgressRef,\n progressHolderRef,\n progressInnerRef,\n showProgress,\n renderProgress,\n progressClassName,\n progressStyle,\n progressInnerClassName,\n progressInnerStyle,\n } = args;\n\n const progressHiddenAuto = false;\n const progressHidden = !(showProgress ?? false) || progressHiddenAuto;\n\n const node = (renderProgress ?? DefaultProgress)({\n ref: progressHolderRef,\n innerRef: progressInnerRef,\n hidden: progressHidden,\n progress: lastProgressRef.current,\n axis: AX.main,\n className: progressClassName,\n style: progressStyle,\n innerClassName: progressInnerClassName,\n innerStyle: progressInnerStyle,\n } as any);\n\n const api = {\n progressHidden,\n progressNode: node,\n setProgressDom: (p: number) =>\n setProgressDom({ AX, lastProgressRef, progressHolderRef, progressInnerRef, p }),\n updateProgressInFrame: () =>\n updateProgressInFrame({\n AX,\n slider,\n sliderWidth,\n wrap,\n offsetLocationRef,\n lastProgressRef,\n progressHolderRef,\n progressInnerRef,\n }),\n };\n\n return api;\n}","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport * as React from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { createRoot, Root } from \"react-dom/client\";\n\nimport { parseObjectPosition } from \"../shared/transitions/objectPosition\";\nimport {\n containTransformForRect,\n coverTransformForRect,\n objectFitContentRect,\n} from \"../shared/transitions/objectFitTransform\";\n\nimport type {\n FsCaptionPlacement,\n FullscreenOptions,\n FsCaptionRenderArgs,\n} from \"../fullscreen/types\";\nimport type { ElementStyle } from \"../shared/types/elements\";\n\ntype RefEl<T extends HTMLElement> = React.RefObject<T | null>;\n\nexport type FullscreenIntroArgs = {\n /** Source image element that was clicked/tapped. */\n origImg: HTMLImageElement;\n\n /** Index of the item you’re opening fullscreen to. */\n index: number;\n\n /** The resolved/normalized items the fullscreen slider will use. */\n normalizedItems: any[];\n\n /** Current RTL state (already resolved). */\n isRtl: boolean;\n\n /** CSS module map (needs: fullscreenOverlay, fsOverlayCaption, open, closeBtn, leftChevron, rightChevron, counter, etc.) */\n styles: Record<string, string>;\n\n /** Fullscreen options (single unified source of truth). */\n fs: FullscreenOptions;\n\n /** Refs used by the rest of fullscreen system */\n overlayDivRef: RefEl<HTMLDivElement>;\n duplicateImgRef: RefEl<HTMLElement>;\n overlayCaptionRef: RefEl<HTMLDivElement>;\n overlayCaptionRootRef: React.RefObject<Root | null>;\n closeButtonRef: RefEl<HTMLElement>;\n counterRef: RefEl<HTMLElement>;\n leftChevronRef: RefEl<HTMLElement>;\n rightChevronRef: RefEl<HTMLElement>;\n\n /**\n * If you have a thumbnails container in fullscreen, pass it so we can reserve content space\n * during the intro transform.\n */\n fsThumbContainerRef?: RefEl<HTMLElement>;\n\n /** State toggles in your fullscreen host */\n setShowFullscreenSlider: (v: boolean) => void;\n setFsFadeOpening: (v: boolean) => void;\n\n /** Optional: prevent gestures / pointer leak during intro */\n addShield?: (timeoutMs?: number) => void;\n\n /**\n * Your existing resolver:\n * - returns final placement (or null to mean “no caption area reserved”)\n */\n resolveFsCaptionPlacement: (\n placement: any,\n breakpoint: number | undefined,\n viewportWidth: number\n ) => FsCaptionPlacement | null;\n\n /**\n * Used to find a “slide element” to compute cover transforms.\n * Defaults: grid/masonry -> .rmg__grid-item, slider -> .rmg__slide\n */\n closestSelector?: string;\n};\n\nfunction elementStyleFromCfg(\n cfg?: { className?: string; style?: React.CSSProperties } | null\n): ElementStyle | undefined {\n if (!cfg) return undefined;\n const out: ElementStyle = {};\n if (cfg.className) out.className = cfg.className;\n if (cfg.style) out.style = cfg.style as any;\n return out;\n}\n\nfunction applyElementStyle(el: HTMLElement | null, cfg?: ElementStyle) {\n if (!el || !cfg) return;\n\n if (cfg.className) {\n cfg.className\n .split(\" \")\n .map((s) => s.trim())\n .filter(Boolean)\n .forEach((c) => el.classList.add(c));\n }\n\n if (cfg.style) {\n Object.assign(el.style, cfg.style);\n }\n}\n\nfunction ensureButtonLike(el: HTMLElement) {\n if (el.tagName.toLowerCase() === \"button\") {\n (el as HTMLButtonElement).type ||= \"button\";\n return;\n }\n\n el.setAttribute(\"role\", \"button\");\n el.tabIndex = 0;\n\n if (!el.dataset.rmgKeybind) {\n el.dataset.rmgKeybind = \"1\";\n el.addEventListener(\"keydown\", (ev) => {\n if (ev.key === \"Enter\" || ev.key === \" \") {\n ev.preventDefault();\n el.click();\n }\n });\n }\n}\n\nfunction detectVideoSlide(item: any, slideEl: HTMLElement) {\n return (\n item?.type === \"video\" ||\n item?.kind === \"video\" ||\n item?.mediaType === \"video\" ||\n !!item?.videoSrc ||\n !!item?.sources?.video ||\n !!item?.plyrSource ||\n !!(slideEl as any)?.dataset?.rmgVideo\n );\n}\n\n/**\n * Unified fullscreen intro for Slider / Grid / Masonry / Entries.\n * - Uses ONLY `fs: FullscreenOptions` for behavior.\n * - Computes clip-path + duplicate image transform intro (or fade intro).\n * - Builds close/arrows/counter elements (or uses your renderers).\n * - Optionally renders a temporary “overlay caption” during the intro.\n */\nexport function runFullscreenIntro(args: FullscreenIntroArgs) {\n const {\n origImg,\n index,\n normalizedItems,\n isRtl,\n styles,\n fs,\n overlayDivRef,\n duplicateImgRef,\n overlayCaptionRef,\n overlayCaptionRootRef,\n closeButtonRef,\n counterRef,\n leftChevronRef,\n rightChevronRef,\n fsThumbContainerRef,\n setShowFullscreenSlider,\n setFsFadeOpening,\n addShield,\n resolveFsCaptionPlacement,\n closestSelector,\n } = args;\n\n if (!origImg) return;\n\n const DURATION_MS = fs.effects?.introDuration ?? 300;\n const EASING = fs.effects?.introEasing ?? \"cubic-bezier(.4,0,.22,1)\";\n\n addShield?.(400);\n\n const vw = document.documentElement.clientWidth;\n const vh = window.innerHeight;\n\n const slideEl =\n (origImg.closest(\n closestSelector ??\n // sensible default:\n (closestSelector === undefined ? \".rmg__grid-item, .rmg__slide\" : \"\")\n ) as HTMLElement) ||\n (origImg.parentElement as HTMLElement) ||\n origImg;\n\n const slideRect = slideEl.getBoundingClientRect();\n const imgRect = origImg.getBoundingClientRect();\n\n const natW = Math.max(1, origImg.naturalWidth || 0);\n const natH = Math.max(1, origImg.naturalHeight || 0);\n\n const insetForRect = (r: DOMRect) => {\n const top = r.top;\n const left = r.left;\n const right = vw - (r.left + r.width);\n const bottom = vh - (r.top + r.height);\n return `inset(${top}px ${right}px ${bottom}px ${left}px)`;\n };\n\n const fit = getComputedStyle(origImg).objectFit || \"cover\";\n const cs0 = getComputedStyle(origImg);\n const startObjPos = parseObjectPosition(cs0?.objectPosition ?? null);\n\n const visibleImgRect =\n fit === \"contain\"\n ? objectFitContentRect(natW, natH, imgRect, \"contain\", startObjPos)\n : imgRect;\n\n const startInset = insetForRect(visibleImgRect);\n\n // --- Overlay (fade layer behind fullscreen) ---\n const overlay = document.createElement(\"div\");\n overlay.className = styles.fullscreenOverlay;\n overlayDivRef.current = overlay;\n\n overlay.style.opacity = \"0\";\n overlay.style.pointerEvents = \"none\";\n overlay.style.transition = \"none\";\n\n document.body.appendChild(overlay);\n void overlay.offsetWidth;\n overlay.style.transition = `opacity ${DURATION_MS}ms ${EASING}`;\n\n // --- Reserve content area for caption + thumbnails ---\n const effectivePlacement = resolveFsCaptionPlacement(\n fs.caption?.placement,\n fs.caption?.breakpoint,\n vw\n );\n\n const DEFAULT_SIDE = 280;\n const DEFAULT_TOP_BOTTOM = 200;\n\n const sideWidth = fs.caption?.width ?? DEFAULT_SIDE;\n const topBottomHeight = fs.caption?.height ?? DEFAULT_TOP_BOTTOM;\n\n let contentLeft = 0;\n let contentRight = vw;\n let contentTop = 0;\n let contentBottom = vh;\n\n if (effectivePlacement === \"right\") {\n contentRight = Math.max(0, vw - sideWidth);\n } else if (effectivePlacement === \"left\") {\n contentLeft = Math.min(vw, sideWidth);\n } else if (effectivePlacement === \"top\") {\n contentTop = Math.min(vh, topBottomHeight);\n } else if (effectivePlacement === \"bottom\") {\n contentBottom = Math.max(0, vh - topBottomHeight);\n }\n\n const thumbPos = fs.thumbnails?.layout?.position;\n if (fsThumbContainerRef?.current && thumbPos) {\n const H = fsThumbContainerRef.current.offsetHeight;\n const W = fsThumbContainerRef.current.offsetWidth;\n\n if (thumbPos === \"top\") contentTop += H;\n else if (thumbPos === \"bottom\") contentBottom -= H;\n else if (thumbPos === \"left\") contentLeft += W;\n else if (thumbPos === \"right\") contentRight -= W;\n }\n\n const contentRect = new DOMRect(\n contentLeft,\n contentTop,\n Math.max(1, contentRight - contentLeft),\n Math.max(1, contentBottom - contentTop)\n );\n\n // --- Optional overlay caption (temporary, during intro) ---\n if (typeof fs.caption?.render === \"function\") {\n try {\n const overlayCaption = document.createElement(\"div\");\n overlayCaption.className = styles.fsOverlayCaption;\n overlayCaptionRef.current = overlayCaption;\n\n // base styles (same as your existing versions)\n const base: Partial<CSSStyleDeclaration> = {\n position: \"fixed\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n textAlign: \"left\",\n padding: \"0.75rem 1rem\",\n color: \"#fff\",\n fontSize: \"0.875rem\",\n boxSizing: \"border-box\",\n pointerEvents: \"none\",\n transition:\n \"opacity 220ms cubic-bezier(.4,0,.22,1), transform 220ms cubic-bezier(.4,0,.22,1)\",\n zIndex: \"9999\",\n };\n\n if (effectivePlacement === \"right\") {\n base.top = thumbPos === \"top\" ? `${contentTop}px` : \"0\";\n base.bottom = \"0\";\n base.left = `${contentRight}px`;\n base.width = `${sideWidth}px`;\n base.height = thumbPos === \"bottom\" ? `${contentBottom}px` : \"auto\";\n } else if (effectivePlacement === \"left\") {\n base.top = thumbPos === \"top\" ? `${contentTop}px` : \"0\";\n base.bottom = \"0\";\n base.left = \"0\";\n base.width = `${sideWidth}px`;\n base.height = thumbPos === \"bottom\" ? `${contentBottom}px` : \"auto\";\n } else if (effectivePlacement === \"top\") {\n base.top = `${Math.max(0, contentTop - topBottomHeight)}px`;\n base.left = `${contentLeft}px`;\n base.right = `${Math.max(0, vw - contentRight)}px`;\n base.height = `${topBottomHeight}px`;\n } else if (effectivePlacement === \"bottom\") {\n const bottomOffset = Math.max(\n 0,\n vh - contentBottom - topBottomHeight\n );\n base.bottom = `${bottomOffset}px`;\n base.left = `${contentLeft}px`;\n base.right = `${Math.max(0, vw - contentRight)}px`;\n base.height = `${topBottomHeight}px`;\n } else {\n // if placement resolves to null, don’t reserve space; still allow overlay caption\n base.bottom = \"0\";\n base.left = \"0\";\n base.right = \"0\";\n base.height = \"auto\";\n }\n\n Object.assign(overlayCaption.style, base);\n\n // user overrides\n if (fs.caption?.className) {\n fs.caption.className\n .split(\" \")\n .map((s) => s.trim())\n .filter(Boolean)\n .forEach((c) => overlayCaption.classList.add(c));\n }\n if (fs.caption?.style) {\n Object.assign(overlayCaption.style, fs.caption.style);\n }\n\n overlay.appendChild(overlayCaption);\n\n const root = createRoot(overlayCaption);\n overlayCaptionRootRef.current = root;\n\n const item = normalizedItems[index];\n const captionNode = fs.caption.render({\n item,\n index,\n isZoomed: false,\n } satisfies FsCaptionRenderArgs);\n\n root.render(<>{captionNode}</>);\n } catch (err) {\n console.error(\"[RMG] Failed to render overlay caption\", err);\n }\n }\n\n // --- Controls (close / arrows / counter) ---\n const imageCount = normalizedItems.length;\n\n const closeEnabled = fs.controls?.close?.enabled !== false;\n const counterEnabled = fs.controls?.counter?.enabled !== false;\n const allowFsArrows =\n fs.controls?.arrows?.enabled !== false && imageCount > 1;\n\n const defaultClose = () => {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = styles.closeBtn;\n\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"width\", \"35\");\n svg.setAttribute(\"height\", \"35\");\n svg.setAttribute(\"viewBox\", \"0 0 16 16\");\n\n const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n path.setAttribute(\"fill\", \"white\");\n path.setAttribute(\"stroke\", \"#4f4f4f\");\n path.setAttribute(\"stroke-width\", \"0.5\");\n path.setAttribute(\n \"d\",\n \"M12.96 4.46l-1.42-1.42-3.54 3.55-3.54-3.55-1.42 1.42 3.55 3.54-3.55 3.54 1.42 1.42 3.54-3.55 3.54 3.55 1.42-1.42-3.55-3.54 3.55-3.54z\"\n );\n\n svg.appendChild(path);\n btn.appendChild(svg);\n return btn;\n };\n\n const defaultChevron = (side: \"left\" | \"right\") => {\n const ns = \"http://www.w3.org/2000/svg\";\n const action =\n side === \"left\" ? (isRtl ? \"next\" : \"prev\") : isRtl ? \"prev\" : \"next\";\n\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = side === \"left\" ? styles.leftChevron : styles.rightChevron;\n btn.dataset.action = action;\n btn.setAttribute(\"aria-label\", action === \"prev\" ? \"Previous\" : \"Next\");\n\n const svg = document.createElementNS(ns, \"svg\");\n svg.setAttribute(\"viewBox\", \"0 0 16 16\");\n svg.setAttribute(\"width\", \"100%\");\n svg.setAttribute(\"height\", \"100%\");\n svg.setAttribute(\"focusable\", \"false\");\n svg.style.display = \"block\";\n\n const poly = document.createElementNS(ns, \"polygon\");\n poly.setAttribute(\n \"points\",\n \"4.586,3.414 9.172,8 4.586,12.586 6,14 12,8 6,2\"\n );\n poly.setAttribute(\"fill\", \"white\");\n poly.setAttribute(\"stroke\", \"#4f4f4f\");\n poly.setAttribute(\"stroke-width\", \"0.5\");\n\n if (side === \"left\") {\n const g = document.createElementNS(ns, \"g\");\n g.appendChild(poly);\n svg.appendChild(g);\n } else {\n svg.appendChild(poly);\n }\n\n btn.appendChild(svg);\n return btn;\n };\n\n const makeArrowEl = (dir: \"prev\" | \"next\", side: \"left\" | \"right\") => {\n const explicit =\n dir === \"prev\"\n ? typeof fs.controls?.arrows?.renderPrev === \"function\"\n ? fs.controls.arrows.renderPrev()\n : null\n : typeof fs.controls?.arrows?.renderNext === \"function\"\n ? fs.controls.arrows.renderNext()\n : null;\n\n if (explicit instanceof HTMLElement) return explicit;\n\n if (typeof fs.controls?.arrows?.render === \"function\") {\n const el = fs.controls.arrows.render({ dir });\n if (el instanceof HTMLElement) return el;\n }\n\n return defaultChevron(side);\n };\n\n const defaultCounter = (cur: number, total: number) => {\n const el = document.createElement(\"div\");\n el.className = styles.counter;\n el.textContent = `${cur + 1} / ${total}`;\n return el;\n };\n\n const closeExplicit =\n typeof fs.controls?.close?.render === \"function\"\n ? fs.controls.close.render()\n : null;\n\n const closeBtn = closeEnabled\n ? closeExplicit instanceof HTMLElement\n ? closeExplicit\n : defaultClose()\n : null;\n\n if (closeBtn) {\n ensureButtonLike(closeBtn);\n if (!closeBtn.getAttribute(\"aria-label\"))\n closeBtn.setAttribute(\"aria-label\", \"Close\");\n }\n\n const leftAction: \"prev\" | \"next\" = isRtl ? \"next\" : \"prev\";\n const rightAction: \"prev\" | \"next\" = isRtl ? \"prev\" : \"next\";\n\n const leftCh = makeArrowEl(leftAction, \"left\");\n const rightCh = makeArrowEl(rightAction, \"right\");\n\n if (leftCh) ensureButtonLike(leftCh);\n if (rightCh) ensureButtonLike(rightCh);\n\n [leftCh, rightCh].forEach((btn, i) => {\n if (!btn) return;\n const action = i === 0 ? leftAction : rightAction;\n btn.dataset.action = action;\n if (!btn.getAttribute(\"aria-label\")) {\n btn.setAttribute(\"aria-label\", action === \"prev\" ? \"Previous\" : \"Next\");\n }\n });\n\n const ctrExplicit =\n typeof fs.controls?.counter?.render === \"function\"\n ? fs.controls.counter.render({ index, count: imageCount })\n : null;\n\n const ctr = counterEnabled\n ? ctrExplicit instanceof HTMLElement\n ? ctrExplicit\n : defaultCounter(index, imageCount)\n : null;\n\n // Apply style overrides\n // - arrows already use ElementStyle in your types\n // - close/counter are (style,className), so adapt them to ElementStyle\n applyElementStyle(closeBtn, elementStyleFromCfg(fs.controls?.close ?? null));\n applyElementStyle(leftCh, fs.controls?.arrows?.arrow);\n applyElementStyle(rightCh, fs.controls?.arrows?.arrow);\n applyElementStyle(leftCh, fs.controls?.arrows?.prev);\n applyElementStyle(rightCh, fs.controls?.arrows?.next);\n applyElementStyle(ctr, elementStyleFromCfg(fs.controls?.counter ?? null));\n\n // Ensure base classes exist for transitions\n if (leftCh) leftCh.classList.add(styles.leftChevron);\n if (rightCh) rightCh.classList.add(styles.rightChevron);\n\n closeButtonRef.current = closeBtn;\n leftChevronRef.current = leftCh;\n rightChevronRef.current = rightCh;\n (counterRef as any).current = ctr;\n\n // Mount controls into body (same pattern as your current code)\n [closeBtn, leftCh, rightCh, ctr].forEach((el) => {\n if (el) {\n el.style.display = \"none\";\n document.body.appendChild(el);\n }\n });\n\n if (closeBtn) {\n closeBtn.style.display = \"block\";\n closeBtn.classList.remove(styles.open);\n }\n\n if (leftCh) {\n leftCh.style.display = allowFsArrows ? \"block\" : \"none\";\n leftCh.classList.remove(styles.open);\n }\n\n if (rightCh) {\n rightCh.style.display = allowFsArrows ? \"block\" : \"none\";\n rightCh.classList.remove(styles.open);\n }\n\n if (ctr) {\n ctr.style.display = imageCount > 1 ? \"block\" : \"none\";\n ctr.classList.remove(styles.open);\n }\n\n // --- Decide fade vs clip+transform intro ---\n const item = normalizedItems[index];\n const isVideoSlide = detectVideoSlide(item, slideEl);\n const forceFadeIntro = !!fs.effects?.introFade || isVideoSlide;\n\n let clipper: HTMLDivElement | null = null;\n let dup: HTMLImageElement | null = null;\n\n if (!forceFadeIntro) {\n clipper = document.createElement(\"div\");\n Object.assign(clipper.style, {\n position: \"fixed\",\n inset: \"0\",\n clipPath: startInset,\n willChange: \"clip-path\",\n transition: \"none\",\n zIndex: \"9998\",\n } as CSSStyleDeclaration);\n\n dup = document.createElement(\"img\");\n dup.src = (origImg as HTMLImageElement).currentSrc || origImg.src;\n\n Object.assign(dup.style, {\n position: \"fixed\",\n left: \"0\",\n top: \"0\",\n width: `${natW}px`,\n height: `${natH}px`,\n maxWidth: \"none\",\n maxHeight: \"none\",\n transformOrigin: \"50% 50%\",\n willChange: \"transform\",\n transition: \"none\",\n opacity: \"0\",\n display: \"block\",\n zIndex: \"9998\",\n } as CSSStyleDeclaration);\n\n duplicateImgRef.current = dup;\n\n clipper.appendChild(dup);\n // Append overlay + clipper in one go (reduces paint jitter)\n const frag = document.createDocumentFragment();\n frag.append(overlay, clipper);\n document.body.appendChild(frag);\n\n const startT =\n fit === \"contain\"\n ? containTransformForRect(natW, natH, visibleImgRect, startObjPos)\n : coverTransformForRect(natW, natH, slideRect, startObjPos);\n\n dup.style.transform =\n `translate3d(${startT.cx}px, ${startT.cy}px, 0)` +\n ` translate3d(${-natW / 2}px, ${-natH / 2}px, 0)` +\n ` scale(${startT.scale})`;\n\n void dup.offsetWidth;\n void clipper.offsetWidth;\n\n const fitsIntrinsic = natW <= contentRect.width && natH <= contentRect.height;\n const endObjPos = { x: 0.5, y: 0.5 };\n\n const endT = fitsIntrinsic\n ? {\n cx: contentRect.x + contentRect.width / 2,\n cy: contentRect.y + contentRect.height / 2,\n scale: 1,\n }\n : containTransformForRect(natW, natH, contentRect, endObjPos);\n\n const finalTransform =\n `translate3d(${endT.cx}px, ${endT.cy}px, 0)` +\n ` translate3d(${-natW / 2}px, ${-natH / 2}px, 0)` +\n ` scale(${endT.scale})`;\n\n function startAnimation() {\n // reset to start (important if decode resolves after layout changes)\n dup!.style.transform =\n `translate3d(${startT.cx}px, ${startT.cy}px, 0)` +\n ` translate3d(${-natW / 2}px, ${-natH / 2}px, 0)` +\n ` scale(${startT.scale})`;\n\n void dup!.offsetWidth;\n void clipper!.offsetWidth;\n void overlay.offsetWidth;\n\n clipper!.style.transition = `clip-path ${DURATION_MS}ms ${EASING}`;\n dup!.style.transition = `transform ${DURATION_MS}ms ${EASING}`;\n overlay.style.transition = `opacity ${DURATION_MS}ms ${EASING}`;\n\n requestAnimationFrame(() => {\n clipper!.style.clipPath = \"inset(0px 0px 0px 0px)\";\n dup!.style.transform = finalTransform;\n dup!.style.opacity = \"1\";\n overlay.style.opacity = \"1\";\n overlay.style.pointerEvents = \"auto\";\n if (overlayCaptionRef.current) {\n overlayCaptionRef.current.classList.add(styles.open);\n }\n });\n }\n\n const ready = (dup as any).decode\n ? (dup as HTMLImageElement).decode().catch(() => {})\n : new Promise<void>((resolve) => {\n if (dup!.complete) return resolve();\n dup!.addEventListener(\"load\", () => resolve(), { once: true });\n dup!.addEventListener(\"error\", () => resolve(), { once: true });\n });\n\n ready.then(() => startAnimation());\n\n // Open controls immediately (while animation runs)\n requestAnimationFrame(() => {\n const many = imageCount > 1;\n const addOpen = (el: Element) => el.classList.add(styles.open);\n\n overlay.style.opacity = \"1\";\n overlay.style.pointerEvents = \"auto\";\n\n if (closeBtn) addOpen(closeBtn);\n\n if (many) {\n if (allowFsArrows) {\n if (leftCh) addOpen(leftCh);\n if (rightCh) addOpen(rightCh);\n }\n if (ctr) addOpen(ctr);\n }\n });\n\n const onEnd = async (ev: TransitionEvent) => {\n if (ev.propertyName !== \"transform\") return;\n dup!.removeEventListener(\"transitionend\", onEnd);\n\n await new Promise((r) =>\n requestAnimationFrame(() => requestAnimationFrame(r))\n );\n\n setShowFullscreenSlider(true);\n\n requestAnimationFrame(() => {\n if (overlayCaptionRootRef.current) {\n overlayCaptionRootRef.current.unmount();\n overlayCaptionRootRef.current = null;\n }\n if (overlayCaptionRef.current) {\n overlayCaptionRef.current.remove();\n overlayCaptionRef.current = null;\n }\n clipper!.remove();\n dup!.remove();\n (duplicateImgRef as any).current = null;\n });\n };\n\n dup.addEventListener(\"transitionend\", onEnd, { once: true });\n return;\n }\n\n // --- Fade intro path ---\n requestAnimationFrame(() => {\n overlay.style.opacity = \"1\";\n overlay.style.pointerEvents = \"auto\";\n if (overlayCaptionRef.current) {\n overlayCaptionRef.current.classList.add(styles.open);\n }\n });\n\n flushSync(() => {\n setShowFullscreenSlider(true);\n setFsFadeOpening(true);\n });\n\n requestAnimationFrame(() => {\n setFsFadeOpening(false);\n });\n\n // cleanup overlay caption shortly after fade in\n window.setTimeout(() => {\n if (overlayCaptionRootRef.current) {\n overlayCaptionRootRef.current.unmount();\n overlayCaptionRootRef.current = null;\n }\n if (overlayCaptionRef.current) {\n overlayCaptionRef.current.remove();\n overlayCaptionRef.current = null;\n }\n }, DURATION_MS + 30);\n\n // Open controls (fade path)\n requestAnimationFrame(() => {\n const many = imageCount > 1;\n const addOpen = (el: Element) => el.classList.add(styles.open);\n\n if (closeBtn) addOpen(closeBtn);\n\n if (many) {\n if (allowFsArrows) {\n if (leftCh) addOpen(leftCh);\n if (rightCh) addOpen(rightCh);\n }\n if (ctr) addOpen(ctr);\n }\n });\n}\n\n/**\n * Small helper for Slider call-sites that currently have `(e, imgRef, index)`.\n * You can keep your click handler identical and just call this factory.\n */\nexport function createSliderFullscreenIntroRunner(deps: Omit<\n FullscreenIntroArgs,\n \"origImg\" | \"index\"\n>) {\n return function runFromSliderEvent(\n _e: React.PointerEvent<any>,\n imgRef: React.RefObject<HTMLImageElement | null>,\n index: number\n ) {\n const origImg = imgRef.current;\n if (!origImg) return;\n\n runFullscreenIntro({\n ...deps,\n origImg,\n index,\n closestSelector: deps.closestSelector ?? \".rmg__slide\",\n });\n };\n}","/* --- GRID ROOT ------------------------------------------------- */\n\n.gridRoot {\n display: grid;\n grid-template-columns: repeat(\n auto-fill,\n minmax(var(--rmg-grid-min, 160px), 1fr)\n );\n gap: var(--rmg-grid-gap, 8px);\n}\n\n.grid {\n display: grid;\n grid-template-columns: repeat(\n auto-fill,\n minmax(var(--rmg-grid-min, 160px), 1fr)\n );\n gap: var(--rmg-grid-gap, 8px);\n}\n\n/* --- GRID ITEM ------------------------------------------------- */\n\n.gridItem {\n position: relative;\n display: block;\n cursor: pointer;\n}\n\n.gridItem img,\n.gridItem video {\n display: block;\n width: 100%;\n height: auto;\n object-fit: cover;\n}\n\n/* --- MASONRY ROOT ---------------------------------------------- */\n\n.masonryRoot {\n display: flex;\n align-items: flex-start;\n width: 100%;\n column-gap: var(--rmg-masonry-gap, 8px);\n}\n\n.masonryCol {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n}\n\n/* --- MASONRY ITEM ---------------------------------------------- */\n\n.masonryItem {\n position: relative;\n display: block;\n cursor: pointer;\n}\n\n.masonryItem img,\n.masonryItem video {\n display: block;\n width: 100%;\n object-fit: cover;\n}\n\n/* --- INTRO (shared by grid + masonry) -------------------------- */\n\n.introContainer {\n opacity: 0;\n}\n\n.introActive {\n opacity: 1;\n transition:\n opacity var(--rmg-intro-duration, 420ms)\n var(--rmg-intro-easing, cubic-bezier(.2,.7,.2,1));\n}\n\n.introContainer [data-rmg-idx] {\n opacity: 0;\n transform: var(--rmg-intro-transform, translateY(10px) scale(0.99));\n transition:\n opacity 300ms cubic-bezier(.4, 0, .22, 1),\n transform 300ms cubic-bezier(.4, 0, .22, 1);\n transition-delay: calc(\n var(--rmg-intro-index, 0) * var(--rmg-intro-stagger, 40ms)\n );\n will-change: opacity, transform;\n}\n\n.introContainer.introActive [data-rmg-idx] {\n opacity: 1;\n transform: none;\n}\n\n/* --- GRID SKELETON --------------------------------------------- */\n\n.gridSkeletonOverlay {\n position: relative;\n width: 100%;\n}\n\n.gridSkeletonGrid {\n display: grid;\n grid-template-columns: repeat(\n auto-fill,\n minmax(var(--rmg-grid-min, 160px), 1fr)\n );\n gap: var(--rmg-grid-gap, 8px);\n}\n\n.gridSkeletonItem {\n position: relative;\n width: 100%;\n padding-bottom: 66.666%; /* 3:2 ratio; tweak if you like */\n border-radius: var(--rmg-shimmer-radius, 8px);\n overflow: hidden;\n\n --rmg-shimmer-c1: #f0f2f5;\n --rmg-shimmer-c2: #e6e9ef;\n --rmg-shimmer-c3: #f0f2f5;\n --rmg-shimmer-size: 400% 100%;\n --rmg-shimmer-duration: 1.2s;\n --rmg-shimmer-timing: linear;\n\n background: linear-gradient(\n 90deg,\n var(--rmg-shimmer-c1) 25%,\n var(--rmg-shimmer-c2) 37%,\n var(--rmg-shimmer-c3) 63%\n );\n background-size: var(--rmg-shimmer-size);\n animation: rmgShimmer var(--rmg-shimmer-duration)\n infinite var(--rmg-shimmer-timing);\n}\n\n@keyframes rmgShimmer {\n 0% {\n background-position: -200% 0;\n }\n 100% {\n background-position: 200% 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .gridSkeletonItem {\n animation: none;\n }\n}\n\n.fullscreenOverlay {\n position: fixed;\n inset: 0;\n opacity: 0;\n pointer-events: none;\n background-color: rgba(0,0,0,0.8);\n transition: opacity 300ms cubic-bezier(.4,0,.22,1);\n will-change: opacity;\n z-index: 8999;\n transform: translateZ(0);\n backface-visibility: hidden;\n contain: paint;\n}\n\n.open {\n opacity: 1;\n pointer-events: auto;\n}\n\n.duplicateImg {\n position: fixed;\n display: none;\n transform-origin: top left;\n transition: transform 0.3s cubic-bezier(.4,0,.22,1);\n z-index: 9998;\n will-change: transform;\n}\n\n.closeBtn,\n.leftChevron,\n.rightChevron,\n.counter {\n position: fixed;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.3s cubic-bezier(.4,0,.22,1);\n z-index: 2147483602;\n}\n\n.closeBtn.open,\n.leftChevron.open,\n.rightChevron.open,\n.counter.open {\n opacity: 1;\n pointer-events: auto;\n}\n\n.closeBtn {\n top: 12px;\n right: 12px;\n background: transparent;\n border: none;\n padding: 0;\n width: 35px;\n height: 35px;\n cursor: pointer;\n}\n\n.leftChevron,\n.rightChevron {\n top: 45.5%;\n width: 50px;\n height: 50px;\n cursor: pointer;\n background-color: transparent;\n border: none;\n}\n\n.leftChevron { left: 0; transform: rotate(180deg); }\n.rightChevron { right: 0; }\n\n.counter {\n top: 15px;\n left: 16px;\n color: #fff;\n font-size: 14px;\n line-height: 32px;\n user-select: none;\n text-shadow: 1px 1px 3px #4f4f4f;\n}\n\n.fsOverlayCaption {\n position: fixed;\n padding: 1rem 1.5rem;\n color: #fff;\n font-size: 0.875rem;\n pointer-events: none;\n opacity: 0;\n transform: translateY(8px);\n transition:\n opacity 300ms cubic-bezier(.4,0,.22,1),\n transform 300ms cubic-bezier(.4,0,.22,1);\n z-index: 9999;\n}\n\n.fsOverlayCaption.open {\n opacity: 1;\n transform: translateY(0);\n}\n\n/* --- ENTRIES SKELETON --- */\n\n.entryRow {\n position: relative;\n}\n\n.entrySkeletonWrap {\n display: block;\n opacity: 1;\n transition: opacity 150ms linear;\n}\n\n.entryInner {\n position: absolute;\n inset: 0;\n opacity: 0;\n transform: var(--rmg-entry-intro-transform, translateY(30px) scale(0.99));\n will-change: opacity, transform;\n pointer-events: none;\n}\n\n.entryRow[data-rmg-entry-ready=\"1\"] .entrySkeletonWrap {\n position: absolute;\n inset: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n.entryRow[data-rmg-entry-ready=\"1\"] .entryInner {\n position: relative;\n inset: auto;\n\n opacity: 1;\n transform: none;\n pointer-events: auto; /* ✅ */\n\n transition:\n opacity var(--rmg-entry-intro-duration, 700ms)\n var(--rmg-entry-intro-easing, cubic-bezier(.4,0,.22,1)),\n transform var(--rmg-entry-intro-duration, 700ms)\n var(--rmg-entry-intro-easing, cubic-bezier(.4,0,.22,1));\n transition-delay: calc(\n var(--rmg-entry-intro-index, 0) * var(--rmg-entry-intro-stagger, 200ms)\n );\n}\n\n.entryList {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n}\n\n.entryText { }\n.entryMedia { }\n\n.entryMediaSlider {\n display: flex;\n gap: 0.75rem;\n overflow-x: auto;\n padding-bottom: 0.25rem;\n}\n\n.gridEntryRoot {\n display: grid;\n gap: var(--rmg-grid-gap, 8px);\n grid-template-columns: repeat(auto-fit, minmax(var(--rmg-grid-min, 160px), 1fr));\n}\n\n.gridEntryItem {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n border: 0;\n background: transparent;\n border-radius: 12px;\n overflow: hidden;\n cursor: pointer;\n box-shadow: 0 1px 0 rgba(0,0,0,0.06);\n border: 1px solid rgba(0,0,0,0.08);\n}\n\n.gridEntryItem img,\n.gridEntryItem video {\n display: block;\n width: 100%;\n object-fit: cover;\n background: rgba(0,0,0,0.04);\n}\n\n.entryMasonry img {\n cursor: pointer;\n}\n\n.entryMediaItem img {\n display: block;\n width: 100%;\n height: auto;\n border-radius: 0.5rem;\n}\n\n.entrySkeletonShimmer {\n position: relative;\n overflow: hidden;\n border-radius: inherit;\n\n --rmg-shimmer-c1: #f0f2f5;\n --rmg-shimmer-c2: #e6e9ef;\n --rmg-shimmer-c3: #f0f2f5;\n --rmg-shimmer-size: 400% 100%;\n --rmg-shimmer-duration: 1.2s;\n --rmg-shimmer-timing: linear;\n\n background: linear-gradient(\n 90deg,\n var(--rmg-shimmer-c1) 25%,\n var(--rmg-shimmer-c2) 37%,\n var(--rmg-shimmer-c3) 63%\n );\n background-size: var(--rmg-shimmer-size);\n animation: rmgShimmer var(--rmg-shimmer-duration)\n infinite var(--rmg-shimmer-timing);\n}\n\n.entrySkeletonList {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n padding: 0.75rem 0;\n}\n\n.entrySkeletonCard {\n position: relative;\n overflow: hidden;\n border-radius: 12px;\n padding: 1rem 1.25rem;\n background: var(--rmg-skel-bg, rgba(255, 255, 255, 0.03));\n}\n\n.entrySkeletonHeader {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin-bottom: 0.75rem;\n}\n\n.entrySkeletonLines {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n}\n\n.entrySkeletonAvatar {\n width: 40px;\n height: 40px;\n border-radius: 999px;\n}\n\n.entrySkeletonLineShort,\n.entrySkeletonLineLong,\n.entrySkeletonLineMedium {\n height: 10px;\n border-radius: 999px;\n}\n\n.entrySkeletonMedia {\n width: 100%;\n height: 140px;\n border-radius: 10px;\n}\n\n.entrySkeletonBody {\n display: flex;\n flex-direction: column;\n gap: 0.4rem;\n margin-bottom: 0.9rem;\n}","/* eslint-disable @typescript-eslint/no-explicit-any */\n'use client'\n\nimport {\n Children,\n ReactElement,\n ReactNode,\n cloneElement,\n isValidElement,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport cls from './ThumbnailSlider.module.css'\nimport createIndexChannel from '../sliderSub'\nimport { createDragTracker } from '../../shared/input/dragTracker'\nimport { Vector1D, Vector1DType } from '../../shared/motion/vector1d'\nimport { ScrollBody, ScrollBodyType } from '../../shared/motion/scrollBody'\nimport { Limit, LimitType } from '../../shared/motion/limit'\nimport { ScrollLooper } from '../../shared/motion/scrollLooper'\nimport { ScrollBounds, ScrollBoundsType, PercentOfView, PercentOfViewType } from '../../shared/motion/scrollBounds'\nimport { BaseTarget, factorAbs, mathSign, ScrollTarget, ScrollTargetType } from '../../shared/motion/scrollTarget'\nimport { Animations, AnimationsType } from '../../shared/motion/animations'\nimport { EventStore } from '../../shared/motion/eventStore'\nimport { ThumbnailIntroOptions, ThumbnailLoadingOptions, ThumbnailPosition } from './types'\nimport { ArrowRenderArgs } from '../../shared/types/controls'\nimport { BreakpointMap } from '../../shared/responsive'\nimport { Counter, CounterType } from '../../shared/motion/counter'\nimport { buildScopedSkeletonCountCss } from '../../shared/skeleton/buildScopedSkeletonCountCss'\nimport { BaseLimit, createBaseLimit } from '../../shared/motion/baseLimit'\nimport { RmgArrows } from '../controls/arrows'\nimport { isMouseEvent } from '../../shared/input/pointerTypes'\nimport { WindowType } from '../../shared/input/pointerTypes'\nimport { Axis, AxisType, AXSpec } from '../../shared/types/axis'\nimport { Translate } from '../../shared/motion/translate'\n\nconst clamp = (n: number, lo: number, hi: number) => Math.max(lo, Math.min(hi, n))\n\nfunction DragTracker(axis: AxisType, ownerWindow: WindowType) {\n return createDragTracker({\n ownerWindow,\n axis,\n })\n}\n\ntype Page = {\n startIndex: number\n endIndex: number\n targetScroll: number\n}\n\ntype BaseScrollTo = {\n distance: (n: number, snap: boolean) => void\n index: (n: number, direction: number) => void\n}\n\ntype ThumbLayoutItem = { el: HTMLElement; start: number; end: number; size: number }\n\ntype Slide = { target: number; cells: { element: HTMLElement; index: number }[] }\n\ninterface ThumbnailSliderProps {\n children: ReactNode\n position: ThumbnailPosition\n thumbSize?: number\n className?: string\n style?: React.CSSProperties\n thumbnailWidth?: number | string\n thumbnailHeight?: number | string\n indexChannel?: ReturnType<typeof createIndexChannel>\n onSelectThumb?: (index: number) => void\n thumbnailsCenter?: boolean\n thumbnailsContainerWidth?: number | string\n thumbnailsContainerHeight?: number | string\n thumbnailsContainerClassName?: string\n thumbnailsContainerStyle?: React.CSSProperties\n thumbnailItemClassName?: string\n thumbnailItemStyle?: React.CSSProperties\n gap?: number\n freeScroll?: boolean\n groupCells?: boolean\n loop?: boolean\n direction?: 'ltr' | 'rtl';\n axis?: 'x' | 'y';\n skipSnaps?: boolean;\n centerActiveThumb?: boolean;\n selectDuration?: number;\n freeScrollDuration?: number;\n sliderFriction?: number;\n loadingOptions?: ThumbnailLoadingOptions;\n introOptions?: ThumbnailIntroOptions;\n breakpointMap?: BreakpointMap;\n rippleEnabled?: boolean;\n rippleClassName?: string;\n showArrows?: boolean;\n arrowStyles?: React.CSSProperties;\n arrowClassName?: string;\n prevArrowStyles?: React.CSSProperties;\n prevArrowClassName?: string;\n nextArrowStyles?: React. CSSProperties;\n nextArrowClassName?: string;\n renderArrows?: (args: ArrowRenderArgs & { dir: \"prev\" | \"next\" }) => React.ReactNode;\n renderPrevArrow?: (args: ArrowRenderArgs) => React.ReactNode;\n renderNextArrow?: (args: ArrowRenderArgs) => React.ReactNode;\n}\n\nexport default function ThumbnailSlider({\n children,\n position,\n thumbSize,\n className,\n style,\n thumbnailWidth,\n thumbnailHeight,\n indexChannel,\n onSelectThumb,\n thumbnailsCenter,\n thumbnailsContainerWidth,\n thumbnailsContainerHeight,\n thumbnailsContainerClassName,\n thumbnailsContainerStyle,\n thumbnailItemClassName,\n thumbnailItemStyle,\n gap = 8,\n freeScroll = true,\n groupCells = false,\n loop = false,\n direction = 'ltr',\n skipSnaps = false,\n centerActiveThumb = false,\n selectDuration = 25,\n freeScrollDuration = 43,\n sliderFriction = 0.68,\n loadingOptions,\n introOptions,\n breakpointMap = { xs: 0, sm: 640, md: 768, lg: 1024, xl: 1280 },\n rippleEnabled,\n rippleClassName,\n showArrows = false,\n arrowStyles,\n arrowClassName,\n prevArrowStyles,\n prevArrowClassName,\n nextArrowStyles,\n nextArrowClassName,\n renderArrows,\n renderPrevArrow,\n renderNextArrow\n}: ThumbnailSliderProps) {\n const isHorizontal = position === 'top' || position === 'bottom'\n const axis = Axis(isHorizontal);\n const isRtl = direction === 'rtl' ? true : false\n const sign = isHorizontal && isRtl ? -1 : 1;\n const containerRef = useRef<HTMLDivElement | null>(null)\n const trackRef = useRef<HTMLDivElement | null>(null)\n const scopeId = useId().replace(/:/g, \"-\");\n const channelRef = useRef(indexChannel ?? createIndexChannel())\n const [thumbLong, setThumbLong] = useState<number>(thumbSize ?? 0)\n const [thumbCross, setThumbCross] = useState<number>(0)\n const [contentLength, setContentLength] = useState<number>(0)\n const [containerLength, setContainerLength] = useState<number>(0)\n const locationRef = useRef<Vector1DType | null>(null)\n const previousLocationRef = useRef<Vector1DType | null>(null)\n const offsetLocationRef = useRef<Vector1DType | null>(null)\n const targetRef = useRef<Vector1DType | null>(null)\n const bodyRef = useRef<ScrollBodyType | null>(null)\n const translateRef = useRef<ReturnType<typeof Translate> | null>(null)\n const animRef = useRef<AnimationsType | null>(null)\n const limitRef = useRef<LimitType | null>(null)\n const boundsRef = useRef<ScrollBoundsType | null>(null)\n const povRef = useRef<PercentOfViewType | null>(null)\n const isAnimatingRef = useRef(false)\n const prevButtonRef = useRef<HTMLDivElement>(null)\n const nextButtonRef = useRef<HTMLDivElement>(null)\n const pagesRef = useRef<Page[]>([])\n type SnapMode = 'thumb' | 'base'\n const snapModeRef = useRef<SnapMode>('base')\n const pointerDownRef = useRef(false)\n const isPointerDown = useRef(false)\n const isClickRef = useRef(true)\n const xRef = useRef(0)\n const dragX = useRef(0)\n const previousDragX = useRef(0)\n const dragMoveTime = useRef<Date | null>(null)\n const sliderVelocity = useRef(0)\n const selectedIndexRef = useRef<number>(channelRef.current.get().index ?? 0)\n const rawKids = Children.toArray(children).filter(isValidElement) as ReactElement<ThumbnailSliderProps>[]\n const count = rawKids.length\n const baseOffsetRef = useRef(0);\n const downTargetRef = useRef<EventTarget | null>(null)\n const [inView, setInView] = useState(false);\n const [isReady, setIsReady] = useState(false);\n const readyRafRef = useRef<number | null>(null);\n const readyPaintedRef = useRef(false);\n const contentSizeRef = useRef(0)\n const loopLimitRef = useRef<ReturnType<typeof Limit> | null>(null)\n const scrollSnapsRef = useRef<number[]>([])\n const scrollContentSizeRef = useRef(0)\n const scrollLimitRef = useRef<BaseLimit | null>(null)\n const scrollTargetRef = useRef<ScrollTargetType | null>(null)\n const scrollToRef = useRef<BaseScrollTo | null>(null)\n const indexCurrentRef = useRef<CounterType | null>(null)\n const indexPreviousRef = useRef<CounterType | null>(null)\n const [buildKey, setBuildKey] = useState(0)\n const loopStableRef = useRef<boolean | null>(null)\n const [geomKey, setGeomKey] = useState(0)\n const lastGeomSigRef = useRef<string>('')\n const [wrap, setWrap] = useState(false)\n const isWrapping = useRef(false)\n const clonesCountRef = useRef(0)\n const visibleThumbsRef = useRef(1)\n const layoutRef = useRef<{ originals: ThumbLayoutItem[]; cw: number } | null>(null)\n const thumbCells = useRef<{ element: HTMLElement; index: number }[]>([]);\n const [clonedChildren, setClonedChildren] = useState<ReactElement<any>[]>([]);\n const lastCloneSigRef = useRef<string>('');\n const slidesRef = useRef<Slide[]>([])\n const [slidesState, setSlidesState] = useState<Slide[]>([])\n const [isMeasured, setIsMeasured] = useState(false)\n const cellToSlideRef = useRef<number[]>([])\n const sliderWidth = useRef(0)\n const [layoutReady, setLayoutReady] = useState(false)\n const prevActiveRef = useRef<number>(-1)\n const draggingAttr = 'data-rmg-drag';\n const activePointerIdRef = useRef<number | null>(null);\n const guardsStoreRef = useRef<ReturnType<typeof EventStore> | null>(null);\n\n const AX: AXSpec = useMemo(() => {\n const main = isHorizontal ? 'x' : 'y';\n const cross = isHorizontal ? 'y' : 'x';\n const sizeKey = isHorizontal ? 'width' : 'height';\n const clientKey = isHorizontal ? 'clientWidth' : 'clientHeight';\n const startKey = isHorizontal ? 'left' : 'top';\n const endKey = isHorizontal ? 'right' : 'bottom';\n\n const translate = (n: number) =>\n isHorizontal ? `translate3d(${n}px,0,0)` : `translate3d(0,${n}px,0)`;\n\n const place = (n: number) =>\n isHorizontal\n ? `translateX(${n}px) scale(var(--rmg-scale, 1))`\n : `translateY(${n}px) scale(var(--rmg-scale, 1))`;\n\n const wheelDelta = (e: WheelEvent) => (isHorizontal ? e.deltaX : e.deltaY);\n\n return { main, cross, sizeKey, clientKey, startKey, endKey, translate, place, wheelDelta };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [position]);\n\n useEffect(() => {\n const root = containerRef.current;\n if (!root) return;\n\n let canceled = false;\n\n if (typeof IntersectionObserver === 'undefined') {\n setInView(true);\n return;\n }\n\n const io = new IntersectionObserver(\n (entries) => {\n if (canceled) return;\n const ent = entries[0];\n setInView(!!ent?.isIntersecting);\n },\n {\n root: null,\n rootMargin: '200px 0px 200px 0px',\n threshold: 0.01,\n }\n );\n\n io.observe(root);\n\n return () => {\n canceled = true;\n io.disconnect();\n };\n }, []);\n\n function setWrapSafe(next: boolean) {\n if (loopStableRef.current === next) return\n loopStableRef.current = next\n\n setWrap(next)\n isWrapping.current = next\n\n setLayoutReady(false)\n\n setIsReady(false)\n readyPaintedRef.current = false\n\n setBuildKey((k) => k + 1)\n }\n\n function mod(n: number, m: number) {\n return ((n % m) + m) % m\n }\n\n function getCenterScroll(i: number) {\n const lay = layoutRef.current\n if (!lay?.originals?.length) return 0\n\n const o = lay.originals[i]\n if (!o) return 0\n\n const view = lay.cw || containerLength || 0\n const size = o.size\n\n const raw = o.start - (view - size) / 2\n\n if (!wrap) {\n const maxScroll = Math.max(0, contentLength - view)\n return clamp(raw, 0, maxScroll)\n }\n\n const W = contentLength || sliderWidth.current || 0\n if (!W) return 0\n return mod(raw, W)\n }\n\n function setTargetToScroll(scroll: number) {\n const tgt = targetRef.current\n if (!tgt) return\n\n const desired = -scroll\n\n if (!wrap) {\n tgt.set(desired)\n return\n }\n\n const W = contentLength || sliderWidth.current || 0\n if (!W) {\n tgt.set(desired)\n return\n }\n\n const cur = tgt.get()\n const c0 = desired\n const c1 = desired + W\n const c2 = desired - W\n\n const best =\n Math.abs(c0 - cur) <= Math.abs(c1 - cur) && Math.abs(c0 - cur) <= Math.abs(c2 - cur) ? c0 :\n Math.abs(c1 - cur) <= Math.abs(c2 - cur) ? c1 : c2\n\n tgt.set(best)\n }\n\n function cloneThumb(\n child: ReactElement<any>,\n key: string,\n canonicalIndex: number,\n elementIndex: number\n ) {\n return cloneElement(child as ReactElement<any>, {\n key,\n ['data-rmg-thumb-index' as any]: String(canonicalIndex),\n\n ref: (el: HTMLElement | null) => {\n if (!el) return;\n if (!thumbCells.current.some((c) => c.element === el)) {\n thumbCells.current.push({ element: el, index: elementIndex });\n }\n },\n\n style: {\n position: 'absolute',\n top: 0,\n left: 0,\n width: thumbnailWidth,\n height: thumbnailHeight,\n cursor: 'pointer',\n userSelect: 'none',\n ...(thumbnailItemStyle || {}),\n ...(child.props?.style || {}),\n },\n\n className: [cls.thumb, thumbnailItemClassName, child.props?.className]\n .filter(Boolean)\n .join(' '),\n\n draggable: false,\n });\n }\n\n function computeCloneSig(originals: number, per: number) {\n return `${originals}|per=${per}|wrap=${wrap ? 1 : 0}`;\n }\n\n useEffect(() => {\n const el = trackRef.current;\n if (!el) return;\n\n const ro = new ResizeObserver(() => {\n const rawKids = Children\n .toArray(children)\n .filter(isValidElement) as ReactElement<any>[];\n\n const originals = rawKids.length;\n\n if (originals < 1) {\n clonesCountRef.current = 0;\n thumbCells.current = [];\n setClonedChildren([]);\n sliderWidth.current = 0;\n layoutRef.current = null;\n\n setWrapSafe(false);\n slidesRef.current = [];\n setSlidesState([]);\n cellToSlideRef.current = [];\n return;\n }\n\n const allEls = Array.from(el.children) as HTMLElement[];\n const clonesBefore = clonesCountRef.current;\n const clonesAfter = clonesBefore;\n const originalEls = allEls.slice(clonesBefore, allEls.length - clonesAfter);\n\n const cw = (el as any)[AX.clientKey] as number;\n\n let sum = 0;\n let count = 0;\n for (const slot of originalEls) {\n const w = slot.getBoundingClientRect()[AX.sizeKey];\n if (w === 0) {\n requestAnimationFrame(() => ro.observe(el));\n return;\n }\n if (sum + w <= cw) {\n sum += w;\n count++;\n } else {\n count++;\n break;\n }\n }\n\n const per = Math.max(2, Math.min(originals, count));\n\n const shouldLoop = wrap;\n clonesCountRef.current = shouldLoop ? per : 0;\n if (visibleThumbsRef.current !== per) visibleThumbsRef.current = per;\n\n const sig = computeCloneSig(originals, per);\n if (sig === lastCloneSigRef.current) return;\n lastCloneSigRef.current = sig;\n\n const slides: ReactElement<any>[] = [];\n thumbCells.current = [];\n\n if (shouldLoop) {\n slides.push(\n ...rawKids.slice(-per).map((c, i) => {\n const canonicalIndex = originals - per + i;\n const elementIndex = -per + i;\n return cloneThumb(c, `before-${i}`, canonicalIndex, elementIndex);\n })\n );\n }\n\n slides.push(\n ...rawKids.map((c, i) => {\n const canonicalIndex = i;\n const elementIndex = i;\n return cloneThumb(c, `original-${i}`, canonicalIndex, elementIndex);\n })\n );\n\n if (shouldLoop) {\n slides.push(\n ...rawKids.slice(0, per).map((c, i) => {\n const canonicalIndex = i;\n const elementIndex = i;\n return cloneThumb(c, `after-${i}`, canonicalIndex, elementIndex);\n })\n );\n }\n\n setClonedChildren(slides);\n });\n\n ro.observe(el);\n return () => ro.disconnect();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n children,\n buildKey,\n wrap,\n gap,\n thumbSize,\n thumbLong,\n thumbnailWidth,\n thumbnailHeight,\n thumbnailItemClassName,\n thumbnailItemStyle,\n position,\n ]);\n\n function getThumbIndexFromEventTarget(t: EventTarget | null): number {\n const track = trackRef.current\n if (!track) return -1\n const el = t as HTMLElement | null\n if (!el) return -1\n\n const thumbEl = el.closest?.('[data-rmg-thumb-index]') as HTMLElement | null\n if (!thumbEl) return -1\n\n if (!track.contains(thumbEl)) return -1\n\n const raw = thumbEl.getAttribute('data-rmg-thumb-index')\n const idx = raw != null ? parseInt(raw, 10) : -1\n return Number.isFinite(idx) ? idx : -1\n }\n\n function commitThumbSelect(i: number) {\n if (i < 0 || i >= count) return;\n\n snapModeRef.current = 'thumb'\n\n setActiveThumb(i)\n\n channelRef.current.set(i, 'animated')\n onSelectThumb?.(i)\n }\n\n useEffect(() => {\n if (!thumbnailsCenter) {\n baseOffsetRef.current = 0;\n return;\n }\n if (!contentLength || !containerLength) return;\n\n if (contentLength <= containerLength) {\n baseOffsetRef.current = (containerLength - contentLength) / 2;\n } else {\n baseOffsetRef.current = 0;\n }\n }, [thumbnailsCenter, contentLength, containerLength]);\n\n useEffect(() => {\n const track = trackRef.current;\n const container = containerRef.current\n if (!track || !container) return;\n\n const schedule = () => {\n measureAndPosition()\n };\n\n function measureAndPosition() {\n const trackEl = trackRef.current;\n const container = containerRef.current\n if (!trackEl || !container) return\n\n const slideEls = Array.from(trackEl.children) as HTMLElement[];\n if (slideEls.length === 0) return;\n\n const sizes = slideEls.map((sl) => sl.getBoundingClientRect()[AX.sizeKey]);\n if (sizes.some((s) => s === 0)) {\n setTimeout(measureAndPosition, 0);\n return;\n }\n\n const contentSize =\n AX.main === \"x\" ? trackEl.scrollWidth : trackEl.scrollHeight;\n\n const clonesBefore = clonesCountRef.current;\n const beforeSizes = sizes.slice(0, clonesBefore);\n let running = -(beforeSizes.reduce((s, w) => s + w, 0) + gap * clonesBefore);\n slideEls.forEach((sl, i) => {\n sl.style.transformOrigin = 'center';\n sl.style.transform = AX.place(running * sign);\n running += sizes[i] + gap;\n });\n \n const origSizes = sizes.slice(clonesBefore, sizes.length - clonesBefore);\n let m0 = 0;\n const originalsForLayout = slideEls\n .slice(clonesBefore, slideEls.length - clonesBefore)\n .map((sl, i) => {\n const s = origSizes[i];\n const start = m0;\n const end = m0 + s;\n m0 += s + gap;\n return { el: sl, start, end, size: s };\n });\n\n layoutRef.current = {\n originals: originalsForLayout,\n cw: (trackEl as any)[AX.clientKey] as number,\n };\n\n const originalsCount = layoutRef.current?.originals?.length ?? 0;\n const innerGaps = Math.max(0, originalsCount - 1);\n const baseWidth = origSizes.reduce((sum, s) => sum + s, 0) + gap * innerGaps;\n sliderWidth.current = wrap ? baseWidth + (originalsCount > 0 ? gap : 0) : baseWidth;\n\n const cw = (trackEl as any)[AX.clientKey] as number;\n\n setContentLength(sliderWidth.current);\n\n setContainerLength(cw);\n\n const first = originalsForLayout[0]?.el;\n if (first) {\n const r = first.getBoundingClientRect();\n const long = r[AX.sizeKey];\n const cross = AX.main === 'x' ? r.height : r.width;\n\n setThumbLong(long || thumbSize || 0);\n setThumbCross(cross || 0);\n }\n \n const wantLoop = !!loop && originalsCount > 1 && contentSize > cw;\n\n const origSizesCsv = originalsForLayout.map((o) => o.size).join(\",\");\n const sig = `${origSizesCsv}|gap=${gap}|cw=${cw}|W=${contentSize}`;\n\n if (sig !== lastGeomSigRef.current) {\n lastGeomSigRef.current = sig;\n setGeomKey((k) => k + 1)\n }\n\n setWrapSafe(wantLoop);\n setIsMeasured(true);\n }\n\n const ro = new ResizeObserver(schedule);\n\n ro.observe(track);\n ro.observe(container)\n\n const vv = typeof window !== \"undefined\" ? window.visualViewport : null;\n vv?.addEventListener(\"resize\", schedule);\n\n window.addEventListener(\"resize\", schedule, { passive: true });\n\n schedule();\n\n return () => {\n ro.disconnect();\n vv?.removeEventListener(\"resize\", schedule);\n window.removeEventListener(\"resize\", schedule);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [clonedChildren, gap, wrap, loop, AX, sign, position]);\n\n useEffect(() => {\n readyPaintedRef.current = false;\n setIsReady(false);\n\n if (readyRafRef.current != null) {\n cancelAnimationFrame(readyRafRef.current);\n readyRafRef.current = null;\n }\n\n const root = containerRef.current;\n const track = trackRef.current;\n\n const canBeReady =\n !!root &&\n !!track &&\n isMeasured &&\n layoutReady &&\n sliderWidth.current > 0 &&\n slidesRef.current.length > 0 &&\n !!(thumbSize || thumbLong);\n\n if (!canBeReady) return;\n\n readyRafRef.current = requestAnimationFrame(() => {\n readyRafRef.current = requestAnimationFrame(() => {\n readyPaintedRef.current = true;\n setIsReady(true);\n readyRafRef.current = null;\n });\n });\n\n return () => {\n if (readyRafRef.current != null) {\n cancelAnimationFrame(readyRafRef.current);\n readyRafRef.current = null;\n }\n };\n }, [\n isMeasured,\n layoutReady,\n geomKey,\n buildKey,\n wrap,\n count,\n contentLength,\n containerLength,\n thumbLong,\n thumbSize,\n position,\n ]);\n\n const getSnapTargets: () => number[] = () => (slidesRef.current || []).map((s) => s.target)\n const totalWidth = () => sliderWidth.current || 0\n\n useEffect(() => {\n const containerEl = trackRef.current\n if (!containerEl) return\n\n let canceled = false\n\n let retryTimer: number | null = null\n let tries = 0\n const MAX_TRIES = 5\n\n function retry() {\n if (canceled) return\n if (tries++ >= MAX_TRIES) return\n if (retryTimer != null) window.clearTimeout(retryTimer)\n retryTimer = window.setTimeout(() => {\n buildPages()\n }, 0)\n }\n\n const rawKids = Children.toArray(children).filter(isValidElement)\n const childCount = rawKids.length\n const clonesBefore = wrap ? visibleThumbsRef.current : 0\n const clonesAfter = clonesBefore\n const cw = (containerEl as any)[AX.clientKey] as number\n\n function buildPages() {\n if (canceled || !containerEl) return\n\n const allEls = Array.from(containerEl.children) as HTMLElement[]\n const originals = allEls.slice(clonesBefore, allEls.length - clonesAfter)\n const idxMap = new Map<HTMLElement, number>(originals.map((el, i) => [el, i]))\n\n const start0 = containerEl.getBoundingClientRect()[AX.startKey]\n const data = originals.map((el) => {\n const r = el.getBoundingClientRect()\n return {\n el,\n start: r[AX.startKey] - start0,\n end: r[AX.endKey] - start0,\n }\n })\n\n const pages: { els: HTMLElement[]; target: number }[] = []\n let i = 0\n\n if (groupCells) {\n while (i < childCount) {\n const startLeft = data[i]?.start ?? 0\n const viewRight = startLeft + cw\n\n let j = i\n while (j < childCount && (data[j]?.end ?? 0) <= viewRight) j++\n if (j === i) j++\n\n const slice = originals.slice(i, j)\n const isLast = j >= childCount\n\n let target = startLeft\n if (isLast && !wrap) {\n target = Math.max(0, (sliderWidth.current || 0) - cw)\n }\n if (i === 0) target = 0\n\n pages.push({ els: slice, target })\n i = j\n }\n } else {\n const L = layoutRef.current\n if (!L || !L.originals?.length) {\n retry()\n return\n }\n\n const data = L.originals\n const cw = L.cw\n\n const maxTarget = Math.max(0, (sliderWidth.current || 0) - cw)\n const EPS = 0.5\n\n if (wrap) {\n data.forEach((d, idx) => {\n const t = idx === 0 ? 0 : d.start\n pages.push({ els: [d.el], target: t })\n })\n } else {\n for (let idx = 0; idx < data.length; idx++) {\n const d = data[idx]\n let t = idx === 0 ? 0 : d.start\n t = Math.min(t, maxTarget)\n\n if (!pages.length || Math.abs(t - pages[pages.length - 1].target) > EPS) {\n pages.push({ els: [d.el], target: t })\n }\n\n if (Math.abs(t - maxTarget) <= EPS) break\n }\n\n const winStart = maxTarget - EPS\n const winEnd = maxTarget + cw + EPS\n\n const lastEls = data\n .filter((d) => d.start < winEnd && d.end > winStart)\n .map((d) => d.el)\n\n if (lastEls.length) {\n const lastT = pages[pages.length - 1]?.target ?? -1\n if (Math.abs(lastT - maxTarget) > EPS) {\n pages.push({ els: lastEls, target: maxTarget })\n } else {\n const uniq = new Set(pages[pages.length - 1].els.concat(lastEls))\n pages[pages.length - 1].els = Array.from(uniq)\n }\n } else {\n let safeIdx = -1\n for (let i = data.length - 1; i >= 0; i--) {\n if (data[i].start <= maxTarget + EPS) {\n safeIdx = i\n break\n }\n }\n const fallback = data[Math.max(0, safeIdx)]\n if (fallback) {\n const lastT = pages[pages.length - 1]?.target ?? -1\n if (Math.abs(lastT - maxTarget) > EPS) {\n pages.push({ els: [fallback.el], target: maxTarget })\n }\n }\n }\n }\n }\n\n const newSlides = pages.map((page) => ({\n target: page.target,\n cells: page.els.map((el) => ({\n element: el,\n index: idxMap.get(el)!,\n })),\n }))\n\n const hasNaN = newSlides.some((s) => Number.isNaN(s.target))\n const unstable = hasNaN || (wrap && newSlides.length === 1)\n if (unstable) {\n retry()\n return\n }\n\n const pagesAllowLoop = newSlides.length > 1\n\n setWrap(!!loop && pagesAllowLoop && sliderWidth.current > cw)\n isWrapping.current = !!loop && pagesAllowLoop && sliderWidth.current > cw\n\n slidesRef.current = newSlides\n setSlidesState(newSlides)\n\n setLayoutReady(true)\n\n const map: number[] = []\n newSlides.forEach((s, slideIdx) => {\n s.cells.forEach((c) => {\n map[c.index] = slideIdx\n })\n })\n cellToSlideRef.current = map\n }\n\n buildPages()\n\n return () => {\n canceled = true\n if (retryTimer != null) window.clearTimeout(retryTimer)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [clonedChildren, geomKey, position]);\n\n function getPageForIndex(i: number) {\n const pages = pagesRef.current\n if (!pages.length) return null\n for (let p = 0; p < pages.length; p++) {\n const pg = pages[p]\n if (i >= pg.startIndex && i < pg.endIndex) return pg\n }\n return pages[pages.length - 1] ?? null\n }\n\n function getScrollForIndex(i: number) {\n if (centerActiveThumb) return getCenterScroll(i)\n\n if (groupCells && !freeScroll && snapModeRef.current === 'thumb') {\n const pg = getPageForIndex(i)\n if (pg) return pg.targetScroll\n }\n\n return snapModeRef.current === 'thumb'\n ? getStartSnapScroll(i)\n : getCenteredScroll(i)\n }\n\n function setActiveThumb(i: number) {\n const track = trackRef.current\n if (!track) return\n\n const kids = Array.from(track.children) as HTMLElement[]\n for (const el of kids) el.removeAttribute('data-active')\n\n const key = String(i)\n const matches = track.querySelectorAll<HTMLElement>(`[data-rmg-thumb-index=\"${CSS.escape(key)}\"]`)\n matches.forEach((el) => el.setAttribute('data-active', 'true'))\n\n prevActiveRef.current = i\n }\n\n function ensureDragStyle(scopeId: string) {\n const id = 'rmg-drag-style-' + scopeId;\n if (document.getElementById(id)) return;\n const style = document.createElement('style');\n style.id = id;\n style.textContent = `\n /* Only while data-rmg-drag is present on this slider root */\n #${scopeId}[data-rmg-drag] { cursor: grabbing !important; }\n #${scopeId}[data-rmg-drag] * { cursor: grabbing !important; }\n `;\n document.head.appendChild(style);\n }\n\n useEffect(() => {\n if (containerRef.current) ensureDragStyle(scopeId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerRef.current, scopeId]);\n\n function setDragCursor(on: boolean) {\n const root = containerRef.current;\n if (!root) return;\n\n if (on) {\n if (!root.hasAttribute(draggingAttr)) root.setAttribute(draggingAttr, '');\n return;\n }\n\n if (root.hasAttribute(draggingAttr)) root.removeAttribute(draggingAttr);\n activePointerIdRef.current = null;\n guardsStoreRef.current?.clear();\n guardsStoreRef.current = null;\n }\n\n useEffect(() => {\n const root = containerRef.current;\n if (!root) return;\n\n const onLeave = () => {\n if (pointerDownRef.current) setDragCursor(false);\n };\n const onEnter = () => {\n if (pointerDownRef.current && activePointerIdRef.current != null) setDragCursor(true);\n };\n\n root.addEventListener('mouseleave', onLeave, { passive: true });\n root.addEventListener('mouseenter', onEnter, { passive: true });\n return () => {\n root.removeEventListener('mouseleave', onLeave as any);\n root.removeEventListener('mouseenter', onEnter as any);\n };\n }, []);\n\n useEffect(() => {\n const ch = channelRef.current\n const unsub = ch.subscribe(() => {\n const { index, mode } = ch.get()\n selectedIndexRef.current = clamp(index, 0, Math.max(0, count - 1))\n setActiveThumb(selectedIndexRef.current)\n if (pointerDownRef.current) return\n\n snapModeRef.current = 'base'\n\n const scroll = getScrollForIndex(selectedIndexRef.current)\n\n if (mode === 'instant') {\n bodyRef.current?.useDuration(0).useFriction(1)\n setTargetToScroll(scroll)\n animRef.current?.start()\n } else {\n animateToScroll(scroll)\n }\n\n })\n return unsub\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [count, thumbnailsCenter, contentLength, containerLength])\n\n useEffect(() => {\n const track = trackRef.current\n if (!track) return\n const ready = !!(contentLength && containerLength && (thumbSize || thumbLong))\n if (!ready) return\n\n const maxIndex = Math.max(0, (track.children.length || count) - 1)\n const init = clamp(channelRef.current.get().index ?? 0, 0, maxIndex)\n setActiveThumb(init)\n animateToScroll(getScrollForIndex(init))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [count, contentLength, containerLength, thumbLong, thumbSize])\n\n function getCenteredScroll(i: number) {\n const lay = layoutRef.current\n if (!lay?.originals?.length) return 0\n\n const o = lay.originals[i]\n if (!o) return 0\n\n const view = lay.cw || containerLength || 0\n const size = o.size\n const centerWanted = o.start - (view - size) / 2\n const maxScroll = Math.max(0, contentLength - view)\n return clamp(centerWanted, 0, maxScroll)\n }\n\n function getStartSnapScroll(i: number) {\n const lay = layoutRef.current\n if (!lay?.originals?.length) return 0\n\n const o = lay.originals[i]\n if (!o) return 0\n\n const view = lay.cw || containerLength || 0\n const maxScroll = Math.max(0, contentLength - view)\n\n return clamp(o.start, 0, maxScroll)\n }\n\n function animateToScroll(scroll: number) {\n const isNarrow = thumbnailsCenter && contentLength <= containerLength\n if (isNarrow) return\n\n bodyRef.current?.useBaseDuration().useBaseFriction()\n\n setTargetToScroll(scroll)\n\n animRef.current?.start()\n }\n\n function indexFromX(loc: number) {\n const x = -loc\n const targets = getSnapTargets()\n const W = totalWidth()\n if (!targets.length) return 0\n let best = 0\n let min = Infinity\n for (let i = 0; i < targets.length; i++) {\n const base = targets[i]\n const candidates = !W || !wrap ? [base] : [base, base + W, base - W]\n for (const c of candidates) {\n const d = Math.abs(c - x)\n if (d < min) {\n min = d\n best = i\n }\n }\n }\n return best\n }\n\n function positionSlider() {\n const base = baseOffsetRef.current || 0\n const x = xRef.current || 0\n translateRef.current?.to((x + base) * sign)\n }\n\n function updateActiveIndexFromX(loc: number) {\n const indexCurrent = indexCurrentRef.current\n if (!indexCurrent) return\n\n const idxFromLoc = indexFromX(loc)\n const canonical = indexCurrent.get()\n\n if (idxFromLoc === canonical) return\n\n if (!pointerDownRef.current && isAnimatingRef.current) {\n return\n }\n\n indexCurrent.set(idxFromLoc)\n selectedIndexRef.current = idxFromLoc\n }\n\n function scrollToIndex(\n requested: number,\n opts: { jump?: boolean; direction?: number } = {}\n ) {\n const { jump = false, direction } = opts\n const indexCurrent = indexCurrentRef.current\n if (!scrollToRef.current || !bodyRef.current || !indexCurrent) return\n\n const targetIndex = indexCurrent.clone().set(requested).get()\n\n if (jump) {\n bodyRef.current.useDuration(0)\n } else {\n bodyRef.current.useBaseDuration().useBaseFriction()\n }\n\n const dir = typeof direction === 'number' ? direction : 0\n\n scrollToRef.current.index(targetIndex, dir)\n }\n\n function clampIndex(i: number, len: number) {\n return Math.max(0, Math.min(len - 1, i))\n }\n\n function previous() {\n const scrollTo = scrollToRef.current\n const body = bodyRef.current\n const indexCur = indexCurrentRef.current\n const len = slidesRef.current?.length ?? 0\n if (!scrollTo || !body || !indexCur || !len) return\n\n const cur = indexCur.get()\n const target = wrap\n ? ((cur - 1) % len + len) % len\n : clampIndex(cur - 1, len)\n\n body.useBaseDuration().useBaseFriction()\n scrollToIndex(target, { direction: 1 })\n }\n\n function next() {\n const scrollTo = scrollToRef.current\n const body = bodyRef.current\n const indexCur = indexCurrentRef.current\n const len = slidesRef.current?.length ?? 0\n if (!scrollTo || !body || !indexCur || !len) return\n\n const cur = indexCur.get()\n const target = wrap\n ? ((cur + 1) % len + len) % len\n : clampIndex(cur + 1, len)\n\n body.useBaseDuration().useBaseFriction()\n scrollToIndex(target, { direction: -1 })\n }\n\n useEffect(() => {\n const root = containerRef.current\n const track = trackRef.current\n if (\n !root || \n !track || \n !slidesRef.current?.length ||\n !layoutReady ||\n !isMeasured ||\n sliderWidth.current === 0\n ) {\n return\n }\n\n const isNarrow =\n !wrap && thumbnailsCenter && contentLength <= containerLength\n\n const base =\n isNarrow ? (containerLength - contentLength) / 2 : 0\n\n baseOffsetRef.current = base\n\n const startIdx = selectedIndexRef.current || 0;\n\n const location = Vector1D(0);\n const previousLocation = Vector1D(0);\n const offsetLocation = Vector1D(0);\n const target = Vector1D(0);\n\n locationRef.current = location;\n previousLocationRef.current = previousLocation;\n offsetLocationRef.current = offsetLocation;\n targetRef.current = target;\n\n const W = sliderWidth.current || 0\n\n const len = slidesRef.current.length || 1\n const counterMax = len - 1\n const startIndex = selectedIndexRef.current || 0\n\n const indexCurrent = Counter(counterMax, startIndex, true)\n const indexPrevious = Counter(counterMax, startIndex, true)\n\n indexCurrentRef.current = indexCurrent\n indexPreviousRef.current = indexPrevious\n\n contentSizeRef.current = W\n scrollContentSizeRef.current = W\n\n const scrollSnaps = slidesRef.current.map((slide) => {\n return -(slide.target)\n })\n scrollSnapsRef.current = scrollSnaps\n\n const initialSnap = scrollSnaps[startIdx] ?? 0\n\n location.set(initialSnap);\n previousLocation.set(initialSnap);\n offsetLocation.set(initialSnap);\n target.set(initialSnap);\n xRef.current = initialSnap;\n\n translateRef.current = Translate(track, AX);\n translateRef.current?.to((initialSnap + base) * sign)\n\n selectedIndexRef.current = startIdx;\n\n const minSnap = Math.min(...scrollSnaps)\n const maxSnap = Math.max(...scrollSnaps)\n\n loopLimitRef.current = wrap ? Limit(-W, 0) : Limit(minSnap, maxSnap)\n\n const baseLimit = wrap ? createBaseLimit(-W, 0) : createBaseLimit(minSnap, maxSnap)\n scrollLimitRef.current = baseLimit\n\n if (loopLimitRef.current) {\n scrollTargetRef.current = ScrollTarget(\n wrap,\n scrollSnaps,\n W,\n loopLimitRef.current,\n target\n )\n }\n\n function scrollTo(target: BaseTarget): void {\n const indexCurrent = indexCurrentRef.current\n const indexPrevious = indexPreviousRef.current\n if (!indexCurrent || !indexPrevious) return\n\n const distanceDiff = target.distance\n const indexDiff = target.index !== indexCurrent.get()\n\n targetRef.current!.add(distanceDiff)\n\n if (distanceDiff) {\n if (bodyRef.current!.duration()) {\n isAnimatingRef.current = true;\n animRef.current!.start()\n } else {\n bodyRef.current!.seek()\n positionSlider()\n }\n }\n\n if (indexDiff) {\n indexPrevious.set(indexCurrent.get())\n indexCurrent.set(target.index)\n\n const idx = indexCurrent.get()\n selectedIndexRef.current = idx\n\n setActiveThumb(idx)\n }\n }\n\n const baseScrollTo: BaseScrollTo = {\n distance(n, snap) {\n const st = scrollTargetRef.current\n if (!st) return\n const target = st.byDistance(n, snap)\n scrollTo(target)\n },\n index(n, direction) {\n const st = scrollTargetRef.current\n const indexCurrent = indexCurrentRef.current\n if (!st || !indexCurrent) return\n\n const targetIndex = indexCurrent.clone().set(n)\n const target = st.byIndex(targetIndex.get(), direction)\n\n scrollTo(target)\n },\n }\n\n scrollToRef.current = baseScrollTo\n\n const loLimit = Limit(-W, 0)\n const looper = wrap && W > 0\n ? ScrollLooper(\n W,\n loLimit,\n locationRef.current!,\n [locationRef.current!, previousLocationRef.current!, offsetLocationRef.current!, targetRef.current!]\n )\n : null\n\n const body = ScrollBody(location, offsetLocation, previousLocation, target, selectDuration, sliderFriction)\n bodyRef.current = body\n\n if (!wrap) {\n const cw = (track as any)[AX.clientKey] as number;\n const min = -(Math.max(0, sliderWidth.current - cw))\n const max = 0\n limitRef.current = Limit(isNaN(min) ? 0 : min, max)\n\n povRef.current = PercentOfView(cw)\n boundsRef.current = ScrollBounds(\n limitRef.current,\n offsetLocationRef.current!,\n targetRef.current!,\n bodyRef.current!,\n povRef.current,\n selectDuration\n )\n } else {\n limitRef.current = null\n boundsRef.current = null\n povRef.current = null\n }\n\n const anim = Animations(\n document,\n window as WindowType,\n () => {\n if (!wrap) {\n boundsRef.current?.constrain(pointerDownRef.current)\n }\n\n bodyRef.current?.seek()\n\n if (wrap && W > 0) {\n const body = bodyRef.current!\n const dir = body.direction() || Math.sign(targetRef.current!.get() - locationRef.current!.get()) || 0\n looper?.loop(dir)\n }\n\n xRef.current = locationRef.current!.get()\n },\n (alpha) => {\n const body = bodyRef.current\n const shouldSettle = body ? body.settled() : true\n const idle = shouldSettle && !pointerDownRef.current\n if (idle) {\n animRef.current?.stop()\n isAnimatingRef.current = false\n }\n const cur = locationRef.current!.get()\n const prev = previousLocationRef.current!.get()\n const loc = cur * alpha + prev * (1 - alpha)\n offsetLocationRef.current!.set(loc)\n xRef.current = loc\n positionSlider()\n updateActiveIndexFromX(loc)\n }\n )\n animRef.current = anim\n anim.init()\n\n const dragStore = EventStore()\n const moveStore = EventStore()\n const tracker = DragTracker(axis, window as WindowType)\n\n let isMouse = false\n let startMain = 0\n let startCross = 0\n let preventScroll = false\n\n function addDragEvents() {\n const node: any = isMouse ? document : root\n moveStore\n .add(node, 'touchmove', onMove as any)\n .add(node, 'touchend', onUp as any)\n .add(node, 'mousemove', onMove as any, { passive: false })\n .add(node, 'mouseup', onUp as any)\n }\n\n function onDown(evt: PointerEvent) {\n const isMouseEvt = isMouseEvent(evt as any, window as any)\n isMouse = isMouseEvt\n if (isMouseEvt && (evt as MouseEvent).button !== 0) return\n\n downTargetRef.current = evt.target\n\n setDragCursor(true);\n\n pointerDownRef.current = true\n isPointerDown.current = true\n isClickRef.current = true\n\n tracker.pointerDown(evt as any)\n startMain = tracker.readPoint(evt as any, AX.main)\n startCross = tracker.readPoint(evt as any, AX.cross)\n\n bodyRef.current!.useFriction(0).useDuration(0)\n targetRef.current!.set(locationRef.current!.get())\n\n addDragEvents()\n animRef.current?.start()\n }\n\n const freeBoost = { mouse: 500, touch: 600 }\n function forceBoost(rawForce: number) {\n const type = isMouse ? 'mouse' : 'touch'\n return rawForce * (freeBoost[type as 'mouse' | 'touch'])\n }\n\n function onMove(evt: PointerEvent) {\n const isTouchEvt = !isMouseEvent(evt as any, window as any)\n if (isTouchEvt && (evt as any).touches?.length >= 2) return onUp(evt)\n\n if (pointerDownRef.current && activePointerIdRef.current != null) setDragCursor(true);\n\n const lastMain = tracker.readPoint(evt as any, AX.main)\n const lastCross = tracker.readPoint(evt as any, AX.cross)\n const diffMain = Math.abs(lastMain - startMain)\n const diffCross = Math.abs(lastCross - startCross)\n\n if (diffMain > 5 || diffCross > 5) isClickRef.current = false\n\n if (!preventScroll && !isMouse) {\n if (!('cancelable' in evt) || !(evt as any).cancelable) return onUp(evt)\n preventScroll = diffMain > diffCross\n if (!preventScroll) return onUp(evt)\n }\n\n const { dx, dy } = tracker.pointerMove(evt as any)\n const deltaMain = (AX.main === 'x' ? dx : dy) * sign\n\n previousDragX.current = dragX.current;\n dragX.current = lastMain * sign\n\n sliderVelocity.current = deltaMain;\n dragMoveTime.current = new Date();\n\n bodyRef.current!.useFriction(0.3).useDuration(0.75);\n targetRef.current!.add(deltaMain);\n\n animRef.current?.start()\n if ((evt as any).cancelable) evt.preventDefault?.()\n }\n\n function onUp(evt: PointerEvent) {\n isPointerDown.current = false\n preventScroll = false\n pointerDownRef.current = false\n moveStore.clear()\n\n setDragCursor(false);\n\n if (isClickRef.current) {\n const idx = getThumbIndexFromEventTarget(evt.target)\n\n if (idx >= 0) {\n commitThumbSelect(idx)\n isMouse = false\n return\n }\n }\n\n if (freeScroll === false) {\n const end = tracker.pointerUp(evt as any)\n let rawForce = (AX.main === 'x' ? end.fx : end.fy)\n\n if (isRtl) rawForce = -rawForce\n\n const isMouseEvt = isMouseEvent(evt as any, window as any)\n const snapForceBoost = { mouse: 300, touch: 400 }\n const boost = snapForceBoost[isMouseEvt ? 'mouse' : 'touch']\n\n const boostedForce = rawForce * boost\n\n const baseScrollTarget = scrollTargetRef.current\n const baseScrollTo = scrollToRef.current\n const body = bodyRef.current\n\n if (!baseScrollTarget || !baseScrollTo || !body) {\n return\n }\n\n function allowedForce(force: number): number {\n const len = slidesRef.current.length || 1\n if (!len || !baseScrollTarget) return 0\n\n const curIndex = selectedIndexRef.current || 0\n const dir = mathSign(force)\n\n if (dir === 0) return 0\n\n if (!skipSnaps) {\n const dirIndex = dir * -1\n let nextIndex = curIndex + dirIndex\n\n if (!wrap) {\n if (nextIndex < 0 || nextIndex > len - 1) {\n nextIndex = curIndex\n }\n } else {\n nextIndex = ((nextIndex % len) + len) % len\n }\n\n const dirBump = slidesRef.current.length === 2 ? dir : 0;\n const nextTarget = baseScrollTarget.byIndex(nextIndex, dirBump)\n return nextTarget.distance\n }\n\n const baseTarget = baseScrollTarget.byDistance(force, true)\n let { index: proposedIndex } = baseTarget\n const { distance } = baseTarget\n\n const currentIndex = curIndex\n\n if (proposedIndex !== currentIndex) {\n if (!wrap) {\n proposedIndex = Math.max(0, Math.min(len - 1, proposedIndex))\n const clamped = baseScrollTarget.byIndex(proposedIndex, dir)\n return clamped.distance\n }\n return distance\n }\n\n const dirIndex = dir * -1\n let nextIndex = currentIndex + dirIndex\n\n if (wrap) {\n nextIndex = ((nextIndex % len) + len) % len\n } else {\n nextIndex = Math.max(0, Math.min(len - 1, nextIndex))\n if (nextIndex === currentIndex) {\n return 0\n }\n }\n\n const dirBump = slidesRef.current.length === 2 ? dir : 0;\n\n const forced = baseScrollTarget.byIndex(nextIndex, dirBump)\n return forced.distance\n }\n \n const force = allowedForce(boostedForce)\n\n const baseSpeed = selectDuration\n const baseFriction = sliderFriction\n const forceFactor = factorAbs(boostedForce, force)\n const speed = baseSpeed - 10 * forceFactor\n const friction = baseFriction + forceFactor / 50\n\n body.useDuration(speed).useFriction(friction)\n\n baseScrollTo.distance(force, true)\n } else {\n const end = tracker.pointerUp(evt as any)\n const raw = (AX.main === 'x' ? end.fx : end.fy)\n const boosted = forceBoost(raw)\n const force = boosted\n const factor = Math.min(1, Math.abs(raw) > 0 ? Math.abs((Math.abs(boosted) - Math.abs(force)) / (raw || 1)) : 0)\n const speed = freeScrollDuration - 10 * factor\n const friction = sliderFriction + factor / 50\n bodyRef.current!.useDuration(speed).useFriction(friction)\n\n targetRef.current!.add(force)\n\n anim.start()\n isMouse = false\n }\n }\n\n dragStore\n .add(root, 'dragstart', (evt) => (evt as Event).preventDefault(), { passive: false })\n .add(root, 'touchstart', onDown as any)\n .add(root, 'mousedown', onDown as any, { passive: true })\n .add(root, 'touchcancel', onUp as any)\n .add(root, 'contextmenu', onUp as any)\n\n function onWheel(e: WheelEvent) {\n const primary = isHorizontal ? e.deltaX : e.deltaY\n const primaryAbs = Math.abs(primary)\n const crossAbs = Math.abs(isHorizontal ? e.deltaY : e.deltaX)\n if (primaryAbs <= crossAbs) return\n\n if (contentLength <= containerLength) return;\n\n const cur = (offsetLocationRef.current?.get() ?? 0) - (AX.wheelDelta(e) * sign);\n let next = cur;\n if (!wrap && limitRef.current) next = limitRef.current.constrain(cur);\n\n targetRef.current?.set(next);\n bodyRef.current?.useDuration(0).useFriction(1);\n\n animRef.current?.start();\n xRef.current = next;\n positionSlider();\n if ((e as any).cancelable) e.preventDefault?.();\n }\n root.addEventListener('wheel', onWheel as any, { passive: false })\n\n return () => {\n dragStore.clear()\n moveStore.clear()\n root.removeEventListener('wheel', onWheel as any)\n animRef.current?.destroy()\n animRef.current = null\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [count, contentLength, containerLength, position, slidesState.length, layoutReady, geomKey, isMeasured, wrap]);\n\n useEffect(() => {\n const isNarrow =\n !wrap && thumbnailsCenter && contentLength <= containerLength\n\n const base = isNarrow ? baseOffsetRef.current : 0\n\n const min = -(Math.max(0, contentLength - containerLength))\n const max = 0\n\n const nextLimit = Limit(isNaN(min) ? 0 : min, max)\n limitRef.current = nextLimit\n\n if (pointerDownRef.current) return\n if (isAnimatingRef.current) return\n\n const cur = targetRef.current?.get() ?? 0\n const clamped = nextLimit.constrain(cur)\n\n if (Math.abs(clamped - cur) < 0.001) return\n\n locationRef.current?.set(clamped)\n previousLocationRef.current?.set(clamped)\n offsetLocationRef.current?.set(clamped)\n targetRef.current?.set(clamped)\n xRef.current = clamped\n\n translateRef.current?.to((clamped + base) * sign)\n }, [contentLength, containerLength, thumbnailsCenter, sign, wrap])\n\n useEffect(() => {\n if (!contentLength || !containerLength || !(thumbSize || thumbLong)) return\n const i = clamp(channelRef.current.get().index ?? 0, 0, Math.max(0, count - 1))\n animateToScroll(getScrollForIndex(i))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [contentLength, containerLength, thumbLong, thumbSize, count])\n\n const normalizedLoading = useMemo(() => {\n const src = loadingOptions ?? {};\n return {\n isLoading: src.isLoading,\n skeletonCount: src.skeletonCount,\n renderLoading: src.renderLoading,\n };\n }, [loadingOptions]);\n\n const normalizedIntro = useMemo(() => {\n const src = introOptions ?? {};\n return {\n renderIntro: src.renderIntro,\n staggerMs: src.staggerMs ?? 40,\n transform: src.transform ?? 10,\n durationMs: src.durationMs ?? 300,\n easing: src.easing ?? 'cubic-bezier(.2,.7,.2,1)',\n };\n }, [introOptions]);\n\n const renderedThumbs = (clonedChildren.length\n ? clonedChildren\n : rawKids.map((c, i) => cloneThumb(c, `fallback-${i}`, i, i))\n );\n\n const introChildren = useMemo(() => {\n return renderedThumbs.map((child: any, i: number) => {\n if (!isValidElement(child)) return child;\n\n const el = child as React.ReactElement<any>;\n const prevStyle = (el.props?.style || {}) as React.CSSProperties;\n\n return cloneElement<any>(el, {\n ...el.props,\n 'data-rmg-index': i,\n style: {\n ...prevStyle,\n ['--rmg-intro-index' as any]: i,\n } as React.CSSProperties & Record<string, any>,\n });\n });\n }, [renderedThumbs]);\n\n const MAX_SKELETONS = 12;\n\n const fallbackCount = 6;\n\n const { cssText: skeletonCss, ssrBaseCount: skeletonCountBase } = useMemo(() => {\n return buildScopedSkeletonCountCss({\n scopeId,\n responsiveCount: normalizedLoading.skeletonCount,\n fallbackCount,\n breakpointMap,\n maxSlots: MAX_SKELETONS,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scopeId, normalizedLoading.skeletonCount, breakpointMap]);\n\n const defaultThumbSkeleton = (\n <div className={cls.thumbSkeletonOverlay} data-rmg-skel-part=\"overlay\">\n <div\n className={cls.thumbSkeletonRow}\n data-rmg-skel-part=\"row\"\n style={{\n gap,\n flexDirection: isHorizontal ? 'row' : 'column',\n }}\n >\n {Array.from({ length: MAX_SKELETONS }).map((_, i) => (\n <div\n key={`rmg-thumb-skel-${i}`}\n className={cls.thumbSkeleton}\n data-rmg-skel-slot={i + 1}\n style={{\n width: isHorizontal ? (thumbnailWidth ?? thumbSize ?? 64) : '100%',\n height: isHorizontal ? '100%' : (thumbnailHeight ?? thumbSize ?? 64),\n }}\n />\n ))}\n </div>\n </div>\n );\n\n const showLoading =\n normalizedLoading.isLoading != null\n ? !!normalizedLoading.isLoading\n : !isReady;\n\n const loadingNode = showLoading\n ? (\n normalizedLoading.renderLoading\n ? normalizedLoading.renderLoading({ layout: 'thumbnails', count: skeletonCountBase })\n : defaultThumbSkeleton\n )\n : null;\n\n const fadeClass =\n showLoading\n ? ''\n : (isReady && inView)\n ? cls.fadeInActive\n : cls.fadeInStart;\n\n const baseContainerProps: React.HTMLAttributes<HTMLDivElement> = {\n className: [cls.fade_container, fadeClass].filter(Boolean).join(' '),\n 'aria-busy': showLoading ? true : undefined,\n };\n\n const outerStyle: React.CSSProperties = {\n overflow: 'hidden',\n ...(isHorizontal\n ? { width: thumbnailsContainerWidth, height: thumbCross ? '100%' : 'auto' }\n : { height: thumbnailsContainerHeight, width: thumbLong ? '100%' : 'auto' }),\n ...(style || {}),\n }\n\n const trackStyle: React.CSSProperties = {\n width: isHorizontal ? '100%' : (thumbnailWidth ?? '100%'),\n height: isHorizontal ? (thumbnailHeight ?? '100%') : '100%',\n willChange: 'transform',\n backfaceVisibility: 'hidden',\n touchAction: 'none',\n visibility: isReady ? 'visible' : 'hidden',\n }\n\n const effectiveRippleEnabled = rippleEnabled !== false;\n const effectiveRippleClass = (rippleClassName && rippleClassName.trim().length > 0)\n ? rippleClassName\n : cls.ripple;\n\n const createRipple = useCallback((container: HTMLElement) => {\n if (!effectiveRippleEnabled || !container) return;\n\n const old = container.querySelector<HTMLElement>('[data-rmg-ripple]');\n if (old) old.remove();\n\n const rect = container.getBoundingClientRect();\n const diameter = Math.max(rect.width, rect.height);\n const radius = diameter / 2;\n const x = rect.width / 2 - radius;\n const y = rect.height / 2 - radius;\n\n const span = document.createElement('span');\n span.setAttribute('data-rmg-ripple', '');\n if (effectiveRippleClass) {\n span.className = effectiveRippleClass;\n }\n\n span.style.width = `${diameter}px`;\n span.style.height = `${diameter}px`;\n span.style.left = `${x}px`;\n span.style.top = `${y}px`;\n\n container.appendChild(span);\n span.addEventListener('animationend', () => span.remove(), { once: true });\n }, [effectiveRippleEnabled, effectiveRippleClass]);\n\n const arrowNodes = (\n <RmgArrows\n axisMain={AX.main}\n clientKey={AX.clientKey}\n wrap={wrap}\n isRtl={isRtl}\n showArrows={showArrows}\n selectedIndex={selectedIndexRef.current}\n slideCount={slidesRef.current?.length ?? 0}\n measureRef={trackRef}\n viewportMainSizeRef={sliderWidth}\n previous={previous}\n next={next}\n prevButtonRef={prevButtonRef}\n nextButtonRef={nextButtonRef}\n createRipple={createRipple}\n arrowStyles={arrowStyles}\n prevArrowStyles={prevArrowStyles}\n nextArrowStyles={nextArrowStyles}\n arrowClassName={arrowClassName}\n prevArrowClassName={prevArrowClassName}\n nextArrowClassName={nextArrowClassName}\n renderPrevArrow={renderPrevArrow}\n renderNextArrow={renderNextArrow}\n renderArrows={renderArrows}\n />\n );\n\n const inner = (\n <>\n {arrowNodes}\n <div ref={trackRef} style={trackStyle}>\n {introChildren}\n </div>\n </>\n );\n\n const root = (\n <div\n {...baseContainerProps}\n ref={containerRef}\n id={scopeId}\n data-rmg-scope={scopeId}\n className={[className, thumbnailsContainerClassName, baseContainerProps.className]\n .filter(Boolean)\n .join(' ')\n }\n style={{\n ...outerStyle,\n ...(thumbnailsContainerStyle || {}),\n ...(baseContainerProps.style || {}),\n ['--rmg-intro-stagger' as any]: `${normalizedIntro.staggerMs}ms`,\n ['--rmg-intro-transform' as any]: `${normalizedIntro.transform}px`,\n ['--rmg-intro-duration' as any]: `${normalizedIntro.durationMs}ms`,\n ['--rmg-intro-easing' as any]: normalizedIntro.easing,\n }}\n >\n {loadingNode}\n {normalizedIntro.renderIntro\n ? normalizedIntro.renderIntro(\n { active: isReady && inView, containerProps: baseContainerProps },\n inner\n )\n : inner}\n </div>\n );\n\n return (\n <>\n {skeletonCss && <style dangerouslySetInnerHTML={{ __html: skeletonCss }} />}\n {root}\n </>\n );\n}",".thumb {\n position: relative;\n border: 1px solid rgba(0,0,0,.12);\n border-radius: 6px;\n overflow: hidden;\n box-sizing: border-box;\n}\n\n.thumb::after {\n content: \"\";\n position: absolute;\n inset: 0;\n border-radius: inherit;\n pointer-events: none;\n box-shadow: 0 0 0 2px #111 inset;\n opacity: 0;\n transition: opacity 120ms ease;\n z-index: 1;\n}\n\n.thumb[data-active=\"true\"]::after {\n opacity: 1;\n}\n\n.thumb :global(img) {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n position: relative;\n z-index: 0;\n}\n\n.fadeInStart {\n opacity: 0;\n}\n\n.fadeInActive {\n opacity: 1;\n transition:\n opacity var(--rmg-intro-duration, 420ms)\n var(--rmg-intro-easing, cubic-bezier(.2,.7,.2,1));\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fadeInActive { transition: none; }\n .thumbSkeleton { animation: none; }\n}\n\n.thumbSkeletonOverlay {\n position: absolute;\n inset: 0;\n z-index: 5;\n pointer-events: none;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0.5rem;\n}\n\n.thumbSkeletonRow {\n display: flex;\n width: 100%;\n height: 100%;\n}\n\n.thumbSkeleton {\n border-radius: 6px;\n overflow: hidden;\n position: relative;\n\n background: linear-gradient(\n 90deg,\n var(--rmg-shimmer-c1, #f0f2f5) 25%,\n var(--rmg-shimmer-c2, #e6e9ef) 37%,\n var(--rmg-shimmer-c3, #f0f2f5) 63%\n );\n\n background-size: var(--rmg-shimmer-size, 400% 100%);\n animation: rmgShimmer var(--rmg-shimmer-duration, 1.2s)\n infinite var(--rmg-shimmer-timing, linear);\n}\n\n@keyframes rmgShimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n}\n\n.fade_container [data-rmg-thumb-index] > * {\n opacity: 0;\n transform: translateY(var(--rmg-intro-transform, 10px));\n\n transition:\n opacity var(--rmg-intro-duration, 300ms)\n var(--rmg-intro-easing, cubic-bezier(.2,.7,.2,1)),\n transform var(--rmg-intro-duration, 300ms)\n var(--rmg-intro-easing, cubic-bezier(.2,.7,.2,1));\n\n transition-delay: calc(\n var(--rmg-intro-index, 0) * var(--rmg-intro-stagger, 40ms)\n );\n\n will-change: opacity, transform;\n}\n\n.fade_container.fadeInActive [data-rmg-thumb-index] > * {\n opacity: 1;\n transform: translateY(0);\n}\n\n.ripple {\n position: absolute;\n border-radius: 50%;\n transform: scale(0);\n animation: ripple 600ms linear;\n background-color: rgba(0, 0, 0, 0.3);\n pointer-events: none;\n}\n\n@keyframes ripple {\n to {\n transform: scale(4);\n opacity: 0;\n }\n}","export type JumpMode = 'instant' | 'animated';\nexport type FSRequest =\n | { type: 'requestSet'; index: number; mode?: JumpMode }\n | { type: 'requestNext' }\n | { type: 'requestPrev' }\n | { type: 'center' };\n\nexport type FSEvent =\n | { type: 'internalIndex'; index: number }\n | { type: 'mounted' }\n | { type: 'unmounted' };\n\nexport type FullscreenSliderSub = {\n get: () => number;\n\n requestSet: (index: number, mode?: JumpMode) => void;\n\n requestPrev: () => void;\n requestNext: () => void;\n\n requestCenter: () => void;\n\n onEvent: (fn: (evt: FSEvent) => void) => () => void;\n\n onRequest: (fn: (req: FSRequest) => void) => () => void;\n\n setLocalIndex: (index: number) => void;\n\n destroy: () => void;\n};\n\nexport function createFullscreenSliderSub(initialIndex = 0): FullscreenSliderSub {\n let curIndex = initialIndex;\n\n const reqSubs = new Set<(r: FSRequest) => void>();\n const evtSubs = new Set<(e: FSEvent) => void>();\n\n const api: FullscreenSliderSub = {\n get: () => curIndex,\n\n requestSet(index, mode) {\n reqSubs.forEach((fn) => fn({ type: 'requestSet', index, mode }));\n },\n requestPrev() {\n reqSubs.forEach((fn) => fn({ type: 'requestPrev' }));\n },\n requestNext() {\n reqSubs.forEach((fn) => fn({ type: 'requestNext' }));\n },\n requestCenter() {\n reqSubs.forEach((fn) => fn({ type: 'center' }));\n },\n\n onEvent(fn) {\n evtSubs.add(fn);\n return () => evtSubs.delete(fn);\n },\n onRequest(fn) {\n reqSubs.add(fn);\n return () => reqSubs.delete(fn);\n },\n\n setLocalIndex(index) {\n curIndex = index;\n evtSubs.forEach((fn) => fn({ type: 'internalIndex', index }));\n },\n\n destroy() {\n reqSubs.clear();\n evtSubs.clear();\n },\n };\n\n queueMicrotask(() => {\n evtSubs.forEach((fn) => fn({ type: 'mounted' }));\n });\n\n return api;\n}","/* eslint-disable @next/next/no-img-element */\n'use client'\n\nimport React, { useEffect, useMemo, useRef } from 'react'\nimport ThumbnailSlider from '../slider/thumbnails/ThumbnailSlider'\nimport createIndexChannel from '../slider/sliderSub'\nimport type { FullscreenSliderSub } from './fullscreenSliderSub'\nimport { BreakpointMap } from '../shared/responsive'\nimport { ThumbnailPosition } from '../slider/thumbnails/types'\n\ntype FSItem = {\n thumbSrc: string\n alt?: string\n}\n\ntype ArrowRenderArgs = {\n ref: React.RefObject<HTMLDivElement | null>;\n onClick: () => void;\n hidden: boolean;\n disabled: boolean;\n createRipple: (el: HTMLElement) => void;\n className?: string;\n};\n\ninterface FullscreenThumbnailSliderProps {\n items: FSItem[]\n position: ThumbnailPosition\n fsSub: FullscreenSliderSub\n className?: string\n style?: React.CSSProperties\n thumbnailWidth?: number | string\n thumbnailHeight?: number | string\n thumbnailsCenter?: boolean;\n thumbnailsContainerWidth?: number | string\n thumbnailsContainerHeight?: number | string\n visible?: boolean\n invisible?: boolean\n fadeDurationMs?: number\n thumbnailItemClassName?: string\n thumbnailItemStyle?: React.CSSProperties\n gap?: number\n freeScroll?: boolean;\n groupCells?: boolean\n loop?: boolean\n direction?: 'ltr' | 'rtl';\n axis?: 'x' | 'y';\n skipSnaps?: boolean;\n centerActiveThumb?: boolean;\n selectDuration?: number;\n freeScrollDuration?: number;\n sliderFriction?: number;\n breakpointMap?: BreakpointMap;\n rippleEnabled?: boolean;\n rippleClassName?: string;\n showArrows?: boolean;\n arrowStyles?: React.CSSProperties;\n arrowClassName?: string;\n prevArrowStyles?: React.CSSProperties;\n prevArrowClassName?: string;\n nextArrowStyles?: React. CSSProperties;\n nextArrowClassName?: string;\n renderArrows?: (args: ArrowRenderArgs & { dir: \"prev\" | \"next\" }) => React.ReactNode;\n renderPrevArrow?: (args: ArrowRenderArgs) => React.ReactNode;\n renderNextArrow?: (args: ArrowRenderArgs) => React.ReactNode;\n}\n\nexport default function FullscreenThumbnailSlider({\n items,\n position,\n fsSub,\n className,\n style,\n thumbnailWidth,\n thumbnailHeight,\n thumbnailsCenter,\n thumbnailsContainerWidth,\n thumbnailsContainerHeight,\n visible = true,\n invisible = false,\n fadeDurationMs = 300,\n thumbnailItemClassName,\n thumbnailItemStyle,\n gap,\n freeScroll,\n groupCells,\n loop,\n direction,\n skipSnaps,\n centerActiveThumb,\n selectDuration,\n freeScrollDuration,\n sliderFriction,\n breakpointMap = { xs: 0, sm: 640, md: 768, lg: 1024, xl: 1280 },\n rippleEnabled,\n rippleClassName,\n showArrows = false,\n arrowStyles,\n arrowClassName,\n prevArrowStyles,\n prevArrowClassName,\n nextArrowStyles,\n nextArrowClassName,\n renderArrows,\n renderPrevArrow,\n renderNextArrow\n}: FullscreenThumbnailSliderProps) {\n const channelRef = useRef(createIndexChannel(fsSub.get(), 'animated'))\n\n useEffect(() => {\n const off = fsSub.onEvent((e) => {\n if (e.type === 'internalIndex') {\n channelRef.current.set(e.index, 'animated', { silent: false })\n }\n })\n return off\n }, [fsSub])\n\n useEffect(() => {\n channelRef.current.set(fsSub.get(), 'animated', { silent: true })\n }, [fsSub])\n\n const children = useMemo(\n () =>\n items.map((item, i) => (\n <button\n key={`fs-thumb-${i}`}\n type=\"button\"\n style={{\n border: 'none',\n padding: 0,\n background: 'transparent',\n cursor: 'pointer',\n }}\n >\n <img\n src={item.thumbSrc}\n alt={item.alt ?? `thumb-${i}`}\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n display: 'block',\n }}\n draggable={false}\n />\n </button>\n )),\n [items]\n )\n\n const isOpen = visible && !invisible\n\n const opacity = isOpen ? 1 : 0\n const transform = isOpen ? 'translateY(0)' : 'translateY(8px)'\n const pointerEvents: React.CSSProperties['pointerEvents'] =\n isOpen ? 'auto' : 'none'\n\n const wrapperStyle: React.CSSProperties = {\n opacity,\n transform,\n pointerEvents,\n transition: `\n opacity ${fadeDurationMs}ms cubic-bezier(.4,0,.22,1),\n transform ${fadeDurationMs}ms cubic-bezier(.4,0,.22,1)\n `,\n }\n\n return (\n <div style={wrapperStyle} className={className}>\n <ThumbnailSlider\n position={position}\n thumbnailWidth={thumbnailWidth}\n thumbnailHeight={thumbnailHeight}\n indexChannel={channelRef.current}\n style={style}\n onSelectThumb={(idx) => fsSub.requestSet(idx, 'animated')}\n thumbnailsCenter={thumbnailsCenter}\n thumbnailsContainerWidth={thumbnailsContainerWidth}\n thumbnailsContainerHeight={thumbnailsContainerHeight}\n thumbnailItemClassName={thumbnailItemClassName}\n thumbnailItemStyle={thumbnailItemStyle}\n gap={gap}\n freeScroll={freeScroll}\n groupCells={groupCells}\n loop={loop}\n direction={direction}\n skipSnaps={skipSnaps}\n centerActiveThumb={centerActiveThumb}\n selectDuration={selectDuration}\n freeScrollDuration={freeScrollDuration}\n sliderFriction={sliderFriction}\n breakpointMap={breakpointMap}\n rippleEnabled={rippleEnabled}\n rippleClassName={rippleClassName}\n showArrows={showArrows}\n arrowStyles={arrowStyles}\n arrowClassName={arrowClassName}\n prevArrowStyles={prevArrowStyles}\n prevArrowClassName={prevArrowClassName}\n nextArrowStyles={nextArrowStyles}\n nextArrowClassName={nextArrowClassName}\n renderArrows={renderArrows}\n renderPrevArrow={renderPrevArrow}\n renderNextArrow={renderNextArrow}\n >\n {children}\n </ThumbnailSlider>\n </div>\n )\n}","import * as React from 'react';\nimport styles from '../index.module.css';\nimport type { BreakpointMap, ResponsiveNumber } from '../shared/responsive';\nimport { resolveNumberFromResponsive } from '../shared/responsive';\n\n// ✅ shared hooks (update these paths/names to yours)\nimport { useInViewOnce } from '../shared/hooks/useInViewOnce';\nimport { useMediaReady } from '../shared/hooks/useMediaReady';\n\ntype GridOptions = {\n columns?: ResponsiveNumber;\n minColumnWidth?: number | string;\n gap?: ResponsiveNumber;\n rootClassName?: string;\n itemClassName?: string;\n};\n\ntype IntroConfig = {\n active: boolean;\n containerProps: React.HTMLAttributes<HTMLDivElement>;\n};\n\ntype IntroNormalized = {\n renderIntro?: (args: IntroConfig, inner: React.ReactNode) => React.ReactNode;\n staggerMs: number;\n transform: string;\n durationMs: number;\n easing: string;\n};\n\ntype LoadingNormalized = {\n isLoading?: boolean;\n renderLoading?: (args: { layout: 'grid'; count: number }) => React.ReactNode;\n};\n\nexport type GridLayoutProps = {\n cells: Array<{ id: string; node: React.ReactNode }>;\n grid: GridOptions;\n breakpoints: BreakpointMap;\n viewportWidth: number;\n\n loading: LoadingNormalized;\n intro: IntroNormalized;\n\n // fullscreen wiring from Gallery\n enableFullscreen: boolean;\n onOpen: (index: number, originEl?: HTMLElement | null) => void;\n registerExpandableImg: (index: number, node: HTMLElement | null) => void;\n\n // styling\n gridItemBaseClass?: string; // default 'rmg__grid-item'\n renderMode?: \"wrap\" | \"passthrough\";\n};\n\nexport function GridLayout({\n cells,\n grid,\n breakpoints,\n viewportWidth,\n loading,\n intro,\n enableFullscreen,\n onOpen,\n registerExpandableImg,\n gridItemBaseClass = 'rmg__grid-item',\n renderMode\n}: GridLayoutProps) {\n /* ------------------------------------------------------------------\n View + media-ready (shared hooks)\n ------------------------------------------------------------------ */\n const gridRootRef = React.useRef<HTMLDivElement | null>(null);\n\n const [inView, setInView] = React.useState(false);\n const [mediaReady, setMediaReady] = React.useState(false);\n\n // in-view once\n useInViewOnce(true, gridRootRef as any, () => setInView(true));\n\n // media ready\n useMediaReady(true, gridRootRef as any, setMediaReady);\n\n const isLoading = loading.isLoading ?? !mediaReady;\n const introActive = !isLoading && inView;\n\n /* ------------------------------------------------------------------\n Grid style\n ------------------------------------------------------------------ */\n const minWidth =\n typeof grid.minColumnWidth === 'number'\n ? `${grid.minColumnWidth}px`\n : grid.minColumnWidth ?? '160px';\n\n const gapVal = React.useMemo(() => {\n if (typeof grid.gap === 'string' && Number.isNaN(parseFloat(grid.gap))) return grid.gap;\n\n const raw = resolveNumberFromResponsive(\n grid.gap,\n typeof grid.gap === 'number' ? grid.gap : 8,\n viewportWidth,\n breakpoints\n );\n\n const px = Math.max(0, raw | 0);\n return `${px}px`;\n }, [grid.gap, viewportWidth, breakpoints]);\n\n const resolvedGridColumnCount = React.useMemo(() => {\n if (grid.columns == null) return undefined;\n const raw = resolveNumberFromResponsive(grid.columns, 1, viewportWidth, breakpoints);\n return Math.max(1, raw | 0);\n }, [grid.columns, viewportWidth, breakpoints]);\n\n const gridStyle: React.CSSProperties = {\n ['--rmg-grid-min' as any]: minWidth,\n ['--rmg-grid-gap' as any]: gapVal,\n };\n\n if (resolvedGridColumnCount && resolvedGridColumnCount > 0) {\n gridStyle.gridTemplateColumns = `repeat(${resolvedGridColumnCount}, minmax(0, 1fr))`;\n }\n\n /* ------------------------------------------------------------------\n Loading UI\n ------------------------------------------------------------------ */\n const skeletonCount = cells.length;\n\n const defaultGridSkeleton = (\n <div className={styles.gridSkeletonOverlay}>\n <div\n className={[styles.gridSkeletonGrid, grid.rootClassName || ''].filter(Boolean).join(' ')}\n style={gridStyle}\n >\n {Array.from({ length: skeletonCount }).map((_, i) => (\n <div key={`rmg-grid-skel-${i}`} className={styles.gridSkeletonItem} />\n ))}\n </div>\n </div>\n );\n\n const loadingNode = isLoading\n ? loading.renderLoading\n ? loading.renderLoading({ layout: 'grid', count: skeletonCount })\n : defaultGridSkeleton\n : null;\n\n /* ------------------------------------------------------------------\n Children\n ------------------------------------------------------------------ */\n const renderModeProp = renderMode ?? \"wrap\";\n\n const gridChildren = React.useMemo(() => {\n return cells.map((cell, index) => {\n const original = cell.node;\n\n const introStyle: React.CSSProperties & Record<string, any> = {\n [\"--rmg-intro-index\" as any]: index,\n };\n\n const baseClassName = [\n gridItemBaseClass,\n styles.gridItem,\n styles.introItem,\n grid.itemClassName || \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n // ✅ PASS-THROUGH MODE: don't wrap/clone, don't touch clicks/refs.\n // This is the mode you want for Entries, because EntryList already handles click/origin.\n if (renderModeProp === \"passthrough\") {\n return (\n <div\n key={cell.id}\n data-rmg-idx={index}\n className={baseClassName}\n style={introStyle}\n >\n {original as any}\n </div>\n );\n }\n\n // ------------------------------\n // Existing WRAP MODE (unchanged)\n // ------------------------------\n if (!React.isValidElement(original)) {\n return (\n <button\n key={cell.id}\n type=\"button\"\n data-rmg-idx={index}\n className={baseClassName}\n style={introStyle}\n onClick={(e) => {\n e.preventDefault();\n if (!enableFullscreen) return;\n onOpen(index, e.currentTarget);\n }}\n >\n {original as any}\n </button>\n );\n }\n\n const originalEl = original as React.ReactElement<any, any>;\n const origProps = (originalEl.props ?? {}) as {\n onClick?: React.MouseEventHandler<HTMLElement>;\n className?: string;\n style?: React.CSSProperties;\n };\n const origRef = (originalEl as any).ref as React.Ref<HTMLElement> | undefined;\n\n const mergedRef: React.RefCallback<HTMLElement> = (node) => {\n if (typeof origRef === \"function\") origRef(node);\n else if (origRef && typeof origRef === \"object\") (origRef as any).current = node;\n registerExpandableImg(index, node);\n };\n\n const mergedOnClick: React.MouseEventHandler<HTMLElement> = (e) => {\n origProps.onClick?.(e);\n if (e.defaultPrevented) return;\n if (!enableFullscreen) return;\n onOpen(index, e.currentTarget);\n };\n\n return React.cloneElement(originalEl, {\n key: cell.id,\n ref: mergedRef,\n onClick: mergedOnClick,\n \"data-rmg-idx\": index,\n className: [baseClassName, origProps.className || \"\"].filter(Boolean).join(\" \"),\n style: { ...(origProps.style || {}), ...introStyle },\n });\n });\n }, [\n cells,\n enableFullscreen,\n onOpen,\n registerExpandableImg,\n grid.itemClassName,\n gridItemBaseClass,\n renderModeProp,\n ]);\n\n React.useLayoutEffect(() => {\n if (renderModeProp !== \"passthrough\") return;\n\n const root = gridRootRef.current;\n if (!root) return;\n\n // Find each rendered cell wrapper by data-rmg-idx\n for (let i = 0; i < cells.length; i++) {\n const host = root.querySelector(`[data-rmg-idx=\"${i}\"]`) as HTMLElement | null;\n if (!host) {\n registerExpandableImg(i, null);\n continue;\n }\n\n // Prefer an actual img inside\n const img = host.querySelector(\"img\") as HTMLImageElement | null;\n registerExpandableImg(i, img ?? host);\n }\n\n // Cleanup: when unmounting, clear refs\n return () => {\n for (let i = 0; i < cells.length; i++) registerExpandableImg(i, null);\n };\n }, [renderModeProp, cells.length, registerExpandableImg]);\n\n /* ------------------------------------------------------------------\n Container + intro wrapper\n ------------------------------------------------------------------ */\n const containerProps: React.HTMLAttributes<HTMLDivElement> = {\n className: [\n styles.gridRoot,\n styles.introContainer,\n introActive ? styles.introActive : '',\n grid.rootClassName || '',\n ]\n .filter(Boolean)\n .join(' '),\n style: {\n ...gridStyle,\n ['--rmg-intro-stagger' as any]: `${intro.staggerMs}ms`,\n ['--rmg-intro-transform' as any]: intro.transform,\n ['--rmg-intro-duration' as any]: `${intro.durationMs}ms`,\n ['--rmg-intro-easing' as any]: intro.easing,\n },\n 'aria-busy': isLoading ? true : undefined,\n };\n\n const inner = (\n <div ref={gridRootRef} {...containerProps}>\n {gridChildren}\n </div>\n );\n\n const introWrapped = intro.renderIntro\n ? intro.renderIntro({ active: introActive, containerProps }, inner)\n : inner;\n\n return (\n <>\n {loadingNode}\n {introWrapped}\n </>\n );\n}\n","'use client';\n\nimport * as React from 'react';\n\nexport function useInViewOnce(\n enabled: boolean,\n ref: React.RefObject<HTMLElement | null>,\n onInView: () => void\n) {\n React.useEffect(() => {\n if (!enabled) return;\n const el = ref.current;\n if (!el) return;\n\n const io = new IntersectionObserver(([entry]) => {\n if (entry.isIntersecting) {\n onInView();\n io.disconnect();\n }\n }, { threshold: 0.1 });\n\n io.observe(el);\n return () => io.disconnect();\n }, [enabled, ref, onInView]);\n}","'use client';\n\nimport * as React from 'react';\n\nexport function useMediaReady(\n enabled: boolean,\n ref: React.RefObject<HTMLElement | null>,\n setReady: React.Dispatch<React.SetStateAction<boolean>>\n) {\n React.useEffect(() => {\n if (!enabled) return;\n setReady(false);\n }, [enabled, setReady]);\n\n React.useEffect(() => {\n if (!enabled) return;\n const root = ref.current;\n if (!root) return;\n\n const media = Array.from(root.querySelectorAll('img,video')) as\n (HTMLImageElement | HTMLVideoElement)[];\n\n if (media.length === 0) {\n setReady(true);\n return;\n }\n\n let cancelled = false;\n let loadedCount = 0;\n\n const tryDone = () => {\n if (cancelled) return;\n if (loadedCount >= media.length) setReady(true);\n };\n\n const offs: Array<() => void> = [];\n\n for (const el of media) {\n const mark = () => {\n if (cancelled) return;\n loadedCount += 1;\n tryDone();\n };\n\n if (el instanceof HTMLImageElement) {\n if (el.complete && el.naturalWidth > 0) { mark(); continue; }\n\n const onDone = () => {\n el.removeEventListener('load', onDone);\n el.removeEventListener('error', onDone);\n mark();\n };\n\n el.addEventListener('load', onDone);\n el.addEventListener('error', onDone);\n offs.push(() => {\n el.removeEventListener('load', onDone);\n el.removeEventListener('error', onDone);\n });\n } else {\n if (el.readyState >= 2) { mark(); continue; }\n\n const onDone = () => {\n el.removeEventListener('loadeddata', onDone);\n el.removeEventListener('error', onDone);\n mark();\n };\n\n el.addEventListener('loadeddata', onDone);\n el.addEventListener('error', onDone);\n offs.push(() => {\n el.removeEventListener('loadeddata', onDone);\n el.removeEventListener('error', onDone);\n });\n }\n }\n\n tryDone();\n\n return () => {\n cancelled = true;\n offs.forEach((off) => off());\n };\n }, [enabled, ref, setReady]);\n}","import * as React from 'react';\nimport styles from '../index.module.css';\nimport type { BreakpointMap, ResponsiveNumber } from '../shared/responsive';\nimport { parseNumberLike, resolveNumberFromResponsive } from '../shared/responsive';\n\nimport { useInViewOnce } from '../shared/hooks/useInViewOnce';\nimport { useMediaReady } from '../shared/hooks/useMediaReady';\n\nimport { Masonry, DefaultMasonrySkeleton } from './Masonry';\n\ntype MasonryOptions = {\n columns?: ResponsiveNumber;\n gap?: ResponsiveNumber;\n placement?: 'balanced' | 'roundRobin';\n estimatedItemHeight?: number;\n as?: React.ElementType;\n rootRef?: React.Ref<HTMLDivElement>;\n classNames?: {\n root?: string;\n column?: string;\n item?: string;\n };\n};\n\ntype IntroNormalized = {\n renderIntro?: any;\n staggerMs: number;\n transform: string;\n durationMs: number;\n easing: string;\n};\n\ntype LoadingNormalized = {\n isLoading?: boolean;\n renderLoading?: (args: { layout: 'masonry'; count: number }) => React.ReactNode;\n};\n\nexport type MasonryLayoutProps = {\n items: React.ReactNode[];\n masonry: MasonryOptions;\n breakpoints: BreakpointMap;\n viewportWidth: number;\n loading: LoadingNormalized;\n intro: IntroNormalized;\n skeletonCount: number;\n};\n\nfunction assignRef<T>(ref: React.Ref<T> | undefined, value: T) {\n if (!ref) return;\n if (typeof ref === 'function') ref(value);\n else (ref as any).current = value;\n}\n\nexport function MasonryLayout({\n items,\n masonry,\n breakpoints,\n viewportWidth,\n loading,\n intro,\n skeletonCount,\n}: MasonryLayoutProps) {\n const localRootRef = React.useRef<HTMLDivElement | null>(null);\n\n const [inView, setInView] = React.useState(false);\n const [mediaReady, setMediaReady] = React.useState(false);\n\n // observe whichever node is actually mounted\n useInViewOnce(true, localRootRef as any, () => setInView(true));\n useMediaReady(true, localRootRef as any, setMediaReady);\n\n const isLoading = loading.isLoading ?? !mediaReady;\n const introActive = !isLoading && inView;\n\n const DEFAULT_MASONRY_COLUMNS = 4;\n const DEFAULT_MASONRY_GAP_PX = 8;\n\n const masonryColumnCount = React.useMemo(() => {\n const raw = resolveNumberFromResponsive(\n masonry.columns,\n DEFAULT_MASONRY_COLUMNS,\n viewportWidth,\n breakpoints\n );\n return Math.max(1, (raw as any) | 0);\n }, [masonry.columns, viewportWidth, breakpoints]);\n\n const masonryGapPx = React.useMemo(() => {\n const raw = resolveNumberFromResponsive(\n masonry.gap,\n DEFAULT_MASONRY_GAP_PX,\n viewportWidth,\n breakpoints\n );\n return Math.max(0, parseNumberLike(raw as any, DEFAULT_MASONRY_GAP_PX));\n }, [masonry.gap, viewportWidth, breakpoints]);\n\n const defaultMasonrySkeleton = (\n <div className={styles.gridSkeletonOverlay}>\n <DefaultMasonrySkeleton\n count={skeletonCount}\n columnCount={masonryColumnCount}\n gapPx={masonryGapPx}\n classNames={{\n root: styles.gridSkeletonMasonryRoot,\n column: styles.gridSkeletonMasonryCol,\n item: styles.gridSkeletonItem,\n }}\n />\n </div>\n );\n\n const loadingNode = isLoading\n ? loading.renderLoading\n ? loading.renderLoading({ layout: 'masonry', count: skeletonCount })\n : defaultMasonrySkeleton\n : null;\n\n const masonryRootClassName = [\n styles.masonryRoot,\n styles.introContainer,\n introActive ? styles.introActive : '',\n masonry.classNames?.root || '',\n ]\n .filter(Boolean)\n .join(' ');\n\n // merged ref so both localRootRef + user rootRef get the node\n const mergedRootRef = React.useCallback((node: HTMLDivElement | null) => {\n localRootRef.current = node;\n assignRef(masonry.rootRef as any, node);\n }, [masonry.rootRef]);\n\n return (\n <>\n {loadingNode}\n <Masonry\n items={items}\n masonryColumns={masonry.columns}\n masonryGap={masonry.gap}\n masonryPlacement={masonry.placement ?? 'balanced'}\n masonryEstimatedItemHeight={masonry.estimatedItemHeight}\n masonryClassNames={{\n root: masonryRootClassName,\n column: [styles.masonryCol, masonry.classNames?.column].filter(Boolean).join(' '),\n item: [styles.masonryItem, masonry.classNames?.item].filter(Boolean).join(' '),\n }}\n masonryStyle={{\n ['--rmg-intro-stagger' as any]: `${intro.staggerMs}ms`,\n ['--rmg-intro-transform' as any]: intro.transform,\n ['--rmg-intro-duration' as any]: `${intro.durationMs}ms`,\n ['--rmg-intro-easing' as any]: intro.easing,\n }}\n masonryAs={masonry.as ?? 'div'}\n masonryRootRef={mergedRootRef}\n breakpoints={breakpoints}\n />\n </>\n );\n}","'use client';\n\nimport * as React from 'react';\nimport type { BreakpointMap, ResponsiveNumber } from '../shared/responsive';\nimport { parseNumberLike, resolveNumberFromResponsive } from '../shared/responsive';\n\nexport type MasonryClassNames = {\n root?: string;\n column?: string;\n item?: string;\n};\n\nexport type MasonryPlacement = 'balanced' | 'roundRobin';\n\nexport type MasonryProps = {\n items: React.ReactNode[];\n\n masonryColumns?: ResponsiveNumber;\n masonryGap?: ResponsiveNumber;\n masonryPlacement?: MasonryPlacement;\n\n masonryEstimatedItemHeight?: number;\n\n masonryClassNames?: MasonryClassNames;\n masonryStyle?: React.CSSProperties;\n\n masonryAs?: React.ElementType;\n masonryRootRef?: React.Ref<any>;\n\n breakpoints?: BreakpointMap;\n};\n\nexport const Masonry: React.FC<MasonryProps> = ({\n items,\n masonryColumns,\n masonryGap,\n masonryPlacement = 'balanced',\n masonryEstimatedItemHeight = 0,\n masonryClassNames,\n masonryStyle,\n masonryAs: RootComponent = 'div',\n masonryRootRef,\n breakpoints,\n}) => {\n const DEFAULT_MASONRY_COLUMNS = 4;\n const DEFAULT_MASONRY_GAP_PX = 8;\n\n const [viewportWidth, setViewportWidth] = React.useState(() => {\n if (typeof window === 'undefined') return 0;\n return window.innerWidth;\n });\n\n React.useEffect(() => {\n if (typeof window === 'undefined') return;\n const onResize = () => setViewportWidth(window.innerWidth);\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, []);\n\n const [heights, setHeights] = React.useState<number[]>(\n () => items.map(() => masonryEstimatedItemHeight)\n );\n\n React.useEffect(() => {\n setHeights((prev) => {\n const next: number[] = [];\n for (let i = 0; i < items.length; i++) {\n next[i] = prev[i] ?? masonryEstimatedItemHeight;\n }\n return next;\n });\n }, [items.length, masonryEstimatedItemHeight]);\n\n const columnCount = React.useMemo(() => {\n const raw = resolveNumberFromResponsive(\n masonryColumns,\n DEFAULT_MASONRY_COLUMNS,\n viewportWidth,\n breakpoints\n );\n return Math.max(1, raw | 0);\n }, [masonryColumns, viewportWidth, breakpoints]);\n\n const gapPx = React.useMemo(() => {\n const raw = resolveNumberFromResponsive(\n masonryGap,\n DEFAULT_MASONRY_GAP_PX,\n viewportWidth,\n breakpoints\n );\n return Math.max(0, parseNumberLike(raw as any, DEFAULT_MASONRY_GAP_PX));\n }, [masonryGap, viewportWidth, breakpoints]);\n\n const [colIndex, setColIndex] = React.useState<number[]>(\n () =>\n items.map((_, i) =>\n masonryPlacement === 'roundRobin' ? i % Math.max(1, columnCount) : 0\n )\n );\n\n React.useEffect(() => {\n const layout: number[] = new Array(items.length);\n\n if (masonryPlacement === 'roundRobin') {\n for (let i = 0; i < items.length; i++) {\n layout[i] = i % columnCount;\n }\n } else {\n // balanced\n const colHeights = new Array(columnCount).fill(0);\n\n for (let i = 0; i < items.length; i++) {\n const h = heights[i] ?? masonryEstimatedItemHeight;\n\n let minCol = 0;\n let minVal = colHeights[0];\n\n for (let c = 1; c < columnCount; c++) {\n if (colHeights[c] < minVal) {\n minVal = colHeights[c];\n minCol = c;\n }\n }\n\n layout[i] = minCol;\n colHeights[minCol] += h + gapPx;\n }\n }\n\n setColIndex(layout);\n }, [\n items.length,\n heights,\n columnCount,\n masonryPlacement,\n gapPx,\n masonryEstimatedItemHeight,\n ]);\n\n const handleHeight = React.useCallback((index: number, height: number) => {\n setHeights((prev) => {\n const old = prev[index];\n if (old === height) return prev;\n const next = prev.slice();\n next[index] = height;\n return next;\n });\n }, []);\n\n const columnsChildren: React.ReactNode[][] = React.useMemo(() => {\n const cols: React.ReactNode[][] = Array.from({ length: columnCount }, () => []);\n\n items.forEach((child, index) => {\n let c = colIndex[index];\n\n if (c == null || c < 0 || c >= columnCount) {\n c = masonryPlacement === 'roundRobin' ? index % columnCount : 0;\n }\n\n cols[c].push(\n <MasonryItem\n key={index}\n index={index}\n onHeight={handleHeight}\n className={masonryClassNames?.item}\n gapPx={gapPx}\n >\n {child}\n </MasonryItem>\n );\n });\n\n return cols;\n }, [\n items,\n colIndex,\n columnCount,\n masonryPlacement,\n handleHeight,\n gapPx,\n masonryClassNames?.item,\n ]);\n\n return (\n <RootComponent\n ref={masonryRootRef as any}\n className={masonryClassNames?.root}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n columnGap: gapPx,\n rowGap: 0,\n width: '100%',\n ...(masonryStyle || {}),\n }}\n >\n {columnsChildren.map((colChildren, i) => (\n <div\n key={i}\n className={masonryClassNames?.column}\n style={{\n flex: 1,\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n {colChildren}\n </div>\n ))}\n </RootComponent>\n );\n};\n\ntype MasonryItemProps = {\n index: number;\n onHeight: (index: number, height: number) => void;\n className?: string;\n gapPx: number;\n children: React.ReactNode;\n};\n\nconst MasonryItem: React.FC<MasonryItemProps> = ({\n index,\n onHeight,\n className,\n gapPx,\n children,\n}) => {\n const ref = React.useRef<HTMLDivElement | null>(null);\n\n React.useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const measure = () => onHeight(index, el.offsetHeight);\n measure();\n\n if (typeof ResizeObserver !== 'undefined') {\n const ro = new ResizeObserver((entries) => {\n for (const entry of entries) {\n onHeight(index, entry.contentRect.height);\n }\n });\n ro.observe(el);\n return () => ro.disconnect();\n }\n\n return;\n }, [index, onHeight]);\n\n return (\n <div\n ref={ref}\n className={className}\n data-rmg-idx={index}\n style={{\n marginBottom: gapPx,\n ['--rmg-intro-index' as any]: index,\n }}\n >\n {children}\n </div>\n );\n};\n\nexport type DefaultMasonrySkeletonProps = {\n count: number;\n columnCount: number;\n gapPx: number;\n classNames?: MasonryClassNames;\n};\n\nexport const DefaultMasonrySkeleton: React.FC<DefaultMasonrySkeletonProps> = ({\n count,\n columnCount,\n gapPx,\n classNames,\n}) => {\n const cols: React.ReactNode[][] = Array.from(\n { length: Math.max(1, columnCount | 0) },\n () => []\n );\n\n const ratios = [55, 90, 130, 75];\n\n for (let i = 0; i < count; i++) {\n const pb = ratios[i % ratios.length];\n const colIdx = i % cols.length;\n\n cols[colIdx].push(\n <div\n key={`rmg-mskel-${i}`}\n className={classNames?.item}\n style={{\n paddingBottom: `${pb}%`,\n marginBottom: gapPx,\n }}\n />\n );\n }\n\n return (\n <div\n className={classNames?.root}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n columnGap: gapPx,\n rowGap: 0,\n width: '100%',\n }}\n >\n {cols.map((children, i) => (\n <div\n key={i}\n className={classNames?.column}\n style={{\n flex: 1,\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n {children}\n </div>\n ))}\n </div>\n );\n};","import type { EntriesOptions } from \"./types\";\n\nexport const DEFAULT_ENTRIES: Required<Pick<EntriesOptions, \"mediaLayout\">> = {\n mediaLayout: \"slider\",\n};","import * as React from \"react\";\n\nexport type UseEntryInViewOpts = IntersectionObserverInit & {\n nearMargin?: string;\n viewMargin?: string;\n};\n\nexport function useEntryInView(len: number, opts?: UseEntryInViewOpts) {\n const nearMargin = opts?.nearMargin ?? \"700px 0px\";\n const viewMargin = opts?.viewMargin ?? \"0px 0px\";\n const nearThreshold = opts?.threshold ?? 0.01;\n const everThreshold = 0;\n const root = opts?.root ?? null;\n\n const [nearView, setNearView] = React.useState<boolean[]>(\n () => Array.from({ length: len }, () => false)\n );\n const [everInView, setEverInView] = React.useState<boolean[]>(\n () => Array.from({ length: len }, () => false)\n );\n\n const nearIORef = React.useRef<IntersectionObserver | null>(null);\n const viewIORef = React.useRef<IntersectionObserver | null>(null);\n const nodeToIndexRef = React.useRef(new Map<Element, number>());\n const indexToNodeRef = React.useRef<(Element | null)[]>([]);\n\n React.useEffect(() => {\n indexToNodeRef.current = Array.from({ length: len }, () => null);\n setNearView(Array.from({ length: len }, () => false));\n setEverInView(Array.from({ length: len }, () => false));\n nodeToIndexRef.current.clear();\n\n nearIORef.current?.disconnect();\n viewIORef.current?.disconnect();\n nearIORef.current = null;\n viewIORef.current = null;\n }, [len]);\n\n React.useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n nearIORef.current?.disconnect();\n viewIORef.current?.disconnect();\n\n nearIORef.current = new IntersectionObserver(\n (entries) => {\n setNearView((prev) => {\n let next = prev;\n let changed = false;\n\n for (const e of entries) {\n const idx = nodeToIndexRef.current.get(e.target);\n if (idx == null || idx < 0 || idx >= len) continue;\n\n const isNow = !!e.isIntersecting;\n if (isNow !== prev[idx]) {\n if (!changed) {\n next = prev.slice();\n changed = true;\n }\n next[idx] = isNow;\n }\n }\n return changed ? next : prev;\n });\n },\n { root, rootMargin: nearMargin, threshold: nearThreshold }\n );\n\n viewIORef.current = new IntersectionObserver(\n (entries) => {\n setEverInView((prev) => {\n let next = prev;\n let changed = false;\n\n for (const e of entries) {\n const idx = nodeToIndexRef.current.get(e.target);\n if (idx == null || idx < 0 || idx >= len) continue;\n\n if (e.isIntersecting && !prev[idx]) {\n if (!changed) {\n next = prev.slice();\n changed = true;\n }\n next[idx] = true;\n }\n }\n return changed ? next : prev;\n });\n },\n { root, rootMargin: viewMargin, threshold: everThreshold }\n );\n\n for (const [node] of nodeToIndexRef.current) {\n nearIORef.current.observe(node);\n viewIORef.current.observe(node);\n }\n\n return () => {\n nearIORef.current?.disconnect();\n viewIORef.current?.disconnect();\n nearIORef.current = null;\n viewIORef.current = null;\n };\n }, [root, nearMargin, viewMargin, nearThreshold, everThreshold, len]);\n\n const setEntryRef = React.useCallback(\n (index: number) => (node: HTMLElement | null) => {\n const prevNode = indexToNodeRef.current[index] ?? null;\n\n // If node changed or unmounted, unobserve the old node\n if (prevNode && prevNode !== node) {\n nodeToIndexRef.current.delete(prevNode);\n nearIORef.current?.unobserve(prevNode);\n viewIORef.current?.unobserve(prevNode);\n }\n\n indexToNodeRef.current[index] = node;\n\n // If unmount, we're done\n if (!node) return;\n\n nodeToIndexRef.current.set(node, index);\n nearIORef.current?.observe(node);\n viewIORef.current?.observe(node);\n },\n []\n );\n\n return { nearView, everInView, setEntryRef };\n}","import * as React from \"react\";\n\ntype EntryLike = {\n key?: string;\n id?: string;\n media?: Array<{ kind?: string; src?: string }>;\n};\n\nfunction safeEntriesKey(entries: EntryLike[] | undefined) {\n const list = entries ?? [];\n let key = `${list.length}|`;\n for (let i = 0; i < list.length; i++) {\n const e = list[i] as any;\n key += (e?.key ?? e?.id ?? `i${i}`) + \"|\";\n }\n return key;\n}\n\nfunction decodeImageUrl(url: string, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n const img = new Image();\n img.decoding = \"async\";\n img.src = url;\n\n const finish = () => resolve();\n\n if (signal?.aborted) return finish();\n signal?.addEventListener(\"abort\", finish, { once: true });\n\n const hasDecode = typeof (img as any).decode === \"function\";\n if (hasDecode) {\n (img as any).decode().catch(() => {}).finally(finish);\n return;\n }\n\n if (img.complete) return finish();\n img.onload = finish;\n img.onerror = finish;\n });\n}\n\nexport function useEntryDecodeReady(\n enabled: boolean,\n entries: EntryLike[] | undefined,\n inView: boolean[],\n opts?: { timeoutMs?: number }\n) {\n const timeoutMs = opts?.timeoutMs ?? 8000;\n\n const entriesKey = React.useMemo(() => safeEntriesKey(entries), [entries]);\n\n const entryImageUrls = React.useMemo(() => {\n const list = entries ?? [];\n return list.map((entry) =>\n (entry.media ?? [])\n .filter((m: any) => m?.kind === \"image\" && typeof m?.src === \"string\")\n .map((m: any) => m.src as string)\n );\n }, [entries]);\n\n const [decodedReady, setDecodedReady] = React.useState<boolean[]>([]);\n const startedRef = React.useRef<boolean[]>([]);\n const controllersRef = React.useRef<Map<number, AbortController>>(new Map());\n const initKeyRef = React.useRef<string>(\"\");\n\n React.useEffect(() => {\n if (!enabled) return;\n\n const len = entries?.length ?? 0;\n\n if (initKeyRef.current !== entriesKey) {\n initKeyRef.current = entriesKey;\n\n setDecodedReady(\n Array.from({ length: len }, (_, i) => (entryImageUrls[i]?.length ?? 0) === 0)\n );\n\n startedRef.current = Array.from({ length: len }, () => false);\n\n for (const [, ac] of controllersRef.current) ac.abort();\n controllersRef.current.clear();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, entriesKey, entries, entryImageUrls]);\n\n React.useEffect(() => {\n if (!enabled) return;\n\n const len = entries?.length ?? 0;\n if (!len) return;\n\n for (let entryIndex = 0; entryIndex < len; entryIndex++) {\n const shouldStart = !!inView[entryIndex];\n const alreadyReady = decodedReady[entryIndex] ?? false;\n const alreadyStarted = startedRef.current[entryIndex] ?? false;\n\n if (!shouldStart || alreadyReady || alreadyStarted) continue;\n\n startedRef.current[entryIndex] = true;\n\n const urls = entryImageUrls[entryIndex] ?? [];\n if (!urls.length) {\n setDecodedReady((prev) => {\n if (prev[entryIndex]) return prev;\n const next = prev.slice();\n next[entryIndex] = true;\n return next;\n });\n continue;\n }\n\n const ac = new AbortController();\n controllersRef.current.set(entryIndex, ac);\n\n (async () => {\n for (const url of urls) {\n if (ac.signal.aborted) return;\n\n await Promise.race([\n decodeImageUrl(url, ac.signal),\n new Promise<void>((resolve) => {\n const t = window.setTimeout(resolve, timeoutMs);\n ac.signal.addEventListener(\n \"abort\",\n () => {\n window.clearTimeout(t);\n resolve();\n },\n { once: true }\n );\n }),\n ]);\n }\n\n if (ac.signal.aborted) return;\n\n setDecodedReady((prev) => {\n if (!prev || entryIndex < 0 || entryIndex >= prev.length) return prev;\n if (prev[entryIndex]) return prev;\n const next = prev.slice();\n next[entryIndex] = true;\n return next;\n });\n })();\n }\n }, [enabled, entries, entryImageUrls, inView, decodedReady, timeoutMs]);\n\n React.useEffect(() => {\n return () => {\n for (const [, ac] of controllersRef.current) ac.abort();\n controllersRef.current.clear();\n };\n }, []);\n\n return { decodedReady, entriesKey };\n}","import * as React from \"react\";\nimport type { EntriesOptions } from \"./types\";\n\nexport function useNormalizedEntriesLoading(entries: EntriesOptions) {\n return React.useMemo(() => {\n const src = entries.loading ?? {};\n return {\n isLoading: src.isLoading,\n skeletonCount: src.skeletonCount,\n renderLoading: src.renderLoading,\n };\n }, [entries.loading]);\n}\n\nexport function useNormalizedEntriesIntro(entries: EntriesOptions) {\n return React.useMemo(() => {\n const src = entries.intro ?? {};\n return {\n renderIntro: src.renderIntro,\n staggerMs: src.staggerMs ?? 200,\n transform: src.transform ?? \"translateY(30px) scale(0.99)\",\n durationMs: src.durationMs ?? 700,\n easing: src.easing ?? \"cubic-bezier(.2,.7,.2,1)\",\n staggerLimit: Math.max(0, (src.staggerLimit ?? 6) | 0),\n };\n }, [entries.intro]);\n}","import * as React from \"react\";\nimport styles from \"../../index.module.css\";\nimport type { EntriesOptions } from \"../types\";\nimport { useEntryInView } from \"../hooks/useEntryInView\";\nimport { useEntryDecodeReady } from \"../hooks/useEntryDecodeReady\";\nimport { EntrySkeletonCard } from \"./EntrySkeleton\";\nimport { useNormalizedEntriesIntro, useNormalizedEntriesLoading } from \"../normalize\";\nimport { MediaItem } from \"../../shared/types/media\";\n\ntype Props = {\n enabled: boolean; // layout === 'entries'\n entries: EntriesOptions;\n\n // Needed to open fullscreen\n fsEnabled: boolean;\n openFullscreenAt: (globalIndex: number, originEl?: HTMLElement | null) => void;\n\n // Map entry->flat index (you already compute this in Gallery)\n entryFlatIndexRef: React.MutableRefObject<number[][] | null>;\n\n // Provide your “nodeFromMedia”\n nodeFromMedia: (m: MediaItem) => React.ReactNode;\n\n // “isClick” ref if you want the slider-only click gating behavior\n isClickRef?: React.RefObject<boolean>;\n\n // Renders media layout container (slider/grid/masonry)\n renderMediaContainer: (args: {\n entryIndex: number;\n mediaNodes: React.ReactNode[];\n }) => React.ReactNode;\n\n registerExpandableImg?: (globalIndex: number, node: HTMLElement | null) => void;\n\n};\n\nexport function EntryList({\n enabled,\n entries,\n fsEnabled,\n openFullscreenAt,\n entryFlatIndexRef,\n nodeFromMedia,\n isClickRef,\n renderMediaContainer,\n registerExpandableImg\n}: Props) {\n const items = entries.items ?? [];\n const len = items.length;\n\n const { nearView, everInView, setEntryRef } = useEntryInView(len, {\n root: null,\n nearMargin: \"700px 0px\",\n viewMargin: \"0px 0px\",\n threshold: 0.01,\n });\n\n const { decodedReady } = useEntryDecodeReady(enabled, items as any, nearView, {\n timeoutMs: 8000,\n });\n\n const loadingN = useNormalizedEntriesLoading(entries);\n const introN = useNormalizedEntriesIntro(entries);\n\n const showGlobalLoading =\n enabled && (loadingN.isLoading === true || len === 0);\n\n const entryRows = !len\n ? null\n : items.map((entry, entryIndex) => {\n const isNear = nearView[entryIndex] ?? false;\n const hasEver = everInView[entryIndex] ?? false;\n const isDecoded = decodedReady[entryIndex] ?? false;\n\n const shouldMountContent = hasEver || isNear;\n const reveal = hasEver && isDecoded;\n const showSkeleton = !reveal;\n\n let contentNode: React.ReactNode = null;\n\n if (shouldMountContent) {\n const mediaArray = entry.media ?? [];\n const flatIndexByEntry = entryFlatIndexRef.current;\n\n const mediaNodes = mediaArray.map((media, mediaIndex) => {\n const globalIndex = flatIndexByEntry?.[entryIndex]?.[mediaIndex] ?? 0;\n\n const rawContent =\n typeof entries.render?.media === \"function\"\n ? entries.render.media({ entry, entryIndex, media, mediaIndex })\n : nodeFromMedia(media);\n\n const reg = (node: HTMLElement | null) => {\n registerExpandableImg?.(globalIndex, node);\n };\n\n const handleClick: React.MouseEventHandler<HTMLElement> = (e) => {\n e.preventDefault();\n if (!fsEnabled) return;\n\n if (entries.mediaLayout === \"slider\" && isClickRef && !isClickRef.current) return;\n\n openFullscreenAt(globalIndex, e.currentTarget as HTMLElement);\n };\n\n // if element, merge onClick (+ register)\n if (React.isValidElement(rawContent)) {\n const original = rawContent as React.ReactElement<any>;\n const origOnClick = original.props?.onClick;\n const origRef = (original as any).ref as React.Ref<HTMLElement> | undefined;\n\n const mergedOnClick: React.MouseEventHandler<any> = (e) => {\n if (typeof origOnClick === \"function\") origOnClick(e);\n if (e.defaultPrevented) return;\n handleClick(e);\n };\n\n // ✅ If it's a DOM element (img/div/button...), we can safely attach a ref.\n if (typeof original.type === \"string\") {\n const mergedRef: React.RefCallback<HTMLElement> = (node) => {\n if (typeof origRef === \"function\") origRef(node);\n else if (origRef && typeof origRef === \"object\") (origRef as any).current = node;\n reg(node);\n };\n\n return React.cloneElement(original, {\n key: `${entryIndex}-${mediaIndex}`,\n onClick: mergedOnClick,\n ref: mergedRef,\n });\n }\n\n // ✅ For custom components (no ref), wrap with a ref holder that doesn't affect layout\n return (\n <span\n key={`${entryIndex}-${mediaIndex}`}\n ref={reg as any}\n style={{ display: \"contents\" }}\n >\n {React.cloneElement(original, {\n onClick: mergedOnClick,\n })}\n </span>\n );\n }\n\n // non-element: wrap in button and register the wrapper\n return (\n <button\n key={`${entryIndex}-${mediaIndex}`}\n type=\"button\"\n className={styles.entryMediaButton}\n onClick={handleClick}\n ref={reg as any}\n >\n {rawContent as any}\n </button>\n );\n });\n\n const mediaContainer = renderMediaContainer({ entryIndex, mediaNodes });\n\n contentNode =\n typeof entries.render?.card === \"function\"\n ? entries.render.card({ entry, entryIndex, media: mediaContainer })\n : mediaContainer;\n }\n\n const limit = introN.staggerLimit;\n const delayIndex = limit > 0 && entryIndex < limit ? entryIndex : 0;\n\n return (\n <div\n key={(entry as any).key ?? (entry as any).id ?? entryIndex}\n ref={setEntryRef(entryIndex)}\n data-rmg-entry-ready={reveal ? \"1\" : \"0\"}\n className={styles.entryRow}\n data-rmg-entry-owner={entryIndex}\n style={{ [\"--rmg-entry-intro-index\" as any]: delayIndex }}\n >\n <div className={styles.entrySkeletonWrap} aria-hidden={showSkeleton ? undefined : true}>\n <EntrySkeletonCard />\n </div>\n\n {shouldMountContent ? (\n <div className={styles.entryInner}>{contentNode}</div>\n ) : null}\n </div>\n );\n });\n\n const containerProps: React.HTMLAttributes<HTMLDivElement> = {\n className: [styles.entryList].filter(Boolean).join(\" \"),\n style: {\n [\"--rmg-entry-intro-stagger\" as any]: `${introN.staggerMs}ms`,\n [\"--rmg-entry-intro-transform\" as any]: introN.transform,\n [\"--rmg-entry-intro-duration\" as any]: `${introN.durationMs}ms`,\n [\"--rmg-entry-intro-easing\" as any]: introN.easing,\n },\n \"aria-busy\": showGlobalLoading ? true : undefined,\n };\n\n const inner = <div {...containerProps}>{entryRows}</div>;\n\n // optional: allow wrapping with renderIntro like your other layouts\n return introN.renderIntro\n ? introN.renderIntro({ active: !showGlobalLoading, containerProps }, inner)\n : inner;\n}","import * as React from \"react\";\nimport styles from \"../../index.module.css\";\n\nexport function EntrySkeletonCard() {\n return (\n <article className={styles.entrySkeletonCard}>\n <div className={styles.entrySkeletonHeader}>\n <div className={`${styles.entrySkeletonAvatar} ${styles.entrySkeletonShimmer}`} />\n <div className={styles.entrySkeletonLines}>\n <div className={`${styles.entrySkeletonLineShort} ${styles.entrySkeletonShimmer}`} />\n <div className={`${styles.entrySkeletonLineLong} ${styles.entrySkeletonShimmer}`} />\n </div>\n </div>\n\n <div className={styles.entrySkeletonBody}>\n <div className={`${styles.entrySkeletonLineLong} ${styles.entrySkeletonShimmer}`} />\n <div className={`${styles.entrySkeletonLineMedium} ${styles.entrySkeletonShimmer}`} />\n </div>\n\n <div className={`${styles.entrySkeletonMedia} ${styles.entrySkeletonShimmer}`} />\n </article>\n );\n}","import * as React from \"react\";\n\nexport function useViewportWidth() {\n const [vw, setVw] = React.useState(() => {\n if (typeof window === \"undefined\") return 0;\n return window.innerWidth;\n });\n\n React.useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const onResize = () => setVw(window.innerWidth);\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n return vw;\n}","import { LoadingOptions } from \"../types/transitions\";\n\nexport function normalizeLoading(src?: LoadingOptions) {\n return {\n isLoading: src?.isLoading,\n skeletonCount: src?.skeletonCount,\n renderLoading: src?.renderLoading,\n };\n}","import { IntroOptions } from \"../types/transitions\";\n\nexport function normalizeIntro(src?: IntroOptions) {\n return {\n renderIntro: src?.renderIntro,\n staggerMs: src?.staggerMs ?? 40,\n transform: src?.transform ?? \"translateY(10px) scale(0.99)\",\n durationMs: src?.durationMs ?? 300,\n easing: src?.easing ?? \"cubic-bezier(.2,.7,.2,1)\",\n };\n}","'use client';\n\nimport * as React from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\nimport { FSEvent } from '../../fullscreen/fullscreenSliderSub';\n\nexport type FsSubLike = {\n get: () => number;\n onEvent: (cb: (e: FSEvent) => void) => () => void;\n};\n\nexport type EntryLink = {\n entryIndex: number;\n mediaIndex: number;\n [k: string]: any;\n};\n\nexport type EntriesOverlayRenderArgs<EntryT> = {\n entry: EntryT;\n entryIndex: number;\n mediaIndex: number;\n link: EntryLink;\n opacity: number;\n fsIndex: number;\n style: React.CSSProperties;\n containerProps: {\n className?: string;\n style: React.CSSProperties;\n };\n};\n\nexport type EntriesObjectLike<EntryT> = {\n items?: EntryT[];\n overlay?: {\n className?: string;\n style?: React.CSSProperties;\n };\n render?: {\n overlay?: (args: EntriesOverlayRenderArgs<EntryT>) => React.ReactNode;\n };\n};\n\nexport type UseFsEntryOverlayArgs<EntryT> = {\n enabled: boolean;\n fsSub: FsSubLike;\n entriesObject: EntriesObjectLike<EntryT>;\n entryMapRef: React.RefObject<EntryLink[] | null>;\n syncFullscreenSourceFromIndex: (nextIndex: number) => void;\n resetAllZoomDom: () => void;\n wrapperBaseStyle?: React.CSSProperties;\n fadeOutMs?: number;\n closing?: boolean;\n};\n\nexport type UseFsEntryOverlayReturn = {\n setMountEl: (el: HTMLDivElement | null) => void;\n setOpacity: (next: number) => void;\n};\n\nexport function useFsEntryOverlay<EntryT>(\n args: UseFsEntryOverlayArgs<EntryT>\n): UseFsEntryOverlayReturn {\n const {\n enabled,\n fsSub,\n entriesObject,\n entryMapRef,\n syncFullscreenSourceFromIndex,\n resetAllZoomDom,\n wrapperBaseStyle,\n fadeOutMs = 120,\n closing\n } = args;\n\n const mountRef = React.useRef<HTMLDivElement | null>(null);\n const rootRef = React.useRef<Root | null>(null);\n const rootMountRef = React.useRef<HTMLDivElement | null>(null);\n\n const fsIndexRef = React.useRef<number>(fsSub.get());\n\n const entryOpacityRef = React.useRef<number>(1);\n const overlayElRef = React.useRef<HTMLDivElement | null>(null);\n\n const openTokenRef = React.useRef(0);\n const enteredTokenRef = React.useRef(0);\n const enterRafRef = React.useRef<number>(0);\n\n const pendingUnmountRef = React.useRef<number>(0);\n\n const swapJobRef = React.useRef<{ t: any; raf: number } | null>(null);\n\n const cancelSwapJob = React.useCallback(() => {\n const job = swapJobRef.current;\n if (!job) return;\n if (job.raf) cancelAnimationFrame(job.raf);\n if (job.t) clearTimeout(job.t);\n swapJobRef.current = null;\n }, []);\n\n const setEntryOverlayOpacity = React.useCallback((next: number) => {\n const el = overlayElRef.current;\n if (!el) return;\n el.style.setProperty('--rmg-entry-opacity', String(next));\n }, []);\n\n const getEntryIndexForFsIndex = React.useCallback(\n (fsIndex: number): number => {\n const map = entryMapRef.current;\n const link = map?.[fsIndex];\n return link?.entryIndex ?? -1;\n },\n [entryMapRef]\n );\n\n const renderEntryOverlayForIndex = React.useCallback(\n (index: number) => {\n const mount = mountRef.current;\n if (!mount) return;\n\n if (rootRef.current && rootMountRef.current !== mount) {\n const oldRoot = rootRef.current;\n rootRef.current = null;\n rootMountRef.current = null;\n requestAnimationFrame(() => {\n try {\n oldRoot.unmount();\n } catch {\n // ignore\n }\n });\n }\n\n if (!rootRef.current) {\n rootRef.current = createRoot(mount);\n rootMountRef.current = mount;\n }\n\n const root = rootRef.current;\n\n const renderOverlay = entriesObject.render?.overlay;\n if (typeof renderOverlay !== 'function') {\n root.render(null);\n overlayElRef.current = null;\n return;\n }\n\n const map = entryMapRef.current;\n const items = entriesObject.items;\n if (!items?.length || !map?.length) {\n root.render(null);\n overlayElRef.current = null;\n return;\n }\n\n const link = map[index];\n if (!link) {\n root.render(null);\n overlayElRef.current = null;\n return;\n }\n\n const entry = items[link.entryIndex];\n if (!entry) {\n root.render(null);\n overlayElRef.current = null;\n return;\n }\n\n const wrapperStyle: React.CSSProperties = {\n position: 'fixed',\n left: 0,\n right: 0,\n bottom: 0,\n padding: '1.25rem 1.5rem',\n background: 'linear-gradient(to top, rgba(0,0,0,0.75), transparent)',\n color: '#fff',\n fontSize: '0.9rem',\n pointerEvents: 'none',\n zIndex: 9999,\n\n opacity: 'var(--rmg-entry-opacity, 1)' as any,\n transform:\n 'translateY(calc(8px * (1 - var(--rmg-entry-opacity, 1))))' as any,\n transition:\n 'opacity 300ms cubic-bezier(.4,0,.22,1), transform 180ms cubic-bezier(.4,0,.22,1)',\n\n ...(wrapperBaseStyle ?? {}),\n ...(entriesObject.overlay?.style ?? {}),\n };\n\n root.render(\n <div\n className={entriesObject.overlay?.className}\n style={wrapperStyle}\n ref={(el) => {\n overlayElRef.current = el;\n if (!el) return;\n\n const token = openTokenRef.current;\n if (enteredTokenRef.current === token) return;\n enteredTokenRef.current = token;\n\n el.style.setProperty('--rmg-entry-opacity', '0');\n\n void el.getBoundingClientRect();\n\n if (enterRafRef.current) cancelAnimationFrame(enterRafRef.current);\n enterRafRef.current = requestAnimationFrame(() => {\n enterRafRef.current = 0;\n el.style.setProperty('--rmg-entry-opacity', '1');\n });\n }}\n >\n {renderOverlay({\n entry,\n entryIndex: link.entryIndex,\n mediaIndex: link.mediaIndex,\n link,\n opacity: 1,\n fsIndex: index,\n style: wrapperStyle,\n containerProps: {\n className: entriesObject.overlay?.className,\n style: wrapperStyle,\n },\n })}\n </div>\n );\n },\n [entriesObject, entryMapRef, wrapperBaseStyle]\n );\n\n const fadeSwapToIndex = React.useCallback(\n (nextIndex: number) => {\n if (closing) return;\n cancelSwapJob();\n\n setEntryOverlayOpacity(0);\n\n const job = { t: null as any, raf: 0 };\n swapJobRef.current = job;\n\n job.t = setTimeout(() => {\n renderEntryOverlayForIndex(nextIndex);\n syncFullscreenSourceFromIndex(nextIndex);\n resetAllZoomDom();\n\n job.raf = requestAnimationFrame(() => {\n setEntryOverlayOpacity(1);\n swapJobRef.current = null;\n });\n }, fadeOutMs);\n },\n [\n cancelSwapJob,\n fadeOutMs,\n renderEntryOverlayForIndex,\n resetAllZoomDom,\n setEntryOverlayOpacity,\n syncFullscreenSourceFromIndex,\n ]\n );\n\n const setMountEl = React.useCallback(\n (el: HTMLDivElement | null) => {\n mountRef.current = el;\n\n if (el) return;\n\n cancelSwapJob();\n\n overlayElRef.current = null;\n\n const root = rootRef.current;\n rootRef.current = null;\n\n rootMountRef.current = null;\n\n if (pendingUnmountRef.current) {\n cancelAnimationFrame(pendingUnmountRef.current);\n pendingUnmountRef.current = 0;\n }\n\n if (root) {\n pendingUnmountRef.current = requestAnimationFrame(() => {\n pendingUnmountRef.current = 0;\n try {\n root.unmount();\n } catch {\n // ignore\n }\n });\n }\n },\n [cancelSwapJob]\n );\n\n React.useEffect(() => {\n if (closing) {\n cancelSwapJob();\n setEntryOverlayOpacity(0);\n return;\n }\n if (!enabled) return;\n\n openTokenRef.current += 1;\n enteredTokenRef.current = 0;\n\n const start = fsSub.get();\n fsIndexRef.current = start;\n\n renderEntryOverlayForIndex(start);\n syncFullscreenSourceFromIndex(start);\n\n const off = fsSub.onEvent((e) => {\n if (e.type !== 'internalIndex') return;\n\n const next = e.index;\n\n if (next === fsIndexRef.current && overlayElRef.current) return;\n\n const prevFsIndex = fsIndexRef.current;\n const prevEntryIndex = getEntryIndexForFsIndex(prevFsIndex);\n const nextEntryIndex = getEntryIndexForFsIndex(next);\n\n fsIndexRef.current = next;\n\n if (prevEntryIndex !== nextEntryIndex) {\n fadeSwapToIndex(next);\n } else {\n cancelSwapJob();\n renderEntryOverlayForIndex(next);\n syncFullscreenSourceFromIndex(next);\n resetAllZoomDom();\n requestAnimationFrame(() => setEntryOverlayOpacity(1));\n }\n });\n\n return () => {\n cancelSwapJob();\n off();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n enabled,\n fsSub,\n entriesObject.render?.overlay,\n entriesObject.items,\n cancelSwapJob,\n fadeSwapToIndex,\n getEntryIndexForFsIndex,\n renderEntryOverlayForIndex,\n resetAllZoomDom,\n setEntryOverlayOpacity,\n syncFullscreenSourceFromIndex,\n closing\n ]);\n\n return { setMountEl, setOpacity: setEntryOverlayOpacity };\n}","'use client';\n\nimport * as React from 'react';\n\ntype Props = {\n setMountEl: (el: HTMLDivElement | null) => void;\n /** optional styles override */\n style?: React.CSSProperties;\n className?: string;\n};\n\nexport function FsEntryOverlayMount({ setMountEl, style, className }: Props) {\n return (\n <div\n ref={setMountEl}\n className={className}\n style={{\n position: 'absolute',\n inset: 0,\n pointerEvents: 'none',\n zIndex: 9999,\n ...style,\n }}\n />\n );\n}","import * as React from \"react\";\n\nexport type MasonryCell = {\n id: string;\n node: React.ReactNode;\n};\n\nexport type BuildMasonryChildrenOpts = {\n // data\n cells: MasonryCell[];\n\n // behavior\n fsEnabled: boolean;\n openFullscreenAt: (index: number) => void;\n registerExpandableImg: (index: number, node: HTMLElement) => void;\n\n // styling\n itemBaseClass: string;\n itemBaseStyleClass: string;\n itemClassName?: string;\n};\n\nexport function buildMasonryChildren(opts: BuildMasonryChildrenOpts) {\n const {\n cells,\n fsEnabled,\n openFullscreenAt,\n registerExpandableImg,\n itemBaseClass,\n itemBaseStyleClass,\n itemClassName,\n } = opts;\n\n return cells.map((cell, index) => {\n const original = cell.node;\n\n const introStyle: React.CSSProperties & Record<string, any> = {\n [\"--rmg-intro-index\" as any]: index,\n };\n\n const className = [itemBaseClass, itemBaseStyleClass, itemClassName || \"\"]\n .filter(Boolean)\n .join(\" \");\n\n // Common props for both button wrapper and cloned element\n const common = {\n key: cell.id,\n \"data-rmg-idx\": index,\n style: introStyle,\n className,\n } as const;\n\n // If it’s not a valid element, wrap it in a button\n if (!React.isValidElement(original)) {\n return (\n <button\n type=\"button\"\n {...common}\n onClick={(e) => {\n e.preventDefault();\n if (!fsEnabled) return;\n openFullscreenAt(index);\n }}\n >\n {original as any}\n </button>\n );\n }\n\n const originalEl = original as React.ReactElement<any, any>;\n\n const origProps = (originalEl.props ?? {}) as {\n onClick?: React.MouseEventHandler<HTMLElement>;\n className?: string;\n style?: React.CSSProperties;\n };\n\n const origRef = (originalEl as any).ref as React.Ref<HTMLElement> | undefined;\n\n const mergedRef: React.RefCallback<HTMLElement> = (node) => {\n if (typeof origRef === \"function\") origRef(node);\n else if (origRef && typeof origRef === \"object\") (origRef as any).current = node;\n\n if (node) registerExpandableImg(index, node);\n };\n\n const mergedOnClick: React.MouseEventHandler<HTMLElement> = (e) => {\n origProps.onClick?.(e);\n if (e.defaultPrevented) return;\n if (!fsEnabled) return;\n openFullscreenAt(index);\n };\n\n return React.cloneElement<any>(originalEl, {\n key: cell.id,\n ref: mergedRef,\n onClick: mergedOnClick,\n \"data-rmg-idx\": index,\n className: [itemBaseClass, itemBaseStyleClass, origProps.className || \"\", itemClassName || \"\"]\n .filter(Boolean)\n .join(\" \"),\n style: {\n ...(origProps.style || {}),\n ...introStyle,\n },\n });\n });\n}","export function getCurrentTransform(slide: HTMLElement | null) {\n if (!slide) return { x: 0, y: 0 };\n const computedStyle = window.getComputedStyle(slide);\n const transform = computedStyle.transform;\n if (!transform || transform === \"none\") return { x: 0, y: 0 };\n const matrixMatch = transform.match(/matrix\\(([^)]+)\\)/);\n if (!matrixMatch) return { x: 0, y: 0 };\n const matrixValues = matrixMatch[1].split(\",\").map(parseFloat);\n const tx = matrixValues[4] || 0;\n const ty = matrixValues[5] || 0;\n return { x: tx, y: ty };\n}\n\nexport function baseFitSizeC(\n imgEl: HTMLImageElement,\n containerW: number,\n containerH: number\n) {\n const natW = imgEl.naturalWidth || imgEl.width || containerW;\n const natH = imgEl.naturalHeight || imgEl.height || containerH;\n const fit = Math.min(containerW / natW, containerH / natH);\n return { baseW: natW * fit, baseH: natH * fit };\n}\n\nexport function clampNum(val: number, min: number, max: number) {\n return Math.max(min, Math.min(max, val));\n}\n\nexport type Point = { x: number; y: number };\n\nexport function midpoint(a: Touch, b: Touch): Point {\n if (!b) return { x: a.clientX, y: a.clientY };\n return { x: (a.clientX + b.clientX) / 2, y: (a.clientY + b.clientY) / 2 };\n}\n\nexport function distance(a: Touch, b: Touch): number {\n const dx = a.clientX - b.clientX;\n const dy = a.clientY - b.clientY;\n return Math.hypot(dx, dy);\n}","export function getPrimaryImgEl(container: HTMLElement | null): HTMLImageElement | null {\n if (!container) return null;\n\n // Your convention: container.children[0] is usually the <img />\n const child0 = container.children[0] as any;\n if (child0 && child0.tagName && String(child0.tagName).toLowerCase() === \"img\") {\n return child0 as HTMLImageElement;\n }\n\n // Fallback if structure changes\n return container.querySelector(\"img\");\n}\n\nexport function getClientXY(evt: any): { clientX: number; clientY: number } {\n const clientX =\n evt?.touches?.[0]?.clientX ??\n evt?.changedTouches?.[0]?.clientX ??\n evt?.clientX ??\n 0;\n\n const clientY =\n evt?.touches?.[0]?.clientY ??\n evt?.changedTouches?.[0]?.clientY ??\n evt?.clientY ??\n 0;\n\n return { clientX, clientY };\n}\n\nexport function findImgAtPoint(\n doc: Document,\n x: number,\n y: number\n): HTMLImageElement | null {\n const el = doc.elementFromPoint(x, y) as HTMLElement | null;\n if (!el) return null;\n\n if (el.tagName?.toLowerCase() === \"img\") return el as any;\n\n const img = el.querySelector?.(\"img\");\n return (img as HTMLImageElement) || null;\n}\n\nexport function readDataIndex(img: HTMLDivElement | null): number | null {\n if (!img) return null;\n const v = img.dataset.index;\n if (v == null) return null;\n const n = parseInt(v, 10);\n return Number.isFinite(n) ? n : null;\n}\n\nexport function gapAllEdges(\n containerRect: { width: number; height: number },\n imgEl: HTMLImageElement\n): boolean {\n const cw = containerRect.width;\n const ch = containerRect.height;\n const iw = imgEl.offsetWidth;\n const ih = imgEl.offsetHeight;\n\n return cw > 0 && ch > 0 && iw > 0 && ih > 0 && iw < cw && ih < ch;\n}","import type React from \"react\";\nimport { getCurrentTransform, baseFitSizeC, clampNum } from \"../core/utils\";\nimport { getPrimaryImgEl, gapAllEdges } from \"../core/dom\";\n\nexport type ZoomPoint = { x: number; y: number };\n\ntype VectorLike = { get(): number; set(v: number): void; add?(v: number): void };\ntype RefLike<T> = { current: T };\n\nexport type ZoomToArgs = {\n destZoomLevel: number;\n centerPoint: ZoomPoint;\n imageRef: React.RefObject<HTMLElement | null>;\n};\n\ntype PovLike = { measure(n: number): number };\n\nexport type ZoomCtx = {\n fs: {\n zoom: {\n maxZoomLevel: number;\n panDuration: number;\n panFriction: number;\n clickZoomLevel: number;\n };\n };\n\n currentImage: RefLike<HTMLElement | null>;\n\n scaleRef: RefLike<number>;\n setScale: (n: number) => void;\n\n previousZoom: RefLike<{ x: number; y: number }>;\n suppressLoopRef: RefLike<boolean>;\n\n // vectors/bodies/bounds\n locX: RefLike<VectorLike | null>;\n prevX: RefLike<VectorLike | null>;\n offX: RefLike<VectorLike | null>;\n tgtX: RefLike<VectorLike | null>;\n\n locY: RefLike<VectorLike | null>;\n prevY: RefLike<VectorLike | null>;\n offY: RefLike<VectorLike | null>;\n tgtY: RefLike<VectorLike | null>;\n\n bodyX: RefLike<any>;\n bodyY: RefLike<any>;\n\n boundsX: RefLike<any>;\n boundsY: RefLike<any>;\n\n // factories\n Vector1D: (n: number) => VectorLike;\n ScrollBody: (...args: any[]) => any;\n ScrollBounds: (...args: any[]) => any;\n\n // math helpers owned elsewhere\n boundsForCurrent: (\n scale: number,\n baseW: number,\n baseH: number,\n containerW: number,\n containerH: number\n ) => { x: any; y: any; povX: PovLike; povY: PovLike };\n\n // rendering/animation\n renderPan: (x: number, y: number) => void;\n animRef: RefLike<{ start(): void; stop(): void; resetBlend(): void } | null>;\n};\n\nexport function applySmoothTransform(\n ctx: ZoomCtx,\n x: number,\n y: number,\n scale: number,\n durationMs = 300\n) {\n const container = ctx.currentImage.current;\n if (!container) return;\n\n const primary = container.children[0] as HTMLElement | null;\n if (!primary) return;\n\n const transition = `transform ${durationMs}ms cubic-bezier(.4,0,.22,1)`;\n const toTransform = `translate3d(${x}px, ${y}px, 0) scale(${scale})`;\n\n primary.style.transition = transition;\n primary.style.transform = toTransform;\n\n ctx.offX.current?.set(x);\n ctx.offY.current?.set(y);\n ctx.locX.current?.set(x);\n ctx.locY.current?.set(y);\n ctx.prevX.current?.set(x);\n ctx.prevY.current?.set(y);\n ctx.tgtX.current?.set(x);\n ctx.tgtY.current?.set(y);\n\n ctx.scaleRef.current = scale;\n ctx.setScale(scale);\n\n window.setTimeout(() => {\n primary.style.transition = \"\";\n }, durationMs + 30);\n}\n\nexport function zoomTo(ctx: ZoomCtx, args: ZoomToArgs) {\n const { destZoomLevel, centerPoint, imageRef } = args;\n if (!imageRef.current) return;\n\n ctx.currentImage.current = imageRef.current;\n const container = ctx.currentImage.current;\n\n const imgEl = getPrimaryImgEl(container);\n if (!imgEl) return;\n\n const rect0 = container.getBoundingClientRect();\n if (gapAllEdges({ width: rect0.width, height: rect0.height }, imgEl)) return;\n\n const { x: domTx, y: domTy } = getCurrentTransform(imgEl);\n\n if (!ctx.locX.current || !ctx.locY.current) {\n ctx.locX.current = ctx.Vector1D(domTx);\n ctx.prevX.current = ctx.Vector1D(domTx);\n ctx.offX.current = ctx.Vector1D(domTx);\n ctx.tgtX.current = ctx.Vector1D(domTx);\n\n ctx.locY.current = ctx.Vector1D(domTy);\n ctx.prevY.current = ctx.Vector1D(domTy);\n ctx.offY.current = ctx.Vector1D(domTy);\n ctx.tgtY.current = ctx.Vector1D(domTy);\n\n ctx.bodyX.current = ctx.ScrollBody(\n ctx.locX.current,\n ctx.offX.current,\n ctx.prevX.current,\n ctx.tgtX.current,\n ctx.fs.zoom.panDuration,\n ctx.fs.zoom.panFriction\n ).sync();\n\n ctx.bodyY.current = ctx.ScrollBody(\n ctx.locY.current,\n ctx.offY.current,\n ctx.prevY.current,\n ctx.tgtY.current,\n ctx.fs.zoom.panDuration,\n ctx.fs.zoom.panFriction\n ).sync();\n }\n\n const s0 = ctx.scaleRef.current || 1;\n const s1 = clampNum(destZoomLevel, 1, ctx.fs.zoom.maxZoomLevel);\n if (s1 === s0) return;\n\n const ZOOM_EPS = 1.01;\n const wasZoomed = s0 > ZOOM_EPS;\n const willBeZoomed = s1 > ZOOM_EPS;\n\n if (!wasZoomed && willBeZoomed) ctx.suppressLoopRef.current = true;\n else if (wasZoomed && !willBeZoomed) ctx.suppressLoopRef.current = false;\n\n const rect = container.getBoundingClientRect();\n const containerW = rect.width;\n const containerH = rect.height;\n\n const cx = centerPoint.x - rect.left;\n const cy = centerPoint.y - rect.top;\n\n const { baseW, baseH } = baseFitSizeC(imgEl, containerW, containerH);\n const offXc = (containerW - baseW) / 2;\n const offYc = (containerH - baseH) / 2;\n\n const tx0 = ctx.offX.current!.get();\n const ty0 = ctx.offY.current!.get();\n\n const k = s1 / s0;\n let tx1 = tx0 + (1 - k) * (cx - offXc - tx0);\n let ty1 = ty0 + (1 - k) * (cy - offYc - ty0);\n\n const { x: limX, y: limY, povX, povY } = ctx.boundsForCurrent(\n s1,\n baseW,\n baseH,\n containerW,\n containerH\n );\n tx1 = limX.constrain(tx1);\n ty1 = limY.constrain(ty1);\n\n ctx.scaleRef.current = s1;\n ctx.setScale(s1);\n ctx.previousZoom.current.x = cx;\n ctx.previousZoom.current.y = cy;\n\n ctx.tgtX.current!.set(tx1);\n ctx.locX.current!.set(tx1);\n ctx.prevX.current!.set(tx1);\n ctx.offX.current!.set(tx1);\n\n ctx.tgtY.current!.set(ty1);\n ctx.locY.current!.set(ty1);\n ctx.prevY.current!.set(ty1);\n ctx.offY.current!.set(ty1);\n\n ctx.boundsX.current = ctx.ScrollBounds(\n limX,\n ctx.offX.current!,\n ctx.tgtX.current!,\n ctx.bodyX.current!,\n povX,\n ctx.fs.zoom.panDuration\n );\n ctx.boundsY.current = ctx.ScrollBounds(\n limY,\n ctx.offY.current!,\n ctx.tgtY.current!,\n ctx.bodyY.current!,\n povY,\n ctx.fs.zoom.panDuration\n );\n\n ctx.bodyX.current?.useDuration(0).useFriction(1);\n ctx.bodyY.current?.useDuration(0).useFriction(1);\n\n ctx.renderPan(tx1, ty1);\n ctx.animRef.current?.start();\n}\n","import type React from \"react\";\nimport { getCurrentTransform, baseFitSizeC } from \"../core/utils\";\nimport { getPrimaryImgEl, gapAllEdges, getClientXY } from \"../core/dom\";\nimport { applySmoothTransform, type ZoomCtx } from \"./zoomTo\";\n\ntype ImageRef = React.RefObject<HTMLElement | null>;\n\nexport type HandleZoomToggleCtx = ZoomCtx & {\n // handleZoomToggle uses these extra refs/helpers\n panRef: { current: { x: number; y: number } };\n resetAllZoomDom: () => void;\n\n // If you rely on this elsewhere, keep it in ctx too\n scale: number; // optional if you keep setScale only; remove if unused\n};\n\nexport function handleZoomToggle(\n ctx: HandleZoomToggleCtx,\n e: React.PointerEvent<any> | React.TouchEvent<any>,\n imageRef: ImageRef\n) {\n if (!imageRef.current) return;\n\n ctx.currentImage.current = imageRef.current;\n const container = ctx.currentImage.current;\n if (!container) return;\n\n const imgEl = getPrimaryImgEl(container);\n if (!imgEl) return;\n\n const rect0 = container.getBoundingClientRect();\n if (gapAllEdges({ width: rect0.width, height: rect0.height }, imgEl)) return;\n\n // Ensure vectors/bodies exist (same as your original logic)\n const { x: domTx, y: domTy } = getCurrentTransform(imgEl);\n if (!ctx.locX.current || !ctx.locY.current) {\n ctx.locX.current = ctx.Vector1D(domTx);\n ctx.prevX.current = ctx.Vector1D(domTx);\n ctx.offX.current = ctx.Vector1D(domTx);\n ctx.tgtX.current = ctx.Vector1D(domTx);\n\n ctx.locY.current = ctx.Vector1D(domTy);\n ctx.prevY.current = ctx.Vector1D(domTy);\n ctx.offY.current = ctx.Vector1D(domTy);\n ctx.tgtY.current = ctx.Vector1D(domTy);\n\n ctx.bodyX.current = ctx.ScrollBody(\n ctx.locX.current,\n ctx.offX.current,\n ctx.prevX.current,\n ctx.tgtX.current,\n ctx.fs.zoom.panDuration,\n ctx.fs.zoom.panFriction\n ).sync();\n\n ctx.bodyY.current = ctx.ScrollBody(\n ctx.locY.current,\n ctx.offY.current,\n ctx.prevY.current,\n ctx.tgtY.current,\n ctx.fs.zoom.panDuration,\n ctx.fs.zoom.panFriction\n ).sync();\n }\n\n const s0 = ctx.scaleRef.current || 1;\n const goingIn = s0 === 1;\n const s1 = goingIn ? ctx.fs.zoom.clickZoomLevel : 1;\n\n const ZOOM_EPS = 1.01;\n const wasZoomed = s0 > ZOOM_EPS;\n const willBeZoomed = s1 > ZOOM_EPS;\n\n if (wasZoomed && !willBeZoomed) {\n ctx.resetAllZoomDom();\n }\n\n const rect = container.getBoundingClientRect();\n const containerW = rect.width;\n const containerH = rect.height;\n\n const { clientX, clientY } = getClientXY(e as any);\n const cx = clientX - rect.left;\n const cy = clientY - rect.top;\n\n const { baseW, baseH } = baseFitSizeC(imgEl, containerW, containerH);\n const offXc = (containerW - baseW) / 2;\n const offYc = (containerH - baseH) / 2;\n\n const tx0 = ctx.offX.current!.get();\n const ty0 = ctx.offY.current!.get();\n\n let tx1: number;\n let ty1: number;\n\n if (goingIn) {\n const k = s1 / s0;\n tx1 = tx0 + (1 - k) * (cx - offXc - tx0);\n ty1 = ty0 + (1 - k) * (cy - offYc - ty0);\n\n const { x: limX, y: limY } = ctx.boundsForCurrent(\n s1,\n baseW,\n baseH,\n containerW,\n containerH\n );\n tx1 = limX.constrain(tx1);\n ty1 = limY.constrain(ty1);\n } else {\n tx1 = 0;\n ty1 = 0;\n }\n\n const DURATION = 300;\n applySmoothTransform(ctx, tx1, ty1, s1, DURATION);\n\n ctx.scaleRef.current = s1;\n ctx.setScale(s1);\n\n ctx.previousZoom.current.x = cx;\n ctx.previousZoom.current.y = cy;\n\n ctx.panRef.current = { x: tx1, y: ty1 };\n\n // rebuild bodies/bounds exactly like your original\n ctx.locX.current!.set(tx1);\n ctx.prevX.current!.set(tx1);\n ctx.offX.current!.set(tx1);\n ctx.tgtX.current!.set(tx1);\n\n ctx.locY.current!.set(ty1);\n ctx.prevY.current!.set(ty1);\n ctx.offY.current!.set(ty1);\n ctx.tgtY.current!.set(ty1);\n\n ctx.bodyX.current = ctx.ScrollBody(\n ctx.locX.current!,\n ctx.offX.current!,\n ctx.prevX.current!,\n ctx.tgtX.current!,\n ctx.fs.zoom.panDuration,\n ctx.fs.zoom.panFriction\n ).sync();\n\n ctx.bodyY.current = ctx.ScrollBody(\n ctx.locY.current!,\n ctx.offY.current!,\n ctx.prevY.current!,\n ctx.tgtY.current!,\n ctx.fs.zoom.panDuration,\n ctx.fs.zoom.panFriction\n ).sync();\n\n const { x: limX2, y: limY2, povX, povY } = ctx.boundsForCurrent(\n s1,\n baseW,\n baseH,\n containerW,\n containerH\n );\n\n ctx.boundsX.current = ctx.ScrollBounds(\n limX2,\n ctx.offX.current!,\n ctx.tgtX.current!,\n ctx.bodyX.current!,\n povX,\n ctx.fs.zoom.panDuration\n );\n\n ctx.boundsY.current = ctx.ScrollBounds(\n limY2,\n ctx.offY.current!,\n ctx.tgtY.current!,\n ctx.bodyY.current!,\n povY,\n ctx.fs.zoom.panDuration\n );\n\n ctx.tgtX.current!.set(limX2.constrain(ctx.tgtX.current!.get()));\n ctx.tgtY.current!.set(limY2.constrain(ctx.tgtY.current!.get()));\n\n ctx.animRef.current?.resetBlend();\n}","import { baseFitSizeC, getCurrentTransform } from \"./utils\";\nimport { getPrimaryImgEl } from \"./dom\";\n\ntype VectorLike = { get(): number; set(v: number): void };\ntype RefLike<T> = { current: T };\n\nexport type RebuildPanBodiesCtx = {\n fs: { zoom: { panDuration: number; panFriction: number } };\n\n currentImage: RefLike<HTMLElement | null>;\n scaleRef: RefLike<number>;\n\n // vectors\n locX: RefLike<VectorLike | null>;\n prevX: RefLike<VectorLike | null>;\n offX: RefLike<VectorLike | null>;\n tgtX: RefLike<VectorLike | null>;\n\n locY: RefLike<VectorLike | null>;\n prevY: RefLike<VectorLike | null>;\n offY: RefLike<VectorLike | null>;\n tgtY: RefLike<VectorLike | null>;\n\n // bodies/bounds\n bodyX: RefLike<any>;\n bodyY: RefLike<any>;\n boundsX: RefLike<any>;\n boundsY: RefLike<any>;\n\n // factories\n Vector1D: (n: number) => VectorLike;\n ScrollBody: (...args: any[]) => any;\n ScrollBounds: (...args: any[]) => any;\n\n boundsForCurrent: (\n scale: number,\n baseW: number,\n baseH: number,\n containerW: number,\n containerH: number\n ) => { x: any; y: any; povX: any; povY: any };\n};\n\nexport function rebuildPanBodiesFn(ctx: RebuildPanBodiesCtx) {\n if (!ctx.currentImage.current) return;\n\n const container = ctx.currentImage.current;\n const img = getPrimaryImgEl(container);\n if (!img) return;\n\n const rect = container.getBoundingClientRect();\n const containerW = rect.width;\n const containerH = rect.height;\n\n const { baseW, baseH } = baseFitSizeC(img, containerW, containerH);\n\n const { x, y } = getCurrentTransform(img);\n\n ctx.locX.current = ctx.Vector1D(x);\n ctx.prevX.current = ctx.Vector1D(x);\n ctx.offX.current = ctx.Vector1D(x);\n ctx.tgtX.current = ctx.Vector1D(x);\n\n ctx.locY.current = ctx.Vector1D(y);\n ctx.prevY.current = ctx.Vector1D(y);\n ctx.offY.current = ctx.Vector1D(y);\n ctx.tgtY.current = ctx.Vector1D(y);\n\n ctx.bodyX.current = ctx.ScrollBody(\n ctx.locX.current,\n ctx.offX.current,\n ctx.prevX.current,\n ctx.tgtX.current,\n ctx.fs.zoom.panDuration,\n ctx.fs.zoom.panFriction\n ).sync();\n\n ctx.bodyY.current = ctx.ScrollBody(\n ctx.locY.current,\n ctx.offY.current,\n ctx.prevY.current,\n ctx.tgtY.current,\n ctx.fs.zoom.panDuration,\n ctx.fs.zoom.panFriction\n ).sync();\n\n const { x: limX, y: limY, povX, povY } = ctx.boundsForCurrent(\n ctx.scaleRef.current,\n baseW,\n baseH,\n containerW,\n containerH\n );\n\n ctx.boundsX.current = ctx.ScrollBounds(\n limX,\n ctx.offX.current,\n ctx.tgtX.current,\n ctx.bodyX.current,\n povX,\n ctx.fs.zoom.panDuration\n );\n\n ctx.boundsY.current = ctx.ScrollBounds(\n limY,\n ctx.offY.current,\n ctx.tgtY.current,\n ctx.bodyY.current,\n povY,\n ctx.fs.zoom.panDuration\n );\n}\n","import * as React from \"react\";\nimport { Animations } from \"../../shared/motion/animations\";\nimport type { PanRuntimeDeps, WindowType } from \"./types\";\n\nexport function usePanAnimation(d: PanRuntimeDeps) {\n React.useEffect(() => {\n const anim = Animations(\n document,\n window as WindowType,\n () => {\n d.boundsX.current?.constrain(d.pointerDownRef.current);\n d.boundsY.current?.constrain(d.pointerDownRef.current);\n d.bodyX.current?.seek();\n d.bodyY.current?.seek();\n },\n (alpha) => {\n const locX = d.locX.current;\n const locY = d.locY.current;\n const prevX = d.prevX.current;\n const prevY = d.prevY.current;\n if (!locX || !locY || !prevX || !prevY) return;\n\n const lx = locX.get() * alpha + prevX.get() * (1 - alpha);\n const ly = locY.get() * alpha + prevY.get() * (1 - alpha);\n\n d.offX.current?.set(lx);\n d.offY.current?.set(ly);\n d.renderPan(lx, ly);\n\n const settled = !!d.bodyX.current?.settled() && !!d.bodyY.current?.settled();\n const within = !(d.boundsX.current?.reached?.()) && !(d.boundsY.current?.reached?.());\n const stop = settled && within && !d.pointerDownRef.current;\n if (stop) d.animRef.current?.stop();\n }\n );\n\n d.animRef.current = anim;\n anim.init();\n\n return () => {\n anim.destroy();\n d.animRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}","import * as React from \"react\";\nimport { EventStore } from \"../../shared/motion/eventStore\";\nimport { createDragTracker } from \"../../shared/input/dragTracker\";\nimport type { PanRuntimeDeps, WindowType, ImageRef } from \"./types\";\n\nfunction Axis() {\n return {\n scroll: \"x\" as const,\n cross: \"y\" as const,\n direction(n: number) { return n; },\n measureSize(rect: DOMRect) { return rect.width; },\n };\n}\n\ntype PointerEventType = TouchEvent | MouseEvent;\nfunction isMouseEvent(evt: PointerEventType, ownerWindow: WindowType): evt is MouseEvent {\n return typeof ownerWindow.MouseEvent !== \"undefined\" && evt instanceof ownerWindow.MouseEvent;\n}\n\nfunction DragTracker(axis: any, ownerWindow: WindowType) {\n return createDragTracker({ ownerWindow, axis });\n}\n\nexport function usePanDrag(d: PanRuntimeDeps) {\n const freeBoost = React.useMemo(() => ({ mouse: 400, touch: 400 }), []);\n const trackerRef = React.useRef<ReturnType<typeof DragTracker> | null>(null);\n\n const dragStore = React.useRef(EventStore()).current;\n const moveStore = React.useRef(EventStore()).current;\n\n const forceBoost = React.useCallback(\n (rawForce: number, isMouse: boolean) => rawForce * (isMouse ? freeBoost.mouse : freeBoost.touch),\n [freeBoost]\n );\n\n let injected = false;\n\n function ensurePanCursorStyle() {\n if (injected) return;\n injected = true;\n\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-rmg-pan-cursor\", \"true\");\n style.textContent = `\n html.rmg-pan-grabbing,\n html.rmg-pan-grabbing * {\n cursor: grabbing !important;\n user-select: none !important;\n }\n `;\n document.head.appendChild(style);\n }\n\n React.useEffect(() => {\n ensurePanCursorStyle();\n }, []);\n\n const setGrabbing = React.useCallback((on: boolean) => {\n const root = document.documentElement;\n if (on) root.classList.add(\"rmg-pan-grabbing\");\n else root.classList.remove(\"rmg-pan-grabbing\");\n }, []);\n\n const handlePanPointerStart = React.useCallback(\n (\n e: React.PointerEvent<HTMLDivElement> | React.TouchEvent<HTMLDivElement>,\n imageRef: ImageRef\n ) => {\n if (!d.isZoomed) return;\n if (!imageRef.current) return;\n\n d.currentImage.current = imageRef.current as any;\n d.getImageAspectRatio(imageRef.current as any);\n\n d.rebuildPanBodies();\n\n const ownerWin = window as WindowType;\n const axis = d.axisRef.current || Axis();\n trackerRef.current = DragTracker(axis, ownerWin);\n\n const mouse = (e as any).button !== undefined;\n const isPrimaryMouse = mouse ? (e as React.PointerEvent).button === 0 : false;\n if (mouse && !isPrimaryMouse) return;\n\n d.pointerDownRef.current = true;\n d.interactionModeRef.current = \"drag\";\n setGrabbing(true);\n\n const endDrag = () => {\n d.pointerDownRef.current = false;\n d.interactionModeRef.current = \"idle\";\n moveStore.clear();\n setGrabbing(false);\n };\n\n d.tgtX.current?.set(d.locX.current?.get?.() ?? 0);\n d.tgtY.current?.set(d.locY.current?.get?.() ?? 0);\n\n const CLICK_MOVE_TOL = 3;\n const CLICK_TIME_TOL_MS = 220;\n const FLICK_FORCE_TOL = 0.075;\n\n let totalAbsDx = 0;\n let totalAbsDy = 0;\n let canceledByMultiTouch = false;\n\n const downTs = performance.now();\n const downNativeEvt = e.nativeEvent as any;\n\n trackerRef.current.pointerDown(downNativeEvt);\n\n const onMove = (evt: PointerEvent | TouchEvent) => {\n if (!isMouseEvent(evt as any, window as any) && (evt as TouchEvent).touches?.length >= 2) {\n canceledByMultiTouch = true;\n endDrag();\n return onUp(evt as any);\n }\n\n const moved = trackerRef.current!.pointerMove(evt as any);\n totalAbsDx += Math.abs(moved.dx);\n totalAbsDy += Math.abs(moved.dy);\n\n d.bodyX.current?.useFriction(0.3).useDuration(0.75);\n d.bodyY.current?.useFriction(0.3).useDuration(0.75);\n\n d.tgtX.current?.add(moved.dx);\n d.tgtY.current?.add(moved.dy);\n\n d.animRef.current?.start();\n if (\"cancelable\" in evt && (evt as any).cancelable) (evt as any).preventDefault?.();\n };\n\n const onUp = (evt: PointerEvent | TouchEvent) => {\n const flick = trackerRef.current!.pointerUp(evt as any);\n const isMouse = isMouseEvent(evt as any, window as any);\n\n const durMs = performance.now() - downTs;\n const tinyTravel = totalAbsDx <= CLICK_MOVE_TOL && totalAbsDy <= CLICK_MOVE_TOL;\n const tinyFlick = Math.abs(flick.fx) <= FLICK_FORCE_TOL && Math.abs(flick.fy) <= FLICK_FORCE_TOL;\n const isClick = !canceledByMultiTouch && tinyTravel && tinyFlick && durMs <= CLICK_TIME_TOL_MS;\n\n d.pointerDownRef.current = false;\n d.interactionModeRef.current = \"idle\";\n moveStore.clear();\n endDrag();\n\n if (isClick) {\n const current = d.currentImage.current as any;\n const imgEl =\n (current?.querySelector?.(\"img\") ?? current?.children?.[0]) as HTMLImageElement | null;\n\n if (imgEl) {\n const upAny = evt as any;\n const cx =\n upAny?.touches?.[0]?.clientX ??\n upAny?.changedTouches?.[0]?.clientX ??\n upAny?.clientX ??\n downNativeEvt?.clientX;\n\n const cy =\n upAny?.touches?.[0]?.clientY ??\n upAny?.changedTouches?.[0]?.clientY ??\n upAny?.clientY ??\n downNativeEvt?.clientY;\n\n const fakeReactEvt = {\n target: imgEl,\n currentTarget: imgEl,\n clientX: cx,\n clientY: cy,\n nativeEvent: upAny ?? downNativeEvt,\n } as unknown as React.PointerEvent<HTMLImageElement>;\n\n d.handleZoomToggle(d.zoomCtx as any, fakeReactEvt as any, d.currentImage as any);\n\n d.suppressNextClickRef.current = true;\n const anyEvt: any = evt;\n anyEvt?.preventDefault?.();\n anyEvt?.stopPropagation?.();\n d.animRef.current?.stop();\n return;\n }\n\n d.animRef.current?.stop();\n return;\n }\n\n const fx = forceBoost(flick.fx, isMouse);\n const fy = forceBoost(flick.fy, isMouse);\n\n const factorX = Math.min(\n 1,\n Math.abs(flick.fx) > 0\n ? Math.abs((Math.abs(fx) - Math.abs(flick.fx)) / (flick.fx || 1))\n : 0\n );\n const factorY = Math.min(\n 1,\n Math.abs(flick.fy) > 0\n ? Math.abs((Math.abs(fy) - Math.abs(flick.fy)) / (flick.fy || 1))\n : 0\n );\n\n const speedX = d.fs.zoom.panDuration - 10 * factorX;\n const speedY = d.fs.zoom.panDuration - 10 * factorY;\n const frictionX = d.fs.zoom.panFriction + factorX / 50;\n const frictionY = d.fs.zoom.panFriction + factorY / 50;\n\n d.bodyX.current?.useDuration(speedX).useFriction(frictionX);\n d.bodyY.current?.useDuration(speedY).useFriction(frictionY);\n\n d.tgtX.current?.add(fx);\n d.tgtY.current?.add(fy);\n\n d.animRef.current?.start();\n };\n\n const isMouseDown = (e as any).nativeEvent instanceof MouseEvent;\n const node: any = isMouseDown ? document : window;\n\n moveStore\n .add(node, \"touchmove\", onMove as any, { passive: false })\n .add(node, \"touchend\", onUp as any)\n .add(node, \"mousemove\", onMove as any, { passive: false })\n .add(node, \"mouseup\", onUp as any);\n\n dragStore\n .add(window, \"touchcancel\", onUp as any)\n .add(window, \"contextmenu\", onUp as any);\n },\n [d, dragStore, moveStore, forceBoost, setGrabbing]\n );\n\n React.useEffect(() => {\n return () => {\n moveStore.clear();\n dragStore.clear();\n document.documentElement.classList.remove(\"rmg-pan-grabbing\");\n };\n }, [moveStore, dragStore]);\n\n return { handlePanPointerStart };\n}","import { usePanAnimation } from \"./usePanAnimation\";\nimport { usePanDrag } from \"./usePanDrag\";\nimport type { PanRuntimeDeps } from \"./types\";\n\nexport function usePanRuntime(deps: PanRuntimeDeps) {\n usePanAnimation(deps);\n return usePanDrag(deps);\n}","import { MediaItem } from \"../shared/types/media\";\nimport type { PlyrSourceBuilder } from \"./plyrTypes\";\n\nexport type PlyrProp = { source: Plyr.SourceInfo; options: Plyr.Options } | null;\n\nexport const defaultPlyrOptions: Plyr.Options = {\n controls: [\"play-large\", \"play\", \"progress\", \"current-time\", \"volume\", \"fullscreen\"],\n ratio: \"16:9\",\n fullscreen: { enabled: true, fallback: true, iosNative: true },\n};\n\nexport const defaultPlyrSource: PlyrSourceBuilder = (item) => ({\n type: \"video\",\n poster: (item as any).thumb,\n sources: [{ src: (item as any).src, type: \"video/mp4\" }],\n});\n\nexport const getSource = (item: MediaItem) =>\n ({\n type: \"video\",\n sources: [{ src: (item as any).src, type: \"video/mp4\" }],\n }) as Plyr.SourceInfo;\n\nexport const getOptions = () => defaultPlyrOptions;\n\nexport const isVideoItem = (m: MediaItem) => m.kind === \"video\";\n\nexport function buildPlyrProps(\n items: MediaItem[],\n getSource: (item: MediaItem, index: number) => Plyr.SourceInfo,\n resolveOptions: (item: MediaItem, index: number) => Plyr.Options\n): PlyrProp[] {\n return items.map((item, index) => {\n if (!isVideoItem(item)) return null;\n return { source: getSource(item, index), options: resolveOptions(item, index) };\n });\n}\n\nexport function mergePlyrOptions(\n base: Plyr.Options,\n options?: Plyr.Options | ((item: MediaItem, index: number) => Plyr.Options)\n) {\n return (item: MediaItem, index: number) => {\n const resolved = typeof options === \"function\" ? options(item, index) : (options ?? base);\n return { ...base, ...resolved };\n };\n}\n\nexport function detectProvider(source: any): \"youtube\" | \"vimeo\" | \"mp4\" | \"other\" {\n const provider = String(source?.sources?.[0]?.provider ?? \"\").toLowerCase();\n if (provider === \"youtube\") return \"youtube\";\n if (provider === \"vimeo\") return \"vimeo\";\n\n const src0 = String(source?.sources?.[0]?.src ?? \"\").toLowerCase();\n const looksMp4 = src0.endsWith(\".mp4\") || src0.includes(\".mp4?\");\n if (looksMp4) return \"mp4\";\n\n return \"other\";\n}\n\nexport function isVideoSlideElement(el: HTMLElement | undefined | null) {\n if (!el) return false;\n if (el.classList?.contains(\"rmg__player\")) return true;\n if (el.tagName.toLowerCase() === \"video\") return true;\n return false;\n}","import * as React from \"react\";\nimport { isVideoSlideElement } from \"../../video/plyr\";\n\ntype ZoomStateRefs = {\n previousZoom: React.RefObject<{ x: number; y: number }>;\n panRef: React.RefObject<{ x: number; y: number }>;\n scaleRef: React.RefObject<number>;\n};\n\ntype ForceResetArgs = {\n setScale: (n: number) => void;\n zoomState: ZoomStateRefs;\n imageRefs: React.RefObject<React.RefObject<HTMLDivElement | null>[]>;\n resetPan: () => void;\n transition?: string;\n};\n\nexport function forceResetZoom(args: ForceResetArgs) {\n const { setScale, zoomState, imageRefs, resetPan } = args;\n\n const transition =\n args.transition ?? \"transform 0.2s cubic-bezier(.4,0,.22,1)\";\n const transform = \"translate(0, 0) scale(1)\";\n\n setScale(1);\n zoomState.previousZoom.current.x = 0;\n zoomState.previousZoom.current.y = 0;\n zoomState.panRef.current = { x: 0, y: 0 };\n zoomState.scaleRef.current = 1;\n\n imageRefs.current.forEach((ref) => {\n const element = ref.current;\n if (!element) return;\n\n const child = element.children[0] as HTMLElement | undefined;\n if (isVideoSlideElement(child)) return;\n\n const match = transition.match(/([\\d.]+)s/);\n const durationMs = match ? parseFloat(match[1]) * 1000 : 300;\n\n element.style.transition = transition;\n if (child) child.style.transition = transition;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n (element as any).offsetWidth;\n\n element.style.transform = transform;\n if (child) child.style.transform = transform;\n\n window.setTimeout(() => {\n element.style.transition = \"\";\n if (child) child.style.transition = \"\";\n }, durationMs + 50);\n });\n\n resetPan();\n}","import * as React from \"react\";\nimport { isVideoSlideElement } from \"../../video/plyr\";\n\ntype ZoomStateRefs = {\n previousZoom: React.RefObject<{ x: number; y: number }>;\n panRef: React.RefObject<{ x: number; y: number }>;\n scaleRef: React.RefObject<number>;\n suppressLoopRef: React.RefObject<boolean>;\n changingSlides: React.RefObject<boolean>;\n};\n\ntype ResetAllArgs = {\n setScale: (n: number) => void;\n zoomState: ZoomStateRefs;\n imageRefs: React.RefObject<React.RefObject<HTMLDivElement | null>[]>;\n resetPan?: () => void;\n transition?: string;\n unlockDelayMs?: number;\n};\n\nexport function resetZoomForSlideChange(args: ResetAllArgs) {\n const { setScale, zoomState, imageRefs, resetPan } = args;\n\n if (zoomState.scaleRef.current === 1) return;\n\n zoomState.changingSlides.current = true;\n\n setScale(1);\n zoomState.previousZoom.current.x = 0;\n zoomState.previousZoom.current.y = 0;\n zoomState.panRef.current = { x: 0, y: 0 };\n zoomState.scaleRef.current = 1;\n zoomState.suppressLoopRef.current = false;\n\n const transition = \"transform 0.2s cubic-bezier(.4,0,.22,1)\";\n const transform = \"translate(0, 0) scale(1)\";\n\n imageRefs.current.forEach((ref) => {\n const element = ref.current;\n if (!element) return;\n\n const child = element.children[0] as HTMLElement | undefined;\n if (isVideoSlideElement(child)) return;\n\n const match = transition.match(/([\\d.]+)s/);\n const durationMs = match ? parseFloat(match[1]) * 1000 : 300;\n\n element.style.transition = transition;\n if (child) child.style.transition = transition;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n (element as any).offsetWidth;\n\n element.style.transform = transform;\n if (child) child.style.transform = transform;\n\n setTimeout(() => {\n element.style.transition = \"\";\n if (child) child.style.transition = \"\";\n }, durationMs + 50);\n });\n\n resetPan?.();\n\n const unlockDelayMs = 200;\n setTimeout(() => {\n zoomState.changingSlides.current = false;\n }, unlockDelayMs);\n}","import * as React from \"react\";\nimport { isVideoSlideElement } from \"../../video/plyr\";\nimport { Vector1DType } from \"../../shared/motion/vector1d\";\nimport { LimitType } from \"../../shared/motion/limit\";\nimport { ScrollBodyType } from \"../../shared/motion/scrollBody\";\nimport { PercentOfViewType, ScrollBoundsType } from \"../../shared/motion/scrollBounds\";\n\ntype AnimationsLike = {\n resetBlend: () => void;\n};\n\ntype ResetZoomArgs = {\n currentImage: React.RefObject<HTMLElement | null>;\n\n // vectors\n locX: React.RefObject<Vector1DType | null>;\n prevX: React.RefObject<Vector1DType | null>;\n offX: React.RefObject<Vector1DType | null>;\n tgtX: React.RefObject<Vector1DType | null>;\n\n locY: React.RefObject<Vector1DType | null>;\n prevY: React.RefObject<Vector1DType | null>;\n offY: React.RefObject<Vector1DType | null>;\n tgtY: React.RefObject<Vector1DType | null>;\n\n // bodies + bounds\n bodyX: React.RefObject<ScrollBodyType | null>;\n bodyY: React.RefObject<ScrollBodyType | null>;\n boundsX: React.RefObject<ScrollBoundsType | null>;\n boundsY: React.RefObject<ScrollBoundsType | null>;\n\n // factories\n ScrollBody: (\n loc: Vector1DType,\n off: Vector1DType,\n prev: Vector1DType,\n tgt: Vector1DType,\n duration: number,\n friction: number\n ) => ScrollBodyType;\n\n ScrollBounds: (\n lim: LimitType,\n off: Vector1DType,\n tgt: Vector1DType,\n body: ScrollBodyType,\n pov: PercentOfViewType,\n duration: number\n ) => ScrollBoundsType;\n\n // sizing helpers\n baseFitSizeC: (\n img: HTMLImageElement,\n containerW: number,\n containerH: number\n ) => { baseW: number; baseH: number };\n\n boundsForCurrent: (\n scale: number,\n imgW: number,\n imgH: number,\n viewW?: number,\n viewH?: number\n ) => { x: LimitType; y: LimitType; povX: any; povY: any };\n\n // settings\n panDuration: number;\n panFriction: number;\n\n // animation runtime\n animRef: React.RefObject<AnimationsLike | null>;\n};\n\nexport function resetPanForScale1(args: ResetZoomArgs) {\n const {\n currentImage,\n locX,\n prevX,\n offX,\n tgtX,\n locY,\n prevY,\n offY,\n tgtY,\n bodyX,\n bodyY,\n boundsX,\n boundsY,\n ScrollBody,\n ScrollBounds,\n baseFitSizeC,\n boundsForCurrent,\n panDuration,\n panFriction,\n animRef,\n } = args;\n\n const container = currentImage.current;\n if (\n !container ||\n !locX.current ||\n !prevX.current ||\n !offX.current ||\n !tgtX.current ||\n !bodyX.current ||\n !boundsX.current ||\n !tgtX.current\n ) return;\n\n const firstChild = container.children[0] as HTMLElement | undefined;\n if (isVideoSlideElement(firstChild)) return;\n\n const imgEl = firstChild as HTMLImageElement;\n\n const rect = container.getBoundingClientRect();\n const containerW = rect.width;\n const containerH = rect.height;\n\n const { baseW, baseH } = baseFitSizeC(imgEl, containerW, containerH);\n\n locX.current!.set(0); prevX.current!.set(0); offX.current!.set(0); tgtX.current!.set(0);\n locY.current!.set(0); prevY.current!.set(0); offY.current!.set(0); tgtY.current!.set(0);\n\n bodyX.current = ScrollBody(\n locX.current!, offX.current!, prevX.current!, tgtX.current!,\n panDuration, panFriction\n ).sync();\n bodyY.current = ScrollBody(\n locY.current!, offY.current!, prevY.current!, tgtY.current!,\n panDuration, panFriction\n ).sync();\n\n const { x: limX2, y: limY2, povX, povY } =\n boundsForCurrent(1, baseW, baseH, containerW, containerH);\n\n boundsX.current = ScrollBounds(limX2, offX.current!, tgtX.current!, bodyX.current!, povX, panDuration);\n boundsY.current = ScrollBounds(limY2, offY.current!, tgtY.current!, bodyY.current!, povY, panDuration);\n\n tgtX.current!.set(limX2.constrain(tgtX.current!.get()));\n tgtY.current!.set(limY2.constrain(tgtY.current!.get()));\n\n animRef.current?.resetBlend();\n}","import { Limit } from \"../../shared/motion/limit\";\nimport { PercentOfView } from \"../../shared/motion/scrollBounds\";\n\ntype BoundsForCurrentArgs = {\n scale: number;\n imgW: number;\n imgH: number;\n currentImageEl: HTMLElement | null;\n viewW?: number;\n viewH?: number;\n};\n\nexport function boundsForCurrent(args: BoundsForCurrentArgs) {\n const {\n scale,\n imgW,\n imgH,\n currentImageEl,\n viewW,\n viewH\n } = args;\n\n const rect = currentImageEl?.getBoundingClientRect() || null;\n\n const vw =\n viewW ??\n rect?.width ??\n document.documentElement.clientWidth;\n\n const vh =\n viewH ??\n rect?.height ??\n window.innerHeight;\n\n const scaledW = imgW * scale;\n const scaledH = imgH * scale;\n\n const offsetW = (vw - imgW) / 2;\n const offsetH = (vh - imgH) / 2;\n\n const xMin =\n scaledW <= vw\n ? -offsetW - (scaledW - vw) / 2\n : -(scaledW - vw) - offsetW;\n const xMax =\n scaledW <= vw\n ? -offsetW - (scaledW - vw) / 2\n : -offsetW;\n\n const yMin =\n scaledH <= vh\n ? -offsetH - (scaledH - vh) / 2\n : -(scaledH - vh) - offsetH;\n const yMax =\n scaledH <= vh\n ? -offsetH - (scaledH - vh) / 2\n : -offsetH;\n\n return {\n x: Limit(xMin, xMax),\n y: Limit(yMin, yMax),\n povX: PercentOfView(vw),\n povY: PercentOfView(vh),\n };\n}","\"use client\";\n\nimport * as React from \"react\";\nimport { MediaItem } from \"../../shared/types/media\";\n\nexport type UseWrappedItemsAndRefsArgs = {\n normalizedItems: MediaItem[];\n wrappedItems: MediaItem[];\n setWrappedItems: React.Dispatch<React.SetStateAction<MediaItem[]>>;\n imageRefs: React.RefObject<React.RefObject<HTMLDivElement | null>[]>;\n};\n\nexport function useWrappedItemsAndRefs(args: UseWrappedItemsAndRefsArgs) {\n const { normalizedItems, wrappedItems, setWrappedItems, imageRefs } = args;\n\n React.useEffect(() => {\n if (!normalizedItems.length) return;\n\n const first = normalizedItems[0];\n const last = normalizedItems[normalizedItems.length - 1];\n\n setWrappedItems([last, ...normalizedItems, first]);\n }, [normalizedItems, setWrappedItems]);\n\n React.useEffect(() => {\n if (!wrappedItems.length) return;\n imageRefs.current = wrappedItems.map(() => React.createRef<HTMLDivElement>());\n }, [wrappedItems, imageRefs]);\n}","\"use client\";\n\nimport * as React from \"react\";\n\nexport type WindowSize = { width: number; height: number };\n\nfunction readSize(): WindowSize {\n return {\n width: document.documentElement.clientWidth,\n height: window.innerHeight,\n };\n}\n\nexport function useWindowSize(): WindowSize {\n const [size, setSize] = React.useState<WindowSize>(() => {\n // SSR-safe initial value\n if (typeof window === \"undefined\") return { width: 1024, height: 768 };\n return readSize();\n });\n\n React.useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const onResize = () => setSize(readSize());\n window.addEventListener(\"resize\", onResize);\n onResize();\n\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n return size;\n}","\"use client\";\n\nimport * as React from \"react\";\nimport { PlyrSourceBuilder } from \"./plyrTypes\";\nimport { buildPlyrProps, defaultPlyrOptions, defaultPlyrSource, mergePlyrOptions, PlyrProp } from \"./plyr\";\nimport { MediaItem } from \"../shared/types/media\";\n\nexport type UsePlyrPropsArgs = {\n items: MediaItem[];\n source?: PlyrSourceBuilder;\n options?: Plyr.Options | ((item: MediaItem, index: number) => Plyr.Options); \n};\n\nexport function usePlyrProps(args: UsePlyrPropsArgs): PlyrProp[] {\n const { items, source, options } = args;\n\n return React.useMemo(() => {\n if (!items?.length) return [];\n\n const getSource = (item: MediaItem, index: number) =>\n (source ?? defaultPlyrSource)(item, index);\n\n const getOptions = mergePlyrOptions(defaultPlyrOptions, options);\n\n return buildPlyrProps(items, getSource, getOptions);\n }, [items, source, options]);\n}","import type { APITypes } from \"plyr-react\";\n\n/**\n * Prevents \"click after drag\" from toggling play/pause or triggering other click handlers\n * when the user was actually panning/dragging on the player surface.\n */\nexport function installDragClickSwallower(plyr: any) {\n const container: HTMLElement | undefined = plyr?.elements?.container;\n const controls: HTMLElement | undefined = plyr?.elements?.controls;\n if (!container) return;\n\n if ((plyr as any).__rmgDragSwallowCleanup) return;\n\n const THRESH_PX = 6;\n\n let downX = 0;\n let downY = 0;\n let didDrag = false;\n let activePointerId: number | null = null;\n\n const isInControls = (t: EventTarget | null) =>\n !!(controls && t instanceof Node && controls.contains(t));\n\n const stopAll = (e: Event) => {\n e.stopImmediatePropagation();\n e.stopPropagation();\n e.preventDefault();\n };\n\n const onPointerDownCapture = (e: PointerEvent) => {\n if (isInControls(e.target)) return;\n\n activePointerId = e.pointerId;\n downX = e.clientX;\n downY = e.clientY;\n didDrag = false;\n };\n\n const onPointerMoveCapture = (e: PointerEvent) => {\n if (activePointerId == null || e.pointerId !== activePointerId) return;\n const dx = e.clientX - downX;\n const dy = e.clientY - downY;\n if (!didDrag && Math.hypot(dx, dy) > THRESH_PX) didDrag = true;\n };\n\n const onPointerUpCapture = (e: PointerEvent) => {\n if (activePointerId == null || e.pointerId !== activePointerId) return;\n\n if (didDrag && !isInControls(e.target)) stopAll(e);\n\n activePointerId = null;\n\n if (didDrag) {\n window.setTimeout(() => {\n didDrag = false;\n }, 0);\n }\n };\n\n const onClickCapture = (e: MouseEvent) => {\n if (didDrag && !isInControls(e.target)) stopAll(e);\n };\n\n const onTouchEndCapture = (e: TouchEvent) => {\n if (didDrag && !isInControls(e.target)) stopAll(e);\n };\n\n container.addEventListener('pointerdown', onPointerDownCapture, { capture: true });\n container.addEventListener('pointermove', onPointerMoveCapture, { capture: true });\n container.addEventListener('pointerup', onPointerUpCapture, { capture: true });\n container.addEventListener('pointercancel', onPointerUpCapture, { capture: true } as any);\n container.addEventListener('click', onClickCapture, { capture: true });\n container.addEventListener('touchend', onTouchEndCapture, { capture: true, passive: false });\n\n (plyr as any).__rmgDragSwallowCleanup = () => {\n container.removeEventListener('pointerdown', onPointerDownCapture, { capture: true } as any);\n container.removeEventListener('pointermove', onPointerMoveCapture, { capture: true } as any);\n container.removeEventListener('pointerup', onPointerUpCapture, { capture: true } as any);\n container.removeEventListener('pointercancel', onPointerUpCapture, { capture: true } as any);\n container.removeEventListener('click', onClickCapture, { capture: true } as any);\n container.removeEventListener('touchend', onTouchEndCapture, { capture: true } as any);\n delete (plyr as any).__rmgDragSwallowCleanup;\n };\n}\n\n/**\n * Adds a transparent shield layer over Plyr to:\n * - block dblclick (avoid browser fullscreen / zoom weirdness)\n * - prevent accidental \"dbl-tap zoom\"\n * - optionally toggle play/pause on single click (your current behavior)\n * - installs the drag-click swallower\n */\nexport function installDblclickGuardWhenReady(player: APITypes | null) {\n if (!player) return;\n const inst: any = player;\n const plyr = inst?.plyr;\n if (!plyr) return;\n\n const attach = () => {\n const container: HTMLElement | undefined = plyr?.elements?.container;\n const controls: HTMLElement | undefined = plyr?.elements?.controls;\n if (!container) { requestAnimationFrame(attach); return; }\n\n (plyr as any).__rmgGuardCleanup?.();\n\n if (getComputedStyle(container).position === 'static') {\n container.style.position = 'relative';\n }\n\n let shield = container.querySelector<HTMLElement>('.rmg-plyr-gesture-shield');\n if (!shield) {\n shield = document.createElement('div');\n shield.className = 'rmg-plyr-gesture-shield';\n Object.assign(shield.style, {\n position: 'absolute',\n inset: '0',\n zIndex: '2',\n background: 'transparent',\n pointerEvents: 'none',\n });\n container.appendChild(shield);\n }\n\n if (controls) {\n const currentZ = getComputedStyle(controls).zIndex;\n if (!currentZ || currentZ === 'auto' || Number(currentZ) < 3) {\n (controls.style as any).zIndex = '3';\n }\n }\n\n const stop = (e: Event) => { e.stopImmediatePropagation(); e.preventDefault(); };\n\n const onDbl = (e: MouseEvent) => stop(e);\n shield.addEventListener('dblclick', onDbl, { capture: true });\n\n let lastTap = 0;\n const onTouchEnd = (e: TouchEvent) => {\n const now = Date.now();\n if (now - lastTap < 320) stop(e);\n lastTap = now;\n };\n shield.addEventListener('touchend', onTouchEnd, { capture: true, passive: false });\n\n const onClick = (e: MouseEvent) => {\n const p = plyr;\n if (p?.paused) p.play(); else p?.pause();\n e.stopPropagation();\n e.preventDefault();\n };\n shield.addEventListener('click', onClick, { capture: true });\n\n const onContainerDbl = (e: MouseEvent) => {\n if (!controls || !(controls.contains(e.target as Node))) stop(e);\n };\n container.addEventListener('dblclick', onContainerDbl, { capture: true });\n\n installDragClickSwallower(plyr);\n\n (plyr as any).__rmgGuardCleanup = () => {\n shield.removeEventListener('dblclick', onDbl as any, { capture: true } as any);\n shield.removeEventListener('touchend', onTouchEnd as any, { capture: true } as any);\n shield.removeEventListener('click', onClick as any, { capture: true } as any);\n container.removeEventListener('dblclick', onContainerDbl as any, { capture: true } as any);\n };\n };\n\n plyr.on?.('ready', attach);\n requestAnimationFrame(attach);\n plyr.on?.('destroyed', () => (plyr as any).__rmgGuardCleanup?.());\n}","/* eslint-disable @typescript-eslint/no-explicit-any */\n'use client';\n\nimport * as React from 'react';\n\nfunction resolvePlyrComponent(mod: any) {\n return mod?.Plyr ?? mod?.default?.Plyr ?? mod?.default;\n}\n\nconst LazyPlyr = React.lazy(async () => {\n const mod = await import('plyr-react');\n const Comp = resolvePlyrComponent(mod);\n\n if (!Comp) {\n throw new Error(\n `LazyPlyr: could not resolve Plyr component from plyr-react import. Keys: ${Object.keys(mod ?? {}).join(\n ', '\n )}`\n );\n }\n\n return { default: Comp };\n}) as unknown as React.ComponentType<any>;\n\nexport const Plyr = React.forwardRef<any, any>(function PlyrForwarded(props, ref) {\n return <LazyPlyr {...props} ref={ref} />;\n});","\"use client\";\n\nimport * as React from \"react\";\nimport type { APITypes } from \"plyr-react\";\nimport { detectProvider, PlyrProp } from \"../video/plyr\";\nimport { installDblclickGuardWhenReady } from \"../video/plyrGuards\";\nimport { Plyr } from \"../video/LazyPlyr\";\nimport { MediaItem } from \"../shared/types/media\";\nimport { FsCaptionPlacement, FsCaptionRenderArgs } from \"./types\";\n\ntype RenderFullscreenSlidesArgs = {\n // data\n items: MediaItem[];\n plyrList: PlyrProp[];\n\n // positioning\n getTransform: (index: number) => string;\n\n // refs\n imageRefs: React.RefObject<React.RefObject<HTMLDivElement | null>[]>;\n playerRefs: React.RefObject<(APITypes | null)[]>;\n cells: React.RefObject<{ element: HTMLElement; index: number }[]>;\n\n // zoom/pan integration\n isZoomed: boolean;\n showFullscreenSlider: boolean;\n defaultPlayerStyle: React.CSSProperties;\n fsVideoStyle?: React.CSSProperties;\n fsVideoClassName?: string;\n\n onPanPointerDown: (e: React.PointerEvent<HTMLDivElement>, imageRef: React.RefObject<HTMLDivElement | null>) => void;\n onSuppressNextClickCapture: (e: React.SyntheticEvent) => void;\n\n // caption\n renderCaption?: (args: FsCaptionRenderArgs) => React.ReactNode;\n captionClassName?: string;\n captionStyle?: React.CSSProperties;\n fsCaptionPlacement?: FsCaptionPlacement;\n fsCaptionWidth?: number;\n fsCaptionHeight?: number;\n fsCaptionBreakpoint?: number;\n\n resolveFsCaptionPlacement: (\n placement: FsCaptionPlacement | undefined,\n breakpoint: number | undefined,\n viewportWidth: number\n ) => FsCaptionPlacement | null;\n\n // styling module class (was styles.imgMargin + styles.fullscreenImages)\n styles: {\n imgMargin: string;\n fullscreenImages: string;\n };\n\n // optional image renderer\n renderImage?: (args: {\n item: Extract<MediaItem, { kind: \"image\" }>;\n index: number;\n isZoomed: boolean;\n className: string;\n baseStyle: React.CSSProperties;\n }) => React.ReactNode;\n};\n\nexport function renderFullscreenSlides(opts: RenderFullscreenSlidesArgs) {\n const {\n items,\n plyrList,\n getTransform,\n imageRefs,\n playerRefs,\n cells,\n isZoomed,\n showFullscreenSlider,\n defaultPlayerStyle,\n fsVideoStyle,\n fsVideoClassName,\n onPanPointerDown,\n onSuppressNextClickCapture,\n renderCaption,\n captionClassName,\n captionStyle,\n fsCaptionPlacement,\n fsCaptionWidth,\n fsCaptionHeight,\n fsCaptionBreakpoint,\n resolveFsCaptionPlacement,\n styles,\n renderImage,\n } = opts;\n\n const vw =\n typeof window !== \"undefined\" ? document.documentElement.clientWidth : 1024;\n\n const effectivePlacement = resolveFsCaptionPlacement(\n fsCaptionPlacement,\n fsCaptionBreakpoint,\n vw\n );\n\n const isHorizontal =\n effectivePlacement === \"left\" || effectivePlacement === \"right\";\n const isVertical =\n effectivePlacement === \"top\" || effectivePlacement === \"bottom\";\n\n const captionFirst = effectivePlacement === \"left\" || effectivePlacement === \"top\";\n\n const DEFAULT_SIDE = 280;\n const DEFAULT_TOP_BOTTOM = 200;\n\n const sideWidth = fsCaptionWidth ?? DEFAULT_SIDE;\n const topBottomHeight = fsCaptionHeight ?? DEFAULT_TOP_BOTTOM;\n\n return items.map((item, index) => {\n const imageRef = imageRefs.current[index];\n const plyr = plyrList[index];\n\n const captionNode = renderCaption ? renderCaption({ item, index, isZoomed }) : null;\n\n const provider =\n item.kind === \"video\" ? detectProvider(plyr?.source) : \"other\";\n\n return (\n <div\n key={`${item.src}-${index}`}\n data-rmg-fs-slide=\"true\"\n data-index={index}\n ref={(el: HTMLDivElement | null) => {\n if (el && !cells.current.some((c) => c.element === el)) {\n cells.current.push({ element: el as unknown as HTMLElement, index });\n }\n }}\n style={{\n transform: getTransform(index),\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n position: \"absolute\",\n left: 0,\n minWidth: \"100%\",\n height: \"100%\",\n margin: \"auto\",\n touchAction: \"none\",\n }}\n className={styles.imgMargin}\n >\n <div\n style={{\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: isHorizontal ? \"row\" : \"column\",\n justifyContent: \"center\",\n }}\n >\n {/* Caption (if placed before image) */}\n {captionNode && captionFirst && (\n <div\n className={captionClassName}\n data-rmg-fs-caption=\"true\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flex: isHorizontal ? `0 0 ${sideWidth}px` : \"0 0 auto\",\n alignSelf: \"stretch\",\n textAlign: \"left\",\n pointerEvents: showFullscreenSlider ? \"auto\" : \"none\",\n padding: \"0.75rem 1rem\",\n color: \"#fff\",\n fontSize: \"0.875rem\",\n width: isHorizontal ? sideWidth : \"100%\",\n height: isVertical ? topBottomHeight : \"auto\",\n boxSizing: \"border-box\",\n ...captionStyle,\n }}\n >\n {captionNode}\n </div>\n )}\n\n <div\n ref={imageRef}\n onPointerDown={(e) => onPanPointerDown(e, imageRef)}\n onClickCapture={onSuppressNextClickCapture as any}\n style={{\n overflow: \"visible\",\n touchAction: \"none\",\n height: isVertical\n ? `calc(100% - ${captionNode ? topBottomHeight : 0}px)`\n : \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {item.kind === \"video\" ? (\n <div\n data-index={index}\n style={{ ...defaultPlayerStyle, ...(fsVideoStyle ?? {}) }}\n className={[\"rmg__player\", fsVideoClassName].filter(Boolean).join(\" \")}\n data-rmg-plyr=\"true\"\n data-rmg-plyr-index={String(index)}\n data-rmg-plyr-provider={provider}\n >\n <Plyr\n source={plyr!.source}\n options={plyr!.options}\n ref={(player: APITypes | null) => {\n playerRefs.current[index] = player;\n installDblclickGuardWhenReady(player);\n }}\n />\n </div>\n ) : renderImage ? (\n renderImage({\n item: item as any,\n index,\n isZoomed,\n className: styles.fullscreenImages,\n baseStyle: {\n maxWidth: \"100%\",\n maxHeight: \"100%\",\n objectFit: \"contain\",\n touchAction: \"manipulation\",\n transformOrigin: \"0 0\",\n transform: \"translate(0, 0) scale(1)\",\n cursor: isZoomed ? \"grab\" : \"zoom-in\",\n userSelect: \"none\",\n },\n })\n ) : (\n <img\n src={item.src}\n alt={item.alt ?? `cell-${index}`}\n srcSet={item.srcSet}\n sizes={item.sizes}\n data-index={index}\n className={styles.fullscreenImages}\n draggable=\"false\"\n style={{\n maxWidth: \"100%\",\n maxHeight: \"100%\",\n objectFit: \"contain\",\n touchAction: \"manipulation\",\n transformOrigin: \"0 0\",\n transform: \"translate(0, 0) scale(1)\",\n cursor: isZoomed ? \"grab\" : \"zoom-in\",\n userSelect: \"none\",\n }}\n />\n )}\n </div>\n\n {/* Caption (if placed after image) */}\n {captionNode && !captionFirst && (\n <div\n className={captionClassName}\n data-rmg-fs-caption=\"true\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flex: isHorizontal ? `0 0 ${sideWidth}px` : \"0 0 auto\",\n alignSelf: \"stretch\",\n textAlign: \"left\",\n pointerEvents: showFullscreenSlider ? \"auto\" : \"none\",\n padding: \"0.75rem 1rem\",\n color: \"#fff\",\n fontSize: \"0.875rem\",\n width: isHorizontal ? sideWidth : \"100%\",\n height: isVertical ? topBottomHeight : \"100%\",\n boxSizing: \"border-box\",\n ...captionStyle,\n }}\n >\n {captionNode}\n </div>\n )}\n </div>\n </div>\n );\n });\n}","export type WrappedTransformArgs = {\n length: number;\n sign: number;\n};\n\nexport function createWrappedTransform({ length, sign }: WrappedTransformArgs) {\n return (index: number) => {\n const originalCount = length - 2;\n if (index === 0) return `translateX(${-100 * sign}%)`;\n if (index === length - 1) return `translateX(${originalCount * 100 * sign}%)`;\n return `translateX(${(index - 1) * 100 * sign}%)`;\n };\n}\n\nexport function createSingleTransform() {\n return () => `translateX(0%)`;\n}","/* eslint-disable @typescript-eslint/no-explicit-any */\n'use client';\n\nimport * as React from 'react';\n\ntype Point = { x: number; y: number };\n\ntype RefDiv = React.RefObject<HTMLDivElement | null>;\n\nexport type UseGlobalPinchZoomArgs = {\n scaleRef: React.RefObject<number>;\n zoomCtx: any;\n zoomTo: (\n zoomCtx: any,\n args: {\n destZoomLevel: number;\n centerPoint: Point;\n imageRef: RefDiv;\n }\n ) => void;\n isZoomed: boolean;\n currentImage: React.RefObject<HTMLDivElement | null>;\n imageRefs: React.RefObject<Array<RefDiv | null>>;\n fullscreenSliderApi: React.RefObject<{ centerSlider: () => void } | null>;\n rebuildPanBodies: () => void;\n baseFitSizeC: (\n img: HTMLImageElement,\n containerW: number,\n containerH: number\n ) => { baseW: number; baseH: number };\n boundsForCurrent: (\n scale: number,\n baseW: number,\n baseH: number,\n containerW: number,\n containerH: number\n ) => {\n x: { constrain: (n: number) => number };\n y: { constrain: (n: number) => number };\n povX: any;\n povY: any;\n };\n ScrollBounds: (\n lim: any,\n off: any,\n tgt: any,\n body: any,\n pov: any,\n duration: number\n ) => any;\n boundsX: React.RefObject<any>;\n boundsY: React.RefObject<any>;\n offX: React.RefObject<any>;\n offY: React.RefObject<any>;\n tgtX: React.RefObject<any>;\n tgtY: React.RefObject<any>;\n bodyX: React.RefObject<any>;\n bodyY: React.RefObject<any>;\n animRef: React.RefObject<{ start: () => void } | null>;\n panDuration: number;\n findImgAtPoint: (doc: Document, x: number, y: number) => HTMLDivElement | null;\n readDataIndex: (el: HTMLDivElement) => number | null;\n distance: (t0: Touch, t1: Touch) => number;\n midpoint: (t0: Touch, t1: Touch) => Point;\n};\n\nfunction isPinchGesture(e: WheelEvent): boolean {\n if (e.ctrlKey) return true;\n\n const absX = Math.abs(e.deltaX);\n const absY = Math.abs(e.deltaY);\n if (absX < 1 && absY < 1) return false;\n\n const ratio = absX / absY;\n return ratio >= 0.8 && ratio <= 1.2;\n}\n\nexport function useGlobalPinchZoom(args: UseGlobalPinchZoomArgs) {\n const {\n scaleRef,\n zoomCtx,\n zoomTo,\n isZoomed,\n currentImage,\n imageRefs,\n fullscreenSliderApi,\n rebuildPanBodies,\n baseFitSizeC,\n boundsForCurrent,\n ScrollBounds,\n boundsX,\n boundsY,\n offX,\n offY,\n tgtX,\n tgtY,\n bodyX,\n bodyY,\n animRef,\n panDuration,\n findImgAtPoint,\n readDataIndex,\n distance,\n midpoint,\n } = args;\n\n const isPinching = React.useRef(false);\n const isTouchPinching = React.useRef(false);\n const pinchJustEnded = React.useRef(false);\n\n const startDist = React.useRef(0);\n const startScale = React.useRef(1);\n\n const handlePinchWheel = React.useCallback(\n (e: WheelEvent, imageRef: RefDiv) => {\n if (!imageRef.current) return;\n if (!e.ctrlKey) return;\n e.preventDefault();\n\n fullscreenSliderApi.current?.centerSlider();\n\n if (scaleRef.current > 1.01) {\n isPinching.current = true;\n }\n\n const { ctrlKey, deltaMode } = e;\n let { deltaY } = e;\n\n if (deltaMode === 1) {\n deltaY *= 15;\n }\n\n const divisor = ctrlKey ? 100 : 300;\n const scaleDiff = 1 - deltaY / divisor;\n const destZoomLevel = scaleRef.current * scaleDiff;\n\n zoomTo(zoomCtx, {\n destZoomLevel,\n centerPoint: { x: e.clientX, y: e.clientY },\n imageRef,\n });\n },\n [fullscreenSliderApi, scaleRef, zoomTo, zoomCtx]\n );\n\n const handleWheelPan = React.useCallback(\n (e: WheelEvent) => {\n if (!isZoomed) return;\n if (isPinchGesture(e)) return;\n if (e.ctrlKey) return;\n if (!currentImage.current) return;\n\n e.preventDefault();\n\n rebuildPanBodies();\n\n const container = currentImage.current as HTMLDivElement;\n const rect = container.getBoundingClientRect();\n const containerW = rect.width;\n const containerH = rect.height;\n\n const { baseW, baseH } = baseFitSizeC(\n container.children[0] as HTMLImageElement,\n containerW,\n containerH\n );\n\n const { x: limX, y: limY, povX, povY } = boundsForCurrent(\n scaleRef.current,\n baseW,\n baseH,\n containerW,\n containerH\n );\n\n boundsX.current = ScrollBounds(\n limX,\n offX.current!,\n tgtX.current!,\n bodyX.current!,\n povX,\n panDuration\n );\n boundsY.current = ScrollBounds(\n limY,\n offY.current!,\n tgtY.current!,\n bodyY.current!,\n povY,\n panDuration\n );\n\n let tx = (offX.current?.get() ?? 0) - e.deltaX;\n let ty = (offY.current?.get() ?? 0) - e.deltaY;\n\n tx = limX.constrain(tx);\n ty = limY.constrain(ty);\n\n tgtX.current?.set(tx);\n tgtY.current?.set(ty);\n\n bodyX.current?.useDuration(0).useFriction(1);\n bodyY.current?.useDuration(0).useFriction(1);\n\n animRef.current?.start();\n },\n [\n isZoomed,\n currentImage,\n rebuildPanBodies,\n baseFitSizeC,\n boundsForCurrent,\n scaleRef,\n boundsX,\n boundsY,\n ScrollBounds,\n offX,\n offY,\n tgtX,\n tgtY,\n bodyX,\n bodyY,\n animRef,\n panDuration,\n ]\n );\n\n React.useEffect(() => {\n window.addEventListener('wheel', handleWheelPan as any, { passive: false } as any);\n return () => window.removeEventListener('wheel', handleWheelPan as any);\n }, [handleWheelPan]);\n\n React.useLayoutEffect(() => {\n function pinchWheelHandler(e: WheelEvent) {\n const img = findImgAtPoint(document, e.clientX, e.clientY);\n if (!img) return;\n\n const idx = readDataIndex(img);\n if (idx == null) return;\n\n const matchedRef = imageRefs.current[idx];\n if (!matchedRef) return;\n\n currentImage.current = matchedRef.current;\n handlePinchWheel(e, matchedRef);\n }\n\n window.addEventListener('wheel', pinchWheelHandler, { passive: false });\n return () => window.removeEventListener('wheel', pinchWheelHandler);\n }, [findImgAtPoint, readDataIndex, imageRefs, currentImage, handlePinchWheel]);\n\n const onTouchStart = React.useCallback(\n (e: TouchEvent) => {\n if (e.touches.length !== 2) return;\n e.preventDefault();\n\n fullscreenSliderApi.current?.centerSlider();\n\n isTouchPinching.current = true;\n const [t0, t1] = [e.touches[0], e.touches[1]];\n startDist.current = distance(t0, t1);\n startScale.current = scaleRef.current;\n },\n [distance, fullscreenSliderApi, scaleRef]\n );\n\n const onTouchMove = React.useCallback(\n (e: TouchEvent, imageRef: RefDiv) => {\n if (!isTouchPinching.current || e.touches.length !== 2) return;\n e.preventDefault();\n\n const [t0, t1] = [e.touches[0], e.touches[1]];\n const currDist = distance(t0, t1);\n const factor = currDist / startDist.current;\n const destZoomLevel = startScale.current * factor;\n\n const center = midpoint(t0, t1);\n zoomTo(zoomCtx, { destZoomLevel, centerPoint: center, imageRef });\n },\n [distance, midpoint, zoomTo, zoomCtx]\n );\n\n const endPinch = React.useCallback(() => {\n if (!isTouchPinching.current) return;\n isTouchPinching.current = false;\n pinchJustEnded.current = true;\n }, []);\n\n React.useLayoutEffect(() => {\n function touchPinchMoveHandler(e: TouchEvent) {\n if (e.touches.length < 2) return;\n\n const mid = midpoint(e.touches[0], e.touches[1]);\n const img = findImgAtPoint(document, mid.x, mid.y);\n if (!img) return;\n\n const idx = readDataIndex(img);\n if (idx == null) return;\n\n const matchedRef = imageRefs.current[idx];\n if (!matchedRef) return;\n\n currentImage.current = matchedRef.current;\n onTouchMove(e, matchedRef);\n }\n\n window.addEventListener('touchstart', onTouchStart, { passive: false });\n window.addEventListener('touchmove', touchPinchMoveHandler, { passive: false });\n window.addEventListener('touchend', endPinch);\n window.addEventListener('touchcancel', endPinch);\n\n return () => {\n window.removeEventListener('touchstart', onTouchStart);\n window.removeEventListener('touchmove', touchPinchMoveHandler);\n window.removeEventListener('touchend', endPinch);\n window.removeEventListener('touchcancel', endPinch);\n };\n }, [\n onTouchStart,\n onTouchMove,\n endPinch,\n midpoint,\n findImgAtPoint,\n readDataIndex,\n imageRefs,\n currentImage,\n ]);\n\n return {\n isPinching,\n isTouchPinching\n };\n}","export type MediaItem =\n | {\n kind: \"image\";\n src: string;\n alt?: string;\n caption?: React.ReactNode;\n srcSet?: string;\n sizes?: string;\n width?: number;\n height?: number;\n }\n | {\n kind: \"video\";\n src: string;\n alt?: string;\n thumb?: string;\n caption?: React.ReactNode;\n };\n\nexport const toMediaItems = (urls: string[]): MediaItem[] =>\n urls.map((u) =>\n /\\.(mp4|webm|ogg)$/i.test(u)\n ? { kind: \"video\", src: u }\n : { kind: \"image\", src: u }\n );","export const DEFAULT_FULLSCREEN = {\n enabled: true,\n effects: {\n introDuration: 300,\n introEasing: \"cubic-bezier(.4,0,.22,1)\",\n introFade: false,\n slideFade: false,\n slideFadeDuration: 120,\n slideFadeEasing: \"cubic-bezier(.4,0,.22,1)\",\n thumbnailsFadeDuration: 300,\n thumbnailsFadeEasing: \"cubic-bezier(.4,0,.22,1)\",\n },\n slider: {\n duration: 25,\n friction: 0.68,\n },\n zoom: {\n clickZoomLevel: 2.5,\n maxZoomLevel: 3,\n panDuration: 43,\n panFriction: 0.68,\n },\n} as const;","import type { ThumbnailsOptions } from \"./types\";\n\nexport const DEFAULT_THUMBNAILS: Required<\n Pick<ThumbnailsOptions, \"layout\" | \"scroll\" | \"motion\">\n> = {\n layout: {\n position: \"bottom\",\n gap: 8,\n center: false,\n },\n scroll: {\n freeScroll: true,\n groupCells: false,\n loop: false,\n skipSnaps: false,\n centerActiveThumb: false,\n },\n motion: {\n selectDuration: 25,\n freeScrollDuration: 43,\n friction: 0.68,\n },\n};","import { DEFAULT_THUMBNAILS } from \"./thumbnails/defaults\";\n\nexport const DEFAULT_SLIDER = {\n layout: { gap: 20 },\n direction: { dir: \"ltr\" as const, axis: \"x\" as const },\n align: \"start\" as const,\n\n scroll: {\n groupCells: false,\n skipSnaps: false,\n freeScroll: false,\n loop: false,\n },\n\n lazyLoad: false,\n\n controls: {\n arrows: { enabled: true, arrow: {}, prev: {}, next: {} },\n dots: { enabled: true, root: {}, dot: {} },\n progress: { enabled: false, root: {}, bar: {} },\n ripple: { enabled: true, className: \"\" },\n },\n\n thumbnails: DEFAULT_THUMBNAILS,\n\n auto: {\n play: { enabled: false, speedMs: 3000, pauseMs: 1000, pauseOnHover: true },\n scroll: { enabled: false, speedMs: 3000, pauseMs: 1000, pauseOnHover: true },\n },\n\n motion: {\n selectDuration: 25,\n freeScrollDuration: 43,\n friction: 0.68,\n },\n} as const;","import { GridOptions } from \"./types\";\n\nexport const DEFAULT_GRID: Required<Pick<GridOptions, \"minColumnWidth\" | \"gap\">> = {\n minColumnWidth: 160,\n gap: 8,\n};","import { MasonryOptions } from \"./types\";\n\nexport const DEFAULT_MASONRY: Required<Pick<MasonryOptions, \"placement\">> = {\n placement: \"balanced\",\n};","import type * as React from \"react\";\n\nexport const defaultPlayerStyle: React.CSSProperties = {\n aspectRatio: \"16 / 9\",\n height: \"auto\",\n width: \"100%\",\n maxWidth: \"calc(100dvh * (16 / 9))\",\n position: \"absolute\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n};","'use client';\n\nimport * as React from 'react';\nimport type { APITypes } from 'plyr-react';\nimport { Plyr } from './LazyPlyr';\nimport { useRmgSlide } from '../shared/slideContext';\nimport { installDblclickGuardWhenReady } from './plyrGuards';\nimport { detectProvider } from './plyr';\n\nexport type RmgPlyrSourceBuilder = (args: {\n src: string;\n poster?: string;\n}) => any;\n\nexport type RmgPlyrOptionsResolver =\n | any\n | ((args: { src: string; poster?: string; index: number }) => any);\n\nexport type RmgPlyrVideoProps = {\n src: string;\n poster?: string;\n alt?: string;\n source?: any;\n sourceBuilder?: RmgPlyrSourceBuilder;\n options?: RmgPlyrOptionsResolver;\n className?: string;\n style?: React.CSSProperties;\n posterClassName?: string;\n posterStyle?: React.CSSProperties;\n onApi?: (api: APITypes | null) => void;\n registerApiByIndex?: (index: number, api: APITypes | null) => void;\n};\n\nconst baseWrap: React.CSSProperties = { width: '100%', height: '100%' };\nconst basePoster: React.CSSProperties = {\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n};\n\nexport function RmgPlyrVideo(props: RmgPlyrVideoProps) {\n const ctx = useRmgSlide();\n const isClone = ctx?.isClone ?? false;\n const index = ctx?.normIdx ?? 0;\n\n if (isClone) {\n return (\n <img\n src={props.poster || ''}\n alt={props.alt ?? ''}\n draggable={false}\n className={['rmg__plyr__image', 'rmg__plyr__video-preview', props.posterClassName]\n .filter(Boolean)\n .join(' ')}\n style={{ ...basePoster, ...(props.posterStyle || {}) }}\n />\n );\n }\n\n const source =\n props.source ??\n props.sourceBuilder?.({ src: props.src, poster: props.poster }) ??\n ({\n type: 'video',\n sources: [{ src: props.src }],\n poster: props.poster,\n } as any);\n\n const options =\n typeof props.options === 'function'\n ? props.options({ src: props.src, poster: props.poster, index })\n : props.options;\n\n const provider = detectProvider(source);\n\n return (\n <div\n className={['rmg__plyr__video', props.className].filter(Boolean).join(' ')}\n style={{ ...baseWrap, ...(props.style || {}) }}\n data-rmg-plyr=\"true\"\n data-rmg-plyr-index={String(index)}\n data-rmg-plyr-provider={provider}\n >\n <Plyr\n ref={(api: any) => {\n const apiOrNull = (api ?? null) as APITypes | null;\n ctx?.registerPlyr?.(apiOrNull);\n props.onApi?.(apiOrNull);\n props.registerApiByIndex?.(index, apiOrNull);\n installDblclickGuardWhenReady(api);\n }}\n source={source}\n options={options}\n />\n </div>\n );\n}"],"mappings":"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","names":["Gallery_default","import_react","lastT","mathAbs","distance","index","mathAbs","handleZoomToggle","len","direction","getClientXY","x","y","target","indexCurrent","indexPrevious","body","allowedForce","force","fsScrollTo","next","mode","isVideoItem","FullscreenSlider_default","import_react","import_jsx_runtime","React","imageCount","isVideoItem","thumbCropRect","endObjPos","import_react","React","import_jsx_runtime","clamp","React","React","clamp01","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","clamp01","import_jsx_runtime","insetForRect","item","startAnimation","import_jsx_runtime","DragTracker","Slider","scopeId","loop","next","getClientXY","i","data","cw","direction","target","indexCurrent","indexPrevious","body","ref","allowedForce","force","len","dirIndex","nextIndex","dirBump","distance","baseScrollTo","Slider_default","import_react","import_jsx_runtime","DragTracker","root","next","mod","rawKids","count","container","i","data","cw","scopeId","style","direction","target","indexCurrent","indexPrevious","body","allowedForce","force","len","dirIndex","nextIndex","dirBump","distance","baseScrollTo","import_react","import_jsx_runtime","React","React","React","import_jsx_runtime","px","React","React","import_jsx_runtime","import_jsx_runtime","React","React","React","React","import_jsx_runtime","import_jsx_runtime","React","React","import_client","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","React","React","Axis","isMouseEvent","DragTracker","ScrollBody","ScrollBounds","baseFitSizeC","boundsForCurrent","React","React","React","React","import_jsx_runtime","mod","import_jsx_runtime","defaultPlayerStyle","React","zoomTo","baseFitSizeC","boundsForCurrent","ScrollBounds","findImgAtPoint","readDataIndex","distance","midpoint","import_jsx_runtime","React","Gallery","cells","fs","internals","resetZoomForSlideChange","viewportWidth","clamp","boundsForCurrent","resetPanForScale1","Slider_default","FullscreenSlider_default","Gallery_default","import_jsx_runtime"]}
|