# Swiper: what changed from 12 to 14 - Product: Swiper (https://whatsnew.fyi/product/swiper) - Vendor: idangero.us - Range: changelog entries numbered after v12.2.0 up to and including v14.2.0, stable releases only - Entries below: 7 releases (newest first) - Resolved: 12 is v12.2.0 and 14 is v14.2.0, the newest stable release of each major we track - Carrying security changes: 0 · CVEs mentioned: 0 · Mentioning breaking changes: 1 · Removing or deprecating something: 1 - Page: https://whatsnew.fyi/product/swiper/compare/12...14 What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. ## What changed (28 changes, grouped by kind) ### Added #### v14.2.0 (2026-08-26) - Add lazyPreload param to disable built-in lazy image handling - Add fadeEffect mode param with new out-in transition mode #### v14.0.0 (2026-06-26) - Per-module type augmentation allows importing a module to bring its option, method, and event types ### Changed #### v14.0.0 (2026-06-26) - 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 ### Fixed #### v14.2.0 (2026-08-26) - 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 #### v14.1.0 (2026-08-06) - keep module defaults when params come from another realm - make elementOffset viewport-relative again - preserve module options in breakpoints #### v14.0.7 (2026-07-28) - Zoom to the tapped point on the first double-tap #### v14.0.5 (2026-07-09) - render first slide on initial update in virtual mode #### v14.0.2 (2026-07-07) - 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 #### v14.0.1 (2026-06-29) - 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 #### v14.0.0 (2026-06-26) - Several type signatures that used to be any are now correctly typed (e.g. getTranslate(): number) ### Removed #### v14.0.0 (2026-06-26) - 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 ## Release notes ### v14.2.0 - Date: 2026-08-26 - Version: v14.2.0 - Original notes: https://github.com/nolimits4web/swiper/releases/tag/v14.2.0 - Permalink: https://whatsnew.fyi/product/swiper/releases/v14.2.0 - **fixed** — Prevent invalid calc() transform with low perSlideOffset in cards - **fixed** — Do not emit index-change events from loopFix teleports - **fixed** — Harden extend() against prototype-method override in key filtering - **fixed** — Recompute rtlTranslate in changeDirection - **fixed** — Size loop buffer from actual offset width, not centeredSlides geometry - **added** — Add lazyPreload param to disable built-in lazy image handling - **added** — Add fadeEffect mode param with new out-in transition mode ###### Bug Fixes * **cards:** prevent invalid calc() transform with low perSlideOffset ([d8ff235](https://github.com/nolimits4web/Swiper/commit/d8ff2350d215580da052e3fd1fc39b55e0af9a99)), closes [#8211](https://github.com/nolimits4web/Swiper/issues/8211) * **core:** do not emit index-change events from loopFix teleports ([#8015](https://github.com/nolimits4web/Swiper/issues/8015)) ([9b78f71](https://github.com/nolimits4web/Swiper/commit/9b78f71ac271d71a8811011dbb86d058d7ac5e2a)) * **core:** harden extend() against prototype-method override in key filtering ([93154fc](https://github.com/nolimits4web/Swiper/commit/93154fc3d793f9f44c7c987a53091fe36fc82e74)), closes [#8189](https://github.com/nolimits4web/Swiper/issues/8189) * **core:** recompute rtlTranslate in changeDirection ([#8053](https://github.com/nolimits4web/Swiper/issues/8053)) ([b4b49bf](https://github.com/nolimits4web/Swiper/commit/b4b49bf33717b021ffdf63c45caa24cd351699f9)) * **core:** size loop buffer from actual offset width, not centeredSlides geometry ([#8203](https://github.com/nolimits4web/Swiper/issues/8203)) ([bc4a658](https://github.com/nolimits4web/Swiper/commit/bc4a6588a81d3c5c2ea9ae345eba35fc3f1ed3d9)) ###### Features * **core:** add lazyPreload param to disable built-in lazy image handling ([#7570](https://github.com/nolimits4web/Swiper/issues/7570)) ([81345db](https://github.com/nolimits4web/Swiper/commit/81345db82559f3dda08da1e3bcb575026e913e24)) * **fade:** add fadeEffect "mode" param with new "out-in" transition mode ([#8051](https://github.com/nolimits4web/Swiper/issues/8051)) ([b907702](https://github.com/nolimits4web/Swiper/commit/b9077025f6ce2a6c78d43f4969d990ffd9868de6)) ### v14.1.0 - Date: 2026-08-06 - Version: v14.1.0 - Original notes: https://github.com/nolimits4web/swiper/releases/tag/v14.1.0 - Permalink: https://whatsnew.fyi/product/swiper/releases/v14.1.0 - **fixed** — keep module defaults when params come from another realm - **fixed** — make elementOffset viewport-relative again - **fixed** — preserve module options in breakpoints ###### Bug Fixes * **core:** keep module defaults when params come from another realm ([4bb6caf](https://github.com/nolimits4web/Swiper/commit/4bb6cafebcfdeb736695b49b6f2d94d4265a4ecf)) * **core:** make elementOffset viewport-relative again ([1115f9e](https://github.com/nolimits4web/Swiper/commit/1115f9e73b65e87c30fcc8e005929fb41c86efc0)), closes [#8209](https://github.com/nolimits4web/Swiper/issues/8209) * **types:** preserve module options in breakpoints ([d598495](https://github.com/nolimits4web/Swiper/commit/d598495ede2a0dc7aad3f44b7bf7afdbdc98a48b)), closes [#8207](https://github.com/nolimits4web/Swiper/issues/8207) ### v14.0.7 - Date: 2026-07-28 - Version: v14.0.7 - Original notes: https://github.com/nolimits4web/swiper/releases/tag/v14.0.7 - Permalink: https://whatsnew.fyi/product/swiper/releases/v14.0.7 - **fixed** — Zoom to the tapped point on the first double-tap ###### Bug Fixes * **zoom:** zoom to the tapped point on the first double-tap ([e0d4ed5](https://github.com/nolimits4web/Swiper/commit/e0d4ed5214c267f26650ff4029b3eb6131978865)) ### v14.0.5 - Date: 2026-07-09 - Version: v14.0.5 - Original notes: https://github.com/nolimits4web/swiper/releases/tag/v14.0.5 - Permalink: https://whatsnew.fyi/product/swiper/releases/v14.0.5 - **fixed** — render first slide on initial update in virtual mode ###### Bug Fixes * **virtual:** render first slide on initial update ([ebdb054](https://github.com/nolimits4web/Swiper/commit/ebdb0541374fbd2ee109aa05e87a430161692503)), closes [#8202](https://github.com/nolimits4web/Swiper/issues/8202) ### v14.0.2 - Date: 2026-07-07 - Version: v14.0.2 - Original notes: https://github.com/nolimits4web/swiper/releases/tag/v14.0.2 - Permalink: https://whatsnew.fyi/product/swiper/releases/v14.0.2 - **fixed** — Spawn npx via shell on Windows in emit-types - **fixed** — Divide fraction and progressbar pagination total by grid rows - **fixed** — Bind Thumbs tap handler when thumbs swiper is set after init in React ###### Bug Fixes * **build:** spawn npx via shell on Windows in emit-types ([494f7b1](https://github.com/nolimits4web/Swiper/commit/494f7b14547ba4c7ce3f2b758d8a5b1bc9724f9f)), closes [#8197](https://github.com/nolimits4web/Swiper/issues/8197) * **pagination:** divide fraction/progressbar total by grid rows ([edfbfa5](https://github.com/nolimits4web/Swiper/commit/edfbfa553a8d7188261efe0a57d73b3b71359904)) * **react:** bind Thumbs tap handler when thumbs swiper is set after init ([4fb72b9](https://github.com/nolimits4web/Swiper/commit/4fb72b92921da24ef11e764025bf05666c814cf3)), closes [#8198](https://github.com/nolimits4web/Swiper/issues/8198) ### v14.0.1 - Date: 2026-06-29 - Version: v14.0.1 - Original notes: https://github.com/nolimits4web/swiper/releases/tag/v14.0.1 - Permalink: https://whatsnew.fyi/product/swiper/releases/v14.0.1 - **fixed** — Restore slide detection in web component by resolving slidesEl to the host element instead of the shadow root - **fixed** — Render navigation, pagination, and scrollbar when set as boolean params in web component and Vue wrapper 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 `` element initialized with zero slides because `slidesEl` was resolved to the shadow root instead of the host element ([b3b822f](https://github.com/nolimits4web/Swiper/commit/b3b822f98edcd4ebfc9816a6b8924225bac3f5dd)), closes [#8196](https://github.com/nolimits4web/swiper/issues/8196) * **element:** render navigation/pagination/scrollbar when set as boolean params — bare boolean usage (``, Vue `:navigation="true"`) stopped rendering the built-in controls ([253fa39](https://github.com/nolimits4web/Swiper/commit/253fa399f278b0edc9f74cec37f0df5edbe28ea9)), closes [#8196](https://github.com/nolimits4web/swiper/issues/8196) ### v14.0.0 - Date: 2026-06-26 - Version: v14.0.0 - Original notes: https://github.com/nolimits4web/swiper/releases/tag/v14.0.0 - Permalink: https://whatsnew.fyi/product/swiper/releases/v14.0.0 - **changed** — Rewrote the entire codebase in TypeScript for smaller bundles and more accurate types - **changed** — Raised browser baseline to Chrome/Edge 110+, Safari 16.4+ (iOS 16.4+), and Firefox 110+ - **changed** — Removed legacy DOM-compat helpers and below-baseline feature detection, reducing shared DOM utils by approximately 28% - **changed** — Minified bundle sizes decreased by 2-4% (swiper.min.js −4.1%, swiper-element.min.js −2.9%, swiper-bundle.min.js −2.3%) - **removed** — Removed ssr-window as a runtime dependency and replaced with inline environment guards - **removed** — Removed Babel from the build process in favor of TypeScript's JSX transform - **changed** — Hand-maintained .d.ts type declarations are now emitted directly from TypeScript source - **added** — Per-module type augmentation allows importing a module to bring its option, method, and event types - **changed** — Type resolution now works correctly under classic node, node16/nodenext, and bundler module resolution modes - **changed** — Increased Node.js requirement to >= 20.19.0 for building and developing against the package - **fixed** — Several type signatures that used to be any are now correctly typed (e.g. getTranslate(): number) 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.ts` tree (`src/types/`, the per-module `.d.ts` files) is gone — declarations are emitted directly from the runtime source with `tsc`, so the shipped types can no longer drift from the implementation. Several signatures that used to be `any` are now correctly typed (e.g. `getTranslate(): number`). - **Per-module type augmentation.** Each module augments the central `Swiper` / `SwiperOptions` / `SwiperEvents` interfaces. 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`, and `bundler` module resolution, and `swiper/bundle` exposes every module's options out of the box. Verified by a consumer-simulation test suite. - **Zero runtime dependencies.** The `ssr-window` dependency 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-env` is 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 `smoothScroll` support flag, the Safari < 16.2 perspective workaround, and the legacy `DocumentTouch` touch 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 (`engines` was `>= 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.