Mantine Extensions Newsletter
🎉 April 18 – April 29, 2026
Hey there, Mantine enthusiasts! 👋
Twelve days, four meaty minor releases — no breaking changes anywhere — and a clear theme running through them: more polish, better defaults, richer interactions. Mantine Scene gets three brand-new sub-scenes plus a viewport-aware lazy mode, Picker gains uncontrolled mode and haptics, Rings Progress lets you click rings and paint them with gradients, and Window irons out the long-standing z-index escalation problem. Let’s dive in.
🚀 Featured Releases
🌌 Mantine Scene v2.1.0 — Three new sub-scenes, true zero-re-render lazy mode
The biggest mantine-scene release since 2.0. Three brand-new compound sub-scenes, two new top-level props on Scene, and a full migration of responsive dimension props to Mantine’s native StyleProp + InlineStyles pattern.
What’s new:
Scene.Rain— angled rain streaks with a fully tunable splash effect at the bottom edge. ConfiguresplashSize,splashOpacity,splashThickness, andsplashCountfor everything from gentle drizzle to a full storm. Pair it withScene.Glowfor an instant lightning-flash effect.Scene.Confetti— multi-color celebration effect with three shapes ('rectangle','circle','triangle'), a continuous loop and a one-shotburstmode withonComplete. The neworigin="bottom"flips it into a confetti cannon: pieces shoot upward in a parabolic arc, peak atrisepixels, then fall back down.Scene.Waves— multi-layer parallax SVG waves panning horizontally. Per-layer paths are generated deterministically via a PRNG seed and tile seamlessly under atranslateX(-50%)CSS animation. Choosedirection('left'/'right'),parallaxintensity (negative values invert the depth for a dreamy feel),position('top'/'bottom'), and either a single Mantine color (shades derived automatically) or an explicit color palette.lazymode — setlazyon the rootSceneand the component pauses every child animation and the internal mouse-tracking rAF loop when it scrolls off-screen, automatically resuming when it comes back. Implementation usesIntersectionObserverand toggles a CSS attribute directly on the DOM — zero React re-renders on viewport enter/leave.onMousePositioncallback — pipe the smoothed cursor coordinates (0–100% of the container) out to external UI. Handy for syncing toasts, custom cursors, or any element that should track the same eased-out position the scene uses internally.
Performance:
- All responsive dimension props (Glow
size/blur, DotGridspacing) now resolve at the CSS layer viaInlineStyles+@mediaqueries — same pattern Mantine core uses forSimpleGrid. Zero React re-renders on resize for CSS-derivable values. - Defensive clamping on
count,splashCount, andspeedacross Rain and Confetti — pathological inputs no longer throw or produce invalid CSS animations.
Note: the legacy ResponsiveValue<T> type is now a deprecated alias for StyleProp<T> from @mantine/core. Existing imports keep working.
📦 npm · 📖 Docs · ⚡ Don’t miss the fullscreen playground at /fullscreen — twelve sub-scenes, all toggleable in real time.
🎯 Mantine Picker v3.1.0 — Uncontrolled mode, scroll lifecycle, haptics
Three additive features that close gaps in Picker’s API and bring it closer to the rest of the Mantine input family.
What’s new:
defaultValuefor uncontrolled mode — the picker can now manage its own selection state. PassdefaultValueand skip theuseStateplumbing;onChangestill fires if you provide it. Built on top of Mantine’suseUncontrolled, sovaluewins when both are provided. The “Uncontrolled” docs section was removed entirely (uncontrolled is the implicit default, mirroring Mantine’s own component docs).onScrollStart/onScrollEndlifecycle callbacks — fire on the boundaries of any scroll interaction (drag, momentum, mouse wheel, keyboard, programmatic animation). The four internal scroll states are unioned into a singleisScrollingboolean so a continuous interaction (e.g. drag → momentum) only fires the pair once. Useful for analytics, coordinating multiple pickers, or gating other inputs while the wheel is spinning.hapticFeedbackprop — trigger a shortnavigator.vibrate()pulse on supported devices whenever the selection changes. Passtruefor a 15 ms default or a number to set a custom duration. Silent no-op on desktop and unsupported devices.- Three new docs examples — Slot Machine reworked with proper scoring, plus Color Palette and Alarm pickers.
Bug fixes:
- Stale closures in the loop-change and value-change effects (#23, #24) — both now read the latest value via refs, so toggling
loopor changingvaluemid-interaction works reliably. selectedIndexfalls back to a real item when the supplied value is missing fromdata(instead of resolving to-1and clamping out of bounds).
🎯 Mantine Rings Progress v4.1.0 — Gradients, clickable rings, smooth value transitions
A focused minor release that turns rings into interactive surfaces and gives them a visual upgrade.
What’s new:
- Per-ring linear gradient strokes — each ring accepts a
gradient: { from, to, deg }prop that paints its stroke with a two-stop gradient instead of a solid color.degfollows CSS conventions (0°= bottom→top,90°= left→right). MultipleRingsProgresson the same page get unique gradient IDs so they never collide. - Per-ring
onClickandonHovercallbacks — make any ring keyboard-focusable and clickable. WhenonClickis set the ring becomes arole="button",Enter/Spaceactivates it, and the cursor switches to pointer. Hit-testing is geometric (radial distance from the center matched against each ring’s stroke band) so a click on the outer ring’s curve always hits the right callback, even though SVG wrappers overlap. animateValueChangesfor smooth transitions — by defaultanimateonly controls the entrance; after mount, value changes snap. The new prop keeps the transition active so every value update interpolates smoothly. Perfect for live dashboards or “Apply changes” flows. Respectsprefers-reduced-motion.- Per-ring value labels at the arc endpoint —
showValuesrenders a soft pill with the ring’s value at the end of its arc, computed from value, thickness,startAngle, anddirection. Customize per-ring viaformatValueand toggle individually withshowValue. NewvalueLabelStyles API selector for full styling control.
Bug fixes:
- Animation, pulse-on-completion, and
onRingCompleteeffects no longer re-trigger on every parent re-render — they now mirrorringsinto a ref and key onringCount+ a stringifiedringValuesKeyinstead of the array reference. - Hit-test bands realigned with Mantine’s actual
RingProgressgeometry — overlapping rings can no longer trigger the wrong callback.
🪟 Mantine Window v3.1.0 — Z-index escalation, solved
Two long-standing coordination problems in Window.Group are gone, and there are new knobs to make stacking behavior configurable per-group and per-window.
What’s new:
zIndexStrategyonWindow.Group— choose between'increment'(default, monotonic counter, preserves pre-3.1 behavior) and'normalize'(z-indexes derived from the current stacking order, always withininitialZIndex .. initialZIndex + N - 1).'normalize'is recommended for long-running apps and any timeWindowcoexists with MantineModal,Menu, orPopover— it makes z-index escalation impossible by construction.initialZIndexandmaxZIndex— available on bothWindow.Groupand stand-aloneWindow.initialZIndexsets the starting stacking value (defaults match the previous hardcoded200/1).maxZIndexwraps the counter back toinitialZIndexwhen reached, preventing escalation above modals and menus.stackOrderonWindowGroupContextValue— read-only snapshot of the bottom→top stacking order, available viagroupRef.current?.stackOrder. Useful for introspection, analytics, or custom UI that reflects what’s on top.- Dynamic windows support —
applyLayout(tile, columns, rows, snap, fill) now handles windows rendered dynamically via.map()over state. Previously preset buttons would silently no-op because the registry was still populating asynchronously; the group now defers and flushes the deferred layout once the registry and container measurements are ready. Live demo in the new “Dynamic Windows” docs section.
Bug fixes:
- Z-index escalation above modals and menus (#23) — fixed by
maxZIndexwrap and'normalize'strategy. - Layout presets did nothing on
.map()-rendered windows (#24) — now defer-and-flush viarequestAnimationFrameonce the registry is ready. - Stand-alone
Windowcould move backward on firstbringToFrontwheninitialZIndexwas raised — the counter now seeds up toinitialZIndexbefore incrementing.
Internal: the Window.Group registry was reworked from mutable refs with forceUpdate to reactive React state (stackOrder: string[]), so context consumers re-render reliably when stacking changes.
🔧 Across the Ecosystem
All four releases this period rolled in the same dependency refresh — Yarn 4.14.1, latest Mantine 9 minors, and aligned tooling versions. Several repos also synchronized their .oxfmtrc.json formatting config with the shared extension-template, so contributing across packages stays friction-free.
💡 Pro Tip — Pair lazy mode with onMousePosition on Mantine Scene
If you’ve been using interactive on Scene to react to the cursor, the new onMousePosition callback unlocks a clean pattern for coordinating external UI with the scene’s smoothed cursor — toasts that follow the cursor, custom hover indicators, badges that track the mouse, anything. The callback receives the same eased-out coordinates (0–100% of the container) that sub-scenes use internally, so external elements stay visually in sync with the scene’s animations.
Pair it with the new lazy mode for landing pages: scenes pause when scrolled off-screen and their mouse-tracking rAF loop is fully suspended (not just throttled), so multiple decorative scenes on the same page no longer compete for the main thread.
Thanks for reading, and as always — happy building! 🛠️
— The Mantine Extensions team, April 29, 2026