{"version":3,"file":"scrollIndicator-BdzEuwZU.js","sources":["../../node_modules/.pnpm/framer-motion@11.11.9_react-dom@18.3.1_react@18.3.1/node_modules/framer-motion/dist/es/render/dom/resize/handle-element.mjs","../../node_modules/.pnpm/framer-motion@11.11.9_react-dom@18.3.1_react@18.3.1/node_modules/framer-motion/dist/es/render/dom/resize/handle-window.mjs","../../node_modules/.pnpm/framer-motion@11.11.9_react-dom@18.3.1_react@18.3.1/node_modules/framer-motion/dist/es/render/dom/resize/index.mjs","../../node_modules/.pnpm/framer-motion@11.11.9_react-dom@18.3.1_react@18.3.1/node_modules/framer-motion/dist/es/render/dom/scroll/info.mjs","../../node_modules/.pnpm/framer-motion@11.11.9_react-dom@18.3.1_react@18.3.1/node_modules/framer-motion/dist/es/render/dom/scroll/offsets/inset.mjs","../../node_modules/.pnpm/framer-motion@11.11.9_react-dom@18.3.1_react@18.3.1/node_modules/framer-motion/dist/es/render/dom/scroll/offsets/presets.mjs","../../node_modules/.pnpm/framer-motion@11.11.9_react-dom@18.3.1_react@18.3.1/node_modules/framer-motion/dist/es/render/dom/scroll/offsets/edge.mjs","../../node_modules/.pnpm/framer-motion@11.11.9_react-dom@18.3.1_react@18.3.1/node_modules/framer-motion/dist/es/render/dom/scroll/offsets/offset.mjs","../../node_modules/.pnpm/framer-motion@11.11.9_react-dom@18.3.1_react@18.3.1/node_modules/framer-motion/dist/es/render/dom/scroll/offsets/index.mjs","../../node_modules/.pnpm/framer-motion@11.11.9_react-dom@18.3.1_react@18.3.1/node_modules/framer-motion/dist/es/render/dom/scroll/on-scroll-handler.mjs","../../node_modules/.pnpm/framer-motion@11.11.9_react-dom@18.3.1_react@18.3.1/node_modules/framer-motion/dist/es/render/dom/scroll/track.mjs","../../node_modules/.pnpm/framer-motion@11.11.9_react-dom@18.3.1_react@18.3.1/node_modules/framer-motion/dist/es/render/dom/scroll/observe.mjs","../../node_modules/.pnpm/framer-motion@11.11.9_react-dom@18.3.1_react@18.3.1/node_modules/framer-motion/dist/es/render/dom/scroll/index.mjs","../../src/scripts/modules/scrollIndicator.ts"],"sourcesContent":["import { resolveElements } from '../utils/resolve-element.mjs';\n\nconst resizeHandlers = new WeakMap();\nlet observer;\nfunction getElementSize(target, borderBoxSize) {\n if (borderBoxSize) {\n const { inlineSize, blockSize } = borderBoxSize[0];\n return { width: inlineSize, height: blockSize };\n }\n else if (target instanceof SVGElement && \"getBBox\" in target) {\n return target.getBBox();\n }\n else {\n return {\n width: target.offsetWidth,\n height: target.offsetHeight,\n };\n }\n}\nfunction notifyTarget({ target, contentRect, borderBoxSize, }) {\n var _a;\n (_a = resizeHandlers.get(target)) === null || _a === void 0 ? void 0 : _a.forEach((handler) => {\n handler({\n target,\n contentSize: contentRect,\n get size() {\n return getElementSize(target, borderBoxSize);\n },\n });\n });\n}\nfunction notifyAll(entries) {\n entries.forEach(notifyTarget);\n}\nfunction createResizeObserver() {\n if (typeof ResizeObserver === \"undefined\")\n return;\n observer = new ResizeObserver(notifyAll);\n}\nfunction resizeElement(target, handler) {\n if (!observer)\n createResizeObserver();\n const elements = resolveElements(target);\n elements.forEach((element) => {\n let elementHandlers = resizeHandlers.get(element);\n if (!elementHandlers) {\n elementHandlers = new Set();\n resizeHandlers.set(element, elementHandlers);\n }\n elementHandlers.add(handler);\n observer === null || observer === void 0 ? void 0 : observer.observe(element);\n });\n return () => {\n elements.forEach((element) => {\n const elementHandlers = resizeHandlers.get(element);\n elementHandlers === null || elementHandlers === void 0 ? void 0 : elementHandlers.delete(handler);\n if (!(elementHandlers === null || elementHandlers === void 0 ? void 0 : elementHandlers.size)) {\n observer === null || observer === void 0 ? void 0 : observer.unobserve(element);\n }\n });\n };\n}\n\nexport { resizeElement };\n","const windowCallbacks = new Set();\nlet windowResizeHandler;\nfunction createWindowResizeHandler() {\n windowResizeHandler = () => {\n const size = {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n const info = {\n target: window,\n size,\n contentSize: size,\n };\n windowCallbacks.forEach((callback) => callback(info));\n };\n window.addEventListener(\"resize\", windowResizeHandler);\n}\nfunction resizeWindow(callback) {\n windowCallbacks.add(callback);\n if (!windowResizeHandler)\n createWindowResizeHandler();\n return () => {\n windowCallbacks.delete(callback);\n if (!windowCallbacks.size && windowResizeHandler) {\n windowResizeHandler = undefined;\n }\n };\n}\n\nexport { resizeWindow };\n","import { resizeElement } from './handle-element.mjs';\nimport { resizeWindow } from './handle-window.mjs';\n\nfunction resize(a, b) {\n return typeof a === \"function\" ? resizeWindow(a) : resizeElement(a, b);\n}\n\nexport { resize };\n","import { progress } from '../../../utils/progress.mjs';\nimport { velocityPerSecond } from '../../../utils/velocity-per-second.mjs';\n\n/**\n * A time in milliseconds, beyond which we consider the scroll velocity to be 0.\n */\nconst maxElapsed = 50;\nconst createAxisInfo = () => ({\n current: 0,\n offset: [],\n progress: 0,\n scrollLength: 0,\n targetOffset: 0,\n targetLength: 0,\n containerLength: 0,\n velocity: 0,\n});\nconst createScrollInfo = () => ({\n time: 0,\n x: createAxisInfo(),\n y: createAxisInfo(),\n});\nconst keys = {\n x: {\n length: \"Width\",\n position: \"Left\",\n },\n y: {\n length: \"Height\",\n position: \"Top\",\n },\n};\nfunction updateAxisInfo(element, axisName, info, time) {\n const axis = info[axisName];\n const { length, position } = keys[axisName];\n const prev = axis.current;\n const prevTime = info.time;\n axis.current = element[`scroll${position}`];\n axis.scrollLength = element[`scroll${length}`] - element[`client${length}`];\n axis.offset.length = 0;\n axis.offset[0] = 0;\n axis.offset[1] = axis.scrollLength;\n axis.progress = progress(0, axis.scrollLength, axis.current);\n const elapsed = time - prevTime;\n axis.velocity =\n elapsed > maxElapsed\n ? 0\n : velocityPerSecond(axis.current - prev, elapsed);\n}\nfunction updateScrollInfo(element, info, time) {\n updateAxisInfo(element, \"x\", info, time);\n updateAxisInfo(element, \"y\", info, time);\n info.time = time;\n}\n\nexport { createScrollInfo, updateScrollInfo };\n","function calcInset(element, container) {\n const inset = { x: 0, y: 0 };\n let current = element;\n while (current && current !== container) {\n if (current instanceof HTMLElement) {\n inset.x += current.offsetLeft;\n inset.y += current.offsetTop;\n current = current.offsetParent;\n }\n else if (current.tagName === \"svg\") {\n /**\n * This isn't an ideal approach to measuring the offset of tags.\n * It would be preferable, given they behave like HTMLElements in most ways\n * to use offsetLeft/Top. But these don't exist on . Likewise we\n * can't use .getBBox() like most SVG elements as these provide the offset\n * relative to the SVG itself, which for is usually 0x0.\n */\n const svgBoundingBox = current.getBoundingClientRect();\n current = current.parentElement;\n const parentBoundingBox = current.getBoundingClientRect();\n inset.x += svgBoundingBox.left - parentBoundingBox.left;\n inset.y += svgBoundingBox.top - parentBoundingBox.top;\n }\n else if (current instanceof SVGGraphicsElement) {\n const { x, y } = current.getBBox();\n inset.x += x;\n inset.y += y;\n let svg = null;\n let parent = current.parentNode;\n while (!svg) {\n if (parent.tagName === \"svg\") {\n svg = parent;\n }\n parent = current.parentNode;\n }\n current = svg;\n }\n else {\n break;\n }\n }\n return inset;\n}\n\nexport { calcInset };\n","const ScrollOffset = {\n Enter: [\n [0, 1],\n [1, 1],\n ],\n Exit: [\n [0, 0],\n [1, 0],\n ],\n Any: [\n [1, 0],\n [0, 1],\n ],\n All: [\n [0, 0],\n [1, 1],\n ],\n};\n\nexport { ScrollOffset };\n","const namedEdges = {\n start: 0,\n center: 0.5,\n end: 1,\n};\nfunction resolveEdge(edge, length, inset = 0) {\n let delta = 0;\n /**\n * If we have this edge defined as a preset, replace the definition\n * with the numerical value.\n */\n if (edge in namedEdges) {\n edge = namedEdges[edge];\n }\n /**\n * Handle unit values\n */\n if (typeof edge === \"string\") {\n const asNumber = parseFloat(edge);\n if (edge.endsWith(\"px\")) {\n delta = asNumber;\n }\n else if (edge.endsWith(\"%\")) {\n edge = asNumber / 100;\n }\n else if (edge.endsWith(\"vw\")) {\n delta = (asNumber / 100) * document.documentElement.clientWidth;\n }\n else if (edge.endsWith(\"vh\")) {\n delta = (asNumber / 100) * document.documentElement.clientHeight;\n }\n else {\n edge = asNumber;\n }\n }\n /**\n * If the edge is defined as a number, handle as a progress value.\n */\n if (typeof edge === \"number\") {\n delta = length * edge;\n }\n return inset + delta;\n}\n\nexport { namedEdges, resolveEdge };\n","import { resolveEdge, namedEdges } from './edge.mjs';\n\nconst defaultOffset = [0, 0];\nfunction resolveOffset(offset, containerLength, targetLength, targetInset) {\n let offsetDefinition = Array.isArray(offset) ? offset : defaultOffset;\n let targetPoint = 0;\n let containerPoint = 0;\n if (typeof offset === \"number\") {\n /**\n * If we're provided offset: [0, 0.5, 1] then each number x should become\n * [x, x], so we default to the behaviour of mapping 0 => 0 of both target\n * and container etc.\n */\n offsetDefinition = [offset, offset];\n }\n else if (typeof offset === \"string\") {\n offset = offset.trim();\n if (offset.includes(\" \")) {\n offsetDefinition = offset.split(\" \");\n }\n else {\n /**\n * If we're provided a definition like \"100px\" then we want to apply\n * that only to the top of the target point, leaving the container at 0.\n * Whereas a named offset like \"end\" should be applied to both.\n */\n offsetDefinition = [offset, namedEdges[offset] ? offset : `0`];\n }\n }\n targetPoint = resolveEdge(offsetDefinition[0], targetLength, targetInset);\n containerPoint = resolveEdge(offsetDefinition[1], containerLength);\n return targetPoint - containerPoint;\n}\n\nexport { resolveOffset };\n","import { calcInset } from './inset.mjs';\nimport { ScrollOffset } from './presets.mjs';\nimport { resolveOffset } from './offset.mjs';\nimport { interpolate } from '../../../../utils/interpolate.mjs';\nimport { defaultOffset } from '../../../../utils/offsets/default.mjs';\n\nconst point = { x: 0, y: 0 };\nfunction getTargetSize(target) {\n return \"getBBox\" in target && target.tagName !== \"svg\"\n ? target.getBBox()\n : { width: target.clientWidth, height: target.clientHeight };\n}\nfunction resolveOffsets(container, info, options) {\n const { offset: offsetDefinition = ScrollOffset.All } = options;\n const { target = container, axis = \"y\" } = options;\n const lengthLabel = axis === \"y\" ? \"height\" : \"width\";\n const inset = target !== container ? calcInset(target, container) : point;\n /**\n * Measure the target and container. If they're the same thing then we\n * use the container's scrollWidth/Height as the target, from there\n * all other calculations can remain the same.\n */\n const targetSize = target === container\n ? { width: container.scrollWidth, height: container.scrollHeight }\n : getTargetSize(target);\n const containerSize = {\n width: container.clientWidth,\n height: container.clientHeight,\n };\n /**\n * Reset the length of the resolved offset array rather than creating a new one.\n * TODO: More reusable data structures for targetSize/containerSize would also be good.\n */\n info[axis].offset.length = 0;\n /**\n * Populate the offset array by resolving the user's offset definition into\n * a list of pixel scroll offets.\n */\n let hasChanged = !info[axis].interpolate;\n const numOffsets = offsetDefinition.length;\n for (let i = 0; i < numOffsets; i++) {\n const offset = resolveOffset(offsetDefinition[i], containerSize[lengthLabel], targetSize[lengthLabel], inset[axis]);\n if (!hasChanged && offset !== info[axis].interpolatorOffsets[i]) {\n hasChanged = true;\n }\n info[axis].offset[i] = offset;\n }\n /**\n * If the pixel scroll offsets have changed, create a new interpolator function\n * to map scroll value into a progress.\n */\n if (hasChanged) {\n info[axis].interpolate = interpolate(info[axis].offset, defaultOffset(offsetDefinition));\n info[axis].interpolatorOffsets = [...info[axis].offset];\n }\n info[axis].progress = info[axis].interpolate(info[axis].current);\n}\n\nexport { resolveOffsets };\n","import { warnOnce } from '../../../utils/warn-once.mjs';\nimport { updateScrollInfo } from './info.mjs';\nimport { resolveOffsets } from './offsets/index.mjs';\n\nfunction measure(container, target = container, info) {\n /**\n * Find inset of target within scrollable container\n */\n info.x.targetOffset = 0;\n info.y.targetOffset = 0;\n if (target !== container) {\n let node = target;\n while (node && node !== container) {\n info.x.targetOffset += node.offsetLeft;\n info.y.targetOffset += node.offsetTop;\n node = node.offsetParent;\n }\n }\n info.x.targetLength =\n target === container ? target.scrollWidth : target.clientWidth;\n info.y.targetLength =\n target === container ? target.scrollHeight : target.clientHeight;\n info.x.containerLength = container.clientWidth;\n info.y.containerLength = container.clientHeight;\n /**\n * In development mode ensure scroll containers aren't position: static as this makes\n * it difficult to measure their relative positions.\n */\n if (process.env.NODE_ENV !== \"production\") {\n if (container && target && target !== container) {\n warnOnce(getComputedStyle(container).position !== \"static\", \"Please ensure that the container has a non-static position, like 'relative', 'fixed', or 'absolute' to ensure scroll offset is calculated correctly.\");\n }\n }\n}\nfunction createOnScrollHandler(element, onScroll, info, options = {}) {\n return {\n measure: () => measure(element, options.target, info),\n update: (time) => {\n updateScrollInfo(element, info, time);\n if (options.offset || options.target) {\n resolveOffsets(element, info, options);\n }\n },\n notify: () => onScroll(info),\n };\n}\n\nexport { createOnScrollHandler };\n","import { resize } from '../resize/index.mjs';\nimport { createScrollInfo } from './info.mjs';\nimport { createOnScrollHandler } from './on-scroll-handler.mjs';\nimport { frame, cancelFrame, frameData } from '../../../frameloop/frame.mjs';\n\nconst scrollListeners = new WeakMap();\nconst resizeListeners = new WeakMap();\nconst onScrollHandlers = new WeakMap();\nconst getEventTarget = (element) => element === document.documentElement ? window : element;\nfunction scrollInfo(onScroll, { container = document.documentElement, ...options } = {}) {\n let containerHandlers = onScrollHandlers.get(container);\n /**\n * Get the onScroll handlers for this container.\n * If one isn't found, create a new one.\n */\n if (!containerHandlers) {\n containerHandlers = new Set();\n onScrollHandlers.set(container, containerHandlers);\n }\n /**\n * Create a new onScroll handler for the provided callback.\n */\n const info = createScrollInfo();\n const containerHandler = createOnScrollHandler(container, onScroll, info, options);\n containerHandlers.add(containerHandler);\n /**\n * Check if there's a scroll event listener for this container.\n * If not, create one.\n */\n if (!scrollListeners.has(container)) {\n const measureAll = () => {\n for (const handler of containerHandlers)\n handler.measure();\n };\n const updateAll = () => {\n for (const handler of containerHandlers) {\n handler.update(frameData.timestamp);\n }\n };\n const notifyAll = () => {\n for (const handler of containerHandlers)\n handler.notify();\n };\n const listener = () => {\n frame.read(measureAll, false, true);\n frame.read(updateAll, false, true);\n frame.update(notifyAll, false, true);\n };\n scrollListeners.set(container, listener);\n const target = getEventTarget(container);\n window.addEventListener(\"resize\", listener, { passive: true });\n if (container !== document.documentElement) {\n resizeListeners.set(container, resize(container, listener));\n }\n target.addEventListener(\"scroll\", listener, { passive: true });\n }\n const listener = scrollListeners.get(container);\n frame.read(listener, false, true);\n return () => {\n var _a;\n cancelFrame(listener);\n /**\n * Check if we even have any handlers for this container.\n */\n const currentHandlers = onScrollHandlers.get(container);\n if (!currentHandlers)\n return;\n currentHandlers.delete(containerHandler);\n if (currentHandlers.size)\n return;\n /**\n * If no more handlers, remove the scroll listener too.\n */\n const scrollListener = scrollListeners.get(container);\n scrollListeners.delete(container);\n if (scrollListener) {\n getEventTarget(container).removeEventListener(\"scroll\", scrollListener);\n (_a = resizeListeners.get(container)) === null || _a === void 0 ? void 0 : _a();\n window.removeEventListener(\"resize\", scrollListener);\n }\n };\n}\n\nexport { scrollInfo };\n","import { frame, cancelFrame } from '../../../frameloop/frame.mjs';\n\nfunction observeTimeline(update, timeline) {\n let prevProgress;\n const onFrame = () => {\n const { currentTime } = timeline;\n const percentage = currentTime === null ? 0 : currentTime.value;\n const progress = percentage / 100;\n if (prevProgress !== progress) {\n update(progress);\n }\n prevProgress = progress;\n };\n frame.update(onFrame, true);\n return () => cancelFrame(onFrame);\n}\n\nexport { observeTimeline };\n","import { scrollInfo } from './track.mjs';\nimport { observeTimeline } from './observe.mjs';\nimport { supportsScrollTimeline } from './supports.mjs';\n\nfunction scrollTimelineFallback({ source, container, axis = \"y\", }) {\n // Support legacy source argument. Deprecate later.\n if (source)\n container = source;\n // ScrollTimeline records progress as a percentage CSSUnitValue\n const currentTime = { value: 0 };\n const cancel = scrollInfo((info) => {\n currentTime.value = info[axis].progress * 100;\n }, { container, axis });\n return { currentTime, cancel };\n}\nconst timelineCache = new Map();\nfunction getTimeline({ source, container = document.documentElement, axis = \"y\", } = {}) {\n // Support legacy source argument. Deprecate later.\n if (source)\n container = source;\n if (!timelineCache.has(container)) {\n timelineCache.set(container, {});\n }\n const elementCache = timelineCache.get(container);\n if (!elementCache[axis]) {\n elementCache[axis] = supportsScrollTimeline()\n ? new ScrollTimeline({ source: container, axis })\n : scrollTimelineFallback({ source: container, axis });\n }\n return elementCache[axis];\n}\n/**\n * If the onScroll function has two arguments, it's expecting\n * more specific information about the scroll from scrollInfo.\n */\nfunction isOnScrollWithInfo(onScroll) {\n return onScroll.length === 2;\n}\n/**\n * Currently, we only support element tracking with `scrollInfo`, though in\n * the future we can also offer ViewTimeline support.\n */\nfunction needsElementTracking(options) {\n return options && (options.target || options.offset);\n}\nfunction scrollFunction(onScroll, options) {\n if (isOnScrollWithInfo(onScroll) || needsElementTracking(options)) {\n return scrollInfo((info) => {\n onScroll(info[options.axis].progress, info);\n }, options);\n }\n else {\n return observeTimeline(onScroll, getTimeline(options));\n }\n}\nfunction scrollAnimation(animation, options) {\n if (needsElementTracking(options)) {\n animation.pause();\n return scrollInfo((info) => {\n animation.time = animation.duration * info[options.axis].progress;\n }, options);\n }\n else {\n const timeline = getTimeline(options);\n return animation.attachTimeline(timeline, (valueAnimation) => {\n valueAnimation.pause();\n return observeTimeline((progress) => {\n valueAnimation.time = valueAnimation.duration * progress;\n }, timeline);\n });\n }\n}\nfunction scroll(onScroll, { axis = \"y\", ...options } = {}) {\n const optionsWithDefaults = { axis, ...options };\n return typeof onScroll === \"function\"\n ? scrollFunction(onScroll, optionsWithDefaults)\n : scrollAnimation(onScroll, optionsWithDefaults);\n}\n\nexport { scroll };\n","import { Component } from '@verndale/core';\nimport { scroll } from 'framer-motion/dom';\nimport { debounce } from '../helpers';\n\nclass ScrollIndicator extends Component {\n private barHeight: number = 0;\n private resizeObserver: ResizeObserver = new ResizeObserver(() => {});\n\n constructor(el: HTMLElement) {\n super(el);\n\n if (!this.dom.$footer) {\n this.el.style.display = 'none';\n console.warn('WARNING: No footer element found. Scroll indicator hidden.');\n return;\n }\n\n this.initBar();\n scroll((progress: number) => this.handleScroll(progress as number));\n this.addResizeObserver();\n }\n\n addListeners() {\n if (this.dom.$footer) window.addEventListener('resize', debounce(this.initBar.bind(this), 250));\n }\n\n setupDefaults() {\n this.dom = {\n el: this.el,\n $bar: this.el.querySelector('.scroll-indicator__bar') as HTMLElement,\n $dot: this.el.querySelector('.scroll-indicator__dot') as HTMLElement,\n $footer: document.querySelector('.footer') as HTMLElement\n };\n }\n\n addResizeObserver() {\n this.resizeObserver = new ResizeObserver(entries => {\n for (const entry of entries) {\n if (entry.target === document.body && entry.contentRect) {\n this.initBar();\n }\n }\n });\n this.resizeObserver.observe(document.body);\n }\n\n handleResize() {\n debounce(this.initBar, 250);\n }\n\n initBar() {\n if (!this.dom) return;\n\n const bar = this.dom.$bar as HTMLDivElement;\n const footer = this.dom.$footer as HTMLDivElement;\n const footerRect = footer.getBoundingClientRect();\n const barRect = bar.getBoundingClientRect();\n let barHeight = footerRect.top - barRect.top;\n const remainder = barHeight % 6;\n barHeight -= remainder;\n\n bar.style.blockSize = `${barHeight}px`;\n\n this.barHeight = barHeight;\n }\n\n handleScroll = (progress: number) => {\n const dot = this.dom.$dot as HTMLDivElement;\n dot.style.insetBlockStart = `${Math.ceil(progress * this.barHeight)}px`;\n };\n\n componentWillUnmount() {\n this.resizeObserver.disconnect();\n }\n}\n\nexport default ScrollIndicator;\n"],"names":["resizeHandlers","observer","getElementSize","target","borderBoxSize","inlineSize","blockSize","notifyTarget","contentRect","_a","handler","notifyAll","entries","createResizeObserver","resizeElement","elements","resolveElements","element","elementHandlers","windowCallbacks","windowResizeHandler","createWindowResizeHandler","size","info","callback","resizeWindow","resize","a","b","maxElapsed","createAxisInfo","createScrollInfo","keys","updateAxisInfo","axisName","time","axis","length","position","prev","prevTime","progress","elapsed","velocityPerSecond","updateScrollInfo","calcInset","container","inset","current","svgBoundingBox","parentBoundingBox","x","y","svg","parent","ScrollOffset","namedEdges","resolveEdge","edge","delta","asNumber","defaultOffset","resolveOffset","offset","containerLength","targetLength","targetInset","offsetDefinition","targetPoint","containerPoint","point","getTargetSize","resolveOffsets","options","lengthLabel","targetSize","containerSize","hasChanged","numOffsets","i","interpolate","measure","node","createOnScrollHandler","onScroll","scrollListeners","resizeListeners","onScrollHandlers","getEventTarget","scrollInfo","containerHandlers","containerHandler","measureAll","updateAll","frameData","listener","frame","cancelFrame","currentHandlers","scrollListener","observeTimeline","update","timeline","prevProgress","onFrame","currentTime","scrollTimelineFallback","source","cancel","timelineCache","getTimeline","elementCache","supportsScrollTimeline","isOnScrollWithInfo","needsElementTracking","scrollFunction","scrollAnimation","animation","valueAnimation","scroll","optionsWithDefaults","ScrollIndicator","Component","el","__publicField","dot","debounce","entry","bar","footerRect","barRect","barHeight","remainder"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12]}