{"mappings":"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","names":["memo","getDeps","fn","opts","deps","result","isInitial","memoizedFunction","_a","_b","_c","depTime","newDeps","dep","index","resultTime","depEndTime","resultEndTime","resultFpsPercentage","pad","str","num","notUndefined","value","msg","approxEqual","a","b","debounce","targetWindow","ms","timeoutId","args","getRect","element","offsetWidth","offsetHeight","defaultKeyExtractor","index","defaultRangeExtractor","range","start","end","arr","i","observeElementRect","instance","cb","targetWindow","handler","rect","width","height","observer","entries","run","entry","box","addEventListenerOptions","observeWindowRect","supportsScrollend","observeElementOffset","offset","fallback","debounce","createHandler","isScrolling","horizontal","isRtl","endHandler","registerScrollendEvent","observeWindowOffset","measureElement","windowScroll","adjustments","behavior","toOffset","_b","_a","elementScroll","Virtualizer","opts","_c","_ro","get","node","target","key","value","sync","memo","d","scrollElement","cached","measurements","furthestMeasurementsFound","furthestMeasurements","m","measurement","previousFurthestMeasurement","a","b","count","paddingStart","scrollMargin","getItemKey","enabled","lanes","itemSizeCache","item","min","laneLastIndex","cachedLane","lane","prevIndex","prevInLane","furthestMeasurement","measuredSize","size","outerSize","scrollOffset","calculateRange","startIndex","endIndex","rangeExtractor","overscan","attributeName","indexStr","scrollIndex","bufferSize","minIndex","maxIndex","prevNode","itemSize","delta","indexes","virtualItems","k","len","notUndefined","findNearestBinarySearch","doc","align","maxOffset","now","initialAlign","offsetInfo","endByLane","val","targetOffset","STABLE_FRAMES","targetChanged","approxEqual","low","high","getCurrentValue","middle","currentValue","lastIndex","getOffset","endPerLane","pos","startPerLane"],"sources":["../esm/npm/@tanstack/virtual-core@3.13.23/node_modules/@tanstack/virtual-core/src/utils.ts","../esm/npm/@tanstack/virtual-core@3.13.23/node_modules/@tanstack/virtual-core/src/index.ts"],"sourcesContent":["export type NoInfer\u003cA extends any\u003e = [A][A extends any ? 0 : never]\n\nexport type PartialKeys\u003cT, K extends keyof T\u003e = Omit\u003cT, K\u003e \u0026 Partial\u003cPick\u003cT, K\u003e\u003e\n\nexport function memo\u003cTDeps extends ReadonlyArray\u003cany\u003e, TResult\u003e(\n  getDeps: () =\u003e [...TDeps],\n  fn: (...args: NoInfer\u003c[...TDeps]\u003e) =\u003e TResult,\n  opts: {\n    key: false | string\n    debug?: () =\u003e boolean\n    onChange?: (result: TResult) =\u003e void\n    initialDeps?: TDeps\n    skipInitialOnChange?: boolean\n  },\n) {\n  let deps = opts.initialDeps ?? []\n  let result: TResult | undefined\n  let isInitial = true\n\n  function memoizedFunction(): TResult {\n    let depTime: number\n    if (opts.key \u0026\u0026 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) =\u003e deps[index] !== dep)\n\n    if (!depsChanged) {\n      return result!\n    }\n\n    deps = newDeps\n\n    let resultTime: number\n    if (opts.key \u0026\u0026 opts.debug?.()) resultTime = Date.now()\n\n    result = fn(...newDeps)\n\n    if (opts.key \u0026\u0026 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) =\u003e {\n        str = String(str)\n        while (str.length \u003c 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    if (opts?.onChange \u0026\u0026 !(isInitial \u0026\u0026 opts.skipInitialOnChange)) {\n      opts.onChange(result)\n    }\n\n    isInitial = false\n\n    return result\n  }\n\n  // Attach updateDeps to the function itself\n  memoizedFunction.updateDeps = (newDeps: [...TDeps]) =\u003e {\n    deps = newDeps\n  }\n\n  return memoizedFunction\n}\n\nexport function notUndefined\u003cT\u003e(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) =\u003e Math.abs(a - b) \u003c 1.01\n\nexport const debounce = (\n  targetWindow: Window \u0026 typeof globalThis,\n  fn: Function,\n  ms: number,\n) =\u003e {\n  let timeoutId: number\n  return function (this: any, ...args: Array\u003cany\u003e) {\n    targetWindow.clearTimeout(timeoutId)\n    timeoutId = targetWindow.setTimeout(() =\u003e 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' | 'instant'\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 =\u003e {\n  const { offsetWidth, offsetHeight } = element\n  return { width: offsetWidth, height: offsetHeight }\n}\n\nexport const defaultKeyExtractor = (index: number) =\u003e index\n\nexport const defaultRangeExtractor = (range: Range) =\u003e {\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 \u003c= end; i++) {\n    arr.push(i)\n  }\n\n  return arr\n}\n\nexport const observeElementRect = \u003cT extends Element\u003e(\n  instance: Virtualizer\u003cT, any\u003e,\n  cb: (rect: Rect) =\u003e void,\n) =\u003e {\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) =\u003e {\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 () =\u003e {}\n  }\n\n  const observer = new targetWindow.ResizeObserver((entries) =\u003e {\n    const run = () =\u003e {\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 () =\u003e {\n    observer.unobserve(element)\n  }\n}\n\nconst addEventListenerOptions = {\n  passive: true,\n}\n\nexport const observeWindowRect = (\n  instance: Virtualizer\u003cWindow, any\u003e,\n  cb: (rect: Rect) =\u003e void,\n) =\u003e {\n  const element = instance.scrollElement\n  if (!element) {\n    return\n  }\n\n  const handler = () =\u003e {\n    cb({ width: element.innerWidth, height: element.innerHeight })\n  }\n  handler()\n\n  element.addEventListener('resize', handler, addEventListenerOptions)\n\n  return () =\u003e {\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) =\u003e void\n\nexport const observeElementOffset = \u003cT extends Element\u003e(\n  instance: Virtualizer\u003cT, any\u003e,\n  cb: ObserveOffsetCallBack,\n) =\u003e {\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 \u0026\u0026 supportsScrollend\n      ? () =\u003e undefined\n      : debounce(\n          targetWindow,\n          () =\u003e {\n            cb(offset, false)\n          },\n          instance.options.isScrollingResetDelay,\n        )\n\n  const createHandler = (isScrolling: boolean) =\u003e () =\u003e {\n    const { horizontal, isRtl } = instance.options\n    offset = horizontal\n      ? element['scrollLeft'] * ((isRtl \u0026\u0026 -1) || 1)\n      : element['scrollTop']\n    fallback()\n    cb(offset, isScrolling)\n  }\n  const handler = createHandler(true)\n  const endHandler = createHandler(false)\n\n  element.addEventListener('scroll', handler, addEventListenerOptions)\n  const registerScrollendEvent =\n    instance.options.useScrollendEvent \u0026\u0026 supportsScrollend\n  if (registerScrollendEvent) {\n    element.addEventListener('scrollend', endHandler, addEventListenerOptions)\n  }\n  return () =\u003e {\n    element.removeEventListener('scroll', handler)\n    if (registerScrollendEvent) {\n      element.removeEventListener('scrollend', endHandler)\n    }\n  }\n}\n\nexport const observeWindowOffset = (\n  instance: Virtualizer\u003cWindow, any\u003e,\n  cb: ObserveOffsetCallBack,\n) =\u003e {\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 \u0026\u0026 supportsScrollend\n      ? () =\u003e undefined\n      : debounce(\n          targetWindow,\n          () =\u003e {\n            cb(offset, false)\n          },\n          instance.options.isScrollingResetDelay,\n        )\n\n  const createHandler = (isScrolling: boolean) =\u003e () =\u003e {\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\n  element.addEventListener('scroll', handler, addEventListenerOptions)\n  const registerScrollendEvent =\n    instance.options.useScrollendEvent \u0026\u0026 supportsScrollend\n  if (registerScrollendEvent) {\n    element.addEventListener('scrollend', endHandler, addEventListenerOptions)\n  }\n  return () =\u003e {\n    element.removeEventListener('scroll', handler)\n    if (registerScrollendEvent) {\n      element.removeEventListener('scrollend', endHandler)\n    }\n  }\n}\n\nexport const measureElement = \u003cTItemElement extends Element\u003e(\n  element: TItemElement,\n  entry: ResizeObserverEntry | undefined,\n  instance: Virtualizer\u003cany, TItemElement\u003e,\n) =\u003e {\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 = \u003cT extends Window\u003e(\n  offset: number,\n  {\n    adjustments = 0,\n    behavior,\n  }: { adjustments?: number; behavior?: ScrollBehavior },\n  instance: Virtualizer\u003cT, any\u003e,\n) =\u003e {\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 = \u003cT extends Element\u003e(\n  offset: number,\n  {\n    adjustments = 0,\n    behavior,\n  }: { adjustments?: number; behavior?: ScrollBehavior },\n  instance: Virtualizer\u003cT, any\u003e,\n) =\u003e {\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\u003c\n  TScrollElement extends Element | Window,\n  TItemElement extends Element,\n\u003e {\n  // Required from the user\n  count: number\n  getScrollElement: () =\u003e TScrollElement | null\n  estimateSize: (index: number) =\u003e 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\u003cTScrollElement, TItemElement\u003e,\n  ) =\u003e void\n  observeElementRect: (\n    instance: Virtualizer\u003cTScrollElement, TItemElement\u003e,\n    cb: (rect: Rect) =\u003e void,\n  ) =\u003e void | (() =\u003e void)\n  observeElementOffset: (\n    instance: Virtualizer\u003cTScrollElement, TItemElement\u003e,\n    cb: ObserveOffsetCallBack,\n  ) =\u003e void | (() =\u003e void)\n  // Optional\n  debug?: boolean\n  initialRect?: Rect\n  onChange?: (\n    instance: Virtualizer\u003cTScrollElement, TItemElement\u003e,\n    sync: boolean,\n  ) =\u003e void\n  measureElement?: (\n    element: TItemElement,\n    entry: ResizeObserverEntry | undefined,\n    instance: Virtualizer\u003cTScrollElement, TItemElement\u003e,\n  ) =\u003e number\n  overscan?: number\n  horizontal?: boolean\n  paddingStart?: number\n  paddingEnd?: number\n  scrollPaddingStart?: number\n  scrollPaddingEnd?: number\n  initialOffset?: number | (() =\u003e number)\n  getItemKey?: (index: number) =\u003e Key\n  rangeExtractor?: (range: Range) =\u003e Array\u003cnumber\u003e\n  scrollMargin?: number\n  gap?: number\n  indexAttribute?: string\n  initialMeasurementsCache?: Array\u003cVirtualItem\u003e\n  lanes?: number\n  isScrollingResetDelay?: number\n  useScrollendEvent?: boolean\n  enabled?: boolean\n  isRtl?: boolean\n  useAnimationFrameWithResizeObserver?: boolean\n}\n\ntype ScrollState = {\n  // what we want\n  index: number | null\n  align: ScrollAlignment\n  behavior: ScrollBehavior\n\n  // lifecycle\n  startedAt: number\n\n  // target tracking\n  lastTargetOffset: number\n\n  // settling\n  stableFrames: number\n}\n\nexport class Virtualizer\u003c\n  TScrollElement extends Element | Window,\n  TItemElement extends Element,\n\u003e {\n  private unsubs: Array\u003cvoid | (() =\u003e void)\u003e = []\n  options!: Required\u003cVirtualizerOptions\u003cTScrollElement, TItemElement\u003e\u003e\n  scrollElement: TScrollElement | null = null\n  targetWindow: (Window \u0026 typeof globalThis) | null = null\n  isScrolling = false\n  private scrollState: ScrollState | null = null\n  measurementsCache: Array\u003cVirtualItem\u003e = []\n  private itemSizeCache = new Map\u003cKey, number\u003e()\n  private laneAssignments = new Map\u003cnumber, number\u003e() // index → lane cache\n  private pendingMeasuredCacheIndexes: Array\u003cnumber\u003e = []\n  private prevLanes: number | undefined = undefined\n  private lanesChangedFlag = false\n  private lanesSettling = false\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\u003cTScrollElement, TItemElement\u003e,\n      ) =\u003e boolean)\n  elementsCache = new Map\u003cKey, TItemElement\u003e()\n  private now = () =\u003e this.targetWindow?.performance?.now?.() ?? Date.now()\n  private observer = (() =\u003e {\n    let _ro: ResizeObserver | null = null\n\n    const get = () =\u003e {\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) =\u003e {\n        entries.forEach((entry) =\u003e {\n          const run = () =\u003e {\n            const node = entry.target as TItemElement\n            const index = this.indexFromElement(node)\n\n            if (!node.isConnected) {\n              this.observer.unobserve(node)\n              return\n            }\n\n            if (this.shouldMeasureDuringScroll(index)) {\n              this.resizeItem(\n                index,\n                this.options.measureElement(node, entry, this),\n              )\n            }\n          }\n          this.options.useAnimationFrameWithResizeObserver\n            ? requestAnimationFrame(run)\n            : run()\n        })\n      }))\n    }\n\n    return {\n      disconnect: () =\u003e {\n        get()?.disconnect()\n        _ro = null\n      },\n      observe: (target: Element) =\u003e\n        get()?.observe(target, { box: 'border-box' }),\n      unobserve: (target: Element) =\u003e get()?.unobserve(target),\n    }\n  })()\n  range: { startIndex: number; endIndex: number } | null = null\n\n  constructor(opts: VirtualizerOptions\u003cTScrollElement, TItemElement\u003e) {\n    this.setOptions(opts)\n  }\n\n  setOptions = (opts: VirtualizerOptions\u003cTScrollElement, TItemElement\u003e) =\u003e {\n    Object.entries(opts).forEach(([key, value]) =\u003e {\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: () =\u003e {},\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) =\u003e {\n    this.options.onChange?.(this, sync)\n  }\n\n  private maybeNotify = memo(\n    () =\u003e {\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) =\u003e {\n      this.notify(isScrolling)\n    },\n    {\n      key: process.env.NODE_ENV !== 'production' \u0026\u0026 'maybeNotify',\n      debug: () =\u003e 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 = () =\u003e {\n    this.unsubs.filter(Boolean).forEach((d) =\u003e d!())\n    this.unsubs = []\n    this.observer.disconnect()\n    if (this.rafId != null \u0026\u0026 this.targetWindow) {\n      this.targetWindow.cancelAnimationFrame(this.rafId)\n      this.rafId = null\n    }\n    this.scrollState = null\n    this.scrollElement = null\n    this.targetWindow = null\n  }\n\n  _didMount = () =\u003e {\n    return () =\u003e {\n      this.cleanup()\n    }\n  }\n\n  _willUpdate = () =\u003e {\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 \u0026\u0026 '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) =\u003e {\n        this.observer.observe(cached)\n      })\n\n      this.unsubs.push(\n        this.options.observeElementRect(this, (rect) =\u003e {\n          this.scrollRect = rect\n          this.maybeNotify()\n        }),\n      )\n\n      this.unsubs.push(\n        this.options.observeElementOffset(this, (offset, isScrolling) =\u003e {\n          this.scrollAdjustments = 0\n          this.scrollDirection = isScrolling\n            ? this.getScrollOffset() \u003c offset\n              ? 'forward'\n              : 'backward'\n            : null\n          this.scrollOffset = offset\n          this.isScrolling = isScrolling\n\n          if (this.scrollState) {\n            this.scheduleScrollReconcile()\n          }\n          this.maybeNotify()\n        }),\n      )\n\n      this._scrollToOffset(this.getScrollOffset(), {\n        adjustments: undefined,\n        behavior: undefined,\n      })\n    }\n  }\n\n  private rafId: number | null = null\n  private scheduleScrollReconcile() {\n    if (!this.targetWindow) {\n      this.scrollState = null\n      return\n    }\n    if (this.rafId != null) return\n    this.rafId = this.targetWindow.requestAnimationFrame(() =\u003e {\n      this.rafId = null\n      this.reconcileScroll()\n    })\n  }\n  private reconcileScroll() {\n    if (!this.scrollState) return\n\n    const el = this.scrollElement\n    if (!el) return\n\n    // Safety valve: bail out if reconciliation has been running too long\n    const MAX_RECONCILE_MS = 5000\n    if (this.now() - this.scrollState.startedAt \u003e MAX_RECONCILE_MS) {\n      this.scrollState = null\n      return\n    }\n\n    const offsetInfo =\n      this.scrollState.index != null\n        ? this.getOffsetForIndex(this.scrollState.index, this.scrollState.align)\n        : undefined\n    const targetOffset = offsetInfo\n      ? offsetInfo[0]\n      : this.scrollState.lastTargetOffset\n\n    // Require one stable frame where target matches scroll offset.\n    // approxEqual() already tolerates minor fluctuations, so one frame is sufficient\n    // to confirm scroll has reached its target without premature cleanup.\n    const STABLE_FRAMES = 1\n\n    const targetChanged = targetOffset !== this.scrollState.lastTargetOffset\n\n    if (!targetChanged \u0026\u0026 approxEqual(targetOffset, this.getScrollOffset())) {\n      this.scrollState.stableFrames++\n      if (this.scrollState.stableFrames \u003e= STABLE_FRAMES) {\n        this.scrollState = null\n        return\n      }\n    } else {\n      this.scrollState.stableFrames = 0\n\n      if (targetChanged) {\n        this.scrollState.lastTargetOffset = targetOffset\n        // Switch to 'auto' behavior once measurements cause target to change\n        // We want to jump directly to the correct position, not smoothly animate to it\n        this.scrollState.behavior = 'auto'\n\n        this._scrollToOffset(targetOffset, {\n          adjustments: undefined,\n          behavior: 'auto',\n        })\n      }\n    }\n\n    // Always reschedule while scrollState is active to guarantee\n    // the safety valve timeout runs even if no scroll events fire\n    // (e.g. no-op scrollToFn, detached element)\n    this.scheduleScrollReconcile()\n  }\n\n  private getSize = () =\u003e {\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 = () =\u003e {\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\u003cVirtualItem\u003e,\n    index: number,\n  ) =\u003e {\n    const furthestMeasurementsFound = new Map\u003cnumber, true\u003e()\n    const furthestMeasurements = new Map\u003cnumber, VirtualItem\u003e()\n    for (let m = index - 1; m \u003e= 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 \u003e previousFurthestMeasurement.end\n      ) {\n        furthestMeasurements.set(measurement.lane, measurement)\n      } else if (measurement.end \u003c 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) =\u003e {\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    () =\u003e [\n      this.options.count,\n      this.options.paddingStart,\n      this.options.scrollMargin,\n      this.options.getItemKey,\n      this.options.enabled,\n      this.options.lanes,\n    ],\n    (count, paddingStart, scrollMargin, getItemKey, enabled, lanes) =\u003e {\n      const lanesChanged =\n        this.prevLanes !== undefined \u0026\u0026 this.prevLanes !== lanes\n\n      if (lanesChanged) {\n        // Set flag for getMeasurements to handle\n        this.lanesChangedFlag = true\n      }\n\n      this.prevLanes = lanes\n      this.pendingMeasuredCacheIndexes = []\n\n      return {\n        count,\n        paddingStart,\n        scrollMargin,\n        getItemKey,\n        enabled,\n        lanes,\n      }\n    },\n    {\n      key: false,\n    },\n  )\n\n  private getMeasurements = memo(\n    () =\u003e [this.getMeasurementOptions(), this.itemSizeCache],\n    (\n      { count, paddingStart, scrollMargin, getItemKey, enabled, lanes },\n      itemSizeCache,\n    ) =\u003e {\n      if (!enabled) {\n        this.measurementsCache = []\n        this.itemSizeCache.clear()\n        this.laneAssignments.clear()\n        return []\n      }\n\n      // Clean up stale lane cache entries when count decreases\n      if (this.laneAssignments.size \u003e count) {\n        for (const index of this.laneAssignments.keys()) {\n          if (index \u003e= count) {\n            this.laneAssignments.delete(index)\n          }\n        }\n      }\n\n      // ✅ Force complete recalculation when lanes change\n      if (this.lanesChangedFlag) {\n        this.lanesChangedFlag = false // Reset immediately\n        this.lanesSettling = true // Start settling period\n        this.measurementsCache = []\n        this.itemSizeCache.clear()\n        this.laneAssignments.clear() // Clear lane cache for new lane count\n        // Clear pending indexes to force min = 0\n        this.pendingMeasuredCacheIndexes = []\n      }\n\n      // Don't restore from initialMeasurementsCache during lane changes\n      // as it contains stale lane assignments from the previous lane count\n      if (this.measurementsCache.length === 0 \u0026\u0026 !this.lanesSettling) {\n        this.measurementsCache = this.options.initialMeasurementsCache\n        this.measurementsCache.forEach((item) =\u003e {\n          this.itemSizeCache.set(item.key, item.size)\n        })\n      }\n\n      // ✅ During lanes settling, ignore pendingMeasuredCacheIndexes to prevent repositioning\n      const min = this.lanesSettling\n        ? 0\n        : this.pendingMeasuredCacheIndexes.length \u003e 0\n          ? Math.min(...this.pendingMeasuredCacheIndexes)\n          : 0\n      this.pendingMeasuredCacheIndexes = []\n\n      // ✅ End settling period when cache is fully built\n      if (this.lanesSettling \u0026\u0026 this.measurementsCache.length === count) {\n        this.lanesSettling = false\n      }\n\n      const measurements = this.measurementsCache.slice(0, min)\n\n      // ✅ Performance: Track last item index per lane for O(1) lookup\n      const laneLastIndex: Array\u003cnumber | undefined\u003e = new Array(lanes).fill(\n        undefined,\n      )\n\n      // Initialize from existing measurements (before min)\n      for (let m = 0; m \u003c min; m++) {\n        const item = measurements[m]\n        if (item) {\n          laneLastIndex[item.lane] = m\n        }\n      }\n\n      for (let i = min; i \u003c count; i++) {\n        const key = getItemKey(i)\n\n        // Check for cached lane assignment\n        const cachedLane = this.laneAssignments.get(i)\n        let lane: number\n        let start: number\n\n        if (cachedLane !== undefined \u0026\u0026 this.options.lanes \u003e 1) {\n          // Use cached lane - O(1) lookup for previous item in same lane\n          lane = cachedLane\n          const prevIndex = laneLastIndex[lane]\n          const prevInLane =\n            prevIndex !== undefined ? measurements[prevIndex] : undefined\n          start = prevInLane\n            ? prevInLane.end + this.options.gap\n            : paddingStart + scrollMargin\n        } else {\n          // No cache - use original logic (find shortest lane)\n          const furthestMeasurement =\n            this.options.lanes === 1\n              ? measurements[i - 1]\n              : this.getFurthestMeasurement(measurements, i)\n\n          start = furthestMeasurement\n            ? furthestMeasurement.end + this.options.gap\n            : paddingStart + scrollMargin\n\n          lane = furthestMeasurement\n            ? furthestMeasurement.lane\n            : i % this.options.lanes\n\n          // Cache the lane assignment\n          if (this.options.lanes \u003e 1) {\n            this.laneAssignments.set(i, lane)\n          }\n        }\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        measurements[i] = {\n          index: i,\n          start,\n          size,\n          end,\n          key,\n          lane,\n        }\n\n        // ✅ Performance: Update lane's last item index\n        laneLastIndex[lane] = i\n      }\n\n      this.measurementsCache = measurements\n\n      return measurements\n    },\n    {\n      key: process.env.NODE_ENV !== 'production' \u0026\u0026 'getMeasurements',\n      debug: () =\u003e this.options.debug,\n    },\n  )\n\n  calculateRange = memo(\n    () =\u003e [\n      this.getMeasurements(),\n      this.getSize(),\n      this.getScrollOffset(),\n      this.options.lanes,\n    ],\n    (measurements, outerSize, scrollOffset, lanes) =\u003e {\n      return (this.range =\n        measurements.length \u003e 0 \u0026\u0026 outerSize \u003e 0\n          ? calculateRange({\n              measurements,\n              outerSize,\n              scrollOffset,\n              lanes,\n            })\n          : null)\n    },\n    {\n      key: process.env.NODE_ENV !== 'production' \u0026\u0026 'calculateRange',\n      debug: () =\u003e this.options.debug,\n    },\n  )\n\n  getVirtualIndexes = memo(\n    () =\u003e {\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) =\u003e {\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' \u0026\u0026 'getVirtualIndexes',\n      debug: () =\u003e this.options.debug,\n    },\n  )\n\n  indexFromElement = (node: TItemElement) =\u003e {\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  /**\n   * Determines if an item at the given index should be measured during smooth scroll.\n   * During smooth scroll, only items within a buffer range around the target are measured\n   * to prevent items far from the target from pushing it away.\n   */\n  private shouldMeasureDuringScroll = (index: number): boolean =\u003e {\n    // No scroll state or not smooth scroll - always allow measurements\n    if (!this.scrollState || this.scrollState.behavior !== 'smooth') {\n      return true\n    }\n\n    const scrollIndex =\n      this.scrollState.index ??\n      this.getVirtualItemForOffset(this.scrollState.lastTargetOffset)?.index\n\n    if (scrollIndex !== undefined \u0026\u0026 this.range) {\n      // Allow measurements within a buffer range around the scroll target\n      const bufferSize = Math.max(\n        this.options.overscan,\n        Math.ceil((this.range.endIndex - this.range.startIndex) / 2),\n      )\n      const minIndex = Math.max(0, scrollIndex - bufferSize)\n      const maxIndex = Math.min(\n        this.options.count - 1,\n        scrollIndex + bufferSize,\n      )\n      return index \u003e= minIndex \u0026\u0026 index \u003c= maxIndex\n    }\n\n    return true\n  }\n\n  measureElement = (node: TItemElement | null) =\u003e {\n    if (!node) {\n      this.elementsCache.forEach((cached, key) =\u003e {\n        if (!cached.isConnected) {\n          this.observer.unobserve(cached)\n          this.elementsCache.delete(key)\n        }\n      })\n      return\n    }\n\n    const index = this.indexFromElement(node)\n    const key = this.options.getItemKey(index)\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    // Sync-measure when idle (initial render) or during programmatic scrolling\n    // (scrollToIndex/scrollToOffset) where reconcileScroll needs sizes in the same frame.\n    // During normal user scrolling, skip sync measurement — the RO callback handles it async.\n    if (\n      (!this.isScrolling || this.scrollState) \u0026\u0026\n      this.shouldMeasureDuringScroll(index)\n    ) {\n      this.resizeItem(index, this.options.measureElement(node, undefined, this))\n    }\n  }\n\n  resizeItem = (index: number, size: number) =\u003e {\n    const item = this.measurementsCache[index]\n    if (!item) 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.scrollState?.behavior !== 'smooth' \u0026\u0026\n        (this.shouldAdjustScrollPositionOnItemSizeChange !== undefined\n          ? this.shouldAdjustScrollPositionOnItemSizeChange(item, delta, this)\n          : item.start \u003c this.getScrollOffset() + this.scrollAdjustments)\n      ) {\n        if (process.env.NODE_ENV !== 'production' \u0026\u0026 this.options.debug) {\n          console.info('correction', delta)\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  getVirtualItems = memo(\n    () =\u003e [this.getVirtualIndexes(), this.getMeasurements()],\n    (indexes, measurements) =\u003e {\n      const virtualItems: Array\u003cVirtualItem\u003e = []\n\n      for (let k = 0, len = indexes.length; k \u003c 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' \u0026\u0026 'getVirtualItems',\n      debug: () =\u003e this.options.debug,\n    },\n  )\n\n  getVirtualItemForOffset = (offset: number) =\u003e {\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) =\u003e notUndefined(measurements[index]).start,\n          offset,\n        )\n      ],\n    )\n  }\n\n  private getMaxScrollOffset = () =\u003e {\n    if (!this.scrollElement) return 0\n\n    if ('scrollHeight' in this.scrollElement) {\n      // Element\n      return this.options.horizontal\n        ? this.scrollElement.scrollWidth - this.scrollElement.clientWidth\n        : this.scrollElement.scrollHeight - this.scrollElement.clientHeight\n    } else {\n      // Window\n      const doc = this.scrollElement.document.documentElement\n      return this.options.horizontal\n        ? doc.scrollWidth - this.scrollElement.innerWidth\n        : doc.scrollHeight - this.scrollElement.innerHeight\n    }\n  }\n\n  getOffsetForAlignment = (\n    toOffset: number,\n    align: ScrollAlignment,\n    itemSize = 0,\n  ) =\u003e {\n    if (!this.scrollElement) return 0\n\n    const size = this.getSize()\n    const scrollOffset = this.getScrollOffset()\n\n    if (align === 'auto') {\n      align = toOffset \u003e= 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.getMaxScrollOffset()\n\n    return Math.max(Math.min(maxOffset, toOffset), 0)\n  }\n\n  getOffsetForIndex = (index: number, align: ScrollAlignment = 'auto') =\u003e {\n    index = Math.max(0, Math.min(index, this.options.count - 1))\n\n    const size = this.getSize()\n    const scrollOffset = this.getScrollOffset()\n\n    const item = this.measurementsCache[index]\n    if (!item) return\n\n    if (align === 'auto') {\n      if (item.end \u003e= scrollOffset + size - this.options.scrollPaddingEnd) {\n        align = 'end'\n      } else if (item.start \u003c= scrollOffset + this.options.scrollPaddingStart) {\n        align = 'start'\n      } else {\n        return [scrollOffset, align] as const\n      }\n    }\n\n    // For the last item with 'end' alignment, use browser's actual max scroll\n    // to account for borders/padding that aren't in our measurements\n    if (align === 'end' \u0026\u0026 index === this.options.count - 1) {\n      return [this.getMaxScrollOffset(), align] as const\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  scrollToOffset = (\n    toOffset: number,\n    { align = 'start', behavior = 'auto' }: ScrollToOffsetOptions = {},\n  ) =\u003e {\n    const offset = this.getOffsetForAlignment(toOffset, align)\n\n    const now = this.now()\n    this.scrollState = {\n      index: null,\n      align,\n      behavior,\n      startedAt: now,\n      lastTargetOffset: offset,\n      stableFrames: 0,\n    }\n\n    this._scrollToOffset(offset, { adjustments: undefined, behavior })\n\n    this.scheduleScrollReconcile()\n  }\n\n  scrollToIndex = (\n    index: number,\n    {\n      align: initialAlign = 'auto',\n      behavior = 'auto',\n    }: ScrollToIndexOptions = {},\n  ) =\u003e {\n    index = Math.max(0, Math.min(index, this.options.count - 1))\n\n    const offsetInfo = this.getOffsetForIndex(index, initialAlign)\n    if (!offsetInfo) {\n      return\n    }\n    const [offset, align] = offsetInfo\n\n    const now = this.now()\n    this.scrollState = {\n      index,\n      align,\n      behavior,\n      startedAt: now,\n      lastTargetOffset: offset,\n      stableFrames: 0,\n    }\n\n    this._scrollToOffset(offset, { adjustments: undefined, behavior })\n\n    this.scheduleScrollReconcile()\n  }\n\n  scrollBy = (\n    delta: number,\n    { behavior = 'auto' }: ScrollToOffsetOptions = {},\n  ) =\u003e {\n    const offset = this.getScrollOffset() + delta\n    const now = this.now()\n\n    this.scrollState = {\n      index: null,\n      align: 'start',\n      behavior,\n      startedAt: now,\n      lastTargetOffset: offset,\n      stableFrames: 0,\n    }\n\n    this._scrollToOffset(offset, { adjustments: undefined, behavior })\n\n    this.scheduleScrollReconcile()\n  }\n\n  getTotalSize = () =\u003e {\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\u003cnumber | null\u003e(this.options.lanes).fill(null)\n      let endIndex = measurements.length - 1\n      while (endIndex \u003e= 0 \u0026\u0026 endByLane.some((val) =\u003e 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 =\u003e 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  ) =\u003e {\n    this.options.scrollToFn(offset, { behavior, adjustments }, this)\n  }\n\n  measure = () =\u003e {\n    this.itemSizeCache = new Map()\n    this.laneAssignments = new Map() // Clear lane cache for full re-layout\n    this.notify(false)\n  }\n}\n\nconst findNearestBinarySearch = (\n  low: number,\n  high: number,\n  getCurrentValue: (i: number) =\u003e number,\n  value: number,\n) =\u003e {\n  while (low \u003c= high) {\n    const middle = ((low + high) / 2) | 0\n    const currentValue = getCurrentValue(middle)\n\n    if (currentValue \u003c value) {\n      low = middle + 1\n    } else if (currentValue \u003e value) {\n      high = middle - 1\n    } else {\n      return middle\n    }\n  }\n\n  if (low \u003e 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\u003cVirtualItem\u003e\n  outerSize: number\n  scrollOffset: number\n  lanes: number\n}) {\n  const lastIndex = measurements.length - 1\n  const getOffset = (index: number) =\u003e measurements[index]!.start\n\n  // handle case when item count is less than or equal to lanes\n  if (measurements.length \u003c= 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 \u003c lastIndex \u0026\u0026\n      measurements[endIndex]!.end \u003c scrollOffset + outerSize\n    ) {\n      endIndex++\n    }\n  } else if (lanes \u003e 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 \u003c lastIndex \u0026\u0026\n      endPerLane.some((pos) =\u003e pos \u003c 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 \u003e= 0 \u0026\u0026 startPerLane.some((pos) =\u003e pos \u003e= 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"],"version":3}
