{"version":3,"sources":["jsdelivr-header.js","/npm/@tanstack/virtual-core@3.13.10/src/utils.ts","/npm/@tanstack/virtual-core@3.13.10/src/index.ts"],"names":[],"mappings":"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","file":"/npm/@tanstack/virtual-core@3.13.10/dist/esm/index.js/+esm","sourceRoot":"","sourcesContent":["/**\n * Bundled by jsDelivr using Rollup v2.79.2 and Terser v5.39.0.\n * Original file: /npm/@tanstack/virtual-core@3.13.10/dist/esm/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","export type NoInfer<A extends any> = [A][A extends any ? 0 : never]\n\nexport type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\n\nexport function memo<TDeps extends ReadonlyArray<any>, TResult>(\n  getDeps: () => [...TDeps],\n  fn: (...args: NoInfer<[...TDeps]>) => TResult,\n  opts: {\n    key: false | string\n    debug?: () => boolean\n    onChange?: (result: TResult) => void\n    initialDeps?: TDeps\n  },\n) {\n  let deps = opts.initialDeps ?? []\n  let result: TResult | undefined\n\n  function memoizedFunction(): TResult {\n    let depTime: number\n    if (opts.key && opts.debug?.()) depTime = Date.now()\n\n    const newDeps = getDeps()\n\n    const depsChanged =\n      newDeps.length !== deps.length ||\n      newDeps.some((dep: any, index: number) => deps[index] !== dep)\n\n    if (!depsChanged) {\n      return result!\n    }\n\n    deps = newDeps\n\n    let resultTime: number\n    if (opts.key && opts.debug?.()) resultTime = Date.now()\n\n    result = fn(...newDeps)\n\n    if (opts.key && opts.debug?.()) {\n      const depEndTime = Math.round((Date.now() - depTime!) * 100) / 100\n      const resultEndTime = Math.round((Date.now() - resultTime!) * 100) / 100\n      const resultFpsPercentage = resultEndTime / 16\n\n      const pad = (str: number | string, num: number) => {\n        str = String(str)\n        while (str.length < num) {\n          str = ' ' + str\n        }\n        return str\n      }\n\n      console.info(\n        `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n        `\n            font-size: .6rem;\n            font-weight: bold;\n            color: hsl(${Math.max(\n              0,\n              Math.min(120 - 120 * resultFpsPercentage, 120),\n            )}deg 100% 31%);`,\n        opts?.key,\n      )\n    }\n\n    opts?.onChange?.(result)\n\n    return result\n  }\n\n  // Attach updateDeps to the function itself\n  memoizedFunction.updateDeps = (newDeps: [...TDeps]) => {\n    deps = newDeps\n  }\n\n  return memoizedFunction\n}\n\nexport function notUndefined<T>(value: T | undefined, msg?: string): T {\n  if (value === undefined) {\n    throw new Error(`Unexpected undefined${msg ? `: ${msg}` : ''}`)\n  } else {\n    return value\n  }\n}\n\nexport const approxEqual = (a: number, b: number) => Math.abs(a - b) <= 1\n\nexport const debounce = (\n  targetWindow: Window & typeof globalThis,\n  fn: Function,\n  ms: number,\n) => {\n  let timeoutId: number\n  return function (this: any, ...args: Array<any>) {\n    targetWindow.clearTimeout(timeoutId)\n    timeoutId = targetWindow.setTimeout(() => fn.apply(this, args), ms)\n  }\n}\n","import { approxEqual, debounce, memo, notUndefined } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollDirection = 'forward' | 'backward'\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ntype ScrollBehavior = 'auto' | 'smooth'\n\nexport interface ScrollToOptions {\n  align?: ScrollAlignment\n  behavior?: ScrollBehavior\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n  startIndex: number\n  endIndex: number\n  overscan: number\n  count: number\n}\n\ntype Key = number | string | bigint\n\nexport interface VirtualItem {\n  key: Key\n  index: number\n  start: number\n  end: number\n  size: number\n  lane: number\n}\n\nexport interface Rect {\n  width: number\n  height: number\n}\n\n//\n\nconst getRect = (element: HTMLElement): Rect => {\n  const { offsetWidth, offsetHeight } = element\n  return { width: offsetWidth, height: offsetHeight }\n}\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n  const start = Math.max(range.startIndex - range.overscan, 0)\n  const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n  const arr = []\n\n  for (let i = start; i <= end; i++) {\n    arr.push(i)\n  }\n\n  return arr\n}\n\nexport const observeElementRect = <T extends Element>(\n  instance: Virtualizer<T, any>,\n  cb: (rect: Rect) => void,\n) => {\n  const element = instance.scrollElement\n  if (!element) {\n    return\n  }\n  const targetWindow = instance.targetWindow\n  if (!targetWindow) {\n    return\n  }\n\n  const handler = (rect: Rect) => {\n    const { width, height } = rect\n    cb({ width: Math.round(width), height: Math.round(height) })\n  }\n\n  handler(getRect(element as unknown as HTMLElement))\n\n  if (!targetWindow.ResizeObserver) {\n    return () => {}\n  }\n\n  const observer = new targetWindow.ResizeObserver((entries) => {\n    const run = () => {\n      const entry = entries[0]\n      if (entry?.borderBoxSize) {\n        const box = entry.borderBoxSize[0]\n        if (box) {\n          handler({ width: box.inlineSize, height: box.blockSize })\n          return\n        }\n      }\n      handler(getRect(element as unknown as HTMLElement))\n    }\n\n    instance.options.useAnimationFrameWithResizeObserver\n      ? requestAnimationFrame(run)\n      : run()\n  })\n\n  observer.observe(element, { box: 'border-box' })\n\n  return () => {\n    observer.unobserve(element)\n  }\n}\n\nconst addEventListenerOptions = {\n  passive: true,\n}\n\nexport const observeWindowRect = (\n  instance: Virtualizer<Window, any>,\n  cb: (rect: Rect) => void,\n) => {\n  const element = instance.scrollElement\n  if (!element) {\n    return\n  }\n\n  const handler = () => {\n    cb({ width: element.innerWidth, height: element.innerHeight })\n  }\n  handler()\n\n  element.addEventListener('resize', handler, addEventListenerOptions)\n\n  return () => {\n    element.removeEventListener('resize', handler)\n  }\n}\n\nconst supportsScrollend =\n  typeof window == 'undefined' ? true : 'onscrollend' in window\n\ntype ObserveOffsetCallBack = (offset: number, isScrolling: boolean) => void\n\nexport const observeElementOffset = <T extends Element>(\n  instance: Virtualizer<T, any>,\n  cb: ObserveOffsetCallBack,\n) => {\n  const element = instance.scrollElement\n  if (!element) {\n    return\n  }\n  const targetWindow = instance.targetWindow\n  if (!targetWindow) {\n    return\n  }\n\n  let offset = 0\n  const fallback =\n    instance.options.useScrollendEvent && supportsScrollend\n      ? () => undefined\n      : debounce(\n          targetWindow,\n          () => {\n            cb(offset, false)\n          },\n          instance.options.isScrollingResetDelay,\n        )\n\n  const createHandler = (isScrolling: boolean) => () => {\n    const { horizontal, isRtl } = instance.options\n    offset = horizontal\n      ? element['scrollLeft'] * ((isRtl && -1) || 1)\n      : element['scrollTop']\n    fallback()\n    cb(offset, isScrolling)\n  }\n  const handler = createHandler(true)\n  const endHandler = createHandler(false)\n  endHandler()\n\n  element.addEventListener('scroll', handler, addEventListenerOptions)\n  const registerScrollendEvent =\n    instance.options.useScrollendEvent && supportsScrollend\n  if (registerScrollendEvent) {\n    element.addEventListener('scrollend', endHandler, addEventListenerOptions)\n  }\n  return () => {\n    element.removeEventListener('scroll', handler)\n    if (registerScrollendEvent) {\n      element.removeEventListener('scrollend', endHandler)\n    }\n  }\n}\n\nexport const observeWindowOffset = (\n  instance: Virtualizer<Window, any>,\n  cb: ObserveOffsetCallBack,\n) => {\n  const element = instance.scrollElement\n  if (!element) {\n    return\n  }\n  const targetWindow = instance.targetWindow\n  if (!targetWindow) {\n    return\n  }\n\n  let offset = 0\n  const fallback =\n    instance.options.useScrollendEvent && supportsScrollend\n      ? () => undefined\n      : debounce(\n          targetWindow,\n          () => {\n            cb(offset, false)\n          },\n          instance.options.isScrollingResetDelay,\n        )\n\n  const createHandler = (isScrolling: boolean) => () => {\n    offset = element[instance.options.horizontal ? 'scrollX' : 'scrollY']\n    fallback()\n    cb(offset, isScrolling)\n  }\n  const handler = createHandler(true)\n  const endHandler = createHandler(false)\n  endHandler()\n\n  element.addEventListener('scroll', handler, addEventListenerOptions)\n  const registerScrollendEvent =\n    instance.options.useScrollendEvent && supportsScrollend\n  if (registerScrollendEvent) {\n    element.addEventListener('scrollend', endHandler, addEventListenerOptions)\n  }\n  return () => {\n    element.removeEventListener('scroll', handler)\n    if (registerScrollendEvent) {\n      element.removeEventListener('scrollend', endHandler)\n    }\n  }\n}\n\nexport const measureElement = <TItemElement extends Element>(\n  element: TItemElement,\n  entry: ResizeObserverEntry | undefined,\n  instance: Virtualizer<any, TItemElement>,\n) => {\n  if (entry?.borderBoxSize) {\n    const box = entry.borderBoxSize[0]\n    if (box) {\n      const size = Math.round(\n        box[instance.options.horizontal ? 'inlineSize' : 'blockSize'],\n      )\n      return size\n    }\n  }\n\n  return (element as unknown as HTMLElement)[\n    instance.options.horizontal ? 'offsetWidth' : 'offsetHeight'\n  ]\n}\n\nexport const windowScroll = <T extends Window>(\n  offset: number,\n  {\n    adjustments = 0,\n    behavior,\n  }: { adjustments?: number; behavior?: ScrollBehavior },\n  instance: Virtualizer<T, any>,\n) => {\n  const toOffset = offset + adjustments\n\n  instance.scrollElement?.scrollTo?.({\n    [instance.options.horizontal ? 'left' : 'top']: toOffset,\n    behavior,\n  })\n}\n\nexport const elementScroll = <T extends Element>(\n  offset: number,\n  {\n    adjustments = 0,\n    behavior,\n  }: { adjustments?: number; behavior?: ScrollBehavior },\n  instance: Virtualizer<T, any>,\n) => {\n  const toOffset = offset + adjustments\n\n  instance.scrollElement?.scrollTo?.({\n    [instance.options.horizontal ? 'left' : 'top']: toOffset,\n    behavior,\n  })\n}\n\nexport interface VirtualizerOptions<\n  TScrollElement extends Element | Window,\n  TItemElement extends Element,\n> {\n  // Required from the user\n  count: number\n  getScrollElement: () => TScrollElement | null\n  estimateSize: (index: number) => number\n\n  // Required from the framework adapter (but can be overridden)\n  scrollToFn: (\n    offset: number,\n    options: { adjustments?: number; behavior?: ScrollBehavior },\n    instance: Virtualizer<TScrollElement, TItemElement>,\n  ) => void\n  observeElementRect: (\n    instance: Virtualizer<TScrollElement, TItemElement>,\n    cb: (rect: Rect) => void,\n  ) => void | (() => void)\n  observeElementOffset: (\n    instance: Virtualizer<TScrollElement, TItemElement>,\n    cb: ObserveOffsetCallBack,\n  ) => void | (() => void)\n  // Optional\n  debug?: boolean\n  initialRect?: Rect\n  onChange?: (\n    instance: Virtualizer<TScrollElement, TItemElement>,\n    sync: boolean,\n  ) => void\n  measureElement?: (\n    element: TItemElement,\n    entry: ResizeObserverEntry | undefined,\n    instance: Virtualizer<TScrollElement, TItemElement>,\n  ) => number\n  overscan?: number\n  horizontal?: boolean\n  paddingStart?: number\n  paddingEnd?: number\n  scrollPaddingStart?: number\n  scrollPaddingEnd?: number\n  initialOffset?: number | (() => number)\n  getItemKey?: (index: number) => Key\n  rangeExtractor?: (range: Range) => Array<number>\n  scrollMargin?: number\n  gap?: number\n  indexAttribute?: string\n  initialMeasurementsCache?: Array<VirtualItem>\n  lanes?: number\n  isScrollingResetDelay?: number\n  useScrollendEvent?: boolean\n  enabled?: boolean\n  isRtl?: boolean\n  useAnimationFrameWithResizeObserver?: boolean\n}\n\nexport class Virtualizer<\n  TScrollElement extends Element | Window,\n  TItemElement extends Element,\n> {\n  private unsubs: Array<void | (() => void)> = []\n  options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n  scrollElement: TScrollElement | null = null\n  targetWindow: (Window & typeof globalThis) | null = null\n  isScrolling = false\n  private scrollToIndexTimeoutId: number | null = null\n  measurementsCache: Array<VirtualItem> = []\n  private itemSizeCache = new Map<Key, number>()\n  private pendingMeasuredCacheIndexes: Array<number> = []\n  scrollRect: Rect | null = null\n  scrollOffset: number | null = null\n  scrollDirection: ScrollDirection | null = null\n  private scrollAdjustments = 0\n  shouldAdjustScrollPositionOnItemSizeChange:\n    | undefined\n    | ((\n        item: VirtualItem,\n        delta: number,\n        instance: Virtualizer<TScrollElement, TItemElement>,\n      ) => boolean)\n  elementsCache = new Map<Key, TItemElement>()\n  private observer = (() => {\n    let _ro: ResizeObserver | null = null\n\n    const get = () => {\n      if (_ro) {\n        return _ro\n      }\n\n      if (!this.targetWindow || !this.targetWindow.ResizeObserver) {\n        return null\n      }\n\n      return (_ro = new this.targetWindow.ResizeObserver((entries) => {\n        entries.forEach((entry) => {\n          const run = () => {\n            this._measureElement(entry.target as TItemElement, entry)\n          }\n          this.options.useAnimationFrameWithResizeObserver\n            ? requestAnimationFrame(run)\n            : run()\n        })\n      }))\n    }\n\n    return {\n      disconnect: () => {\n        get()?.disconnect()\n        _ro = null\n      },\n      observe: (target: Element) =>\n        get()?.observe(target, { box: 'border-box' }),\n      unobserve: (target: Element) => get()?.unobserve(target),\n    }\n  })()\n  range: { startIndex: number; endIndex: number } | null = null\n\n  constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n    this.setOptions(opts)\n  }\n\n  setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n    Object.entries(opts).forEach(([key, value]) => {\n      if (typeof value === 'undefined') delete (opts as any)[key]\n    })\n\n    this.options = {\n      debug: false,\n      initialOffset: 0,\n      overscan: 1,\n      paddingStart: 0,\n      paddingEnd: 0,\n      scrollPaddingStart: 0,\n      scrollPaddingEnd: 0,\n      horizontal: false,\n      getItemKey: defaultKeyExtractor,\n      rangeExtractor: defaultRangeExtractor,\n      onChange: () => {},\n      measureElement,\n      initialRect: { width: 0, height: 0 },\n      scrollMargin: 0,\n      gap: 0,\n      indexAttribute: 'data-index',\n      initialMeasurementsCache: [],\n      lanes: 1,\n      isScrollingResetDelay: 150,\n      enabled: true,\n      isRtl: false,\n      useScrollendEvent: false,\n      useAnimationFrameWithResizeObserver: false,\n      ...opts,\n    }\n  }\n\n  private notify = (sync: boolean) => {\n    this.options.onChange?.(this, sync)\n  }\n\n  private maybeNotify = memo(\n    () => {\n      this.calculateRange()\n\n      return [\n        this.isScrolling,\n        this.range ? this.range.startIndex : null,\n        this.range ? this.range.endIndex : null,\n      ]\n    },\n    (isScrolling) => {\n      this.notify(isScrolling)\n    },\n    {\n      key: process.env.NODE_ENV !== 'production' && 'maybeNotify',\n      debug: () => this.options.debug,\n      initialDeps: [\n        this.isScrolling,\n        this.range ? this.range.startIndex : null,\n        this.range ? this.range.endIndex : null,\n      ] as [boolean, number | null, number | null],\n    },\n  )\n\n  private cleanup = () => {\n    this.unsubs.filter(Boolean).forEach((d) => d!())\n    this.unsubs = []\n    this.observer.disconnect()\n    this.scrollElement = null\n    this.targetWindow = null\n  }\n\n  _didMount = () => {\n    return () => {\n      this.cleanup()\n    }\n  }\n\n  _willUpdate = () => {\n    const scrollElement = this.options.enabled\n      ? this.options.getScrollElement()\n      : null\n\n    if (this.scrollElement !== scrollElement) {\n      this.cleanup()\n\n      if (!scrollElement) {\n        this.maybeNotify()\n        return\n      }\n\n      this.scrollElement = scrollElement\n\n      if (this.scrollElement && 'ownerDocument' in this.scrollElement) {\n        this.targetWindow = this.scrollElement.ownerDocument.defaultView\n      } else {\n        this.targetWindow = this.scrollElement?.window ?? null\n      }\n\n      this.elementsCache.forEach((cached) => {\n        this.observer.observe(cached)\n      })\n\n      this._scrollToOffset(this.getScrollOffset(), {\n        adjustments: undefined,\n        behavior: undefined,\n      })\n\n      this.unsubs.push(\n        this.options.observeElementRect(this, (rect) => {\n          this.scrollRect = rect\n          this.maybeNotify()\n        }),\n      )\n\n      this.unsubs.push(\n        this.options.observeElementOffset(this, (offset, isScrolling) => {\n          this.scrollAdjustments = 0\n          this.scrollDirection = isScrolling\n            ? this.getScrollOffset() < offset\n              ? 'forward'\n              : 'backward'\n            : null\n          this.scrollOffset = offset\n          this.isScrolling = isScrolling\n\n          this.maybeNotify()\n        }),\n      )\n    }\n  }\n\n  private getSize = () => {\n    if (!this.options.enabled) {\n      this.scrollRect = null\n      return 0\n    }\n\n    this.scrollRect = this.scrollRect ?? this.options.initialRect\n\n    return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n  }\n\n  private getScrollOffset = () => {\n    if (!this.options.enabled) {\n      this.scrollOffset = null\n      return 0\n    }\n\n    this.scrollOffset =\n      this.scrollOffset ??\n      (typeof this.options.initialOffset === 'function'\n        ? this.options.initialOffset()\n        : this.options.initialOffset)\n\n    return this.scrollOffset\n  }\n\n  private getFurthestMeasurement = (\n    measurements: Array<VirtualItem>,\n    index: number,\n  ) => {\n    const furthestMeasurementsFound = new Map<number, true>()\n    const furthestMeasurements = new Map<number, VirtualItem>()\n    for (let m = index - 1; m >= 0; m--) {\n      const measurement = measurements[m]!\n\n      if (furthestMeasurementsFound.has(measurement.lane)) {\n        continue\n      }\n\n      const previousFurthestMeasurement = furthestMeasurements.get(\n        measurement.lane,\n      )\n      if (\n        previousFurthestMeasurement == null ||\n        measurement.end > previousFurthestMeasurement.end\n      ) {\n        furthestMeasurements.set(measurement.lane, measurement)\n      } else if (measurement.end < previousFurthestMeasurement.end) {\n        furthestMeasurementsFound.set(measurement.lane, true)\n      }\n\n      if (furthestMeasurementsFound.size === this.options.lanes) {\n        break\n      }\n    }\n\n    return furthestMeasurements.size === this.options.lanes\n      ? Array.from(furthestMeasurements.values()).sort((a, b) => {\n          if (a.end === b.end) {\n            return a.index - b.index\n          }\n\n          return a.end - b.end\n        })[0]\n      : undefined\n  }\n\n  private getMeasurementOptions = memo(\n    () => [\n      this.options.count,\n      this.options.paddingStart,\n      this.options.scrollMargin,\n      this.options.getItemKey,\n      this.options.enabled,\n    ],\n    (count, paddingStart, scrollMargin, getItemKey, enabled) => {\n      this.pendingMeasuredCacheIndexes = []\n      return {\n        count,\n        paddingStart,\n        scrollMargin,\n        getItemKey,\n        enabled,\n      }\n    },\n    {\n      key: false,\n    },\n  )\n\n  private getMeasurements = memo(\n    () => [this.getMeasurementOptions(), this.itemSizeCache],\n    (\n      { count, paddingStart, scrollMargin, getItemKey, enabled },\n      itemSizeCache,\n    ) => {\n      if (!enabled) {\n        this.measurementsCache = []\n        this.itemSizeCache.clear()\n        return []\n      }\n\n      if (this.measurementsCache.length === 0) {\n        this.measurementsCache = this.options.initialMeasurementsCache\n        this.measurementsCache.forEach((item) => {\n          this.itemSizeCache.set(item.key, item.size)\n        })\n      }\n\n      const min =\n        this.pendingMeasuredCacheIndexes.length > 0\n          ? Math.min(...this.pendingMeasuredCacheIndexes)\n          : 0\n      this.pendingMeasuredCacheIndexes = []\n\n      const measurements = this.measurementsCache.slice(0, min)\n\n      for (let i = min; i < count; i++) {\n        const key = getItemKey(i)\n\n        const furthestMeasurement =\n          this.options.lanes === 1\n            ? measurements[i - 1]\n            : this.getFurthestMeasurement(measurements, i)\n\n        const start = furthestMeasurement\n          ? furthestMeasurement.end + this.options.gap\n          : paddingStart + scrollMargin\n\n        const measuredSize = itemSizeCache.get(key)\n        const size =\n          typeof measuredSize === 'number'\n            ? measuredSize\n            : this.options.estimateSize(i)\n\n        const end = start + size\n\n        const lane = furthestMeasurement\n          ? furthestMeasurement.lane\n          : i % this.options.lanes\n\n        measurements[i] = {\n          index: i,\n          start,\n          size,\n          end,\n          key,\n          lane,\n        }\n      }\n\n      this.measurementsCache = measurements\n\n      return measurements\n    },\n    {\n      key: process.env.NODE_ENV !== 'production' && 'getMeasurements',\n      debug: () => this.options.debug,\n    },\n  )\n\n  calculateRange = memo(\n    () => [\n      this.getMeasurements(),\n      this.getSize(),\n      this.getScrollOffset(),\n      this.options.lanes,\n    ],\n    (measurements, outerSize, scrollOffset, lanes) => {\n      return (this.range =\n        measurements.length > 0 && outerSize > 0\n          ? calculateRange({\n              measurements,\n              outerSize,\n              scrollOffset,\n              lanes,\n            })\n          : null)\n    },\n    {\n      key: process.env.NODE_ENV !== 'production' && 'calculateRange',\n      debug: () => this.options.debug,\n    },\n  )\n\n  getVirtualIndexes = memo(\n    () => {\n      let startIndex: number | null = null\n      let endIndex: number | null = null\n      const range = this.calculateRange()\n      if (range) {\n        startIndex = range.startIndex\n        endIndex = range.endIndex\n      }\n      this.maybeNotify.updateDeps([this.isScrolling, startIndex, endIndex])\n      return [\n        this.options.rangeExtractor,\n        this.options.overscan,\n        this.options.count,\n        startIndex,\n        endIndex,\n      ]\n    },\n    (rangeExtractor, overscan, count, startIndex, endIndex) => {\n      return startIndex === null || endIndex === null\n        ? []\n        : rangeExtractor({\n            startIndex,\n            endIndex,\n            overscan,\n            count,\n          })\n    },\n    {\n      key: process.env.NODE_ENV !== 'production' && 'getVirtualIndexes',\n      debug: () => this.options.debug,\n    },\n  )\n\n  indexFromElement = (node: TItemElement) => {\n    const attributeName = this.options.indexAttribute\n    const indexStr = node.getAttribute(attributeName)\n\n    if (!indexStr) {\n      console.warn(\n        `Missing attribute name '${attributeName}={index}' on measured element.`,\n      )\n      return -1\n    }\n\n    return parseInt(indexStr, 10)\n  }\n\n  private _measureElement = (\n    node: TItemElement,\n    entry: ResizeObserverEntry | undefined,\n  ) => {\n    const index = this.indexFromElement(node)\n    const item = this.measurementsCache[index]\n    if (!item) {\n      return\n    }\n    const key = item.key\n    const prevNode = this.elementsCache.get(key)\n\n    if (prevNode !== node) {\n      if (prevNode) {\n        this.observer.unobserve(prevNode)\n      }\n      this.observer.observe(node)\n      this.elementsCache.set(key, node)\n    }\n\n    if (node.isConnected) {\n      this.resizeItem(index, this.options.measureElement(node, entry, this))\n    }\n  }\n\n  resizeItem = (index: number, size: number) => {\n    const item = this.measurementsCache[index]\n    if (!item) {\n      return\n    }\n    const itemSize = this.itemSizeCache.get(item.key) ?? item.size\n    const delta = size - itemSize\n\n    if (delta !== 0) {\n      if (\n        this.shouldAdjustScrollPositionOnItemSizeChange !== undefined\n          ? this.shouldAdjustScrollPositionOnItemSizeChange(item, delta, this)\n          : this.scrollDirection === 'backward' &&\n            item.start < this.getScrollOffset() + this.scrollAdjustments\n      ) {\n        if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n          console.info('correction', delta)\n        }\n\n        this._scrollToOffset(this.getScrollOffset(), {\n          adjustments: (this.scrollAdjustments += delta),\n          behavior: undefined,\n        })\n      }\n\n      this.pendingMeasuredCacheIndexes.push(item.index)\n      this.itemSizeCache = new Map(this.itemSizeCache.set(item.key, size))\n\n      this.notify(false)\n    }\n  }\n\n  measureElement = (node: TItemElement | null | undefined) => {\n    if (!node) {\n      this.elementsCache.forEach((cached, key) => {\n        if (!cached.isConnected) {\n          this.observer.unobserve(cached)\n          this.elementsCache.delete(key)\n        }\n      })\n      return\n    }\n\n    this._measureElement(node, undefined)\n  }\n\n  getVirtualItems = memo(\n    () => [this.getVirtualIndexes(), this.getMeasurements()],\n    (indexes, measurements) => {\n      const virtualItems: Array<VirtualItem> = []\n\n      for (let k = 0, len = indexes.length; k < len; k++) {\n        const i = indexes[k]!\n        const measurement = measurements[i]!\n\n        virtualItems.push(measurement)\n      }\n\n      return virtualItems\n    },\n    {\n      key: process.env.NODE_ENV !== 'production' && 'getVirtualItems',\n      debug: () => this.options.debug,\n    },\n  )\n\n  getVirtualItemForOffset = (offset: number) => {\n    const measurements = this.getMeasurements()\n    if (measurements.length === 0) {\n      return undefined\n    }\n    return notUndefined(\n      measurements[\n        findNearestBinarySearch(\n          0,\n          measurements.length - 1,\n          (index: number) => notUndefined(measurements[index]).start,\n          offset,\n        )\n      ],\n    )\n  }\n\n  getOffsetForAlignment = (\n    toOffset: number,\n    align: ScrollAlignment,\n    itemSize = 0,\n  ) => {\n    const size = this.getSize()\n    const scrollOffset = this.getScrollOffset()\n\n    if (align === 'auto') {\n      align = toOffset >= scrollOffset + size ? 'end' : 'start'\n    }\n\n    if (align === 'center') {\n      // When aligning to a particular item (e.g. with scrollToIndex),\n      // adjust offset by the size of the item to center on the item\n      toOffset += (itemSize - size) / 2\n    } else if (align === 'end') {\n      toOffset -= size\n    }\n\n    const maxOffset = this.getTotalSize() - size\n\n    return Math.max(Math.min(maxOffset, toOffset), 0)\n  }\n\n  getOffsetForIndex = (index: number, align: ScrollAlignment = 'auto') => {\n    index = Math.max(0, Math.min(index, this.options.count - 1))\n\n    const item = this.measurementsCache[index]\n    if (!item) {\n      return undefined\n    }\n\n    const size = this.getSize()\n    const scrollOffset = this.getScrollOffset()\n\n    if (align === 'auto') {\n      if (item.end >= scrollOffset + size - this.options.scrollPaddingEnd) {\n        align = 'end'\n      } else if (item.start <= scrollOffset + this.options.scrollPaddingStart) {\n        align = 'start'\n      } else {\n        return [scrollOffset, align] as const\n      }\n    }\n\n    const toOffset =\n      align === 'end'\n        ? item.end + this.options.scrollPaddingEnd\n        : item.start - this.options.scrollPaddingStart\n\n    return [\n      this.getOffsetForAlignment(toOffset, align, item.size),\n      align,\n    ] as const\n  }\n\n  private isDynamicMode = () => this.elementsCache.size > 0\n\n  private cancelScrollToIndex = () => {\n    if (this.scrollToIndexTimeoutId !== null && this.targetWindow) {\n      this.targetWindow.clearTimeout(this.scrollToIndexTimeoutId)\n      this.scrollToIndexTimeoutId = null\n    }\n  }\n\n  scrollToOffset = (\n    toOffset: number,\n    { align = 'start', behavior }: ScrollToOffsetOptions = {},\n  ) => {\n    this.cancelScrollToIndex()\n\n    if (behavior === 'smooth' && this.isDynamicMode()) {\n      console.warn(\n        'The `smooth` scroll behavior is not fully supported with dynamic size.',\n      )\n    }\n\n    this._scrollToOffset(this.getOffsetForAlignment(toOffset, align), {\n      adjustments: undefined,\n      behavior,\n    })\n  }\n\n  scrollToIndex = (\n    index: number,\n    { align: initialAlign = 'auto', behavior }: ScrollToIndexOptions = {},\n  ) => {\n    index = Math.max(0, Math.min(index, this.options.count - 1))\n\n    this.cancelScrollToIndex()\n\n    if (behavior === 'smooth' && this.isDynamicMode()) {\n      console.warn(\n        'The `smooth` scroll behavior is not fully supported with dynamic size.',\n      )\n    }\n\n    const offsetAndAlign = this.getOffsetForIndex(index, initialAlign)\n    if (!offsetAndAlign) return\n\n    const [offset, align] = offsetAndAlign\n\n    this._scrollToOffset(offset, { adjustments: undefined, behavior })\n\n    if (behavior !== 'smooth' && this.isDynamicMode() && this.targetWindow) {\n      this.scrollToIndexTimeoutId = this.targetWindow.setTimeout(() => {\n        this.scrollToIndexTimeoutId = null\n\n        const elementInDOM = this.elementsCache.has(\n          this.options.getItemKey(index),\n        )\n\n        if (elementInDOM) {\n          const result = this.getOffsetForIndex(index, align)\n          if (!result) return\n          const [latestOffset] = result\n\n          const currentScrollOffset = this.getScrollOffset()\n          if (!approxEqual(latestOffset, currentScrollOffset)) {\n            this.scrollToIndex(index, { align, behavior })\n          }\n        } else {\n          this.scrollToIndex(index, { align, behavior })\n        }\n      })\n    }\n  }\n\n  scrollBy = (delta: number, { behavior }: ScrollToOffsetOptions = {}) => {\n    this.cancelScrollToIndex()\n\n    if (behavior === 'smooth' && this.isDynamicMode()) {\n      console.warn(\n        'The `smooth` scroll behavior is not fully supported with dynamic size.',\n      )\n    }\n\n    this._scrollToOffset(this.getScrollOffset() + delta, {\n      adjustments: undefined,\n      behavior,\n    })\n  }\n\n  getTotalSize = () => {\n    const measurements = this.getMeasurements()\n\n    let end: number\n    // If there are no measurements, set the end to paddingStart\n    // If there is only one lane, use the last measurement's end\n    // Otherwise find the maximum end value among all measurements\n    if (measurements.length === 0) {\n      end = this.options.paddingStart\n    } else if (this.options.lanes === 1) {\n      end = measurements[measurements.length - 1]?.end ?? 0\n    } else {\n      const endByLane = Array<number | null>(this.options.lanes).fill(null)\n      let endIndex = measurements.length - 1\n      while (endIndex >= 0 && endByLane.some((val) => val === null)) {\n        const item = measurements[endIndex]!\n        if (endByLane[item.lane] === null) {\n          endByLane[item.lane] = item.end\n        }\n\n        endIndex--\n      }\n\n      end = Math.max(...endByLane.filter((val): val is number => val !== null))\n    }\n\n    return Math.max(\n      end - this.options.scrollMargin + this.options.paddingEnd,\n      0,\n    )\n  }\n\n  private _scrollToOffset = (\n    offset: number,\n    {\n      adjustments,\n      behavior,\n    }: {\n      adjustments: number | undefined\n      behavior: ScrollBehavior | undefined\n    },\n  ) => {\n    this.options.scrollToFn(offset, { behavior, adjustments }, this)\n  }\n\n  measure = () => {\n    this.itemSizeCache = new Map()\n    this.notify(false)\n  }\n}\n\nconst findNearestBinarySearch = (\n  low: number,\n  high: number,\n  getCurrentValue: (i: number) => number,\n  value: number,\n) => {\n  while (low <= high) {\n    const middle = ((low + high) / 2) | 0\n    const currentValue = getCurrentValue(middle)\n\n    if (currentValue < value) {\n      low = middle + 1\n    } else if (currentValue > value) {\n      high = middle - 1\n    } else {\n      return middle\n    }\n  }\n\n  if (low > 0) {\n    return low - 1\n  } else {\n    return 0\n  }\n}\n\nfunction calculateRange({\n  measurements,\n  outerSize,\n  scrollOffset,\n  lanes,\n}: {\n  measurements: Array<VirtualItem>\n  outerSize: number\n  scrollOffset: number\n  lanes: number\n}) {\n  const lastIndex = measurements.length - 1\n  const getOffset = (index: number) => measurements[index]!.start\n\n  // handle case when item count is less than or equal to lanes\n  if (measurements.length <= lanes) {\n    return {\n      startIndex: 0,\n      endIndex: lastIndex,\n    }\n  }\n\n  let startIndex = findNearestBinarySearch(\n    0,\n    lastIndex,\n    getOffset,\n    scrollOffset,\n  )\n  let endIndex = startIndex\n\n  if (lanes === 1) {\n    while (\n      endIndex < lastIndex &&\n      measurements[endIndex]!.end < scrollOffset + outerSize\n    ) {\n      endIndex++\n    }\n  } else if (lanes > 1) {\n    // Expand forward until we include the visible items from all lanes\n    // which are closer to the end of the virtualizer window\n    const endPerLane = Array(lanes).fill(0)\n    while (\n      endIndex < lastIndex &&\n      endPerLane.some((pos) => pos < scrollOffset + outerSize)\n    ) {\n      const item = measurements[endIndex]!\n      endPerLane[item.lane] = item.end\n      endIndex++\n    }\n\n    // Expand backward until we include all lanes' visible items\n    // closer to the top\n    const startPerLane = Array(lanes).fill(scrollOffset + outerSize)\n    while (startIndex >= 0 && startPerLane.some((pos) => pos >= scrollOffset)) {\n      const item = measurements[startIndex]!\n      startPerLane[item.lane] = item.start\n      startIndex--\n    }\n\n    // Align startIndex to the beginning of its lane\n    startIndex = Math.max(0, startIndex - (startIndex % lanes))\n    // Align endIndex to the end of its lane\n    endIndex = Math.min(lastIndex, endIndex + (lanes - 1 - (endIndex % lanes)))\n  }\n\n  return { startIndex, endIndex }\n}\n"]}