Browser Support

Browser compatibility for SnapEngine Core features and the web platform APIs they use.

SnapEngine Core targets modern, evergreen browsers. The compatibility below is derived from the browser APIs and syntax used by the current source, not from a claim that every browser and version receives the complete automated test suite.

This audit covers src/ and was last reviewed on July 26, 2026 against MDN Browser Compatibility Data version 8.0.8.

Minimum versions

For full Core behavior, including input-listener cleanup, use at least these browser versions:

BrowserMinimum version
Chrome90
Edge90
Firefox86
Safari15
Chrome for Android90
Firefox for Android86
Safari on iOS15

The limiting Core primitive is abortable event listeners: addEventListener(type, listener, { signal }). Several other required APIs, including ResizeObserver and Pointer Events, became available earlier. SnapEngine does not include browser polyfills, and Internet Explorer is not supported.

Feature support matrix

✅ 90+ means that the feature has the platform APIs it needs beginning with that browser version. It does not mean that every listed version is continuously tested by SnapEngine.

SnapEngine featureChromeEdgeFirefoxSafariChrome AndroidFirefox AndroidiOS Safari
Core engine and render queue✅ 90+✅ 90+✅ 86+✅ 15+✅ 90+✅ 86+✅ 15+
DOM measurement and synchronization✅ 90+✅ 90+✅ 86+✅ 15+✅ 90+✅ 86+✅ 15+
Pointer, wheel, drag, and pinch input✅ 90+✅ 90+✅ 86+✅ 15+✅ 90+✅ 86+✅ 15+
Camera and coordinate transforms✅ 90+✅ 90+✅ 86+✅ 15+✅ 90+✅ 86+✅ 15+
Collision detection✅ 90+✅ 90+✅ 86+✅ 15+✅ 90+✅ 86+✅ 15+
Standard CSS-property animation✅ 90+✅ 90+✅ 86+✅ 15+✅ 90+✅ 86+✅ 15+
Custom $variable animation✅ 90+✅ 90+✅ 128+✅ 16.4+✅ 90+✅ 128+✅ 16.4+
Canvas debug renderer✅ 90+✅ 90+✅ 86+✅ 15+✅ 90+✅ 86+✅ 15+

Custom $variable animation has a newer floor because it registers typed, numeric CSS custom properties with CSS.registerProperty(). Constructing an animation with $ keys throws a descriptive error when that API is unavailable. Ordinary CSS-property animations do not use CSS.registerProperty().

Platform API audit

SnapEngine functionalityBrowser APIs and syntax currently usedRequirement
Shared render pipelinerequestAnimationFrame(), cancelAnimationFrame(), promises, Map, and SetRequired by every engine
Container and object layoutResizeObserver, MutationObserver, getBoundingClientRect(), getComputedStyle(), and CSSStyleDeclarationRequired when DOM is assigned
Input handlingPointer Events, the PointerEvent constructor, WheelEvent, abortable event listeners, and Event.composedPath()Required for full pointer, wheel, drag, and pinch behavior
Object transformsCSS transform, translate3d(), and scale()Required for DOM-backed object positioning
Camera transformsCSS matrix3d() and DOM rectanglesRequired when applying camera output to a DOM layer
Collision detectionJavaScript number and collection APIs, including Math.hypot()No additional browser API beyond Core
Standard animationAnimation, KeyframeEffect, AnimationEffect.getComputedTiming(), Animation.commitStyles(), and computed stylesRequired by AnimationObject
Custom animation variablesCSS custom properties, CSS.registerProperty(), style.setProperty(), and style.getPropertyValue()Required only for $variable keyframes
Debug renderer<canvas> and CanvasRenderingContext2DRequired only when debugging is enabled
DOM bookkeepingclassList, data attributes, Element.remove(), WeakMap, and ProxyRequired by DOM-backed objects

Event.composedPath() is preferred for routing through composed DOM trees, but SnapEngine contains a parent-node fallback. globalThis.reportError() is also optional because frame-task failures fall back to console.error().

Key API version floors

These are the first unprefixed versions for the relevant API, or the newest primitive in a grouped requirement. The overall feature matrix uses the higher Core minimum where necessary.

Platform requirementChromeEdgeFirefoxSafariChrome AndroidFirefox AndroidiOS Safari
requestAnimationFrame()241223725237
ResizeObserver64796913.1647913.4
PointerEvent and its constructor55125913557913
Abortable addEventListener()90908615908615
Animation constructors, timing, and commitStyles()84847513.1847913.4
CSS.registerProperty()787912816.47812816.4
ES modules and nullish coalescing80807213.1807913.4

Canvas 2D, mutation observers, computed styles, DOM rectangles, class lists, and the CSS transform functions used by SnapEngine all predate the Core minimums above.

Build and runtime expectations

The package exports TypeScript source as ES modules. Consuming applications are expected to process it through their TypeScript-aware bundler and choose a JavaScript syntax target appropriate for their browser policy. The version matrix on this page covers runtime platform APIs; it cannot account for a consumer build that leaves unsupported JavaScript syntax untransformed.

SnapEngine is browser-only. Create engines and animations after a DOM is available rather than during server rendering.

Browser-specific notes

  • Safari on iOS can report adjusted getBoundingClientRect() values when the user zooms the page. Test camera and pointer-coordinate behavior if page zoom is part of the product experience.
  • Pointer Events provide the touch data used for drag and pinch gestures, but an application may still need an appropriate CSS touch-action policy to keep native scrolling or zooming from winning a gesture.
  • Animation.commitStyles() is used to preserve the final computed state. SnapEngine catches commit failures, but browsers below the documented animation floor can revert a non-persistent animation after it is canceled.
  • The main Playwright configuration exercises Chromium and Firefox. Some layout suites also exercise WebKit, but the compatibility table should not be read as an end-to-end test guarantee for Safari or branded mobile browsers.

Compatibility sources