1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[689],{1731:(e,s,n)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/compare/swiper-vs-keen-slider",function(){return n(5725)}])},5725:(e,s,n)=>{"use strict";n.r(s),n.d(s,{default:()=>o,meta:()=>r});var t=n(4848),i=n(8453),a=n(1086),l=n(8877);let r={title:"Swiper vs Keen Slider - Touch Slider Comparison",description:"Compare Swiper and Keen Slider across touch quality, features, and framework support. See which carousel library is the better choice.",competitor:"Keen Slider"},c=function(e){let{children:s}=e,n={h1:a.A.h1,h2:a.A.h2,h3:a.A.h3,h4:a.A.h4};return(0,t.jsx)(i.x,{components:n,children:(0,t.jsx)(l.p,{meta:r,children:s})})};function d(e){let s={code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.p,{children:"Keen Slider made a name for itself with exceptional touch physics - the momentum and rubber-band feel when swiping through slides is genuinely impressive. It's lightweight, written in TypeScript, and has a clean React hook API."}),"\n",(0,t.jsx)(s.p,{children:"However, being a headless, React-focused library with declining maintenance activity limits its appeal for many projects. Let's see how it compares to Swiper across the full picture."}),"\n",(0,t.jsx)(s.h2,{id:"quick-comparison",children:"Quick Comparison"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Feature"}),(0,t.jsx)(s.th,{children:"Swiper"}),(0,t.jsx)(s.th,{children:"Keen Slider"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GitHub Stars"}),(0,t.jsx)(s.td,{children:"40,000+"}),(0,t.jsx)(s.td,{children:"~4,500"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Actively Maintained"}),(0,t.jsx)(s.td,{children:"Yes (latest: v12, 2026)"}),(0,t.jsx)(s.td,{children:"Slowing (solo maintainer)"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Dependencies"}),(0,t.jsx)(s.td,{children:"None"}),(0,t.jsx)(s.td,{children:"None"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"License"}),(0,t.jsx)(s.td,{children:"MIT"}),(0,t.jsx)(s.td,{children:"MIT"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TypeScript Support"}),(0,t.jsx)(s.td,{children:"Full (built-in types)"}),(0,t.jsx)(s.td,{children:"Full (written in TypeScript)"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Bundle Size (gzipped)"}),(0,t.jsx)(s.td,{children:"~25-45KB (modular)"}),(0,t.jsx)(s.td,{children:"~5-8KB"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Framework Support"}),(0,t.jsx)(s.td,{children:"React, Vue, Angular, Svelte, Solid, Web Components"}),(0,t.jsx)(s.td,{children:"React (1st class), Vue/Angular/Svelte (basic)"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SSR Support"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"Partial (hydration issues)"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Accessibility"}),(0,t.jsx)(s.td,{children:"Built-in ARIA, keyboard nav"}),(0,t.jsx)(s.td,{children:"None"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Built-in UI"}),(0,t.jsx)(s.td,{children:"Navigation, pagination, scrollbar"}),(0,t.jsx)(s.td,{children:"None (headless)"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Transition Effects"}),(0,t.jsx)(s.td,{children:"7 built-in (3D, creative)"}),(0,t.jsx)(s.td,{children:"Slide only"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"AI Integration (MCP)"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(s.h2,{id:"maintenance-concerns",children:"Maintenance Concerns"}),"\n",(0,t.jsxs)(s.p,{children:["Keen Slider is a ",(0,t.jsx)(s.strong,{children:"solo maintainer project"})," by Eric Lewandowski. Development was active during the v6 rewrite (2021-2022), but activity has slowed considerably since then. Issues and pull requests have been accumulating without timely responses."]}),"\n",(0,t.jsx)(s.p,{children:"This creates risks for production projects:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Bus factor of 1"})," - the project depends entirely on one person"]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Slowing release cadence"})," - long gaps between updates"]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Open bugs"})," going unaddressed"]}),"\n"]}),"\n",(0,t.jsx)(s.p,{children:"Swiper has been actively maintained since 2013 with regular releases, a larger contributor base, and proven long-term sustainability backed by enterprise adoption from companies like Adobe, BMW, Nike, Samsung, and Toyota."}),"\n",(0,t.jsx)(s.h2,{id:"touch--mobile-experience",children:"Touch & Mobile Experience"}),"\n",(0,t.jsx)(s.p,{children:"This is where Keen Slider shines. Its touch physics are excellent:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"Natural momentum-based swiping"}),"\n",(0,t.jsx)(s.li,{children:"Rubber-band overscroll effect"}),"\n",(0,t.jsx)(s.li,{children:"Smooth deceleration"}),"\n",(0,t.jsx)(s.li,{children:"Good gesture detection (horizontal vs vertical scroll)"}),"\n"]}),"\n",(0,t.jsx)(s.p,{children:"Swiper was also built mobile-first and delivers a comparable touch experience:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"Hardware-accelerated CSS transitions"}),"\n",(0,t.jsx)(s.li,{children:"Momentum scrolling in free mode"}),"\n",(0,t.jsx)(s.li,{children:"Configurable touch angle and threshold"}),"\n",(0,t.jsx)(s.li,{children:"Native touch events with edge detection for iOS/Android back gestures"}),"\n",(0,t.jsx)(s.li,{children:"Passive event listeners for scroll performance"}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Pinch-to-zoom and double-tap zoom"})," (Keen Slider lacks this)"]}),"\n",(0,t.jsx)(s.li,{children:"CSS scroll snap mode for native-feeling scrolling"}),"\n"]}),"\n",(0,t.jsx)(s.p,{children:"Both libraries offer great touch interactions. Swiper adds zoom capabilities and CSS scroll snap mode that Keen Slider doesn't have."}),"\n",(0,t.jsx)(s.h2,{id:"feature-comparison",children:"Feature Comparison"}),"\n",(0,t.jsx)(s.h3,{id:"transition-effects",children:"Transition Effects"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Effect"}),(0,t.jsx)(s.th,{children:"Swiper"}),(0,t.jsx)(s.th,{children:"Keen Slider"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Slide"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Fade"}),(0,t.jsx)(s.td,{children:"Yes (with crossfade)"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Cube (3D)"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Coverflow (3D)"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Flip (3D)"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Cards"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Creative (custom)"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"No"})]})]})]}),"\n",(0,t.jsxs)(s.p,{children:["Keen Slider supports ",(0,t.jsx)(s.strong,{children:"only the default slide transition"}),". No fade, no 3D effects, no custom transitions. Swiper offers 7 built-in effects including the Creative effect for unlimited custom CSS transforms."]}),"\n",(0,t.jsx)(s.h3,{id:"core-slider-features",children:"Core Slider Features"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Feature"}),(0,t.jsx)(s.th,{children:"Swiper"}),(0,t.jsx)(s.th,{children:"Keen Slider"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Responsive Breakpoints"}),(0,t.jsx)(s.td,{children:"Yes (full config per breakpoint)"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Infinite Loop"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Autoplay"}),(0,t.jsx)(s.td,{children:"Yes (with progress tracking)"}),(0,t.jsx)(s.td,{children:"Via plugin"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Free Mode / Momentum"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Vertical Slider"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Centered Slides"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"Yes (centered mode)"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Multiple Slides Per View"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Auto Height"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"No (manual implementation)"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Variable Width Slides"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RTL Support"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CSS Scroll Snap Mode"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Rewind Mode"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Grid / Multi-row"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Nested Sliders"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Slide Spacing"}),(0,t.jsx)(s.td,{children:"Yes (spaceBetween)"}),(0,t.jsx)(s.td,{children:"Yes (spacing)"})]})]})]}),"\n",(0,t.jsx)(s.p,{children:"Both cover the basics, but Swiper has auto height, CSS scroll snap mode, grid layout, and nested slider support that Keen Slider lacks."}),"\n",(0,t.jsx)(s.h3,{id:"navigation--ui",children:"Navigation & UI"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Feature"}),(0,t.jsx)(s.th,{children:"Swiper"}),(0,t.jsx)(s.th,{children:"Keen Slider"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Navigation Arrows"}),(0,t.jsx)(s.td,{children:"Built-in module"}),(0,t.jsx)(s.td,{children:"Build yourself"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Pagination Bullets"}),(0,t.jsx)(s.td,{children:"Built-in module"}),(0,t.jsx)(s.td,{children:"Build yourself"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Pagination Fraction"}),(0,t.jsx)(s.td,{children:"Built-in module"}),(0,t.jsx)(s.td,{children:"Build yourself"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Progress Bar"}),(0,t.jsx)(s.td,{children:"Built-in module"}),(0,t.jsx)(s.td,{children:"Build yourself"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Scrollbar"}),(0,t.jsx)(s.td,{children:"Built-in (draggable)"}),(0,t.jsx)(s.td,{children:"Build yourself"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Autoplay Controls"}),(0,t.jsx)(s.td,{children:"Built-in"}),(0,t.jsx)(s.td,{children:"Build yourself"})]})]})]}),"\n",(0,t.jsx)(s.p,{children:"Like Embla, Keen Slider is headless - it provides no
1UI components. Every arrow, dot, progress bar, and control must be built from scratch. Swiper provides all of these as ready-to-use, customizable modules while also supporting fully custom UI when you need it."}),"\n",(0,t.jsx)(s.h3,{id:"advanced-features",children:"Advanced Features"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Feature"}),(0,t.jsx)(s.th,{children:"Swiper"}),(0,t.jsx)(s.th,{children:"Keen Slider"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Virtual Slides"}),(0,t.jsx)(s.td,{children:"Yes (render 1000s efficiently)"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Parallax"}),(0,t.jsx)(s.td,{children:"Yes (built-in)"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Zoom (pinch + double-tap)"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Thumbs Gallery"}),(0,t.jsx)(s.td,{children:"Yes (purpose-built)"}),(0,t.jsx)(s.td,{children:"Manual implementation"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Lazy Loading"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Hash Navigation"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"History Navigation"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Controller (2-way sync)"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Keyboard Control"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"No (manual implementation)"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Mousewheel Control"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"Via plugin"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Scrollbar"}),(0,t.jsx)(s.td,{children:"Yes (draggable)"}),(0,t.jsx)(s.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(s.p,{children:"Swiper's advanced feature set is dramatically larger. Virtual slides, parallax, zoom, thumbs gallery, hash/history navigation, keyboard control, and a draggable scrollbar are all built in. With Keen Slider, most of these would need to be built from scratch or aren't feasible at all."}),"\n",(0,t.jsx)(s.h2,{id:"framework-support",children:"Framework Support"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Framework"}),(0,t.jsx)(s.th,{children:"Swiper"}),(0,t.jsx)(s.th,{children:"Keen Slider"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Vanilla JS"}),(0,t.jsx)(s.td,{children:"Yes"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"React"}),(0,t.jsx)(s.td,{children:"Official components + hooks"}),(0,t.jsx)(s.td,{children:"useKeenSlider hook (1st class)"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Vue"}),(0,t.jsx)(s.td,{children:"Official components + hooks"}),(0,t.jsx)(s.td,{children:"Basic support"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Angular"}),(0,t.jsx)(s.td,{children:"Yes (via Swiper Element)"}),(0,t.jsx)(s.td,{children:"Basic support"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Svelte"}),(0,t.jsx)(s.td,{children:"Yes (via Swiper Element)"}),(0,t.jsx)(s.td,{children:"Basic support"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Solid"}),(0,t.jsx)(s.td,{children:"Yes (via Swiper Element)"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Web Components"}),(0,t.jsx)(s.td,{children:"Yes (Swiper Element)"}),(0,t.jsx)(s.td,{children:"No"})]})]})]}),"\n",(0,t.jsxs)(s.p,{children:["Keen Slider's React integration via ",(0,t.jsx)(s.code,{children:"useKeenSlider"})," is clean and well-designed. However, Vue, Angular, and Svelte support is significantly less polished - they lack dedicated adapters comparable to the React hook."]}),"\n",(0,t.jsx)(s.p,{children:"Swiper provides first-class support for React and Vue with dedicated components and hooks, plus Swiper Element (Web Component) for Angular, Svelte, Solid, and any other framework."}),"\n",(0,t.jsx)(s.h2,{id:"accessibility",children:"Accessibility"}),"\n",(0,t.jsxs)(s.p,{children:["Keen Slider has ",(0,t.jsx)(s.strong,{children:"no built-in accessibility features"}),":"]}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"No ARIA attributes"}),"\n",(0,t.jsx)(s.li,{children:"No keyboard navigation"}),"\n",(0,t.jsx)(s.li,{children:"No screen reader announcements"}
1),"\n",(0,t.jsx)(s.li,{children:"No focus management"}),"\n",(0,t.jsx)(s.li,{children:"Everything must be implemented manually"}),"\n"]}),"\n",(0,t.jsx)(s.p,{children:"This is a significant concern. Most Keen Slider implementations in the wild are likely not accessible."}),"\n",(0,t.jsx)(s.p,{children:"Swiper's A11y module provides comprehensive accessibility out of the box:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"ARIA labels and roles for slides, navigation, and pagination"}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.code,{children:"aria-live"})," regions for screen reader announcements"]}),"\n",(0,t.jsx)(s.li,{children:"Keyboard navigation (arrow keys)"}),"\n",(0,t.jsx)(s.li,{children:"Configurable accessibility labels"}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"bundle-size",children:"Bundle Size"}),"\n",(0,t.jsx)(s.p,{children:"Keen Slider at ~5-8KB gzipped is very lightweight. This is a genuine advantage for projects with strict bundle budgets."}),"\n",(0,t.jsx)(s.p,{children:"However, Keen Slider's small core doesn't include any UI. Once you add your own arrows, dots, progress indicators, keyboard handlers, autoplay controls, and accessibility attributes, your application code grows substantially."}),"\n",(0,t.jsx)(s.p,{children:"Swiper's modular imports let you ship only what you use:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"Core with navigation + pagination: ~28KB gzipped"}),"\n",(0,t.jsx)(s.li,{children:"You get built-in UI, accessibility, and far more features included"}),"\n"]}),"\n",(0,t.jsx)(s.p,{children:"For most projects, the development time saved by using Swiper's built-in modules and the built-in accessibility outweigh the bundle size difference."}),"\n",(0,t.jsx)(s.h2,{id:"ssr-support",children:"SSR Support"}),"\n",(0,t.jsx)(s.p,{children:"Keen Slider can work in SSR environments but requires DOM access for initialization. Some developers have reported layout shift and hydration issues with Next.js - the slider dimensions are calculated client-side, causing a flash of unstyled content."}),"\n",(0,t.jsx)(s.p,{children:"Swiper works reliably with Next.js, Nuxt, and SvelteKit, handling hydration correctly."}),"\n",(0,t.jsx)(s.h2,{id:"typescript--developer-experience",children:"TypeScript & Developer Experience"}),"\n",(0,t.jsxs)(s.p,{children:["Both libraries are written in TypeScript and provide excellent type safety. Keen Slider's ",(0,t.jsx)(s.code,{children:"useKeenSlider"})," hook is particularly clean for React developers."]}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Aspect"}),(0,t.jsx)(s.th,{children:"Swiper"}),(0,t.jsx)(s.th,{children:"Keen Slider"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TypeScript"}),(0,t.jsx)(s.td,{children:"Full built-in types (35 files)"}),(0,t.jsx)(s.td,{children:"Full built-in types"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Module System"}),(0,t.jsx)(s.td,{children:"ES modules"}),(0,t.jsx)(s.td,{children:"ES modules"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Plugin System"}),(0,t.jsx)(s.td,{children:"Module-based"}),(0,t.jsx)(s.td,{children:"Plugin-based"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Documentation"}),(0,t.jsx)(s.td,{children:"Extensive, maintained"}),(0,t.jsx)(s.td,{children:"Limited, gaps in advanced usage"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Community Size"}),(0,t.jsx)(s.td,{children:"Very large (40k+ stars)"}),(0,t.jsx)(s.td,{children:"Small (~4.5k stars)"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Stack Overflow Answers"}),(0,t.jsx)(s.td,{children:"Thousands"}),(0,t.jsx)(s.td,{children:"Very limited"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Enterprise Adoption"}),(0,t.jsx)(s.td,{children:"Adobe, BMW, Nike, Samsung, etc."}),(0,t.jsx)(s.td,{children:"Limited"})]})]})]}),"\n",(0,t.jsx)(s.p,{children:"Swiper's larger community means more examples, tutorials, and answered questions available when you run into problems."}),"\n",(0,t.jsx)(s.h2,{id:"ai-integration",children:"AI Integration"}),"\n",(0,t.jsxs)(s.p,{children:["Swiper offers a dedicated ",(0,t.jsx)("a",{href:"/swiper-mcp",children:"MCP (Model Context Protocol) server"})," that gives AI coding assistants like Claude, Cursor, and Windsurf programmatic access to the latest API docs, demos, and code examples. AI agents can generate correct, up-to-date Swiper code without hallucinating outdated APIs."]}
1),"\n",(0,t.jsx)(s.p,{children:"Keen Slider has no AI integration."}),"\n",(0,t.jsx)(s.h2,{id:"migration-from-keen-slider-to-swiper",children:"Migration from Keen Slider to Swiper"}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.strong,{children:"Keen Slider (React):"})}),"\n",(0,t.jsx)(s.pre,{className:"language-jsx",children:(0,t.jsxs)(s.code,{className:"language-jsx",children:[(0,t.jsx)(s.span,{className:"token keyword module",children:"import"})," ",(0,t.jsxs)(s.span,{className:"token imports",children:[(0,t.jsx)(s.span,{className:"token punctuation",children:"{"})," useKeenSlider ",(0,t.jsx)(s.span,{className:"token punctuation",children:"}"})]})," ",(0,t.jsx)(s.span,{className:"token keyword module",children:"from"})," ",(0,t.jsx)(s.span,{className:"token string",children:"'keen-slider/react'"}),(0,t.jsx)(s.span,{className:"token punctuation",children:";"}),"\n",(0,t.jsx)(s.span,{className:"token keyword module",children:"import"})," ",(0,t.jsx)(s.span,{className:"token string",children:"'keen-slider/keen-slider.min.css'"}),(0,t.jsx)(s.span,{className:"token punctuation",children:";"}),"\n\n",(0,t.jsx)(s.span,{className:"token keyword",children:"function"})," ",(0,t.jsx)(s.span,{className:"token function",children:(0,t.jsx)(s.span,{className:"token maybe-class-name",children:"Carousel"})}),(0,t.jsx)(s.span,{className:"token punctuation",children:"("}),(0,t.jsx)(s.span,{className:"token punctuation",children:")"})," ",(0,t.jsx)(s.span,{className:"token punctuation",children:"{"}),"\n ",(0,t.jsx)(s.span,{className:"token keyword",children:"const"})," ",(0,t.jsx)(s.span,{className:"token punctuation",children:"["}),"sliderRef",(0,t.jsx)(s.span,{className:"token punctuation",children:"]"})," ",(0,t.jsx)(s.span,{className:"token operator",children:"="})," ",(0,t.jsx)(s.span,{className:"token function",children:"useKeenSlider"}),(0,t.jsx)(s.span,{className:"token punctuation",children:"("}),(0,t.jsx)(s.span,{className:"token punctuation",children:"{"}),"\n ",(0,t.jsx)(s.span,{className:"token literal-property property",children:"loop"}),(0,t.jsx)(s.span,{className:"token operator",children:":"})," ",(0,t.jsx)(s.span,{className:"token boolean",children:"true"}),(0,t.jsx)(s.span,{className:"token punctuation",children:","}),"\n ",(0,t.jsx)(s.span,{className:"token literal-property property",children:"slides"}),(0,t.jsx)(s.span,{className:"token operator",children:":"})," ",(0,t.jsx)(s.span,{className:"token punctuation",children:"{"})," ",(0,t.jsx)(s.span,{className:"token literal-property property",children:"perView"}),(0,t.jsx)(s.span,{className:"token operator",children:":"})," ",(0,t.jsx)(s.span,{className:"token number",children:"3"}),(0,t.jsx)(s.span,{className:"token punctuation",children:","})," ",(0,t.jsx)(s.span,{className:"token literal-property property",children:"spacing"}),(0,t.jsx)(s.span,{className:"token operator",children:":"})," ",(0,t.jsx)(s.span,{className:"token number",children:"16"})," ",(0,t.jsx)(s.span,{className:"token punctuation",children:"}"}),(0,t.jsx)(s.span,{className:"token punctuation",children:","}),"\n ",(0,t.jsx)(s.span,{className:"token punctuation",children:"}"}),(0,t.jsx)(s.span,{className:"token punctuation",children:")"}),(0,t.jsx)(s.span,{className:"token punctuation",children:";"}),"\n\n ",(0,t.jsx)(s.span,{className:"token keyword control-flow",children:"return"})," ",(0,t.jsx)(s.span,{className:"token punctuation",children:"("}),"\n ",(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsx)(s.span,{className:"token punctuation",children:"<"}),"div"]})," ",(0,t.jsx)(s.span,{className:"token attr-name",children:"ref"}),(0,t.jsxs)(s.span,{className:"token script language-javascript",children:[(0,t.jsx)(s.span,{className:"token script-punctuation punctuation",children:"="}),(0,t.jsx)(s.span,{className:"token punctuation",children:"{"}),"sliderRef",(0,t.jsx)(s.span,{className:"token punctuation",children:"}"})]})," ",(0,t.jsx)(s.span,{className:"token attr-name",children:"className"}),(0,t.jsxs)(s.span,{className:"token attr-value",children:[(0,t.jsx)(s.span,{className:"token punctuation attr-equals",children:"="}),(0,t.jsx)(s.span,{className:"token punctuation",children:'"'}),"keen-slider",(0,t.jsx)(s.span,{className:"token punctuation",children:'"'})]}),(0,t.jsx)(s.span,{className:"token punctuation",children:">"})]}),(0,t.jsx)(s.span,{className:"token plain-text",children:"\n "}),(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsx)(s.span,{className:"token punctuation",children:"<"}),"div"]})," ",(0,t.jsx)(s.span,{className:"token attr-name",children:"className"}),(0,t.jsxs)(s.span,{className:"token attr-value",children:[(0,t.jsx)(s.span,{className:"token punctuation attr-equals",children:"="}),(0,t.jsx)(s.span,{className:"token punctuation",children:'"'}),"keen-slider__slide",(0,t.jsx)(s.span,{className:"token punctuation",children:'"'})]}),(0,t.jsx)(s.span,{className:"token punctuation",children:">"})]}),(0,t.jsx)(s.span,{className:"token plain-text",children:"Slide 1"}),(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsx)(s.span,{className:"token punctuation",children:"</"}),"div"]}),(0,t.jsx)(s.span,{className:"token punctuation",children:">"})]}),(0,t.jsx)(s.span,{className:"token plain-text",children:"\n "}),(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsx)(s.span,{className:"token punctuation",children:"<"}),"div"]})," ",(0,t.jsx)(s.span,{className:"token attr-name",children:"className"}),(0,t.jsxs)(s.span,{className:"token attr-value",children:[(0,t.jsx)(s.span,{className:"token punctuation attr-equals",children:"="}),(0,t.jsx)(s.span,{className:"token punctuation",children:'"'}),"keen-slider__slide",(0,t.jsx)(s.span,{className:"token punctuation",children:'"'})]}),(0,t.jsx)(s.span,{className:"token punctuation",children:">"})]}),(0,t.jsx)(s.span,{className:"token plain-text",children:"Slide 2"}),(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsx)(s.span,{className:"token punctuation",children:"</"}),"div"]}),(0,t.jsx)(s.span,{className:"token punctuation",children:">"})]}),(0,t.jsx)(s.span,{className:"token plain-text",children:"\n "}),(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsx)(s.span,{className:"token punctuation",children:"<"}),"div"]})," ",(0,t.jsx)(s.span,{className:"token attr-name",children:"className"}),(0,t.jsxs)(s.span,{className:"token attr-value",children:[(0,t.jsx)(s.span,{className:"token punctuation attr-equals",children:"="}),(0,t.jsx)(s.span,{className:"token punctuation",children:'"'}),"keen-slider__slide",(0,t.jsx)(s.span,{className:"token punctuation",children:'"'})]}),(0,t.jsx)(s.span,{className:"token punctuation",children:">"})]}),(0,t.jsx)(s.span,{className:"token plain-text",children:"Slide 3"}),(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsx)(s.span,{className:"token punctuation",children:"</"}),"div"]}),(0,t.jsx)(s.span,{className:"token punctuation",children:">"})]}),(0,t.jsx)(s.span,{className:"token plain-text",children:"\n "}),(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsx)(s.span,{className:"token punctuation",children:"</"}),"div"]}),(0,t.jsx)(s.span,{className:"token punctuation",children:">"})]}),"\n ",(0,t.jsx)(s.span,{className:"token punctuation",children:")"}),(0,t.jsx)(s.span,{className:"token punctuation",children:";"}),"\n",(0,t.jsx)(s.span,{className:"token punctuation",children:"}"}),"\n"]})}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.strong,{children:"Swiper (React):"})}),"\n",(0,t.jsx)(s.pre,{className:"language-jsx",children:(0,t.jsxs)(s.code,{className:"language-jsx",children:[(0,t.jsx)(s.span,{className:"token keyword module",children:"import"})," ",(0,t.jsxs)(s.span,{className:"token imports",children:[(0,t.jsx)(s.span,{className:"token punctuation",children:"{"})," ",(0,t.jsx)(s.span,{className:"token maybe-class-name",children:"Swiper"}),(0,t.jsx)(s.span,{className:"token punctuation",children:","})," ",(0,t.jsx)(s.span,{className:"token maybe-class-name",children:"SwiperSlide"})," ",(0,t.jsx)(s.span,{className:"token punctuation",children:"}"})]})," ",(0,t.jsx)(s.span,{className:"token keyword module",children:"from"})," ",(0,t.jsx)(s.span,{className:"token string",children:"'swiper/react'"}),(0,t.jsx)(s.span,{className:"token punctuation",children:";"}),"\n",(0,t.jsx)(s.span,{className:"token keyword module",children:"import"})," ",(0,t.jsxs)(s.span,{className:"token imports",children:[(0,t.jsx)(s.span,{className:"token punctuation",children:"{"})," ",(0,t.jsx)(s.span,{className:"token maybe-class-name",children:"Navigation"}),(0,t.jsx)(s.span,{className:"token punctuation",children:","})," ",(0,t.jsx)(s.span,{className:"token maybe-class-name",children:"Pagination"})," ",(0,t.jsx)(s.span,{className:"token punctuation",children:"}"})]})," ",(0,t.jsx)(s.span,{className:"token keyword module",children:"from"})," ",(0,t.jsx)(s.span,{className:"token string",children:"'swiper/modules'"}),(0,t.jsx)(s.span,{className:"token punctuation",children:";"}),"\n",(0,t.jsx)(s.span,{className:"token keyword module",children:"import"})," ",(0,t.jsx)(s.span,{className:"token string",children:"'swiper/css'"}),(0,t.jsx)(s.span,{className:"token punctuation",children:";"}),"\n",(0,t.jsx)(s.span,{className:"token keyword module",children:"import"})," ",(0,t.jsx)(s.span,{className:"token string",children:"'swiper/css/navigation'"}),(0,t.jsx)(s.span,{className:"token punctuation",children:";"}),"\n",(0,t.jsx)(s.span,{className:"token keyword module",children:"import"})," ",(0,t.jsx)(s.span,{className:"token string",children:"'swiper/css/pagination'"}),(0,t.jsx)(s.span,{className:"token punctuation",children:";"}),"\n\n",(0,t.jsx)(s.span,{className:"token keyword",children:"function"})," ",(0,t.jsx)(s.span,{className:"token function",children:(0,t.jsx)(s.span,{className:"token maybe-class-name",children:"Carousel"})}),(0,t.jsx)(s.span,{className:"token punctuation",children:"("}),(0,t.jsx)(s.span,{className:"token punctuation",children:")"})," ",(0,t.jsx)(s.span,{className:"token punctuation",children:"{"}),"\n ",(0,t.jsx)(s.span,{className:"token keyword control-flow",children:"return"})," ",(0,t.jsx)(s.span,{className:"token punctuation",children:"("}),"\n ",(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsx)(s.span,{className:"token punctuation",children:"<"}),(0,t.jsx)(s.span,{className:"token class-name",children:"Swiper"})]}),"\n ",(0,t.jsx)(s.span,{className:"token attr-name",children:"modules"}),(0,t.jsxs)(s.span,{className:"token script language-javascript",children:[(0,t.jsx)(s.span,{className:"token script-punctuation punctuation",children:"="}),(0,t.jsx)(s.span,{className:"token punctuation",children:"{"}),(0,t.jsx)(s.span,{className:"token punctuation",children:"["}),(0,t.jsx)(s.span,{className:"token maybe-class-name",children:"Navigation"}),(0,t.jsx)(s.span,{className:"token punctuation",children:","})," ",(0,t.jsx)(s.span,{className:"token maybe-class-name",children:"Pagination"}),(0,t.jsx)(s.span,{className:"token punctuation",children:"]"}),(0,t.jsx)(s.span,{className:"token punctuation",children:"}"})]}),"\n ",(0,t.jsx)(s.span,{className:"token attr-name",children:"slidesPerView"}),(0,t.jsxs)(s.span,{className:"token script language-javascript",children:[(0,t.jsx)(s.span,{className:"token script-punctuation punctuation",children:"="}),(0,t.jsx)(s.span,{className:"token punctuation",children:"{"}),(0,t.jsx)(s.span,{className:"token number",children:"3"}),(0,t.jsx)(s.span,{className:"token punctuation",children:"}"})]}),"\n ",(0,t.jsx)(s.span,{className:"token attr-name",children:"spaceBetween"}),(0,t.jsxs)(s.span,{className:"token script language-javascript",children:[(0,t.jsx)(s.span,{className:"token script-punctuation punctuation",children:"="}),(0,t.jsx)(s.span,{className:"token punctuation",children:"{"}),(0,t.jsx)(s.span,{className:"token number",children:"16"}),(0,t.jsx)(s.span,{className:"token punctuation",children:"}"})]}),"\n ",(0,t.jsx)(s.span,{className:"token attr-name",children:"loop"}),"\n ",(0,t.jsx)(s.span,{className:"token attr-name",children:"navigation"}),"\n ",(0,t.jsx)(s.span,{className:"token attr-name",children:"pagination"}),(0,t.jsxs)(s.span,{className:"token script language-javascript",children:[(0,t.jsx)(s.span,{className:"token script-punctuation punctuation",children:"="}),(0,t.jsx)(s.span,{className:"token punctuation",children:"{"}),(0,t.jsx)(s.span,{className:"token punctuation",children:"{"})," ",(0,t.jsx)(s.span,{className:"token literal-property property",children:"clickable"}),(0,t.jsx)(s.span,{className:"token operator",children:":"})," ",(0,t.jsx)(s.span,{className:"token boolean",children:"true"})," ",(0,t.jsx)(s.span,{className:"token punctuation",children:"}"}),(0,t.jsx)(s.span,{className:"token punctuation",children:"}"})]}),"\n ",(0,t.jsx)(s.span,{className:"token punctuation",children:">"})]}),(0,t.jsx)(s.span,{className:"token plain-text",children:"\n "}),(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsx)(s.span,{className:"token punctuation",children:"<"}),(0,t.jsx)(s.span,{className:"token class-name",children:"SwiperSlide"})]}),(0,t.jsx)(s.span,{className:"token punctuation",children:">"})]}),(0,t.jsx)(s.span,{className:"token plain-text",children:"Slide 1"}),(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsx)(s.span,{className:"token punctuation",children:"</"}),(0,t.jsx)(s.span,{className:"token class-name",children:"SwiperSlide"})]}),(0,t.jsx)(s.span,{className:"token punctuation",children:">"})]}),(0,t.jsx)(s.span,{className:"token plain-text",children:"\n "}),(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsx)(s.span,{className:"token punctuation",children:"<"}),(0,t.jsx)(s.span,{className:"token class-name",children:"SwiperSlide"})]}),(0,t.jsx)(s.span,{className:"token punctuation",children:">"})]}),(0,t.jsx)(s.span,{className:"token plain-text",children:"Slide 2"}),(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsx)(s.span,{className:"token punctuation",children:"</"}),(0,t.jsx)(s.span,{className:"token class-name",children:"SwiperSlide"})]}),(0,t.jsx)(s.span,{className:"token punctuation",children:">"})]}),(0,t.jsx)(s.span,{className:"token plain-text",children:"\n "}),(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsx)(s.span,{className:"token punctuation",children:"<"}),(0,t.jsx)(s.span,{className:"token class-name",children:"SwiperSlide"})]}),(0,t.jsx)(s.span,{className:"token punctuation",children:">"})]}),(0,t.jsx)(s.span,{className:"token plain-text",children:"Slide 3"}),(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsx)(s.span,{className:"token punctuation",children:"</"}),(0,t.jsx)(s.span,{className:"token class-name",children:"SwiperSlide"})]}),(0,t.jsx)(s.span,{className:"token punctuation",children:">"})]}),(0,t.jsx)(s.span,{className:"token plain-text",children:"\n "}),(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsxs)(s.span,{className:"token tag",children:[(0,t.jsx)(s.span,{className:"token punctuation",children:"</"}),(0,t.jsx)(s.span,{className:"token class-name",children:"Swiper"})]}),(0,t.jsx)(s.span,{className:"token punctuation",children:">"})]}),"\n ",(0,t.jsx)(s.span,{className:"token punctuation",children:")"}),(0,t.jsx)(s.span,{className:"token punctuation",children:";"}),"\n",(0,t.jsx)(s.span,{className:"token punctuation",children:"}"}),"\n"]})}),"\n",(0,t.jsx)(s.p,{children:"Key differences from Keen Slider:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"Component-based API instead o
1f ref-based hook"}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.code,{children:"slides.perView"})," becomes ",(0,t.jsx)(s.code,{children:"slidesPerView"})]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.code,{children:"slides.spacing"})," becomes ",(0,t.jsx)(s.code,{children:"spaceBetween"})]}),"\n",(0,t.jsx)(s.li,{children:"Navigation and pagination are included out of the box - no need to build custom UI"}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.code,{children:"useSwiper"})," and ",(0,t.jsx)(s.code,{children:"useSwiperSlide"})," hooks available for programmatic control"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,t.jsx)(s.p,{children:"Keen Slider deserves credit for its excellent touch physics and clean React hook API. If you're building a React-only project with minimal slider needs and strict bundle size requirements, it can work."}),"\n",(0,t.jsx)(s.p,{children:"But for most projects, Swiper is the stronger choice. It matches the touch quality, adds 7 transition effects, virtual slides, parallax, zoom, built-in navigation and pagination, comprehensive accessibility, and support for every major framework - not just React. The larger community, stronger maintenance track record, and enterprise adoption provide long-term confidence that a solo-maintainer project cannot match."}),"\n",(0,t.jsxs)(s.p,{children:["Try the ",(0,t.jsx)("a",{href:"/playground",children:"Swiper Playground"})," to visually configure your slider with 80+ parameters and export ready-to-use code. For a full no-code slider builder with premium effects like Panorama, Shutters, and 20+ WebGL transitions, check out ",(0,t.jsx)("a",{href:"https://studio.swiperjs.com",target:"_blank",children:"Swiper Studio"}),". And for even more stunning visual effects, explore the premium collection from ",(0,t.jsx)("a",{href:"https://uiinitiative.com",target:"_blank",children:"UI Initiative"}),"."]}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)("a",{href:"/get-started",children:"Get started with Swiper"}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)("a",{href:"/demos",children:"View demos"}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)("a",{href:"/swiper-api",children:"API Documentation"}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)("a",{href:"/playground",children:"Swiper Playground"}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)("a",{href:"https://studio.swiperjs.com",target:"_blank",children:(0,t.jsx)(s.p,{children:"Swiper Studio"})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)("a",{href:"https://uiinitiative.com",target:"_blank",children:(0,t.jsx)(s.p,{children:"Premium effects by UI Initiative"})}),"\n"]}),"\n"]})]})}function o(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return(0,t.jsx)(c,{...e,children:(0,t.jsx)(d,{...e})})}},8453:(e,s,n)=>{"use strict";n.d(s,{R:()=>l,x:()=>r});var t=n(6540);let i={},a=t.createContext(i);function l(e){let s=t.useContext(a);return t.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),t.createElement(a.Provider,{value:s},e.children)}},1086:(e,s,n)=>{"use strict";n.d(s,{A:()=>a});var t=n(4848),i=n(4164);function a(e){let{level:s,id:n,link:a=!0,children:l,number:r,className:c="",style:d={},...o}=e;return(0,t.jsxs)("h".concat(s),{className:(0,i.A)("group flex whitespace-pre-wrap",c),id:n,style:{...d},...o,children:[a&&(0,t.jsx)("a",{href:"#".concat(n),className:"after:hash absolute opacity-0 group-hover:opacity-100",style:{marginLeft:"-1em",paddingRight:"0.5em",color:"#a1a1aa",textDecoration:"none"},"aria-label":"Anchor"}),(0,t.jsx)("span",{children:l})]})}a.h1=e=>(0,t.jsx)(a,{level:1,...e}),a.h2=e=>(0,t.jsx)(a,{level:2,...e}),a.h3=e=>(0,t.jsx)(a,{level:3,...e}),a.h4=e=>(0,t.jsx)(a,{level:4,...e})},8877:(e,s,n)=>{"use strict";n.d(s,{p:()=>g});var t=n(4848),i=n(6540),a=n(6715),l=n(1106),r=n(3368),c=n(4164);let d=e=>{let[s,n]=(0,i.useState)(e),t=(0,i.useRef)([]),a=(0,i.useRef)(0),l=()=>{let e=document.querySelectorAll(".prose h2[id], .prose h3[id]");for(let s=0;s<e.length;s+=1){let n=e[s];t.current.push({el:n,id:n.id})}},r=()=>{let e=window.scrollY;a.current=window.innerHeight,t.current.forEach(s=>{let n=s.el.getBoundingClientRect();s.offset=e+n.top})},c=()=>{let e=t.current[0],s=window.scrollY,i=t.current.filter(e=>{let{offset:n}=e;return n>=s})[0];t.current.forEach(n=>{s+a.current/2>n.offset&&(e=n)}),t.current.indexOf(i)<t.current.indexOf(e)&&(e=i),e&&e.id&&n(e.id)},d=()=>{c()},o=()=>{r(),c()},h=()=>{window.addEventListener("scroll",d),window.addEventListener("resize",o)},p=()=>{window.removeEventListener("scroll",d),window.removeEventListener("resize",o)};return(0,i.useEffect)(()=>(l(),r(),c(),h(),()=>p()),[]),s};function o(e){let{tableOfContents:s,onClick:n}=e,a=d(s[0].slug);return(0,t.jsx)("ul",{className:"table-of-contents overflow-x-hidden shrink-0",onClick:n,children:s.map(e=>{let s=a===e.slug,n=e.children.findIndex(e=>{let{slug:s}=e;return s===a})>-1;return(0,t.jsxs)(i.Fragment,{children:[(0,t.jsx)("li",{className:"my-1",children:(0,t.jsx)("a",{href:"#".concat(e.slug),className:(0,
1c.A)("block rounded-full py-1.5 !text-on-surface-darker !no-underline",{"hover:!text-on-surface-dark":!s,"!text-primary":n,"!text-primary":s}),children:e.title})}),e.children.map(e=>{let s=a===e.slug;return(0,t.jsx)("li",{className:"ml-2",children:(0,t.jsx)("a",{href:"#".concat(e.slug),className:(0,c.A)("block rounded-full px-3 py-1 !text-on-surface-darker !no-underline",{"hover:!text-on-surface-dark":!s,"!text-primary":s}),children:e.title})},e.slug)})]},e.slug)})})}var h=n(6033);let p=[...n(1061),...h],x=e=>e.startsWith("http")?e:"/images/sponsors/".concat(e);function j(){return window.__NO_SPONSORS__?null:(0,t.jsxs)("div",{className:"mb-4","data-sponsors":"",children:[(0,t.jsxs)("div",{className:"mb-2 flex items-center justify-between",children:[(0,t.jsx)("span",{children:"Sponsors"}),(0,t.jsx)("a",{href:"https://sponsors.nolimits4web.com",target:"_blank",className:"text-xs text-primary no-underline",children:"Become a sponsor"})]}),(0,t.jsx)("div",{className:"flex flex-wrap gap-1",children:p.filter(e=>{let{plan:s,active:n}=e;return"Sponsor"!==s&&n}).map((e,s)=>{let{link:n,title:i,image:a}=e;return(0,t.jsx)("a",{className:"flex items-center justify-center hover:opacity-80 bg-white",href:n,title:i+s,rel:"sponsored",target:"_blank",children:a&&(0,t.jsx)("img",{className:"h-7 w-7 object-contain lg:h-8 lg:w-8",alt:i,loading:"lazy",src:x(a)})},i)})})]})}let u=i.useLayoutEffect;var m=n(8578),k=n(1325),N=n(1773);function g(e){let{children:s,meta:n={},pageTitle:c="",beforePageTitle:d="",afterPageTitle:h=""}=e,p=(0,a.useRouter)(),x=(0,i.useRef)(null),[g,f]=(0,i.useState)([]),[w,b]=(0,i.useState)(!1);return u(()=>{let e;let s=[];return x.current.querySelectorAll("h2, h3").forEach(n=>{let t=n.getAttribute("id"),i=n.textContent.trim();e="h3"===n.nodeName.toLowerCase();let a={slug:t,title:i,children:[]};if(e){let e=Math.max(s.length-1,0);s[e]||(s[e]={children:[]}),s[e].children.push(a)}else s.push(a)}),f(s),()=>{}},[]),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(N.s,{withSidebar:!0}),(0,t.jsxs)("div",{id:n.containerId,className:"mx-auto flex w-full justify-between px-4 sm:px-6 md:px-8 relative",children:[n&&(0,t.jsxs)(r,{children:[(0,t.jsx)("title",{children:n.title},"title"),(0,t.jsx)("meta",{property:"og:title",content:n.title}),(0,t.jsx)("meta",{name:"twitter:title",content:n.title}),n.description&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("meta",{name:"description",content:n.description},"description"),(0,t.jsx)("meta",{property:"og:description",content:n.description},"og:description"),(0,t.jsx)("meta",{name:"twitter:description",content:n.description},"twitter:description")]})]}),(0,t.jsx)(m.$,{className:"!fixed bottom-4 right-4 z-40 lg:hidden bg-surface-1 border border-outline backdrop-blur-lg w-16 h-16",onClick:()=>b(!0),children:(0,t.jsx)("svg",{className:"h-6 w-6",xmlns:"http://www.w3.org/2000/svg",height:"24",viewBox:"0 -960 960 960",width:"24",fill:"currentColor",children:(0,t.jsx)("path",{d:"M120-240v-80h720v80H120Zm0-200v-80h720v80H120Zm0-200v-80h720v80H120Z"})})}),(0,t.jsx)("div",{className:"fixed right-0 top-0 z-50 h-full w-full bg-black/40 lg:z-40 lg:!hidden ".concat(w?"block":"hidden"),onClick:()=>b(!1)}),(0,t.jsx)("div",{className:"fixed left-2 top-2 bottom-2 z-50 mr-10 h-[calc(100vh-16px)] w-64 flex-none text-sm lg:relative lg:z-40 lg:left-0 lg:-top-34 lg:!block lg:h-auto lg:rounded-none ".concat(w?"block":"hidden"),children:(0,t.jsxs)("div",{className:"h-full overflow-y-auto overscroll-contain p-4 lg:sticky lg:top-4 bg-surface-1 border rounded-3xl border-outline backdrop-blur-2xl flex flex-col lg:h-[calc(100vh-32px)]",children:[(0,t.jsx)(j,{}),g.length>0&&(0,t.jsx)(o,{onClick:e=>{e.target&&e.target.closest("a")&&b(!1)},tableOfContents:g})]})}),(0,t.jsxs)("div",{className:"dark:prose-dark prose mx-auto min-w-0 max-w-none flex-auto pb-8 pt-10 2xl:max-w-[940px]",ref:x,children:[d,(c||n.title)&&(0,t.jsx)("h1",{children:c||n.title}),h,s,(0,t.jsx)("div",{className:"mt-4 border-t border-outline pt-4 text-right text-sm",children:(0,t.jsx)(l,{href:"https://github.com/nolimits4web/swiper-website/edit/master/src/pages".concat(p.pathname,".mdx"),children:"Edit this page on GitHub"})})]}),(0,t.jsx)("div",{className:"hidden h-px w-[calc(256px+40px)] shrink-0 2xl:block"})]}),(0,t.jsx)(k.A,{})]})}}},e=>{var s=s=>e(e.s=s);e.O(0,[950,636,593,792],()=>s(1731)),_N_E=e.O()}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.