Support and compatibility

Browsers

Published packages target the Browserslist query >0.6%, not op_mini all, read from the root build configuration.

Browser rendering requires a native ResizeObserver for item measurement. The Node export installs only an inert server-side observer so models can be created before DOM attachment; it does not polyfill browser measurement.

TypeScript

Core and adapters publish declarations generated from their public APIs. The compatibility contract checks every adapter’s declarations with TypeScript 6 and checks the combined public surface with TypeScript 7. The API reference is generated from the same public source.

Server rendering

Models can be created without attached DOM elements. Initial estimatedWidgetSize, estimatedItemSize, and overscanCount determine the initial range; real elements replace those estimates after hydration. Adapters defer DOM attachment to their normal mounted lifecycle, but the repository does not currently provide a dedicated SSR example.

Framework versions

Each adapter package declares its supported range in peerDependencies; that manifest is the source of truth. This table reads those manifests during the website build instead of copying their values into prose.

FrameworkAdapterSupported range
React@af-utils/virtual-react^19.0.0
Preact@af-utils/virtual-preact^10.23.0
Solid@af-utils/virtual-solid^1.5.0
Svelte@af-utils/virtual-svelte^5.34.0
Lit@af-utils/virtual-lit^2.0.0 || ^3.0.0
Vue@af-utils/virtual-vue^3.3.0

A packed-package compatibility test installs every declared lower bound with strict peer checks, validates public types and Node exports, and runs a small lifecycle in Chromium. Standalone examples use current framework releases and test real application behavior instead of repeating the minimum-version matrix.

Older framework majors outside the declared ranges are not supported through legacy adapter branches. Open framework setup for package names and runnable examples.