Run side effect when any dependency signal changes; returns dispose function. Read signal values inside the effect callback.
batch
(fn: () => void) => void
Group multiple signal updates into a single notification pass; supports nesting
Transitions
Built-in transition functions that compute per-slide CSS transforms during animated navigation. Pass one as the transitionTransformFn prop to the framework component.
Export
Type
Description
TransitionTransformFn
type
Signature for custom transition functions
getSlideProgress
(axisValue: number, slideIndex: number, primarySize: number) => number
Returns a normalized offset (-1 to 1) for a slide relative to the viewport. Use inside custom transition functions.
slideTransition
TransitionTransformFn
Default slide transition (translateX/Y)
fadeTransition
TransitionTransformFn
Crossfade opacity transition
flipTransition
TransitionTransformFn
3D card-flip transition
cubeTransition
TransitionTransformFn
3D cube rotation transition
zoomTransition
TransitionTransformFn
Scale/zoom transition
Content Loading
Utilities for tracking per-slide loading/error states and preloading media. The loading controller uses an index guard to reject stale callbacks from previously active slides. The preloader uses an LRU cache (default 200 loaded, 100 errored) so revisiting a broken URL shows the error instantly without retry.
Observes video loading state (playing, canplaythrough, waiting). Returns a disposer.
ContentLoadingController
Export
Type
Description
isLoading
Signal<boolean>
Whether the active slide is loading
isError
Signal<boolean>
Whether the active slide has errored
setActiveIndex
(index: number) => void
Update active index, resets loading/error state
onReady
(index: number) => void
Mark slide as ready (ignored if index doesn't match active)
onWaiting
(index: number) => void
Mark slide as loading (ignored if index doesn't match active)
onError
(index: number) => void
Mark slide as errored (ignored if index doesn't match active)
ContentPreloader
Export
Type
Description
preload
(src: string, type?: "image" | "video") => void
Start preloading a media URL
isLoaded
(src: string) => boolean
Check if URL is in the loaded LRU cache (max 200)
isErrored
(src: string) => boolean
Check if URL is in the error LRU cache (max 100)
markLoaded
(src: string) => void
Manually mark a URL as loaded
markErrored
(src: string) => void
Manually mark a URL as errored
onLoaded
(src: string, cb: () => void) => () => void
Subscribe to load completion; returns disposer
Sound
Shared mute/unmute state for media playback. The sound controller provides a reactive muted signal that can be synced to video elements and toggled from custom controls.
Syncs the muted signal to a video element. Returns a disposer.
Timeline
Playback timeline controller for video scrubbing. Tracks duration, current time, buffered ranges, and user scrubbing state as reactive signals. A single call wires pointer and keyboard interactions onto any DOM element so it behaves as a native-feeling scrub bar, with pointer capture, live seeking, and full keyboard support (arrows, Home/End, PageUp/PageDown).
Factory returning a controller with duration, currentTime, progress, bufferedRanges, and isScrubbing signals plus attach, detach, bindInteractions, and seek methods.
A single contiguous buffered region expressed as 0–1 fractions of total duration. Emitted sorted and non-overlapping.
Fullscreen
Cross-browser fullscreen utilities with Safari vendor-prefix guards. The fullscreen signal is a lazy singleton that tracks fullscreen state reactively.
Export
Type
Description
fullscreenSignal
Signal<boolean>
Reactive signal tracking whether the document is in fullscreen mode
requestFullscreen
(element: HTMLElement) => Promise<void>
Enter fullscreen on the given element
exitFullscreen
() => Promise<void>
Exit fullscreen mode
DOM & Cleanup Utilities
Low-level helpers for DOM event management and deterministic cleanup. Used internally by all controllers and available for custom integrations.
Export
Type
Description
observeDomEvent
(target, event, handler, options?) => () => void
Adds a DOM event listener and returns a disposer that removes it
createDisposableList
() => DisposableList
Composable list for collecting disposer functions. Call dispose() to run all at once.
createBodyLock
() => BodyLock
Reference-counted body scroll lock. Multiple consumers can lock simultaneously; scroll is restored when all unlock.
sharedBodyLock
BodyLock
Module-level singleton instance. Use when multiple components across your app should share a single reference counter so nested modals/overlays interleave correctly. Framework bindings (@reelkit/react, @reelkit/vue, @reelkit/angular) use this under the hood.
Focus Management
Framework-agnostic dialog a11y primitives. The overlay packages use them to return focus to the trigger on close and trap Tab / Shift+Tab inside the overlay while it's open. SSR-safe: each helper returns a no-op disposer in non-browser environments.
Export
Type
Description
captureFocusForReturn
() => Disposer
Captures the currently focused element and returns a disposer that focuses it again. Best-effort: the disposer is a no-op if the captured element has since been removed from the DOM.
createFocusTrap
(container: HTMLElement) => Disposer
Traps Tab/Shift+Tab inside container. Tab at the last focusable wraps to the first; Shift+Tab at the first wraps to the last; focus that escapes the container (click outside, programmatic focus) is pulled back. Does not move focus into the container on activation — the caller decides.
getFocusableElements
(container: HTMLElement) => HTMLElement[]
Returns every keyboard-focusable descendant in DOM order, skipping disabled, hidden, and tabindex="-1" elements.
Usage
typescript
Video Utilities
Framework-agnostic utilities for shared video playback across slides. Used internally by @reelkit/react-reel-player and @reelkit/react-lightbox, available for custom framework bindings.
Export
Type
Description
captureFrame
(video: HTMLVideoElement) => string | null
Captures the current video frame as a JPEG data URL. Returns null on cross-origin errors.
Creates a scoped shared video singleton with playback position and frame capture maps. Each consumer gets an isolated instance for iOS sound continuity.
Keeps video.style.objectFit in sync with the video's real orientation. Applies the fallback (from the declared aspect ratio) immediately, then on loadedmetadata reads actual videoWidth / videoHeight and switches to 'cover' for portrait, 'contain' for landscape. Resilient to wrong declared metadata.