What changed in Swiper from 12 to 14
7 releases numbered after v12.2.0 up to and including v14.2.0, stable releases only. v12.2.0 and v14.2.0 are the newest stable releases of 12 and 14 we track; this page follows them as new ones ship.
- 1 mentions breaking changes
- 1 removes or deprecates something
28 changes across 7 releases
- Rewrote the entire codebase in TypeScript for smaller bundles and more accurate types
- Raised browser baseline to Chrome/Edge 110+, Safari 16.4+ (iOS 16.4+), and Firefox 110+
- Removed legacy DOM-compat helpers and below-baseline feature detection, reducing shared DOM utils by approximately 28%
- Minified bundle sizes decreased by 2-4% (swiper.min.js −4.1%, swiper-element.min.js −2.9%, swiper-bundle.min.js −2.3%)
- Hand-maintained .d.ts type declarations are now emitted directly from TypeScript source
- Type resolution now works correctly under classic node, node16/nodenext, and bundler module resolution modes
- Increased Node.js requirement to >= 20.19.0 for building and developing against the package
- Prevent invalid calc() transform with low perSlideOffset in cards
- Do not emit index-change events from loopFix teleports
- Harden extend() against prototype-method override in key filtering
- Recompute rtlTranslate in changeDirection
- Size loop buffer from actual offset width, not centeredSlides geometry
- keep module defaults when params come from another realm
- make elementOffset viewport-relative again
- preserve module options in breakpoints
- Zoom to the tapped point on the first double-tap
- render first slide on initial update in virtual mode
- Spawn npx via shell on Windows in emit-types
- Divide fraction and progressbar pagination total by grid rows
- Bind Thumbs tap handler when thumbs swiper is set after init in React
- Restore slide detection in web component by resolving slidesEl to the host element instead of the shadow root
- Render navigation, pagination, and scrollbar when set as boolean params in web component and Vue wrapper
- Several type signatures that used to be any are now correctly typed (e.g. getTranslate(): number)
- Removed ssr-window as a runtime dependency and replaced with inline environment guards
- Removed Babel from the build process in favor of TypeScript's JSX transform
Original release notes, newest first
The list above is our reading of these notes; the originals from idangero.us are here, one fold per release.
v14.2.0
Bug Fixes
- cards: prevent invalid calc() transform with low perSlideOffset (d8ff235), closes #8211
- core: do not emit index-change events from loopFix teleports (#8015) (9b78f71)
- core: harden extend() against prototype-method override in key filtering (93154fc), closes #8189
- core: recompute rtlTranslate in changeDirection (#8053) (b4b49bf)
- core: size loop buffer from actual offset width, not centeredSlides geometry (#8203) (bc4a658)
Features
v14.1.0
v14.0.7
Bug Fixes
- zoom: zoom to the tapped point on the first double-tap (e0d4ed5)
v14.0.5
v14.0.2
v14.0.1
Patch release fixing two web-component (and Vue wrapper) regressions introduced by the v14 rewrite.
Bug Fixes
- core: restore slide detection in web component — the
<swiper-container>element initialized with zero slides becauseslidesElwas resolved to the shadow root instead of the host element (b3b822f), closes #8196 - element: render navigation/pagination/scrollbar when set as boolean params — bare boolean usage (
<swiper-container navigation>, Vue:navigation="true") stopped rendering the built-in controls (253fa39), closes #8196
v14.0.0
Swiper v14 is a ground-up TypeScript rewrite of the entire codebase, focused on smaller bundles, more accurate types, and a modern browser baseline. (We skipped v13.)
Upgrading from v12 requires no code changes. Every option, default, event, payload, method signature, and module import (swiper/modules, swiper/react, swiper/vue, swiper/element, …) behaves exactly as before. The only differences you may notice are tighter TypeScript types and a narrower set of supported browsers — see Breaking Changes below.
Highlights
- Single TypeScript source of truth.
src/is now.ts/.tsx. The hand-maintained.d.tstree (src/types/, the per-module.d.tsfiles) is gone — declarations are emitted directly from the runtime source withtsc, so the shipped types can no longer drift from the implementation. Several signatures that used to beanyare now correctly typed (e.g.getTranslate(): number). - Per-module type augmentation. Each module augments the central
Swiper/SwiperOptions/SwiperEventsinterfaces. Importing a module (e.g.import { Navigation } from 'swiper/modules') brings its option, method, and event types along with it — mirroring how the runtime already requires registration. - More reliable type resolution. Types now resolve correctly under classic
node,node16/nodenext, andbundlermodule resolution, andswiper/bundleexposes every module's options out of the box. Verified by a consumer-simulation test suite. - Zero runtime dependencies. The
ssr-windowdependency was removed and replaced with inline environment guards. Swiper now installs with no transitive runtime deps. - Smaller minified bundles. Legacy DOM-compat helpers and below-baseline feature detection were removed. The shared DOM utils shrank ~28%, and the main builds are ~2–4% smaller minified (
swiper.min.js−4.1%,swiper-element.min.js−2.9%,swiper-bundle.min.js−2.3%). - Babel removed from the build. TypeScript now handles the JSX transform for the React wrapper, and
@babel/preset-envis a no-op at the v14 baseline. Runtime output is byte-identical (React output is marginally smaller).
Breaking Changes
- Browser baseline raised to the last ~2 years of evergreen browsers. Swiper v14 targets Chrome / Edge 110+, Safari 16.4+ (iOS 16.4+), and Firefox 110+. Code paths and feature detection for older browsers were removed (e.g. the
smoothScrollsupport flag, the Safari < 16.2 perspective workaround, and the legacyDocumentTouchtouch check). iOS/Android-specific quirk handling is kept but simplified. If you need to support older browsers, stay on v12. - Node.js >= 20.19.0 is now required to build/develop against the package (
engineswas>= 4.7.0). This does not affect the browser runtime. - Type-level changes. Stricter types may surface latent issues in code that previously relied on
any-typed access to Swiper internals. These are compile-time only — there are no runtime behavior changes.
SSR
ssr-window's mock window/document were replaced with inline typeof guards. Server rendering with the React / Vue / Element wrappers is unaffected — they only instantiate Swiper in client-side mount effects. Imperatively calling new Swiper(...) in a pure Node (non-DOM) environment once again no-ops gracefully, matching v12 behavior, and is now locked down by a dedicated SSR runtime test.