Referencia de la API de React

Referencia completa de los componentes, las props y los métodos de @reelkit/react.

Props de Reel

ReelProps

PropTipoPor defectoDescripción
countnumberobligatorioNúmero total de elementos
size[number, number]-Ancho y alto como [width, height]. Si se omite, el tamaño se mide con ResizeObserver
itemBuilder(index, indexInRange, size) => ReactElementobligatorioFunción que renderiza cada slide
direction'vertical' | 'horizontal''vertical'Dirección del desplazamiento
initialIndexnumber0Índice inicial
loopbooleanfalseActiva el bucle infinito
enableWheelbooleanfalseActiva la navegación con la rueda del ratón
wheelDebounceMsnumber200Debounce de los eventos de la rueda en ms
enableNavKeysbooleantrueActiva la navegación con teclado
onNavKeyPress(increment: -1 | 1) => void-Manejador propio para la navegación con flechas. Sustituye el comportamiento por defecto de anterior y siguiente.
transitionTransitionTransformFnslideTransitionFunción del efecto de transición. Incluidas: slideTransition, fadeTransition, flipTransition, cubeTransition, zoomTransition
transitionDurationnumber300Duración de la animación en ms
enableGesturesbooleantrueActiva la navegación arrastrando con el dedo o el ratón
swipeDistanceFactornumber0.12Umbral del deslizamiento (0-1)
rangeExtractor(index: number, count: number) => number[]defaultRangeExtractorFunción propia que decide qué índices se renderizan
keyExtractor(index: number) => string-Función propia de claves para la reconciliación de React (útil con loop)
apiRefRefObject<ReelApi>-Ref para acceder a los métodos de la API
classNamestring-Clase CSS del elemento contenedor
styleCSSProperties-Estilos en línea del elemento contenedor
ariaLabelstring-Etiqueta accesible de la región del carrusel, que leen los lectores de pantalla

Callbacks

PropTipoDescripción
afterChange(index, indexInRange) => voidSe llama al terminar el cambio de slide
beforeChange(index, nextIndex, indexInRange) => voidSe llama antes de empezar el cambio de slide
onSlideDragStart(index) => voidSe llama al empezar el gesto de arrastre
onSlideDragEnd(index) => voidSe llama al terminar el gesto de arrastre
onSlideDragCanceled(index) => voidSe llama cuando se cancela el arrastre

Métodos de ReelApi

Accede a los métodos del slider a través de apiRef:

typescript
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
MétodoTipoDescripción
next()() => voidVa al slide siguiente
prev()() => voidVa al slide anterior
goTo(index, animate?)(number, boolean?) => PromiseVa a un slide concreto
adjust()() => voidRecalcula las posiciones de los slides
observe()() => voidEmpieza a observar el teclado
unobserve()() => voidDeja de observar el teclado

Props de ReelIndicator

ReelIndicatorProps

PropTipoPor defectoDescripción
countnumberautoNúmero total de elementos. Se conecta solo al Reel padre cuando está dentro de uno; pásalo explícitamente si lo usas por separado
activenumberautoÍndice activo actual. Se conecta solo al Reel padre cuando está dentro de uno; pásalo explícitamente si lo usas por separado
direction'vertical' | 'horizontal''vertical'Orientación del indicador
radiusnumber3Tamaño del punto en píxeles
visiblenumber5Máximo de puntos visibles a tamaño normal
gapnumber4Espacio entre puntos en píxeles
activeColorstring'#fff'Color del punto activo
inactiveColorstring'rgba(255,255,255,0.5)'Color de los puntos inactivos
edgeScalenumber0.5Escala de los puntos de los bordes que desbordan
onDotClick(index: number) => void-Callback al hacer clic en un punto
classNamestring-Clase CSS propia
styleCSSProperties-Estilos en línea propios

Componentes observadores

Observe

Conecta las señales del core con el renderizado de React sin re-renderizar al padre. Solo la función children se vuelve a ejecutar cuando cambian las señales a las que está suscrita.

tsx
import { Observe } from '@reelkit/react';

<Observe signals={[controller.state.index]}>
  {() => <span>Current: {controller.state.index.value}</span>}
</Observe>
PropTipoPor defectoDescripción
signalsSubscribable[]requiredSeñales a las que suscribirse. Cuando cualquiera avisa, se vuelve a ejecutar la función children, y solo esa función, nunca el padre.
children() => ReactElement | nullrequiredFunción de renderizado que se vuelve a ejecutar en cada cambio. Lee los valores de las señales dentro de ella; un valor leído fuera se captura una vez y queda desfasado.

AnimatedObserve

Se suscribe a señales de valores animados e interpola con suavidad usando requestAnimationFrame.

tsx
import { AnimatedObserve } from '@reelkit/react';

<AnimatedObserve signal={controller.state.axisValue}>
  {(value) => (
    <div style={{ transform: `translateY(${value}px)` }} />
  )}
</AnimatedObserve>
PropTipoPor defectoDescripción
signalSignal<AnimatedValue>requiredSeñal que emite { value, duration, done? }. Una duración mayor que 0 interpola del valor actual al nuevo; con 0 salta directamente.
children(value: number) => ReactElementrequiredFunción de renderizado que recibe el valor interpolado del fotograma actual y se aplica de forma síncrona para que el DOM siga el ritmo de la animación.

Hooks

useBodyLock

Bloquea el scroll del body y compensa el salto por el ancho de la barra de desplazamiento.

