React-API-Referenz
Vollständige Referenz für die Komponenten, Props und Methoden von @reelkit/react.
Props von Reel
ReelProps
| Prop | Typ | Standard | Beschreibung |
|---|---|---|---|
count | number | Pflicht | Gesamtzahl der Einträge |
size | [number, number] | - | Breite und Höhe als [width, height]. Fehlt es, wird die Größe per ResizeObserver gemessen |
itemBuilder | (index, indexInRange, size) => ReactElement | Pflicht | Funktion, die jeden Slide rendert |
direction | 'vertical' | 'horizontal' | 'vertical' | Richtung des Scrollens |
initialIndex | number | 0 | Index zum Start |
loop | boolean | false | Schaltet die Endlosschleife ein |
enableWheel | boolean | false | Schaltet die Navigation mit dem Mausrad ein |
wheelDebounceMs | number | 200 | Debounce für Mausrad-Events in ms |
enableNavKeys | boolean | true | Schaltet die Tastaturnavigation ein |
onNavKeyPress | (increment: -1 | 1) => void | - | Eigener Handler für die Navigation mit den Pfeiltasten. Ersetzt das Standardverhalten von prev/next. |
transition | TransitionTransformFn | slideTransition | Funktion für den Übergangseffekt. Eingebaut: slideTransition, fadeTransition, flipTransition, cubeTransition, zoomTransition |
transitionDuration | number | 300 | Dauer der Animation in ms |
enableGestures | boolean | true | Schaltet die Navigation durch Ziehen mit Touch oder Maus ein |
swipeDistanceFactor | number | 0.12 | Schwelle für das Wischen (0-1) |
rangeExtractor | (index: number, count: number) => number[] | defaultRangeExtractor | Eigene Funktion, die festlegt, welche Indizes gerendert werden |
keyExtractor | (index: number) => string | - | Eigene Key-Funktion für den Abgleich von React (nützlich mit loop) |
apiRef | RefObject<ReelApi> | - | Ref für den Zugriff auf die API-Methoden |
className | string | - | CSS-Klasse für das Container-Element |
style | CSSProperties | - | Inline-Styles für das Container-Element |
ariaLabel | string | - | Zugängliche Beschriftung der Karussell-Region, die Screenreader vorlesen |
Callbacks
| Prop | Typ | Beschreibung |
|---|---|---|
afterChange | (index, indexInRange) => void | Wird aufgerufen, nachdem der Slide-Wechsel abgeschlossen ist |
beforeChange | (index, nextIndex, indexInRange) => void | Wird aufgerufen, bevor der Slide-Wechsel beginnt |
onSlideDragStart | (index) => void | Wird aufgerufen, wenn die Ziehgeste beginnt |
onSlideDragEnd | (index) => void | Wird aufgerufen, wenn die Ziehgeste endet |
onSlideDragCanceled | (index) => void | Wird aufgerufen, wenn das Ziehen abgebrochen wird |
Methoden von ReelApi
Auf die Methoden des Sliders greifst du über apiRef zu:
const apiRef = useRef<ReelApi>(null);
// Navigation
apiRef.current?.next();
apiRef.current?.prev();
apiRef.current?.goTo(5); // instant
apiRef.current?.goTo(5, true); // animated
// Lifecycle
apiRef.current?.adjust(); // recalculate positions
apiRef.current?.observe(); // start observing keyboard
apiRef.current?.unobserve(); // stop observing keyboard| Methode | Typ | Beschreibung |
|---|---|---|
next() | () => void | Geht zum nächsten Slide |
prev() | () => void | Geht zum vorherigen Slide |
goTo(index, animate?) | (number, boolean?) => Promise | Geht zu einem bestimmten Slide |
adjust() | () => void | Berechnet die Positionen der Slides neu |
observe() | () => void | Beginnt, die Tastatur zu beobachten |
unobserve() | () => void | Hört auf, die Tastatur zu beobachten |
Props von ReelIndicator
ReelIndicatorProps
| Prop | Typ | Standard | Beschreibung |
|---|---|---|---|
count | number | auto | Gesamtzahl der Einträge. Wird vom umgebenden Reel automatisch übernommen, wenn der Indikator darin liegt; allein verwendet übergibst du ihn selbst |
active | number | auto | Aktuell aktiver Index. Wird vom umgebenden Reel automatisch übernommen, wenn der Indikator darin liegt; allein verwendet übergibst du ihn selbst |
direction | 'vertical' | 'horizontal' | 'vertical' | Ausrichtung des Indikators |
radius | number | 3 | Größe der Punkte in Pixeln |
visible | number | 5 | Höchstzahl sichtbarer Punkte in normaler Größe |
gap | number | 4 | Abstand zwischen den Punkten in Pixeln |
activeColor | string | '#fff' | Farbe des aktiven Punkts |
inactiveColor | string | 'rgba(255,255,255,0.5)' | Farbe der inaktiven Punkte |
edgeScale | number | 0.5 | Skalierung der Punkte am überlaufenden Rand |
onDotClick | (index: number) => void | - | Callback, wenn ein Punkt angeklickt wird |
className | string | - | Eigene CSS-Klasse |
style | CSSProperties | - | Eigene Inline-Styles |
Observer-Komponenten
Observe
Verbindet die Signals aus dem Core mit dem Rendern in React, ohne das Elternelement neu zu rendern. Nur die Funktion in children läuft erneut, wenn sich abonnierte Signals ändern.
import { Observe } from '@reelkit/react';
<Observe signals={[controller.state.index]}>
{() => <span>Current: {controller.state.index.value}</span>}
</Observe>| Prop | Typ | Standard | Beschreibung |
|---|---|---|---|
signals | Subscribable[] | required | Signals, die abonniert werden. Meldet sich eines davon, läuft die Funktion in children erneut – und nur diese, nie das Elternelement. Ein anderes Signal bei einem späteren Render wird an Stelle des ersetzten verfolgt. |
children | () => ReactElement | null | required | Render-Funktion, die bei jeder Änderung erneut läuft. Lies die Werte der Signals darin; ein außerhalb gelesener Wert wird einmal festgehalten und veraltet. |
AnimatedObserve
Abonniert Signals mit animierten Werten und interpoliert sie weich per requestAnimationFrame.
import { AnimatedObserve } from '@reelkit/react';
<AnimatedObserve signal={controller.state.axisValue}>
{(value) => (
<div style={{ transform: `translateY(${value}px)` }} />
)}
</AnimatedObserve>| Prop | Typ | Standard | Beschreibung |
|---|---|---|---|
signal | Signal<AnimatedValue> | required | Signal, das { value, duration, done? } ausgibt. Eine Dauer über 0 interpoliert vom aktuellen Wert zum neuen; bei 0 springt der Wert direkt dorthin. |
children | (value: number) => ReactElement | required | Render-Funktion, die den interpolierten Wert für den aktuellen Frame bekommt. Er wird synchron übernommen, damit das DOM mit der Animation Schritt hält. |
SwipeToClose
<SwipeToClose> legt seine Kinder in einen Container, der einem vertikalen Wischen folgt und onClose aufruft, sobald das Wischen die Schwelle überschreitet — die Geste zum Schließen der Lightbox und des Stories Player, für ein eigenes Overlay. SwipeToCloseProps typisiert seine Props; SwipeToCloseDirection ist 'up' | 'down'.
| Prop | Typ | Standard | Beschreibung |
|---|---|---|---|
direction | SwipeToCloseDirection | Pflicht | 'up' schließt wie die Lightbox, 'down' wie der Stories Player |
onClose | () => void | Pflicht | Wird aufgerufen, nachdem das Wischen die Schwelle überschritten hat und die Animation zum Schließen endet |
enabled | boolean | true | Schaltet die Geste ab, ohne auszuhängen |
threshold | number | 0.2 | Anteil der Höhe des Viewports, den das Wischen zurücklegen muss |
className | string | — | Klasse am äußeren <div> |
children | ReactNode | Pflicht | Inhalt, der sich mit dem Wischen bewegt |
SoundProvider
<SoundProvider> erstellt einen SoundController, anfangs stumm, und reicht ihn über useSoundState an seine Kinder weiter. Die Overlays rendern selbst einen; füge deinen eigenen nur um einen eigenen Player hinzu, dessen Bedienelemente sich eine Stummschaltung teilen.
Hooks
useBodyLock
Sperrt das Scrollen des Body und gleicht die Verschiebung durch die Breite der Scrollbar aus.
import { useBodyLock } from '@reelkit/react';
// Lock body scroll when overlay is open
useBodyLock(isOpen);useOverlayUrlState
OverlayUrlStateOptions
Baut einen URL-State-Controller für ein Overlay, den du einem *UrlOverlay als Prop controller übergibst.
Eine Schritt-für-Schritt-Erklärung und Beispiele findest du unter URL-State im React-Leitfaden.
| Option | Typ | Standard | Beschreibung |
|---|---|---|---|
param | string | Pflicht | Query-Parameter, der den aktiven Slide trägt, zum Beispiel "photo". Wird beim ersten Render gelesen und bleibt für die Lebensdauer der Komponente fest – zum Ändern neu mounten (gib ihr einen key). |
adapter | UrlAdapter | History API | Navigationssystem, über das gelesen und geschrieben wird. Übergib in einer App mit Router einen Adapter auf Basis des Routers, damit die Location des Routers nicht veraltet. Wird beim ersten Render gelesen und bleibt für die Lebensdauer der Komponente fest – zum Ändern neu mounten. |
codec | { decode(raw) => Id | null; encode(id) => string } | Pflicht | Format in der URL: Text des Parameters ↔ eine stabile Identität, unabhängig von der Sammlung. Reist mit locator als zusammengehöriges Paar mit demselben Id – spreize ...urlIndexKey(() => images.length) für die Standardgalerie mit Index ?photo=3, oder bring einen eigenen mit (base64, slug), damit ein Lesezeichen das Umsortieren der Galerie übersteht. Wird live gelesen: Der codec des letzten Renders übernimmt das nächste Decodieren oder Encodieren. |
locator | { locate(id) => number | null; locateAsync?(id) => Promise<number | null>; identify(index) => id } | Pflicht | Bildet die Identität auf eine Position ab und prüft ihre Gültigkeit selbst: locate (synchron), locateAsync (asynchroner Fallback für eine Galerie mit Paginierung), identify (Schreiben). Für eine einfache Galerie mit Index spreizt du ...urlIndexKey(() => images.length) – es liefert diesen locator plus den passenden codec und begrenzt ?photo=3 mit der aktuellen Anzahl, sodass ein veraltetes ?photo=99 von selbst aus der URL verschwindet, statt einen Slide zu öffnen, den nie jemand gemeint hat. Ein Feed mit Paginierung oder eine Galerie mit Schlüsseln nach Identität bringt stattdessen ein eigenes passendes Paar aus codec + locator mit. Wird live gelesen: Der locator des letzten Renders beantwortet die nächste Suche, und wird locateAsync zwischen zwei Renders hinzugefügt oder entfernt, wirkt das beim nächsten Fehlschlag. |
useReactRouterUrlAdapter
Ein UrlAdapter auf Basis von React Router. Übergib ihn in einer App mit Router als Option adapter an useOverlayUrlState, damit der Router die einzige Quelle der Wahrheit für die Navigation bleibt – wer am Router vorbei history.pushState schreibt, lässt seine Location veralten, und die nächste Navigation verliert den Parameter. Geschrieben wird nur die Query, Pfad und Hash bleiben also unberührt. Jede Änderung meldet, ob der Router auf derselben Seite einen Eintrag angelegt, ersetzt oder sich durch den Verlauf bewegt hat, sodass eine aus einem <Link> geöffnete Galerie mit einem Schritt zurück schließt.
Kommt aus einem eigenen Subpfad, damit eine App ohne Router nie react-router-dom in ihr Bundle zieht. react-router-dom ist eine optionale Peer-Abhängigkeit.
import { useReactRouterUrlAdapter } from '@reelkit/react/react-router-url-adapter';
const adapter = useReactRouterUrlAdapter();
const photo = useOverlayUrlState({
param: 'photo',
adapter,
...urlIndexKey(() => images.length),
});useReelContext
useReelContext() liest den ReelContextValue des nächsten übergeordneten <Reel> oder gibt außerhalb davon null zurück. <ReelIndicator> verbindet sich darüber selbst; nutze es in deinen eigenen Bedienelementen, die du als Kinder von <Reel> renderst, damit sie dem Slider ohne Props folgen. ReelContext ist das Context-Objekt dahinter — stelle nur in einem Test oder einem eigenen Wrapper einen eigenen Wert bereit.
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
index | Signal<number> | Index des aktiven Slides; lies .value innerhalb von Observe |
count | Signal<number> | Gesamtzahl der Slides |
goTo | (index: number, animate?: boolean) => Promise<void> | Geht zu einem Slide, animiert oder nicht |
useSoundState
useSoundState() liest den SoundController aus dem nächsten <SoundProvider> und wirft außerhalb davon einen Fehler. Der Reel Player, die Lightbox und der Stories Player legen einen Provider um ihren Inhalt, sodass eigene Bedienelemente, die du über ihre Render-Props übergibst, damit die Stummschaltung lesen oder umschalten können.
useFullscreen
useFullscreen({ ref }) steuert die Fullscreen-API für das Element in ref und beendet das Vollbild, wenn die Komponente ausgehängt wird. UseFullscreenProps ist sein Argument; UseFullscreenResult ist das Tupel, das es zurückgibt.
| Index | Typ | Beschreibung |
|---|---|---|
[0] | Signal<boolean> | Ob die Seite im Vollbild ist; lies .value innerhalb von Observe |
[1] | () => Promise<void> | Fordert das Vollbild für das Element an und verlässt vorher ein anderes Element im Vollbild |
[2] | () => Promise<void> | Beendet das Vollbild |
[3] | () => Promise<void> | Wechselt zwischen beidem |
Barrierefreiheit
<Reel> rendert als role="region" mit aria-roledescription="carousel". Setze das Prop ariaLabel, um der Region einen Namen für Screenreader zu geben. Eine höfliche Live-Region kündigt bei jedem Slide-Wechsel "Slide N von M" an, ohne das Karussell neu zu rendern. Inaktive Slides bekommen das Attribut inert, damit Fokus und Navigation von Hilfstechnologien sie überspringen.
<ReelIndicator> rendert als role="tablist" mit wanderndem tabindex auf den Punkten; die Pfeiltasten bewegen den Fokus, und Enter oder Leertaste aktivieren den Slide.
Du baust ein eigenes Modal um <Reel>? captureFocusForReturn, createFocusTrap und getFocusableElements werden aus @reelkit/react erneut exportiert, für die Rückgabe und das Einsperren des Fokus.
Hilfsfunktionen
createDefaultKeyExtractorForLoop
Erzeugt einen Key-Extractor, der doppelte Indizes behandelt, wenn loop eingeschaltet ist.
import { createDefaultKeyExtractorForLoop } from '@reelkit/react';
<Reel
count={items.length}
size={size}
loop
keyExtractor={createDefaultKeyExtractorForLoop(items.length)}
itemBuilder={...}
/>Größenerkennung
observeElementSize, getViewportSize, observeViewportSize, isMobileWidth, fitAspectRatio und isTouchDevice werden aus @reelkit/react erneut exportiert, für ein eigenes Overlay, das seine Größe so bestimmt wie die Overlays von reelkit. Siehe Größenerkennung in der Core-API.
Autoplay und Download
Auch createTimerController, createSlideshowController und downloadFile werden aus @reelkit/react erneut exportiert: der Timer hinter dem Stories Player, die Slideshow hinter autoAdvance der Lightbox und die Hilfsfunktion hinter ihrem Download-Button. Siehe Autoplay und Download in der Core-API.