Changelog

All notable changes to the project.

  • 2.2.0

    Features

    • ✓playground: measure the comparison page instead of transcribing it

    Performance

    • ↗virtual-scroll: cut the keyboard handler's size and per-key allocations
    • ↗virtual-scroll: keep the scrollbar overlay out of the table entries


  • 2.1.1

    Bug Fixes

    • ⨯playground: cancel the drag events the draggable list leaves to the browser
    • ⨯virtual-scroll: hide the masonry native scrollbar outright
    • ⨯virtual-scroll: repair the snapping axis, the container tag and the lean entry

    Performance

    • ↗playground: count the scroll-status DOM nodes on range changes, not every scroll frame


  • 2.1.0

    Features

    • ✓playground: generate the configurator options it advertises

    Bug Fixes

    • ⨯playground: drop the generated buttons that cannot do anything
    • ⨯playground: generate the changelog data before type-checking
    • ⨯playground: let the generated pens call the controls they show
    • ⨯playground: pin the generated pens to the library's current version
    • ⨯playground: route changelog entries into the right groups
    • ⨯playground: size the generated table columns from their content
    • ⨯virtual-scroll: keep measurement corrections in the container's scroll space
    • ⨯virtual-scroll: re-measure auto-sized flow columns once item rows render


  • 2.0.0

    Breaking Changes

    • !virtual-scroll: move sticky pinning into useStickyExtension
    • !sticky pinning now requires useStickyExtension(). A useVirtualScroll consumer that sets stickyIndices without the extension keeps the layout offsets but no longer keeps the previous sticky item rendered or marks items active. VirtualScroll, VirtualScrollTable and the masonry component already wire the extension, so their behaviour is unchanged.

    Features

    • ✓playground: add a layout switcher example
    • ✓playground: generate the active item, load payload and snapshots
    • ✓virtual-scroll: accept reactive props in the keyboard composable
    • ✓virtual-scroll: add the lean ./core entry
    • ✓virtual-scroll: load in the scroll direction and add scroll snapshots
    • ✓virtual-scroll: track an active item for keyboard navigation

    Bug Fixes

    • ⨯playground: insert a dragged row where the marker is
    • ⨯playground: keep highlighted code from becoming markup
    • ⨯playground: stop shadowing the built-in Record type
    • ⨯playground: tile the layout switcher's grid cells
    • ⨯virtual-scroll: create the live region outside the template
    • ⨯virtual-scroll: keep measured content under the pointer during a drag
    • ⨯virtual-scroll: type the exposed active-item members on the instance


  • 1.0.0

    Breaking Changes

    • !virtual-scroll: rename getColIndexAt to getColumnIndexAt
    • !virtual-scroll: publish the internal entry and the 1.0 metadata
    • !virtual-scroll: curate the package entry and add the ./internal subpath
    • !virtual-scroll: declare the engine return type and accept reactive props
    • !virtual-scroll: align the table's public types with its runtime API
    • !getColIndexAt is renamed to getColumnIndexAt on the engine return, VirtualScrollInstance, ExtensionContext.methods and the keyboard composable options.
    • !useVirtualScroll no longer returns __internalState. Read the engine refs from ExtensionContext.internalState in an extension, or type the result as UseVirtualScrollReturn<T> and use the documented members.
    • !VirtualScrollTableComponentProps no longer declares containerTag, wrapperTag, itemTag, headerTag or footerTag (they never had an effect on the table - use VirtualScroll when you need custom tags), and VirtualScrollTableInstance no longer declares headerTag/footerTag.
    • !the root entry no longer re-exports the engine internals:
      the calculate* layer (calculateRange, calculateTotalSize, ...) plus SnapResult, displayToVirtual, virtualToDisplay, isItemVisible, findPrevStickyIndex and resolveSnap;
      the DOM scroll helpers (isWindow, isBody, isWindowLike, isElement, isScrollableElement, scrollTo, isScrollToIndexOptions, getPaddingX, getPaddingY);
      the sizing layer (useVirtualScrollSizes, UseVirtualScrollSizesProps);
      the parameter bags (RangeParams, ColumnRangeParams, StickyParams, ItemPositionParams, ItemStyleParams, ScrollTargetParams, ScrollTargetResult, TotalSizeParams).
      Import them from @pdanpdan/virtual-scroll/internal, which carries no compatibility guarantee. FenwickTree, BROWSER_MAX_SIZE, the components, the composables, the extension contract and the types stay on the root entry.
    • !Vue ^3.5.0 is now required (useId provides the generated container ids); installing with 3.0-3.4 fails the peer check.

    Features

    • ✓virtual-scroll: add ScrollToOffsetOptions for programmatic scrolls
    • ✓virtual-scroll: describe the full exposed instance in VirtualScrollInstance

    Bug Fixes

    • ⨯playground: generate the UMD examples during the build
    • ⨯virtual-scroll: render valid ARIA roles and scrollbar labels
    • ⨯VirtualScrollMasonry: resolve the instance id during setup


  • 0.13.2

    Bug Fixes

    • ⨯playground: install the Playwright browser before e2e runs
    • ⨯VirtualScrollMasonry: re-apply re-layout scroll writes the browser clamps


  • 0.13.1

    Bug Fixes

    • ⨯VirtualScroll: autodetect changes in starting scroll position of first item in the list


  • 0.13.0

    Features

    • ✓playground: add async content pattern example
    • ✓playground: add code viewer pattern example
    • ✓playground: add live streaming pattern example
    • ✓playground: add log viewer pattern example
    • ✓playground: cerious-scroll comparison section and masonry rows
    • ✓playground: flow table essential example and regrouped examples
    • ✓playground: masonry essential example with measured-heights showcase
    • ✓playground: masonry example cards on the home page
    • ✓playground: masonry gallery pattern with bounded image prefetch
    • ✓playground: masonry renderer in the configurator generator
    • ✓playground: show live DOM item count in example status
    • ✓playground: table renderer in the configurator
    • ✓virtual-scroll: dedicated VirtualScrollTable and semantic tag props
    • ✓virtual-scroll: masonry column layout module
    • ✓virtual-scroll: masonry virtualization in one scroll container
    • ✓virtual-scroll: re-clamp end-anchored scrolls as measurements settle
    • ✓virtual-scroll: support sparse index-only items arrays

    Bug Fixes

    • ⨯playground: accept masonry scroll details in ScrollStatus
    • ⨯playground: drop native lazy loading from virtualized images
    • ⨯virtual-scroll: anchor scroll targets at the container padding box
    • ⨯virtual-scroll: opt out of browser scroll anchoring

    Performance

    • ↗virtual-scroll: drop per-row storage and re-walks for uniform axes
    • ↗virtual-scroll: grow Fenwick tree incrementally on resize


  • 0.12.0

    Features

    • ✓add AGENTS.md for users and update llms.txt


  • 0.11.6

    Bug Fixes

    • ⨯guard against reading window on SSR


  • 0.11.5

    Bug Fixes

    • ⨯jump to header with sticky headers
    • ⨯re-sync internal scroll when size changes without scroll event
    • ⨯recalculate item sizes when gap changes in dynamic mode


  • 0.11.4

    Bug Fixes

    • ⨯account for container padding when positioning virtual scrollbars
    • ⨯scroll positioning to bottom while content is still showing
    • ⨯show the loading slot as soon as loading is trigerred in infinite scroll


  • 0.11.3

    Bug Fixes

    • ⨯do not clamp scroll before the loading slot when scrolling to end
    • ⨯keep sticky section headers below the sticky header if it exists
    • ⨯scroll while loading new content and pg_up/down scroll for large items


  • 0.11.2

    Bug Fixes

    • ⨯build: adapt to changes in vite config to fix location of generated d.ts file


  • 0.11.1

    Bug Fixes

    • ⨯dead CSS, doc corrections, expose missing methods


  • 0.11.0

    Features

    • ✓extract scroll inertia, kbd interactions, and observers in composables
    • ✓playground: add side-by-side diff example


  • 0.10.3

    Bug Fixes

    • ⨯initial scroll to bottom


  • 0.10.2

    Bug Fixes

    • ⨯corner case where initial content was not initially rendered if screen was resized


  • 0.10.1

    Bug Fixes

    • ⨯prevent auto scroll on android when snap is enabled


  • 0.10.0

    Features

    • ✓add a new scroll snap mode 'next'
    • ✓expose handleScrollCorrection and component properties
    • ✓implement modular extension system
    • ✓support array-based circular sizing patterns
    • ✓use smooth scrolling for final snap scroll

    Bug Fixes

    • ⨯resolve typechecking and build issues


  • 0.9.1

    Performance

    • ↗internal optimization for sticky items


  • 0.9.0

    Features

    • ✓changelog: support basic markdown formatting in changelog items
    • ✓core: allow optional indices in scrollToIndex and simplify scroll utilities
    • ✓navigation: ensure PageUp/PageDown respect snap mode
    • ✓navigation: improve PageUp/PageDown behavior by using scrollToIndex with snapping
    • ✓playground: hide dev-only settings when not viewing an example page

    Bug Fixes

    • ⨯tests: resolve event target mismatches and stabilize scroll snap timing


  • 0.8.0

    Features

    • ✓use lightningcss with profile widely-available to compile css


  • 0.7.0

    Features

    • ✓playground: enhance accessibility across all examples
    • ✓virtual-scroll: implement comprehensive ARIA support

    Bug Fixes

    • ⨯docs: revert optimization for class names (tailwind :) )


  • 0.6.0

    Features

    • ✓virtual-scroll: add universal scrollTo utility and improve element detection

    Bug Fixes

    • ⨯virtual-scroll: improve sticky logic and axis-specific active states


  • 0.5.0

    Features

    • ✓add VirtualScrollbar component and useVirtualScrollbar composable
    • ✓code optimization - reduce duplication
    • ✓enhance VirtualScroll component with scrollbars and emulated touch
    • ✓implement coordinate scaling and RTL support for massive lists
    • ✓remove duplicate code
    • ✓virtual-scrollbar: reorganize props exported by useVirtualScrollbar composable
    • ✓virtual-scroll: improve SSR visual accuracy and scaling synchronization
    • ✓virtual-scroll: move styles in components layer

    Bug Fixes

    • ⨯add defensive guards to watchers and safety checks for calculations
    • ⨯playground: improve active link scrolling logic in navigation drawer


  • 0.4.0

    Features

    • ✓improve scroll logic and add tests
    • ✓refactor virtual scroll logic and enhance DX


  • 0.3.0

    Features

    • ✓add cjs and umb build artifacts
    • ✓enhances dynamic sizing and refresh logic
    • ✓refactors slot handling using defineSlots


  • 0.2.1

    Bug Fixes

    • ⨯keyboard scroll clamping should only apply to virtualized direction
    • ⨯keyboard scroll wrong calculations
    • ⨯prevent keyboard scroll after end of list


  • 0.2.0

    Features

    • ✓create d.ts files for published package


  • 0.1.0

    Features

    • ✓complete implementation of core and playground


  • 0.0.1

    Features

    • ✓Initial project structure with pnpm monorepo.
    • ✓Core @pdanpdan/virtual-scroll library:
      VirtualScroll component for Vue 3.
      useVirtualScroll composable for custom implementations.
      Fenwick Tree utility for efficient size calculations.
      Support for vertical, horizontal, and grid scrolling.
      Support for dynamic item sizes via ResizeObserver.
      SSR support with ssrRange.
      Sticky items and push-style headers.
      Full keyboard navigation support (Arrows, PageUp, PageDown, Home, End).
    • ✓Comprehensive unit tests for the core library.
    • ✓Playground application for demonstrating library features:
      Vertical and horizontal scrolling examples.
      Bidirectional grid scrolling with fixed and dynamic sizes.
      SSR demonstration for grid scrolling.
      Documentation page with API reference.
      Advanced feature demonstrations:
      Chat interface with history loading and scroll restoration.
      Infinite scrolling (append/prepend) examples.
      Sticky sections and headers demonstration.
      Table-based virtual scrolling.
      Window/Body scroll integration.