You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Default scale is now 1.5 (was 1.3 vanilla / 1.4 React). Pass scale={1.3} to keep the previous look.
Default delay is now 0.4s in the vanilla build (was 0). Pass delay: 0 to disable the transition.
maxTransition semantics are unified across both builds — double-check the motion if you use it.
ESM-first packaging. The package targets ESM and bundlers. require() from Node CommonJS is no longer supported (use a dynamic import()); browser <script> (UMD) and bundlers are unaffected.
✨ Improvements & fixes
Shared core. The vanilla and React builds are now powered by the same framework-agnostic core (pure parallax math) and shared (browser helpers) modules — a single source of truth. The two builds behave identically and can no
longer drift apart.
SSR-safe. No browser API is touched at import time anymore — works in Next.js / SSR out of the box.
Much smoother React performance. No more re-render on every scroll frame: the transform is computed in the animation frame and written directly to the element. This also re-enables the transition on Safari.
Fixed: unmounting one parallax image no longer breaks the others (IntersectionObserver lifecycle bug).
Fixed (vanilla): passing a CSS selector string now works (it used to throw).
TypeScript types resolve under both bundler and node16/nodenext, and the vanilla entry now ships types (simple-parallax-js/vanilla).
Tree-shakeable (sideEffects: false); the npm package now ships only the build output.
🔧 Under the hood
Upgraded to React 19, TypeScript 6 and Vite 8 (peer dependency stays react >= 17).
Tooling moved to Bun + Ultracite (Biome); added CI, package validation (publint + arethetypeswrong) and an OIDC publish workflow.