react-motion-gallery 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Gallery/index.tsx","../src/Gallery/FullscreenSlider.tsx","../src/Gallery/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/FullscreenModal.tsx","../src/Gallery/shared/transitions/objectPosition.ts","../src/Gallery/shared/transitions/objectFitTransform.ts","../src/Gallery/Slider.tsx","../src/Gallery/Slider.module.css","../src/Gallery/sliderSub.tsx","../src/Gallery/shared/motion/scrollBounds.ts","../src/Gallery/shared/slideContext.tsx","../src/Gallery/index.module.css","../src/Gallery/shared/LazyPlyr.tsx","../src/Gallery/ThumbnailSlider.tsx","../src/Gallery/ThumbnailSlider.module.css","../src/Gallery/fullscreenSliderSub.tsx","../src/Gallery/FullscreenThumbnailSlider.tsx","../src/Gallery/RmgPlyrVideo.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @next/next/no-img-element */\n'use client'\n\nimport React, { useState, useEffect, useRef, createRef, useLayoutEffect, useCallback, useMemo, ReactNode, useImperativeHandle } from \"react\";\nimport FullscreenSlider, { FullscreenSliderHandle } from \"./FullscreenSlider\";\nimport FullscreenModal from \"./FullscreenModal\";\nimport Slider, { SliderHandle } from './Slider';\nimport styles from './index.module.css';\nimport type { APITypes } from \"plyr-react\";\nimport { Plyr } from \"./shared/LazyPlyr\";\nimport ThumbnailSlider from \"./ThumbnailSlider\";\nimport createIndexChannel from \"./sliderSub\";\nimport { createFullscreenSliderSub } from './fullscreenSliderSub';\nimport FullscreenThumbnailSlider from \"./FullscreenThumbnailSlider\";\nimport { createRoot, type Root } from 'react-dom/client';\nimport { flushSync } from 'react-dom';\nimport { parseObjectPosition } from \"./shared/transitions/objectPosition\";\nimport { containTransformForRect, coverTransformForRect, objectFitContentRect } from \"./shared/transitions/objectFitTransform\";\nimport { ScrollBody, ScrollBodyType } from \"./shared/motion/scrollBody\";\nimport { Animations, AnimationsType } from \"./shared/motion/animations\";\nimport { PercentOfView, ScrollBounds, ScrollBoundsType } from \"./shared/motion/scrollBounds\";\nimport { createDragTracker } from \"./shared/input/dragTracker\";\nimport { Vector1D, Vector1DType } from \"./shared/motion/vector1d\";\nimport { Limit } from \"./shared/motion/limit\";\nimport { EventStore } from \"./shared/motion/eventStore\";\n\ntype WindowType = Window & typeof globalThis\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\nfunction Axis() {\n return {\n scroll: 'x' as const,\n cross: 'y' as const,\n direction(n: number) {\n return n\n },\n }\n}\ntype AxisType = ReturnType<typeof Axis>\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: AxisType, ownerWindow: WindowType) {\n return createDragTracker({\n ownerWindow,\n axis,\n })\n}\n\nconst 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\ntype ResponsiveNumber =\n | number\n | string\n | Array<number | string>\n | Record<string, number | string>;\n\nfunction 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\nfunction effectiveViewportWidth(raw: number): number {\n if (raw > 0) return raw;\n\n if (typeof window !== 'undefined' && window.innerWidth > 0) {\n return window.innerWidth;\n }\n\n return 1024;\n}\n\nfunction 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 =\n breakpointMap[key] ??\n (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\ntype MasonryClassNames = {\n root?: string;\n column?: string;\n item?: string;\n};\n\ntype MasonryPlacement = 'balanced' | 'roundRobin';\n\ntype MasonryProps = {\n items: React.ReactNode[];\n masonryColumns?: ResponsiveNumber;\n masonryGap?: ResponsiveNumber;\n masonryPlacement?: MasonryPlacement;\n masonryEstimatedItemHeight?: number;\n masonryClassNames?: MasonryClassNames;\n masonryStyle?: React.CSSProperties;\n masonryAs?: React.ElementType;\n masonryRootRef?: React.Ref<any>;\n breakpoints?: BreakpointMap;\n};\n\nconst 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] = useState(() => {\n if (typeof window === 'undefined') return 0;\n return window.innerWidth;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const onResize = () => setViewportWidth(window.innerWidth);\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, []);\n\n const [heights, setHeights] = useState<number[]>(\n () => items.map(() => masonryEstimatedItemHeight)\n );\n\n 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 = 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 = 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] = useState<number[]>(\n () => items.map((_, i) => (masonryPlacement === 'roundRobin' ? i % Math.max(1, columnCount) : 0))\n );\n\n 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 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 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 = 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[][] = 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 = useRef<HTMLDivElement | null>(null);\n\n 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\ntype DefaultMasonrySkeletonProps = {\n count: number;\n columnCount: number;\n gapPx: number;\n classNames?: MasonryClassNames;\n};\n\nconst 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};\n\nexport 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 type EntryItem = {\n media?: MediaItem[];\n [key: string]: any;\n};\n\ntype EntryMediaRenderArgs = {\n entry: EntryItem;\n entryIndex: number;\n media: MediaItem;\n mediaIndex: number;\n};\n\ntype MediaEntryLink = {\n entryIndex: number;\n mediaIndex: number;\n};\n\ntype EntryOverlayRenderArgs = {\n entry: EntryItem;\n entryIndex: number;\n mediaIndex: number | null;\n link: MediaEntryLink | null;\n opacity: number;\n fsIndex: number;\n style: React.CSSProperties;\n containerProps: React.HTMLAttributes<HTMLDivElement>;\n};\n\ntype EntryMediaLayout = 'slider' | 'grid' | 'masonry';\n\ntype EntryCardRenderArgs = {\n entry: EntryItem;\n entryIndex: number;\n media: React.ReactNode;\n};\n\ntype ThumbnailPosition = 'top' | 'right' | 'bottom' | 'left'\n\nexport type ResponsivePosition =\n | ThumbnailPosition\n | Array<ThumbnailPosition>\n | Record<string, ThumbnailPosition>;\n\nfunction 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\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 =\n breakpointMap[key] ??\n (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\nconst toMediaItems = (urls: string[]): MediaItem[] =>\n urls.map((u) =>\n /\\.(mp4|webm|ogg)$/i.test(u) ? { kind: \"video\", src: u } : { kind: \"image\", src: u }\n );\n\ntype FSImageRender = (args: {\n item: Extract<MediaItem, { kind: \"image\" }>;\n index: number;\n isZoomed: boolean;\n className: string;\n baseStyle: React.CSSProperties;\n}) => React.ReactNode;\n\ntype PlyrSourceBuilder = (item: MediaItem, index: number) => Plyr.SourceInfo;\ntype PlyrOptionsResolver =\n | Plyr.Options\n | ((item: MediaItem, index: number) => Plyr.Options);\n\ntype ResponsiveHeightRule = { query: string; height: string };\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\ntype DotsRenderArgs = {\n ref: React.RefObject<HTMLDivElement | null>;\n count: number;\n activeIndex: number;\n hidden: boolean;\n goTo: (index: number) => void;\n getDotRef: (index: number) => (el: HTMLDivElement | null) => void;\n createRipple: (el: HTMLElement) => void;\n classNameContainer?: string;\n classNameDot?: string;\n};\n\ntype ProgressRenderArgs = {\n ref: React.Ref<HTMLDivElement>;\n innerRef?: React.Ref<HTMLDivElement>;\n hidden: boolean;\n progress: number;\n classNameContainer?: string;\n classNameBar?: string;\n};\n\ntype FsCounterArgs = { index: number; count: number };\n\ntype FsCaptionPlacement = 'top' | 'right' | 'bottom' | 'left';\n\ntype FsCaptionRenderArgs = {\n item: MediaItem;\n index: number;\n isZoomed: boolean;\n};\n\nconst 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};\n\ntype IndexMode = 'instant' | 'animated';\n\nexport type LoadingOptions = {\n isLoading?: boolean;\n skeletonCount?: ResponsiveNumber;\n renderLoading?: (args: {\n layout: 'slider' | 'grid' | 'masonry' | 'entries';\n count: number;\n }) => React.ReactNode;\n};\n\nexport type IntroOptions = {\n renderIntro?: (\n args: {\n active: boolean;\n containerProps: React.HTMLAttributes<HTMLDivElement>;\n },\n content: React.ReactNode\n ) => React.ReactNode;\n staggerMs?: number;\n transform?: number | string;\n durationMs?: number;\n easing?: string;\n staggerLimit?: number;\n};\n\ntype SlideOwner = {\n entryIndex: number;\n};\n\ntype ControlStyle = {\n className?: string;\n style?: React.CSSProperties;\n};\n\ntype LoadingRenderArgs = { layout: 'thumbnails'; count: number };\ntype IntroRenderArgs = {\n active: boolean;\n containerProps: React.HTMLAttributes<HTMLDivElement>;\n};\n\nexport type ThumbnailLoadingOptions = {\n isLoading?: boolean;\n skeletonCount?: ResponsiveNumber;\n renderLoading?: (args: LoadingRenderArgs) => React.ReactNode;\n};\n\nexport type ThumbnailIntroOptions = {\n renderIntro?: (args: IntroRenderArgs, inner: React.ReactNode) => React.ReactNode;\n staggerMs?: number;\n transform?: number;\n durationMs?: number;\n easing?: string;\n};\n\nexport type ThumbnailLayout = {\n width?: number | string;\n height?: number | string;\n}\n\nexport type ThumbnailContainerLayout = {\n width?: number | string;\n height?: number | string;\n}\n\nexport type ThumbnailsLayout = {\n position?: ResponsivePosition;\n gap?: number;\n center?: boolean;\n thumbnail?: ThumbnailLayout;\n container?: ThumbnailContainerLayout;\n}\n\nexport type ThumbnailsElements = {\n container?: ControlStyle;\n thumbnail?: ControlStyle;\n}\n\nexport type ThumbnailsScroll = {\n freeScroll?: boolean;\n groupCells?: boolean;\n loop?: boolean;\n skipSnaps?: boolean;\n centerActiveThumb?: boolean;\n}\n\nexport type ThumbnailsMotion = {\n selectDuration?: number;\n freeScrollDuration?: number;\n friction?: number;\n}\n\nexport type ThumbnailsRipple = {\n enabled?: boolean;\n className?: string;\n}\n\nexport type ThumbnailsControls = {\n enabled?: boolean;\n arrow?: ControlStyle;\n prev?: ControlStyle;\n next?: ControlStyle;\n render?: (args: ArrowRenderArgs & { dir: \"prev\" | \"next\" }) => React.ReactNode;\n renderPrev?: (args: ArrowRenderArgs) => React.ReactNode;\n renderNext?: (args: ArrowRenderArgs) => React.ReactNode;\n ripple?: ThumbnailsRipple;\n}\n\nexport type ThumbnailsTransitions = {\n loading?: ThumbnailLoadingOptions;\n intro?: ThumbnailIntroOptions;\n}\n\nexport type ThumbnailsOptions = {\n children?: React.ReactNode;\n layout?: ThumbnailsLayout;\n elements?: ThumbnailsElements;\n scroll?: ThumbnailsScroll;\n controls?: ThumbnailsControls;\n motion?: ThumbnailsMotion;\n transitions?: ThumbnailsTransitions;\n breakpointMap?: BreakpointMap;\n};\n\nexport const DEFAULT_THUMBNAILS: Required<\n Pick<\n ThumbnailsOptions,\n 'layout' | 'scroll' | 'motion'\n >\n> = {\n layout: {\n position: 'bottom',\n gap: 8,\n center: false,\n },\n\n scroll: {\n freeScroll: true,\n groupCells: false,\n loop: false,\n skipSnaps: false,\n centerActiveThumb: false,\n },\n\n motion: {\n selectDuration: 25,\n freeScrollDuration: 43,\n friction: 0.68,\n },\n};\n\nexport type FullscreenArrows = {\n enabled?: boolean;\n arrow?: ControlStyle;\n prev?: ControlStyle;\n next?: ControlStyle;\n render?: (args: { dir: \"prev\" | \"next\" }) => HTMLElement | null;\n renderPrev?: () => HTMLElement | null;\n renderNext?: () => HTMLElement | null;\n}\n\nexport type FullscreenClose = {\n enabled?: boolean;\n style?: React.CSSProperties;\n className?: string;\n render?: () => React.ReactNode | HTMLElement | null;\n}\n\nexport type FullscreenCounter = {\n enabled?: boolean;\n style?: React.CSSProperties;\n className?: string;\n render?: (args: FsCounterArgs) => React.ReactNode | HTMLElement | null;\n}\n\nexport type FullscreenControlsOptions = {\n close?: FullscreenClose;\n arrows?: FullscreenArrows;\n counter?: FullscreenCounter;\n};\n\nexport type FullscreenCaptionOptions = {\n className?: string;\n style?: React.CSSProperties;\n placement?: FsCaptionPlacement;\n width?: number;\n height?: number;\n breakpoint?: number;\n render?: (args: FsCaptionRenderArgs) => React.ReactNode;\n};\n\nexport type FullscreenEffectsOptions = {\n introDuration?: number;\n introEasing?: string;\n introFade?: boolean;\n slideFade?: boolean;\n slideFadeDuration?: number;\n slideFadeEasing?: string;\n thumbnailsFadeDuration?: number;\n thumbnailsFadeEasing?: string;\n};\n\nexport type FullscreenSliderOptions = {\n duration?: number;\n friction?: number;\n};\n\nexport type FullscreenZoomPanOptions = {\n clickZoomLevel?: number;\n maxZoomLevel?: number;\n panDuration?: number;\n panFriction?: number;\n};\n\nexport type FullscreenVideoOptions = {\n source?: PlyrSourceBuilder;\n options?: PlyrOptionsResolver;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport type FullscreenOptions = {\n enabled?: boolean;\n items?: MediaItem[] | string[];\n renderImage?: FSImageRender;\n video?: FullscreenVideoOptions;\n thumbnails?: ThumbnailsOptions;\n controls?: FullscreenControlsOptions;\n caption?: FullscreenCaptionOptions;\n slider?: FullscreenSliderOptions;\n zoom?: FullscreenZoomPanOptions;\n effects?: FullscreenEffectsOptions;\n};\n\nconst 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};\n\nconst DEFAULT_SLIDER = {\n layout: {\n gap: 20,\n },\n direction: {\n dir: \"ltr\" as const,\n axis: \"x\" as const,\n },\n align: \"start\" as const,\n scroll: {\n groupCells: false,\n skipSnaps: false,\n freeScroll: false,\n loop: false\n },\n lazyLoad: false,\n controls: {\n arrows: {\n enabled: true,\n arrow: {},\n prev: {},\n next: {},\n },\n dots: {\n enabled: true,\n root: {},\n dot: {},\n },\n progress: {\n enabled: false,\n root: {},\n bar: {},\n },\n ripple: {\n enabled: true,\n className: \"\",\n },\n },\n thumbnails: DEFAULT_THUMBNAILS,\n auto: {\n play: {\n enabled: false,\n speedMs: 3000,\n pauseMs: 1000,\n pauseOnHover: true\n },\n scroll: {\n enabled: false,\n speedMs: 3000,\n pauseMs: 1000,\n pauseOnHover: true\n }\n },\n motion: {\n selectDuration: 25,\n freeScrollDuration: 43,\n friction: 0.68\n },\n};\n\nexport type SliderLayout = {\n gap?: number;\n cellsPerSlide?: ResponsiveNumber;\n}\n\nexport type SliderDirection = {\n dir?: 'ltr' | 'rtl';\n axis?: 'x' | 'y';\n}\n\nexport type SliderSize = {\n height?: string;\n heightRules?: ResponsiveHeightRule[];\n initialHeight?: number | string;\n}\n\nexport type SliderElements = {\n viewport?: ControlStyle;\n container?: ControlStyle;\n}\n\nexport type SliderAlign = {\n center: boolean;\n}\n\nexport type SliderScroll = {\n groupCells?: boolean;\n skipSnaps?: boolean;\n freeScroll?: boolean;\n loop?: boolean;\n}\n\nexport type SliderArrows = {\n enabled?: boolean;\n arrow?: ControlStyle;\n prev?: ControlStyle;\n next?: ControlStyle;\n render?: (args: ArrowRenderArgs & { dir: \"prev\" | \"next\" }) => React.ReactNode;\n renderPrev?: (args: ArrowRenderArgs) => React.ReactNode;\n renderNext?: (args: ArrowRenderArgs) => React.ReactNode;\n}\n\nexport type SliderDots = {\n enabled?: boolean;\n root?: ControlStyle;\n dot?: ControlStyle;\n render?: (args: DotsRenderArgs) => React.ReactNode;\n}\n\nexport type SliderProgress = {\n enabled?: boolean;\n root?: ControlStyle;\n bar?: ControlStyle;\n render?: (args: ProgressRenderArgs) => React.ReactNode;\n}\n\nexport type SliderRipple = {\n enabled?: boolean;\n className?: string;\n}\n\nexport type SliderControls = {\n arrows?: SliderArrows;\n dots?: SliderDots;\n progress?: SliderProgress;\n ripple?: SliderRipple;\n}\n\nexport type SliderAutoPlay = {\n enabled?: boolean;\n speedMs?: number;\n pauseMs?: number;\n pauseOnHover?: boolean;\n}\n\nexport type SliderAutoScroll = {\n enabled?: boolean;\n speedMs?: number;\n pauseMs?: number;\n pauseOnHover?: boolean;\n}\n\nexport type SliderAuto = {\n play?: SliderAutoPlay;\n scroll?: SliderAutoScroll;\n}\n\nexport type SliderLoadingOptions = {\n isLoading?: boolean;\n skeletonCount?: ResponsiveNumber;\n renderLoading?: (args: {\n layout: 'slider' | 'grid' | 'masonry' | 'entries';\n count: number; // SSR base count (xs / lowest rule)\n }) => React.ReactNode;\n};\n\nexport type SliderIntroOptions = {\n renderIntro?: (\n args: {\n active: boolean;\n containerProps: React.HTMLAttributes<HTMLDivElement>;\n },\n content: React.ReactNode\n ) => React.ReactNode;\n staggerMs?: number;\n transform?: number | string;\n durationMs?: number;\n easing?: string;\n};\n\nexport type SliderTransitions = {\n loading?: SliderLoadingOptions;\n intro?: SliderIntroOptions;\n}\n\nexport type SliderParallax = {\n enabled?: boolean;\n bleedPct?: string;\n borderRadius?: string;\n sideWidth?: string;\n}\n\nexport type SliderScale = {\n enabled?: boolean;\n amount?: number;\n}\n\nexport type SliderFade = {\n enabled?: boolean;\n}\n\nexport type SliderEffects = {\n parallax?: SliderParallax;\n scale?: SliderScale;\n fade?: SliderFade;\n}\n\nexport type SliderMotion = {\n selectDuration?: number;\n freeScrollDuration?: number;\n friction?: number;\n}\n\nexport type SliderOptions = {\n layout?: SliderLayout;\n direction?: SliderDirection;\n size?: SliderSize;\n align?: 'start' | 'center';\n scroll?: SliderScroll;\n elements?: SliderElements;\n lazyLoad?: boolean;\n controls?: SliderControls;\n thumbnails?: ThumbnailsOptions;\n auto?: SliderAuto;\n transitions?: SliderTransitions;\n motion?: SliderMotion;\n effects?: SliderEffects;\n}\n\ntype GridOptions = {\n columns?: ResponsiveNumber;\n minColumnWidth?: number | string;\n gap?: ResponsiveNumber;\n rootClassName?: string;\n itemClassName?: string;\n loading?: LoadingOptions;\n intro?: IntroOptions;\n};\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 loading?: LoadingOptions;\n intro?: IntroOptions;\n};\n\ntype EntriesOptions = {\n items?: EntryItem[];\n mediaLayout?: EntryMediaLayout;\n render?: {\n card?: (args: EntryCardRenderArgs) => React.ReactNode;\n media?: (args: EntryMediaRenderArgs) => React.ReactNode;\n overlay?: (args: EntryOverlayRenderArgs) => React.ReactNode;\n };\n overlay?: ControlStyle;\n loading?: LoadingOptions;\n intro?: IntroOptions;\n};\n\nexport const DEFAULT_GRID: Required<Pick<GridOptions, \"minColumnWidth\" | \"gap\">> =\n {\n minColumnWidth: 160,\n gap: 8,\n };\n\nexport const DEFAULT_MASONRY: Required<Pick<MasonryOptions, \"placement\">> = {\n placement: \"balanced\",\n};\n\nexport const DEFAULT_ENTRIES: Required<Pick<EntriesOptions, \"mediaLayout\">> = {\n mediaLayout: \"slider\",\n};\n\nexport interface GalleryApi {\n rootNode(): HTMLElement | null;\n containerNode(): HTMLElement | null;\n slideNodes(): HTMLElement[];\n onReady?(cb: (nodes: HTMLElement[]) => void): () => void;\n whenReady?(): Promise<HTMLElement[]>;\n isReady?(): boolean;\n scrollTo(index: number, jump?: boolean): void;\n scrollNext(jump?: boolean): void;\n scrollPrev(jump?: boolean): void;\n canScrollNext(): boolean;\n canScrollPrev(): boolean;\n getIndex(): number;\n selectCell(index: number, jump?: boolean): void;\n scrollProgress(): number;\n cellsInView(): number[];\n append(nodes: React.ReactNode | React.ReactNode[]): number;\n prepend(nodes: React.ReactNode | React.ReactNode[]): number;\n insert(index: number, nodes: React.ReactNode | React.ReactNode[]): number;\n remove(indexOrPredicate: number | ((i: number) => boolean)): number;\n replace(index: number, node: React.ReactNode): void;\n setItems(nodes: React.ReactNode[]): number;\n onIndexChange(cb: (i: number, meta: { mode: IndexMode }) => void): () => void;\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?: ControlStyle;\n container?: ControlStyle;\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\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 entryMapRef = useRef<MediaEntryLink[] | null>(null);\n const entryFlatIndexRef = useRef<number[][] | null>(null);\n const fsOwnersRef = useRef<SlideOwner[]>([]);\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 const [slideIndex, setSlideIndex] = useState(0);\n const isClick = useRef(false);\n const isZoomClick = useRef(false);\n const imageRefs = useRef<React.RefObject<HTMLImageElement | 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, setWindowSize] = useState({ width: 0, height: 0 });\n\n const scaleRef = useRef(1);\n const panRef = useRef({ x: 0, y: 0 });\n const previousZoom = useRef({ x: 0, y: 0 });\n\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\n const fsEntryOverlayMountRef = useRef<HTMLDivElement | null>(null);\n const fsEntryOverlayRootMountRef = useRef<HTMLDivElement | null>(null);\n\n const openTokenRef = useRef(0);\n const enteredTokenRef = useRef(0);\n const enterRafRef = useRef<number>(0);\n\n const pendingUnmountRef = useRef<number>(0);\n\n const setFsEntryOverlayMountRef = useCallback((el: HTMLDivElement | null) => {\n fsEntryOverlayMountRef.current = el;\n\n if (el) return;\n\n cancelSwapJob();\n\n fsEntryOverlayElRef.current = null;\n\n const root = fsEntryOverlayRootRef.current;\n fsEntryOverlayRootRef.current = null;\n\n if (root) {\n if (pendingUnmountRef.current) {\n cancelAnimationFrame(pendingUnmountRef.current);\n pendingUnmountRef.current = 0;\n }\n\n pendingUnmountRef.current = requestAnimationFrame(() => {\n pendingUnmountRef.current = 0;\n try {\n root.unmount();\n } catch {\n }\n });\n }\n }, []);\n\n const fsEntryOverlayRootRef = useRef<Root | null>(null);\n const fsIndexRef = useRef<number>(fsSub.get());\n\n const [fsFadeOpening, setFsFadeOpening] = useState(false);\n\n const entryOpacityRef = useRef<number>(1);\n\n const fsEntryOverlayElRef = useRef<HTMLDivElement | null>(null);\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 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 function getEntryIndexForFsIndex(fsIndex: number): number {\n const map = entryMapRef.current;\n const link = map?.[fsIndex];\n return link?.entryIndex ?? -1;\n }\n\n function renderEntryOverlayForIndex(index: number) {\n const mount = fsEntryOverlayMountRef.current;\n if (!mount) return;\n\n if (fsEntryOverlayRootRef.current && fsEntryOverlayRootMountRef.current !== mount) {\n const oldRoot = fsEntryOverlayRootRef.current;\n fsEntryOverlayRootRef.current = null;\n fsEntryOverlayRootMountRef.current = null;\n\n requestAnimationFrame(() => oldRoot.unmount());\n }\n\n if (!fsEntryOverlayRootRef.current) {\n fsEntryOverlayRootRef.current = createRoot(mount);\n fsEntryOverlayRootMountRef.current = mount;\n }\n\n const root = fsEntryOverlayRootRef.current;\n\n if (typeof entriesObject.render?.overlay !== 'function') {\n root.render(null);\n fsEntryOverlayElRef.current = null;\n return;\n }\n\n const map = entryMapRef.current;\n if (!entriesObject.items?.length || !map?.length) {\n root.render(null);\n fsEntryOverlayElRef.current = null;\n return;\n }\n\n const link = map[index];\n if (!link) {\n root.render(null);\n fsEntryOverlayElRef.current = null;\n return;\n }\n\n const entry = entriesObject.items[link.entryIndex];\n if (!entry) {\n root.render(null);\n fsEntryOverlayElRef.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: '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 ...(entriesObject.overlay?.style ?? {}),\n };\n\n root.render(\n <div\n className={entriesObject.overlay?.className}\n style={wrapperStyle}\n ref={(el) => {\n fsEntryOverlayElRef.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 {entriesObject.render.overlay({\n entry,\n entryIndex: link.entryIndex,\n mediaIndex: link.mediaIndex,\n link,\n opacity: entryOpacityRef.current,\n fsIndex: index,\n style: wrapperStyle,\n containerProps: {\n className: entriesObject.overlay?.className,\n style: wrapperStyle,\n },\n })}\n </div>\n );\n }\n\n function setEntryOverlayOpacity(next: number) {\n const el = fsEntryOverlayElRef.current;\n if (!el) return;\n el.style.setProperty('--rmg-entry-opacity', String(next));\n }\n\n const swapJobRef = useRef<{ t: any; raf: number } | null>(null);\n\n function cancelSwapJob() {\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 function fadeSwapToIndex(nextIndex: number) {\n cancelSwapJob();\n\n setEntryOverlayOpacity(0);\n\n const job = { t: null as any, raf: 0 };\n swapJobRef.current = job;\n\n const FADE_OUT_MS = 120;\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 }, FADE_OUT_MS);\n }\n\n useEffect(() => {\n if (!showFullscreenModal) 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 if (next === fsIndexRef.current && fsEntryOverlayElRef.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\n requestAnimationFrame(() => setEntryOverlayOpacity(1));\n }\n });\n\n return () => {\n cancelSwapJob();\n off();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [showFullscreenModal, fsSub, entries, entriesObject.render?.overlay]);\n\n const changingSlides = useRef(false);\n\n const [isZoomed, setIsZoomed] = useState(false);\n const isZoomedRef = useRef(false);\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 zoomLevel = isZoomed ? 2 : 1;\n\n const currentImage = useRef<HTMLElement | null>(null);\n const aspectRatioRef = useRef(1);\n\n const axisRef = useRef<AxisType | null>(null);\n const pointerDownRef = useRef(false);\n const interactionModeRef = useRef<'idle' | 'drag' | 'wheel' | 'programmatic'>('idle');\n\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\n const [closingModal, setClosingModal] = useState(false);\n \n const sliderApiRef = useRef<SliderHandle>(null);\n\n const entrySliderRefs = useRef<(SliderHandle | null)[]>([]);\n\n const overlayCaptionRef = useRef<HTMLDivElement | null>(null);\n const overlayCaptionRootRef = useRef<ReturnType<typeof createRoot> | null>(null);\n\n const fsThumbContainerRef = useRef<HTMLDivElement | null>(null);\n\n const attachEntrySliderRef = useCallback(\n (entryIndex: number) =>\n (instance: SliderHandle | null) => {\n entrySliderRefs.current[entryIndex] = instance;\n },\n []\n );\n\n const epoch = useOpenEpoch(showFullscreenModal);\n\n const [isReady, setIsReady] = useState(false);\n\n const suppressLoopRef = useRef(false);\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 Cell = { id: string; node: React.ReactNode };\n const asArray = <T,>(x: T | T[]) => (Array.isArray(x) ? x : [x]);\n const idSeqRef = useRef(0);\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 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 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 toggleGridFullscreen(imgEl, fullscreenIndex);\n setSlideIndex(fullscreenIndex);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [fs.enabled, normalizedItems.length, layout, entriesObject.mediaLayout]\n );\n\n const shieldCleanupRef = useRef<null | (() => void)>(null)\n const SHIELD_TIMEOUT = 400\n function addGestureShield() {\n shieldCleanupRef.current?.()\n const shield = document.createElement('div')\n Object.assign(shield.style, {\n position: 'fixed',\n inset: '0',\n zIndex: '10000',\n background: 'transparent',\n touchAction: 'none',\n pointerEvents: 'auto',\n } as CSSStyleDeclaration)\n document.body.appendChild(shield)\n const remove = () => {\n if (shield.parentNode) shield.remove()\n }\n const timer = window.setTimeout(() => {\n remove()\n shieldCleanupRef.current = null\n }, SHIELD_TIMEOUT)\n const teardown = () => {\n window.clearTimeout(timer)\n remove()\n shieldCleanupRef.current = null\n }\n shieldCleanupRef.current = teardown\n return teardown\n }\n\n function toggleGridFullscreen(origImg: HTMLImageElement, index: number) {\n const DURATION_MS = fs.effects.introDuration ?? 300;\n const EASING = fs.effects.introEasing ?? 'cubic-bezier(.4,0,.22,1)';\n const vw = document.documentElement.clientWidth;\n const vh = window.innerHeight;\n\n if (!origImg) return;\n\n shieldCleanupRef.current?.();\n shieldCleanupRef.current = addGestureShield();\n\n const slideEl =\n (origImg.closest('.rmg__grid-item') 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 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\n overlay.style.transition = `opacity ${DURATION_MS}ms ${EASING}`;\n\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 if (fsThumbContainerRef.current) {\n const H = fsThumbContainerRef.current.offsetHeight;\n const W = fsThumbContainerRef.current.offsetWidth;\n\n if (fs.thumbnails?.layout?.position === 'top') {\n contentTop += H;\n } else if (fs.thumbnails?.layout?.position === 'bottom') {\n contentBottom -= H;\n } else if (fs.thumbnails?.layout?.position === 'left') {\n contentLeft += W;\n } else if (fs.thumbnails?.layout?.position === 'right') {\n contentRight -= W;\n }\n }\n\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 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 = fs.thumbnails?.layout?.position === 'top' ? `${contentTop}px` : '0';\n base.bottom = '0';\n base.left = `${contentRight}px`;\n base.width = `${sideWidth}px`;\n base.height =\n fs.thumbnails?.layout?.position === 'bottom' ? `${contentBottom}px` : 'auto';\n } else if (effectivePlacement === 'left') {\n base.top = fs.thumbnails?.layout?.position === 'top' ? `${contentTop}px` : '0';\n base.bottom = '0';\n base.left = '0';\n base.width = `${sideWidth}px`;\n base.height =\n fs.thumbnails?.layout?.position === '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 {\n const bottomOffset = Math.max(0, vh - contentBottom - topBottomHeight);\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 }\n\n Object.assign(overlayCaption.style, base);\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 });\n\n root.render(<>{captionNode}</>);\n } catch (err) {\n console.error('[RMG] Failed to render overlay caption', err);\n }\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 let clipper: HTMLDivElement | null = null;\n let dup: HTMLImageElement | null = null;\n\n const item = normalizedItems[index];\n\n const isVideoSlide =\n (item as any)?.type === 'video' ||\n (item as any)?.kind === 'video' ||\n (item as any)?.mediaType === 'video' ||\n !!(item as any)?.videoSrc ||\n !!(item as any)?.sources?.video ||\n !!(item as any)?.plyrSource ||\n !!(slideEl as any)?.dataset?.rmgVideo;\n\n const forceFadeIntro = fs.effects.introFade || isVideoSlide;\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 document.body.appendChild(clipper);\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 =\n natW <= contentRect.width && natH <= contentRect.height;\n\n const endObjPos = { x: 0.5, y: 0.5 };\n\n const endT = fitsIntrinsic\n ? { cx: contentRect.x + contentRect.width / 2, cy: contentRect.y + contentRect.height / 2, scale: 1 }\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 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 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 shieldCleanupRef.current?.();\n shieldCleanupRef.current = null;\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 } else {\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 shieldCleanupRef.current?.();\n shieldCleanupRef.current = null;\n\n requestAnimationFrame(() => {\n setFsFadeOpening(false);\n });\n\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\n const imageCount = normalizedItems.length;\n const closeEnabled = fs.controls.close?.enabled !== false;\n const counterEnabled = fs.controls.counter?.enabled !== false;\n const allowFsArrows = fs.controls.arrows?.enabled !== false && imageCount > 1;\n const isRtl = sliderObject.direction.dir === 'rtl';\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'\n ? (isRtl ? 'next' : 'prev')\n : (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('points', '4.586,3.414 9.172,8 4.586,12.586 6,14 12,8 6,2');\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\" ? fs.controls?.arrows?.renderPrev() : null)\n : (typeof fs.controls?.arrows?.renderNext === \"function\" ? fs.controls?.arrows?.renderNext() : 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 function ensureButtonLike(el: HTMLElement) {\n if (el.tagName.toLowerCase() === \"button\") {\n (el as HTMLButtonElement).type ||= \"button\";\n return;\n }\n el.setAttribute(\"role\", \"button\");\n el.tabIndex = 0;\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\n const closeExplicit =\n typeof fs.controls?.close?.render === \"function\" ? fs.controls.close.render() : null;\n\n const closeBtn = closeEnabled\n ? (closeExplicit instanceof HTMLElement ? closeExplicit : defaultClose())\n : null;\n\n if (closeBtn) {\n ensureButtonLike(closeBtn);\n if (!closeBtn.getAttribute(\"aria-label\")) 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 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 ? ctrExplicit : defaultCounter(index, imageCount))\n : null;\n\n const applyControl = (el: HTMLElement | null, cfg?: ControlStyle) => {\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\n if (leftCh) leftCh.classList.add(styles.leftChevron);\n if (rightCh) rightCh.classList.add(styles.rightChevron);\n\n applyControl(closeBtn as any, fs.controls?.close);\n applyControl(leftCh, fs.controls?.arrows?.arrow);\n applyControl(rightCh, fs.controls?.arrows?.arrow);\n applyControl(leftCh, fs.controls?.arrows?.prev);\n applyControl(rightCh, fs.controls?.arrows?.next);\n applyControl(ctr as any, fs.controls?.counter);\n\n closeButtonRef.current = closeBtn;\n leftChevronRef.current = leftCh;\n rightChevronRef.current = rightCh;\n (counterRef as any).current = ctr;\n\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 requestAnimationFrame(() => {\n const many = imageCount > 1;\n const addOpen = (el: Element) => el.classList.add(styles.open);\n\n if (closeBtn) {\n addOpen(closeBtn);\n }\n\n if (many) {\n if (allowFsArrows) {\n addOpen(leftCh);\n addOpen(rightCh);\n }\n\n if (ctr) {\n addOpen(ctr);\n }\n \n }\n });\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 function normalizeLoading(src?: LoadingOptions) {\n return {\n isLoading: src?.isLoading,\n skeletonCount: src?.skeletonCount,\n renderLoading: src?.renderLoading,\n };\n }\n\n 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 }\n\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 gridRootRef = useRef<HTMLDivElement | null>(null);\n const masonryRootRef = useRef<HTMLDivElement | null>(null);\n\n const [gridInView, setGridInView] = useState(false);\n const [masonryInView, setMasonryInView] = useState(false);\n\n const [gridMediaReady, setGridMediaReady] = useState(false);\n const [masonryMediaReady, setMasonryMediaReady] = useState(false);\n\n 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 }\n\n 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 (HTMLImageElement | HTMLVideoElement)[];\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 }\n\n const isGridLayout = layout === 'grid';\n const isMasonryLayout = layout === 'masonry';\n\n useInViewOnce(isGridLayout, gridRootRef as any, () => setGridInView(true));\n useInViewOnce(isMasonryLayout, masonryRootRef as any, () => setMasonryInView(true));\n\n useMediaReady(isGridLayout, gridRootRef as any, setGridMediaReady);\n useMediaReady(isMasonryLayout, masonryRootRef as any, setMasonryMediaReady);\n\n const gridIsLoading =\n isGridLayout ? (gridLoading.isLoading ?? !gridMediaReady) : false;\n\n const masonryIsLoading =\n isMasonryLayout ? (masonryLoading.isLoading ?? !masonryMediaReady) : false;\n\n const gridIntroActive = isGridLayout && !gridIsLoading && gridInView;\n const masonryIntroActive = isMasonryLayout && !masonryIsLoading && masonryInView;\n\n const gridSkeletonCount = cellsState.length\n\n 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 }\n\n const viewportWidth = useViewportWidth();\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 minWidth =\n typeof gridObject.minColumnWidth === 'number'\n ? `${gridObject.minColumnWidth}px`\n : gridObject.minColumnWidth ?? '160px';\n\n const gapVal = React.useMemo(() => {\n if (typeof gridObject.gap === 'string' && Number.isNaN(parseFloat(gridObject.gap))) {\n return gridObject.gap;\n }\n\n const raw = resolveNumberFromResponsive(\n gridObject.gap,\n typeof gridObject.gap === 'number' ? gridObject.gap : 8,\n viewportWidth,\n effectiveBreakpoints\n );\n\n const px = Math.max(0, raw | 0);\n return `${px}px`;\n }, [gridObject.gap, viewportWidth, effectiveBreakpoints]);\n\n const resolvedGridColumnCount = React.useMemo(() => {\n if (gridObject.columns == null) return undefined;\n\n const raw = resolveNumberFromResponsive(\n gridObject.columns,\n 1,\n viewportWidth,\n effectiveBreakpoints\n );\n const n = Math.max(1, raw | 0);\n return n;\n }, [gridObject.columns, viewportWidth, effectiveBreakpoints]);\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 const defaultGridSkeleton = (\n <div className={styles.gridSkeletonOverlay}>\n <div\n className={[\n styles.gridSkeletonGrid,\n gridObject.rootClassName || '',\n ]\n .filter(Boolean)\n .join(' ')}\n style={gridStyle}\n >\n {Array.from({ length: gridSkeletonCount }).map((_, i) => (\n <div\n key={`rmg-grid-skel-${i}`}\n className={styles.gridSkeletonItem}\n />\n ))}\n </div>\n </div>\n );\n\n const DEFAULT_MASONRY_COLUMNS = 4;\n const DEFAULT_MASONRY_GAP_PX = 8;\n\n const masonryColumnCount = resolveNumberFromResponsive(\n masonryObject.columns,\n DEFAULT_MASONRY_COLUMNS,\n viewportWidth,\n effectiveBreakpoints\n );\n\n const masonryGapPx = Math.max(\n 0,\n parseNumberLike(\n resolveNumberFromResponsive(\n masonryObject.gap,\n DEFAULT_MASONRY_GAP_PX,\n viewportWidth,\n effectiveBreakpoints\n ) as any,\n DEFAULT_MASONRY_GAP_PX\n )\n );\n\n const defaultMasonrySkeleton = (\n <div className={styles.gridSkeletonOverlay}>\n <DefaultMasonrySkeleton\n count={gridSkeletonCount}\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 skeletonCount = cellsState.length;\n\n const gridLoadingNode =\n isGridLayout && gridIsLoading\n ? (gridLoading.renderLoading\n ? gridLoading.renderLoading({ layout: 'grid', count: skeletonCount })\n : defaultGridSkeleton)\n : null;\n\n const masonryLoadingNode =\n isMasonryLayout && masonryIsLoading\n ? (masonryLoading.renderLoading\n ? masonryLoading.renderLoading({ layout: 'masonry', count: skeletonCount })\n : defaultMasonrySkeleton)\n : null;\n\n function buildGridLikeChildren(opts: {\n itemClassName?: string;\n itemBaseClass: string;\n itemBaseStyleClass: string;\n }) {\n return cellsState.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 common = {\n key: cell.id,\n 'data-rmg-idx': index, // (rename if you want, but it’s fine)\n onClick: (e: React.MouseEvent<HTMLElement>) => {\n e.preventDefault();\n if (!fs.enabled) return;\n openFullscreenAt(index);\n },\n style: introStyle,\n className: [\n opts.itemBaseClass,\n opts.itemBaseStyleClass,\n opts.itemClassName || '',\n ].filter(Boolean).join(' '),\n };\n\n if (!React.isValidElement(original)) {\n return (\n <button type=\"button\" {...common}>\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 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 (!fs.enabled) 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: [\n opts.itemBaseClass,\n opts.itemBaseStyleClass,\n origProps.className || '',\n opts.itemClassName || '',\n ].filter(Boolean).join(' '),\n style: {\n ...(origProps.style || {}),\n ...introStyle,\n },\n });\n });\n }\n\n const gridChildren = useMemo(\n () =>\n buildGridLikeChildren({\n itemBaseClass: 'rmg__grid-item',\n itemBaseStyleClass: styles.gridItem,\n itemClassName: gridObject.itemClassName,\n }),\n [cellsState, fs.enabled, gridObject.itemClassName]\n );\n\n const masonryChildren = useMemo(\n () =>\n buildGridLikeChildren({\n itemBaseClass: 'rmg__masonry-item',\n itemBaseStyleClass: '',\n itemClassName: '',\n }),\n [cellsState, fs.enabled, masonryObject.classNames?.item]\n );\n\n const gridContainerProps: React.HTMLAttributes<HTMLDivElement> = {\n className: [\n styles.gridRoot,\n styles.introContainer,\n gridIntroActive ? styles.introActive : '',\n gridObject.rootClassName || '',\n ].filter(Boolean).join(' '),\n style: {\n ...gridStyle,\n ['--rmg-intro-stagger' as any]: `${gridIntro.staggerMs}ms`,\n ['--rmg-intro-transform' as any]: gridIntro.transform,\n ['--rmg-intro-duration' as any]: `${gridIntro.durationMs}ms`,\n ['--rmg-intro-easing' as any]: gridIntro.easing,\n },\n 'aria-busy': gridIsLoading ? true : undefined,\n };\n\n const gridInner = (\n <div ref={gridRootRef} {...gridContainerProps}>\n {gridChildren}\n </div>\n );\n\n const gridIntroWrapped = gridIntro.renderIntro\n ? gridIntro.renderIntro(\n { active: gridIntroActive, containerProps: gridContainerProps },\n gridInner\n )\n : gridInner;\n\n const masonryRootClassName = [\n styles.masonryRoot,\n styles.introContainer,\n masonryIntroActive ? styles.introActive : '',\n masonryObject.classNames?.root || '',\n ].filter(Boolean).join(' ');\n\n type UseEntryInView2Opts = IntersectionObserverInit & {\n nearMargin?: string;\n viewMargin?: string;\n };\n\n function useEntryInView2(len: number, opts?: UseEntryInView2Opts) {\n const nearMargin = opts?.nearMargin ?? '700px 0px';\n const viewMargin = opts?.viewMargin ?? '0px 0px';\n const threshold = opts?.threshold ?? 0.01;\n const root = opts?.root ?? null;\n\n const [nearView, setNearView] = useState<boolean[]>(\n () => Array.from({ length: len }, () => false)\n );\n const [everInView, setEverInView] = useState<boolean[]>(\n () => Array.from({ length: len }, () => false)\n );\n\n const nearIORef = useRef<IntersectionObserver | null>(null);\n const viewIORef = useRef<IntersectionObserver | null>(null);\n const nodeToIndexRef = useRef(new Map<Element, number>());\n\n useEffect(() => {\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 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 }\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 }\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, threshold, len]);\n\n const setEntryRef = useCallback(\n (index: number) => (node: HTMLElement | null) => {\n if (!node) return;\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 }\n\n type EntryLike = {\n key?: string;\n id?: string;\n media?: Array<{ kind?: string; src?: string }>;\n };\n\n function 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\n function 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\n 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 = useMemo(() => safeEntriesKey(entries), [entries]);\n\n const entryImageUrls = 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] = useState<boolean[]>([]);\n const startedRef = useRef<boolean[]>([]);\n const controllersRef = useRef<Map<number, AbortController>>(new Map());\n const initKeyRef = useRef<string>('');\n\n 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 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\n return () => {\n };\n }, [enabled, entries, entryImageUrls, inView, decodedReady, timeoutMs]);\n\n useEffect(() => {\n return () => {\n for (const [, ac] of controllersRef.current) ac.abort();\n controllersRef.current.clear();\n };\n }, []);\n\n return { decodedReady, entriesKey };\n }\n\n const isEntriesLayout = layout === 'entries';\n\n const { nearView, everInView, setEntryRef } = useEntryInView2(entriesObject.items?.length ?? 0, {\n nearMargin: '700px 0px',\n viewMargin: '0px 0px',\n threshold: 0.01,\n });\n\n const { decodedReady } = useEntryDecodeReady(\n isEntriesLayout,\n entries as any,\n nearView,\n { timeoutMs: 8000 }\n );\n\n const normalizedEntriesLoading = useMemo(() => {\n const src = entriesObject.loading ?? {};\n return {\n isLoading: src.isLoading,\n skeletonCount: src.skeletonCount,\n renderLoading: src.renderLoading,\n };\n }, [entriesObject.loading]);\n\n const normalizedEntriesIntro = useMemo(() => {\n const src = entriesObject.intro ?? {};\n return {\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 }, [entriesObject.intro]);\n\n const showGlobalEntriesLoading =\n isEntriesLayout &&\n (normalizedEntriesLoading.isLoading === true || !entries || entriesObject.items?.length === 0);\n\n function renderEntrySkeleton(key: React.Key) {\n return (\n <article key={key} 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 }\n\n const entryRows = !entriesObject.items?.length\n ? null\n : entriesObject.items?.map((entry, entryIndex) => {\n const isNear = nearView[entryIndex] ?? false;\n const hasEverBeenInView = everInView[entryIndex] ?? false;\n const isDecoded = decodedReady[entryIndex] ?? false;\n\n const shouldMountContent = hasEverBeenInView || isNear;\n\n const reveal = hasEverBeenInView && isDecoded;\n\n let contentNode: React.ReactNode = null;\n\n const showSkeleton = !reveal;\n\n if (shouldMountContent) {\n const mediaArray = entry.media ?? [];\n const flatIndexByEntry = entryFlatIndexRef.current;\n\n const renderEntryCardFn =\n typeof entriesObject.render?.card === 'function' ? entriesObject.render?.card : undefined;\n\n const mediaNodes = mediaArray.map((media, mediaIndex) => {\n const globalIndex =\n flatIndexByEntry?.[entryIndex]?.[mediaIndex] ?? 0;\n\n const rawContent =\n typeof entriesObject.render?.media === 'function'\n ? entriesObject.render?.media({\n entry,\n entryIndex,\n media,\n mediaIndex,\n })\n : nodeFromMedia(media);\n\n const handleClick: React.MouseEventHandler<HTMLElement> = (e) => {\n e.preventDefault();\n if (!fs.enabled) return;\n\n if (entriesObject.mediaLayout === 'slider') {\n if (!isClick.current) {\n return;\n }\n }\n\n const origin = e.currentTarget as HTMLElement;\n openFullscreenAt(globalIndex, origin);\n };\n\n const refCallback: React.RefCallback<HTMLElement> = (node) => {\n if (!node) {\n expandableImgRefs.current[globalIndex] = null;\n return;\n }\n\n let img: HTMLImageElement | null = null;\n if (node.tagName === 'IMG') img = node as HTMLImageElement;\n else img = node.querySelector('img');\n\n expandableImgRefs.current[globalIndex] = img;\n };\n\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\n | React.Ref<HTMLElement>\n | undefined;\n\n const mergedRef: React.RefCallback<HTMLElement> = (node) => {\n if (typeof origRef === 'function') {\n origRef(node);\n } else if (origRef && typeof origRef === 'object') {\n (origRef as any).current = node;\n }\n refCallback(node);\n };\n\n const mergedOnClick: React.MouseEventHandler<HTMLElement> = (e) => {\n if (typeof origOnClick === 'function') {\n origOnClick(e);\n }\n if (e.defaultPrevented) return;\n handleClick(e);\n };\n\n return React.cloneElement(original, {\n key: `${entryIndex}-${mediaIndex}`,\n ref: mergedRef,\n onClick: mergedOnClick,\n });\n }\n\n return (\n <button\n key={`${entryIndex}-${mediaIndex}`}\n type=\"button\"\n className={styles.entryMediaButton}\n onClick={handleClick}\n ref={refCallback}\n >\n {rawContent as any}\n </button>\n );\n });\n const mediaContainer =\n entriesObject.mediaLayout === 'masonry' ? (\n <div className={styles.entryMasonry}>\n <Masonry\n items={mediaNodes}\n masonryColumns={masonryObject.columns}\n masonryGap={masonryObject.gap}\n masonryPlacement={masonryObject.placement}\n masonryEstimatedItemHeight={masonryObject.estimatedItemHeight}\n masonryClassNames={masonryObject.classNames}\n masonryAs={masonryObject.as ?? 'div'}\n breakpoints={effectiveBreakpoints}\n />\n </div>\n ) : entriesObject.mediaLayout === 'slider' ? (\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 ) : entriesObject.mediaLayout === 'grid' ? (\n <div className={styles.entryMediaGrid} style={undefined}>\n {mediaNodes}\n </div>\n ) : null;\n\n contentNode = renderEntryCardFn\n ? renderEntryCardFn({ entry, entryIndex, media: mediaContainer })\n : null;\n }\n\n const limit = normalizedEntriesIntro.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 {renderEntrySkeleton(`skel-${entryIndex}`)}\n </div>\n\n {shouldMountContent ? (\n <div className={styles.entryInner}>\n {contentNode}\n </div>\n ) : null}\n </div>\n );\n });\n\n const entryListContainerProps: React.HTMLAttributes<HTMLDivElement> = {\n className: [styles.entryList].filter(Boolean).join(' '),\n style: {\n ['--rmg-entry-intro-stagger' as any]: `${normalizedEntriesIntro.staggerMs}ms`,\n ['--rmg-entry-intro-transform' as any]: normalizedEntriesIntro.transform,\n ['--rmg-entry-intro-duration' as any]: `${normalizedEntriesIntro.durationMs}ms`,\n ['--rmg-entry-intro-easing' as any]: normalizedEntriesIntro.easing,\n },\n 'aria-busy': showGlobalEntriesLoading ? true : undefined,\n };\n\n const isRtl = sliderObject.direction.dir === 'rtl' ? true : false\n const sign = isRtl ? -1 : 1;\n\n 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\n 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\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 setEntryOverlayOpacity(0);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [closingModal])\n\n const bodyX = useRef<ScrollBodyType | null>(null);\n const bodyY = useRef<ScrollBodyType | null>(null);\n\n function boundsForCurrent(\n scale: number,\n imgW: number,\n imgH: number,\n viewW?: number,\n viewH?: number\n ) {\n const rect = currentImage.current?.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 }\n\n const boundsX = useRef<ScrollBoundsType | null>(null);\n const boundsY = useRef<ScrollBoundsType | null>(null);\n\n const isAnimatingRef = useRef(false);\n const animRef = useRef<AnimationsType | null>(null);\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 type PlyrProp = { source: Plyr.SourceInfo; options: Plyr.Options } | null;\n const isVideoItem = (m: MediaItem) => m.kind === \"video\";\n\n 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\n 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 =\n typeof options === \"function\" ? options(item, index) : (options ?? base);\n return { ...base, ...resolved };\n };\n }\n\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\n const wrappedPlyrProps = useMemo(() => {\n const getSource = (item: MediaItem, index: number) =>\n (fs.video?.source ?? defaultPlyrSource)(item, index);\n\n const getOptions = mergePlyrOptions(defaultPlyrOptions, fs.video?.options);\n return buildPlyrProps(wrappedItems, getSource, getOptions);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [wrappedItems, fs.video?.source, fs.video?.options]);\n\n const singlePlyrProps = useMemo(() => {\n const getSource = (item: MediaItem) =>\n ({\n type: \"video\",\n sources: [{ src: (item as any).src, type: \"video/mp4\" }],\n }) as Plyr.SourceInfo;\n\n const getOptions = () =>\n ({\n controls: [\"play-large\", \"play\", \"progress\", \"current-time\", \"volume\", \"fullscreen\"],\n ratio: \"16:9\",\n fullscreen: { enabled: true, fallback: true, iosNative: true },\n }) as Plyr.Options;\n\n return buildPlyrProps(normalizedItems, getSource, getOptions);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [normalizedItems]);\n\n 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 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 }\n\n function detectProvider(source: any): 'youtube' | 'vimeo' | 'mp4' | 'other' {\n const provider = String(source?.sources?.[0]?.provider ?? '').toLowerCase();\n\n if (provider === 'youtube') return 'youtube';\n if (provider === 'vimeo') return 'vimeo';\n\n const src0 = String(source?.sources?.[0]?.src ?? '').toLowerCase();\n\n const looksMp4 = src0.endsWith('.mp4') || src0.includes('.mp4?');\n if (looksMp4) return 'mp4';\n\n return 'other';\n }\n\n function renderFullscreenSlides(opts: {\n items: MediaItem[];\n plyrList: PlyrProp[];\n getTransform: (index: number) => string;\n playerRefs: React.RefObject<(APITypes | null)[]>;\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 const {\n items,\n plyrList,\n getTransform,\n playerRefs,\n renderCaption,\n captionClassName,\n captionStyle,\n fsCaptionPlacement,\n fsCaptionWidth,\n fsCaptionHeight,\n fsCaptionBreakpoint,\n } = opts;\n\n const vw =\n typeof window !== 'undefined'\n ? document.documentElement.clientWidth\n : 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 =\n 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\n ? renderCaption({ item, index, isZoomed })\n : null;\n\n const provider = 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 <div\n ref={imageRef}\n onPointerDown={(e) => handlePanPointerStart(e, imageRef)}\n onClickCapture={(e) => {\n if (suppressNextClickRef.current) {\n suppressNextClickRef.current = false;\n e.preventDefault();\n e.stopPropagation();\n }\n }}\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, ...fs.video?.style }}\n className={[\n 'rmg__player',\n fs.video?.className,\n ].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 ) : fs.renderImage ? (\n fs.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 }\n\n function wrappedTransform(index: number) {\n const length = wrappedItems.length;\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) * sign) * 100}%)`;\n }\n\n const singleTransform = () => `translateX(0%)`;\n\n const wrappedFullscreenImages = renderFullscreenSlides({\n items: wrappedItems,\n plyrList: wrappedPlyrProps,\n getTransform: wrappedTransform,\n playerRefs: wrappedModePlyrRefs,\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 });\n\n const oneFullscreenImage = renderFullscreenSlides({\n items: normalizedItems,\n plyrList: singlePlyrProps,\n getTransform: singleTransform,\n playerRefs: singleModePlyrRefs,\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 });\n\n 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 }\n\n function resetZoom() {\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 // reset vectors...\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 fs.zoom.panDuration, fs.zoom.panFriction\n ).sync();\n bodyY.current = ScrollBody(\n locY.current!, offY.current!, prevY.current!, tgtY.current!,\n fs.zoom.panDuration, fs.zoom.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, fs.zoom.panDuration);\n boundsY.current = ScrollBounds(limY2, offY.current!, tgtY.current!, bodyY.current!, povY, fs.zoom.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 }\n\n function onForceResetZoom() {\n setScale(1);\n previousZoom.current.x = 0;\n previousZoom.current.y = 0;\n panRef.current = { x: 0, y: 0 };\n scaleRef.current = 1;\n\n const commonStyles = {\n transform: 'translate(0, 0) scale(1)',\n transition: 'transform 0.2s cubic-bezier(.4,0,.22,1)',\n };\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\n if (isVideoSlideElement(child)) return;\n\n const match = commonStyles.transition.match(/([\\d.]+)s/);\n const durationMs = match ? parseFloat(match[1]) * 1000 : 300;\n\n element.style.transition = commonStyles.transition;\n if (child) child.style.transition = commonStyles.transition;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n (element as any).offsetWidth;\n\n element.style.transform = commonStyles.transform;\n if (child) child.style.transform = commonStyles.transform;\n\n setTimeout(() => {\n element.style.transition = '';\n if (child) child.style.transition = '';\n }, durationMs + 50);\n });\n\n resetZoom();\n }\n\n function resetAllZoomDom() {\n if (scaleRef.current === 1) return;\n\n changingSlides.current = true;\n setScale(1);\n previousZoom.current.x = 0;\n previousZoom.current.y = 0;\n panRef.current = { x: 0, y: 0 };\n scaleRef.current = 1;\n suppressLoopRef.current = false;\n\n const commonStyles = {\n transform: 'translate(0, 0) scale(1)',\n transition: 'transform 0.2s cubic-bezier(.4,0,.22,1)',\n };\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\n if (isVideoSlideElement(child)) return;\n\n const match = commonStyles.transition.match(/([\\d.]+)s/);\n const durationMs = match ? parseFloat(match[1]) * 1000 : 300;\n\n element.style.transition = commonStyles.transition;\n if (child) child.style.transition = commonStyles.transition;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n (element as any).offsetWidth;\n\n element.style.transform = commonStyles.transform;\n if (child) child.style.transform = commonStyles.transform;\n\n setTimeout(() => {\n element.style.transition = '';\n if (child) child.style.transition = '';\n }, durationMs + 50);\n });\n\n resetZoom?.();\n\n setTimeout(() => {\n changingSlides.current = false;\n }, 200);\n }\n\n useEffect(() => {\n if (!normalizedItems.length) return;\n const first = normalizedItems[0];\n const last = normalizedItems[normalizedItems.length - 1];\n setWrappedItems([last, ...normalizedItems, first]);\n }, [normalizedItems]);\n\n useEffect(() => {\n if (!wrappedItems.length) return;\n imageRefs.current = wrappedItems.map(() => createRef());\n }, [wrappedItems]);\n\n useEffect(() => {\n const onResize = () => setWindowSize({ width: document.documentElement.clientWidth, height: window.innerHeight });\n window.addEventListener(\"resize\", onResize);\n onResize();\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n function getImageAspectRatio(image: HTMLDivElement | null) {\n if (!image) return;\n const imgElement = image.children[0] as HTMLImageElement | undefined;\n if (imgElement && imgElement.naturalWidth && imgElement.naturalHeight) {\n aspectRatioRef.current = imgElement.naturalWidth / imgElement.naturalHeight;\n }\n }\n\n 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\n const rebuildPanBodies = useCallback(() => {\n if (!currentImage.current) return;\n\n const container = currentImage.current;\n const img = container.children[0] as HTMLImageElement | undefined;\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 locX.current = Vector1D(x); prevX.current = Vector1D(x);\n offX.current = Vector1D(x); tgtX.current = Vector1D(x);\n\n locY.current = Vector1D(y); prevY.current = Vector1D(y);\n offY.current = Vector1D(y); tgtY.current = Vector1D(y);\n\n bodyX.current = ScrollBody(\n locX.current, offX.current, prevX.current, tgtX.current,\n fs.zoom.panDuration, fs.zoom.panFriction\n ).sync();\n bodyY.current = ScrollBody(\n locY.current, offY.current, prevY.current, tgtY.current,\n fs.zoom.panDuration, fs.zoom.panFriction\n ).sync();\n\n const { x: limX, y: limY, povX, povY } =\n boundsForCurrent(scaleRef.current, baseW, baseH, containerW, containerH);\n\n boundsX.current = ScrollBounds(limX, offX.current, tgtX.current, bodyX.current, povX, fs.zoom.panDuration);\n boundsY.current = ScrollBounds(limY, offY.current, tgtY.current, bodyY.current, povY, fs.zoom.panDuration);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fs.zoom.panDuration, fs.zoom.panFriction]);\n\n useEffect(() => {\n const anim = Animations(document, window as WindowType,\n () => {\n boundsX.current?.constrain(pointerDownRef.current)\n boundsY.current?.constrain(pointerDownRef.current)\n bodyX.current?.seek()\n bodyY.current?.seek()\n },\n (alpha) => {\n if (!locX.current || !locY.current || !prevX.current || !prevY.current) return\n const lx = locX.current.get() * alpha + prevX.current.get() * (1 - alpha)\n const ly = locY.current.get() * alpha + prevY.current.get() * (1 - alpha)\n offX.current?.set(lx)\n offY.current?.set(ly)\n renderPan(lx, ly)\n\n const settled = !!bodyX.current?.settled() && !!bodyY.current?.settled()\n const within =\n !(boundsX.current?.reached()) &&\n !(boundsY.current?.reached())\n const stop = settled && within && !pointerDownRef.current\n if (stop) animRef.current?.stop()\n }\n )\n animRef.current = anim\n anim.init()\n return () => { anim.destroy(); animRef.current = null }\n }, [])\n\n const freeBoost = { mouse: 400, touch: 400 }\n\n const trackerRef = useRef<ReturnType<typeof DragTracker> | null>(null)\n const dragStore = useRef(EventStore()).current\n const moveStore = useRef(EventStore()).current\n\n const forceBoost = (rawForce: number, isMouse: boolean) =>\n rawForce * (isMouse ? freeBoost.mouse : freeBoost.touch)\n\n function handlePanPointerStart(\n e: React.PointerEvent<HTMLDivElement> | React.TouchEvent<HTMLDivElement>,\n imageRef: React.RefObject<HTMLImageElement | null>\n ) {\n if (!isZoomed) return\n if (!imageRef.current) return\n currentImage.current = imageRef.current\n getImageAspectRatio(imageRef.current)\n\n rebuildPanBodies()\n\n const ownerWin = window as WindowType\n const axis = 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 pointerDownRef.current = true\n interactionModeRef.current = 'drag'\n\n if (tgtX.current && locX.current) tgtX.current.set(locX.current.get())\n if (tgtY.current && locY.current) tgtY.current.set(locY.current.get())\n\n const CLICK_MOVE_TOL = 3\n const CLICK_TIME_TOL_MS = 220\n const FLICK_FORCE_TOL = 0.075\n let totalAbsDx = 0\n let totalAbsDy = 0\n let canceledByMultiTouch = false\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 return onUp(evt as any)\n }\n\n const moved = trackerRef.current!.pointerMove(evt as any)\n\n totalAbsDx += Math.abs(moved.dx)\n totalAbsDy += Math.abs(moved.dy)\n\n bodyX.current?.useFriction(0.3).useDuration(0.75)\n bodyY.current?.useFriction(0.3).useDuration(0.75)\n\n tgtX.current?.add(moved.dx)\n tgtY.current?.add(moved.dy)\n\n 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 pointerDownRef.current = false\n interactionModeRef.current = 'idle'\n moveStore.clear()\n\n if (isClick) {\n const imgEl = (currentImage.current?.querySelector('img') ??\n currentImage.current?.children[0]) as HTMLImageElement | null\n if (imgEl) {\n const upAny = evt as any\n const cx = upAny?.touches?.[0]?.clientX ?? upAny?.changedTouches?.[0]?.clientX ?? upAny?.clientX ?? downNativeEvt?.clientX\n const cy = upAny?.touches?.[0]?.clientY ?? upAny?.changedTouches?.[0]?.clientY ?? upAny?.clientY ?? 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 handleZoomToggle(fakeReactEvt, currentImage as any)\n\n suppressNextClickRef.current = true;\n const anyEvt: any = evt;\n anyEvt?.preventDefault?.();\n anyEvt?.stopPropagation?.();\n animRef.current?.stop()\n return;\n }\n 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 = fs.zoom.panDuration - 10 * factorX\n const speedY = fs.zoom.panDuration - 10 * factorY\n const frictionX = fs.zoom.panFriction + factorX / 50\n const frictionY = fs.zoom.panFriction + factorY / 50\n\n bodyX.current?.useDuration(speedX).useFriction(frictionX)\n bodyY.current?.useDuration(speedY).useFriction(frictionY)\n\n tgtX.current?.add(fx)\n tgtY.current?.add(fy)\n\n animRef.current?.start()\n }\n\n const isMouse = (e as any).nativeEvent instanceof MouseEvent\n const node: any = isMouse ? document : window\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\n const isPinching = useRef(false);\n const isTouchPinching = useRef(false);\n const pinchJustEnded = useRef(false);\n const startDist = useRef(0);\n const startScale = useRef(1);\n\n function applySmoothTransform(\n x: number,\n y: number,\n scale: number,\n durationMs = 300\n ) {\n const container = 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 offX.current?.set(x);\n offY.current?.set(y);\n locX.current?.set(x);\n locY.current?.set(y);\n prevX.current?.set(x);\n prevY.current?.set(y);\n tgtX.current?.set(x);\n tgtY.current?.set(y);\n scaleRef.current = scale;\n setScale(scale);\n\n window.setTimeout(() => {\n primary.style.transition = '';\n }, durationMs + 30);\n }\n\n function handleZoomToggle(\n e: React.PointerEvent<HTMLImageElement> | React.TouchEvent<HTMLImageElement>,\n imageRef: React.RefObject<HTMLDivElement | null>\n ) {\n if (!imageRef.current) return;\n\n currentImage.current = imageRef.current;\n const container = currentImage.current;\n const imgEl = container.children[0] as HTMLImageElement;\n\n const { width: cw, height: ch } = container.getBoundingClientRect();\n\n const iw = imgEl.offsetWidth;\n const ih = imgEl.offsetHeight;\n\n const gapAllEdges = cw > 0 && ch > 0 && iw > 0 && ih > 0 && iw < cw && ih < ch;\n\n if (gapAllEdges) return;\n\n const { x: domTx, y: domTy } = getCurrentTransform(imgEl);\n if (!locX.current || !locY.current) {\n locX.current = Vector1D(domTx);\n prevX.current = Vector1D(domTx);\n offX.current = Vector1D(domTx);\n tgtX.current = Vector1D(domTx);\n\n locY.current = Vector1D(domTy);\n prevY.current = Vector1D(domTy);\n offY.current = Vector1D(domTy);\n tgtY.current = Vector1D(domTy);\n\n bodyX.current = ScrollBody(\n locX.current,\n offX.current,\n prevX.current,\n tgtX.current,\n fs.zoom.panDuration,\n fs.zoom.panFriction\n ).sync();\n\n bodyY.current = ScrollBody(\n locY.current,\n offY.current,\n prevY.current,\n tgtY.current,\n fs.zoom.panDuration,\n fs.zoom.panFriction\n ).sync();\n }\n\n const s0 = scaleRef.current || 1;\n const goingIn = s0 === 1;\n const s1 = goingIn ? 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 resetAllZoomDom();\n }\n\n const rect = container.getBoundingClientRect();\n const containerW = rect.width;\n const containerH = rect.height;\n\n const anyEvt = e as any;\n const clientX =\n anyEvt?.touches?.[0]?.clientX ??\n anyEvt?.changedTouches?.[0]?.clientX ??\n anyEvt?.clientX ??\n 0;\n\n const clientY =\n anyEvt?.touches?.[0]?.clientY ??\n anyEvt?.changedTouches?.[0]?.clientY ??\n anyEvt?.clientY ??\n 0;\n\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 = offX.current!.get();\n const ty0 = 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 } = boundsForCurrent(s1, baseW, baseH, containerW, containerH);\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\n applySmoothTransform(tx1, ty1, s1, DURATION);\n\n scaleRef.current = s1;\n setScale(s1);\n previousZoom.current.x = cx;\n previousZoom.current.y = cy;\n panRef.current = { x: tx1, y: ty1 };\n\n locX.current!.set(tx1);\n prevX.current!.set(tx1);\n offX.current!.set(tx1);\n tgtX.current!.set(tx1);\n\n locY.current!.set(ty1);\n prevY.current!.set(ty1);\n offY.current!.set(ty1);\n tgtY.current!.set(ty1);\n\n bodyX.current = ScrollBody(\n locX.current!,\n offX.current!,\n prevX.current!,\n tgtX.current!,\n fs.zoom.panDuration,\n fs.zoom.panFriction\n ).sync();\n\n bodyY.current = ScrollBody(\n locY.current!,\n offY.current!,\n prevY.current!,\n tgtY.current!,\n fs.zoom.panDuration,\n fs.zoom.panFriction\n ).sync();\n\n const { x: limX2, y: limY2, povX, povY } = boundsForCurrent(s1, baseW, baseH, containerW, containerH);\n boundsX.current = ScrollBounds(limX2, offX.current!, tgtX.current!, bodyX.current!, povX, fs.zoom.panDuration);\n boundsY.current = ScrollBounds(limY2, offY.current!, tgtY.current!, bodyY.current!, povY, fs.zoom.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 }\n\n type Point = { x: number; y: number };\n function clampNum(val: number, min: number, max: number) { return Math.max(min, Math.min(max, val)) }\n\n const handlePinchWheel = useCallback((\n e: WheelEvent,\n imageRef: React.RefObject<HTMLDivElement | null>\n ) => {\n e.preventDefault();\n if (!imageRef.current) return;\n if (!e.ctrlKey) return;\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({\n destZoomLevel,\n centerPoint: { x: e.clientX, y: e.clientY },\n imageRef\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scaleRef.current]);\n\n function baseFitSizeC(imgEl: HTMLImageElement, containerW: number, containerH: number) {\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\n function zoomTo({\n destZoomLevel,\n centerPoint,\n imageRef\n }: {\n destZoomLevel: number;\n centerPoint: { x: number; y: number };\n imageRef: React.RefObject<HTMLDivElement | null>;\n }) {\n if (!imageRef.current) return;\n\n currentImage.current = imageRef.current;\n const container = currentImage.current as HTMLDivElement;\n const imgEl = container.children[0] as HTMLImageElement;\n\n const { width: cw, height: ch } = container.getBoundingClientRect();\n\n const iw = imgEl.offsetWidth;\n const ih = imgEl.offsetHeight;\n\n const gapAllEdges = cw > 0 && ch > 0 && iw > 0 && ih > 0 && iw < cw && ih < ch;\n\n if (gapAllEdges) return;\n\n const { x: domTx, y: domTy } = getCurrentTransform(imgEl);\n if (!locX.current || !locY.current) {\n locX.current = Vector1D(domTx); prevX.current = Vector1D(domTx); offX.current = Vector1D(domTx); tgtX.current = Vector1D(domTx);\n locY.current = Vector1D(domTy); prevY.current = Vector1D(domTy); offY.current = Vector1D(domTy); tgtY.current = Vector1D(domTy);\n\n bodyX.current = ScrollBody(\n locX.current, offX.current, prevX.current, tgtX.current,\n fs.zoom.panDuration, fs.zoom.panFriction\n ).sync();\n bodyY.current = ScrollBody(\n locY.current, offY.current, prevY.current, tgtY.current,\n fs.zoom.panDuration, fs.zoom.panFriction\n ).sync();\n }\n\n const s0 = scaleRef.current || 1;\n const s1 = clampNum(destZoomLevel, 1, 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) {\n suppressLoopRef.current = true;\n } else if (wasZoomed && !willBeZoomed) {\n suppressLoopRef.current = false;\n }\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 = offX.current!.get();\n const ty0 = 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 } = boundsForCurrent(s1, baseW, baseH, containerW, containerH);\n tx1 = limX.constrain(tx1);\n ty1 = limY.constrain(ty1);\n\n scaleRef.current = s1;\n setScale(s1);\n previousZoom.current.x = cx;\n previousZoom.current.y = cy;\n\n tgtX.current!.set(tx1); locX.current!.set(tx1); prevX.current!.set(tx1); offX.current!.set(tx1);\n tgtY.current!.set(ty1); locY.current!.set(ty1); prevY.current!.set(ty1); offY.current!.set(ty1);\n\n boundsX.current = ScrollBounds(limX, offX.current!, tgtX.current!, bodyX.current!, povX, fs.zoom.panDuration);\n boundsY.current = ScrollBounds(limY, offY.current!, tgtY.current!, bodyY.current!, povY, fs.zoom.panDuration);\n\n bodyX.current?.useDuration(0).useFriction(1);\n bodyY.current?.useDuration(0).useFriction(1);\n\n renderPan(tx1, ty1);\n animRef.current?.start();\n }\n\n function isPinchGesture(e: WheelEvent): boolean {\n if (e.ctrlKey) return true;\n const absX = Math.abs(e.deltaX), absY = Math.abs(e.deltaY)\n if (absX < 1 && absY < 1) return false\n const ratio = absX / absY\n return ratio >= 0.8 && ratio <= 1.2\n }\n\n const handleWheel = useCallback((e: WheelEvent) => {\n e.preventDefault();\n if (!isZoomed) return;\n if (isPinchGesture(e)) return;\n if (e.ctrlKey) return;\n if (!currentImage.current) return;\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 const { x: limX, y: limY, povX, povY } =\n boundsForCurrent(scaleRef.current, baseW, baseH, containerW, containerH);\n\n boundsX.current = ScrollBounds(limX, offX.current!, tgtX.current!, bodyX.current!, povX, fs.zoom.panDuration);\n boundsY.current = ScrollBounds(limY, offY.current!, tgtY.current!, bodyY.current!, povY, fs.zoom.panDuration);\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 // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isZoomed, rebuildPanBodies]);\n\n useEffect(() => {\n window.addEventListener('wheel', handleWheel as any)\n return () => {\n window.removeEventListener('wheel', handleWheel as any)\n }\n }, [handleWheel])\n\n useLayoutEffect(() => {\n function pinchWheelHandler(e: WheelEvent) {\n let targetImg: HTMLImageElement | null = null;\n\n const x = e.clientX;\n const y = e.clientY;\n\n const underlyingElement = document.elementFromPoint(x, y);\n\n if (underlyingElement) {\n if (underlyingElement.tagName.toLowerCase() === \"img\") {\n targetImg = underlyingElement as HTMLImageElement;\n } else {\n targetImg = underlyingElement.querySelector(\"img\");\n }\n }\n\n if (!targetImg) return;\n\n const imgIndex = targetImg.dataset.index;\n\n if (imgIndex === undefined) return;\n\n const matchedRef = imageRefs.current[parseInt(imgIndex)];\n\n if (!matchedRef) return;\n\n currentImage.current = imageRefs.current[parseInt(imgIndex)].current;\n\n handlePinchWheel(e, matchedRef);\n }\n\n window.addEventListener('wheel', pinchWheelHandler, { passive: false });\n\n return () => {\n window.removeEventListener('wheel', pinchWheelHandler);\n };\n }, [handlePinchWheel]);\n\n 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 \n 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 }\n\n const onTouchStart = (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\n const onTouchMove = (e: TouchEvent, imageRef: React.RefObject<HTMLDivElement | null>) => {\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 destZoom = startScale.current * factor;\n\n const center = midpoint(t0, t1);\n zoomTo({ destZoomLevel: destZoom, centerPoint: center, imageRef })\n }\n\n const endPinch = () => {\n if (!isTouchPinching.current) return;\n isTouchPinching.current = false;\n pinchJustEnded.current = true;\n }\n\n useLayoutEffect(() => {\n function touchPinchMoveHandler(e: TouchEvent) {\n let targetImg: HTMLImageElement | null = null;\n\n const { x, y } = midpoint(e.touches[0], e.touches[1])\n\n const underlyingElement = document.elementFromPoint(x, y);\n\n if (underlyingElement) {\n if (underlyingElement.tagName.toLowerCase() === \"img\") {\n targetImg = underlyingElement as HTMLImageElement;\n } else {\n targetImg = underlyingElement.querySelector(\"img\");\n }\n }\n\n if (!targetImg) return;\n\n const imgIndex = targetImg.dataset.index;\n\n if (imgIndex === undefined) return;\n\n const matchedRef = imageRefs.current[parseInt(imgIndex)];\n\n if (!matchedRef) return;\n\n currentImage.current = imageRefs.current[parseInt(imgIndex)].current;\n\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 return () => {\n window.removeEventListener('touchstart', onTouchStart);\n window.removeEventListener('touchmove', touchPinchMoveHandler);\n window.removeEventListener('touchend', endPinch);\n window.removeEventListener('touchcancel', endPinch);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [zoomTo, onTouchStart, onTouchMove, endPinch]);\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 masonryNode = (\n <Masonry\n items={masonryChildren}\n masonryColumns={masonryObject.columns}\n masonryGap={masonryObject.gap}\n masonryPlacement={masonryObject.placement}\n masonryEstimatedItemHeight={masonryObject.estimatedItemHeight}\n masonryClassNames={{\n root: masonryRootClassName,\n column: [styles.masonryCol, masonryObject.classNames?.column].filter(Boolean).join(' '),\n item: [styles.masonryItem, masonryObject.classNames?.item].filter(Boolean).join(' '),\n }}\n masonryStyle={{\n ['--rmg-intro-stagger' as any]: `${masonryIntro.staggerMs}ms`,\n ['--rmg-intro-transform' as any]: masonryIntro.transform,\n ['--rmg-intro-duration' as any]: `${masonryIntro.durationMs}ms`,\n ['--rmg-intro-easing' as any]: masonryIntro.easing,\n }}\n masonryAs={masonryObject.as ?? 'div'}\n masonryRootRef={masonryObject.rootRef ?? masonryRootRef}\n breakpoints={effectiveBreakpoints}\n />\n );\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 <>\n {masonryLoadingNode}\n {masonryNode}\n </>\n ) : layout === 'entries' ? (\n <>\n <div {...entryListContainerProps}>\n {entryRows}\n </div>\n </>\n ) : layout === 'grid' ? (\n <>\n {gridLoadingNode}\n {gridIntroWrapped}\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 isZoomClick={isZoomClick}\n isClick={isClick}\n isAnimating={isAnimatingRef}\n overlayDivRef={overlayDivRef}\n zoomLevel={zoomLevel}\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={handleZoomToggle}\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 >\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 <div\n ref={setFsEntryOverlayMountRef}\n style={{\n position: 'absolute',\n inset: 0,\n pointerEvents: 'none',\n zIndex: 9999,\n }}\n >\n </div>\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 '.'\n\ntype WindowType = Window & typeof globalThis\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 Axis() {\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}\ntype AxisType = ReturnType<typeof Axis>\n\nfunction Translate(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}\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\ntype AxisLike = {\n scroll: 'x' | 'y'\n cross: 'x' | 'y'\n direction: (n: number) => number\n measureSize?: (rect: DOMRect) => number\n}\n\nfunction DragTracker(axis: AxisLike, ownerWindow: WindowType) {\n return createDragTracker({\n ownerWindow,\n axis,\n })\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<HTMLImageElement>\n | React.TouchEvent<HTMLImageElement>,\n imageRef: React.RefObject<HTMLImageElement | null>\n ) => void\n imageRefs: React.RefObject<HTMLImageElement | 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}\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 },\n ref\n ) => {\n const isRtl = direction === 'rtl' ? true : false\n const rtlCls = isRtl ? styles.rtl : '';\n const sign = isRtl ? -1 : 1;\n\n const viewportRef = useRef<HTMLDivElement | null>(null)\n const slider = useRef<HTMLDivElement | null>(null)\n const axisRef = useRef<AxisType | null>(null)\n\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\n const isAnimatingRef = useRef(false)\n const pointerDownRef = useRef(false)\n\n const yTemp = useRef(0)\n const dragThreshold = 5\n const FADE_DISTANCE = 300\n\n const selectedIndex = useRef(0)\n const hasPositioned = useRef<boolean>(false)\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 perSlideRef = useRef(0)\n\n const contentSizeRef = useRef(0)\n const loopLimitRef = useRef<ReturnType<typeof Limit> | null>(null)\n\n type FsScrollTo = {\n distance: (n: number, snap: boolean) => void\n index: (n: number, direction: number) => void\n }\n\n const scrollSnapsRef = useRef<number[]>([])\n const scrollContentSizeRef = useRef(0)\n\n type FsLimit = {\n min: number\n max: number\n reachedAny: (n: number) => boolean\n constrain: (n: number) => number\n removeOffset: (n: number) => number\n }\n\n const scrollLimitRef = useRef<FsLimit | null>(null)\n const scrollTargetRef = useRef<ScrollTargetType | null>(null)\n const scrollToRef = useRef<FsScrollTo | null>(null)\n\n function createFsLimit(min: number, max: number): FsLimit {\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 }\n\n type CounterType = {\n get: () => number\n set: (n: number) => CounterType\n add: (n: number) => CounterType\n clone: () => CounterType\n }\n\n 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 }\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 = createFsLimit(-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 const slides = useRef<{ cells: { element: HTMLElement }[] }[]>([])\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 const indexCurrentRef = useRef<CounterType | null>(null)\n const indexPreviousRef = useRef<CounterType | null>(null)\n\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\n const dragStartY = useRef(0)\n const dragYForClose = useRef(0)\n\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 \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 selectedIndex.current = idx;\n indexCurrentRef.current?.set(idx);\n sub.setLocalIndex(idx);\n updateCounterFromIndex(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 const activeTouchCount = useRef(0)\n const wasPinch = useRef(false)\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 = createFsLimit(-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 selectedIndex.current = idx;\n sub.setLocalIndex(idx);\n updateCounterFromIndex(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 const appliedYRef = useRef(0)\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 type DragMode = 'none' | 'x' | 'y'\n const dragMode = useRef<DragMode>('none')\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 selectedIndex.current = ((req.index % slideCount()) + slideCount()) % slideCount();\n sub.setLocalIndex(selectedIndex.current);\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}","/* 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 { MediaItem } from '.'\nimport { parseObjectPosition } from './shared/transitions/objectPosition';\nimport { containTransformForRect, coverTransformForRect, objectFitContentRect } from './shared/transitions/objectFitTransform';\n\ntype IndexMode = 'instant' | 'animated';\n\ntype MediaEntryLink = {\n entryIndex: number;\n mediaIndex: number;\n};\n\ninterface FullscreenModalProps {\n fsSub: FullscreenSliderSub\n open: boolean\n onClose: () => void\n isZoomClick: RefObject<boolean>\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 zoomLevel: number\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 isZoomClick,\n isClick,\n isAnimating,\n overlayDivRef,\n closeButtonRef,\n counterRef,\n leftChevronRef,\n rightChevronRef,\n zoomLevel,\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 mountShield();\n\n isAnimating.current = false\n isClick.current = false\n cells.current = []\n setClosingModal(true)\n\n if (layout === 'grid' || layout === 'masonry' || entryMediaLayout === 'grid' || entryMediaLayout === 'masonry') {\n void proceedToCloseGrid();\n return;\n }\n\n if (!slider.current || !slides.current?.length) return\n\n const viewport = getViewportEl(slider.current)\n if (!viewport) return\n\n const originals = wrappedItems.slice(1, wrappedItems.length - 1)\n\n const fsIndex = fsSub.get()\n let canonicalIdx: number;\n if (isWrapping.current) {\n if ((fsIndex >= slider.current.children.length - (visibleImagesRef.current || 0) * 2) && layout !== 'entries') {\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 const url = originals[canonicalIdx]\n\n if (introFade || isVideoItem(url)) {\n setClosingModal(true);\n fadeCloseAndTeardown();\n return;\n }\n\n let 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\n fadeChrome()\n\n fadeOverlay()\n\n const slideArr = slides.current!;\n\n let matchSlide = slideArr.find(s => s.cells.some(c => c.index === localSlideIdx))\n\n let newIndex = matchSlide ? slideArr.indexOf(matchSlide) : -1;\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 =\n !!(viewport && targetCellEl) &&\n !isCellVisible(targetCellEl!, viewport, true);\n\n const continueAfterMeasure = 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) { safeTeardown(); return }\n\n const { domSlideIdx } = thumbInfo;\n\n let thumbCropRect = thumbInfo.cropRect; // fallback (cell rect)\n\n if (thumbInfo.imgEl) {\n const thumbImg = thumbInfo.imgEl;\n const thumbBox = thumbImg.getBoundingClientRect();\n\n const csThumb = getComputedStyle(thumbImg);\n const fitThumb = (csThumb.objectFit || 'cover') as 'contain' | 'cover';\n const objThumb = parseObjectPosition(csThumb.objectPosition ?? null);\n\n const natWThumb = Math.max(1, thumbImg.naturalWidth || 0);\n const natHThumb = Math.max(1, thumbImg.naturalHeight || 0);\n\n thumbCropRect =\n fitThumb === 'contain'\n ? objectFitContentRect(natWThumb, natHThumb, thumbBox, 'contain', objThumb)\n : thumbBox;\n }\n\n const slideEl = slider.current!.children[domSlideIdx] as HTMLElement | undefined\n if (!slideEl) return\n\n const fsSlider = withinFs<HTMLElement>('.fullscreen_slider');\n if (!fsSlider) { safeTeardown(); return; }\n const url = originals[canonicalIdx]\n const isVideoSlide = isVideoItem(url);\n\n const fsIdx = fsSub.get();\n const nodeIdx = nodeIdxFromFs(fsIdx, imageCount);\n\n const targetImg =\n !isVideoSlide\n ? fsSlider?.querySelector<HTMLImageElement>(`img[data-index=\"${nodeIdx}\"]`) ?? null\n : null;\n\n if (!targetImg && !isVideoSlide) { safeTeardown(); return; }\n\n fadeNonActiveSlides(fsSlider, nodeIdx, targetImg, isVideoSlide);\n\n let captionClone: HTMLElement | null = cloneFsCaptionForNode(fsSlider, nodeIdx)\n\n if (captionClone) {\n captionClone.style.transition = `opacity ${DURATION_MS}ms ${EASING}`\n void captionClone.offsetWidth\n captionClone.style.opacity = '0'\n }\n\n let movingEl: HTMLElement | null = null\n let restoreIntoParent: Node | null = null\n let restoreNextSibling: Node | null = null\n let natW = 0\n let natH = 0\n\n if (isVideoSlide) {\n const fsSliderEl = fsSlider as HTMLElement | null;\n if (!fsSliderEl) { safeTeardown(); return; }\n\n await animateVideoCloseProxy({\n fsSliderEl,\n nodeIdx,\n thumbCropRect,\n endObjPos: thumbInfo.objPos ?? { x: 0.5, y: 0.5 },\n captionClone,\n safeTeardown,\n DURATION_MS,\n EASING\n });\n\n return;\n }\n\n {\n movingEl = targetImg as unknown as HTMLElement\n restoreIntoParent = movingEl?.parentNode || null\n 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\n const fsFit = ((getComputedStyle(targetImg!).objectFit || 'contain') as 'contain' | 'cover');\n const curRect = movingEl.getBoundingClientRect();\n natW = imgEl.naturalWidth || curRect.width || 1;\n 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 endFit = thumbInfo.imgEl\n ? ((getComputedStyle(thumbInfo.imgEl).objectFit || 'cover') as 'contain' | 'cover')\n : 'cover';\n\n const endT =\n endFit === 'contain'\n ? containTransformForRect(natW, natH, thumbCropRect, thumbInfo.objPos)\n : coverTransformForRect(natW, natH, thumbCropRect, thumbInfo.objPos);\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(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 movingEl?.removeEventListener('transitionend', onEnd as any)\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 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 movingEl.addEventListener('transitionend', onEnd as any, { once: true })\n window.setTimeout(() => finish(), DURATION_MS + 80)\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 continueAfterMeasure() })\n })\n } else {\n void continueAfterMeasure()\n }\n }\n\n async function proceedToCloseGrid() {\n if (!open) return;\n mountShield();\n\n isAnimating.current = false;\n isClick.current = false;\n cells.current = [];\n setClosingModal(true);\n\n const fsSlider = withinFs<HTMLElement>('.fullscreen_slider');\n if (!fsSlider) { safeTeardown(); return; }\n const count = imageCount || wrappedItems.length || 0;\n\n const originals = wrappedItems.slice(1, wrappedItems.length - 1);\n const originalsCount = originals.length || count;\n if (!originalsCount) {\n safeTeardown();\n return;\n }\n\n const fsIdx = fsSub.get();\n const canonicalIdx = Math.max(0, Math.min(originalsCount - 1, fsIdx));\n\n const url = originals[canonicalIdx];\n\n if (introFade || isVideoItem(url)) {\n mountShield();\n setClosingModal(true);\n fadeCloseAndTeardown();\n return;\n }\n\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 const origMedia = originals[canonicalIdx];\n if (!origMedia) {\n safeTeardown();\n return;\n }\n\n const isVideoSlide = isVideoItem(origMedia);\n if (!expandableImgRefs?.current) {\n safeTeardown();\n return;\n }\n\n const origImgRef = expandableImgRefs.current?.[canonicalIdx] as unknown as HTMLImageElement | null;\n\n fadeChrome()\n\n fadeOverlay()\n\n if (!origImgRef) {\n safeTeardown();\n return;\n }\n\n const gridRect = origImgRef.getBoundingClientRect();\n\n const cs = getComputedStyle(origImgRef);\n const objPos = parseObjectPosition(cs?.objectPosition ?? null) ?? { x: 0.5, y: 0.5 };\n const objectFit = (cs?.objectFit ?? 'cover') as 'contain' | 'cover';\n\n let thumbCropRect = gridRect;\n\n const natWThumb = Math.max(1, origImgRef.naturalWidth || 0);\n const natHThumb = Math.max(1, origImgRef.naturalHeight || 0);\n\n thumbCropRect =\n objectFit === 'contain'\n ? objectFitContentRect(natWThumb, natHThumb, gridRect, 'contain', objPos)\n : gridRect;\n\n const thumbInfo = {\n slideIdx: canonicalIdx,\n domSlideIdx: canonicalIdx,\n cropRect: thumbCropRect,\n imgEl: origImgRef,\n objPos,\n renderedW: thumbCropRect.width,\n renderedH: thumbCropRect.height,\n renderedRect: thumbCropRect,\n objectFit,\n };\n\n const nodeIdx = nodeIdxFromFs(fsIdx, imageCount);\n const targetImg =\n !isVideoSlide\n ? fsSlider.querySelector<HTMLImageElement>(`img[data-index=\"${nodeIdx}\"]`) ?? null\n : null;\n \n let captionClone: HTMLElement | null = cloneFsCaptionForNode(fsSlider, nodeIdx)\n\n if (captionClone) {\n captionClone.style.transition = `opacity ${DURATION_MS}ms ${EASING}`\n void captionClone.offsetWidth\n captionClone.style.opacity = '0'\n }\n\n fadeNonActiveSlides(fsSlider, nodeIdx, targetImg, isVideoSlide);\n \n let movingEl: HTMLElement | null = null;\n let restoreIntoParent: Node | null = null;\n let restoreNextSibling: Node | null = null;\n let natW = 0;\n let natH = 0;\n\n if (isVideoSlide) {\n const fsSliderEl = fsSlider as HTMLElement | null;\n if (!fsSliderEl) { safeTeardown(); return; }\n\n await animateVideoCloseProxy({\n fsSliderEl,\n nodeIdx,\n thumbCropRect,\n endObjPos: thumbInfo.objPos ?? { x: 0.5, y: 0.5 },\n captionClone,\n safeTeardown,\n DURATION_MS,\n EASING\n });\n\n return;\n }\n\n {\n movingEl = (targetImg as unknown as HTMLElement) || null;\n if (!movingEl) {\n safeTeardown();\n return;\n }\n\n restoreIntoParent = movingEl.parentNode || null;\n 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\n const fsFit = ((getComputedStyle(targetImg!).objectFit || 'contain') as 'contain' | 'cover');\n const curRect = movingEl.getBoundingClientRect();\n natW = imgEl.naturalWidth || curRect.width || 1;\n 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 endFit = thumbInfo.imgEl\n ? ((getComputedStyle(thumbInfo.imgEl).objectFit || 'cover') as 'contain' | 'cover')\n : 'cover';\n\n const endT =\n endFit === 'contain'\n ? containTransformForRect(natW, natH, thumbCropRect, thumbInfo.objPos)\n : coverTransformForRect(natW, natH, thumbCropRect, thumbInfo.objPos);\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(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 movingEl?.removeEventListener('transitionend', onEnd as any);\n try {\n if (restoreIntoParent) {\n if (restoreNextSibling)\n (restoreIntoParent as Node).insertBefore(movingEl!, restoreNextSibling);\n else\n (restoreIntoParent as Node).appendChild(movingEl!);\n }\n } catch {}\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 movingEl.addEventListener('transitionend', onEnd as any, { once: true });\n window.setTimeout(() => finish(), DURATION_MS + 80);\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-unused-expressions */\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 { flushSync } from 'react-dom';\nimport { AxisKey } 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 { parseObjectPosition } from './shared/transitions/objectPosition';\nimport { containTransformForRect, coverTransformForRect, objectFitContentRect } from './shared/transitions/objectFitTransform';\nimport type { APITypes } from 'plyr-react';\nimport { RmgSlideProvider } from './shared/slideContext';\n\ntype WindowType = Window & typeof globalThis\n\nconst mathAbs = Math.abs\n\ntype 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\nfunction 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\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(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 ResponsiveHeightRule = { query: string; height: string };\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\ntype DotsRenderArgs = {\n ref: React.RefObject<HTMLDivElement | null>;\n count: number;\n activeIndex: number;\n hidden: boolean;\n goTo: (index: number) => void;\n getDotRef: (index: number) => (el: HTMLDivElement | null) => void;\n createRipple: (el: HTMLElement) => void;\n classNameContainer?: string;\n classNameDot?: string;\n};\n\ntype ProgressRenderArgs = {\n ref: React.Ref<HTMLDivElement>;\n innerRef?: React.Ref<HTMLDivElement>;\n hidden: boolean;\n progress: number;\n axis: 'x' | 'y';\n className?: string;\n style?: React.CSSProperties;\n innerClassName?: string;\n innerStyle?: React.CSSProperties;\n};\n\ntype FsCounterArgs = { index: number; count: number };\n\ntype IndexMode = 'instant' | 'animated';\n\nexport type MediaItem =\n | {\n kind: 'image';\n src: string;\n alt?: string;\n caption?: React.ReactNode;\n }\n | {\n kind: 'video';\n src: string;\n alt?: string;\n thumb?: string;\n caption?: React.ReactNode;\n };\n\ntype FsCaptionPlacement = 'top' | 'right' | 'bottom' | 'left';\n\nexport type FsCaptionRenderArgs = {\n item: MediaItem;\n index: number;\n isZoomed: boolean;\n};\n\nexport interface SliderHandle {\n centerSlider: () => void;\n getIndex: () => number;\n setIndex: (i: number, mode?: IndexMode) => void;\n subscribeIndex: (fn: () => void) => () => void;\n slideIndexForCell: (cellIndex: number) => number;\n getRootNode(): HTMLElement | null;\n getContainerNode(): HTMLElement | null;\n getSlideNodes(): HTMLElement[];\n onSlidesBuilt(cb: (nodes: HTMLElement[]) => void): () => void;\n whenSlidesBuilt(): Promise<HTMLElement[]>;\n isSlidesBuilt(): boolean;\n scrollNext: (mode?: IndexMode) => void;\n scrollPrev: (mode?: IndexMode) => void;\n canScrollNext: () => boolean;\n canScrollPrev: () => boolean;\n scrollProgress: () => number;\n cellsInView: () => number[];\n getInternals(): {\n slides: RefObject<{ cells: { element: HTMLElement; index: number }[]; target: number }[]>;\n slider: RefObject<HTMLDivElement | null>;\n visibleImages: RefObject<number>;\n selectedIndex: RefObject<number>;\n sliderX: RefObject<number>;\n sliderVelocity: RefObject<number>;\n isWrapping: RefObject<boolean>;\n };\n}\n\ntype ResponsiveNumber =\n | number\n | string\n | Array<number | string>\n | Record<string, number | string>;\n\ntype BreakpointMap = Record<string, number>;\n\nexport type LoadingOptions = {\n isLoading?: boolean;\n skeletonCount?: ResponsiveNumber;\n renderLoading?: (args: {\n layout: 'slider' | 'grid' | 'masonry' | 'entries';\n count: number; // SSR base count (xs / lowest rule)\n }) => React.ReactNode;\n};\n\nexport type IntroOptions = {\n renderIntro?: (\n args: {\n active: boolean;\n containerProps: React.HTMLAttributes<HTMLDivElement>;\n },\n content: React.ReactNode\n ) => React.ReactNode;\n staggerMs?: number;\n transform?: number | string;\n durationMs?: number;\n easing?: string;\n};\n\ntype ThumbnailPosition = 'top' | 'right' | 'bottom' | 'left' | null;\n\ntype ControlStyle = {\n className?: string;\n style?: React.CSSProperties;\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?: ControlStyle;\n arrows?: {\n arrow?: ControlStyle;\n prev?: ControlStyle;\n next?: ControlStyle;\n };\n counter?: ControlStyle;\n };\n showFsArrows?: boolean;\n showFsClose?: boolean;\n renderFsClose?: () => React.ReactNode | 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) => React.ReactNode | 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?: LoadingOptions;\n introOptions?: IntroOptions;\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 internalIndexChannel = useMemo(() => createIndexChannel(), []);\n const indexChannel = externalIndexChannel ?? internalIndexChannel;\n\n const isRtl = direction === 'rtl' ? true : false\n const rtlCls = isRtl ? styles.rtl : '';\n const sign = axis === 'x' && isRtl ? -1 : 1;\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 [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 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 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\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 \n const [inView, setInView] = useState(false)\n const [wrap, setWrap] = useState(false)\n\n const progressHolderRef = useRef<HTMLDivElement | null>(null);\n const progressInnerRef = useRef<HTMLDivElement | null>(null);\n const lastProgressRef = useRef(0);\n\n const cellToSlideRef = useRef<number[]>([]);\n\n const builtOnceRef = useRef(false);\n const slideBuildSubs = useRef(new Set<(nodes: HTMLElement[]) => void>());\n\n const [layoutReady, setLayoutReady] = useState(false);\n\n const [engineReady, setEngineReady] = useState(false);\n\n const overlayCaptionRef = useRef<HTMLDivElement | null>(null);\n const overlayCaptionRootRef = useRef<ReturnType<typeof createRoot> | null>(null);\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 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, children, loop, axis]);\n\n const contentSizeRef = useRef(0)\n const loopLimitRef = useRef<ReturnType<typeof Limit> | null>(null)\n\n type BaseScrollTo = {\n distance: (n: number, snap: boolean) => void\n index: (n: number, direction: number) => void\n }\n\n const scrollSnapsRef = useRef<number[]>([])\n const scrollContentSizeRef = useRef(0)\n\n 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\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\n 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 }\n\n type CounterType = {\n get: () => number\n set: (n: number) => CounterType\n add: (n: number) => CounterType\n clone: () => CounterType\n }\n\n 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 }\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 const layoutRef = useRef<{\n originals: { el: HTMLElement; start: number; end: any; size: any }[];\n cw: number;\n } | null>(null);\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 const cells = useRef<{ element: HTMLElement; index: number }[]>([])\n const sliderWidth = useRef(0)\n const hasPositioned = useRef<boolean>(false)\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 const draggingAttr = 'data-rmg-drag';\n const activePointerIdRef = useRef<number | null>(null);\n const guardsStoreRef = useRef<ReturnType<typeof EventStore> | null>(null);\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 const isHoveringRef = useRef(false);\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 const lastPointerUpTime = useRef<number>(performance.now() - 1000);\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 const autoScrollPauseUntil = useRef(0);\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 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 const [buildKey, setBuildKey] = useState(0);\n const loopStableRef = useRef<boolean | null>(null);\n const [geomKey, setGeomKey] = useState(0);\n const lastGeomSigRef = useRef<string>(\"\");\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 const plyrRefsByIdx = useRef<Record<number, any>>({});\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 const lastCloneSigRef = useRef<string>(\"\");\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 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\n const pointerDownRef = useRef(false)\n const isAnimatingRef = useRef(false)\n const isPointerDown = useRef(false)\n const isScrolling = useRef(false)\n\n const xRef = useRef(0)\n const dragX = useRef(0)\n const previousDragX = useRef(0)\n const dragMoveTime = useRef<Date | null>(null)\n\n const boundsRef = useRef<ScrollBoundsType | null>(null)\n const povRef = useRef<PercentOfViewType | null>(null)\n\n const getSnapTargets: () => number[] = () => (slides.current || []).map((s) => s.target)\n const totalWidth = () => sliderWidth.current || 0\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 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 TWEEN_FACTOR_BASE = 0.2;\n const tweenNodesRef = useRef<HTMLElement[]>([]);\n const parallaxNodesRef = useRef<HTMLElement[]>([]);\n const parallaxSnapsRef = useRef<number[]>([]);\n\n (function collectParallaxForAll() {\n const track = slider.current;\n if (!track) return;\n const W = sliderWidth.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 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 ? (((baseX % W) + W) % W) / W : 0;\n\n nodes.push(layer);\n snaps.push(n);\n }\n\n parallaxNodesRef.current = nodes;\n parallaxSnapsRef.current = snaps;\n })();\n\n function currentTweenFactor() {\n const count = parallaxSnapsRef.current.length || 1;\n return TWEEN_FACTOR_BASE * (count / Math.max(visibleImagesRef.current || 1, 1));\n }\n\n function scrollProgressNorm(): number {\n const track = slider.current;\n const W = sliderWidth.current || 0;\n if (!track) return 0;\n\n if (!wrap) {\n const max = Math.max(0, W - track.clientWidth);\n if (max <= 0) return 0;\n const loc = -(offsetLocationRef.current?.get() ?? 0);\n return Math.min(1, Math.max(0, loc / max));\n }\n\n if (W <= 0) return 0;\n const loc = -(offsetLocationRef.current?.get() ?? 0);\n const world = ((loc % W) + W) % W;\n return world / W;\n }\n\n const tweenParallax = useCallback(() => {\n if (!parallax) 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 nodes[i].style.transform =\n AX.main === 'x' ? `translateX(${translatePct}%)` : `translateY(${translatePct}%)`;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [parallax, wrap]);\n\n useEffect(() => {\n if (!parallax) {\n tweenNodesRef.current.forEach((n) => n && n.removeAttribute('style'));\n }\n }, [parallax]);\n\n useEffect(() => {\n if (!parallax) return;\n if (!(slides.current?.length)) return;\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n tweenParallax()\n })\n })\n }, [parallax, slidesState.length, clonedChildren.length, wrap, tweenParallax, slides, isReady]);\n\n function slideCenterX(logicalIdx: number) {\n const s = slides.current?.[logicalIdx];\n if (!s || !slider.current) return 0;\n const centerOffset = getCenterOffsetForIndex(logicalIdx);\n return s.target - centerOffset;\n }\n\n function getCenters(): number[] {\n const L = slides.current?.length ?? 0;\n const arr: number[] = [];\n for (let i = 0; i < L; i++) arr.push(slideCenterX(i));\n return arr;\n }\n\n function findBoundingPair(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 = sliderWidth.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, rightIdx = 0;\n for (let k = 0; k < nodes.length - 1; k++) {\n const a = nodes[k], b = nodes[k + 1];\n if (loc >= a.x && loc <= b.x) { leftIdx = k; rightIdx = k + 1; break; }\n }\n\n if (loc < nodes[0].x) { leftIdx = 0; rightIdx = 1; }\n if (loc > nodes[nodes.length - 1].x) { leftIdx = nodes.length - 2; rightIdx = nodes.length - 1; }\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\n function applyPairScaleTween() {\n if (!scaleEffect || !slider.current || !slides.current?.length || !scaleAmount) return;\n\n const track = slider.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 = slides.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 const li = Number(idxAttr);\n const s = sByIdx[li] ?? 1;\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 }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => { applyPairScaleTween(); }, [scaleEffect, scaleAmount, clonedChildren.length, slidesState.length]);\n\n const MIN_FADE_OPACITY = 0.5;\n\n function 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\n function applyFadeTween() {\n if (!fadeEffect || !slider.current || !slides.current?.length) return;\n\n const track = slider.current;\n const kids = Array.from(track.children) as HTMLElement[];\n const loc = -(offsetLocationRef.current?.get() ?? 0);\n const centers = getCenters();\n const L = centers.length;\n if (!L) return;\n\n const W = sliderWidth.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, rightIdx = 1;\n for (let k = 0; k < nodes.length - 1; k++) {\n const a = nodes[k], b = nodes[k + 1];\n if (loc >= a.x && loc <= b.x) { leftIdx = k; rightIdx = k + 1; break; }\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) { el.style.opacity = '1'; continue; }\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\n useEffect(() => {\n if (fadeEffect) return;\n const track = slider.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 }, [fadeEffect]);\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 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 const shieldCleanupRef = useRef<null | (() => void)>(null)\n const SHIELD_TIMEOUT = 400\n function addGestureShield() {\n shieldCleanupRef.current?.()\n const shield = document.createElement('div')\n Object.assign(shield.style, {\n position: 'fixed',\n inset: '0',\n zIndex: '10000',\n background: 'transparent',\n touchAction: 'none',\n pointerEvents: 'auto',\n } as CSSStyleDeclaration)\n document.body.appendChild(shield)\n const remove = () => {\n if (shield.parentNode) shield.remove()\n }\n const timer = window.setTimeout(() => {\n remove()\n shieldCleanupRef.current = null\n }, SHIELD_TIMEOUT)\n const teardown = () => {\n window.clearTimeout(timer)\n remove()\n shieldCleanupRef.current = null\n }\n shieldCleanupRef.current = teardown\n return teardown\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 toggleFullscreen(e as React.PointerEvent<HTMLDivElement>, expandableImgRefs.current[parsedImgIndex], finalIndex)\n setSlideIndex(finalIndex)\n }\n\n function toggleFullscreen(\n e: React.PointerEvent<HTMLDivElement>,\n imgRef: React.RefObject<HTMLImageElement | null>,\n index: number\n ) {\n const DURATION_MS = fsIntroDuration;\n const EASING = fsIntroEasing;\n\n const origImg = imgRef.current;\n const container = sliderContainer.current;\n if (!origImg || !container) return;\n\n shieldCleanupRef.current?.();\n shieldCleanupRef.current = addGestureShield();\n\n const vw = document.documentElement.clientWidth;\n const vh = window.innerHeight;\n\n const slideEl =\n (origImg.closest('.rmg__slide') 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\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 const overlay = document.createElement('div');\n overlay.className = styles.fullscreenOverlay;\n overlayDivRef.current = overlay;\n overlay.style.opacity = '0';\n overlay.style.pointerEvents = 'none';\n overlay.style.transition = 'none';\n document.body.appendChild(overlay);\n void overlay.offsetWidth;\n overlay.style.transition = `opacity ${DURATION_MS}ms ${EASING}`;\n\n const effectivePlacement = resolveFsCaptionPlacement(\n fsCaptionPlacement,\n fsCaptionBreakpoint,\n vw\n );\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 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 if (fsThumbContainerRef?.current) {\n const H = fsThumbContainerRef.current.offsetHeight;\n const W = fsThumbContainerRef.current.offsetWidth;\n\n if (fullscreenThumbnails === 'top') {\n contentTop += H;\n } else if (fullscreenThumbnails === 'bottom') {\n contentBottom -= H;\n } else if (fullscreenThumbnails === 'left') {\n contentLeft += W;\n } else if (fullscreenThumbnails === 'right') {\n contentRight -= W;\n }\n }\n\n if (typeof renderFsCaption === 'function') {\n try {\n const overlayCaption = document.createElement('div');\n overlayCaption.className = styles.fsOverlayCaption;\n overlayCaptionRef.current = overlayCaption;\n\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 = fullscreenThumbnails === 'top' ? `${contentTop}px` : '0';\n base.bottom = '0';\n base.left = `${contentRight}px`;\n base.width = `${sideWidth}px`;\n base.height =\n fullscreenThumbnails === 'bottom'\n ? `${contentBottom}px`\n : 'auto';\n } else if (effectivePlacement === 'left') {\n base.top = fullscreenThumbnails === 'top' ? `${contentTop}px` : '0';\n base.bottom = '0';\n base.left = '0';\n base.width = `${sideWidth}px`;\n base.height =\n fullscreenThumbnails === 'bottom'\n ? `${contentBottom}px`\n : '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 {\n const bottomOffset = Math.max(0, vh - contentBottom - topBottomHeight);\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 }\n\n Object.assign(overlayCaption.style, base);\n overlay.appendChild(overlayCaption);\n\n const root = createRoot(overlayCaption);\n overlayCaptionRootRef.current = root;\n\n const item = normalizedItems[index];\n const captionNode = renderFsCaption({ item, index, isZoomed: false });\n root.render(<>{captionNode}</>);\n } catch (err) {\n console.error('[RMG] Failed to render overlay caption', err);\n }\n }\n\n const imageCount = normalizedItems.length;\n const closeEnabled = showFsClose !== false;\n const counterEnabled = showFsCounter !== false;\n const allowFsArrows = showFsArrows !== false && imageCount > 1;\n const isRtl = direction === 'rtl';\n\n const defaultClose = () => {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = styles.closeBtn;\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('width', '35'); svg.setAttribute('height', '35');\n svg.setAttribute('viewBox', '0 0 16 16');\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n path.setAttribute('fill', 'white'); 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 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'\n ? (isRtl ? 'next' : 'prev')\n : (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('points', '4.586,3.414 9.172,8 4.586,12.586 6,14 12,8 6,2');\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 renderFsPrev === \"function\" ? renderFsPrev() : null)\n : (typeof renderFsNext === \"function\" ? renderFsNext() : null);\n\n if (explicit instanceof HTMLElement) return explicit;\n\n if (typeof renderFsArrows === \"function\") {\n const el = renderFsArrows({ 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 function ensureButtonLike(el: HTMLElement) {\n if (el.tagName.toLowerCase() === \"button\") {\n const btn = el as HTMLButtonElement;\n btn.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\n el.addEventListener(\"keydown\", (ev) => {\n if (ev.key === \"Enter\" || ev.key === \" \") {\n ev.preventDefault();\n el.click();\n }\n });\n }\n }\n\n const closeExplicit =\n typeof renderFsClose === \"function\" ? renderFsClose() : null;\n\n const closeBtn = closeEnabled\n ? (closeExplicit instanceof HTMLElement ? closeExplicit : defaultClose())\n : null;\n\n if (closeBtn) {\n ensureButtonLike(closeBtn);\n if (!closeBtn.getAttribute(\"aria-label\")) 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 const ctrExplicit =\n typeof renderFsCounter === \"function\"\n ? renderFsCounter({ index, count: imageCount })\n : null;\n\n const ctr = counterEnabled\n ? (ctrExplicit instanceof HTMLElement ? ctrExplicit : defaultCounter(index, imageCount))\n : null;\n\n const applyControl = (el: HTMLElement | null, cfg?: ControlStyle) => {\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\n if (leftCh) leftCh.classList.add(styles.leftChevron);\n if (rightCh) rightCh.classList.add(styles.rightChevron);\n\n applyControl(closeBtn, fullscreenControls?.close);\n applyControl(leftCh, fullscreenControls?.arrows?.arrow);\n applyControl(rightCh, fullscreenControls?.arrows?.arrow);\n applyControl(leftCh, fullscreenControls?.arrows?.prev);\n applyControl(rightCh, fullscreenControls?.arrows?.next);\n applyControl(ctr, fullscreenControls?.counter);\n\n [leftCh, rightCh].forEach((btn, i) => {\n const action = i === 0 ? leftAction : rightAction;\n if (!btn) return;\n\n btn.dataset.action = action;\n btn.setAttribute(\"aria-label\", action === \"prev\" ? \"Previous\" : \"Next\");\n });\n\n closeButtonRef.current = closeBtn;\n leftChevronRef.current = leftCh;\n rightChevronRef.current = rightCh;\n (counterRef as any).current = ctr;\n\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 const item = normalizedItems[index];\n\n const isVideoSlide =\n (item as any)?.type === 'video' ||\n (item as any)?.kind === 'video' ||\n (item as any)?.mediaType === 'video' ||\n !!(item as any)?.videoSrc ||\n !!(item as any)?.sources?.video ||\n !!(item as any)?.plyrSource ||\n !!(slideEl as any)?.dataset?.rmgVideo;\n\n const forceFadeIntro = fullscreenIntroFade || isVideoSlide;\n\n if (forceFadeIntro) {\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 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 requestAnimationFrame(() => {\n const many = imageCount > 1;\n const addOpen = (el: Element) => el.classList.add(styles.open);\n\n if (closeBtn) {\n addOpen(closeBtn);\n }\n \n if (many) {\n if (allowFsArrows) {\n if (leftCh) {\n addOpen(leftCh);\n }\n if (rightCh) {\n addOpen(rightCh);\n }\n }\n\n if (ctr) {\n addOpen(ctr);\n }\n \n }\n });\n\n return;\n }\n\n const 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 const dup = document.createElement('img');\n dup.src = (origImg as HTMLImageElement).currentSrc || origImg.src;\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 duplicateImgRef.current = dup;\n\n clipper.appendChild(dup);\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 contentRect = new DOMRect(\n contentLeft,\n contentTop,\n Math.max(1, contentRight - contentLeft),\n Math.max(1, contentBottom - contentTop)\n );\n\n const fitsIntrinsic =\n natW <= contentRect.width && natH <= contentRect.height;\n\n const endObjPos = { x: 0.5, y: 0.5 };\n\n const endT = fitsIntrinsic\n ? { cx: contentRect.x + contentRect.width / 2, cy: contentRect.y + contentRect.height / 2, scale: 1 }\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 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(() => {\n startAnimation();\n });\n\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) {\n addOpen(closeBtn);\n }\n \n if (many) {\n if (allowFsArrows) {\n if (leftCh) {\n addOpen(leftCh);\n }\n if (rightCh) {\n addOpen(rightCh);\n }\n }\n\n if (ctr) {\n addOpen(ctr);\n }\n \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) => requestAnimationFrame(() => requestAnimationFrame(r)));\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 shieldCleanupRef.current?.();\n shieldCleanupRef.current = null;\n });\n };\n dup.addEventListener('transitionend', onEnd, { once: true });\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 ?? 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 slideCount = slides.current?.length ?? 0;\n const atFirst = !wrap && selectedIndex.current <= 0;\n const atLast = !wrap && selectedIndex.current >= Math.max(0, slideCount - 1);\n\n const clientMain = slider.current ? ((slider.current as any)[AX.clientKey] as number) : 0;\n\n const arrowsAutoHidden =\n !(imageCount > 1 && slider.current && (sliderWidth.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 dotsAutoHidden = !!(slider.current && (sliderWidth.current <= clientMain));\n const dotsHidden = !showDots || dotsAutoHidden;\n\n const Arrow = ({\n direction,\n size = 32,\n }: {\n direction: \"prev\" | \"next\";\n size?: number;\n }) => {\n if (AX.main === \"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={{\n transform: \"rotate(90deg)\",\n transformOrigin: \"50% 50%\",\n }}\n >\n {direction === \"prev\" ? (\n <path d=\"M15.41 16.59L10.83 12l4.58-4.59L14 6l-6 6 6 6z\" />\n ) : (\n <path d=\"M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6z\" />\n )}\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\" ? (\n <path d=\"M15.41 16.59L10.83 12l4.58-4.59L14 6l-6 6 6 6z\" />\n ) : (\n <path d=\"M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6z\" />\n )}\n </svg>\n );\n };\n\n const 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\n function prevPlacement(): React.CSSProperties {\n return AX.main === \"y\"\n ? { left: \"50%\", top: 10, transform: \"translateX(-50%)\" }\n : { left: 10, top: \"50%\", transform: \"translateY(-50%)\" };\n }\n function nextPlacement(): React.CSSProperties {\n return AX.main === \"y\"\n ? { left: \"50%\", bottom: 10, transform: \"translateX(-50%)\" }\n : { right: 10, top: \"50%\", transform: \"translateY(-50%)\" };\n }\n\n function makeArrowOnClick(\n dir: \"prev\" | \"next\",\n ref: React.RefObject<HTMLDivElement | null>,\n hidden: boolean,\n disabled: boolean\n ) {\n return () => {\n const el = ref.current;\n if (!el || hidden || disabled) return;\n\n createRipple(el);\n requestAnimationFrame(() => {\n if (dir === \"prev\") previous();\n else next();\n });\n };\n }\n\n const prevArrowStylesEffective = {\n ...(arrowStyles ?? {}),\n ...(prevArrowStyles ?? {}),\n };\n\n const nextArrowStylesEffective = {\n ...(arrowStyles ?? {}),\n ...(nextArrowStyles ?? {}),\n };\n\n const prevArrowClassNameEffective = [\n arrowClassName,\n prevArrowClassName,\n ].filter(Boolean).join(\" \");\n\n const nextArrowClassNameEffective = [\n arrowClassName,\n nextArrowClassName,\n ].filter(Boolean).join(\" \");\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\n const placement = dir === \"prev\" ? prevPlacement() : nextPlacement();\n const perDirStyles = dir === \"prev\" ? prevArrowStylesEffective : nextArrowStylesEffective;\n\n return (\n <div\n ref={ref}\n className={`rmgArrow rmgArrow--${dir} ${className ?? \"\"}`}\n onClick={onClick}\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 <Arrow 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\n if (renderArrows) return renderArrows({ ...args, dir });\n\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\", prevButtonRef, arrowsHidden, prevDisabled),\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\", nextButtonRef, arrowsHidden, nextDisabled),\n createRipple,\n className: nextArrowClassNameEffective,\n });\n\n const DefaultDots = ({\n ref, count, activeIndex, hidden, goTo, getDotRef, classNameContainer, classNameDot\n }: DotsRenderArgs) => {\n const pos: React.CSSProperties = 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 const el = (e.currentTarget as HTMLElement);\n createRipple(el);\n }}\n onClick={() => goTo(index)}\n className={`${styles.pagination_dot} ${isActive ? styles.active : styles.inactive} rmgDot ${classNameDot ?? \"\"}`}\n style={{\n ...dotsStyles\n }}\n />\n );\n })}\n </div>\n );\n };\n\n const dotsNode = (renderDots ?? DefaultDots)({\n ref: dotsContainerRef,\n count: slides.current?.length ?? 0,\n activeIndex: selectedIndex.current,\n hidden: dotsHidden,\n goTo: (i) => {\n isScrolling.current = false;\n requestAnimationFrame(() => goToIndex(i));\n },\n getDotRef: (i) => (el) => { dotRefs.current[i] = el; },\n createRipple,\n classNameContainer: dotsContainerClassName,\n classNameDot: dotsClassName,\n });\n\n const 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\n function clamp01(n: number) { return Math.max(0, Math.min(1, n)); }\n\n function setProgressDom(p: number) {\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 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\n function updateProgressInFrame() {\n const track = slider.current;\n const content = sliderWidth.current || 0;\n if (!track) { setProgressDom(0); return; }\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) { setProgressDom(1); return; }\n const loc = -(offsetLocationRef.current?.get() ?? 0);\n setProgressDom(Math.min(1, Math.max(0, loc / max)));\n } else {\n const W = sliderWidth.current || 0;\n if (W <= 0) { setProgressDom(0); return; }\n const world = ((-(offsetLocationRef.current?.get() ?? 0) % W) + W) % W;\n setProgressDom(Math.round(world) === Math.round(W) ? 0 : world / W);\n }\n }\n\n const progressHiddenAuto = false;\n const progressHidden = !(showProgress ?? false) || progressHiddenAuto;\n\n const progressNode = (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 });\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 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\n 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 }\n\n 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 }\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 {prevArrowNode}\n {nextArrowNode}\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\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}","export type IndexMode = 'instant' | 'animated';\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}","/* --- 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.entryMediaGrid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));\n gap: 0.75rem;\n}\n\n.entryMediaGrid img {\n cursor: pointer;\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 * 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});","/* 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 } from '.'\n\ntype WindowType = Window & typeof globalThis\n\nconst mathAbs = Math.abs\nconst clamp = (n: number, lo: number, hi: number) => Math.max(lo, Math.min(hi, n))\n\ntype 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 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\nfunction 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\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\ntype AxisKey = 'x' | 'y'\nfunction 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}\ntype AxisType = ReturnType<typeof Axis>\n\nfunction DragTracker(axis: AxisType, ownerWindow: WindowType) {\n return createDragTracker({\n ownerWindow,\n axis,\n })\n}\n\ntype ResponsiveNumber =\n | number\n | string\n | Record<string | number, number | string>\n | [ResponsiveNumber];\n\ntype BreakpointMap = Record<string, number>;\n\ntype LoadingRenderArgs = { layout: 'thumbnails'; count: number };\ntype IntroRenderArgs = {\n active: boolean;\n containerProps: React.HTMLAttributes<HTMLDivElement>;\n};\n\nexport type ThumbnailPosition = 'top' | 'right' | 'bottom' | 'left'\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\n const isRtl = direction === 'rtl' ? true : false\n const sign = isHorizontal && isRtl ? -1 : 1;\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 const containerRef = useRef<HTMLDivElement | null>(null)\n const trackRef = useRef<HTMLDivElement | null>(null)\n\n const scopeId = useId().replace(/:/g, \"-\");\n\n const channelRef = useRef(indexChannel ?? createIndexChannel())\n\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\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\n const prevButtonRef = useRef<HTMLDivElement>(null)\n const nextButtonRef = useRef<HTMLDivElement>(null)\n\n type Page = {\n startIndex: number\n endIndex: number\n targetScroll: number\n }\n\n const pagesRef = useRef<Page[]>([])\n\n type SnapMode = 'thumb' | 'base'\n const snapModeRef = useRef<SnapMode>('base')\n\n const pointerDownRef = useRef(false)\n const isPointerDown = useRef(false)\n const isClickRef = useRef(true)\n const xRef = useRef(0)\n\n const dragX = useRef(0)\n const previousDragX = useRef(0)\n const dragMoveTime = useRef<Date | null>(null)\n const sliderVelocity = useRef(0)\n\n const selectedIndexRef = useRef<number>(channelRef.current.get().index ?? 0)\n\n const rawKids = Children.toArray(children).filter(isValidElement) as ReactElement<ThumbnailSliderProps>[]\n const count = rawKids.length\n\n const baseOffsetRef = useRef(0);\n\n const downTargetRef = useRef<EventTarget | null>(null)\n\n const [inView, setInView] = useState(false);\n\n const [isReady, setIsReady] = useState(false);\n const readyRafRef = useRef<number | null>(null);\n const readyPaintedRef = useRef(false);\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 const contentSizeRef = useRef(0)\n const loopLimitRef = useRef<ReturnType<typeof Limit> | null>(null)\n\n type BaseScrollTo = {\n distance: (n: number, snap: boolean) => void\n index: (n: number, direction: number) => void\n }\n\n const scrollSnapsRef = useRef<number[]>([])\n const scrollContentSizeRef = useRef(0)\n\n 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\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\n 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 }\n\n type CounterType = {\n get: () => number\n set: (n: number) => CounterType\n add: (n: number) => CounterType\n clone: () => CounterType\n }\n\n 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 }\n\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\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 const visibleThumbsRef = useRef(1)\n\n type ThumbLayoutItem = { el: HTMLElement; start: number; end: number; size: number }\n const layoutRef = useRef<{ originals: ThumbLayoutItem[]; cw: number } | null>(null)\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 const thumbCells = useRef<{ element: HTMLElement; index: number }[]>([]);\n\n const [clonedChildren, setClonedChildren] = useState<ReactElement<any>[]>([]);\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 const lastCloneSigRef = useRef<string>('');\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 type Slide = { target: number; cells: { element: HTMLElement; index: number }[] }\n\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\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 const prevActiveRef = useRef<number>(-1)\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 const draggingAttr = 'data-rmg-drag';\n const activePointerIdRef = useRef<number | null>(null);\n const guardsStoreRef = useRef<ReturnType<typeof EventStore> | null>(null);\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 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\n function normalizeResponsiveToMinWidthRules(\n value: any,\n fallback: number,\n breakpointMap: Record<string, number>\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 = breakpointMap[key] ?? (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 }\n\n function buildScopedSkeletonCountCss(args: {\n scopeId: string;\n responsiveCount: any;\n fallbackCount: number;\n breakpointMap: Record<string, number>;\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 const clamp = (n: number) => Math.max(0, Math.min(maxSlots, Math.floor(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 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 }\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 ?? 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 slideCount = slidesRef.current?.length ?? 0;\n const atFirst = !wrap && selectedIndexRef.current <= 0;\n const atLast = !wrap && selectedIndexRef.current >= Math.max(0, slideCount - 1);\n\n const clientMain = trackRef.current ? (trackRef.current as any)[AX.clientKey] as number : 0;\n\n const arrowsAutoHidden =\n !(count > 1 && trackRef.current && (sliderWidth.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 Arrow = ({ direction, size = 32 }: { direction: 'prev' | 'next'; size?: number }) => {\n if (AX.main === 'y') {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"#000\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden style={{ transform: 'rotate(90deg)', transformOrigin: '50% 50%' }}>\n {direction === 'prev'\n ? <path d=\"M15.41 16.59L10.83 12l4.58-4.59L14 6l-6 6 6 6z\" />\n : <path d=\"M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6z\" />\n }\n </svg>\n );\n }\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"#000\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden>\n {direction === 'prev'\n ? <path d=\"M15.41 16.59L10.83 12l4.58-4.59L14 6l-6 6 6 6z\" />\n : <path d=\"M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6z\" />\n }\n </svg>\n );\n };\n\n const 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\n function prevPlacement(): React.CSSProperties {\n return AX.main === 'y'\n ? { left: '50%', top: 10, transform: 'translateX(-50%)' }\n : { left: 10, top: '50%', transform: 'translateY(-50%)' };\n }\n function nextPlacement(): React.CSSProperties {\n return AX.main === 'y'\n ? { left: '50%', bottom: 10, transform: 'translateX(-50%)' }\n : { right: 10, top: '50%', transform: 'translateY(-50%)' };\n }\n\n function makeArrowOnClick(\n dir: \"prev\" | \"next\",\n ref: React.RefObject<HTMLDivElement | null>,\n hidden: boolean,\n disabled: boolean\n ) {\n return () => {\n const el = ref.current;\n if (!el || hidden || disabled) return;\n\n createRipple(el);\n requestAnimationFrame(() => {\n if (dir === \"prev\") previous();\n else next();\n });\n };\n }\n\n const prevArrowStylesEffective = {\n ...(arrowStyles ?? {}),\n ...(prevArrowStyles ?? {}),\n };\n \n const nextArrowStylesEffective = {\n ...(arrowStyles ?? {}),\n ...(nextArrowStyles ?? {}),\n };\n\n const prevArrowClassNameEffective = [\n arrowClassName,\n prevArrowClassName,\n ].filter(Boolean).join(\" \");\n\n const nextArrowClassNameEffective = [\n arrowClassName,\n nextArrowClassName,\n ].filter(Boolean).join(\" \");\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\n const placement = dir === \"prev\" ? prevPlacement() : nextPlacement();\n const perDirStyles = dir === \"prev\" ? prevArrowStylesEffective : nextArrowStylesEffective;\n\n return (\n <div\n ref={ref}\n className={`rmgArrow rmgArrow--${dir} ${className ?? \"\"}`}\n onClick={onClick}\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 <Arrow 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\n if (renderArrows) return renderArrows({ ...args, dir });\n\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\", prevButtonRef, arrowsHidden, prevDisabled),\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\", nextButtonRef, arrowsHidden, nextDisabled),\n createRipple,\n className: nextArrowClassNameEffective,\n });\n\n const inner = (\n <>\n {prevArrowNode}\n {nextArrowNode}\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, { ThumbnailPosition } from './ThumbnailSlider'\nimport createIndexChannel from './sliderSub'\nimport type { FullscreenSliderSub } from './fullscreenSliderSub'\nimport { BreakpointMap } from '.'\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}","'use client';\n\nimport * as React from 'react';\nimport type { APITypes } from 'plyr-react';\nimport { Plyr } from './shared/LazyPlyr';\nimport { useRmgSlide } from './shared/slideContext';\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\n source?: any;\n sourceBuilder?: RmgPlyrSourceBuilder;\n options?: RmgPlyrOptionsResolver;\n\n className?: string;\n style?: React.CSSProperties;\n\n posterClassName?: string;\n posterStyle?: React.CSSProperties;\n\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\nfunction detectProvider(source: any, srcFallback: string): 'youtube' | 'vimeo' | 'mp4' | 'other' {\n const provider = String(source?.sources?.[0]?.provider ?? '').toLowerCase();\n\n if (provider === 'youtube') return 'youtube';\n if (provider === 'vimeo') return 'vimeo';\n\n const src0 = String(source?.sources?.[0]?.src ?? '').toLowerCase();\n const fb = String(srcFallback ?? '').toLowerCase();\n\n const looksMp4 = src0.endsWith('.mp4') || fb.endsWith('.mp4') || src0.includes('.mp4?') || fb.includes('.mp4?');\n if (looksMp4) return 'mp4';\n\n return 'other';\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, props.src);\n\n 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 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 }\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":["React","useState","useEffect","useRef","createRef","useLayoutEffect","useCallback","useMemo","useImperativeHandle","lastT","mathAbs","index","mathAbs","x","len","direction","y","target","indexCurrent","indexPrevious","body","allowedForce","force","fsScrollTo","next","mode","FullscreenSlider_default","useEffect","jsx","useEffect","imageCount","url","useRef","useEffect","Children","useCallback","useImperativeHandle","forwardRef","React","jsx","jsx","mathAbs","Translate","isMouseEvent","DragTracker","forwardRef","Slider","useRef","useEffect","loop","scopeId","next","Children","i","data","cw","direction","target","indexCurrent","indexPrevious","body","ref","allowedForce","force","len","dirIndex","nextIndex","dirBump","baseScrollTo","loc","useCallback","clamp01","useImperativeHandle","slideCount","atFirst","atLast","insetForRect","item","imageCount","isRtl","axis","inner","parseNumberLike","breakpointMap","clamp","Slider_default","React","jsx","Children","cloneElement","isValidElement","useCallback","useEffect","useId","useMemo","useRef","useState","Fragment","jsx","jsxs","mathAbs","Translate","isMouseEvent","Axis","DragTracker","useMemo","useRef","useId","useState","Children","isValidElement","useEffect","root","loop","next","cloneElement","rawKids","count","container","i","data","cw","scopeId","style","direction","target","indexCurrent","indexPrevious","body","allowedForce","force","len","dirIndex","nextIndex","dirBump","baseScrollTo","parseNumberLike","breakpointMap","fallbackCount","clamp","useCallback","className","useEffect","useMemo","useRef","jsx","useRef","useEffect","useMemo","createRoot","flushSync","Fragment","jsx","jsxs","useState","useRef","useEffect","Axis","isMouseEvent","DragTracker","useMemo","useCallback","useLayoutEffect","React","Gallery","fs","root","internals","createRoot","viewportWidth","cells","clamp","useImperativeHandle","remove","vw","insetForRect","item","startAnimation","flushSync","isRtl","ref","px","nearView","everInView","entries","setEntryRef","decodedReady","Slider_default","container","detectProvider","createRef","isMouse","isClick","FullscreenSlider_default","Gallery_default","jsx"]}
1
+ {"version":3,"sources":["../src/Gallery/index.tsx","../src/Gallery/FullscreenSlider.tsx","../src/Gallery/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/FullscreenModal.tsx","../src/Gallery/shared/transitions/objectPosition.ts","../src/Gallery/shared/transitions/objectFitTransform.ts","../src/Gallery/Slider.tsx","../src/Gallery/Slider.module.css","../src/Gallery/sliderSub.tsx","../src/Gallery/shared/motion/scrollBounds.ts","../src/Gallery/shared/slideContext.tsx","../src/Gallery/index.module.css","../src/Gallery/shared/LazyPlyr.tsx","../src/Gallery/ThumbnailSlider.tsx","../src/Gallery/ThumbnailSlider.module.css","../src/Gallery/fullscreenSliderSub.tsx","../src/Gallery/FullscreenThumbnailSlider.tsx","../src/Gallery/RmgPlyrVideo.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @next/next/no-img-element */\n'use client'\n\nimport React, { useState, useEffect, useRef, createRef, useLayoutEffect, useCallback, useMemo, ReactNode, useImperativeHandle } from \"react\";\nimport FullscreenSlider, { FullscreenSliderHandle } from \"./FullscreenSlider\";\nimport FullscreenModal from \"./FullscreenModal\";\nimport Slider, { SliderHandle } from './Slider';\nimport styles from './index.module.css';\nimport type { APITypes } from \"plyr-react\";\nimport { Plyr } from \"./shared/LazyPlyr\";\nimport ThumbnailSlider from \"./ThumbnailSlider\";\nimport createIndexChannel from \"./sliderSub\";\nimport { createFullscreenSliderSub } from './fullscreenSliderSub';\nimport FullscreenThumbnailSlider from \"./FullscreenThumbnailSlider\";\nimport { createRoot, type Root } from 'react-dom/client';\nimport { flushSync } from 'react-dom';\nimport { parseObjectPosition } from \"./shared/transitions/objectPosition\";\nimport { containTransformForRect, coverTransformForRect, objectFitContentRect } from \"./shared/transitions/objectFitTransform\";\nimport { ScrollBody, ScrollBodyType } from \"./shared/motion/scrollBody\";\nimport { Animations, AnimationsType } from \"./shared/motion/animations\";\nimport { PercentOfView, ScrollBounds, ScrollBoundsType } from \"./shared/motion/scrollBounds\";\nimport { createDragTracker } from \"./shared/input/dragTracker\";\nimport { Vector1D, Vector1DType } from \"./shared/motion/vector1d\";\nimport { Limit } from \"./shared/motion/limit\";\nimport { EventStore } from \"./shared/motion/eventStore\";\n\ntype WindowType = Window & typeof globalThis\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\nfunction Axis() {\n return {\n scroll: 'x' as const,\n cross: 'y' as const,\n direction(n: number) {\n return n\n },\n }\n}\ntype AxisType = ReturnType<typeof Axis>\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: AxisType, ownerWindow: WindowType) {\n return createDragTracker({\n ownerWindow,\n axis,\n })\n}\n\nconst 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\ntype ResponsiveNumber =\n | number\n | string\n | Array<number | string>\n | Record<string, number | string>;\n\nfunction 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\nfunction effectiveViewportWidth(raw: number): number {\n if (raw > 0) return raw;\n\n if (typeof window !== 'undefined' && window.innerWidth > 0) {\n return window.innerWidth;\n }\n\n return 1024;\n}\n\nfunction 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 =\n breakpointMap[key] ??\n (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\ntype MasonryClassNames = {\n root?: string;\n column?: string;\n item?: string;\n};\n\ntype MasonryPlacement = 'balanced' | 'roundRobin';\n\ntype MasonryProps = {\n items: React.ReactNode[];\n masonryColumns?: ResponsiveNumber;\n masonryGap?: ResponsiveNumber;\n masonryPlacement?: MasonryPlacement;\n masonryEstimatedItemHeight?: number;\n masonryClassNames?: MasonryClassNames;\n masonryStyle?: React.CSSProperties;\n masonryAs?: React.ElementType;\n masonryRootRef?: React.Ref<any>;\n breakpoints?: BreakpointMap;\n};\n\nconst 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] = useState(() => {\n if (typeof window === 'undefined') return 0;\n return window.innerWidth;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const onResize = () => setViewportWidth(window.innerWidth);\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, []);\n\n const [heights, setHeights] = useState<number[]>(\n () => items.map(() => masonryEstimatedItemHeight)\n );\n\n 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 = 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 = 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] = useState<number[]>(\n () => items.map((_, i) => (masonryPlacement === 'roundRobin' ? i % Math.max(1, columnCount) : 0))\n );\n\n 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 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 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 = 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[][] = 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 = useRef<HTMLDivElement | null>(null);\n\n 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\ntype DefaultMasonrySkeletonProps = {\n count: number;\n columnCount: number;\n gapPx: number;\n classNames?: MasonryClassNames;\n};\n\nconst 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};\n\nexport 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 type EntryItem = {\n media?: MediaItem[];\n [key: string]: any;\n};\n\ntype EntryMediaRenderArgs = {\n entry: EntryItem;\n entryIndex: number;\n media: MediaItem;\n mediaIndex: number;\n};\n\ntype MediaEntryLink = {\n entryIndex: number;\n mediaIndex: number;\n};\n\ntype EntryOverlayRenderArgs = {\n entry: EntryItem;\n entryIndex: number;\n mediaIndex: number | null;\n link: MediaEntryLink | null;\n opacity: number;\n fsIndex: number;\n style: React.CSSProperties;\n containerProps: React.HTMLAttributes<HTMLDivElement>;\n};\n\ntype EntryMediaLayout = 'slider' | 'grid' | 'masonry';\n\ntype EntryCardRenderArgs = {\n entry: EntryItem;\n entryIndex: number;\n media: React.ReactNode;\n};\n\ntype ThumbnailPosition = 'top' | 'right' | 'bottom' | 'left'\n\nexport type ResponsivePosition =\n | ThumbnailPosition\n | Array<ThumbnailPosition>\n | Record<string, ThumbnailPosition>;\n\nfunction 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\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 =\n breakpointMap[key] ??\n (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\nconst toMediaItems = (urls: string[]): MediaItem[] =>\n urls.map((u) =>\n /\\.(mp4|webm|ogg)$/i.test(u) ? { kind: \"video\", src: u } : { kind: \"image\", src: u }\n );\n\ntype FSImageRender = (args: {\n item: Extract<MediaItem, { kind: \"image\" }>;\n index: number;\n isZoomed: boolean;\n className: string;\n baseStyle: React.CSSProperties;\n}) => React.ReactNode;\n\ntype PlyrSourceBuilder = (item: MediaItem, index: number) => Plyr.SourceInfo;\ntype PlyrOptionsResolver =\n | Plyr.Options\n | ((item: MediaItem, index: number) => Plyr.Options);\n\ntype ResponsiveHeightRule = { query: string; height: string };\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\ntype DotsRenderArgs = {\n ref: React.RefObject<HTMLDivElement | null>;\n count: number;\n activeIndex: number;\n hidden: boolean;\n goTo: (index: number) => void;\n getDotRef: (index: number) => (el: HTMLDivElement | null) => void;\n createRipple: (el: HTMLElement) => void;\n classNameContainer?: string;\n classNameDot?: string;\n};\n\ntype ProgressRenderArgs = {\n ref: React.Ref<HTMLDivElement>;\n innerRef?: React.Ref<HTMLDivElement>;\n hidden: boolean;\n progress: number;\n classNameContainer?: string;\n classNameBar?: string;\n};\n\ntype FsCounterArgs = { index: number; count: number };\n\ntype FsCaptionPlacement = 'top' | 'right' | 'bottom' | 'left';\n\ntype FsCaptionRenderArgs = {\n item: MediaItem;\n index: number;\n isZoomed: boolean;\n};\n\nconst 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};\n\ntype IndexMode = 'instant' | 'animated';\n\nexport type LoadingOptions = {\n isLoading?: boolean;\n skeletonCount?: ResponsiveNumber;\n renderLoading?: (args: {\n layout: 'slider' | 'grid' | 'masonry' | 'entries';\n count: number;\n }) => React.ReactNode;\n};\n\nexport type IntroOptions = {\n renderIntro?: (\n args: {\n active: boolean;\n containerProps: React.HTMLAttributes<HTMLDivElement>;\n },\n content: React.ReactNode\n ) => React.ReactNode;\n staggerMs?: number;\n transform?: number | string;\n durationMs?: number;\n easing?: string;\n staggerLimit?: number;\n};\n\ntype SlideOwner = {\n entryIndex: number;\n};\n\ntype ControlStyle = {\n className?: string;\n style?: React.CSSProperties;\n};\n\ntype LoadingRenderArgs = { layout: 'thumbnails'; count: number };\ntype IntroRenderArgs = {\n active: boolean;\n containerProps: React.HTMLAttributes<HTMLDivElement>;\n};\n\nexport type ThumbnailLoadingOptions = {\n isLoading?: boolean;\n skeletonCount?: ResponsiveNumber;\n renderLoading?: (args: LoadingRenderArgs) => React.ReactNode;\n};\n\nexport type ThumbnailIntroOptions = {\n renderIntro?: (args: IntroRenderArgs, inner: React.ReactNode) => React.ReactNode;\n staggerMs?: number;\n transform?: number;\n durationMs?: number;\n easing?: string;\n};\n\nexport type ThumbnailLayout = {\n width?: number | string;\n height?: number | string;\n}\n\nexport type ThumbnailContainerLayout = {\n width?: number | string;\n height?: number | string;\n}\n\nexport type ThumbnailsLayout = {\n position?: ResponsivePosition;\n gap?: number;\n center?: boolean;\n thumbnail?: ThumbnailLayout;\n container?: ThumbnailContainerLayout;\n}\n\nexport type ThumbnailsElements = {\n container?: ControlStyle;\n thumbnail?: ControlStyle;\n}\n\nexport type ThumbnailsScroll = {\n freeScroll?: boolean;\n groupCells?: boolean;\n loop?: boolean;\n skipSnaps?: boolean;\n centerActiveThumb?: boolean;\n}\n\nexport type ThumbnailsMotion = {\n selectDuration?: number;\n freeScrollDuration?: number;\n friction?: number;\n}\n\nexport type ThumbnailsRipple = {\n enabled?: boolean;\n className?: string;\n}\n\nexport type ThumbnailsControls = {\n enabled?: boolean;\n arrow?: ControlStyle;\n prev?: ControlStyle;\n next?: ControlStyle;\n render?: (args: ArrowRenderArgs & { dir: \"prev\" | \"next\" }) => React.ReactNode;\n renderPrev?: (args: ArrowRenderArgs) => React.ReactNode;\n renderNext?: (args: ArrowRenderArgs) => React.ReactNode;\n ripple?: ThumbnailsRipple;\n}\n\nexport type ThumbnailsTransitions = {\n loading?: ThumbnailLoadingOptions;\n intro?: ThumbnailIntroOptions;\n}\n\nexport type ThumbnailsOptions = {\n children?: React.ReactNode;\n layout?: ThumbnailsLayout;\n elements?: ThumbnailsElements;\n scroll?: ThumbnailsScroll;\n controls?: ThumbnailsControls;\n motion?: ThumbnailsMotion;\n transitions?: ThumbnailsTransitions;\n breakpointMap?: BreakpointMap;\n};\n\nexport const DEFAULT_THUMBNAILS: Required<\n Pick<\n ThumbnailsOptions,\n 'layout' | 'scroll' | 'motion'\n >\n> = {\n layout: {\n position: 'bottom',\n gap: 8,\n center: false,\n },\n\n scroll: {\n freeScroll: true,\n groupCells: false,\n loop: false,\n skipSnaps: false,\n centerActiveThumb: false,\n },\n\n motion: {\n selectDuration: 25,\n freeScrollDuration: 43,\n friction: 0.68,\n },\n};\n\nexport type FullscreenArrows = {\n enabled?: boolean;\n arrow?: ControlStyle;\n prev?: ControlStyle;\n next?: ControlStyle;\n render?: (args: { dir: \"prev\" | \"next\" }) => HTMLElement | null;\n renderPrev?: () => HTMLElement | null;\n renderNext?: () => HTMLElement | null;\n}\n\nexport type FullscreenClose = {\n enabled?: boolean;\n style?: React.CSSProperties;\n className?: string;\n render?: () => React.ReactNode | HTMLElement | null;\n}\n\nexport type FullscreenCounter = {\n enabled?: boolean;\n style?: React.CSSProperties;\n className?: string;\n render?: (args: FsCounterArgs) => React.ReactNode | HTMLElement | null;\n}\n\nexport type FullscreenControlsOptions = {\n close?: FullscreenClose;\n arrows?: FullscreenArrows;\n counter?: FullscreenCounter;\n};\n\nexport type FullscreenCaptionOptions = {\n className?: string;\n style?: React.CSSProperties;\n placement?: FsCaptionPlacement;\n width?: number;\n height?: number;\n breakpoint?: number;\n render?: (args: FsCaptionRenderArgs) => React.ReactNode;\n};\n\nexport type FullscreenEffectsOptions = {\n introDuration?: number;\n introEasing?: string;\n introFade?: boolean;\n slideFade?: boolean;\n slideFadeDuration?: number;\n slideFadeEasing?: string;\n thumbnailsFadeDuration?: number;\n thumbnailsFadeEasing?: string;\n};\n\nexport type FullscreenSliderOptions = {\n duration?: number;\n friction?: number;\n};\n\nexport type FullscreenZoomPanOptions = {\n clickZoomLevel?: number;\n maxZoomLevel?: number;\n panDuration?: number;\n panFriction?: number;\n};\n\nexport type FullscreenVideoOptions = {\n source?: PlyrSourceBuilder;\n options?: PlyrOptionsResolver;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport type FullscreenOptions = {\n enabled?: boolean;\n items?: MediaItem[] | string[];\n renderImage?: FSImageRender;\n video?: FullscreenVideoOptions;\n thumbnails?: ThumbnailsOptions;\n controls?: FullscreenControlsOptions;\n caption?: FullscreenCaptionOptions;\n slider?: FullscreenSliderOptions;\n zoom?: FullscreenZoomPanOptions;\n effects?: FullscreenEffectsOptions;\n};\n\nconst 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};\n\nconst DEFAULT_SLIDER = {\n layout: {\n gap: 20,\n },\n direction: {\n dir: \"ltr\" as const,\n axis: \"x\" as const,\n },\n align: \"start\" as const,\n scroll: {\n groupCells: false,\n skipSnaps: false,\n freeScroll: false,\n loop: false\n },\n lazyLoad: false,\n controls: {\n arrows: {\n enabled: true,\n arrow: {},\n prev: {},\n next: {},\n },\n dots: {\n enabled: true,\n root: {},\n dot: {},\n },\n progress: {\n enabled: false,\n root: {},\n bar: {},\n },\n ripple: {\n enabled: true,\n className: \"\",\n },\n },\n thumbnails: DEFAULT_THUMBNAILS,\n auto: {\n play: {\n enabled: false,\n speedMs: 3000,\n pauseMs: 1000,\n pauseOnHover: true\n },\n scroll: {\n enabled: false,\n speedMs: 3000,\n pauseMs: 1000,\n pauseOnHover: true\n }\n },\n motion: {\n selectDuration: 25,\n freeScrollDuration: 43,\n friction: 0.68\n },\n};\n\nexport type SliderLayout = {\n gap?: number;\n cellsPerSlide?: ResponsiveNumber;\n}\n\nexport type SliderDirection = {\n dir?: 'ltr' | 'rtl';\n axis?: 'x' | 'y';\n}\n\nexport type SliderSize = {\n height?: string;\n heightRules?: ResponsiveHeightRule[];\n initialHeight?: number | string;\n}\n\nexport type SliderElements = {\n viewport?: ControlStyle;\n container?: ControlStyle;\n}\n\nexport type SliderAlign = {\n center: boolean;\n}\n\nexport type SliderScroll = {\n groupCells?: boolean;\n skipSnaps?: boolean;\n freeScroll?: boolean;\n loop?: boolean;\n}\n\nexport type SliderArrows = {\n enabled?: boolean;\n arrow?: ControlStyle;\n prev?: ControlStyle;\n next?: ControlStyle;\n render?: (args: ArrowRenderArgs & { dir: \"prev\" | \"next\" }) => React.ReactNode;\n renderPrev?: (args: ArrowRenderArgs) => React.ReactNode;\n renderNext?: (args: ArrowRenderArgs) => React.ReactNode;\n}\n\nexport type SliderDots = {\n enabled?: boolean;\n root?: ControlStyle;\n dot?: ControlStyle;\n render?: (args: DotsRenderArgs) => React.ReactNode;\n}\n\nexport type SliderProgress = {\n enabled?: boolean;\n root?: ControlStyle;\n bar?: ControlStyle;\n render?: (args: ProgressRenderArgs) => React.ReactNode;\n}\n\nexport type SliderRipple = {\n enabled?: boolean;\n className?: string;\n}\n\nexport type SliderControls = {\n arrows?: SliderArrows;\n dots?: SliderDots;\n progress?: SliderProgress;\n ripple?: SliderRipple;\n}\n\nexport type SliderAutoPlay = {\n enabled?: boolean;\n speedMs?: number;\n pauseMs?: number;\n pauseOnHover?: boolean;\n}\n\nexport type SliderAutoScroll = {\n enabled?: boolean;\n speedMs?: number;\n pauseMs?: number;\n pauseOnHover?: boolean;\n}\n\nexport type SliderAuto = {\n play?: SliderAutoPlay;\n scroll?: SliderAutoScroll;\n}\n\nexport type SliderLoadingOptions = {\n isLoading?: boolean;\n skeletonCount?: ResponsiveNumber;\n renderLoading?: (args: {\n layout: 'slider' | 'grid' | 'masonry' | 'entries';\n count: number; // SSR base count (xs / lowest rule)\n }) => React.ReactNode;\n};\n\nexport type SliderIntroOptions = {\n renderIntro?: (\n args: {\n active: boolean;\n containerProps: React.HTMLAttributes<HTMLDivElement>;\n },\n content: React.ReactNode\n ) => React.ReactNode;\n staggerMs?: number;\n transform?: number | string;\n durationMs?: number;\n easing?: string;\n};\n\nexport type SliderTransitions = {\n loading?: SliderLoadingOptions;\n intro?: SliderIntroOptions;\n}\n\nexport type SliderParallax = {\n enabled?: boolean;\n bleedPct?: string;\n borderRadius?: string;\n sideWidth?: string;\n}\n\nexport type SliderScale = {\n enabled?: boolean;\n amount?: number;\n}\n\nexport type SliderFade = {\n enabled?: boolean;\n}\n\nexport type SliderEffects = {\n parallax?: SliderParallax;\n scale?: SliderScale;\n fade?: SliderFade;\n}\n\nexport type SliderMotion = {\n selectDuration?: number;\n freeScrollDuration?: number;\n friction?: number;\n}\n\nexport type SliderOptions = {\n layout?: SliderLayout;\n direction?: SliderDirection;\n size?: SliderSize;\n align?: 'start' | 'center';\n scroll?: SliderScroll;\n elements?: SliderElements;\n lazyLoad?: boolean;\n controls?: SliderControls;\n thumbnails?: ThumbnailsOptions;\n auto?: SliderAuto;\n transitions?: SliderTransitions;\n motion?: SliderMotion;\n effects?: SliderEffects;\n}\n\ntype GridOptions = {\n columns?: ResponsiveNumber;\n minColumnWidth?: number | string;\n gap?: ResponsiveNumber;\n rootClassName?: string;\n itemClassName?: string;\n loading?: LoadingOptions;\n intro?: IntroOptions;\n};\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 loading?: LoadingOptions;\n intro?: IntroOptions;\n};\n\ntype EntriesOptions = {\n items?: EntryItem[];\n mediaLayout?: EntryMediaLayout;\n render?: {\n card?: (args: EntryCardRenderArgs) => React.ReactNode;\n media?: (args: EntryMediaRenderArgs) => React.ReactNode;\n overlay?: (args: EntryOverlayRenderArgs) => React.ReactNode;\n };\n overlay?: ControlStyle;\n loading?: LoadingOptions;\n intro?: IntroOptions;\n};\n\nexport const DEFAULT_GRID: Required<Pick<GridOptions, \"minColumnWidth\" | \"gap\">> =\n {\n minColumnWidth: 160,\n gap: 8,\n };\n\nexport const DEFAULT_MASONRY: Required<Pick<MasonryOptions, \"placement\">> = {\n placement: \"balanced\",\n};\n\nexport const DEFAULT_ENTRIES: Required<Pick<EntriesOptions, \"mediaLayout\">> = {\n mediaLayout: \"slider\",\n};\n\nexport interface GalleryApi {\n rootNode(): HTMLElement | null;\n containerNode(): HTMLElement | null;\n slideNodes(): HTMLElement[];\n onReady?(cb: (nodes: HTMLElement[]) => void): () => void;\n whenReady?(): Promise<HTMLElement[]>;\n isReady?(): boolean;\n scrollTo(index: number, jump?: boolean): void;\n scrollNext(jump?: boolean): void;\n scrollPrev(jump?: boolean): void;\n canScrollNext(): boolean;\n canScrollPrev(): boolean;\n getIndex(): number;\n selectCell(index: number, jump?: boolean): void;\n scrollProgress(): number;\n cellsInView(): number[];\n append(nodes: React.ReactNode | React.ReactNode[]): number;\n prepend(nodes: React.ReactNode | React.ReactNode[]): number;\n insert(index: number, nodes: React.ReactNode | React.ReactNode[]): number;\n remove(indexOrPredicate: number | ((i: number) => boolean)): number;\n replace(index: number, node: React.ReactNode): void;\n setItems(nodes: React.ReactNode[]): number;\n onIndexChange(cb: (i: number, meta: { mode: IndexMode }) => void): () => void;\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?: ControlStyle;\n container?: ControlStyle;\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\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 entryMapRef = useRef<MediaEntryLink[] | null>(null);\n const entryFlatIndexRef = useRef<number[][] | null>(null);\n const fsOwnersRef = useRef<SlideOwner[]>([]);\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 const [slideIndex, setSlideIndex] = useState(0);\n const isClick = useRef(false);\n const isZoomClick = useRef(false);\n const imageRefs = useRef<React.RefObject<HTMLImageElement | 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, setWindowSize] = useState({ width: 0, height: 0 });\n\n const scaleRef = useRef(1);\n const panRef = useRef({ x: 0, y: 0 });\n const previousZoom = useRef({ x: 0, y: 0 });\n\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\n const fsEntryOverlayMountRef = useRef<HTMLDivElement | null>(null);\n const fsEntryOverlayRootMountRef = useRef<HTMLDivElement | null>(null);\n\n const openTokenRef = useRef(0);\n const enteredTokenRef = useRef(0);\n const enterRafRef = useRef<number>(0);\n\n const pendingUnmountRef = useRef<number>(0);\n\n const setFsEntryOverlayMountRef = useCallback((el: HTMLDivElement | null) => {\n fsEntryOverlayMountRef.current = el;\n\n if (el) return;\n\n cancelSwapJob();\n\n fsEntryOverlayElRef.current = null;\n\n const root = fsEntryOverlayRootRef.current;\n fsEntryOverlayRootRef.current = null;\n\n if (root) {\n if (pendingUnmountRef.current) {\n cancelAnimationFrame(pendingUnmountRef.current);\n pendingUnmountRef.current = 0;\n }\n\n pendingUnmountRef.current = requestAnimationFrame(() => {\n pendingUnmountRef.current = 0;\n try {\n root.unmount();\n } catch {\n }\n });\n }\n }, []);\n\n const fsEntryOverlayRootRef = useRef<Root | null>(null);\n const fsIndexRef = useRef<number>(fsSub.get());\n\n const [fsFadeOpening, setFsFadeOpening] = useState(false);\n\n const entryOpacityRef = useRef<number>(1);\n\n const fsEntryOverlayElRef = useRef<HTMLDivElement | null>(null);\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 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 function getEntryIndexForFsIndex(fsIndex: number): number {\n const map = entryMapRef.current;\n const link = map?.[fsIndex];\n return link?.entryIndex ?? -1;\n }\n\n function renderEntryOverlayForIndex(index: number) {\n const mount = fsEntryOverlayMountRef.current;\n if (!mount) return;\n\n if (fsEntryOverlayRootRef.current && fsEntryOverlayRootMountRef.current !== mount) {\n const oldRoot = fsEntryOverlayRootRef.current;\n fsEntryOverlayRootRef.current = null;\n fsEntryOverlayRootMountRef.current = null;\n\n requestAnimationFrame(() => oldRoot.unmount());\n }\n\n if (!fsEntryOverlayRootRef.current) {\n fsEntryOverlayRootRef.current = createRoot(mount);\n fsEntryOverlayRootMountRef.current = mount;\n }\n\n const root = fsEntryOverlayRootRef.current;\n\n if (typeof entriesObject.render?.overlay !== 'function') {\n root.render(null);\n fsEntryOverlayElRef.current = null;\n return;\n }\n\n const map = entryMapRef.current;\n if (!entriesObject.items?.length || !map?.length) {\n root.render(null);\n fsEntryOverlayElRef.current = null;\n return;\n }\n\n const link = map[index];\n if (!link) {\n root.render(null);\n fsEntryOverlayElRef.current = null;\n return;\n }\n\n const entry = entriesObject.items[link.entryIndex];\n if (!entry) {\n root.render(null);\n fsEntryOverlayElRef.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: '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 ...(entriesObject.overlay?.style ?? {}),\n };\n\n root.render(\n <div\n className={entriesObject.overlay?.className}\n style={wrapperStyle}\n ref={(el) => {\n fsEntryOverlayElRef.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 {entriesObject.render.overlay({\n entry,\n entryIndex: link.entryIndex,\n mediaIndex: link.mediaIndex,\n link,\n opacity: entryOpacityRef.current,\n fsIndex: index,\n style: wrapperStyle,\n containerProps: {\n className: entriesObject.overlay?.className,\n style: wrapperStyle,\n },\n })}\n </div>\n );\n }\n\n function setEntryOverlayOpacity(next: number) {\n const el = fsEntryOverlayElRef.current;\n if (!el) return;\n el.style.setProperty('--rmg-entry-opacity', String(next));\n }\n\n const swapJobRef = useRef<{ t: any; raf: number } | null>(null);\n\n function cancelSwapJob() {\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 function fadeSwapToIndex(nextIndex: number) {\n cancelSwapJob();\n\n setEntryOverlayOpacity(0);\n\n const job = { t: null as any, raf: 0 };\n swapJobRef.current = job;\n\n const FADE_OUT_MS = 120;\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 }, FADE_OUT_MS);\n }\n\n useEffect(() => {\n if (!showFullscreenModal) 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 if (next === fsIndexRef.current && fsEntryOverlayElRef.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\n requestAnimationFrame(() => setEntryOverlayOpacity(1));\n }\n });\n\n return () => {\n cancelSwapJob();\n off();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [showFullscreenModal, fsSub, entries, entriesObject.render?.overlay]);\n\n const changingSlides = useRef(false);\n\n const [isZoomed, setIsZoomed] = useState(false);\n const isZoomedRef = useRef(false);\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 zoomLevel = isZoomed ? 2 : 1;\n\n const currentImage = useRef<HTMLElement | null>(null);\n const aspectRatioRef = useRef(1);\n\n const axisRef = useRef<AxisType | null>(null);\n const pointerDownRef = useRef(false);\n const interactionModeRef = useRef<'idle' | 'drag' | 'wheel' | 'programmatic'>('idle');\n\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\n const [closingModal, setClosingModal] = useState(false);\n \n const sliderApiRef = useRef<SliderHandle>(null);\n\n const entrySliderRefs = useRef<(SliderHandle | null)[]>([]);\n\n const overlayCaptionRef = useRef<HTMLDivElement | null>(null);\n const overlayCaptionRootRef = useRef<ReturnType<typeof createRoot> | null>(null);\n\n const fsThumbContainerRef = useRef<HTMLDivElement | null>(null);\n\n const attachEntrySliderRef = useCallback(\n (entryIndex: number) =>\n (instance: SliderHandle | null) => {\n entrySliderRefs.current[entryIndex] = instance;\n },\n []\n );\n\n const epoch = useOpenEpoch(showFullscreenModal);\n\n const [isReady, setIsReady] = useState(false);\n\n const suppressLoopRef = useRef(false);\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 Cell = { id: string; node: React.ReactNode };\n const asArray = <T,>(x: T | T[]) => (Array.isArray(x) ? x : [x]);\n const idSeqRef = useRef(0);\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 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 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 toggleGridFullscreen(imgEl, fullscreenIndex);\n setSlideIndex(fullscreenIndex);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [fs.enabled, normalizedItems.length, layout, entriesObject.mediaLayout]\n );\n\n const shieldCleanupRef = useRef<null | (() => void)>(null)\n const SHIELD_TIMEOUT = 400\n function addGestureShield() {\n shieldCleanupRef.current?.()\n const shield = document.createElement('div')\n Object.assign(shield.style, {\n position: 'fixed',\n inset: '0',\n zIndex: '10000',\n background: 'transparent',\n touchAction: 'none',\n pointerEvents: 'auto',\n } as CSSStyleDeclaration)\n document.body.appendChild(shield)\n const remove = () => {\n if (shield.parentNode) shield.remove()\n }\n const timer = window.setTimeout(() => {\n remove()\n shieldCleanupRef.current = null\n }, SHIELD_TIMEOUT)\n const teardown = () => {\n window.clearTimeout(timer)\n remove()\n shieldCleanupRef.current = null\n }\n shieldCleanupRef.current = teardown\n return teardown\n }\n\n function toggleGridFullscreen(origImg: HTMLImageElement, index: number) {\n const DURATION_MS = fs.effects.introDuration ?? 300;\n const EASING = fs.effects.introEasing ?? 'cubic-bezier(.4,0,.22,1)';\n const vw = document.documentElement.clientWidth;\n const vh = window.innerHeight;\n\n if (!origImg) return;\n\n shieldCleanupRef.current?.();\n shieldCleanupRef.current = addGestureShield();\n\n const slideEl =\n (origImg.closest('.rmg__grid-item') 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 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\n overlay.style.transition = `opacity ${DURATION_MS}ms ${EASING}`;\n\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 if (fsThumbContainerRef.current) {\n const H = fsThumbContainerRef.current.offsetHeight;\n const W = fsThumbContainerRef.current.offsetWidth;\n\n if (fs.thumbnails?.layout?.position === 'top') {\n contentTop += H;\n } else if (fs.thumbnails?.layout?.position === 'bottom') {\n contentBottom -= H;\n } else if (fs.thumbnails?.layout?.position === 'left') {\n contentLeft += W;\n } else if (fs.thumbnails?.layout?.position === 'right') {\n contentRight -= W;\n }\n }\n\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 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 = fs.thumbnails?.layout?.position === 'top' ? `${contentTop}px` : '0';\n base.bottom = '0';\n base.left = `${contentRight}px`;\n base.width = `${sideWidth}px`;\n base.height =\n fs.thumbnails?.layout?.position === 'bottom' ? `${contentBottom}px` : 'auto';\n } else if (effectivePlacement === 'left') {\n base.top = fs.thumbnails?.layout?.position === 'top' ? `${contentTop}px` : '0';\n base.bottom = '0';\n base.left = '0';\n base.width = `${sideWidth}px`;\n base.height =\n fs.thumbnails?.layout?.position === '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 {\n const bottomOffset = Math.max(0, vh - contentBottom - topBottomHeight);\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 }\n\n Object.assign(overlayCaption.style, base);\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 });\n\n root.render(<>{captionNode}</>);\n } catch (err) {\n console.error('[RMG] Failed to render overlay caption', err);\n }\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 let clipper: HTMLDivElement | null = null;\n let dup: HTMLImageElement | null = null;\n\n const item = normalizedItems[index];\n\n const isVideoSlide =\n (item as any)?.type === 'video' ||\n (item as any)?.kind === 'video' ||\n (item as any)?.mediaType === 'video' ||\n !!(item as any)?.videoSrc ||\n !!(item as any)?.sources?.video ||\n !!(item as any)?.plyrSource ||\n !!(slideEl as any)?.dataset?.rmgVideo;\n\n const forceFadeIntro = fs.effects.introFade || isVideoSlide;\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 document.body.appendChild(clipper);\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 =\n natW <= contentRect.width && natH <= contentRect.height;\n\n const endObjPos = { x: 0.5, y: 0.5 };\n\n const endT = fitsIntrinsic\n ? { cx: contentRect.x + contentRect.width / 2, cy: contentRect.y + contentRect.height / 2, scale: 1 }\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 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 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 shieldCleanupRef.current?.();\n shieldCleanupRef.current = null;\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 } else {\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 shieldCleanupRef.current?.();\n shieldCleanupRef.current = null;\n\n requestAnimationFrame(() => {\n setFsFadeOpening(false);\n });\n\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\n const imageCount = normalizedItems.length;\n const closeEnabled = fs.controls.close?.enabled !== false;\n const counterEnabled = fs.controls.counter?.enabled !== false;\n const allowFsArrows = fs.controls.arrows?.enabled !== false && imageCount > 1;\n const isRtl = sliderObject.direction.dir === 'rtl';\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'\n ? (isRtl ? 'next' : 'prev')\n : (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('points', '4.586,3.414 9.172,8 4.586,12.586 6,14 12,8 6,2');\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\" ? fs.controls?.arrows?.renderPrev() : null)\n : (typeof fs.controls?.arrows?.renderNext === \"function\" ? fs.controls?.arrows?.renderNext() : 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 function ensureButtonLike(el: HTMLElement) {\n if (el.tagName.toLowerCase() === \"button\") {\n (el as HTMLButtonElement).type ||= \"button\";\n return;\n }\n el.setAttribute(\"role\", \"button\");\n el.tabIndex = 0;\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\n const closeExplicit =\n typeof fs.controls?.close?.render === \"function\" ? fs.controls.close.render() : null;\n\n const closeBtn = closeEnabled\n ? (closeExplicit instanceof HTMLElement ? closeExplicit : defaultClose())\n : null;\n\n if (closeBtn) {\n ensureButtonLike(closeBtn);\n if (!closeBtn.getAttribute(\"aria-label\")) 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 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 ? ctrExplicit : defaultCounter(index, imageCount))\n : null;\n\n const applyControl = (el: HTMLElement | null, cfg?: ControlStyle) => {\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\n if (leftCh) leftCh.classList.add(styles.leftChevron);\n if (rightCh) rightCh.classList.add(styles.rightChevron);\n\n applyControl(closeBtn as any, fs.controls?.close);\n applyControl(leftCh, fs.controls?.arrows?.arrow);\n applyControl(rightCh, fs.controls?.arrows?.arrow);\n applyControl(leftCh, fs.controls?.arrows?.prev);\n applyControl(rightCh, fs.controls?.arrows?.next);\n applyControl(ctr as any, fs.controls?.counter);\n\n closeButtonRef.current = closeBtn;\n leftChevronRef.current = leftCh;\n rightChevronRef.current = rightCh;\n (counterRef as any).current = ctr;\n\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 requestAnimationFrame(() => {\n const many = imageCount > 1;\n const addOpen = (el: Element) => el.classList.add(styles.open);\n\n if (closeBtn) {\n addOpen(closeBtn);\n }\n\n if (many) {\n if (allowFsArrows) {\n addOpen(leftCh);\n addOpen(rightCh);\n }\n\n if (ctr) {\n addOpen(ctr);\n }\n \n }\n });\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 function normalizeLoading(src?: LoadingOptions) {\n return {\n isLoading: src?.isLoading,\n skeletonCount: src?.skeletonCount,\n renderLoading: src?.renderLoading,\n };\n }\n\n 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 }\n\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 gridRootRef = useRef<HTMLDivElement | null>(null);\n const masonryRootRef = useRef<HTMLDivElement | null>(null);\n\n const [gridInView, setGridInView] = useState(false);\n const [masonryInView, setMasonryInView] = useState(false);\n\n const [gridMediaReady, setGridMediaReady] = useState(false);\n const [masonryMediaReady, setMasonryMediaReady] = useState(false);\n\n 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 }\n\n 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 (HTMLImageElement | HTMLVideoElement)[];\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 }\n\n const isGridLayout = layout === 'grid';\n const isMasonryLayout = layout === 'masonry';\n\n useInViewOnce(isGridLayout, gridRootRef as any, () => setGridInView(true));\n useInViewOnce(isMasonryLayout, masonryRootRef as any, () => setMasonryInView(true));\n\n useMediaReady(isGridLayout, gridRootRef as any, setGridMediaReady);\n useMediaReady(isMasonryLayout, masonryRootRef as any, setMasonryMediaReady);\n\n const gridIsLoading =\n isGridLayout ? (gridLoading.isLoading ?? !gridMediaReady) : false;\n\n const masonryIsLoading =\n isMasonryLayout ? (masonryLoading.isLoading ?? !masonryMediaReady) : false;\n\n const gridIntroActive = isGridLayout && !gridIsLoading && gridInView;\n const masonryIntroActive = isMasonryLayout && !masonryIsLoading && masonryInView;\n\n const gridSkeletonCount = cellsState.length\n\n 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 }\n\n const viewportWidth = useViewportWidth();\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 minWidth =\n typeof gridObject.minColumnWidth === 'number'\n ? `${gridObject.minColumnWidth}px`\n : gridObject.minColumnWidth ?? '160px';\n\n const gapVal = React.useMemo(() => {\n if (typeof gridObject.gap === 'string' && Number.isNaN(parseFloat(gridObject.gap))) {\n return gridObject.gap;\n }\n\n const raw = resolveNumberFromResponsive(\n gridObject.gap,\n typeof gridObject.gap === 'number' ? gridObject.gap : 8,\n viewportWidth,\n effectiveBreakpoints\n );\n\n const px = Math.max(0, raw | 0);\n return `${px}px`;\n }, [gridObject.gap, viewportWidth, effectiveBreakpoints]);\n\n const resolvedGridColumnCount = React.useMemo(() => {\n if (gridObject.columns == null) return undefined;\n\n const raw = resolveNumberFromResponsive(\n gridObject.columns,\n 1,\n viewportWidth,\n effectiveBreakpoints\n );\n const n = Math.max(1, raw | 0);\n return n;\n }, [gridObject.columns, viewportWidth, effectiveBreakpoints]);\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 const defaultGridSkeleton = (\n <div className={styles.gridSkeletonOverlay}>\n <div\n className={[\n styles.gridSkeletonGrid,\n gridObject.rootClassName || '',\n ]\n .filter(Boolean)\n .join(' ')}\n style={gridStyle}\n >\n {Array.from({ length: gridSkeletonCount }).map((_, i) => (\n <div\n key={`rmg-grid-skel-${i}`}\n className={styles.gridSkeletonItem}\n />\n ))}\n </div>\n </div>\n );\n\n const DEFAULT_MASONRY_COLUMNS = 4;\n const DEFAULT_MASONRY_GAP_PX = 8;\n\n const masonryColumnCount = resolveNumberFromResponsive(\n masonryObject.columns,\n DEFAULT_MASONRY_COLUMNS,\n viewportWidth,\n effectiveBreakpoints\n );\n\n const masonryGapPx = Math.max(\n 0,\n parseNumberLike(\n resolveNumberFromResponsive(\n masonryObject.gap,\n DEFAULT_MASONRY_GAP_PX,\n viewportWidth,\n effectiveBreakpoints\n ) as any,\n DEFAULT_MASONRY_GAP_PX\n )\n );\n\n const defaultMasonrySkeleton = (\n <div className={styles.gridSkeletonOverlay}>\n <DefaultMasonrySkeleton\n count={gridSkeletonCount}\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 skeletonCount = cellsState.length;\n\n const gridLoadingNode =\n isGridLayout && gridIsLoading\n ? (gridLoading.renderLoading\n ? gridLoading.renderLoading({ layout: 'grid', count: skeletonCount })\n : defaultGridSkeleton)\n : null;\n\n const masonryLoadingNode =\n isMasonryLayout && masonryIsLoading\n ? (masonryLoading.renderLoading\n ? masonryLoading.renderLoading({ layout: 'masonry', count: skeletonCount })\n : defaultMasonrySkeleton)\n : null;\n\n function buildGridLikeChildren(opts: {\n itemClassName?: string;\n itemBaseClass: string;\n itemBaseStyleClass: string;\n }) {\n return cellsState.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 common = {\n key: cell.id,\n 'data-rmg-idx': index, // (rename if you want, but it’s fine)\n onClick: (e: React.MouseEvent<HTMLElement>) => {\n e.preventDefault();\n if (!fs.enabled) return;\n openFullscreenAt(index);\n },\n style: introStyle,\n className: [\n opts.itemBaseClass,\n opts.itemBaseStyleClass,\n opts.itemClassName || '',\n ].filter(Boolean).join(' '),\n };\n\n if (!React.isValidElement(original)) {\n return (\n <button type=\"button\" {...common}>\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 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 (!fs.enabled) 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: [\n opts.itemBaseClass,\n opts.itemBaseStyleClass,\n origProps.className || '',\n opts.itemClassName || '',\n ].filter(Boolean).join(' '),\n style: {\n ...(origProps.style || {}),\n ...introStyle,\n },\n });\n });\n }\n\n const gridChildren = useMemo(\n () =>\n buildGridLikeChildren({\n itemBaseClass: 'rmg__grid-item',\n itemBaseStyleClass: styles.gridItem,\n itemClassName: gridObject.itemClassName,\n }),\n [cellsState, fs.enabled, gridObject.itemClassName]\n );\n\n const masonryChildren = useMemo(\n () =>\n buildGridLikeChildren({\n itemBaseClass: 'rmg__masonry-item',\n itemBaseStyleClass: '',\n itemClassName: '',\n }),\n [cellsState, fs.enabled, masonryObject.classNames?.item]\n );\n\n const gridContainerProps: React.HTMLAttributes<HTMLDivElement> = {\n className: [\n styles.gridRoot,\n styles.introContainer,\n gridIntroActive ? styles.introActive : '',\n gridObject.rootClassName || '',\n ].filter(Boolean).join(' '),\n style: {\n ...gridStyle,\n ['--rmg-intro-stagger' as any]: `${gridIntro.staggerMs}ms`,\n ['--rmg-intro-transform' as any]: gridIntro.transform,\n ['--rmg-intro-duration' as any]: `${gridIntro.durationMs}ms`,\n ['--rmg-intro-easing' as any]: gridIntro.easing,\n },\n 'aria-busy': gridIsLoading ? true : undefined,\n };\n\n const gridInner = (\n <div ref={gridRootRef} {...gridContainerProps}>\n {gridChildren}\n </div>\n );\n\n const gridIntroWrapped = gridIntro.renderIntro\n ? gridIntro.renderIntro(\n { active: gridIntroActive, containerProps: gridContainerProps },\n gridInner\n )\n : gridInner;\n\n const masonryRootClassName = [\n styles.masonryRoot,\n styles.introContainer,\n masonryIntroActive ? styles.introActive : '',\n masonryObject.classNames?.root || '',\n ].filter(Boolean).join(' ');\n\n type UseEntryInView2Opts = IntersectionObserverInit & {\n nearMargin?: string;\n viewMargin?: string;\n };\n\n function useEntryInView2(len: number, opts?: UseEntryInView2Opts) {\n const nearMargin = opts?.nearMargin ?? '700px 0px';\n const viewMargin = opts?.viewMargin ?? '0px 0px';\n const threshold = opts?.threshold ?? 0.01;\n const root = opts?.root ?? null;\n\n const [nearView, setNearView] = useState<boolean[]>(\n () => Array.from({ length: len }, () => false)\n );\n const [everInView, setEverInView] = useState<boolean[]>(\n () => Array.from({ length: len }, () => false)\n );\n\n const nearIORef = useRef<IntersectionObserver | null>(null);\n const viewIORef = useRef<IntersectionObserver | null>(null);\n const nodeToIndexRef = useRef(new Map<Element, number>());\n\n useEffect(() => {\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 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 }\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 }\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, threshold, len]);\n\n const setEntryRef = useCallback(\n (index: number) => (node: HTMLElement | null) => {\n if (!node) return;\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 }\n\n type EntryLike = {\n key?: string;\n id?: string;\n media?: Array<{ kind?: string; src?: string }>;\n };\n\n function 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\n function 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\n 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 = useMemo(() => safeEntriesKey(entries), [entries]);\n\n const entryImageUrls = 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] = useState<boolean[]>([]);\n const startedRef = useRef<boolean[]>([]);\n const controllersRef = useRef<Map<number, AbortController>>(new Map());\n const initKeyRef = useRef<string>('');\n\n 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 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\n return () => {\n };\n }, [enabled, entries, entryImageUrls, inView, decodedReady, timeoutMs]);\n\n useEffect(() => {\n return () => {\n for (const [, ac] of controllersRef.current) ac.abort();\n controllersRef.current.clear();\n };\n }, []);\n\n return { decodedReady, entriesKey };\n }\n\n const isEntriesLayout = layout === 'entries';\n\n const { nearView, everInView, setEntryRef } = useEntryInView2(entriesObject.items?.length ?? 0, {\n nearMargin: '700px 0px',\n viewMargin: '0px 0px',\n threshold: 0.01,\n });\n\n const { decodedReady } = useEntryDecodeReady(\n isEntriesLayout,\n entries as any,\n nearView,\n { timeoutMs: 8000 }\n );\n\n const normalizedEntriesLoading = useMemo(() => {\n const src = entriesObject.loading ?? {};\n return {\n isLoading: src.isLoading,\n skeletonCount: src.skeletonCount,\n renderLoading: src.renderLoading,\n };\n }, [entriesObject.loading]);\n\n const normalizedEntriesIntro = useMemo(() => {\n const src = entriesObject.intro ?? {};\n return {\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 }, [entriesObject.intro]);\n\n const showGlobalEntriesLoading =\n isEntriesLayout &&\n (normalizedEntriesLoading.isLoading === true || !entries || entriesObject.items?.length === 0);\n\n function renderEntrySkeleton(key: React.Key) {\n return (\n <article key={key} 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 }\n\n const entryRows = !entriesObject.items?.length\n ? null\n : entriesObject.items?.map((entry, entryIndex) => {\n const isNear = nearView[entryIndex] ?? false;\n const hasEverBeenInView = everInView[entryIndex] ?? false;\n const isDecoded = decodedReady[entryIndex] ?? false;\n\n const shouldMountContent = hasEverBeenInView || isNear;\n\n const reveal = hasEverBeenInView && isDecoded;\n\n let contentNode: React.ReactNode = null;\n\n const showSkeleton = !reveal;\n\n if (shouldMountContent) {\n const mediaArray = entry.media ?? [];\n const flatIndexByEntry = entryFlatIndexRef.current;\n\n const renderEntryCardFn =\n typeof entriesObject.render?.card === 'function' ? entriesObject.render?.card : undefined;\n\n const mediaNodes = mediaArray.map((media, mediaIndex) => {\n const globalIndex =\n flatIndexByEntry?.[entryIndex]?.[mediaIndex] ?? 0;\n\n const rawContent =\n typeof entriesObject.render?.media === 'function'\n ? entriesObject.render?.media({\n entry,\n entryIndex,\n media,\n mediaIndex,\n })\n : nodeFromMedia(media);\n\n const handleClick: React.MouseEventHandler<HTMLElement> = (e) => {\n e.preventDefault();\n if (!fs.enabled) return;\n\n if (entriesObject.mediaLayout === 'slider') {\n if (!isClick.current) {\n return;\n }\n }\n\n const origin = e.currentTarget as HTMLElement;\n openFullscreenAt(globalIndex, origin);\n };\n\n const refCallback: React.RefCallback<HTMLElement> = (node) => {\n if (!node) {\n expandableImgRefs.current[globalIndex] = null;\n return;\n }\n\n let img: HTMLImageElement | null = null;\n if (node.tagName === 'IMG') img = node as HTMLImageElement;\n else img = node.querySelector('img');\n\n expandableImgRefs.current[globalIndex] = img;\n };\n\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\n | React.Ref<HTMLElement>\n | undefined;\n\n const mergedRef: React.RefCallback<HTMLElement> = (node) => {\n if (typeof origRef === 'function') {\n origRef(node);\n } else if (origRef && typeof origRef === 'object') {\n (origRef as any).current = node;\n }\n refCallback(node);\n };\n\n const mergedOnClick: React.MouseEventHandler<HTMLElement> = (e) => {\n if (typeof origOnClick === 'function') {\n origOnClick(e);\n }\n if (e.defaultPrevented) return;\n handleClick(e);\n };\n\n return React.cloneElement(original, {\n key: `${entryIndex}-${mediaIndex}`,\n ref: mergedRef,\n onClick: mergedOnClick,\n });\n }\n\n return (\n <button\n key={`${entryIndex}-${mediaIndex}`}\n type=\"button\"\n className={styles.entryMediaButton}\n onClick={handleClick}\n ref={refCallback}\n >\n {rawContent as any}\n </button>\n );\n });\n const mediaContainer =\n entriesObject.mediaLayout === 'masonry' ? (\n <div className={styles.entryMasonry}>\n <Masonry\n items={mediaNodes}\n masonryColumns={masonryObject.columns}\n masonryGap={masonryObject.gap}\n masonryPlacement={masonryObject.placement}\n masonryEstimatedItemHeight={masonryObject.estimatedItemHeight}\n masonryClassNames={masonryObject.classNames}\n masonryAs={masonryObject.as ?? 'div'}\n breakpoints={effectiveBreakpoints}\n />\n </div>\n ) : entriesObject.mediaLayout === 'slider' ? (\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 ) : entriesObject.mediaLayout === 'grid' ? (\n <div className={styles.entryMediaGrid} style={undefined}>\n {mediaNodes}\n </div>\n ) : null;\n\n contentNode = renderEntryCardFn\n ? renderEntryCardFn({ entry, entryIndex, media: mediaContainer })\n : null;\n }\n\n const limit = normalizedEntriesIntro.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 {renderEntrySkeleton(`skel-${entryIndex}`)}\n </div>\n\n {shouldMountContent ? (\n <div className={styles.entryInner}>\n {contentNode}\n </div>\n ) : null}\n </div>\n );\n });\n\n const entryListContainerProps: React.HTMLAttributes<HTMLDivElement> = {\n className: [styles.entryList].filter(Boolean).join(' '),\n style: {\n ['--rmg-entry-intro-stagger' as any]: `${normalizedEntriesIntro.staggerMs}ms`,\n ['--rmg-entry-intro-transform' as any]: normalizedEntriesIntro.transform,\n ['--rmg-entry-intro-duration' as any]: `${normalizedEntriesIntro.durationMs}ms`,\n ['--rmg-entry-intro-easing' as any]: normalizedEntriesIntro.easing,\n },\n 'aria-busy': showGlobalEntriesLoading ? true : undefined,\n };\n\n const isRtl = sliderObject.direction.dir === 'rtl' ? true : false\n const sign = isRtl ? -1 : 1;\n\n 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\n 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\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 setEntryOverlayOpacity(0);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [closingModal])\n\n const bodyX = useRef<ScrollBodyType | null>(null);\n const bodyY = useRef<ScrollBodyType | null>(null);\n\n function boundsForCurrent(\n scale: number,\n imgW: number,\n imgH: number,\n viewW?: number,\n viewH?: number\n ) {\n const rect = currentImage.current?.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 }\n\n const boundsX = useRef<ScrollBoundsType | null>(null);\n const boundsY = useRef<ScrollBoundsType | null>(null);\n\n const isAnimatingRef = useRef(false);\n const animRef = useRef<AnimationsType | null>(null);\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 type PlyrProp = { source: Plyr.SourceInfo; options: Plyr.Options } | null;\n const isVideoItem = (m: MediaItem) => m.kind === \"video\";\n\n 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\n 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 =\n typeof options === \"function\" ? options(item, index) : (options ?? base);\n return { ...base, ...resolved };\n };\n }\n\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\n const wrappedPlyrProps = useMemo(() => {\n const getSource = (item: MediaItem, index: number) =>\n (fs.video?.source ?? defaultPlyrSource)(item, index);\n\n const getOptions = mergePlyrOptions(defaultPlyrOptions, fs.video?.options);\n return buildPlyrProps(wrappedItems, getSource, getOptions);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [wrappedItems, fs.video?.source, fs.video?.options]);\n\n const singlePlyrProps = useMemo(() => {\n const getSource = (item: MediaItem) =>\n ({\n type: \"video\",\n sources: [{ src: (item as any).src, type: \"video/mp4\" }],\n }) as Plyr.SourceInfo;\n\n const getOptions = () =>\n ({\n controls: [\"play-large\", \"play\", \"progress\", \"current-time\", \"volume\", \"fullscreen\"],\n ratio: \"16:9\",\n fullscreen: { enabled: true, fallback: true, iosNative: true },\n }) as Plyr.Options;\n\n return buildPlyrProps(normalizedItems, getSource, getOptions);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [normalizedItems]);\n\n 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 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 }\n\n function detectProvider(source: any): 'youtube' | 'vimeo' | 'mp4' | 'other' {\n const provider = String(source?.sources?.[0]?.provider ?? '').toLowerCase();\n\n if (provider === 'youtube') return 'youtube';\n if (provider === 'vimeo') return 'vimeo';\n\n const src0 = String(source?.sources?.[0]?.src ?? '').toLowerCase();\n\n const looksMp4 = src0.endsWith('.mp4') || src0.includes('.mp4?');\n if (looksMp4) return 'mp4';\n\n return 'other';\n }\n\n function renderFullscreenSlides(opts: {\n items: MediaItem[];\n plyrList: PlyrProp[];\n getTransform: (index: number) => string;\n playerRefs: React.RefObject<(APITypes | null)[]>;\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 const {\n items,\n plyrList,\n getTransform,\n playerRefs,\n renderCaption,\n captionClassName,\n captionStyle,\n fsCaptionPlacement,\n fsCaptionWidth,\n fsCaptionHeight,\n fsCaptionBreakpoint,\n } = opts;\n\n const vw =\n typeof window !== 'undefined'\n ? document.documentElement.clientWidth\n : 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 =\n 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\n ? renderCaption({ item, index, isZoomed })\n : null;\n\n const provider = 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 <div\n ref={imageRef}\n onPointerDown={(e) => handlePanPointerStart(e, imageRef)}\n onClickCapture={(e) => {\n if (suppressNextClickRef.current) {\n suppressNextClickRef.current = false;\n e.preventDefault();\n e.stopPropagation();\n }\n }}\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, ...fs.video?.style }}\n className={[\n 'rmg__player',\n fs.video?.className,\n ].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 ) : fs.renderImage ? (\n fs.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 }\n\n function wrappedTransform(index: number) {\n const length = wrappedItems.length;\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) * sign) * 100}%)`;\n }\n\n const singleTransform = () => `translateX(0%)`;\n\n const wrappedFullscreenImages = renderFullscreenSlides({\n items: wrappedItems,\n plyrList: wrappedPlyrProps,\n getTransform: wrappedTransform,\n playerRefs: wrappedModePlyrRefs,\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 });\n\n const oneFullscreenImage = renderFullscreenSlides({\n items: normalizedItems,\n plyrList: singlePlyrProps,\n getTransform: singleTransform,\n playerRefs: singleModePlyrRefs,\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 });\n\n 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 }\n\n function resetZoom() {\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 // reset vectors...\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 fs.zoom.panDuration, fs.zoom.panFriction\n ).sync();\n bodyY.current = ScrollBody(\n locY.current!, offY.current!, prevY.current!, tgtY.current!,\n fs.zoom.panDuration, fs.zoom.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, fs.zoom.panDuration);\n boundsY.current = ScrollBounds(limY2, offY.current!, tgtY.current!, bodyY.current!, povY, fs.zoom.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 }\n\n function onForceResetZoom() {\n setScale(1);\n previousZoom.current.x = 0;\n previousZoom.current.y = 0;\n panRef.current = { x: 0, y: 0 };\n scaleRef.current = 1;\n\n const commonStyles = {\n transform: 'translate(0, 0) scale(1)',\n transition: 'transform 0.2s cubic-bezier(.4,0,.22,1)',\n };\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\n if (isVideoSlideElement(child)) return;\n\n const match = commonStyles.transition.match(/([\\d.]+)s/);\n const durationMs = match ? parseFloat(match[1]) * 1000 : 300;\n\n element.style.transition = commonStyles.transition;\n if (child) child.style.transition = commonStyles.transition;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n (element as any).offsetWidth;\n\n element.style.transform = commonStyles.transform;\n if (child) child.style.transform = commonStyles.transform;\n\n setTimeout(() => {\n element.style.transition = '';\n if (child) child.style.transition = '';\n }, durationMs + 50);\n });\n\n resetZoom();\n }\n\n function resetAllZoomDom() {\n if (scaleRef.current === 1) return;\n\n changingSlides.current = true;\n setScale(1);\n previousZoom.current.x = 0;\n previousZoom.current.y = 0;\n panRef.current = { x: 0, y: 0 };\n scaleRef.current = 1;\n suppressLoopRef.current = false;\n\n const commonStyles = {\n transform: 'translate(0, 0) scale(1)',\n transition: 'transform 0.2s cubic-bezier(.4,0,.22,1)',\n };\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\n if (isVideoSlideElement(child)) return;\n\n const match = commonStyles.transition.match(/([\\d.]+)s/);\n const durationMs = match ? parseFloat(match[1]) * 1000 : 300;\n\n element.style.transition = commonStyles.transition;\n if (child) child.style.transition = commonStyles.transition;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n (element as any).offsetWidth;\n\n element.style.transform = commonStyles.transform;\n if (child) child.style.transform = commonStyles.transform;\n\n setTimeout(() => {\n element.style.transition = '';\n if (child) child.style.transition = '';\n }, durationMs + 50);\n });\n\n resetZoom?.();\n\n setTimeout(() => {\n changingSlides.current = false;\n }, 200);\n }\n\n useEffect(() => {\n if (!normalizedItems.length) return;\n const first = normalizedItems[0];\n const last = normalizedItems[normalizedItems.length - 1];\n setWrappedItems([last, ...normalizedItems, first]);\n }, [normalizedItems]);\n\n useEffect(() => {\n if (!wrappedItems.length) return;\n imageRefs.current = wrappedItems.map(() => createRef());\n }, [wrappedItems]);\n\n useEffect(() => {\n const onResize = () => setWindowSize({ width: document.documentElement.clientWidth, height: window.innerHeight });\n window.addEventListener(\"resize\", onResize);\n onResize();\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n function getImageAspectRatio(image: HTMLDivElement | null) {\n if (!image) return;\n const imgElement = image.children[0] as HTMLImageElement | undefined;\n if (imgElement && imgElement.naturalWidth && imgElement.naturalHeight) {\n aspectRatioRef.current = imgElement.naturalWidth / imgElement.naturalHeight;\n }\n }\n\n 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\n const rebuildPanBodies = useCallback(() => {\n if (!currentImage.current) return;\n\n const container = currentImage.current;\n const img = container.children[0] as HTMLImageElement | undefined;\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 locX.current = Vector1D(x); prevX.current = Vector1D(x);\n offX.current = Vector1D(x); tgtX.current = Vector1D(x);\n\n locY.current = Vector1D(y); prevY.current = Vector1D(y);\n offY.current = Vector1D(y); tgtY.current = Vector1D(y);\n\n bodyX.current = ScrollBody(\n locX.current, offX.current, prevX.current, tgtX.current,\n fs.zoom.panDuration, fs.zoom.panFriction\n ).sync();\n bodyY.current = ScrollBody(\n locY.current, offY.current, prevY.current, tgtY.current,\n fs.zoom.panDuration, fs.zoom.panFriction\n ).sync();\n\n const { x: limX, y: limY, povX, povY } =\n boundsForCurrent(scaleRef.current, baseW, baseH, containerW, containerH);\n\n boundsX.current = ScrollBounds(limX, offX.current, tgtX.current, bodyX.current, povX, fs.zoom.panDuration);\n boundsY.current = ScrollBounds(limY, offY.current, tgtY.current, bodyY.current, povY, fs.zoom.panDuration);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fs.zoom.panDuration, fs.zoom.panFriction]);\n\n useEffect(() => {\n const anim = Animations(document, window as WindowType,\n () => {\n boundsX.current?.constrain(pointerDownRef.current)\n boundsY.current?.constrain(pointerDownRef.current)\n bodyX.current?.seek()\n bodyY.current?.seek()\n },\n (alpha) => {\n if (!locX.current || !locY.current || !prevX.current || !prevY.current) return\n const lx = locX.current.get() * alpha + prevX.current.get() * (1 - alpha)\n const ly = locY.current.get() * alpha + prevY.current.get() * (1 - alpha)\n offX.current?.set(lx)\n offY.current?.set(ly)\n renderPan(lx, ly)\n\n const settled = !!bodyX.current?.settled() && !!bodyY.current?.settled()\n const within =\n !(boundsX.current?.reached()) &&\n !(boundsY.current?.reached())\n const stop = settled && within && !pointerDownRef.current\n if (stop) animRef.current?.stop()\n }\n )\n animRef.current = anim\n anim.init()\n return () => { anim.destroy(); animRef.current = null }\n }, [])\n\n const freeBoost = { mouse: 400, touch: 400 }\n\n const trackerRef = useRef<ReturnType<typeof DragTracker> | null>(null)\n const dragStore = useRef(EventStore()).current\n const moveStore = useRef(EventStore()).current\n\n const forceBoost = (rawForce: number, isMouse: boolean) =>\n rawForce * (isMouse ? freeBoost.mouse : freeBoost.touch)\n\n function handlePanPointerStart(\n e: React.PointerEvent<HTMLDivElement> | React.TouchEvent<HTMLDivElement>,\n imageRef: React.RefObject<HTMLImageElement | null>\n ) {\n if (!isZoomed) return\n if (!imageRef.current) return\n currentImage.current = imageRef.current\n getImageAspectRatio(imageRef.current)\n\n rebuildPanBodies()\n\n const ownerWin = window as WindowType\n const axis = 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 pointerDownRef.current = true\n interactionModeRef.current = 'drag'\n\n if (tgtX.current && locX.current) tgtX.current.set(locX.current.get())\n if (tgtY.current && locY.current) tgtY.current.set(locY.current.get())\n\n const CLICK_MOVE_TOL = 3\n const CLICK_TIME_TOL_MS = 220\n const FLICK_FORCE_TOL = 0.075\n let totalAbsDx = 0\n let totalAbsDy = 0\n let canceledByMultiTouch = false\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 return onUp(evt as any)\n }\n\n const moved = trackerRef.current!.pointerMove(evt as any)\n\n totalAbsDx += Math.abs(moved.dx)\n totalAbsDy += Math.abs(moved.dy)\n\n bodyX.current?.useFriction(0.3).useDuration(0.75)\n bodyY.current?.useFriction(0.3).useDuration(0.75)\n\n tgtX.current?.add(moved.dx)\n tgtY.current?.add(moved.dy)\n\n 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 pointerDownRef.current = false\n interactionModeRef.current = 'idle'\n moveStore.clear()\n\n if (isClick) {\n const imgEl = (currentImage.current?.querySelector('img') ??\n currentImage.current?.children[0]) as HTMLImageElement | null\n if (imgEl) {\n const upAny = evt as any\n const cx = upAny?.touches?.[0]?.clientX ?? upAny?.changedTouches?.[0]?.clientX ?? upAny?.clientX ?? downNativeEvt?.clientX\n const cy = upAny?.touches?.[0]?.clientY ?? upAny?.changedTouches?.[0]?.clientY ?? upAny?.clientY ?? 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 handleZoomToggle(fakeReactEvt, currentImage as any)\n\n suppressNextClickRef.current = true;\n const anyEvt: any = evt;\n anyEvt?.preventDefault?.();\n anyEvt?.stopPropagation?.();\n animRef.current?.stop()\n return;\n }\n 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 = fs.zoom.panDuration - 10 * factorX\n const speedY = fs.zoom.panDuration - 10 * factorY\n const frictionX = fs.zoom.panFriction + factorX / 50\n const frictionY = fs.zoom.panFriction + factorY / 50\n\n bodyX.current?.useDuration(speedX).useFriction(frictionX)\n bodyY.current?.useDuration(speedY).useFriction(frictionY)\n\n tgtX.current?.add(fx)\n tgtY.current?.add(fy)\n\n animRef.current?.start()\n }\n\n const isMouse = (e as any).nativeEvent instanceof MouseEvent\n const node: any = isMouse ? document : window\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\n const isPinching = useRef(false);\n const isTouchPinching = useRef(false);\n const pinchJustEnded = useRef(false);\n const startDist = useRef(0);\n const startScale = useRef(1);\n\n function applySmoothTransform(\n x: number,\n y: number,\n scale: number,\n durationMs = 300\n ) {\n const container = 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 offX.current?.set(x);\n offY.current?.set(y);\n locX.current?.set(x);\n locY.current?.set(y);\n prevX.current?.set(x);\n prevY.current?.set(y);\n tgtX.current?.set(x);\n tgtY.current?.set(y);\n scaleRef.current = scale;\n setScale(scale);\n\n window.setTimeout(() => {\n primary.style.transition = '';\n }, durationMs + 30);\n }\n\n function handleZoomToggle(\n e: React.PointerEvent<HTMLImageElement> | React.TouchEvent<HTMLImageElement>,\n imageRef: React.RefObject<HTMLDivElement | null>\n ) {\n if (!imageRef.current) return;\n\n currentImage.current = imageRef.current;\n const container = currentImage.current;\n const imgEl = container.children[0] as HTMLImageElement;\n\n const { width: cw, height: ch } = container.getBoundingClientRect();\n\n const iw = imgEl.offsetWidth;\n const ih = imgEl.offsetHeight;\n\n const gapAllEdges = cw > 0 && ch > 0 && iw > 0 && ih > 0 && iw < cw && ih < ch;\n\n if (gapAllEdges) return;\n\n const { x: domTx, y: domTy } = getCurrentTransform(imgEl);\n if (!locX.current || !locY.current) {\n locX.current = Vector1D(domTx);\n prevX.current = Vector1D(domTx);\n offX.current = Vector1D(domTx);\n tgtX.current = Vector1D(domTx);\n\n locY.current = Vector1D(domTy);\n prevY.current = Vector1D(domTy);\n offY.current = Vector1D(domTy);\n tgtY.current = Vector1D(domTy);\n\n bodyX.current = ScrollBody(\n locX.current,\n offX.current,\n prevX.current,\n tgtX.current,\n fs.zoom.panDuration,\n fs.zoom.panFriction\n ).sync();\n\n bodyY.current = ScrollBody(\n locY.current,\n offY.current,\n prevY.current,\n tgtY.current,\n fs.zoom.panDuration,\n fs.zoom.panFriction\n ).sync();\n }\n\n const s0 = scaleRef.current || 1;\n const goingIn = s0 === 1;\n const s1 = goingIn ? 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 resetAllZoomDom();\n }\n\n const rect = container.getBoundingClientRect();\n const containerW = rect.width;\n const containerH = rect.height;\n\n const anyEvt = e as any;\n const clientX =\n anyEvt?.touches?.[0]?.clientX ??\n anyEvt?.changedTouches?.[0]?.clientX ??\n anyEvt?.clientX ??\n 0;\n\n const clientY =\n anyEvt?.touches?.[0]?.clientY ??\n anyEvt?.changedTouches?.[0]?.clientY ??\n anyEvt?.clientY ??\n 0;\n\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 = offX.current!.get();\n const ty0 = 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 } = boundsForCurrent(s1, baseW, baseH, containerW, containerH);\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\n applySmoothTransform(tx1, ty1, s1, DURATION);\n\n scaleRef.current = s1;\n setScale(s1);\n previousZoom.current.x = cx;\n previousZoom.current.y = cy;\n panRef.current = { x: tx1, y: ty1 };\n\n locX.current!.set(tx1);\n prevX.current!.set(tx1);\n offX.current!.set(tx1);\n tgtX.current!.set(tx1);\n\n locY.current!.set(ty1);\n prevY.current!.set(ty1);\n offY.current!.set(ty1);\n tgtY.current!.set(ty1);\n\n bodyX.current = ScrollBody(\n locX.current!,\n offX.current!,\n prevX.current!,\n tgtX.current!,\n fs.zoom.panDuration,\n fs.zoom.panFriction\n ).sync();\n\n bodyY.current = ScrollBody(\n locY.current!,\n offY.current!,\n prevY.current!,\n tgtY.current!,\n fs.zoom.panDuration,\n fs.zoom.panFriction\n ).sync();\n\n const { x: limX2, y: limY2, povX, povY } = boundsForCurrent(s1, baseW, baseH, containerW, containerH);\n boundsX.current = ScrollBounds(limX2, offX.current!, tgtX.current!, bodyX.current!, povX, fs.zoom.panDuration);\n boundsY.current = ScrollBounds(limY2, offY.current!, tgtY.current!, bodyY.current!, povY, fs.zoom.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 }\n\n type Point = { x: number; y: number };\n function clampNum(val: number, min: number, max: number) { return Math.max(min, Math.min(max, val)) }\n\n const handlePinchWheel = useCallback((\n e: WheelEvent,\n imageRef: React.RefObject<HTMLDivElement | null>\n ) => {\n e.preventDefault();\n if (!imageRef.current) return;\n if (!e.ctrlKey) return;\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({\n destZoomLevel,\n centerPoint: { x: e.clientX, y: e.clientY },\n imageRef\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scaleRef.current]);\n\n function baseFitSizeC(imgEl: HTMLImageElement, containerW: number, containerH: number) {\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\n function zoomTo({\n destZoomLevel,\n centerPoint,\n imageRef\n }: {\n destZoomLevel: number;\n centerPoint: { x: number; y: number };\n imageRef: React.RefObject<HTMLDivElement | null>;\n }) {\n if (!imageRef.current) return;\n\n currentImage.current = imageRef.current;\n const container = currentImage.current as HTMLDivElement;\n const imgEl = container.children[0] as HTMLImageElement;\n\n const { width: cw, height: ch } = container.getBoundingClientRect();\n\n const iw = imgEl.offsetWidth;\n const ih = imgEl.offsetHeight;\n\n const gapAllEdges = cw > 0 && ch > 0 && iw > 0 && ih > 0 && iw < cw && ih < ch;\n\n if (gapAllEdges) return;\n\n const { x: domTx, y: domTy } = getCurrentTransform(imgEl);\n if (!locX.current || !locY.current) {\n locX.current = Vector1D(domTx); prevX.current = Vector1D(domTx); offX.current = Vector1D(domTx); tgtX.current = Vector1D(domTx);\n locY.current = Vector1D(domTy); prevY.current = Vector1D(domTy); offY.current = Vector1D(domTy); tgtY.current = Vector1D(domTy);\n\n bodyX.current = ScrollBody(\n locX.current, offX.current, prevX.current, tgtX.current,\n fs.zoom.panDuration, fs.zoom.panFriction\n ).sync();\n bodyY.current = ScrollBody(\n locY.current, offY.current, prevY.current, tgtY.current,\n fs.zoom.panDuration, fs.zoom.panFriction\n ).sync();\n }\n\n const s0 = scaleRef.current || 1;\n const s1 = clampNum(destZoomLevel, 1, 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) {\n suppressLoopRef.current = true;\n } else if (wasZoomed && !willBeZoomed) {\n suppressLoopRef.current = false;\n }\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 = offX.current!.get();\n const ty0 = 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 } = boundsForCurrent(s1, baseW, baseH, containerW, containerH);\n tx1 = limX.constrain(tx1);\n ty1 = limY.constrain(ty1);\n\n scaleRef.current = s1;\n setScale(s1);\n previousZoom.current.x = cx;\n previousZoom.current.y = cy;\n\n tgtX.current!.set(tx1); locX.current!.set(tx1); prevX.current!.set(tx1); offX.current!.set(tx1);\n tgtY.current!.set(ty1); locY.current!.set(ty1); prevY.current!.set(ty1); offY.current!.set(ty1);\n\n boundsX.current = ScrollBounds(limX, offX.current!, tgtX.current!, bodyX.current!, povX, fs.zoom.panDuration);\n boundsY.current = ScrollBounds(limY, offY.current!, tgtY.current!, bodyY.current!, povY, fs.zoom.panDuration);\n\n bodyX.current?.useDuration(0).useFriction(1);\n bodyY.current?.useDuration(0).useFriction(1);\n\n renderPan(tx1, ty1);\n animRef.current?.start();\n }\n\n function isPinchGesture(e: WheelEvent): boolean {\n if (e.ctrlKey) return true;\n const absX = Math.abs(e.deltaX), absY = Math.abs(e.deltaY)\n if (absX < 1 && absY < 1) return false\n const ratio = absX / absY\n return ratio >= 0.8 && ratio <= 1.2\n }\n\n const handleWheel = useCallback((e: WheelEvent) => {\n e.preventDefault();\n if (!isZoomed) return;\n if (isPinchGesture(e)) return;\n if (e.ctrlKey) return;\n if (!currentImage.current) return;\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 const { x: limX, y: limY, povX, povY } =\n boundsForCurrent(scaleRef.current, baseW, baseH, containerW, containerH);\n\n boundsX.current = ScrollBounds(limX, offX.current!, tgtX.current!, bodyX.current!, povX, fs.zoom.panDuration);\n boundsY.current = ScrollBounds(limY, offY.current!, tgtY.current!, bodyY.current!, povY, fs.zoom.panDuration);\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 // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isZoomed, rebuildPanBodies]);\n\n useEffect(() => {\n window.addEventListener('wheel', handleWheel as any)\n return () => {\n window.removeEventListener('wheel', handleWheel as any)\n }\n }, [handleWheel])\n\n useLayoutEffect(() => {\n function pinchWheelHandler(e: WheelEvent) {\n let targetImg: HTMLImageElement | null = null;\n\n const x = e.clientX;\n const y = e.clientY;\n\n const underlyingElement = document.elementFromPoint(x, y);\n\n if (underlyingElement) {\n if (underlyingElement.tagName.toLowerCase() === \"img\") {\n targetImg = underlyingElement as HTMLImageElement;\n } else {\n targetImg = underlyingElement.querySelector(\"img\");\n }\n }\n\n if (!targetImg) return;\n\n const imgIndex = targetImg.dataset.index;\n\n if (imgIndex === undefined) return;\n\n const matchedRef = imageRefs.current[parseInt(imgIndex)];\n\n if (!matchedRef) return;\n\n currentImage.current = imageRefs.current[parseInt(imgIndex)].current;\n\n handlePinchWheel(e, matchedRef);\n }\n\n window.addEventListener('wheel', pinchWheelHandler, { passive: false });\n\n return () => {\n window.removeEventListener('wheel', pinchWheelHandler);\n };\n }, [handlePinchWheel]);\n\n 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 \n 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 }\n\n const onTouchStart = (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\n const onTouchMove = (e: TouchEvent, imageRef: React.RefObject<HTMLDivElement | null>) => {\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 destZoom = startScale.current * factor;\n\n const center = midpoint(t0, t1);\n zoomTo({ destZoomLevel: destZoom, centerPoint: center, imageRef })\n }\n\n const endPinch = () => {\n if (!isTouchPinching.current) return;\n isTouchPinching.current = false;\n pinchJustEnded.current = true;\n }\n\n useLayoutEffect(() => {\n function touchPinchMoveHandler(e: TouchEvent) {\n let targetImg: HTMLImageElement | null = null;\n\n const { x, y } = midpoint(e.touches[0], e.touches[1])\n\n const underlyingElement = document.elementFromPoint(x, y);\n\n if (underlyingElement) {\n if (underlyingElement.tagName.toLowerCase() === \"img\") {\n targetImg = underlyingElement as HTMLImageElement;\n } else {\n targetImg = underlyingElement.querySelector(\"img\");\n }\n }\n\n if (!targetImg) return;\n\n const imgIndex = targetImg.dataset.index;\n\n if (imgIndex === undefined) return;\n\n const matchedRef = imageRefs.current[parseInt(imgIndex)];\n\n if (!matchedRef) return;\n\n currentImage.current = imageRefs.current[parseInt(imgIndex)].current;\n\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 return () => {\n window.removeEventListener('touchstart', onTouchStart);\n window.removeEventListener('touchmove', touchPinchMoveHandler);\n window.removeEventListener('touchend', endPinch);\n window.removeEventListener('touchcancel', endPinch);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [zoomTo, onTouchStart, onTouchMove, endPinch]);\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 masonryNode = (\n <Masonry\n items={masonryChildren}\n masonryColumns={masonryObject.columns}\n masonryGap={masonryObject.gap}\n masonryPlacement={masonryObject.placement}\n masonryEstimatedItemHeight={masonryObject.estimatedItemHeight}\n masonryClassNames={{\n root: masonryRootClassName,\n column: [styles.masonryCol, masonryObject.classNames?.column].filter(Boolean).join(' '),\n item: [styles.masonryItem, masonryObject.classNames?.item].filter(Boolean).join(' '),\n }}\n masonryStyle={{\n ['--rmg-intro-stagger' as any]: `${masonryIntro.staggerMs}ms`,\n ['--rmg-intro-transform' as any]: masonryIntro.transform,\n ['--rmg-intro-duration' as any]: `${masonryIntro.durationMs}ms`,\n ['--rmg-intro-easing' as any]: masonryIntro.easing,\n }}\n masonryAs={masonryObject.as ?? 'div'}\n masonryRootRef={masonryObject.rootRef ?? masonryRootRef}\n breakpoints={effectiveBreakpoints}\n />\n );\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 <>\n {masonryLoadingNode}\n {masonryNode}\n </>\n ) : layout === 'entries' ? (\n <>\n <div {...entryListContainerProps}>\n {entryRows}\n </div>\n </>\n ) : layout === 'grid' ? (\n <>\n {gridLoadingNode}\n {gridIntroWrapped}\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 isZoomClick={isZoomClick}\n isClick={isClick}\n isAnimating={isAnimatingRef}\n overlayDivRef={overlayDivRef}\n zoomLevel={zoomLevel}\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={handleZoomToggle}\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 >\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 <div\n ref={setFsEntryOverlayMountRef}\n style={{\n position: 'absolute',\n inset: 0,\n pointerEvents: 'none',\n zIndex: 9999,\n }}\n >\n </div>\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 '.'\n\ntype WindowType = Window & typeof globalThis\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 Axis() {\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}\ntype AxisType = ReturnType<typeof Axis>\n\nfunction Translate(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}\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\ntype AxisLike = {\n scroll: 'x' | 'y'\n cross: 'x' | 'y'\n direction: (n: number) => number\n measureSize?: (rect: DOMRect) => number\n}\n\nfunction DragTracker(axis: AxisLike, ownerWindow: WindowType) {\n return createDragTracker({\n ownerWindow,\n axis,\n })\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<HTMLImageElement>\n | React.TouchEvent<HTMLImageElement>,\n imageRef: React.RefObject<HTMLImageElement | null>\n ) => void\n imageRefs: React.RefObject<HTMLImageElement | 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}\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 },\n ref\n ) => {\n const isRtl = direction === 'rtl' ? true : false\n const rtlCls = isRtl ? styles.rtl : '';\n const sign = isRtl ? -1 : 1;\n\n const viewportRef = useRef<HTMLDivElement | null>(null)\n const slider = useRef<HTMLDivElement | null>(null)\n const axisRef = useRef<AxisType | null>(null)\n\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\n const isAnimatingRef = useRef(false)\n const pointerDownRef = useRef(false)\n\n const yTemp = useRef(0)\n const dragThreshold = 5\n const FADE_DISTANCE = 300\n\n const selectedIndex = useRef(0)\n const hasPositioned = useRef<boolean>(false)\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 perSlideRef = useRef(0)\n\n const contentSizeRef = useRef(0)\n const loopLimitRef = useRef<ReturnType<typeof Limit> | null>(null)\n\n type FsScrollTo = {\n distance: (n: number, snap: boolean) => void\n index: (n: number, direction: number) => void\n }\n\n const scrollSnapsRef = useRef<number[]>([])\n const scrollContentSizeRef = useRef(0)\n\n type FsLimit = {\n min: number\n max: number\n reachedAny: (n: number) => boolean\n constrain: (n: number) => number\n removeOffset: (n: number) => number\n }\n\n const scrollLimitRef = useRef<FsLimit | null>(null)\n const scrollTargetRef = useRef<ScrollTargetType | null>(null)\n const scrollToRef = useRef<FsScrollTo | null>(null)\n\n function createFsLimit(min: number, max: number): FsLimit {\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 }\n\n type CounterType = {\n get: () => number\n set: (n: number) => CounterType\n add: (n: number) => CounterType\n clone: () => CounterType\n }\n\n 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 }\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 = createFsLimit(-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 const slides = useRef<{ cells: { element: HTMLElement }[] }[]>([])\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 const indexCurrentRef = useRef<CounterType | null>(null)\n const indexPreviousRef = useRef<CounterType | null>(null)\n\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\n const dragStartY = useRef(0)\n const dragYForClose = useRef(0)\n\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 \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 selectedIndex.current = idx;\n indexCurrentRef.current?.set(idx);\n sub.setLocalIndex(idx);\n updateCounterFromIndex(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 const activeTouchCount = useRef(0)\n const wasPinch = useRef(false)\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 = createFsLimit(-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 selectedIndex.current = idx;\n sub.setLocalIndex(idx);\n updateCounterFromIndex(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 const appliedYRef = useRef(0)\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 type DragMode = 'none' | 'x' | 'y'\n const dragMode = useRef<DragMode>('none')\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 selectedIndex.current = ((req.index % slideCount()) + slideCount()) % slideCount();\n sub.setLocalIndex(selectedIndex.current);\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}","/* 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 { MediaItem } from '.'\nimport { parseObjectPosition } from './shared/transitions/objectPosition';\nimport { containTransformForRect, coverTransformForRect, objectFitContentRect } from './shared/transitions/objectFitTransform';\n\ntype IndexMode = 'instant' | 'animated';\n\ntype MediaEntryLink = {\n entryIndex: number;\n mediaIndex: number;\n};\n\ninterface FullscreenModalProps {\n fsSub: FullscreenSliderSub\n open: boolean\n onClose: () => void\n isZoomClick: RefObject<boolean>\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 zoomLevel: number\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 isZoomClick,\n isClick,\n isAnimating,\n overlayDivRef,\n closeButtonRef,\n counterRef,\n leftChevronRef,\n rightChevronRef,\n zoomLevel,\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 mountShield();\n\n isAnimating.current = false\n isClick.current = false\n cells.current = []\n setClosingModal(true)\n\n if (layout === 'grid' || layout === 'masonry' || entryMediaLayout === 'grid' || entryMediaLayout === 'masonry') {\n void proceedToCloseGrid();\n return;\n }\n\n if (!slider.current || !slides.current?.length) return\n\n const viewport = getViewportEl(slider.current)\n if (!viewport) return\n\n const originals = wrappedItems.slice(1, wrappedItems.length - 1)\n\n const fsIndex = fsSub.get()\n let canonicalIdx: number;\n if (isWrapping.current) {\n if ((fsIndex >= slider.current.children.length - (visibleImagesRef.current || 0) * 2) && layout !== 'entries') {\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 const url = originals[canonicalIdx]\n\n if (introFade || isVideoItem(url)) {\n setClosingModal(true);\n fadeCloseAndTeardown();\n return;\n }\n\n let 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\n fadeChrome()\n\n fadeOverlay()\n\n const slideArr = slides.current!;\n\n let matchSlide = slideArr.find(s => s.cells.some(c => c.index === localSlideIdx))\n\n let newIndex = matchSlide ? slideArr.indexOf(matchSlide) : -1;\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 =\n !!(viewport && targetCellEl) &&\n !isCellVisible(targetCellEl!, viewport, true);\n\n const continueAfterMeasure = 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) { safeTeardown(); return }\n\n const { domSlideIdx } = thumbInfo;\n\n let thumbCropRect = thumbInfo.cropRect; // fallback (cell rect)\n\n if (thumbInfo.imgEl) {\n const thumbImg = thumbInfo.imgEl;\n const thumbBox = thumbImg.getBoundingClientRect();\n\n const csThumb = getComputedStyle(thumbImg);\n const fitThumb = (csThumb.objectFit || 'cover') as 'contain' | 'cover';\n const objThumb = parseObjectPosition(csThumb.objectPosition ?? null);\n\n const natWThumb = Math.max(1, thumbImg.naturalWidth || 0);\n const natHThumb = Math.max(1, thumbImg.naturalHeight || 0);\n\n thumbCropRect =\n fitThumb === 'contain'\n ? objectFitContentRect(natWThumb, natHThumb, thumbBox, 'contain', objThumb)\n : thumbBox;\n }\n\n const slideEl = slider.current!.children[domSlideIdx] as HTMLElement | undefined\n if (!slideEl) return\n\n const fsSlider = withinFs<HTMLElement>('.fullscreen_slider');\n if (!fsSlider) { safeTeardown(); return; }\n const url = originals[canonicalIdx]\n const isVideoSlide = isVideoItem(url);\n\n const fsIdx = fsSub.get();\n const nodeIdx = nodeIdxFromFs(fsIdx, imageCount);\n\n const targetImg =\n !isVideoSlide\n ? fsSlider?.querySelector<HTMLImageElement>(`img[data-index=\"${nodeIdx}\"]`) ?? null\n : null;\n\n if (!targetImg && !isVideoSlide) { safeTeardown(); return; }\n\n fadeNonActiveSlides(fsSlider, nodeIdx, targetImg, isVideoSlide);\n\n let captionClone: HTMLElement | null = cloneFsCaptionForNode(fsSlider, nodeIdx)\n\n if (captionClone) {\n captionClone.style.transition = `opacity ${DURATION_MS}ms ${EASING}`\n void captionClone.offsetWidth\n captionClone.style.opacity = '0'\n }\n\n let movingEl: HTMLElement | null = null\n let restoreIntoParent: Node | null = null\n let restoreNextSibling: Node | null = null\n let natW = 0\n let natH = 0\n\n if (isVideoSlide) {\n const fsSliderEl = fsSlider as HTMLElement | null;\n if (!fsSliderEl) { safeTeardown(); return; }\n\n await animateVideoCloseProxy({\n fsSliderEl,\n nodeIdx,\n thumbCropRect,\n endObjPos: thumbInfo.objPos ?? { x: 0.5, y: 0.5 },\n captionClone,\n safeTeardown,\n DURATION_MS,\n EASING\n });\n\n return;\n }\n\n {\n movingEl = targetImg as unknown as HTMLElement\n restoreIntoParent = movingEl?.parentNode || null\n 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\n const fsFit = ((getComputedStyle(targetImg!).objectFit || 'contain') as 'contain' | 'cover');\n const curRect = movingEl.getBoundingClientRect();\n natW = imgEl.naturalWidth || curRect.width || 1;\n 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 endFit = thumbInfo.imgEl\n ? ((getComputedStyle(thumbInfo.imgEl).objectFit || 'cover') as 'contain' | 'cover')\n : 'cover';\n\n const endT =\n endFit === 'contain'\n ? containTransformForRect(natW, natH, thumbCropRect, thumbInfo.objPos)\n : coverTransformForRect(natW, natH, thumbCropRect, thumbInfo.objPos);\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(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 movingEl?.removeEventListener('transitionend', onEnd as any)\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 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 movingEl.addEventListener('transitionend', onEnd as any, { once: true })\n window.setTimeout(() => finish(), DURATION_MS + 80)\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 continueAfterMeasure() })\n })\n } else {\n void continueAfterMeasure()\n }\n }\n\n async function proceedToCloseGrid() {\n if (!open) return;\n mountShield();\n\n isAnimating.current = false;\n isClick.current = false;\n cells.current = [];\n setClosingModal(true);\n\n const fsSlider = withinFs<HTMLElement>('.fullscreen_slider');\n if (!fsSlider) { safeTeardown(); return; }\n const count = imageCount || wrappedItems.length || 0;\n\n const originals = wrappedItems.slice(1, wrappedItems.length - 1);\n const originalsCount = originals.length || count;\n if (!originalsCount) {\n safeTeardown();\n return;\n }\n\n const fsIdx = fsSub.get();\n const canonicalIdx = Math.max(0, Math.min(originalsCount - 1, fsIdx));\n\n const url = originals[canonicalIdx];\n\n if (introFade || isVideoItem(url)) {\n mountShield();\n setClosingModal(true);\n fadeCloseAndTeardown();\n return;\n }\n\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 const origMedia = originals[canonicalIdx];\n if (!origMedia) {\n safeTeardown();\n return;\n }\n\n const isVideoSlide = isVideoItem(origMedia);\n if (!expandableImgRefs?.current) {\n safeTeardown();\n return;\n }\n\n const origImgRef = expandableImgRefs.current?.[canonicalIdx] as unknown as HTMLImageElement | null;\n\n fadeChrome()\n\n fadeOverlay()\n\n if (!origImgRef) {\n safeTeardown();\n return;\n }\n\n const gridRect = origImgRef.getBoundingClientRect();\n\n const cs = getComputedStyle(origImgRef);\n const objPos = parseObjectPosition(cs?.objectPosition ?? null) ?? { x: 0.5, y: 0.5 };\n const objectFit = (cs?.objectFit ?? 'cover') as 'contain' | 'cover';\n\n let thumbCropRect = gridRect;\n\n const natWThumb = Math.max(1, origImgRef.naturalWidth || 0);\n const natHThumb = Math.max(1, origImgRef.naturalHeight || 0);\n\n thumbCropRect =\n objectFit === 'contain'\n ? objectFitContentRect(natWThumb, natHThumb, gridRect, 'contain', objPos)\n : gridRect;\n\n const thumbInfo = {\n slideIdx: canonicalIdx,\n domSlideIdx: canonicalIdx,\n cropRect: thumbCropRect,\n imgEl: origImgRef,\n objPos,\n renderedW: thumbCropRect.width,\n renderedH: thumbCropRect.height,\n renderedRect: thumbCropRect,\n objectFit,\n };\n\n const nodeIdx = nodeIdxFromFs(fsIdx, imageCount);\n const targetImg =\n !isVideoSlide\n ? fsSlider.querySelector<HTMLImageElement>(`img[data-index=\"${nodeIdx}\"]`) ?? null\n : null;\n \n let captionClone: HTMLElement | null = cloneFsCaptionForNode(fsSlider, nodeIdx)\n\n if (captionClone) {\n captionClone.style.transition = `opacity ${DURATION_MS}ms ${EASING}`\n void captionClone.offsetWidth\n captionClone.style.opacity = '0'\n }\n\n fadeNonActiveSlides(fsSlider, nodeIdx, targetImg, isVideoSlide);\n \n let movingEl: HTMLElement | null = null;\n let restoreIntoParent: Node | null = null;\n let restoreNextSibling: Node | null = null;\n let natW = 0;\n let natH = 0;\n\n if (isVideoSlide) {\n const fsSliderEl = fsSlider as HTMLElement | null;\n if (!fsSliderEl) { safeTeardown(); return; }\n\n await animateVideoCloseProxy({\n fsSliderEl,\n nodeIdx,\n thumbCropRect,\n endObjPos: thumbInfo.objPos ?? { x: 0.5, y: 0.5 },\n captionClone,\n safeTeardown,\n DURATION_MS,\n EASING\n });\n\n return;\n }\n\n {\n movingEl = (targetImg as unknown as HTMLElement) || null;\n if (!movingEl) {\n safeTeardown();\n return;\n }\n\n restoreIntoParent = movingEl.parentNode || null;\n 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\n const fsFit = ((getComputedStyle(targetImg!).objectFit || 'contain') as 'contain' | 'cover');\n const curRect = movingEl.getBoundingClientRect();\n natW = imgEl.naturalWidth || curRect.width || 1;\n 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 endFit = thumbInfo.imgEl\n ? ((getComputedStyle(thumbInfo.imgEl).objectFit || 'cover') as 'contain' | 'cover')\n : 'cover';\n\n const endT =\n endFit === 'contain'\n ? containTransformForRect(natW, natH, thumbCropRect, thumbInfo.objPos)\n : coverTransformForRect(natW, natH, thumbCropRect, thumbInfo.objPos);\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(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 movingEl?.removeEventListener('transitionend', onEnd as any);\n try {\n if (restoreIntoParent) {\n if (restoreNextSibling)\n (restoreIntoParent as Node).insertBefore(movingEl!, restoreNextSibling);\n else\n (restoreIntoParent as Node).appendChild(movingEl!);\n }\n } catch {}\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 movingEl.addEventListener('transitionend', onEnd as any, { once: true });\n window.setTimeout(() => finish(), DURATION_MS + 80);\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-unused-expressions */\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 { flushSync } from 'react-dom';\nimport { AxisKey } 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 { parseObjectPosition } from './shared/transitions/objectPosition';\nimport { containTransformForRect, coverTransformForRect, objectFitContentRect } from './shared/transitions/objectFitTransform';\nimport type { APITypes } from 'plyr-react';\nimport { RmgSlideProvider } from './shared/slideContext';\n\ntype WindowType = Window & typeof globalThis\n\nconst mathAbs = Math.abs\n\ntype 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\nfunction 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\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(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 ResponsiveHeightRule = { query: string; height: string };\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\ntype DotsRenderArgs = {\n ref: React.RefObject<HTMLDivElement | null>;\n count: number;\n activeIndex: number;\n hidden: boolean;\n goTo: (index: number) => void;\n getDotRef: (index: number) => (el: HTMLDivElement | null) => void;\n createRipple: (el: HTMLElement) => void;\n classNameContainer?: string;\n classNameDot?: string;\n};\n\ntype ProgressRenderArgs = {\n ref: React.Ref<HTMLDivElement>;\n innerRef?: React.Ref<HTMLDivElement>;\n hidden: boolean;\n progress: number;\n axis: 'x' | 'y';\n className?: string;\n style?: React.CSSProperties;\n innerClassName?: string;\n innerStyle?: React.CSSProperties;\n};\n\ntype FsCounterArgs = { index: number; count: number };\n\ntype IndexMode = 'instant' | 'animated';\n\nexport type MediaItem =\n | {\n kind: 'image';\n src: string;\n alt?: string;\n caption?: React.ReactNode;\n }\n | {\n kind: 'video';\n src: string;\n alt?: string;\n thumb?: string;\n caption?: React.ReactNode;\n };\n\ntype FsCaptionPlacement = 'top' | 'right' | 'bottom' | 'left';\n\nexport type FsCaptionRenderArgs = {\n item: MediaItem;\n index: number;\n isZoomed: boolean;\n};\n\nexport interface SliderHandle {\n centerSlider: () => void;\n getIndex: () => number;\n setIndex: (i: number, mode?: IndexMode) => void;\n subscribeIndex: (fn: () => void) => () => void;\n slideIndexForCell: (cellIndex: number) => number;\n getRootNode(): HTMLElement | null;\n getContainerNode(): HTMLElement | null;\n getSlideNodes(): HTMLElement[];\n onSlidesBuilt(cb: (nodes: HTMLElement[]) => void): () => void;\n whenSlidesBuilt(): Promise<HTMLElement[]>;\n isSlidesBuilt(): boolean;\n scrollNext: (mode?: IndexMode) => void;\n scrollPrev: (mode?: IndexMode) => void;\n canScrollNext: () => boolean;\n canScrollPrev: () => boolean;\n scrollProgress: () => number;\n cellsInView: () => number[];\n getInternals(): {\n slides: RefObject<{ cells: { element: HTMLElement; index: number }[]; target: number }[]>;\n slider: RefObject<HTMLDivElement | null>;\n visibleImages: RefObject<number>;\n selectedIndex: RefObject<number>;\n sliderX: RefObject<number>;\n sliderVelocity: RefObject<number>;\n isWrapping: RefObject<boolean>;\n };\n}\n\ntype ResponsiveNumber =\n | number\n | string\n | Array<number | string>\n | Record<string, number | string>;\n\ntype BreakpointMap = Record<string, number>;\n\nexport type LoadingOptions = {\n isLoading?: boolean;\n skeletonCount?: ResponsiveNumber;\n renderLoading?: (args: {\n layout: 'slider' | 'grid' | 'masonry' | 'entries';\n count: number; // SSR base count (xs / lowest rule)\n }) => React.ReactNode;\n};\n\nexport type IntroOptions = {\n renderIntro?: (\n args: {\n active: boolean;\n containerProps: React.HTMLAttributes<HTMLDivElement>;\n },\n content: React.ReactNode\n ) => React.ReactNode;\n staggerMs?: number;\n transform?: number | string;\n durationMs?: number;\n easing?: string;\n};\n\ntype ThumbnailPosition = 'top' | 'right' | 'bottom' | 'left' | null;\n\ntype ControlStyle = {\n className?: string;\n style?: React.CSSProperties;\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?: ControlStyle;\n arrows?: {\n arrow?: ControlStyle;\n prev?: ControlStyle;\n next?: ControlStyle;\n };\n counter?: ControlStyle;\n };\n showFsArrows?: boolean;\n showFsClose?: boolean;\n renderFsClose?: () => React.ReactNode | 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) => React.ReactNode | 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?: LoadingOptions;\n introOptions?: IntroOptions;\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 internalIndexChannel = useMemo(() => createIndexChannel(), []);\n const indexChannel = externalIndexChannel ?? internalIndexChannel;\n\n const isRtl = direction === 'rtl' ? true : false\n const rtlCls = isRtl ? styles.rtl : '';\n const sign = axis === 'x' && isRtl ? -1 : 1;\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 [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 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 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\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 \n const [inView, setInView] = useState(false)\n const [wrap, setWrap] = useState(false)\n\n const progressHolderRef = useRef<HTMLDivElement | null>(null);\n const progressInnerRef = useRef<HTMLDivElement | null>(null);\n const lastProgressRef = useRef(0);\n\n const cellToSlideRef = useRef<number[]>([]);\n\n const builtOnceRef = useRef(false);\n const slideBuildSubs = useRef(new Set<(nodes: HTMLElement[]) => void>());\n\n const [layoutReady, setLayoutReady] = useState(false);\n\n const [engineReady, setEngineReady] = useState(false);\n\n const overlayCaptionRef = useRef<HTMLDivElement | null>(null);\n const overlayCaptionRootRef = useRef<ReturnType<typeof createRoot> | null>(null);\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 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, children, loop, axis]);\n\n const contentSizeRef = useRef(0)\n const loopLimitRef = useRef<ReturnType<typeof Limit> | null>(null)\n\n type BaseScrollTo = {\n distance: (n: number, snap: boolean) => void\n index: (n: number, direction: number) => void\n }\n\n const scrollSnapsRef = useRef<number[]>([])\n const scrollContentSizeRef = useRef(0)\n\n 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\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\n 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 }\n\n type CounterType = {\n get: () => number\n set: (n: number) => CounterType\n add: (n: number) => CounterType\n clone: () => CounterType\n }\n\n 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 }\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 const layoutRef = useRef<{\n originals: { el: HTMLElement; start: number; end: any; size: any }[];\n cw: number;\n } | null>(null);\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 const cells = useRef<{ element: HTMLElement; index: number }[]>([])\n const sliderWidth = useRef(0)\n const hasPositioned = useRef<boolean>(false)\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 const draggingAttr = 'data-rmg-drag';\n const activePointerIdRef = useRef<number | null>(null);\n const guardsStoreRef = useRef<ReturnType<typeof EventStore> | null>(null);\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 const isHoveringRef = useRef(false);\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 const lastPointerUpTime = useRef<number>(performance.now() - 1000);\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 const autoScrollPauseUntil = useRef(0);\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 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 const [buildKey, setBuildKey] = useState(0);\n const loopStableRef = useRef<boolean | null>(null);\n const [geomKey, setGeomKey] = useState(0);\n const lastGeomSigRef = useRef<string>(\"\");\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 const plyrRefsByIdx = useRef<Record<number, any>>({});\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 const lastCloneSigRef = useRef<string>(\"\");\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 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\n const pointerDownRef = useRef(false)\n const isAnimatingRef = useRef(false)\n const isPointerDown = useRef(false)\n const isScrolling = useRef(false)\n\n const xRef = useRef(0)\n const dragX = useRef(0)\n const previousDragX = useRef(0)\n const dragMoveTime = useRef<Date | null>(null)\n\n const boundsRef = useRef<ScrollBoundsType | null>(null)\n const povRef = useRef<PercentOfViewType | null>(null)\n\n const getSnapTargets: () => number[] = () => (slides.current || []).map((s) => s.target)\n const totalWidth = () => sliderWidth.current || 0\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 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 TWEEN_FACTOR_BASE = 0.2;\n const tweenNodesRef = useRef<HTMLElement[]>([]);\n const parallaxNodesRef = useRef<HTMLElement[]>([]);\n const parallaxSnapsRef = useRef<number[]>([]);\n\n (function collectParallaxForAll() {\n const track = slider.current;\n if (!track) return;\n const W = sliderWidth.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 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 ? (((baseX % W) + W) % W) / W : 0;\n\n nodes.push(layer);\n snaps.push(n);\n }\n\n parallaxNodesRef.current = nodes;\n parallaxSnapsRef.current = snaps;\n })();\n\n function currentTweenFactor() {\n const count = parallaxSnapsRef.current.length || 1;\n return TWEEN_FACTOR_BASE * (count / Math.max(visibleImagesRef.current || 1, 1));\n }\n\n function scrollProgressNorm(): number {\n const track = slider.current;\n const W = sliderWidth.current || 0;\n if (!track) return 0;\n\n if (!wrap) {\n const max = Math.max(0, W - track.clientWidth);\n if (max <= 0) return 0;\n const loc = -(offsetLocationRef.current?.get() ?? 0);\n return Math.min(1, Math.max(0, loc / max));\n }\n\n if (W <= 0) return 0;\n const loc = -(offsetLocationRef.current?.get() ?? 0);\n const world = ((loc % W) + W) % W;\n return world / W;\n }\n\n const tweenParallax = useCallback(() => {\n if (!parallax) 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 nodes[i].style.transform =\n AX.main === 'x' ? `translateX(${translatePct}%)` : `translateY(${translatePct}%)`;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [parallax, wrap]);\n\n useEffect(() => {\n if (!parallax) {\n tweenNodesRef.current.forEach((n) => n && n.removeAttribute('style'));\n }\n }, [parallax]);\n\n useEffect(() => {\n if (!parallax) return;\n if (!(slides.current?.length)) return;\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n tweenParallax()\n })\n })\n }, [parallax, slidesState.length, clonedChildren.length, wrap, tweenParallax, slides, isReady]);\n\n function slideCenterX(logicalIdx: number) {\n const s = slides.current?.[logicalIdx];\n if (!s || !slider.current) return 0;\n const centerOffset = getCenterOffsetForIndex(logicalIdx);\n return s.target - centerOffset;\n }\n\n function getCenters(): number[] {\n const L = slides.current?.length ?? 0;\n const arr: number[] = [];\n for (let i = 0; i < L; i++) arr.push(slideCenterX(i));\n return arr;\n }\n\n function findBoundingPair(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 = sliderWidth.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, rightIdx = 0;\n for (let k = 0; k < nodes.length - 1; k++) {\n const a = nodes[k], b = nodes[k + 1];\n if (loc >= a.x && loc <= b.x) { leftIdx = k; rightIdx = k + 1; break; }\n }\n\n if (loc < nodes[0].x) { leftIdx = 0; rightIdx = 1; }\n if (loc > nodes[nodes.length - 1].x) { leftIdx = nodes.length - 2; rightIdx = nodes.length - 1; }\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\n function applyPairScaleTween() {\n if (!scaleEffect || !slider.current || !slides.current?.length || !scaleAmount) return;\n\n const track = slider.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 = slides.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 const li = Number(idxAttr);\n const s = sByIdx[li] ?? 1;\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 }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => { applyPairScaleTween(); }, [scaleEffect, scaleAmount, clonedChildren.length, slidesState.length]);\n\n const MIN_FADE_OPACITY = 0.5;\n\n function 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\n function applyFadeTween() {\n if (!fadeEffect || !slider.current || !slides.current?.length) return;\n\n const track = slider.current;\n const kids = Array.from(track.children) as HTMLElement[];\n const loc = -(offsetLocationRef.current?.get() ?? 0);\n const centers = getCenters();\n const L = centers.length;\n if (!L) return;\n\n const W = sliderWidth.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, rightIdx = 1;\n for (let k = 0; k < nodes.length - 1; k++) {\n const a = nodes[k], b = nodes[k + 1];\n if (loc >= a.x && loc <= b.x) { leftIdx = k; rightIdx = k + 1; break; }\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) { el.style.opacity = '1'; continue; }\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\n useEffect(() => {\n if (fadeEffect) return;\n const track = slider.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 }, [fadeEffect]);\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 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 const shieldCleanupRef = useRef<null | (() => void)>(null)\n const SHIELD_TIMEOUT = 400\n function addGestureShield() {\n shieldCleanupRef.current?.()\n const shield = document.createElement('div')\n Object.assign(shield.style, {\n position: 'fixed',\n inset: '0',\n zIndex: '10000',\n background: 'transparent',\n touchAction: 'none',\n pointerEvents: 'auto',\n } as CSSStyleDeclaration)\n document.body.appendChild(shield)\n const remove = () => {\n if (shield.parentNode) shield.remove()\n }\n const timer = window.setTimeout(() => {\n remove()\n shieldCleanupRef.current = null\n }, SHIELD_TIMEOUT)\n const teardown = () => {\n window.clearTimeout(timer)\n remove()\n shieldCleanupRef.current = null\n }\n shieldCleanupRef.current = teardown\n return teardown\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 toggleFullscreen(e as React.PointerEvent<HTMLDivElement>, expandableImgRefs.current[parsedImgIndex], finalIndex)\n setSlideIndex(finalIndex)\n }\n\n function toggleFullscreen(\n e: React.PointerEvent<HTMLDivElement>,\n imgRef: React.RefObject<HTMLImageElement | null>,\n index: number\n ) {\n const DURATION_MS = fsIntroDuration;\n const EASING = fsIntroEasing;\n\n const origImg = imgRef.current;\n const container = sliderContainer.current;\n if (!origImg || !container) return;\n\n shieldCleanupRef.current?.();\n shieldCleanupRef.current = addGestureShield();\n\n const vw = document.documentElement.clientWidth;\n const vh = window.innerHeight;\n\n const slideEl =\n (origImg.closest('.rmg__slide') 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\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 const overlay = document.createElement('div');\n overlay.className = styles.fullscreenOverlay;\n overlayDivRef.current = overlay;\n overlay.style.opacity = '0';\n overlay.style.pointerEvents = 'none';\n overlay.style.transition = 'none';\n document.body.appendChild(overlay);\n void overlay.offsetWidth;\n overlay.style.transition = `opacity ${DURATION_MS}ms ${EASING}`;\n\n const effectivePlacement = resolveFsCaptionPlacement(\n fsCaptionPlacement,\n fsCaptionBreakpoint,\n vw\n );\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 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 if (fsThumbContainerRef?.current) {\n const H = fsThumbContainerRef.current.offsetHeight;\n const W = fsThumbContainerRef.current.offsetWidth;\n\n if (fullscreenThumbnails === 'top') {\n contentTop += H;\n } else if (fullscreenThumbnails === 'bottom') {\n contentBottom -= H;\n } else if (fullscreenThumbnails === 'left') {\n contentLeft += W;\n } else if (fullscreenThumbnails === 'right') {\n contentRight -= W;\n }\n }\n\n if (typeof renderFsCaption === 'function') {\n try {\n const overlayCaption = document.createElement('div');\n overlayCaption.className = styles.fsOverlayCaption;\n overlayCaptionRef.current = overlayCaption;\n\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 = fullscreenThumbnails === 'top' ? `${contentTop}px` : '0';\n base.bottom = '0';\n base.left = `${contentRight}px`;\n base.width = `${sideWidth}px`;\n base.height =\n fullscreenThumbnails === 'bottom'\n ? `${contentBottom}px`\n : 'auto';\n } else if (effectivePlacement === 'left') {\n base.top = fullscreenThumbnails === 'top' ? `${contentTop}px` : '0';\n base.bottom = '0';\n base.left = '0';\n base.width = `${sideWidth}px`;\n base.height =\n fullscreenThumbnails === 'bottom'\n ? `${contentBottom}px`\n : '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 {\n const bottomOffset = Math.max(0, vh - contentBottom - topBottomHeight);\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 }\n\n Object.assign(overlayCaption.style, base);\n overlay.appendChild(overlayCaption);\n\n const root = createRoot(overlayCaption);\n overlayCaptionRootRef.current = root;\n\n const item = normalizedItems[index];\n const captionNode = renderFsCaption({ item, index, isZoomed: false });\n root.render(<>{captionNode}</>);\n } catch (err) {\n console.error('[RMG] Failed to render overlay caption', err);\n }\n }\n\n const imageCount = normalizedItems.length;\n const closeEnabled = showFsClose !== false;\n const counterEnabled = showFsCounter !== false;\n const allowFsArrows = showFsArrows !== false && imageCount > 1;\n const isRtl = direction === 'rtl';\n\n const defaultClose = () => {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = styles.closeBtn;\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('width', '35'); svg.setAttribute('height', '35');\n svg.setAttribute('viewBox', '0 0 16 16');\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n path.setAttribute('fill', 'white'); 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 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'\n ? (isRtl ? 'next' : 'prev')\n : (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('points', '4.586,3.414 9.172,8 4.586,12.586 6,14 12,8 6,2');\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 renderFsPrev === \"function\" ? renderFsPrev() : null)\n : (typeof renderFsNext === \"function\" ? renderFsNext() : null);\n\n if (explicit instanceof HTMLElement) return explicit;\n\n if (typeof renderFsArrows === \"function\") {\n const el = renderFsArrows({ 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 function ensureButtonLike(el: HTMLElement) {\n if (el.tagName.toLowerCase() === \"button\") {\n const btn = el as HTMLButtonElement;\n btn.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\n el.addEventListener(\"keydown\", (ev) => {\n if (ev.key === \"Enter\" || ev.key === \" \") {\n ev.preventDefault();\n el.click();\n }\n });\n }\n }\n\n const closeExplicit =\n typeof renderFsClose === \"function\" ? renderFsClose() : null;\n\n const closeBtn = closeEnabled\n ? (closeExplicit instanceof HTMLElement ? closeExplicit : defaultClose())\n : null;\n\n if (closeBtn) {\n ensureButtonLike(closeBtn);\n if (!closeBtn.getAttribute(\"aria-label\")) 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 const ctrExplicit =\n typeof renderFsCounter === \"function\"\n ? renderFsCounter({ index, count: imageCount })\n : null;\n\n const ctr = counterEnabled\n ? (ctrExplicit instanceof HTMLElement ? ctrExplicit : defaultCounter(index, imageCount))\n : null;\n\n const applyControl = (el: HTMLElement | null, cfg?: ControlStyle) => {\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\n if (leftCh) leftCh.classList.add(styles.leftChevron);\n if (rightCh) rightCh.classList.add(styles.rightChevron);\n\n applyControl(closeBtn, fullscreenControls?.close);\n applyControl(leftCh, fullscreenControls?.arrows?.arrow);\n applyControl(rightCh, fullscreenControls?.arrows?.arrow);\n applyControl(leftCh, fullscreenControls?.arrows?.prev);\n applyControl(rightCh, fullscreenControls?.arrows?.next);\n applyControl(ctr, fullscreenControls?.counter);\n\n [leftCh, rightCh].forEach((btn, i) => {\n const action = i === 0 ? leftAction : rightAction;\n if (!btn) return;\n\n btn.dataset.action = action;\n btn.setAttribute(\"aria-label\", action === \"prev\" ? \"Previous\" : \"Next\");\n });\n\n closeButtonRef.current = closeBtn;\n leftChevronRef.current = leftCh;\n rightChevronRef.current = rightCh;\n (counterRef as any).current = ctr;\n\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 const item = normalizedItems[index];\n\n const isVideoSlide =\n (item as any)?.type === 'video' ||\n (item as any)?.kind === 'video' ||\n (item as any)?.mediaType === 'video' ||\n !!(item as any)?.videoSrc ||\n !!(item as any)?.sources?.video ||\n !!(item as any)?.plyrSource ||\n !!(slideEl as any)?.dataset?.rmgVideo;\n\n const forceFadeIntro = fullscreenIntroFade || isVideoSlide;\n\n if (forceFadeIntro) {\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 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 requestAnimationFrame(() => {\n const many = imageCount > 1;\n const addOpen = (el: Element) => el.classList.add(styles.open);\n\n if (closeBtn) {\n addOpen(closeBtn);\n }\n \n if (many) {\n if (allowFsArrows) {\n if (leftCh) {\n addOpen(leftCh);\n }\n if (rightCh) {\n addOpen(rightCh);\n }\n }\n\n if (ctr) {\n addOpen(ctr);\n }\n \n }\n });\n\n return;\n }\n\n const 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 const dup = document.createElement('img');\n dup.src = (origImg as HTMLImageElement).currentSrc || origImg.src;\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 duplicateImgRef.current = dup;\n\n clipper.appendChild(dup);\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 contentRect = new DOMRect(\n contentLeft,\n contentTop,\n Math.max(1, contentRight - contentLeft),\n Math.max(1, contentBottom - contentTop)\n );\n\n const fitsIntrinsic =\n natW <= contentRect.width && natH <= contentRect.height;\n\n const endObjPos = { x: 0.5, y: 0.5 };\n\n const endT = fitsIntrinsic\n ? { cx: contentRect.x + contentRect.width / 2, cy: contentRect.y + contentRect.height / 2, scale: 1 }\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 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(() => {\n startAnimation();\n });\n\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) {\n addOpen(closeBtn);\n }\n \n if (many) {\n if (allowFsArrows) {\n if (leftCh) {\n addOpen(leftCh);\n }\n if (rightCh) {\n addOpen(rightCh);\n }\n }\n\n if (ctr) {\n addOpen(ctr);\n }\n \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) => requestAnimationFrame(() => requestAnimationFrame(r)));\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 shieldCleanupRef.current?.();\n shieldCleanupRef.current = null;\n });\n };\n dup.addEventListener('transitionend', onEnd, { once: true });\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 slideCount = slides.current?.length ?? 0;\n const atFirst = !wrap && selectedIndex.current <= 0;\n const atLast = !wrap && selectedIndex.current >= Math.max(0, slideCount - 1);\n\n const clientMain = slider.current ? ((slider.current as any)[AX.clientKey] as number) : 0;\n\n const arrowsAutoHidden =\n !(imageCount > 1 && slider.current && (sliderWidth.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 dotsAutoHidden = !!(slider.current && (sliderWidth.current <= clientMain));\n const dotsHidden = !showDots || dotsAutoHidden;\n\n const Arrow = ({\n direction,\n size = 32,\n }: {\n direction: \"prev\" | \"next\";\n size?: number;\n }) => {\n if (AX.main === \"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={{\n transform: \"rotate(90deg)\",\n transformOrigin: \"50% 50%\",\n }}\n >\n {direction === \"prev\" ? (\n <path d=\"M15.41 16.59L10.83 12l4.58-4.59L14 6l-6 6 6 6z\" />\n ) : (\n <path d=\"M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6z\" />\n )}\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\" ? (\n <path d=\"M15.41 16.59L10.83 12l4.58-4.59L14 6l-6 6 6 6z\" />\n ) : (\n <path d=\"M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6z\" />\n )}\n </svg>\n );\n };\n\n const 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\n function prevPlacement(): React.CSSProperties {\n return AX.main === \"y\"\n ? { left: \"50%\", top: 10, transform: \"translateX(-50%)\" }\n : { left: 10, top: \"50%\", transform: \"translateY(-50%)\" };\n }\n function nextPlacement(): React.CSSProperties {\n return AX.main === \"y\"\n ? { left: \"50%\", bottom: 10, transform: \"translateX(-50%)\" }\n : { right: 10, top: \"50%\", transform: \"translateY(-50%)\" };\n }\n\n function makeArrowOnClick(\n dir: \"prev\" | \"next\",\n hidden: boolean\n ) {\n return () => {\n if (hidden) return;\n requestAnimationFrame(() => {\n if (dir === \"prev\") previous();\n else next();\n });\n };\n }\n\n const prevArrowStylesEffective = {\n ...(arrowStyles ?? {}),\n ...(prevArrowStyles ?? {}),\n };\n\n const nextArrowStylesEffective = {\n ...(arrowStyles ?? {}),\n ...(nextArrowStyles ?? {}),\n };\n\n const prevArrowClassNameEffective = [\n arrowClassName,\n prevArrowClassName,\n ].filter(Boolean).join(\" \");\n\n const nextArrowClassNameEffective = [\n arrowClassName,\n nextArrowClassName,\n ].filter(Boolean).join(\" \");\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\n const placement = dir === \"prev\" ? prevPlacement() : nextPlacement();\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 <Arrow 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\n if (renderArrows) return renderArrows({ ...args, dir });\n\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 const DefaultDots = ({\n ref, count, activeIndex, hidden, goTo, getDotRef, classNameContainer, classNameDot\n }: DotsRenderArgs) => {\n const pos: React.CSSProperties = 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 const el = (e.currentTarget as HTMLElement);\n createRipple(el);\n }}\n onClick={() => goTo(index)}\n className={`${styles.pagination_dot} ${isActive ? styles.active : styles.inactive} rmgDot ${classNameDot ?? \"\"}`}\n style={{\n ...dotsStyles\n }}\n />\n );\n })}\n </div>\n );\n };\n\n const dotsNode = (renderDots ?? DefaultDots)({\n ref: dotsContainerRef,\n count: slides.current?.length ?? 0,\n activeIndex: selectedIndex.current,\n hidden: dotsHidden,\n goTo: (i) => {\n isScrolling.current = false;\n requestAnimationFrame(() => goToIndex(i));\n },\n getDotRef: (i) => (el) => { dotRefs.current[i] = el; },\n createRipple,\n classNameContainer: dotsContainerClassName,\n classNameDot: dotsClassName,\n });\n\n const 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\n function clamp01(n: number) { return Math.max(0, Math.min(1, n)); }\n\n function setProgressDom(p: number) {\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 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\n function updateProgressInFrame() {\n const track = slider.current;\n const content = sliderWidth.current || 0;\n if (!track) { setProgressDom(0); return; }\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) { setProgressDom(1); return; }\n const loc = -(offsetLocationRef.current?.get() ?? 0);\n setProgressDom(Math.min(1, Math.max(0, loc / max)));\n } else {\n const W = sliderWidth.current || 0;\n if (W <= 0) { setProgressDom(0); return; }\n const world = ((-(offsetLocationRef.current?.get() ?? 0) % W) + W) % W;\n setProgressDom(Math.round(world) === Math.round(W) ? 0 : world / W);\n }\n }\n\n const progressHiddenAuto = false;\n const progressHidden = !(showProgress ?? false) || progressHiddenAuto;\n\n const progressNode = (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 });\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 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\n 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 }\n\n 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 }\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 {prevArrowNode}\n {nextArrowNode}\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\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}","export type IndexMode = 'instant' | 'animated';\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}","/* --- 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.entryMediaGrid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));\n gap: 0.75rem;\n}\n\n.entryMediaGrid img {\n cursor: pointer;\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 * 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});","/* 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 } from '.'\n\ntype WindowType = Window & typeof globalThis\n\nconst mathAbs = Math.abs\nconst clamp = (n: number, lo: number, hi: number) => Math.max(lo, Math.min(hi, n))\n\ntype 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 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\nfunction 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\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\ntype AxisKey = 'x' | 'y'\nfunction 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}\ntype AxisType = ReturnType<typeof Axis>\n\nfunction DragTracker(axis: AxisType, ownerWindow: WindowType) {\n return createDragTracker({\n ownerWindow,\n axis,\n })\n}\n\ntype ResponsiveNumber =\n | number\n | string\n | Record<string | number, number | string>\n | [ResponsiveNumber];\n\ntype BreakpointMap = Record<string, number>;\n\ntype LoadingRenderArgs = { layout: 'thumbnails'; count: number };\ntype IntroRenderArgs = {\n active: boolean;\n containerProps: React.HTMLAttributes<HTMLDivElement>;\n};\n\nexport type ThumbnailPosition = 'top' | 'right' | 'bottom' | 'left'\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\n const isRtl = direction === 'rtl' ? true : false\n const sign = isHorizontal && isRtl ? -1 : 1;\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 const containerRef = useRef<HTMLDivElement | null>(null)\n const trackRef = useRef<HTMLDivElement | null>(null)\n\n const scopeId = useId().replace(/:/g, \"-\");\n\n const channelRef = useRef(indexChannel ?? createIndexChannel())\n\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\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\n const prevButtonRef = useRef<HTMLDivElement>(null)\n const nextButtonRef = useRef<HTMLDivElement>(null)\n\n type Page = {\n startIndex: number\n endIndex: number\n targetScroll: number\n }\n\n const pagesRef = useRef<Page[]>([])\n\n type SnapMode = 'thumb' | 'base'\n const snapModeRef = useRef<SnapMode>('base')\n\n const pointerDownRef = useRef(false)\n const isPointerDown = useRef(false)\n const isClickRef = useRef(true)\n const xRef = useRef(0)\n\n const dragX = useRef(0)\n const previousDragX = useRef(0)\n const dragMoveTime = useRef<Date | null>(null)\n const sliderVelocity = useRef(0)\n\n const selectedIndexRef = useRef<number>(channelRef.current.get().index ?? 0)\n\n const rawKids = Children.toArray(children).filter(isValidElement) as ReactElement<ThumbnailSliderProps>[]\n const count = rawKids.length\n\n const baseOffsetRef = useRef(0);\n\n const downTargetRef = useRef<EventTarget | null>(null)\n\n const [inView, setInView] = useState(false);\n\n const [isReady, setIsReady] = useState(false);\n const readyRafRef = useRef<number | null>(null);\n const readyPaintedRef = useRef(false);\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 const contentSizeRef = useRef(0)\n const loopLimitRef = useRef<ReturnType<typeof Limit> | null>(null)\n\n type BaseScrollTo = {\n distance: (n: number, snap: boolean) => void\n index: (n: number, direction: number) => void\n }\n\n const scrollSnapsRef = useRef<number[]>([])\n const scrollContentSizeRef = useRef(0)\n\n 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\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\n 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 }\n\n type CounterType = {\n get: () => number\n set: (n: number) => CounterType\n add: (n: number) => CounterType\n clone: () => CounterType\n }\n\n 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 }\n\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\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 const visibleThumbsRef = useRef(1)\n\n type ThumbLayoutItem = { el: HTMLElement; start: number; end: number; size: number }\n const layoutRef = useRef<{ originals: ThumbLayoutItem[]; cw: number } | null>(null)\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 const thumbCells = useRef<{ element: HTMLElement; index: number }[]>([]);\n\n const [clonedChildren, setClonedChildren] = useState<ReactElement<any>[]>([]);\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 const lastCloneSigRef = useRef<string>('');\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 type Slide = { target: number; cells: { element: HTMLElement; index: number }[] }\n\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\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 const prevActiveRef = useRef<number>(-1)\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 const draggingAttr = 'data-rmg-drag';\n const activePointerIdRef = useRef<number | null>(null);\n const guardsStoreRef = useRef<ReturnType<typeof EventStore> | null>(null);\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 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\n function normalizeResponsiveToMinWidthRules(\n value: any,\n fallback: number,\n breakpointMap: Record<string, number>\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 = breakpointMap[key] ?? (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 }\n\n function buildScopedSkeletonCountCss(args: {\n scopeId: string;\n responsiveCount: any;\n fallbackCount: number;\n breakpointMap: Record<string, number>;\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 const clamp = (n: number) => Math.max(0, Math.min(maxSlots, Math.floor(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 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 }\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 slideCount = slidesRef.current?.length ?? 0;\n const atFirst = !wrap && selectedIndexRef.current <= 0;\n const atLast = !wrap && selectedIndexRef.current >= Math.max(0, slideCount - 1);\n\n const clientMain = trackRef.current ? (trackRef.current as any)[AX.clientKey] as number : 0;\n\n const arrowsAutoHidden =\n !(count > 1 && trackRef.current && (sliderWidth.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 Arrow = ({ direction, size = 32 }: { direction: 'prev' | 'next'; size?: number }) => {\n if (AX.main === 'y') {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"#000\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden style={{ transform: 'rotate(90deg)', transformOrigin: '50% 50%' }}>\n {direction === 'prev'\n ? <path d=\"M15.41 16.59L10.83 12l4.58-4.59L14 6l-6 6 6 6z\" />\n : <path d=\"M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6z\" />\n }\n </svg>\n );\n }\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"#000\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden>\n {direction === 'prev'\n ? <path d=\"M15.41 16.59L10.83 12l4.58-4.59L14 6l-6 6 6 6z\" />\n : <path d=\"M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6z\" />\n }\n </svg>\n );\n };\n\n const 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\n function prevPlacement(): React.CSSProperties {\n return AX.main === 'y'\n ? { left: '50%', top: 10, transform: 'translateX(-50%)' }\n : { left: 10, top: '50%', transform: 'translateY(-50%)' };\n }\n function nextPlacement(): React.CSSProperties {\n return AX.main === 'y'\n ? { left: '50%', bottom: 10, transform: 'translateX(-50%)' }\n : { right: 10, top: '50%', transform: 'translateY(-50%)' };\n }\n\n function makeArrowOnClick(\n dir: \"prev\" | \"next\",\n hidden: boolean\n ) {\n return () => {\n if (hidden) return;\n requestAnimationFrame(() => {\n if (dir === \"prev\") previous();\n else next();\n });\n };\n }\n\n const prevArrowStylesEffective = {\n ...(arrowStyles ?? {}),\n ...(prevArrowStyles ?? {}),\n };\n \n const nextArrowStylesEffective = {\n ...(arrowStyles ?? {}),\n ...(nextArrowStyles ?? {}),\n };\n\n const prevArrowClassNameEffective = [\n arrowClassName,\n prevArrowClassName,\n ].filter(Boolean).join(\" \");\n\n const nextArrowClassNameEffective = [\n arrowClassName,\n nextArrowClassName,\n ].filter(Boolean).join(\" \");\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\n const placement = dir === \"prev\" ? prevPlacement() : nextPlacement();\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 <Arrow 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\n if (renderArrows) return renderArrows({ ...args, dir });\n\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 const inner = (\n <>\n {prevArrowNode}\n {nextArrowNode}\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, { ThumbnailPosition } from './ThumbnailSlider'\nimport createIndexChannel from './sliderSub'\nimport type { FullscreenSliderSub } from './fullscreenSliderSub'\nimport { BreakpointMap } from '.'\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}","'use client';\n\nimport * as React from 'react';\nimport type { APITypes } from 'plyr-react';\nimport { Plyr } from './shared/LazyPlyr';\nimport { useRmgSlide } from './shared/slideContext';\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\n source?: any;\n sourceBuilder?: RmgPlyrSourceBuilder;\n options?: RmgPlyrOptionsResolver;\n\n className?: string;\n style?: React.CSSProperties;\n\n posterClassName?: string;\n posterStyle?: React.CSSProperties;\n\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\nfunction detectProvider(source: any, srcFallback: string): 'youtube' | 'vimeo' | 'mp4' | 'other' {\n const provider = String(source?.sources?.[0]?.provider ?? '').toLowerCase();\n\n if (provider === 'youtube') return 'youtube';\n if (provider === 'vimeo') return 'vimeo';\n\n const src0 = String(source?.sources?.[0]?.src ?? '').toLowerCase();\n const fb = String(srcFallback ?? '').toLowerCase();\n\n const looksMp4 = src0.endsWith('.mp4') || fb.endsWith('.mp4') || src0.includes('.mp4?') || fb.includes('.mp4?');\n if (looksMp4) return 'mp4';\n\n return 'other';\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, props.src);\n\n 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 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 }\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":["React","useState","useEffect","useRef","createRef","useLayoutEffect","useCallback","useMemo","useImperativeHandle","lastT","mathAbs","index","mathAbs","x","len","direction","y","target","indexCurrent","indexPrevious","body","allowedForce","force","fsScrollTo","next","mode","FullscreenSlider_default","useEffect","jsx","useEffect","imageCount","url","useRef","useEffect","Children","useCallback","useImperativeHandle","forwardRef","React","jsx","jsx","mathAbs","Translate","isMouseEvent","DragTracker","forwardRef","Slider","useRef","useEffect","loop","scopeId","next","Children","i","data","cw","direction","target","indexCurrent","indexPrevious","body","ref","allowedForce","force","len","dirIndex","nextIndex","dirBump","baseScrollTo","loc","useCallback","clamp01","useImperativeHandle","slideCount","atFirst","atLast","insetForRect","item","imageCount","isRtl","axis","inner","parseNumberLike","breakpointMap","clamp","Slider_default","React","jsx","Children","cloneElement","isValidElement","useCallback","useEffect","useId","useMemo","useRef","useState","Fragment","jsx","jsxs","mathAbs","Translate","isMouseEvent","Axis","DragTracker","useMemo","useRef","useId","useState","Children","isValidElement","useEffect","root","loop","next","cloneElement","rawKids","count","container","i","data","cw","scopeId","style","direction","target","indexCurrent","indexPrevious","body","allowedForce","force","len","dirIndex","nextIndex","dirBump","baseScrollTo","parseNumberLike","breakpointMap","fallbackCount","clamp","useCallback","className","useEffect","useMemo","useRef","jsx","useRef","useEffect","useMemo","createRoot","flushSync","Fragment","jsx","jsxs","useState","useRef","useEffect","Axis","isMouseEvent","DragTracker","useMemo","useCallback","useLayoutEffect","React","Gallery","fs","root","internals","createRoot","viewportWidth","cells","clamp","useImperativeHandle","remove","vw","insetForRect","item","startAnimation","flushSync","isRtl","ref","px","nearView","everInView","entries","setEntryRef","decodedReady","Slider_default","container","detectProvider","createRef","isMouse","isClick","FullscreenSlider_default","Gallery_default","jsx"]}