typescript
import { useBodyLock } from '@reelkit/react';

// Lock body scroll when overlay is open
useBodyLock(isOpen);

useOverlayUrlState

OverlayUrlStateOptions

Crea un controlador de estado en la URL para un overlay, que después pasas a un *UrlOverlay en su prop controller.

Consulta el estado en la URL en la guía de React para ver la explicación paso a paso y los ejemplos.

OpciónTipoPor defectoDescripción
paramstringobligatorioParámetro de la query que lleva el slide activo, por ejemplo "photo". Se lee en el primer renderizado y queda fijo durante la vida del componente; vuelve a montarlo (dale una key) para cambiarlo.
adapterUrlAdapterHistory APISistema de navegación con el que leer y escribir. En una aplicación con router, pasa un adaptador basado en el router para que su propia ubicación no quede desfasada. Se lee en el primer renderizado y queda fijo durante la vida del componente; vuelve a montarlo para cambiarlo.
codec{ decode(raw) => Id | null; encode(id) => string }obligatorioFormato: texto del parámetro ↔ una identidad estable, sin conocer la colección. Va con locator como un par a juego que comparte el mismo Id: usa ...urlIndexKey(() => images.length) para la galería por índice ?photo=3 por defecto, o aporta uno propio (base64, slug) para que un marcador sobreviva a que la galería se reordene. Se lee en cada uso: el codec del último renderizado gestiona el siguiente decode o encode.
locator{ locate(id) => number | null; locateAsync?(id) => Promise<number | null>; identify(index) => id }obligatorioConvierte la identidad en una posición y decide su propia validez: locate (síncrono), locateAsync (alternativa asíncrona para una galería paginada), identify (escrituras). Para una galería por índice simple usa ...urlIndexKey(() => images.length): aporta este locator más el codec a juego y limita ?photo=3 con el recuento actual, así que un ?photo=99 desfasado se limpia de la URL en lugar de abrir un slide que nunca se nombró. Un feed paginado o una galería por identidad aporta su propio par de codec + locator. Se lee en cada uso: el locator del último renderizado responde a la siguiente búsqueda, y añadir o quitar locateAsync entre renderizados surte efecto en el siguiente fallo.

useViewedState

ViewedStateOptions

Recuerda hasta dónde llegó alguien en una galería y sigue el almacenamiento mientras el componente está montado. Pasa la misma clave que usa la barra de direcciones y una entrada guardada se leerá exactamente igual que el parámetro de un enlace compartido. Lee entries con Observe para que un anillo se repinte cuando se registra una posición, aquí o en otra pestaña.

tsx
import {
  useViewedState,
  urlStableIdTwoAxisKey,
  twoAxisViewedTracking,
  Observe,
} from '@reelkit/react';
import {
  StoriesRingList,
  createStoriesViewedState,
} from '@reelkit/react-stories-player';

const key = urlStableIdTwoAxisKey({ outerItems, innerItems });
const seen = useViewedState({
  storageKey: 'stories-seen',
  ...key,
  ...twoAxisViewedTracking,
});
const viewed = createStoriesViewedState(seen, () => groups);

<Observe signals={[seen.entries]}>
  {() => (
    <StoriesRingList
      groups={groups}
      viewedState={viewed.viewedCounts()}
      onSelect={open}
    />
  )}
</Observe>;

useReactRouterUrlAdapter

Un UrlAdapter basado en React Router. Pásalo como opción adapter de useOverlayUrlState en una aplicación con router para que el router siga siendo la única fuente de verdad de la navegación: escribir con history.pushState a sus espaldas deja su ubicación desfasada y su siguiente navegación pierde el parámetro. Las escrituras solo tocan la query, así que la ruta y el hash se mantienen intactos. Cada cambio indica si el router hizo push en la misma página, sustituyó la entrada o se movió por el historial, así que una galería abierta desde un <Link> se cierra volviendo atrás una vez.

Se publica en su propia subruta, así que una aplicación sin router nunca mete react-router-dom en su bundle. react-router-dom es una peer dependency opcional.

tsx
import { useReactRouterUrlAdapter } from '@reelkit/react/react-router-url-adapter';

const adapter = useReactRouterUrlAdapter();
const photo = useOverlayUrlState({
  param: 'photo',
  adapter,
  ...urlIndexKey(() => images.length),
});

Accesibilidad

<Reel> se renderiza como role="region" con aria-roledescription="carousel". Usa la prop ariaLabel para darle a la región un nombre para los lectores de pantalla. Una región en vivo educada anuncia "Slide N of M" en cada cambio de slide sin re-renderizar el carrusel. Los slides inactivos reciben el atributo inert, así que el foco y la navegación con tecnologías de apoyo se los saltan.

<ReelIndicator> se renderiza como role="tablist" con tabindex itinerante en los puntos; las flechas mueven el foco y Intro o Espacio activan el slide.

¿Vas a crear un modal propio alrededor de <Reel>? captureFocusForReturn, createFocusTrap y getFocusableElements se reexportan desde @reelkit/react para devolver y atrapar el foco.

Utilidades

createDefaultKeyExtractorForLoop

Crea un extractor de claves que resuelve los índices duplicados cuando loop está activado.

tsx
import { createDefaultKeyExtractorForLoop } from '@reelkit/react';

<Reel
  count={items.length}
  size={size}
  loop
  keyExtractor={createDefaultKeyExtractorForLoop(items.length)}
  itemBuilder={...}
/>