[General]: v9 Release Notes #1271
Replies: 2 comments 7 replies
-
|
May I ask where the v8 docs are now? 😅 |
Beta Was this translation helpful? Give feedback.
-
|
I discovered embla-carousel in December 2025 and it's a perfect fit for the way I like to implement sliders in combination with Neos CMS. One of the most important features was the low bundle size, only delivering what is really essential to the slide functionality. Going from v8 to v9: The webpack chunk that contains the embla-carousel increases in size, from 17.9kb to 21.5kb. Now while 3.6kb does not seem much, that's a 20% increase in size. Any estimate on how much of that would be due to the new SSR support? Other than that this version contains a lot of improvements, nice to see 👍 |
Beta Was this translation helpful? Give feedback.

Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
🎠 Embla Carousel v9
Embla v9 is a major step forward. This release introduces first-class server-side rendering, a cleaner snap-centric API, a modern typed event system, and a stronger plugin and framework ecosystem.
On top of that, the entire documentation has been fully reworked to be more practical, explicit, and framework-agnostic.
The core API is considered stable, but feedback is highly encouraged before the final release. Minor adjustments may still be made based on real-world usage.
✨ If you care about predictable rendering, long-term API consistency, and composable integrations, v9 is built for you.
🚀 What’s New at a Glance
Embla v9 focuses on correctness, composability, and long-term stability.
Here’s what you get in this release:
🧱 First-class SSR support
Server-safe APIs and
ssrStyles()enable an instant, layout-stable first paint—no hydration surprises, no CLS.🧠 Typed, cancellable event model
Lowercase, consistent event names with explicit payloads and a modern cancellation mechanism.
🎯 Unified snap-centric API
Clearer method naming and intent, making carousel state and navigation easier to reason about.
🧩 Refined option model
Explicit behavior flags and improved in-view control reduce hidden behavior and configuration guesswork.
⚡ Automatic scroll performance optimization
New
scrolloptimizeevent applies hardware acceleration only when needed for smoother scrolling.♿ Improved accessibility & plugins
Brand-new Accessibility plugin, plus major improvements to Autoplay, Auto Scroll, Auto Height, and Fade.
🧬 Stronger framework ecosystem
New first-party adapters for Svelte, Solid, and Vue, alongside an improved React hook.
📚 Fully overhauled documentation
Concrete examples, clearer APIs, and framework-agnostic guides across the board.
🙏 Thanks & Supporting Embla
Huge thanks to everyone who has contributed feedback, filed issues, or built plugins — your help keeps Embla alive and rolling.
A special shoutout to Syntax FM for being Embla’s first and continuous sponsor, providing crucial support that makes releases like v9 possible. ✨
Maintaining a library like Embla can feel like juggling flaming carousels while the world burns 🔥🎠 — it’s fun, but it’s also a lot of work, especially for a solo maintainer. v9 represents months of full-time effort, and there’s still more ahead:
Sponsorship makes a tangible difference. Even a single meaningful sponsor could have brought v9 to life 6–10 months earlier.
If Embla is valuable to you or your team, consider supporting the project:
With your help, we can keep Embla moving, maintain its core features, and make future upgrades less painful.
✨ New & Improved
v9 brings major improvements across SSR, events, API design, options, plugins, and framework support. Here’s what’s new:
🖥️ First-Class Server-Side Rendering (SSR)
SSR is no longer an afterthought — it’s a core feature in v9.
ssroption: Define deterministic slide sizes for server rendering.emblaApi.ssrStyles(containerSelector, slidesSelector?): Returns critical CSS to inline during SSR, preventing layout shifts.EmblaCarousel(null, options, plugins)works without touching the DOM.Result: faster first paint, no CLS, and predictable hydration across frameworks.
Read more here.
🧠 Typed & Cancellable Event Model
The event system has been redesigned for clarity, safety, and extensibility.
detailpayloads.falsecancels internal event logic.createEvent(type, detail)lets you define custom events with.emit()— ideal for plugins.Read more here.
🎯 Snap-Centric API
The API is now snap-first, making it easier to reason about navigation and state.
Navigation Methods:
goTo(index, instant?, direction?)goToNext(instant?)goToPrev(instant?)State Methods:
selectedSnap()previousSnap()Capabilities:
canGoToNext()canGoToPrev()Snap Data:
snapList()(progress values)snapIndex(offset)Read more here.
⚙️ Options: Clearer, Explicit, More Composable
The option model has been refined to reduce hidden behavior and make intent clear:
New Options:
startSnap(replacesstartIndex)inViewMargin(works withinViewThreshold)Explicit Behavior Toggles:
draggable🖐️resize📏focus🎯slideChanges🔄ssr🖥️Refined:
inViewThresholdnow supports fine-grained thresholds withinViewMargin.Renamed Options:
watchDrag→draggablewatchResize→resizewatchFocus→focuswatchSlides→slideChangesRead more here.
🧩 Plugins
♿ Accessibility (New)
A turnkey accessibility layer for Embla:
Read more here.
⏯️ Autoplay
pause()APIautoplay:play,autoplay:stop,autoplay:interaction,autoplay:select,autoplay:timerset,autoplay:timerstoppedRead more here.
🌀 Auto Scroll
autoscroll:play,autoscroll:stop,autoscroll:interactionautoscroll:interactionRead more here.
📏 Auto Height
selectorslidesinview)Read more here.
🌫️ Fade
fade.ssrStyles(...)Read more here.
🛠️ Framework Adapters
All framework adapters in
v9now expose both client and server APIs, making SSR integration seamless.⚛️ React
useEmblaCarousel()returns[emblaRef, clientApi, serverApi]🟩 Svelte (new)
Action or direct API; returns server API when no node is provided
🟦 Solid (new)
[emblaRef, clientApi, serverApi]🟪 Vue (new)
[emblaRef, clientApiRef, serverApi]Read more here.
📚 Documentation Improvements
The documentation has been fully rewritten to be more action-oriented, explicit, and developer-friendly.
Every API entry now includes:
event.detailpayloadsAdditional updates:
Read more here.
v9 introduces renamed methods, options, and events for a clearer, snap-centric API. Here’s what you need to know:
🔄 Method Renames
scrollNext→goToNextscrollPrev→goToPrevcanScrollNext→canGoToNextcanScrollPrev→canGoToPrevscrollTo(index, jump?)→goTo(index, instant?, direction?)selectedScrollSnap()→selectedSnap()previousScrollSnap()→previousSnap()scrollSnapList()→snapList()⚙️ Option Renames
startIndex→startSnapwatchDrag→draggable🖐️watchResize→resize📏watchFocus→focus🎯watchSlides→slideChanges🔄🧠 Event Changes
Common mappings:
pointerDown→pointerdownpointerUp→pointerupslidesChanged→slideschangedslidesInView→slidesinviewreInit→reinitslideFocus→slidefocusNew cancellable event:
scrolloptimize— automatically manages hardware acceleration for slides entering/leaving view ⚡⚡ Quick Migration Examples
Methods:
Events:
See the full migration guide here: #1080.
🐛 Issues Addressed
This release includes fixes and improvements for the following issues:
Thanks to everyone who reported, tested, and contributed fixes! 🙏
Beta Was this translation helpful? Give feedback.
All reactions