{"version":3,"file":"info.mjs","sources":["../../../../../src/render/dom/scroll/info.ts"],"sourcesContent":["import { clamp, progress, velocityPerSecond } from \"motion-utils\"\nimport { AxisScrollInfo, ScrollInfo } from \"./types\"\n\n/**\n * A time in milliseconds, beyond which we consider the scroll velocity to be 0.\n */\nconst maxElapsed = 50\n\nconst createAxisInfo = (): AxisScrollInfo => ({\n current: 0,\n offset: [],\n progress: 0,\n scrollLength: 0,\n targetOffset: 0,\n targetLength: 0,\n containerLength: 0,\n velocity: 0,\n})\n\nexport const createScrollInfo = (): ScrollInfo => ({\n time: 0,\n x: createAxisInfo(),\n y: createAxisInfo(),\n})\n\n/**\n * Also iterated with for...in as the list of axes.\n */\nexport const axisKeys = {\n x: {\n length: \"Width\",\n position: \"Left\",\n },\n y: {\n length: \"Height\",\n position: \"Top\",\n },\n} as const\n\nexport type Axis = keyof typeof axisKeys\n\nconst styles = new WeakMap()\n\n/**\n * Whether an axis scrolls from its end, which browsers report as a scroll\n * position running from 0 to -scrollLength (#3340). This is read from style\n * rather than the sign of the scroll position, as elastic overscroll pushes\n * the position past 0 in either kind of axis (#3791).\n */\nfunction isReversed(element: Element, axisName: Axis) {\n /**\n * The viewport takes its writing mode and direction from , which\n * not every browser reflects in the root element's computed style. It\n * doesn't adopt the root element's flex layout.\n */\n const isRoot = element === document.scrollingElement\n const source = (isRoot && document.body) || element\n\n let style = styles.get(source)\n if (!style) styles.set(source, (style = getComputedStyle(source)))\n\n const { writingMode, flexDirection } = style\n const isInline = (axisName === \"x\") !== /^[vs]/.test(writingMode)\n\n return (\n (isInline\n ? (style.direction === \"rtl\") !== (writingMode === \"sideways-lr\")\n : writingMode.endsWith(\"rl\")) !==\n /**\n * A reversed flex axis flips this. The main axis is the inline axis\n * unless flex-direction is a column.\n */\n (!isRoot &&\n style.display.includes(\"flex\") &&\n (isInline !== (flexDirection[0] === \"c\")\n ? flexDirection\n : style.flexWrap\n ).endsWith(\"reverse\"))\n )\n}\n\nfunction updateAxisInfo(\n element: Element,\n axisName: Axis,\n info: ScrollInfo,\n time: number\n) {\n const axis = info[axisName]\n const { length, position } = axisKeys[axisName]\n\n const prev = axis.current\n const prevTime = info.time\n\n const scrollPosition = element[`scroll${position}`]\n axis.current = isReversed(element, axisName)\n ? -scrollPosition || 0 // Avoid -0\n : scrollPosition\n axis.containerLength = element[`client${length}`]\n axis.targetLength = element[`scroll${length}`]\n axis.scrollLength = axis.targetLength - axis.containerLength\n\n axis.offset.length = 0\n axis.offset[0] = 0\n axis.offset[1] = axis.scrollLength\n axis.progress = clamp(0, 1, progress(0, axis.scrollLength, axis.current))\n\n const elapsed = time - prevTime\n axis.velocity =\n elapsed > maxElapsed\n ? 0\n : velocityPerSecond(axis.current - prev, elapsed)\n}\n\n/**\n * Measures a scroll container. Runs once per container per frame; every\n * handler on that container derives its info from the result.\n */\nexport function updateScrollInfo(\n element: Element,\n info: ScrollInfo,\n time: number\n) {\n for (const axis in axisKeys) {\n updateAxisInfo(element, axis as Axis, info, time)\n }\n info.time = time\n}\n"],"names":[],"mappings":";;AAGA;;AAEG;AACH,MAAM,UAAU,GAAG,EAAE;AAErB,MAAM,cAAc,GAAG,OAAuB;AAC1C,IAAA,OAAO,EAAE,CAAC;AACV,IAAA,MAAM,EAAE,EAAE;AACV,IAAA,QAAQ,EAAE,CAAC;AACX,IAAA,YAAY,EAAE,CAAC;AACf,IAAA,YAAY,EAAE,CAAC;AACf,IAAA,YAAY,EAAE,CAAC;AACf,IAAA,eAAe,EAAE,CAAC;AAClB,IAAA,QAAQ,EAAE,CAAC;AACd,CAAA,CAAC;AAEK,MAAM,gBAAgB,GAAG,OAAmB;AAC/C,IAAA,IAAI,EAAE,CAAC;IACP,CAAC,EAAE,cAAc,EAAE;IACnB,CAAC,EAAE,cAAc,EAAE;AACtB,CAAA;AAED;;AAEG;AACI,MAAM,QAAQ,GAAG;AACpB,IAAA,CAAC,EAAE;AACC,QAAA,MAAM,EAAE,OAAO;AACf,QAAA,QAAQ,EAAE,MAAM;AACnB,KAAA;AACD,IAAA,CAAC,EAAE;AACC,QAAA,MAAM,EAAE,QAAQ;AAChB,QAAA,QAAQ,EAAE,KAAK;AAClB,KAAA;;AAKL,MAAM,MAAM,GAAG,IAAI,OAAO,EAAgC;AAE1D;;;;;AAKG;AACH,SAAS,UAAU,CAAC,OAAgB,EAAE,QAAc,EAAA;AAChD;;;;AAIG;AACH,IAAA,MAAM,MAAM,GAAG,OAAO,KAAK,QAAQ,CAAC,gBAAgB;IACpD,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO;IAEnD,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AAC9B,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,EAAE;AAElE,IAAA,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,KAAK;AAC5C,IAAA,MAAM,QAAQ,GAAG,CAAC,QAAQ,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;IAEjE,QACI,CAAC;AACG,UAAE,CAAC,KAAK,CAAC,SAAS,KAAK,KAAK,OAAO,WAAW,KAAK,aAAa;AAChE,UAAE,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC;AAChC;;;AAGG;AACH,SAAC,CAAC,MAAM;AACJ,YAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC9B,CAAC,QAAQ,MAAM,aAAa,CAAC,CAAC,CAAC,KAAK,GAAG;AACnC,kBAAE;AACF,kBAAE,KAAK,CAAC,QAAQ,EAClB,QAAQ,CAAC,SAAS,CAAC,CAAC;AAElC;AAEA,SAAS,cAAc,CACnB,OAAgB,EAChB,QAAc,EACd,IAAgB,EAChB,IAAY,EAAA;AAEZ,IAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC3B,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC;AAE/C,IAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO;AACzB,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI;IAE1B,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,QAAQ,CAAA,CAAE,CAAC;IACnD,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,QAAQ;AACvC,UAAE,CAAC,cAAc,IAAI,CAAC;UACpB,cAAc;IACpB,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,CAAA,MAAA,EAAS,MAAM,CAAA,CAAE,CAAC;IACjD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,CAAA,MAAA,EAAS,MAAM,CAAA,CAAE,CAAC;IAC9C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe;AAE5D,IAAA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;AACtB,IAAA,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;IAClB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY;IAClC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;AAEzE,IAAA,MAAM,OAAO,GAAG,IAAI,GAAG,QAAQ;AAC/B,IAAA,IAAI,CAAC,QAAQ;AACT,QAAA,OAAO,GAAG;AACN,cAAE;cACA,iBAAiB,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC;AAC7D;AAEA;;;AAGG;SACa,gBAAgB,CAC5B,OAAgB,EAChB,IAAgB,EAChB,IAAY,EAAA;AAEZ,IAAA,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;QACzB,cAAc,CAAC,OAAO,EAAE,IAAY,EAAE,IAAI,EAAE,IAAI,CAAC;IACrD;AACA,IAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AACpB;;;;"}