@vielzeug/scroll 26.10.15 → 26.10.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"grouped-virtualizer.js","names":[],"sources":["../src/grouped-virtualizer.ts"],"sourcesContent":["import { createSnapshotStore, resolveEstimateFn } from './_utils';\nimport { requireNonNegativeNumber, requirePositiveNumber, validateOverscan } from './_validation';\nimport {\n createVirtualizer,\n DEFAULT_ESTIMATE_SIZE,\n DEFAULT_OVERSCAN,\n type MeasurementCache,\n type Overscan,\n type ScrollStore,\n type ScrollTarget,\n type ScrollToIndexOptions,\n type VirtualItem,\n type VirtualizerState,\n type VirtualizerUpdateOptions,\n type VirtualKey,\n} from './virtualizer';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface GroupSection<T> {\n items: T[];\n label: string;\n}\n\nexport interface GroupVirtualItem<T> extends VirtualItem {\n /** Item data. */\n data: T;\n /** Index within the section. */\n itemIndex: number;\n sectionIndex: number;\n}\n\nexport interface GroupVirtualHeader extends VirtualItem {\n label: string;\n sectionIndex: number;\n}\n\nexport interface GroupVirtualizerState<T> {\n readonly headers: GroupVirtualHeader[];\n readonly items: Array<GroupVirtualItem<T>>;\n readonly stickyHeader: GroupVirtualHeader | null;\n readonly totalSize: number;\n}\n\n/**\n * Options accepted by `GroupVirtualizer.update()`. Overrides are applied\n * together with the new sections on the next render cycle.\n *\n * Intentionally excludes `horizontal` (axis cannot change at runtime) and\n * `initialOffset` (one-time bootstrap).\n */\nexport interface GroupVirtualizerUpdateOptions<T> {\n estimateHeaderSize?: number | ((section: GroupSection<T>, sectionIndex: number) => number);\n estimateItemSize?: number | ((item: T, itemIndex: number, sectionIndex: number) => number);\n getItemKey?: (item: T, itemIndex: number, sectionIndex: number) => VirtualKey;\n measurementCache?: MeasurementCache;\n onChange?: ((state: GroupVirtualizerState<T>) => void) | undefined;\n onScrollEnd?: ((offset: number) => void) | undefined;\n onScrollingChange?: ((isScrolling: boolean) => void) | undefined;\n overscan?: Overscan;\n scrollEndDelay?: number;\n}\n\nexport interface GroupVirtualizerOptions<T> {\n estimateHeaderSize?: number | ((section: GroupSection<T>, sectionIndex: number) => number);\n estimateItemSize?: number | ((item: T, itemIndex: number, sectionIndex: number) => number);\n getItemKey?: (item: T, itemIndex: number, sectionIndex: number) => VirtualKey;\n horizontal?: boolean;\n measurementCache?: MeasurementCache;\n /** Called after every render cycle with the new state. Replace through `update()`. */\n onChange?: (state: GroupVirtualizerState<T>) => void;\n /** Called when scrolling settles. Replace through `update()`. */\n onScrollEnd?: (offset: number) => void;\n /** Called when the scrolling state changes. Replace through `update()`. */\n onScrollingChange?: (isScrolling: boolean) => void;\n overscan?: Overscan;\n /**\n * Debounce delay (ms) for scroll-end detection. Defaults to 150.\n * See `VirtualizerOptions.scrollEndDelay` for details.\n */\n scrollEndDelay?: number;\n sections: Array<GroupSection<T>>;\n}\n\nexport interface GroupVirtualizer<T> extends ScrollStore<GroupVirtualizerState<T>> {\n readonly count: number;\n readonly disposalSignal: AbortSignal;\n dispose: () => void;\n readonly disposed: boolean;\n invalidate: () => void;\n /** `true` while the user is actively scrolling; `false` once scroll has settled. */\n readonly isScrolling: boolean;\n readonly items: ReadonlyArray<GroupVirtualItem<T>>;\n measure: (index: number, size: number) => void;\n measureBatch: (entries: Array<{ index: number; size: number }>) => void;\n measureEl: (index: number, el: HTMLElement) => () => void;\n refresh: () => void;\n readonly scrollOffset: number;\n scrollToBottom: (options?: { behavior?: ScrollBehavior }) => void;\n scrollToIndex: (index: number, options?: ScrollToIndexOptions) => void;\n scrollToItem: (sectionIndex: number, itemIndex: number, options?: ScrollToIndexOptions) => void;\n scrollToOffset: (offset: number, options?: { behavior?: ScrollBehavior }) => void;\n scrollToSection: (sectionIndex: number, options?: ScrollToIndexOptions) => void;\n scrollToTop: (options?: { behavior?: ScrollBehavior }) => void;\n readonly stickyItems: VirtualItem[];\n readonly totalSize: number;\n update: (sections: Array<GroupSection<T>>, opts?: GroupVirtualizerUpdateOptions<T>) => void;\n [Symbol.dispose]: () => void;\n}\n\n// ─── Flat entry map ───────────────────────────────────────────────────────────\n\ntype FlatHeader = { isHeader: true; itemIndex: -1; label: string; sectionIndex: number };\ntype FlatItem<T> = { isHeader: false; item: T; itemIndex: number; sectionIndex: number };\ntype FlatEntry<T> = FlatHeader | FlatItem<T>;\n\nfunction buildFlatEntries<T>(sections: Array<GroupSection<T>>): FlatEntry<T>[] {\n const flat: FlatEntry<T>[] = [];\n\n for (let s = 0; s < sections.length; s++) {\n const section = sections[s]!;\n\n flat.push({ isHeader: true, itemIndex: -1, label: section.label, sectionIndex: s });\n\n for (let i = 0; i < section.items.length; i++) {\n flat.push({ isHeader: false, item: section.items[i]!, itemIndex: i, sectionIndex: s });\n }\n }\n\n return flat;\n}\n\n// ─── Implementation ───────────────────────────────────────────────────────────\n\nexport function createGroupedVirtualizer<T>(\n target: ScrollTarget,\n options: GroupVirtualizerOptions<T>,\n): GroupVirtualizer<T> {\n if (typeof options.estimateHeaderSize === 'number')\n requirePositiveNumber(options.estimateHeaderSize, 'estimateHeaderSize');\n\n if (typeof options.estimateItemSize === 'number') requirePositiveNumber(options.estimateItemSize, 'estimateItemSize');\n\n if (options.overscan !== undefined) validateOverscan(options.overscan);\n\n if (options.scrollEndDelay !== undefined) requireNonNegativeNumber(options.scrollEndDelay, 'scrollEndDelay');\n\n let sections = options.sections;\n let flat = buildFlatEntries(sections);\n\n function buildEstimateHeader(\n estimateHeaderSize: GroupVirtualizerOptions<T>['estimateHeaderSize'],\n ): (index: number) => number {\n return typeof estimateHeaderSize === 'function'\n ? (index: number) => {\n const entry = flat[index]!;\n\n return (estimateHeaderSize as (section: GroupSection<T>, sectionIndex: number) => number)(\n sections[entry.sectionIndex]!,\n entry.sectionIndex,\n );\n }\n : resolveEstimateFn(\n typeof estimateHeaderSize === 'number' ? estimateHeaderSize : undefined,\n DEFAULT_ESTIMATE_SIZE,\n );\n }\n\n let estimateHeaderFn = buildEstimateHeader(options.estimateHeaderSize);\n let estimateItemUserFn: ((item: T, itemIndex: number, sectionIndex: number) => number) | null =\n typeof options.estimateItemSize === 'function' ? options.estimateItemSize : null;\n let estimateItemFixedFn: ((index: number) => number) | null = estimateItemUserFn\n ? null\n : resolveEstimateFn(\n typeof options.estimateItemSize === 'number' ? options.estimateItemSize : undefined,\n DEFAULT_ESTIMATE_SIZE,\n );\n let userGetItemKey = options.getItemKey;\n\n function estimateFn(globalIndex: number): number {\n const entry = flat[globalIndex];\n\n if (!entry) return DEFAULT_ESTIMATE_SIZE;\n\n if (entry.isHeader) return estimateHeaderFn(globalIndex);\n\n if (estimateItemUserFn) return estimateItemUserFn(entry.item, entry.itemIndex, entry.sectionIndex);\n\n return estimateItemFixedFn!(globalIndex);\n }\n\n function getItemKey(globalIndex: number): VirtualKey {\n const entry = flat[globalIndex];\n\n if (!entry) return globalIndex;\n\n if (entry.isHeader) return `__header_${entry.sectionIndex}`;\n\n if (userGetItemKey) return userGetItemKey(entry.item, entry.itemIndex, entry.sectionIndex);\n\n return globalIndex;\n }\n\n let disposed = false;\n let lastItems: Array<GroupVirtualItem<T>> = [];\n const stateStore = createSnapshotStore<GroupVirtualizerState<T>>({\n headers: [],\n items: [],\n stickyHeader: null,\n totalSize: 0,\n });\n let onChange = options.onChange;\n let onScrollEnd = options.onScrollEnd;\n let onScrollingChange = options.onScrollingChange;\n\n // Publish state before invoking the render callback.\n function emitState(state: GroupVirtualizerState<T>): void {\n stateStore.publish(state);\n onChange?.(state);\n }\n\n function mapState(state: VirtualizerState): GroupVirtualizerState<T> {\n const items: Array<GroupVirtualItem<T>> = [];\n const headers: GroupVirtualHeader[] = [];\n let stickyHeader: GroupVirtualHeader | null = null;\n\n for (const vi of state.items) {\n const entry = flat[vi.index];\n\n if (!entry) continue;\n\n if (entry.isHeader) {\n headers.push({ ...vi, label: entry.label ?? '', sectionIndex: entry.sectionIndex });\n } else {\n items.push({ ...vi, data: entry.item, itemIndex: entry.itemIndex, sectionIndex: entry.sectionIndex });\n }\n }\n\n if (state.stickyItems.length > 0) {\n const svi = state.stickyItems[0]!;\n const entry = flat[svi.index];\n\n if (entry?.isHeader) {\n stickyHeader = { ...svi, label: entry.label ?? '', sectionIndex: entry.sectionIndex };\n }\n }\n\n lastItems = items;\n\n return { headers, items, stickyHeader, totalSize: state.totalSize };\n }\n\n const virtualizer = createVirtualizer(target, {\n count: flat.length,\n estimateSize: estimateFn,\n getItemKey,\n horizontal: options.horizontal,\n measurementCache: options.measurementCache,\n onChange: (state) => {\n const mapped = mapState(state);\n\n emitState(mapped);\n },\n onScrollEnd: (offset) => onScrollEnd?.(offset),\n onScrollingChange: (isScrolling) => onScrollingChange?.(isScrolling),\n overscan: options.overscan ?? DEFAULT_OVERSCAN,\n scrollEndDelay: options.scrollEndDelay,\n sticky: (i) => flat[i]?.isHeader ?? false,\n });\n\n const ac = new AbortController();\n\n function _dispose(): void {\n if (disposed) return;\n\n disposed = true;\n stateStore.dispose();\n ac.abort();\n virtualizer.dispose();\n }\n\n // Build a flat-index lookup: [sectionIndex, itemIndex] → flat index.\n // Returns -1 when sectionIndex is out of range so callers can no-op safely.\n function flatIndexOf(sectionIndex: number, itemIndex?: number): number {\n if (sectionIndex < 0 || sectionIndex >= sections.length) return -1;\n\n let pos = 0;\n\n for (let s = 0; s < sections.length; s++) {\n if (s === sectionIndex) {\n if (itemIndex === undefined) return pos; // header\n\n return pos + 1 + itemIndex;\n }\n\n pos += 1 + sections[s]!.items.length;\n }\n\n return -1; // unreachable\n }\n\n return {\n get count() {\n return virtualizer.count;\n },\n get disposalSignal() {\n return ac.signal;\n },\n dispose: _dispose,\n get disposed() {\n return disposed;\n },\n getSnapshot: stateStore.getSnapshot,\n invalidate() {\n if (disposed) return;\n\n virtualizer.invalidate();\n },\n get isScrolling() {\n return virtualizer.isScrolling;\n },\n get items() {\n return lastItems;\n },\n measure(index: number, size: number) {\n if (disposed) return;\n\n virtualizer.measure(index, size);\n },\n measureBatch(entries: Array<{ index: number; size: number }>) {\n if (disposed) return;\n\n virtualizer.measureBatch(entries);\n },\n measureEl(index: number, el: HTMLElement) {\n if (disposed) return () => {};\n\n return virtualizer.measureEl(index, el);\n },\n refresh() {\n if (disposed) return;\n\n virtualizer.refresh();\n },\n get scrollOffset() {\n return virtualizer.scrollOffset;\n },\n scrollToBottom(opts?: { behavior?: ScrollBehavior }) {\n if (disposed) return;\n\n virtualizer.scrollToBottom(opts);\n },\n scrollToIndex(index: number, opts?: ScrollToIndexOptions) {\n if (disposed) return;\n\n virtualizer.scrollToIndex(index, opts);\n },\n scrollToItem(sectionIndex, itemIndex, opts = {}) {\n if (disposed) return;\n\n const globalIndex = flatIndexOf(sectionIndex, itemIndex);\n\n if (globalIndex < 0) return;\n\n virtualizer.scrollToIndex(globalIndex, opts);\n },\n scrollToOffset(offset: number, opts?: { behavior?: ScrollBehavior }) {\n if (disposed) return;\n\n virtualizer.scrollToOffset(offset, opts);\n },\n scrollToSection(sectionIndex, opts = {}) {\n if (disposed) return;\n\n const globalIndex = flatIndexOf(sectionIndex);\n\n if (globalIndex < 0) return;\n\n virtualizer.scrollToIndex(globalIndex, opts);\n },\n scrollToTop(opts?: { behavior?: ScrollBehavior }) {\n if (disposed) return;\n\n virtualizer.scrollToTop(opts);\n },\n get stickyItems() {\n return virtualizer.stickyItems;\n },\n subscribe: stateStore.subscribe,\n [Symbol.dispose]: _dispose,\n get totalSize() {\n return virtualizer.totalSize;\n },\n /**\n * Replace all sections. Closures for estimateFn and getItemKey already\n * capture the live `flat`/`sections` references: only count is passed to\n * the underlying virtualizer to avoid discarding measured sizes on every\n * data refresh. `refresh()` rebuilds offsets while preserving the cache.\n */\n update(nextSections, opts?: GroupVirtualizerUpdateOptions<T>) {\n if (disposed) return;\n\n if (opts) {\n if (typeof opts.estimateHeaderSize === 'number')\n requirePositiveNumber(opts.estimateHeaderSize, 'estimateHeaderSize');\n\n if (typeof opts.estimateItemSize === 'number') requirePositiveNumber(opts.estimateItemSize, 'estimateItemSize');\n\n if (opts.overscan !== undefined) validateOverscan(opts.overscan);\n\n if (opts.scrollEndDelay !== undefined) requireNonNegativeNumber(opts.scrollEndDelay, 'scrollEndDelay');\n\n if (Object.hasOwn(opts, 'onChange')) onChange = opts.onChange;\n\n if (Object.hasOwn(opts, 'onScrollEnd')) onScrollEnd = opts.onScrollEnd;\n\n if (Object.hasOwn(opts, 'onScrollingChange')) onScrollingChange = opts.onScrollingChange;\n\n // Apply option overrides before rebuilding flat entries.\n if (opts.estimateHeaderSize !== undefined) {\n estimateHeaderFn = buildEstimateHeader(opts.estimateHeaderSize);\n }\n\n if (opts.estimateItemSize !== undefined) {\n estimateItemUserFn = typeof opts.estimateItemSize === 'function' ? opts.estimateItemSize : null;\n estimateItemFixedFn = estimateItemUserFn\n ? null\n : resolveEstimateFn(\n typeof opts.estimateItemSize === 'number' ? opts.estimateItemSize : undefined,\n DEFAULT_ESTIMATE_SIZE,\n );\n }\n\n if (opts.getItemKey !== undefined) userGetItemKey = opts.getItemKey;\n }\n\n sections = nextSections;\n\n const prevCount = flat.length;\n\n flat = buildFlatEntries(sections);\n\n const virtUpdateOpts: VirtualizerUpdateOptions = { count: flat.length };\n\n if (opts?.measurementCache !== undefined) virtUpdateOpts.measurementCache = opts.measurementCache;\n\n if (opts?.overscan !== undefined) virtUpdateOpts.overscan = opts.overscan;\n\n if (opts?.scrollEndDelay !== undefined) virtUpdateOpts.scrollEndDelay = opts.scrollEndDelay;\n\n if (\n flat.length !== prevCount ||\n opts?.measurementCache !== undefined ||\n opts?.overscan !== undefined ||\n opts?.scrollEndDelay !== undefined\n ) {\n virtualizer.update(virtUpdateOpts);\n } else {\n virtualizer.refresh();\n }\n },\n };\n}\n"],"mappings":"2OAoHA,SAAS,EAAoB,EAAkD,CAC7E,IAAM,EAAuB,CAAC,EAE9B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAS,OAAQ,IAAK,CACxC,IAAM,EAAU,EAAS,GAEzB,EAAK,KAAK,CAAE,SAAU,GAAM,UAAW,GAAI,MAAO,EAAQ,MAAO,aAAc,CAAE,CAAC,EAElF,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,MAAM,OAAQ,IACxC,EAAK,KAAK,CAAE,SAAU,GAAO,KAAM,EAAQ,MAAM,GAAK,UAAW,EAAG,aAAc,CAAE,CAAC,CAEzF,CAEA,OAAO,CACT,CAIA,SAAgB,EACd,EACA,EACqB,CACjB,OAAO,EAAQ,oBAAuB,UACxC,EAAsB,EAAQ,mBAAoB,oBAAoB,EAEpE,OAAO,EAAQ,kBAAqB,UAAU,EAAsB,EAAQ,iBAAkB,kBAAkB,EAEhH,EAAQ,WAAa,IAAA,IAAW,EAAiB,EAAQ,QAAQ,EAEjE,EAAQ,iBAAmB,IAAA,IAAW,EAAyB,EAAQ,eAAgB,gBAAgB,EAE3G,IAAI,EAAW,EAAQ,SACnB,EAAO,EAAiB,CAAQ,EAEpC,SAAS,EACP,EAC2B,CAC3B,OAAO,OAAO,GAAuB,WAChC,GAAkB,CACjB,IAAM,EAAQ,EAAK,GAEnB,OAAQ,EACN,EAAS,EAAM,cACf,EAAM,YACR,CACF,EACA,EACE,OAAO,GAAuB,SAAW,EAAqB,IAAA,GAAA,EAEhE,CACN,CAEA,IAAI,EAAmB,EAAoB,EAAQ,kBAAkB,EACjE,EACF,OAAO,EAAQ,kBAAqB,WAAa,EAAQ,iBAAmB,KAC1E,EAA0D,EAC1D,KACA,EACE,OAAO,EAAQ,kBAAqB,SAAW,EAAQ,iBAAmB,IAAA,GAAA,EAE5E,EACA,EAAiB,EAAQ,WAE7B,SAAS,EAAW,EAA6B,CAC/C,IAAM,EAAQ,EAAK,GAQnB,OANK,EAED,EAAM,SAAiB,EAAiB,CAAW,EAEnD,EAA2B,EAAmB,EAAM,KAAM,EAAM,UAAW,EAAM,YAAY,EAE1F,EAAqB,CAAW,EAN3B,EAOd,CAEA,SAAS,EAAW,EAAiC,CACnD,IAAM,EAAQ,EAAK,GAQnB,OANK,EAED,EAAM,SAAiB,YAAY,EAAM,eAEzC,EAAuB,EAAe,EAAM,KAAM,EAAM,UAAW,EAAM,YAAY,EAElF,EANY,CAOrB,CAEA,IAAI,EAAW,GACX,EAAwC,CAAC,EACvC,EAAa,EAA8C,CAC/D,QAAS,CAAC,EACV,MAAO,CAAC,EACR,aAAc,KACd,UAAW,CACb,CAAC,EACG,EAAW,EAAQ,SACnB,EAAc,EAAQ,YACtB,EAAoB,EAAQ,kBAGhC,SAAS,EAAU,EAAuC,CACxD,EAAW,QAAQ,CAAK,EACxB,IAAW,CAAK,CAClB,CAEA,SAAS,EAAS,EAAmD,CACnE,IAAM,EAAoC,CAAC,EACrC,EAAgC,CAAC,EACnC,EAA0C,KAE9C,IAAK,IAAM,KAAM,EAAM,MAAO,CAC5B,IAAM,EAAQ,EAAK,EAAG,OAEjB,IAED,EAAM,SACR,EAAQ,KAAK,CAAE,GAAG,EAAI,MAAO,EAAM,OAAS,GAAI,aAAc,EAAM,YAAa,CAAC,EAElF,EAAM,KAAK,CAAE,GAAG,EAAI,KAAM,EAAM,KAAM,UAAW,EAAM,UAAW,aAAc,EAAM,YAAa,CAAC,EAExG,CAEA,GAAI,EAAM,YAAY,OAAS,EAAG,CAChC,IAAM,EAAM,EAAM,YAAY,GACxB,EAAQ,EAAK,EAAI,OAEnB,GAAO,WACT,EAAe,CAAE,GAAG,EAAK,MAAO,EAAM,OAAS,GAAI,aAAc,EAAM,YAAa,EAExF,CAIA,MAFA,GAAY,EAEL,CAAE,UAAS,QAAO,eAAc,UAAW,EAAM,SAAU,CACpE,CAEA,IAAM,EAAc,EAAkB,EAAQ,CAC5C,MAAO,EAAK,OACZ,aAAc,EACd,aACA,WAAY,EAAQ,WACpB,iBAAkB,EAAQ,iBAC1B,SAAW,GAAU,CAGnB,EAFe,EAAS,CAEd,CAAM,CAClB,EACA,YAAc,GAAW,IAAc,CAAM,EAC7C,kBAAoB,GAAgB,IAAoB,CAAW,EACnE,SAAU,EAAQ,UAAA,EAClB,eAAgB,EAAQ,eACxB,OAAS,GAAM,EAAK,EAAE,EAAE,UAAY,EACtC,CAAC,EAEK,EAAK,IAAI,gBAEf,SAAS,GAAiB,CACpB,IAEJ,EAAW,GACX,EAAW,QAAQ,EACnB,EAAG,MAAM,EACT,EAAY,QAAQ,EACtB,CAIA,SAAS,EAAY,EAAsB,EAA4B,CACrE,GAAI,EAAe,GAAK,GAAgB,EAAS,OAAQ,MAAO,GAEhE,IAAI,EAAM,EAEV,IAAK,IAAI,EAAI,EAAG,EAAI,EAAS,OAAQ,IAAK,CACxC,GAAI,IAAM,EAGR,OAFI,IAAc,IAAA,GAAkB,EAE7B,EAAM,EAAI,EAGnB,GAAO,EAAI,EAAS,EAAE,CAAE,MAAM,MAChC,CAEA,MAAO,EACT,CAEA,MAAO,CACL,IAAI,OAAQ,CACV,OAAO,EAAY,KACrB,EACA,IAAI,gBAAiB,CACnB,OAAO,EAAG,MACZ,EACA,QAAS,EACT,IAAI,UAAW,CACb,OAAO,CACT,EACA,YAAa,EAAW,YACxB,YAAa,CACP,GAEJ,EAAY,WAAW,CACzB,EACA,IAAI,aAAc,CAChB,OAAO,EAAY,WACrB,EACA,IAAI,OAAQ,CACV,OAAO,CACT,EACA,QAAQ,EAAe,EAAc,CAC/B,GAEJ,EAAY,QAAQ,EAAO,CAAI,CACjC,EACA,aAAa,EAAiD,CACxD,GAEJ,EAAY,aAAa,CAAO,CAClC,EACA,UAAU,EAAe,EAAiB,CAGxC,OAFI,MAAuB,CAAC,EAErB,EAAY,UAAU,EAAO,CAAE,CACxC,EACA,SAAU,CACJ,GAEJ,EAAY,QAAQ,CACtB,EACA,IAAI,cAAe,CACjB,OAAO,EAAY,YACrB,EACA,eAAe,EAAsC,CAC/C,GAEJ,EAAY,eAAe,CAAI,CACjC,EACA,cAAc,EAAe,EAA6B,CACpD,GAEJ,EAAY,cAAc,EAAO,CAAI,CACvC,EACA,aAAa,EAAc,EAAW,EAAO,CAAC,EAAG,CAC/C,GAAI,EAAU,OAEd,IAAM,EAAc,EAAY,EAAc,CAAS,EAEnD,EAAc,GAElB,EAAY,cAAc,EAAa,CAAI,CAC7C,EACA,eAAe,EAAgB,EAAsC,CAC/D,GAEJ,EAAY,eAAe,EAAQ,CAAI,CACzC,EACA,gBAAgB,EAAc,EAAO,CAAC,EAAG,CACvC,GAAI,EAAU,OAEd,IAAM,EAAc,EAAY,CAAY,EAExC,EAAc,GAElB,EAAY,cAAc,EAAa,CAAI,CAC7C,EACA,YAAY,EAAsC,CAC5C,GAEJ,EAAY,YAAY,CAAI,CAC9B,EACA,IAAI,aAAc,CAChB,OAAO,EAAY,WACrB,EACA,UAAW,EAAW,WACrB,OAAO,SAAU,EAClB,IAAI,WAAY,CACd,OAAO,EAAY,SACrB,EAOA,OAAO,EAAc,EAAyC,CAC5D,GAAI,EAAU,OAEV,IACE,OAAO,EAAK,oBAAuB,UACrC,EAAsB,EAAK,mBAAoB,oBAAoB,EAEjE,OAAO,EAAK,kBAAqB,UAAU,EAAsB,EAAK,iBAAkB,kBAAkB,EAE1G,EAAK,WAAa,IAAA,IAAW,EAAiB,EAAK,QAAQ,EAE3D,EAAK,iBAAmB,IAAA,IAAW,EAAyB,EAAK,eAAgB,gBAAgB,EAEjG,OAAO,OAAO,EAAM,UAAU,IAAG,EAAW,EAAK,UAEjD,OAAO,OAAO,EAAM,aAAa,IAAG,EAAc,EAAK,aAEvD,OAAO,OAAO,EAAM,mBAAmB,IAAG,EAAoB,EAAK,mBAGnE,EAAK,qBAAuB,IAAA,KAC9B,EAAmB,EAAoB,EAAK,kBAAkB,GAG5D,EAAK,mBAAqB,IAAA,KAC5B,EAAqB,OAAO,EAAK,kBAAqB,WAAa,EAAK,iBAAmB,KAC3F,EAAsB,EAClB,KACA,EACE,OAAO,EAAK,kBAAqB,SAAW,EAAK,iBAAmB,IAAA,GAAA,EAEtE,GAGF,EAAK,aAAe,IAAA,KAAW,EAAiB,EAAK,aAG3D,EAAW,EAEX,IAAM,EAAY,EAAK,OAEvB,EAAO,EAAiB,CAAQ,EAEhC,IAAM,EAA2C,CAAE,MAAO,EAAK,MAAO,EAElE,GAAM,mBAAqB,IAAA,KAAW,EAAe,iBAAmB,EAAK,kBAE7E,GAAM,WAAa,IAAA,KAAW,EAAe,SAAW,EAAK,UAE7D,GAAM,iBAAmB,IAAA,KAAW,EAAe,eAAiB,EAAK,gBAG3E,EAAK,SAAW,GAChB,GAAM,mBAAqB,IAAA,IAC3B,GAAM,WAAa,IAAA,IACnB,GAAM,iBAAmB,IAAA,GAEzB,EAAY,OAAO,CAAc,EAEjC,EAAY,QAAQ,CAExB,CACF,CACF"}
1
+ {"version":3,"file":"grouped-virtualizer.js","names":["buildFlatEntries","flat","s","sections","section","i","createGroupedVirtualizer","options","requirePositiveNumber","validateOverscan","requireNonNegativeNumber","buildEstimateHeader","estimateHeaderSize","entry","index","resolveEstimateFn","estimateHeaderFn","estimateItemUserFn","estimateItemFixedFn","userGetItemKey","estimateFn","globalIndex","getItemKey","disposed","lastItems","stateStore","createSnapshotStore","onChange","onScrollEnd","onScrollingChange","emitState","state","mapState","items","headers","stickyHeader","vi","svi","virtualizer","createVirtualizer","target","offset","isScrolling","ac","_dispose","flatIndexOf","sectionIndex","pos","itemIndex","size","entries","el","opts","nextSections","prevCount","virtUpdateOpts"],"sources":["../src/grouped-virtualizer.ts"],"sourcesContent":["import { createSnapshotStore, resolveEstimateFn } from './_utils';\nimport { requireNonNegativeNumber, requirePositiveNumber, validateOverscan } from './_validation';\nimport {\n createVirtualizer,\n DEFAULT_ESTIMATE_SIZE,\n DEFAULT_OVERSCAN,\n type MeasurementCache,\n type Overscan,\n type ScrollStore,\n type ScrollTarget,\n type ScrollToIndexOptions,\n type VirtualItem,\n type VirtualizerState,\n type VirtualizerUpdateOptions,\n type VirtualKey,\n} from './virtualizer';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface GroupSection<T> {\n items: T[];\n label: string;\n}\n\nexport interface GroupVirtualItem<T> extends VirtualItem {\n /** Item data. */\n data: T;\n /** Index within the section. */\n itemIndex: number;\n sectionIndex: number;\n}\n\nexport interface GroupVirtualHeader extends VirtualItem {\n label: string;\n sectionIndex: number;\n}\n\nexport interface GroupVirtualizerState<T> {\n readonly headers: GroupVirtualHeader[];\n readonly items: Array<GroupVirtualItem<T>>;\n readonly stickyHeader: GroupVirtualHeader | null;\n readonly totalSize: number;\n}\n\n/**\n * Options accepted by `GroupVirtualizer.update()`. Overrides are applied\n * together with the new sections on the next render cycle.\n *\n * Intentionally excludes `horizontal` (axis cannot change at runtime) and\n * `initialOffset` (one-time bootstrap).\n */\nexport interface GroupVirtualizerUpdateOptions<T> {\n estimateHeaderSize?: number | ((section: GroupSection<T>, sectionIndex: number) => number);\n estimateItemSize?: number | ((item: T, itemIndex: number, sectionIndex: number) => number);\n getItemKey?: (item: T, itemIndex: number, sectionIndex: number) => VirtualKey;\n measurementCache?: MeasurementCache;\n onChange?: ((state: GroupVirtualizerState<T>) => void) | undefined;\n onScrollEnd?: ((offset: number) => void) | undefined;\n onScrollingChange?: ((isScrolling: boolean) => void) | undefined;\n overscan?: Overscan;\n scrollEndDelay?: number;\n}\n\nexport interface GroupVirtualizerOptions<T> {\n estimateHeaderSize?: number | ((section: GroupSection<T>, sectionIndex: number) => number);\n estimateItemSize?: number | ((item: T, itemIndex: number, sectionIndex: number) => number);\n getItemKey?: (item: T, itemIndex: number, sectionIndex: number) => VirtualKey;\n horizontal?: boolean;\n measurementCache?: MeasurementCache;\n /** Called after every render cycle with the new state. Replace through `update()`. */\n onChange?: (state: GroupVirtualizerState<T>) => void;\n /** Called when scrolling settles. Replace through `update()`. */\n onScrollEnd?: (offset: number) => void;\n /** Called when the scrolling state changes. Replace through `update()`. */\n onScrollingChange?: (isScrolling: boolean) => void;\n overscan?: Overscan;\n /**\n * Debounce delay (ms) for scroll-end detection. Defaults to 150.\n * See `VirtualizerOptions.scrollEndDelay` for details.\n */\n scrollEndDelay?: number;\n sections: Array<GroupSection<T>>;\n}\n\nexport interface GroupVirtualizer<T> extends ScrollStore<GroupVirtualizerState<T>> {\n readonly count: number;\n readonly disposalSignal: AbortSignal;\n dispose: () => void;\n readonly disposed: boolean;\n invalidate: () => void;\n /** `true` while the user is actively scrolling; `false` once scroll has settled. */\n readonly isScrolling: boolean;\n readonly items: ReadonlyArray<GroupVirtualItem<T>>;\n measure: (index: number, size: number) => void;\n measureBatch: (entries: Array<{ index: number; size: number }>) => void;\n measureEl: (index: number, el: HTMLElement) => () => void;\n refresh: () => void;\n readonly scrollOffset: number;\n scrollToBottom: (options?: { behavior?: ScrollBehavior }) => void;\n scrollToIndex: (index: number, options?: ScrollToIndexOptions) => void;\n scrollToItem: (sectionIndex: number, itemIndex: number, options?: ScrollToIndexOptions) => void;\n scrollToOffset: (offset: number, options?: { behavior?: ScrollBehavior }) => void;\n scrollToSection: (sectionIndex: number, options?: ScrollToIndexOptions) => void;\n scrollToTop: (options?: { behavior?: ScrollBehavior }) => void;\n readonly stickyItems: VirtualItem[];\n readonly totalSize: number;\n update: (sections: Array<GroupSection<T>>, opts?: GroupVirtualizerUpdateOptions<T>) => void;\n [Symbol.dispose]: () => void;\n}\n\n// ─── Flat entry map ───────────────────────────────────────────────────────────\n\ntype FlatHeader = { isHeader: true; itemIndex: -1; label: string; sectionIndex: number };\ntype FlatItem<T> = { isHeader: false; item: T; itemIndex: number; sectionIndex: number };\ntype FlatEntry<T> = FlatHeader | FlatItem<T>;\n\nfunction buildFlatEntries<T>(sections: Array<GroupSection<T>>): FlatEntry<T>[] {\n const flat: FlatEntry<T>[] = [];\n\n for (let s = 0; s < sections.length; s++) {\n const section = sections[s]!;\n\n flat.push({ isHeader: true, itemIndex: -1, label: section.label, sectionIndex: s });\n\n for (let i = 0; i < section.items.length; i++) {\n flat.push({ isHeader: false, item: section.items[i]!, itemIndex: i, sectionIndex: s });\n }\n }\n\n return flat;\n}\n\n// ─── Implementation ───────────────────────────────────────────────────────────\n\nexport function createGroupedVirtualizer<T>(\n target: ScrollTarget,\n options: GroupVirtualizerOptions<T>,\n): GroupVirtualizer<T> {\n if (typeof options.estimateHeaderSize === 'number')\n requirePositiveNumber(options.estimateHeaderSize, 'estimateHeaderSize');\n\n if (typeof options.estimateItemSize === 'number') requirePositiveNumber(options.estimateItemSize, 'estimateItemSize');\n\n if (options.overscan !== undefined) validateOverscan(options.overscan);\n\n if (options.scrollEndDelay !== undefined) requireNonNegativeNumber(options.scrollEndDelay, 'scrollEndDelay');\n\n let sections = options.sections;\n let flat = buildFlatEntries(sections);\n\n function buildEstimateHeader(\n estimateHeaderSize: GroupVirtualizerOptions<T>['estimateHeaderSize'],\n ): (index: number) => number {\n return typeof estimateHeaderSize === 'function'\n ? (index: number) => {\n const entry = flat[index]!;\n\n return (estimateHeaderSize as (section: GroupSection<T>, sectionIndex: number) => number)(\n sections[entry.sectionIndex]!,\n entry.sectionIndex,\n );\n }\n : resolveEstimateFn(\n typeof estimateHeaderSize === 'number' ? estimateHeaderSize : undefined,\n DEFAULT_ESTIMATE_SIZE,\n );\n }\n\n let estimateHeaderFn = buildEstimateHeader(options.estimateHeaderSize);\n let estimateItemUserFn: ((item: T, itemIndex: number, sectionIndex: number) => number) | null =\n typeof options.estimateItemSize === 'function' ? options.estimateItemSize : null;\n let estimateItemFixedFn: ((index: number) => number) | null = estimateItemUserFn\n ? null\n : resolveEstimateFn(\n typeof options.estimateItemSize === 'number' ? options.estimateItemSize : undefined,\n DEFAULT_ESTIMATE_SIZE,\n );\n let userGetItemKey = options.getItemKey;\n\n function estimateFn(globalIndex: number): number {\n const entry = flat[globalIndex];\n\n if (!entry) return DEFAULT_ESTIMATE_SIZE;\n\n if (entry.isHeader) return estimateHeaderFn(globalIndex);\n\n if (estimateItemUserFn) return estimateItemUserFn(entry.item, entry.itemIndex, entry.sectionIndex);\n\n return estimateItemFixedFn!(globalIndex);\n }\n\n function getItemKey(globalIndex: number): VirtualKey {\n const entry = flat[globalIndex];\n\n if (!entry) return globalIndex;\n\n if (entry.isHeader) return `__header_${entry.sectionIndex}`;\n\n if (userGetItemKey) return userGetItemKey(entry.item, entry.itemIndex, entry.sectionIndex);\n\n return globalIndex;\n }\n\n let disposed = false;\n let lastItems: Array<GroupVirtualItem<T>> = [];\n const stateStore = createSnapshotStore<GroupVirtualizerState<T>>({\n headers: [],\n items: [],\n stickyHeader: null,\n totalSize: 0,\n });\n let onChange = options.onChange;\n let onScrollEnd = options.onScrollEnd;\n let onScrollingChange = options.onScrollingChange;\n\n // Publish state before invoking the render callback.\n function emitState(state: GroupVirtualizerState<T>): void {\n stateStore.publish(state);\n onChange?.(state);\n }\n\n function mapState(state: VirtualizerState): GroupVirtualizerState<T> {\n const items: Array<GroupVirtualItem<T>> = [];\n const headers: GroupVirtualHeader[] = [];\n let stickyHeader: GroupVirtualHeader | null = null;\n\n for (const vi of state.items) {\n const entry = flat[vi.index];\n\n if (!entry) continue;\n\n if (entry.isHeader) {\n headers.push({ ...vi, label: entry.label ?? '', sectionIndex: entry.sectionIndex });\n } else {\n items.push({ ...vi, data: entry.item, itemIndex: entry.itemIndex, sectionIndex: entry.sectionIndex });\n }\n }\n\n if (state.stickyItems.length > 0) {\n const svi = state.stickyItems[0]!;\n const entry = flat[svi.index];\n\n if (entry?.isHeader) {\n stickyHeader = { ...svi, label: entry.label ?? '', sectionIndex: entry.sectionIndex };\n }\n }\n\n lastItems = items;\n\n return { headers, items, stickyHeader, totalSize: state.totalSize };\n }\n\n const virtualizer = createVirtualizer(target, {\n count: flat.length,\n estimateSize: estimateFn,\n getItemKey,\n horizontal: options.horizontal,\n measurementCache: options.measurementCache,\n onChange: (state) => {\n const mapped = mapState(state);\n\n emitState(mapped);\n },\n onScrollEnd: (offset) => onScrollEnd?.(offset),\n onScrollingChange: (isScrolling) => onScrollingChange?.(isScrolling),\n overscan: options.overscan ?? DEFAULT_OVERSCAN,\n scrollEndDelay: options.scrollEndDelay,\n sticky: (i) => flat[i]?.isHeader ?? false,\n });\n\n const ac = new AbortController();\n\n function _dispose(): void {\n if (disposed) return;\n\n disposed = true;\n stateStore.dispose();\n ac.abort();\n virtualizer.dispose();\n }\n\n // Build a flat-index lookup: [sectionIndex, itemIndex] → flat index.\n // Returns -1 when sectionIndex is out of range so callers can no-op safely.\n function flatIndexOf(sectionIndex: number, itemIndex?: number): number {\n if (sectionIndex < 0 || sectionIndex >= sections.length) return -1;\n\n let pos = 0;\n\n for (let s = 0; s < sections.length; s++) {\n if (s === sectionIndex) {\n if (itemIndex === undefined) return pos; // header\n\n return pos + 1 + itemIndex;\n }\n\n pos += 1 + sections[s]!.items.length;\n }\n\n return -1; // unreachable\n }\n\n return {\n get count() {\n return virtualizer.count;\n },\n get disposalSignal() {\n return ac.signal;\n },\n dispose: _dispose,\n get disposed() {\n return disposed;\n },\n getSnapshot: stateStore.getSnapshot,\n invalidate() {\n if (disposed) return;\n\n virtualizer.invalidate();\n },\n get isScrolling() {\n return virtualizer.isScrolling;\n },\n get items() {\n return lastItems;\n },\n measure(index: number, size: number) {\n if (disposed) return;\n\n virtualizer.measure(index, size);\n },\n measureBatch(entries: Array<{ index: number; size: number }>) {\n if (disposed) return;\n\n virtualizer.measureBatch(entries);\n },\n measureEl(index: number, el: HTMLElement) {\n if (disposed) return () => {};\n\n return virtualizer.measureEl(index, el);\n },\n refresh() {\n if (disposed) return;\n\n virtualizer.refresh();\n },\n get scrollOffset() {\n return virtualizer.scrollOffset;\n },\n scrollToBottom(opts?: { behavior?: ScrollBehavior }) {\n if (disposed) return;\n\n virtualizer.scrollToBottom(opts);\n },\n scrollToIndex(index: number, opts?: ScrollToIndexOptions) {\n if (disposed) return;\n\n virtualizer.scrollToIndex(index, opts);\n },\n scrollToItem(sectionIndex, itemIndex, opts = {}) {\n if (disposed) return;\n\n const globalIndex = flatIndexOf(sectionIndex, itemIndex);\n\n if (globalIndex < 0) return;\n\n virtualizer.scrollToIndex(globalIndex, opts);\n },\n scrollToOffset(offset: number, opts?: { behavior?: ScrollBehavior }) {\n if (disposed) return;\n\n virtualizer.scrollToOffset(offset, opts);\n },\n scrollToSection(sectionIndex, opts = {}) {\n if (disposed) return;\n\n const globalIndex = flatIndexOf(sectionIndex);\n\n if (globalIndex < 0) return;\n\n virtualizer.scrollToIndex(globalIndex, opts);\n },\n scrollToTop(opts?: { behavior?: ScrollBehavior }) {\n if (disposed) return;\n\n virtualizer.scrollToTop(opts);\n },\n get stickyItems() {\n return virtualizer.stickyItems;\n },\n subscribe: stateStore.subscribe,\n [Symbol.dispose]: _dispose,\n get totalSize() {\n return virtualizer.totalSize;\n },\n /**\n * Replace all sections. Closures for estimateFn and getItemKey already\n * capture the live `flat`/`sections` references: only count is passed to\n * the underlying virtualizer to avoid discarding measured sizes on every\n * data refresh. `refresh()` rebuilds offsets while preserving the cache.\n */\n update(nextSections, opts?: GroupVirtualizerUpdateOptions<T>) {\n if (disposed) return;\n\n if (opts) {\n if (typeof opts.estimateHeaderSize === 'number')\n requirePositiveNumber(opts.estimateHeaderSize, 'estimateHeaderSize');\n\n if (typeof opts.estimateItemSize === 'number') requirePositiveNumber(opts.estimateItemSize, 'estimateItemSize');\n\n if (opts.overscan !== undefined) validateOverscan(opts.overscan);\n\n if (opts.scrollEndDelay !== undefined) requireNonNegativeNumber(opts.scrollEndDelay, 'scrollEndDelay');\n\n if (Object.hasOwn(opts, 'onChange')) onChange = opts.onChange;\n\n if (Object.hasOwn(opts, 'onScrollEnd')) onScrollEnd = opts.onScrollEnd;\n\n if (Object.hasOwn(opts, 'onScrollingChange')) onScrollingChange = opts.onScrollingChange;\n\n // Apply option overrides before rebuilding flat entries.\n if (opts.estimateHeaderSize !== undefined) {\n estimateHeaderFn = buildEstimateHeader(opts.estimateHeaderSize);\n }\n\n if (opts.estimateItemSize !== undefined) {\n estimateItemUserFn = typeof opts.estimateItemSize === 'function' ? opts.estimateItemSize : null;\n estimateItemFixedFn = estimateItemUserFn\n ? null\n : resolveEstimateFn(\n typeof opts.estimateItemSize === 'number' ? opts.estimateItemSize : undefined,\n DEFAULT_ESTIMATE_SIZE,\n );\n }\n\n if (opts.getItemKey !== undefined) userGetItemKey = opts.getItemKey;\n }\n\n sections = nextSections;\n\n const prevCount = flat.length;\n\n flat = buildFlatEntries(sections);\n\n const virtUpdateOpts: VirtualizerUpdateOptions = { count: flat.length };\n\n if (opts?.measurementCache !== undefined) virtUpdateOpts.measurementCache = opts.measurementCache;\n\n if (opts?.overscan !== undefined) virtUpdateOpts.overscan = opts.overscan;\n\n if (opts?.scrollEndDelay !== undefined) virtUpdateOpts.scrollEndDelay = opts.scrollEndDelay;\n\n if (\n flat.length !== prevCount ||\n opts?.measurementCache !== undefined ||\n opts?.overscan !== undefined ||\n opts?.scrollEndDelay !== undefined\n ) {\n virtualizer.update(virtUpdateOpts);\n } else {\n virtualizer.refresh();\n }\n },\n };\n}\n"],"mappings":"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"}
package/dist/scroll.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function createMeasurementCache(){return new Map}var e=36,t=3;function createSnapshotStore(e){let t=new Set,n=e,r=!1;return{dispose(){r=!0,t.clear()},getSnapshot(){return n},publish(e){if(!r){n=e;for(let e of[...t])try{e()}catch(e){queueMicrotask(()=>{throw e})}}},subscribe(e){return r?()=>{}:(t.add(e),()=>t.delete(e))}}}function toNonNegativeInt(e,t=0){return Number.isFinite(e)?Math.max(0,Math.floor(e)):t}function toPositiveNumber(e,t){return!Number.isFinite(e)||e<=0||e>1e7?t:e}function isWindowTarget(e){return typeof Window<`u`&&e instanceof Window||typeof e.innerHeight==`number`&&typeof e.document==`object`}function normalizeOverscan(e,t){if(typeof e==`number`){let n=toNonNegativeInt(e,t);return{end:n,start:n}}return{end:toNonNegativeInt(e?.end??t),start:toNonNegativeInt(e?.start??t)}}function observeResize(e,t,n){let r=new ResizeObserver(e=>{for(let t of e)n(t)});return r.observe(t),e.addEventListener(`abort`,()=>r.disconnect(),{once:!0}),()=>r.disconnect()}function resolveEstimateFn(e,t){if(typeof e==`function`)return n=>{try{return toPositiveNumber(e(n),t)}catch(e){return`${n}${e}`,t}};let n=typeof e==`number`?toPositiveNumber(e,t):t;return()=>n}var ScrollError=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},ScrollConfigError=class extends ScrollError{},ScrollRangeError=class extends ScrollError{};function requireNonNegativeInteger(e,t){if(!Number.isFinite(e)||!Number.isInteger(e)||e<0)throw new ScrollConfigError(`${t} must be a finite non-negative integer.`);return e}function requireNonNegativeNumber(e,t){if(!Number.isFinite(e)||e<0)throw new ScrollConfigError(`${t} must be a finite non-negative number.`);return e}function requirePositiveNumber(e,t){if(!Number.isFinite(e)||e<=0||e>1e7)throw new ScrollConfigError(`${t} must be a finite positive number no greater than 10000000.`);return e}function validateOverscan(e,t=`overscan`){if(typeof e==`number`){requireNonNegativeInteger(e,t);return}if(typeof e!=`object`||!e||Array.isArray(e))throw new ScrollConfigError(`${t} must be a finite non-negative integer or an overscan object.`);e.start!==void 0&&requireNonNegativeInteger(e.start,`${t}.start`),e.end!==void 0&&requireNonNegativeInteger(e.end,`${t}.end`)}function createScrollAdapter(e,t,n){if(isWindowTarget(e))return e.addEventListener(`scroll`,t,{passive:!0}),e.addEventListener(`resize`,n,{passive:!0}),{detach(){e.removeEventListener(`scroll`,t),e.removeEventListener(`resize`,n)},scrollTo:(t,n,r)=>e.scrollTo({behavior:r,left:t,top:n}),x:{readOffset:()=>e.scrollX,readViewportSize:()=>e.innerWidth,writeOffset:(t,n)=>e.scrollTo({behavior:n,left:t})},y:{readOffset:()=>e.scrollY,readViewportSize:()=>e.innerHeight,writeOffset:(t,n)=>e.scrollTo({behavior:n,top:t})}};let r=new ResizeObserver(n);return e.addEventListener(`scroll`,t,{passive:!0}),r.observe(e),{detach(){e.removeEventListener(`scroll`,t),r.disconnect()},scrollTo:(t,n,r)=>e.scrollTo({behavior:r,left:t,top:n}),x:{readOffset:()=>e.scrollLeft,readViewportSize:()=>e.clientWidth,writeOffset:(t,n)=>e.scrollTo({behavior:n,left:t})},y:{readOffset:()=>e.scrollTop,readViewportSize:()=>e.clientHeight,writeOffset:(t,n)=>e.scrollTo({behavior:n,top:t})}}}function createAxis1D(e,t,n){let r=e,i=n,a=t,o=[],s=0,c=-1,l=-1,u=-1,d=!1,f=1/0;function startAt(e){return o[e]??0}function endAt(e){return startAt(e)+a(e)}function rebuild(e=!1){e&&(c=-1,l=-1,u=-1);let t=[0],n=0;for(let e=0;e<r;e++)n+=a(e)+(e<r-1?i:0),t.push(n);o=t,s=n}function rebuildFrom(e){if(!Number.isFinite(e)||e>=r)return;c=-1,l=-1,u=-1;let t=o[e]??0;for(let n=e;n<r;n++)o[n]=t,t+=a(n)+(n<r-1?i:0);o[r]=t,s=t}function findFirst(e){let t=0,n=r-1;for(;t<n;){let r=t+n>>1;endAt(r)<=e?t=r+1:n=r}return t}function findLast(e,t){let n=t,i=r-1;for(;n<i;){let t=n+i+1>>1;startAt(t)<e?n=t:i=t-1}return n}function computeRange(e,t,n,i){let a=findFirst(e),o=findLast(t,a);return{renderEnd:Math.min(r-1,o+i),renderStart:Math.max(0,a-n)}}function isDedupSame(e,t){return e===c&&t===l&&s===u}function commitDedup(e,t){c=e,l=t,u=s}function resetDedup(){c=-1,l=-1,u=-1}function scheduleBuild(e){d||(d=!0,queueMicrotask(()=>{d=!1;let t=f;f=1/0,rebuildFrom(t),e()}))}function markChanged(e){e<f&&(f=e)}function itemAt(e){let t=startAt(e),n=a(e);return{end:t+n,index:e,size:n,start:t}}return{commitDedup,computeRange,consumeMinChangedIndex(){let e=f;return f=1/0,e},get count(){return r},endAt,findFirst,findLast,get gap(){return i},isDedupSame,itemAt,markChanged,get minChangedIndex(){return f},get pendingBuild(){return d},get prevEnd(){return l},get prevStart(){return c},get prevTotalSize(){return u},rebuild,rebuildFrom,resetDedup,scheduleBuild,setCount(e){r=e},setGap(e){i=e},sizeAt(e){return a(e)},startAt,get totalSize(){return s}}}function computeStickyItems(e){if(!e.stickyFn||e.count===0||e.scrollOffset<=0)return[];let t=-1,n=0,r=e.count-1;for(;n<=r;){let i=n+r>>1;e.startAt(i)<e.scrollOffset?(t=i,n=i+1):r=i-1}if(t<0)return[];let i=-1;for(let n=t;n>=0;n--)if(e.stickyFn(n)){i=n;break}if(i===-1)return[];let a=e.sizeAt(i),o=1/0;for(let t=i+1;t<e.count;t++)if(e.stickyFn(t)){o=e.startAt(t);break}let s=Math.min(e.scrollOffset,o-a);return[{end:s+a,index:i,size:a,start:s}]}function createVirtualizer(e,t){typeof t.estimateSize==`number`&&requirePositiveNumber(t.estimateSize,`estimateSize`),t.gap!==void 0&&requireNonNegativeInteger(t.gap,`gap`),t.initialOffset!==void 0&&requireNonNegativeNumber(t.initialOffset,`initialOffset`),t.overscan!==void 0&&validateOverscan(t.overscan),t.scrollEndDelay!==void 0&&requireNonNegativeNumber(t.scrollEndDelay,`scrollEndDelay`);let n=!!t.horizontal,defaultItemKey=e=>e,r=requireNonNegativeInteger(t.count,`count`),i=resolveEstimateFn(t.estimateSize,36),a=toNonNegativeInt(t.gap??0),o=t.getItemKey??defaultItemKey,s=normalizeOverscan(t.overscan,3),c=t.sticky??null,l=t.autoMeasure??!1,u=t.onChange,d=t.onScrollEnd,f=t.onScrollingChange,p=t.scrollEndDelay??150;function emitState(e){y.publish(e),u?.(e)}let m=null,h=`onscrollend`in e;function notifyScrollEnd(){D&&(D=!1,f?.(!1),d?.(C))}function handleScrollStart(){D||(D=!0,f?.(!0)),h||(m!==null&&clearTimeout(m),m=setTimeout(notifyScrollEnd,p))}let g=t.measurementCache??new Map,_=[],v=[],y=createSnapshotStore({items:_,stickyItems:v,totalSize:0}),b=createAxis1D(r,e=>g.get(o(e))??i(e),a),x=-1,S=0,C=0,w=0,T=-1,E=!1,D=!1;function clampScrollOffset(e){let t=Number.isFinite(e)?e:0,n=Math.max(0,b.totalSize-w);return Math.min(n,Math.max(0,t))}function computeVisible(){if(E)return;if(r===0||w<=0){(b.prevStart!==-1||b.prevTotalSize!==b.totalSize)&&(b.commitDedup(-1,-1),_=[],v=[],emitState({items:_,stickyItems:v,totalSize:b.totalSize}));return}let{renderEnd:t,renderStart:n}=b.computeRange(C,C+w,s.start,s.end),i=c!==null&&C!==T;if(b.isDedupSame(n,t)&&!i)return;b.commitDedup(n,t),T=C;let a=[];for(let e=n;e<=t;e++)a.push(b.itemAt(e));_=a,v=c?computeStickyItems({count:r,scrollOffset:C,sizeAt:b.sizeAt,startAt:b.startAt,stickyFn:c}):[],emitState({items:_,stickyItems:v,totalSize:b.totalSize}),l&&_.length>0&&queueMicrotask(()=>{if(!(E||e instanceof Window))for(let t of _){let n=o(t.index),r=e?.querySelector?.(`[data-vz-key="${n}"]`);r instanceof HTMLElement&&measureEl(t.index,r)}})}function recordMeasurement(e,t){if(!Number.isFinite(e))return!1;let n=Math.floor(e);if(n<0||n>=r)return!1;let i=toPositiveNumber(t,-1);if(i<=0)return!1;let a=o(n);return g.get(a)!==i&&(g.set(a,i),b.markChanged(n),!0)}function recordScrollAnchor(){if(C<=0||r===0){x=-1;return}x=b.findFirst(C),S=C-b.startAt(x)}function restoreScrollAnchor(){if(x<0)return;let e=b.startAt(x)+S-C;if(x=-1,Math.abs(e)>=1){let t=clampScrollOffset(C+e);A.writeOffset(t,`auto`),C=t}}function measureBatch(e){if(E)return;let t=!1;for(let{index:n,size:r}of e)recordMeasurement(n,r)&&(t=!0);t&&(b.pendingBuild||recordScrollAnchor(),b.scheduleBuild(()=>{restoreScrollAnchor(),computeVisible()}))}function measure(e,t){measureBatch([{index:e,size:t}])}function measureEl(e,t){return E?()=>{}:observeResize(O.signal,t,t=>{measure(e,n?t.contentRect.width:t.contentRect.height)})}function applyOptions(e){e.count!==void 0&&requireNonNegativeInteger(e.count,`count`),typeof e.estimateSize==`number`&&requirePositiveNumber(e.estimateSize,`estimateSize`),e.gap!==void 0&&requireNonNegativeInteger(e.gap,`gap`),e.overscan!==void 0&&validateOverscan(e.overscan),e.scrollEndDelay!==void 0&&requireNonNegativeNumber(e.scrollEndDelay,`scrollEndDelay`);let t=!1,n=!1;if(Object.hasOwn(e,`onChange`)&&(u=e.onChange),Object.hasOwn(e,`onScrollEnd`)&&(d=e.onScrollEnd),Object.hasOwn(e,`onScrollingChange`)&&(f=e.onScrollingChange),e.scrollEndDelay!==void 0&&(p=e.scrollEndDelay),e.count!==void 0){let n=e.count;n!==r&&(r=n,b.setCount(r),t=!0)}if(Object.hasOwn(e,`estimateSize`)&&(i=resolveEstimateFn(e.estimateSize,36),g.clear(),t=!0),e.gap!==void 0){let n=e.gap;n!==a&&(a=n,b.setGap(a),t=!0)}if(Object.hasOwn(e,`getItemKey`)){let n=e.getItemKey??defaultItemKey;n!==o&&(o=n,g.clear(),t=!0)}if(Object.hasOwn(e,`measurementCache`)&&e.measurementCache!==void 0&&(g=e.measurementCache,t=!0),e.overscan!==void 0){let t=normalizeOverscan(e.overscan,3);(t.start!==s.start||t.end!==s.end)&&(s=t,n=!0)}if(Object.hasOwn(e,`sticky`)){let t=e.sticky??null;t!==c&&(c=t,b.resetDedup()),n=!0}Object.hasOwn(e,`autoMeasure`)&&(l=e.autoMeasure??!1),t&&(recordScrollAnchor(),b.rebuild(!0),restoreScrollAnchor()),(n||t)&&(w=A.readViewportSize(),C=clampScrollOffset(A.readOffset()),computeVisible())}function remeasure(){E||(w=A.readViewportSize(),C=clampScrollOffset(A.readOffset()),computeVisible())}function invalidate(){E||(g.clear(),b.rebuild(!0),computeVisible())}function refresh(){E||(b.rebuild(!0),computeVisible())}function prepend(e){if(E)return;let t=toNonNegativeInt(e);if(t===0)return;r+=t,b.setCount(r),b.rebuild(!0);let n=b.startAt(t),i=clampScrollOffset(C+n);A.writeOffset(i,`auto`),C=i,computeVisible()}function update(e){E||applyOptions(e)}function scrollToIndex(t,n={}){if(E||r<=0)return;let i=Math.max(0,Math.min(Number.isFinite(t)?Math.floor(t):0,r-1)),a=n.align??`auto`,o=n.behavior??`auto`,s=b.startAt(i),c=b.sizeAt(i),l=s+c,u;if(a===`start`)u=s;else if(a===`end`)u=l-w;else if(a===`center`)u=s-(w-c)/2;else{let e=C,t=e+w;if(s>=e&&l<=t){n.onComplete&&queueMicrotask(n.onComplete);return}u=s<e?s:l-w}A.writeOffset(clampScrollOffset(u),o),n.onComplete&&(o===`smooth`&&`onscrollend`in e?e.addEventListener(`scrollend`,n.onComplete,{once:!0}):queueMicrotask(n.onComplete))}function scrollToOffset(e,t={}){E||A.writeOffset(clampScrollOffset(e),t.behavior??`auto`)}function scrollToTop(e={}){scrollToOffset(0,e)}function scrollToBottom(e={}){scrollToOffset(Math.max(0,b.totalSize-w),e)}function isAtEnd(e=0){return b.totalSize-(C+w)<=e}let O=new AbortController;function _dispose(){E||(E=!0,y.dispose(),O.abort(),m!==null&&(clearTimeout(m),m=null),h&&e.removeEventListener(`scrollend`,notifyScrollEnd),k.detach())}function handleScroll(){C=clampScrollOffset(A.readOffset()),handleScrollStart(),computeVisible()}function handleResize(){w=A.readViewportSize(),computeVisible()}let k=createScrollAdapter(e,handleScroll,handleResize),A=n?k.x:k.y;return h&&e.addEventListener(`scrollend`,notifyScrollEnd,{passive:!0}),b.rebuild(!0),t.initialOffset!==void 0&&A.writeOffset(clampScrollOffset(t.initialOffset),`auto`),C=clampScrollOffset(A.readOffset()),w=A.readViewportSize(),computeVisible(),{get count(){return r},get disposalSignal(){return O.signal},dispose:_dispose,get disposed(){return E},getSnapshot:y.getSnapshot,invalidate,isAtEnd,get isScrolling(){return D},get items(){return _},measure,measureBatch,measureEl,prepend,refresh,remeasure,get scrollOffset(){return C},scrollToBottom,scrollToIndex,scrollToOffset,scrollToTop,get stickyItems(){return v},subscribe:y.subscribe,[Symbol.dispose]:_dispose,get totalSize(){return b.totalSize},update}}function createNodePool(){let e=new Map,t=new Map,n=[],r=!1;return{acquire(i,a){if(!r)return a();let o=e.get(i);if(o)return t.set(i,o),o;let s=n.pop()??a();return t.set(i,s),s},beginCycle(){t=new Map,r=!0},clear(){for(let t of e.values())t.remove();e.clear(),t.clear(),n.length=0,r=!1},endCycle(){if(r){r=!1;for(let[r,i]of e)t.has(r)||(i.remove(),n.push(i));e=t}}}}function createDomVirtualList(e){if(typeof e.estimateSize==`number`&&requirePositiveNumber(e.estimateSize,`estimateSize`),e.gap!==void 0&&requireNonNegativeInteger(e.gap,`gap`),e.overscan!==void 0&&validateOverscan(e.overscan),e.stickToBottom!==void 0&&typeof e.stickToBottom!=`boolean`){if(e.stickToBottom===null||Array.isArray(e.stickToBottom))throw new ScrollConfigError(`stickToBottom must be a boolean or options object.`);e.stickToBottom.threshold!==void 0&&requireNonNegativeNumber(e.stickToBottom.threshold,`stickToBottom.threshold`)}let t=[],n=!1,r=new AbortController,i=e.listElement,a=createSnapshotStore({items:[],stickyItems:[],totalSize:0});function emitState(e){a.publish(e),handleChange(e)}let o=createNodePool(),s=null;function resolveKey(n){let r=t[n];return r!==void 0&&e.getItemKey?e.getItemKey(n,r):n}function resolveEstimate(n){if(e.estimateSize===void 0)return 36;if(typeof e.estimateSize==`number`)return e.estimateSize;let r=t[n];return r===void 0?36:e.estimateSize(n,r)}function applyListSize(t){e.horizontal?(i.style.height=``,i.style.width=`${t}px`):(i.style.height=`${t}px`,i.style.width=``)}function toRenderItem(e){let n=t[e.index];if(n===void 0)throw new ScrollRangeError(`toRenderItem: index ${e.index} is out of range (currentItems.length=${t.length})`);return{...e,data:n}}function handleChange(t){applyListSize(t.totalSize),o.beginCycle();try{e.render({items:t.items.map(toRenderItem),listEl:i,recycle:(e,t)=>o.acquire(e,t),stickyItems:t.stickyItems.map(toRenderItem),totalSize:t.totalSize})}finally{o.endCycle()}}function clearAndReset(){o.clear(),e.clear?e.clear(i):i.textContent=``,i.style.height=``,i.style.width=``,i.style.position=``,i.style.contain=``}function resolveStickToBottom(){let t=e.stickToBottom;return t?t===!0?{enabled:!0,threshold:48}:{enabled:t.enabled??!0,threshold:t.threshold??48}:{enabled:!1,threshold:48}}function spawnVirtualizer(){let n=createVirtualizer(e.scrollElement,{count:t.length,estimateSize:resolveEstimate,gap:e.gap,getItemKey:resolveKey,horizontal:e.horizontal,measurementCache:e.measurementCache,onChange:emitState,overscan:e.overscan??3,sticky:e.sticky?n=>{let r=t[n];return r!==void 0&&e.sticky(n,r)}:void 0});return s=n,i.style.position=`relative`,i.style.contain=`layout`,n}function _dispose(){n||(n=!0,a.dispose(),r.abort(),s?.dispose(),s=null,clearAndReset())}return{get count(){return s?.count??0},get disposalSignal(){return r.signal},dispose:_dispose,get disposed(){return n},getSnapshot:a.getSnapshot,invalidate(){n||s?.invalidate()},isAtEnd(e){return s?.isAtEnd(e)??!0},get isScrolling(){return s?.isScrolling??!1},get items(){return s?.items??[]},measure(e,t){n||s?.measure(e,t)},measureBatch(e){n||s?.measureBatch(e)},measureEl(e,t){return n?()=>{}:s?.measureEl(e,t)??(()=>{})},refresh(){n||s?.refresh()},remeasure(){n||s?.remeasure()},get scrollOffset(){return s?.scrollOffset??0},scrollToBottom(e){n||s?.scrollToBottom(e)},scrollToIndex(e,t){n||s?.scrollToIndex(e,t)},scrollToOffset(e,t){n||s?.scrollToOffset(e,t)},scrollToTop(e){n||s?.scrollToTop(e)},setItems(r){if(n)return;let i=resolveStickToBottom(),o=i.enabled&&(s?.isAtEnd(i.threshold)??!0);if(t=r,r.length===0){s?.dispose(),s=null,a.publish({items:[],stickyItems:[],totalSize:0}),clearAndReset();return}if(!s){let e=spawnVirtualizer();o&&e.scrollToBottom();return}let c=r.length!==s.count;s.update({count:r.length}),c?e.getItemKey||s.invalidate():e.getItemKey?s.refresh():s.invalidate(),o&&s.scrollToBottom()},get stickyItems(){return s?.stickyItems??[]},subscribe:a.subscribe,[Symbol.dispose]:_dispose,get totalSize(){return s?.totalSize??0}}}function createVirtualScroller(e,t){let n=document.createElement(`div`);n.style.cssText=t.horizontal?`overflow: auto hidden; width: 100%; height: 100%;`:`overflow: hidden auto; width: 100%; height: 100%;`,t.containerClass&&(n.className=t.containerClass);let r=document.createElement(`div`);n.appendChild(r),e.appendChild(n);let i;try{i=createDomVirtualList({...t,listElement:r,scrollElement:n})}catch(e){throw n.remove(),e}let a=i.dispose.bind(i);return Object.assign(i,{dispose(){a(),n.remove()},[Symbol.dispose](){a(),n.remove()}})}function alignOffset(e,t,n,r,i,a){return a===`start`?e:a===`end`?t-i:a===`center`?e-(i-n)/2:e>=r&&t<=r+i?null:e<r?e:t-i}function createGridVirtualizer(e,t){typeof t.estimateRowSize==`number`&&requirePositiveNumber(t.estimateRowSize,`estimateRowSize`),typeof t.estimateColSize==`number`&&requirePositiveNumber(t.estimateColSize,`estimateColSize`),t.initialScrollTop!==void 0&&requireNonNegativeNumber(t.initialScrollTop,`initialScrollTop`),t.initialScrollLeft!==void 0&&requireNonNegativeNumber(t.initialScrollLeft,`initialScrollLeft`),t.rowGap!==void 0&&requireNonNegativeInteger(t.rowGap,`rowGap`),t.colGap!==void 0&&requireNonNegativeInteger(t.colGap,`colGap`),t.overscanY!==void 0&&validateOverscan(t.overscanY,`overscanY`),t.overscanX!==void 0&&validateOverscan(t.overscanX,`overscanX`);let n=requireNonNegativeInteger(t.rowCount,`rowCount`),r=requireNonNegativeInteger(t.colCount,`colCount`),i=resolveEstimateFn(t.estimateRowSize,36),a=resolveEstimateFn(t.estimateColSize,36),o=normalizeOverscan(t.overscanY,3),s=normalizeOverscan(t.overscanX,3),c=t.onChange,l=t.onRangeChange;function emitState(e){v.publish(e),c?.(e)}let u=t.rowMeasurementCache??new Map,d=t.colMeasurementCache??new Map,f=0,p=0,m=0,h=0,g=[],_=[],v=createSnapshotStore({cols:_,rows:g,totalHeight:0,totalWidth:0}),y=!1,b=createAxis1D(n,e=>u.get(e)??i(e),toNonNegativeInt(t.rowGap??0)),x=createAxis1D(r,e=>d.get(e)??a(e),toNonNegativeInt(t.colGap??0)),S=!1;function clampTop(e){let t=Number.isFinite(e)?e:0;return Math.min(Math.max(0,b.totalSize-m),Math.max(0,t))}function clampLeft(e){let t=Number.isFinite(e)?e:0;return Math.min(Math.max(0,x.totalSize-h),Math.max(0,t))}function computeVisible(){if(y)return;let e=b.totalSize,t=x.totalSize;if(n===0||r===0||m<=0||h<=0){(b.prevStart!==-1||b.prevTotalSize!==e||x.prevTotalSize!==t)&&(b.commitDedup(-1,-1),x.commitDedup(-1,-1),g=[],_=[],emitState({cols:[],rows:[],totalHeight:e,totalWidth:t}));return}let{renderEnd:i,renderStart:a}=b.computeRange(f,f+m,o.start,o.end),{renderEnd:c,renderStart:u}=x.computeRange(p,p+h,s.start,s.end),d=b.isDedupSame(a,i),v=x.isDedupSame(u,c);if(d&&v)return;b.commitDedup(a,i),x.commitDedup(u,c),(!d||!v)&&l&&l({firstCol:u,firstRow:a,lastCol:c,lastRow:i});let S=[];for(let e=a;e<=i;e++)S.push(b.itemAt(e));let C=[];for(let e=u;e<=c;e++)C.push(x.itemAt(e));g=S,_=C,emitState({cols:_,rows:g,totalHeight:e,totalWidth:t})}function recordRowMeasurement(e,t){if(!Number.isFinite(e))return!1;let r=Math.floor(e);if(r<0||r>=n)return!1;let i=toPositiveNumber(t,-1);return i<=0||u.get(r)===i?!1:(u.set(r,i),b.markChanged(r),!0)}function recordColMeasurement(e,t){if(!Number.isFinite(e))return!1;let n=Math.floor(e);if(n<0||n>=r)return!1;let i=toPositiveNumber(t,-1);return i<=0||d.get(n)===i?!1:(d.set(n,i),x.markChanged(n),!0)}function scheduleFlush(){S||(S=!0,queueMicrotask(()=>{S=!1;let e=b.consumeMinChangedIndex();e!==1/0&&b.rebuildFrom(e);let t=x.consumeMinChangedIndex();t!==1/0&&x.rebuildFrom(t),computeVisible()}))}function measureRow(e,t){y||recordRowMeasurement(e,t)&&scheduleFlush()}function measureColumn(e,t){y||recordColMeasurement(e,t)&&scheduleFlush()}function measureBatch(e,t){if(y)return;let n=!1;for(let{index:t,size:r}of e)recordRowMeasurement(t,r)&&(n=!0);for(let{index:e,size:r}of t)recordColMeasurement(e,r)&&(n=!0);n&&scheduleFlush()}function measureRowEl(e,t){return y?()=>{}:observeResize(C.signal,t,t=>measureRow(e,t.contentRect.height))}function measureColEl(e,t){return y?()=>{}:observeResize(C.signal,t,t=>measureColumn(e,t.contentRect.width))}function invalidate(){y||(u.clear(),d.clear(),b.rebuild(!0),x.rebuild(!0),computeVisible())}function refresh(){y||(b.rebuild(!0),x.rebuild(!0),computeVisible())}function prependRows(e){if(y)return;let t=toNonNegativeInt(e);if(t===0)return;n+=t,b.setCount(n),b.rebuild(!0);let r=b.startAt(t),i=clampTop(f+r);w.scrollTo(p,i,`auto`),f=i,computeVisible()}function scrollToRow(e,t={}){if(y||n===0)return;let r=Math.max(0,Math.min(Math.floor(Number.isFinite(e)?e:0),n-1)),i=t.behavior??`auto`,a=b.startAt(r),o=b.sizeAt(r),s=alignOffset(a,a+o,o,f,m,t.rowAlign??`auto`);s!==null&&w.scrollTo(p,clampTop(s),i)}function scrollToColumn(e,t={}){if(y||r===0)return;let n=Math.max(0,Math.min(Math.floor(Number.isFinite(e)?e:0),r-1)),i=t.behavior??`auto`,a=x.startAt(n),o=x.sizeAt(n),s=alignOffset(a,a+o,o,p,h,t.colAlign??`auto`);s!==null&&w.scrollTo(clampLeft(s),f,i)}function scrollToCell(e,t,i={}){if(y||n===0||r===0)return;let a=Math.max(0,Math.min(Math.floor(Number.isFinite(e)?e:0),n-1)),o=Math.max(0,Math.min(Math.floor(Number.isFinite(t)?t:0),r-1)),s=i.behavior??`auto`,c=b.startAt(a),l=b.sizeAt(a),u=x.startAt(o),d=x.sizeAt(o),g=alignOffset(c,c+l,l,f,m,i.rowAlign??`auto`),_=alignOffset(u,u+d,d,p,h,i.colAlign??`auto`);(g!==null||_!==null)&&w.scrollTo(_===null?p:clampLeft(_),g===null?f:clampTop(g),s)}function update(e){if(y)return;e.rowCount!==void 0&&requireNonNegativeInteger(e.rowCount,`rowCount`),e.colCount!==void 0&&requireNonNegativeInteger(e.colCount,`colCount`),typeof e.estimateRowSize==`number`&&requirePositiveNumber(e.estimateRowSize,`estimateRowSize`),typeof e.estimateColSize==`number`&&requirePositiveNumber(e.estimateColSize,`estimateColSize`),e.rowGap!==void 0&&requireNonNegativeInteger(e.rowGap,`rowGap`),e.colGap!==void 0&&requireNonNegativeInteger(e.colGap,`colGap`),e.overscanY!==void 0&&validateOverscan(e.overscanY,`overscanY`),e.overscanX!==void 0&&validateOverscan(e.overscanX,`overscanX`);let t=!1,f=!1,p=!1;if(Object.hasOwn(e,`onChange`)&&(c=e.onChange),Object.hasOwn(e,`onRangeChange`)&&(l=e.onRangeChange),e.rowCount!==void 0){let r=e.rowCount;r!==n&&(n=r,b.setCount(n),t=!0)}if(e.colCount!==void 0){let t=e.colCount;t!==r&&(r=t,x.setCount(r),f=!0)}if(e.rowGap!==void 0){let n=e.rowGap;n!==b.gap&&(b.setGap(n),t=!0)}if(e.colGap!==void 0){let t=e.colGap;t!==x.gap&&(x.setGap(t),f=!0)}if(`estimateRowSize`in e&&(i=resolveEstimateFn(e.estimateRowSize,36),u.clear(),t=!0),`estimateColSize`in e&&(a=resolveEstimateFn(e.estimateColSize,36),d.clear(),f=!0),e.overscanY!==void 0){let t=normalizeOverscan(e.overscanY,3);(t.start!==o.start||t.end!==o.end)&&(o=t,p=!0)}if(e.overscanX!==void 0){let t=normalizeOverscan(e.overscanX,3);(t.start!==s.start||t.end!==s.end)&&(s=t,p=!0)}t&&b.rebuild(!0),f&&x.rebuild(!0),(t||f||p)&&computeVisible()}let C=new AbortController;function disposeImpl(){y||(y=!0,v.dispose(),C.abort(),w.detach())}function handleScroll(){f=clampTop(w.y.readOffset()),p=clampLeft(w.x.readOffset()),computeVisible()}function handleResize(){m=w.y.readViewportSize(),h=w.x.readViewportSize(),computeVisible()}let w=createScrollAdapter(e,handleScroll,handleResize);return b.rebuild(!0),x.rebuild(!0),m=w.y.readViewportSize(),h=w.x.readViewportSize(),t.initialScrollTop===void 0?t.initialScrollLeft!==void 0&&w.scrollTo(clampLeft(t.initialScrollLeft),0,`auto`):w.scrollTo(t.initialScrollLeft??0,clampTop(t.initialScrollTop),`auto`),f=clampTop(w.y.readOffset()),p=clampLeft(w.x.readOffset()),computeVisible(),{get cols(){return _},get disposalSignal(){return C.signal},dispose:disposeImpl,get disposed(){return y},getSnapshot:v.getSnapshot,invalidate,measureBatch,measureColEl,measureColumn,measureRow,measureRowEl,prependRows,refresh,get rows(){return g},get scrollLeft(){return p},scrollToCell,scrollToColumn,get scrollTop(){return f},scrollToRow,subscribe:v.subscribe,[Symbol.dispose]:disposeImpl,get totalHeight(){return b.totalSize},get totalWidth(){return x.totalSize},update}}function buildFlatEntries(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n];t.push({isHeader:!0,itemIndex:-1,label:r.label,sectionIndex:n});for(let e=0;e<r.items.length;e++)t.push({isHeader:!1,item:r.items[e],itemIndex:e,sectionIndex:n})}return t}function createGroupedVirtualizer(e,t){typeof t.estimateHeaderSize==`number`&&requirePositiveNumber(t.estimateHeaderSize,`estimateHeaderSize`),typeof t.estimateItemSize==`number`&&requirePositiveNumber(t.estimateItemSize,`estimateItemSize`),t.overscan!==void 0&&validateOverscan(t.overscan),t.scrollEndDelay!==void 0&&requireNonNegativeNumber(t.scrollEndDelay,`scrollEndDelay`);let n=t.sections,r=buildFlatEntries(n);function buildEstimateHeader(e){return typeof e==`function`?t=>{let i=r[t];return e(n[i.sectionIndex],i.sectionIndex)}:resolveEstimateFn(typeof e==`number`?e:void 0,36)}let i=buildEstimateHeader(t.estimateHeaderSize),a=typeof t.estimateItemSize==`function`?t.estimateItemSize:null,o=a?null:resolveEstimateFn(typeof t.estimateItemSize==`number`?t.estimateItemSize:void 0,36),s=t.getItemKey;function estimateFn(e){let t=r[e];return t?t.isHeader?i(e):a?a(t.item,t.itemIndex,t.sectionIndex):o(e):36}function getItemKey(e){let t=r[e];return t?t.isHeader?`__header_${t.sectionIndex}`:s?s(t.item,t.itemIndex,t.sectionIndex):e:e}let c=!1,l=[],u=createSnapshotStore({headers:[],items:[],stickyHeader:null,totalSize:0}),d=t.onChange,f=t.onScrollEnd,p=t.onScrollingChange;function emitState(e){u.publish(e),d?.(e)}function mapState(e){let t=[],n=[],i=null;for(let i of e.items){let e=r[i.index];e&&(e.isHeader?n.push({...i,label:e.label??``,sectionIndex:e.sectionIndex}):t.push({...i,data:e.item,itemIndex:e.itemIndex,sectionIndex:e.sectionIndex}))}if(e.stickyItems.length>0){let t=e.stickyItems[0],n=r[t.index];n?.isHeader&&(i={...t,label:n.label??``,sectionIndex:n.sectionIndex})}return l=t,{headers:n,items:t,stickyHeader:i,totalSize:e.totalSize}}let m=createVirtualizer(e,{count:r.length,estimateSize:estimateFn,getItemKey,horizontal:t.horizontal,measurementCache:t.measurementCache,onChange:e=>{emitState(mapState(e))},onScrollEnd:e=>f?.(e),onScrollingChange:e=>p?.(e),overscan:t.overscan??3,scrollEndDelay:t.scrollEndDelay,sticky:e=>r[e]?.isHeader??!1}),h=new AbortController;function _dispose(){c||(c=!0,u.dispose(),h.abort(),m.dispose())}function flatIndexOf(e,t){if(e<0||e>=n.length)return-1;let r=0;for(let i=0;i<n.length;i++){if(i===e)return t===void 0?r:r+1+t;r+=1+n[i].items.length}return-1}return{get count(){return m.count},get disposalSignal(){return h.signal},dispose:_dispose,get disposed(){return c},getSnapshot:u.getSnapshot,invalidate(){c||m.invalidate()},get isScrolling(){return m.isScrolling},get items(){return l},measure(e,t){c||m.measure(e,t)},measureBatch(e){c||m.measureBatch(e)},measureEl(e,t){return c?()=>{}:m.measureEl(e,t)},refresh(){c||m.refresh()},get scrollOffset(){return m.scrollOffset},scrollToBottom(e){c||m.scrollToBottom(e)},scrollToIndex(e,t){c||m.scrollToIndex(e,t)},scrollToItem(e,t,n={}){if(c)return;let r=flatIndexOf(e,t);r<0||m.scrollToIndex(r,n)},scrollToOffset(e,t){c||m.scrollToOffset(e,t)},scrollToSection(e,t={}){if(c)return;let n=flatIndexOf(e);n<0||m.scrollToIndex(n,t)},scrollToTop(e){c||m.scrollToTop(e)},get stickyItems(){return m.stickyItems},subscribe:u.subscribe,[Symbol.dispose]:_dispose,get totalSize(){return m.totalSize},update(e,t){if(c)return;t&&(typeof t.estimateHeaderSize==`number`&&requirePositiveNumber(t.estimateHeaderSize,`estimateHeaderSize`),typeof t.estimateItemSize==`number`&&requirePositiveNumber(t.estimateItemSize,`estimateItemSize`),t.overscan!==void 0&&validateOverscan(t.overscan),t.scrollEndDelay!==void 0&&requireNonNegativeNumber(t.scrollEndDelay,`scrollEndDelay`),Object.hasOwn(t,`onChange`)&&(d=t.onChange),Object.hasOwn(t,`onScrollEnd`)&&(f=t.onScrollEnd),Object.hasOwn(t,`onScrollingChange`)&&(p=t.onScrollingChange),t.estimateHeaderSize!==void 0&&(i=buildEstimateHeader(t.estimateHeaderSize)),t.estimateItemSize!==void 0&&(a=typeof t.estimateItemSize==`function`?t.estimateItemSize:null,o=a?null:resolveEstimateFn(typeof t.estimateItemSize==`number`?t.estimateItemSize:void 0,36)),t.getItemKey!==void 0&&(s=t.getItemKey)),n=e;let l=r.length;r=buildFlatEntries(n);let u={count:r.length};t?.measurementCache!==void 0&&(u.measurementCache=t.measurementCache),t?.overscan!==void 0&&(u.overscan=t.overscan),t?.scrollEndDelay!==void 0&&(u.scrollEndDelay=t.scrollEndDelay),r.length!==l||t?.measurementCache!==void 0||t?.overscan!==void 0||t?.scrollEndDelay!==void 0?m.update(u):m.refresh()}}}exports.DEFAULT_ESTIMATE_SIZE=e,exports.DEFAULT_OVERSCAN=t,exports.ScrollConfigError=ScrollConfigError,exports.ScrollError=ScrollError,exports.ScrollRangeError=ScrollRangeError,exports.createDomVirtualList=createDomVirtualList,exports.createGridVirtualizer=createGridVirtualizer,exports.createGroupedVirtualizer=createGroupedVirtualizer,exports.createMeasurementCache=createMeasurementCache,exports.createVirtualScroller=createVirtualScroller,exports.createVirtualizer=createVirtualizer;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function createMeasurementCache(){return new Map}var e=36,t=3;function createSnapshotStore(e){let t=new Set,n=e,r=!1;return{dispose(){r=!0,t.clear()},getSnapshot(){return n},publish(e){if(!r){n=e;for(let e of[...t])try{e()}catch(e){queueMicrotask(()=>{throw e})}}},subscribe(e){return r?()=>{}:(t.add(e),()=>t.delete(e))}}}function toNonNegativeInt(e,t=0){return Number.isFinite(e)?Math.max(0,Math.floor(e)):t}function toPositiveNumber(e,t){return!Number.isFinite(e)||e<=0||e>1e7?t:e}function isWindowTarget(e){return typeof Window<`u`&&e instanceof Window||typeof e.innerHeight==`number`&&typeof e.document==`object`}function normalizeOverscan(e,t){if(typeof e==`number`){let n=toNonNegativeInt(e,t);return{end:n,start:n}}return{end:toNonNegativeInt(e?.end??t),start:toNonNegativeInt(e?.start??t)}}function observeResize(e,t,n){let r=new ResizeObserver(e=>{for(let t of e)n(t)});return r.observe(t),e.addEventListener(`abort`,()=>r.disconnect(),{once:!0}),()=>r.disconnect()}function resolveEstimateFn(e,t){if(typeof e==`function`)return n=>{try{return toPositiveNumber(e(n),t)}catch(e){return`${n}${e}`,t}};let n=typeof e==`number`?toPositiveNumber(e,t):t;return()=>n}var ScrollError=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},ScrollConfigError=class extends ScrollError{},ScrollRangeError=class extends ScrollError{};function requireNonNegativeInteger(e,t){if(!Number.isFinite(e)||!Number.isInteger(e)||e<0)throw new ScrollConfigError(`${t} must be a finite non-negative integer.`);return e}function requireNonNegativeNumber(e,t){if(!Number.isFinite(e)||e<0)throw new ScrollConfigError(`${t} must be a finite non-negative number.`);return e}function requirePositiveNumber(e,t){if(!Number.isFinite(e)||e<=0||e>1e7)throw new ScrollConfigError(`${t} must be a finite positive number no greater than 10000000.`);return e}function validateOverscan(e,t=`overscan`){if(typeof e==`number`)requireNonNegativeInteger(e,t);else{if(typeof e!=`object`||!e||Array.isArray(e))throw new ScrollConfigError(`${t} must be a finite non-negative integer or an overscan object.`);e.start!==void 0&&requireNonNegativeInteger(e.start,`${t}.start`),e.end!==void 0&&requireNonNegativeInteger(e.end,`${t}.end`)}}function createScrollAdapter(e,t,n){if(isWindowTarget(e))return e.addEventListener(`scroll`,t,{passive:!0}),e.addEventListener(`resize`,n,{passive:!0}),{detach(){e.removeEventListener(`scroll`,t),e.removeEventListener(`resize`,n)},scrollTo:(t,n,r)=>e.scrollTo({behavior:r,left:t,top:n}),x:{readOffset:()=>e.scrollX,readViewportSize:()=>e.innerWidth,writeOffset:(t,n)=>e.scrollTo({behavior:n,left:t})},y:{readOffset:()=>e.scrollY,readViewportSize:()=>e.innerHeight,writeOffset:(t,n)=>e.scrollTo({behavior:n,top:t})}};let r=new ResizeObserver(n);return e.addEventListener(`scroll`,t,{passive:!0}),r.observe(e),{detach(){e.removeEventListener(`scroll`,t),r.disconnect()},scrollTo:(t,n,r)=>e.scrollTo({behavior:r,left:t,top:n}),x:{readOffset:()=>e.scrollLeft,readViewportSize:()=>e.clientWidth,writeOffset:(t,n)=>e.scrollTo({behavior:n,left:t})},y:{readOffset:()=>e.scrollTop,readViewportSize:()=>e.clientHeight,writeOffset:(t,n)=>e.scrollTo({behavior:n,top:t})}}}function createAxis1D(e,t,n){let r=e,i=n,a=t,o=[],s=0,c=-1,l=-1,u=-1,d=!1,f=1/0;function startAt(e){return o[e]??0}function endAt(e){return startAt(e)+a(e)}function rebuild(e=!1){e&&(c=-1,l=-1,u=-1);let t=[0],n=0;for(let e=0;e<r;e++)n+=a(e)+(e<r-1?i:0),t.push(n);o=t,s=n}function rebuildFrom(e){if(!Number.isFinite(e)||e>=r)return;c=-1,l=-1,u=-1;let t=o[e]??0;for(let n=e;n<r;n++)o[n]=t,t+=a(n)+(n<r-1?i:0);o[r]=t,s=t}function findFirst(e){let t=0,n=r-1;for(;t<n;){let r=t+n>>1;endAt(r)<=e?t=r+1:n=r}return t}function findLast(e,t){let n=t,i=r-1;for(;n<i;){let t=n+i+1>>1;startAt(t)<e?n=t:i=t-1}return n}function computeRange(e,t,n,i){let a=findFirst(e),o=findLast(t,a);return{renderEnd:Math.min(r-1,o+i),renderStart:Math.max(0,a-n)}}function isDedupSame(e,t){return e===c&&t===l&&s===u}function commitDedup(e,t){c=e,l=t,u=s}function resetDedup(){c=-1,l=-1,u=-1}function scheduleBuild(e){d||(d=!0,queueMicrotask(()=>{d=!1;let t=f;f=1/0,rebuildFrom(t),e()}))}function markChanged(e){e<f&&(f=e)}function itemAt(e){let t=startAt(e),n=a(e);return{end:t+n,index:e,size:n,start:t}}return{commitDedup,computeRange,consumeMinChangedIndex(){let e=f;return f=1/0,e},get count(){return r},endAt,findFirst,findLast,get gap(){return i},isDedupSame,itemAt,markChanged,get minChangedIndex(){return f},get pendingBuild(){return d},get prevEnd(){return l},get prevStart(){return c},get prevTotalSize(){return u},rebuild,rebuildFrom,resetDedup,scheduleBuild,setCount(e){r=e},setGap(e){i=e},sizeAt(e){return a(e)},startAt,get totalSize(){return s}}}function computeStickyItems(e){if(!e.stickyFn||e.count===0||e.scrollOffset<=0)return[];let t=-1,n=0,r=e.count-1;for(;n<=r;){let i=n+r>>1;e.startAt(i)<e.scrollOffset?(t=i,n=i+1):r=i-1}if(t<0)return[];let i=-1;for(let n=t;n>=0;n--)if(e.stickyFn(n)){i=n;break}if(i===-1)return[];let a=e.sizeAt(i),o=1/0;for(let t=i+1;t<e.count;t++)if(e.stickyFn(t)){o=e.startAt(t);break}let s=Math.min(e.scrollOffset,o-a);return[{end:s+a,index:i,size:a,start:s}]}function createVirtualizer(e,t){typeof t.estimateSize==`number`&&requirePositiveNumber(t.estimateSize,`estimateSize`),t.gap!==void 0&&requireNonNegativeInteger(t.gap,`gap`),t.initialOffset!==void 0&&requireNonNegativeNumber(t.initialOffset,`initialOffset`),t.overscan!==void 0&&validateOverscan(t.overscan),t.scrollEndDelay!==void 0&&requireNonNegativeNumber(t.scrollEndDelay,`scrollEndDelay`);let n=!!t.horizontal,defaultItemKey=e=>e,r=requireNonNegativeInteger(t.count,`count`),i=resolveEstimateFn(t.estimateSize,36),a=toNonNegativeInt(t.gap??0),o=t.getItemKey??defaultItemKey,s=normalizeOverscan(t.overscan,3),c=t.sticky??null,l=t.autoMeasure??!1,u=t.onChange,d=t.onScrollEnd,f=t.onScrollingChange,p=t.scrollEndDelay??150;function emitState(e){y.publish(e),u?.(e)}let m=null,h=`onscrollend`in e;function notifyScrollEnd(){D&&(D=!1,f?.(!1),d?.(C))}function handleScrollStart(){D||(D=!0,f?.(!0)),h||(m!==null&&clearTimeout(m),m=setTimeout(notifyScrollEnd,p))}let g=t.measurementCache??new Map,_=[],v=[],y=createSnapshotStore({items:_,stickyItems:v,totalSize:0}),b=createAxis1D(r,e=>g.get(o(e))??i(e),a),x=-1,S=0,C=0,w=0,T=-1,E=!1,D=!1;function clampScrollOffset(e){let t=Number.isFinite(e)?e:0,n=Math.max(0,b.totalSize-w);return Math.min(n,Math.max(0,t))}function computeVisible(){if(E)return;if(r===0||w<=0){(b.prevStart!==-1||b.prevTotalSize!==b.totalSize)&&(b.commitDedup(-1,-1),_=[],v=[],emitState({items:_,stickyItems:v,totalSize:b.totalSize}));return}let{renderEnd:t,renderStart:n}=b.computeRange(C,C+w,s.start,s.end),i=c!==null&&C!==T;if(b.isDedupSame(n,t)&&!i)return;b.commitDedup(n,t),T=C;let a=[];for(let e=n;e<=t;e++)a.push(b.itemAt(e));_=a,v=c?computeStickyItems({count:r,scrollOffset:C,sizeAt:b.sizeAt,startAt:b.startAt,stickyFn:c}):[],emitState({items:_,stickyItems:v,totalSize:b.totalSize}),l&&_.length>0&&queueMicrotask(()=>{if(!(E||e instanceof Window))for(let t of _){let n=o(t.index),r=e?.querySelector?.(`[data-vz-key="${n}"]`);r instanceof HTMLElement&&measureEl(t.index,r)}})}function recordMeasurement(e,t){if(!Number.isFinite(e))return!1;let n=Math.floor(e);if(n<0||n>=r)return!1;let i=toPositiveNumber(t,-1);if(i<=0)return!1;let a=o(n);return g.get(a)!==i&&(g.set(a,i),b.markChanged(n),!0)}function recordScrollAnchor(){C<=0||r===0?x=-1:(x=b.findFirst(C),S=C-b.startAt(x))}function restoreScrollAnchor(){if(x<0)return;let e=b.startAt(x)+S-C;if(x=-1,Math.abs(e)>=1){let t=clampScrollOffset(C+e);A.writeOffset(t,`auto`),C=t}}function measureBatch(e){if(E)return;let t=!1;for(let{index:n,size:r}of e)recordMeasurement(n,r)&&(t=!0);t&&(b.pendingBuild||recordScrollAnchor(),b.scheduleBuild(()=>{restoreScrollAnchor(),computeVisible()}))}function measure(e,t){measureBatch([{index:e,size:t}])}function measureEl(e,t){return E?()=>{}:observeResize(O.signal,t,t=>{measure(e,n?t.contentRect.width:t.contentRect.height)})}function applyOptions(e){e.count!==void 0&&requireNonNegativeInteger(e.count,`count`),typeof e.estimateSize==`number`&&requirePositiveNumber(e.estimateSize,`estimateSize`),e.gap!==void 0&&requireNonNegativeInteger(e.gap,`gap`),e.overscan!==void 0&&validateOverscan(e.overscan),e.scrollEndDelay!==void 0&&requireNonNegativeNumber(e.scrollEndDelay,`scrollEndDelay`);let t=!1,n=!1;if(Object.hasOwn(e,`onChange`)&&(u=e.onChange),Object.hasOwn(e,`onScrollEnd`)&&(d=e.onScrollEnd),Object.hasOwn(e,`onScrollingChange`)&&(f=e.onScrollingChange),e.scrollEndDelay!==void 0&&(p=e.scrollEndDelay),e.count!==void 0){let n=e.count;n!==r&&(r=n,b.setCount(r),t=!0)}if(Object.hasOwn(e,`estimateSize`)&&(i=resolveEstimateFn(e.estimateSize,36),g.clear(),t=!0),e.gap!==void 0){let n=e.gap;n!==a&&(a=n,b.setGap(a),t=!0)}if(Object.hasOwn(e,`getItemKey`)){let n=e.getItemKey??defaultItemKey;n!==o&&(o=n,g.clear(),t=!0)}if(Object.hasOwn(e,`measurementCache`)&&e.measurementCache!==void 0&&(g=e.measurementCache,t=!0),e.overscan!==void 0){let t=normalizeOverscan(e.overscan,3);(t.start!==s.start||t.end!==s.end)&&(s=t,n=!0)}if(Object.hasOwn(e,`sticky`)){let t=e.sticky??null;t!==c&&(c=t,b.resetDedup()),n=!0}Object.hasOwn(e,`autoMeasure`)&&(l=e.autoMeasure??!1),t&&(recordScrollAnchor(),b.rebuild(!0),restoreScrollAnchor()),(n||t)&&(w=A.readViewportSize(),C=clampScrollOffset(A.readOffset()),computeVisible())}function remeasure(){E||(w=A.readViewportSize(),C=clampScrollOffset(A.readOffset()),computeVisible())}function invalidate(){E||(g.clear(),b.rebuild(!0),computeVisible())}function refresh(){E||(b.rebuild(!0),computeVisible())}function prepend(e){if(E)return;let t=toNonNegativeInt(e);if(t===0)return;r+=t,b.setCount(r),b.rebuild(!0);let n=b.startAt(t),i=clampScrollOffset(C+n);A.writeOffset(i,`auto`),C=i,computeVisible()}function update(e){E||applyOptions(e)}function scrollToIndex(t,n={}){if(E||r<=0)return;let i=Math.max(0,Math.min(Number.isFinite(t)?Math.floor(t):0,r-1)),a=n.align??`auto`,o=n.behavior??`auto`,s=b.startAt(i),c=b.sizeAt(i),l=s+c,u;if(a===`start`)u=s;else if(a===`end`)u=l-w;else if(a===`center`)u=s-(w-c)/2;else{let e=C,t=e+w;if(s>=e&&l<=t){n.onComplete&&queueMicrotask(n.onComplete);return}u=s<e?s:l-w}A.writeOffset(clampScrollOffset(u),o),n.onComplete&&(o===`smooth`&&`onscrollend`in e?e.addEventListener(`scrollend`,n.onComplete,{once:!0}):queueMicrotask(n.onComplete))}function scrollToOffset(e,t={}){E||A.writeOffset(clampScrollOffset(e),t.behavior??`auto`)}function scrollToTop(e={}){scrollToOffset(0,e)}function scrollToBottom(e={}){scrollToOffset(Math.max(0,b.totalSize-w),e)}function isAtEnd(e=0){return b.totalSize-(C+w)<=e}let O=new AbortController;function _dispose(){E||(E=!0,y.dispose(),O.abort(),m!==null&&(clearTimeout(m),m=null),h&&e.removeEventListener(`scrollend`,notifyScrollEnd),k.detach())}function handleScroll(){C=clampScrollOffset(A.readOffset()),handleScrollStart(),computeVisible()}function handleResize(){w=A.readViewportSize(),computeVisible()}let k=createScrollAdapter(e,handleScroll,handleResize),A=n?k.x:k.y;return h&&e.addEventListener(`scrollend`,notifyScrollEnd,{passive:!0}),b.rebuild(!0),t.initialOffset!==void 0&&A.writeOffset(clampScrollOffset(t.initialOffset),`auto`),C=clampScrollOffset(A.readOffset()),w=A.readViewportSize(),computeVisible(),{get count(){return r},get disposalSignal(){return O.signal},dispose:_dispose,get disposed(){return E},getSnapshot:y.getSnapshot,invalidate,isAtEnd,get isScrolling(){return D},get items(){return _},measure,measureBatch,measureEl,prepend,refresh,remeasure,get scrollOffset(){return C},scrollToBottom,scrollToIndex,scrollToOffset,scrollToTop,get stickyItems(){return v},subscribe:y.subscribe,[Symbol.dispose]:_dispose,get totalSize(){return b.totalSize},update}}function createNodePool(){let e=new Map,t=new Map,n=[],r=!1;return{acquire(i,a){if(!r)return a();let o=e.get(i);if(o)return t.set(i,o),o;let s=n.pop()??a();return t.set(i,s),s},beginCycle(){t=new Map,r=!0},clear(){for(let t of e.values())t.remove();e.clear(),t.clear(),n.length=0,r=!1},endCycle(){if(r){r=!1;for(let[r,i]of e)t.has(r)||(i.remove(),n.push(i));e=t}}}}function createDomVirtualList(e){if(typeof e.estimateSize==`number`&&requirePositiveNumber(e.estimateSize,`estimateSize`),e.gap!==void 0&&requireNonNegativeInteger(e.gap,`gap`),e.overscan!==void 0&&validateOverscan(e.overscan),e.stickToBottom!==void 0&&typeof e.stickToBottom!=`boolean`){if(e.stickToBottom===null||Array.isArray(e.stickToBottom))throw new ScrollConfigError(`stickToBottom must be a boolean or options object.`);e.stickToBottom.threshold!==void 0&&requireNonNegativeNumber(e.stickToBottom.threshold,`stickToBottom.threshold`)}let t=[],n=!1,r=new AbortController,i=e.listElement,a=createSnapshotStore({items:[],stickyItems:[],totalSize:0});function emitState(e){a.publish(e),handleChange(e)}let o=createNodePool(),s=null;function resolveKey(n){let r=t[n];return r!==void 0&&e.getItemKey?e.getItemKey(n,r):n}function resolveEstimate(n){if(e.estimateSize===void 0)return 36;if(typeof e.estimateSize==`number`)return e.estimateSize;let r=t[n];return r===void 0?36:e.estimateSize(n,r)}function applyListSize(t){e.horizontal?(i.style.height=``,i.style.width=`${t}px`):(i.style.height=`${t}px`,i.style.width=``)}function toRenderItem(e){let n=t[e.index];if(n===void 0)throw new ScrollRangeError(`toRenderItem: index ${e.index} is out of range (currentItems.length=${t.length})`);return{...e,data:n}}function handleChange(t){applyListSize(t.totalSize),o.beginCycle();try{e.render({items:t.items.map(toRenderItem),listEl:i,recycle:(e,t)=>o.acquire(e,t),stickyItems:t.stickyItems.map(toRenderItem),totalSize:t.totalSize})}finally{o.endCycle()}}function clearAndReset(){o.clear(),e.clear?e.clear(i):i.textContent=``,i.style.height=``,i.style.width=``,i.style.position=``,i.style.contain=``}function resolveStickToBottom(){let t=e.stickToBottom;return t?t===!0?{enabled:!0,threshold:48}:{enabled:t.enabled??!0,threshold:t.threshold??48}:{enabled:!1,threshold:48}}function spawnVirtualizer(){let n=createVirtualizer(e.scrollElement,{count:t.length,estimateSize:resolveEstimate,gap:e.gap,getItemKey:resolveKey,horizontal:e.horizontal,measurementCache:e.measurementCache,onChange:emitState,overscan:e.overscan??3,sticky:e.sticky?n=>{let r=t[n];return r!==void 0&&e.sticky(n,r)}:void 0});return s=n,i.style.position=`relative`,i.style.contain=`layout`,n}function _dispose(){n||(n=!0,a.dispose(),r.abort(),s?.dispose(),s=null,clearAndReset())}return{get count(){return s?.count??0},get disposalSignal(){return r.signal},dispose:_dispose,get disposed(){return n},getSnapshot:a.getSnapshot,invalidate(){n||s?.invalidate()},isAtEnd(e){return s?.isAtEnd(e)??!0},get isScrolling(){return s?.isScrolling??!1},get items(){return s?.items??[]},measure(e,t){n||s?.measure(e,t)},measureBatch(e){n||s?.measureBatch(e)},measureEl(e,t){return n?()=>{}:s?.measureEl(e,t)??(()=>{})},refresh(){n||s?.refresh()},remeasure(){n||s?.remeasure()},get scrollOffset(){return s?.scrollOffset??0},scrollToBottom(e){n||s?.scrollToBottom(e)},scrollToIndex(e,t){n||s?.scrollToIndex(e,t)},scrollToOffset(e,t){n||s?.scrollToOffset(e,t)},scrollToTop(e){n||s?.scrollToTop(e)},setItems(r){if(n)return;let i=resolveStickToBottom(),o=i.enabled&&(s?.isAtEnd(i.threshold)??!0);if(t=r,r.length===0){s?.dispose(),s=null,a.publish({items:[],stickyItems:[],totalSize:0}),clearAndReset();return}if(!s){let e=spawnVirtualizer();o&&e.scrollToBottom();return}let c=r.length!==s.count;s.update({count:r.length}),c?e.getItemKey||s.invalidate():e.getItemKey?s.refresh():s.invalidate(),o&&s.scrollToBottom()},get stickyItems(){return s?.stickyItems??[]},subscribe:a.subscribe,[Symbol.dispose]:_dispose,get totalSize(){return s?.totalSize??0}}}function createVirtualScroller(e,t){let n=document.createElement(`div`);n.style.cssText=t.horizontal?`overflow: auto hidden; width: 100%; height: 100%;`:`overflow: hidden auto; width: 100%; height: 100%;`,t.containerClass&&(n.className=t.containerClass);let r=document.createElement(`div`);n.appendChild(r),e.appendChild(n);let i;try{i=createDomVirtualList({...t,listElement:r,scrollElement:n})}catch(e){throw n.remove(),e}let a=i.dispose.bind(i);return Object.assign(i,{dispose(){a(),n.remove()},[Symbol.dispose](){a(),n.remove()}})}function alignOffset(e,t,n,r,i,a){return a===`start`?e:a===`end`?t-i:a===`center`?e-(i-n)/2:e>=r&&t<=r+i?null:e<r?e:t-i}function createGridVirtualizer(e,t){typeof t.estimateRowSize==`number`&&requirePositiveNumber(t.estimateRowSize,`estimateRowSize`),typeof t.estimateColSize==`number`&&requirePositiveNumber(t.estimateColSize,`estimateColSize`),t.initialScrollTop!==void 0&&requireNonNegativeNumber(t.initialScrollTop,`initialScrollTop`),t.initialScrollLeft!==void 0&&requireNonNegativeNumber(t.initialScrollLeft,`initialScrollLeft`),t.rowGap!==void 0&&requireNonNegativeInteger(t.rowGap,`rowGap`),t.colGap!==void 0&&requireNonNegativeInteger(t.colGap,`colGap`),t.overscanY!==void 0&&validateOverscan(t.overscanY,`overscanY`),t.overscanX!==void 0&&validateOverscan(t.overscanX,`overscanX`);let n=requireNonNegativeInteger(t.rowCount,`rowCount`),r=requireNonNegativeInteger(t.colCount,`colCount`),i=resolveEstimateFn(t.estimateRowSize,36),a=resolveEstimateFn(t.estimateColSize,36),o=normalizeOverscan(t.overscanY,3),s=normalizeOverscan(t.overscanX,3),c=t.onChange,l=t.onRangeChange;function emitState(e){v.publish(e),c?.(e)}let u=t.rowMeasurementCache??new Map,d=t.colMeasurementCache??new Map,f=0,p=0,m=0,h=0,g=[],_=[],v=createSnapshotStore({cols:_,rows:g,totalHeight:0,totalWidth:0}),y=!1,b=createAxis1D(n,e=>u.get(e)??i(e),toNonNegativeInt(t.rowGap??0)),x=createAxis1D(r,e=>d.get(e)??a(e),toNonNegativeInt(t.colGap??0)),S=!1;function clampTop(e){let t=Number.isFinite(e)?e:0;return Math.min(Math.max(0,b.totalSize-m),Math.max(0,t))}function clampLeft(e){let t=Number.isFinite(e)?e:0;return Math.min(Math.max(0,x.totalSize-h),Math.max(0,t))}function computeVisible(){if(y)return;let e=b.totalSize,t=x.totalSize;if(n===0||r===0||m<=0||h<=0){(b.prevStart!==-1||b.prevTotalSize!==e||x.prevTotalSize!==t)&&(b.commitDedup(-1,-1),x.commitDedup(-1,-1),g=[],_=[],emitState({cols:[],rows:[],totalHeight:e,totalWidth:t}));return}let{renderEnd:i,renderStart:a}=b.computeRange(f,f+m,o.start,o.end),{renderEnd:c,renderStart:u}=x.computeRange(p,p+h,s.start,s.end),d=b.isDedupSame(a,i),v=x.isDedupSame(u,c);if(d&&v)return;b.commitDedup(a,i),x.commitDedup(u,c),(!d||!v)&&l&&l({firstCol:u,firstRow:a,lastCol:c,lastRow:i});let S=[];for(let e=a;e<=i;e++)S.push(b.itemAt(e));let C=[];for(let e=u;e<=c;e++)C.push(x.itemAt(e));g=S,_=C,emitState({cols:_,rows:g,totalHeight:e,totalWidth:t})}function recordRowMeasurement(e,t){if(!Number.isFinite(e))return!1;let r=Math.floor(e);if(r<0||r>=n)return!1;let i=toPositiveNumber(t,-1);return i<=0||u.get(r)===i?!1:(u.set(r,i),b.markChanged(r),!0)}function recordColMeasurement(e,t){if(!Number.isFinite(e))return!1;let n=Math.floor(e);if(n<0||n>=r)return!1;let i=toPositiveNumber(t,-1);return i<=0||d.get(n)===i?!1:(d.set(n,i),x.markChanged(n),!0)}function scheduleFlush(){S||(S=!0,queueMicrotask(()=>{S=!1;let e=b.consumeMinChangedIndex();e!==1/0&&b.rebuildFrom(e);let t=x.consumeMinChangedIndex();t!==1/0&&x.rebuildFrom(t),computeVisible()}))}function measureRow(e,t){y||recordRowMeasurement(e,t)&&scheduleFlush()}function measureColumn(e,t){y||recordColMeasurement(e,t)&&scheduleFlush()}function measureBatch(e,t){if(y)return;let n=!1;for(let{index:t,size:r}of e)recordRowMeasurement(t,r)&&(n=!0);for(let{index:e,size:r}of t)recordColMeasurement(e,r)&&(n=!0);n&&scheduleFlush()}function measureRowEl(e,t){return y?()=>{}:observeResize(C.signal,t,t=>measureRow(e,t.contentRect.height))}function measureColEl(e,t){return y?()=>{}:observeResize(C.signal,t,t=>measureColumn(e,t.contentRect.width))}function invalidate(){y||(u.clear(),d.clear(),b.rebuild(!0),x.rebuild(!0),computeVisible())}function refresh(){y||(b.rebuild(!0),x.rebuild(!0),computeVisible())}function prependRows(e){if(y)return;let t=toNonNegativeInt(e);if(t===0)return;n+=t,b.setCount(n),b.rebuild(!0);let r=b.startAt(t),i=clampTop(f+r);w.scrollTo(p,i,`auto`),f=i,computeVisible()}function scrollToRow(e,t={}){if(y||n===0)return;let r=Math.max(0,Math.min(Math.floor(Number.isFinite(e)?e:0),n-1)),i=t.behavior??`auto`,a=b.startAt(r),o=b.sizeAt(r),s=alignOffset(a,a+o,o,f,m,t.rowAlign??`auto`);s!==null&&w.scrollTo(p,clampTop(s),i)}function scrollToColumn(e,t={}){if(y||r===0)return;let n=Math.max(0,Math.min(Math.floor(Number.isFinite(e)?e:0),r-1)),i=t.behavior??`auto`,a=x.startAt(n),o=x.sizeAt(n),s=alignOffset(a,a+o,o,p,h,t.colAlign??`auto`);s!==null&&w.scrollTo(clampLeft(s),f,i)}function scrollToCell(e,t,i={}){if(y||n===0||r===0)return;let a=Math.max(0,Math.min(Math.floor(Number.isFinite(e)?e:0),n-1)),o=Math.max(0,Math.min(Math.floor(Number.isFinite(t)?t:0),r-1)),s=i.behavior??`auto`,c=b.startAt(a),l=b.sizeAt(a),u=x.startAt(o),d=x.sizeAt(o),g=alignOffset(c,c+l,l,f,m,i.rowAlign??`auto`),_=alignOffset(u,u+d,d,p,h,i.colAlign??`auto`);(g!==null||_!==null)&&w.scrollTo(_===null?p:clampLeft(_),g===null?f:clampTop(g),s)}function update(e){if(y)return;e.rowCount!==void 0&&requireNonNegativeInteger(e.rowCount,`rowCount`),e.colCount!==void 0&&requireNonNegativeInteger(e.colCount,`colCount`),typeof e.estimateRowSize==`number`&&requirePositiveNumber(e.estimateRowSize,`estimateRowSize`),typeof e.estimateColSize==`number`&&requirePositiveNumber(e.estimateColSize,`estimateColSize`),e.rowGap!==void 0&&requireNonNegativeInteger(e.rowGap,`rowGap`),e.colGap!==void 0&&requireNonNegativeInteger(e.colGap,`colGap`),e.overscanY!==void 0&&validateOverscan(e.overscanY,`overscanY`),e.overscanX!==void 0&&validateOverscan(e.overscanX,`overscanX`);let t=!1,f=!1,p=!1;if(Object.hasOwn(e,`onChange`)&&(c=e.onChange),Object.hasOwn(e,`onRangeChange`)&&(l=e.onRangeChange),e.rowCount!==void 0){let r=e.rowCount;r!==n&&(n=r,b.setCount(n),t=!0)}if(e.colCount!==void 0){let t=e.colCount;t!==r&&(r=t,x.setCount(r),f=!0)}if(e.rowGap!==void 0){let n=e.rowGap;n!==b.gap&&(b.setGap(n),t=!0)}if(e.colGap!==void 0){let t=e.colGap;t!==x.gap&&(x.setGap(t),f=!0)}if(`estimateRowSize`in e&&(i=resolveEstimateFn(e.estimateRowSize,36),u.clear(),t=!0),`estimateColSize`in e&&(a=resolveEstimateFn(e.estimateColSize,36),d.clear(),f=!0),e.overscanY!==void 0){let t=normalizeOverscan(e.overscanY,3);(t.start!==o.start||t.end!==o.end)&&(o=t,p=!0)}if(e.overscanX!==void 0){let t=normalizeOverscan(e.overscanX,3);(t.start!==s.start||t.end!==s.end)&&(s=t,p=!0)}t&&b.rebuild(!0),f&&x.rebuild(!0),(t||f||p)&&computeVisible()}let C=new AbortController;function disposeImpl(){y||(y=!0,v.dispose(),C.abort(),w.detach())}function handleScroll(){f=clampTop(w.y.readOffset()),p=clampLeft(w.x.readOffset()),computeVisible()}function handleResize(){m=w.y.readViewportSize(),h=w.x.readViewportSize(),computeVisible()}let w=createScrollAdapter(e,handleScroll,handleResize);return b.rebuild(!0),x.rebuild(!0),m=w.y.readViewportSize(),h=w.x.readViewportSize(),t.initialScrollTop===void 0?t.initialScrollLeft!==void 0&&w.scrollTo(clampLeft(t.initialScrollLeft),0,`auto`):w.scrollTo(t.initialScrollLeft??0,clampTop(t.initialScrollTop),`auto`),f=clampTop(w.y.readOffset()),p=clampLeft(w.x.readOffset()),computeVisible(),{get cols(){return _},get disposalSignal(){return C.signal},dispose:disposeImpl,get disposed(){return y},getSnapshot:v.getSnapshot,invalidate,measureBatch,measureColEl,measureColumn,measureRow,measureRowEl,prependRows,refresh,get rows(){return g},get scrollLeft(){return p},scrollToCell,scrollToColumn,get scrollTop(){return f},scrollToRow,subscribe:v.subscribe,[Symbol.dispose]:disposeImpl,get totalHeight(){return b.totalSize},get totalWidth(){return x.totalSize},update}}function buildFlatEntries(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n];t.push({isHeader:!0,itemIndex:-1,label:r.label,sectionIndex:n});for(let e=0;e<r.items.length;e++)t.push({isHeader:!1,item:r.items[e],itemIndex:e,sectionIndex:n})}return t}function createGroupedVirtualizer(e,t){typeof t.estimateHeaderSize==`number`&&requirePositiveNumber(t.estimateHeaderSize,`estimateHeaderSize`),typeof t.estimateItemSize==`number`&&requirePositiveNumber(t.estimateItemSize,`estimateItemSize`),t.overscan!==void 0&&validateOverscan(t.overscan),t.scrollEndDelay!==void 0&&requireNonNegativeNumber(t.scrollEndDelay,`scrollEndDelay`);let n=t.sections,r=buildFlatEntries(n);function buildEstimateHeader(e){return typeof e==`function`?t=>{let i=r[t];return e(n[i.sectionIndex],i.sectionIndex)}:resolveEstimateFn(typeof e==`number`?e:void 0,36)}let i=buildEstimateHeader(t.estimateHeaderSize),a=typeof t.estimateItemSize==`function`?t.estimateItemSize:null,o=a?null:resolveEstimateFn(typeof t.estimateItemSize==`number`?t.estimateItemSize:void 0,36),s=t.getItemKey;function estimateFn(e){let t=r[e];return t?t.isHeader?i(e):a?a(t.item,t.itemIndex,t.sectionIndex):o(e):36}function getItemKey(e){let t=r[e];return t?t.isHeader?`__header_${t.sectionIndex}`:s?s(t.item,t.itemIndex,t.sectionIndex):e:e}let c=!1,l=[],u=createSnapshotStore({headers:[],items:[],stickyHeader:null,totalSize:0}),d=t.onChange,f=t.onScrollEnd,p=t.onScrollingChange;function emitState(e){u.publish(e),d?.(e)}function mapState(e){let t=[],n=[],i=null;for(let i of e.items){let e=r[i.index];e&&(e.isHeader?n.push({...i,label:e.label??``,sectionIndex:e.sectionIndex}):t.push({...i,data:e.item,itemIndex:e.itemIndex,sectionIndex:e.sectionIndex}))}if(e.stickyItems.length>0){let t=e.stickyItems[0],n=r[t.index];n?.isHeader&&(i={...t,label:n.label??``,sectionIndex:n.sectionIndex})}return l=t,{headers:n,items:t,stickyHeader:i,totalSize:e.totalSize}}let m=createVirtualizer(e,{count:r.length,estimateSize:estimateFn,getItemKey,horizontal:t.horizontal,measurementCache:t.measurementCache,onChange:e=>{emitState(mapState(e))},onScrollEnd:e=>f?.(e),onScrollingChange:e=>p?.(e),overscan:t.overscan??3,scrollEndDelay:t.scrollEndDelay,sticky:e=>r[e]?.isHeader??!1}),h=new AbortController;function _dispose(){c||(c=!0,u.dispose(),h.abort(),m.dispose())}function flatIndexOf(e,t){if(e<0||e>=n.length)return-1;let r=0;for(let i=0;i<n.length;i++){if(i===e)return t===void 0?r:r+1+t;r+=1+n[i].items.length}return-1}return{get count(){return m.count},get disposalSignal(){return h.signal},dispose:_dispose,get disposed(){return c},getSnapshot:u.getSnapshot,invalidate(){c||m.invalidate()},get isScrolling(){return m.isScrolling},get items(){return l},measure(e,t){c||m.measure(e,t)},measureBatch(e){c||m.measureBatch(e)},measureEl(e,t){return c?()=>{}:m.measureEl(e,t)},refresh(){c||m.refresh()},get scrollOffset(){return m.scrollOffset},scrollToBottom(e){c||m.scrollToBottom(e)},scrollToIndex(e,t){c||m.scrollToIndex(e,t)},scrollToItem(e,t,n={}){if(c)return;let r=flatIndexOf(e,t);r<0||m.scrollToIndex(r,n)},scrollToOffset(e,t){c||m.scrollToOffset(e,t)},scrollToSection(e,t={}){if(c)return;let n=flatIndexOf(e);n<0||m.scrollToIndex(n,t)},scrollToTop(e){c||m.scrollToTop(e)},get stickyItems(){return m.stickyItems},subscribe:u.subscribe,[Symbol.dispose]:_dispose,get totalSize(){return m.totalSize},update(e,t){if(c)return;t&&(typeof t.estimateHeaderSize==`number`&&requirePositiveNumber(t.estimateHeaderSize,`estimateHeaderSize`),typeof t.estimateItemSize==`number`&&requirePositiveNumber(t.estimateItemSize,`estimateItemSize`),t.overscan!==void 0&&validateOverscan(t.overscan),t.scrollEndDelay!==void 0&&requireNonNegativeNumber(t.scrollEndDelay,`scrollEndDelay`),Object.hasOwn(t,`onChange`)&&(d=t.onChange),Object.hasOwn(t,`onScrollEnd`)&&(f=t.onScrollEnd),Object.hasOwn(t,`onScrollingChange`)&&(p=t.onScrollingChange),t.estimateHeaderSize!==void 0&&(i=buildEstimateHeader(t.estimateHeaderSize)),t.estimateItemSize!==void 0&&(a=typeof t.estimateItemSize==`function`?t.estimateItemSize:null,o=a?null:resolveEstimateFn(typeof t.estimateItemSize==`number`?t.estimateItemSize:void 0,36)),t.getItemKey!==void 0&&(s=t.getItemKey)),n=e;let l=r.length;r=buildFlatEntries(n);let u={count:r.length};t?.measurementCache!==void 0&&(u.measurementCache=t.measurementCache),t?.overscan!==void 0&&(u.overscan=t.overscan),t?.scrollEndDelay!==void 0&&(u.scrollEndDelay=t.scrollEndDelay),r.length!==l||t?.measurementCache!==void 0||t?.overscan!==void 0||t?.scrollEndDelay!==void 0?m.update(u):m.refresh()}}}exports.DEFAULT_ESTIMATE_SIZE=e,exports.DEFAULT_OVERSCAN=t,exports.ScrollConfigError=ScrollConfigError,exports.ScrollError=ScrollError,exports.ScrollRangeError=ScrollRangeError,exports.createDomVirtualList=createDomVirtualList,exports.createGridVirtualizer=createGridVirtualizer,exports.createGroupedVirtualizer=createGroupedVirtualizer,exports.createMeasurementCache=createMeasurementCache,exports.createVirtualScroller=createVirtualScroller,exports.createVirtualizer=createVirtualizer;
2
2
  //# sourceMappingURL=scroll.cjs.map