composable · v0.8.0

useIntersectionObserver

Composable runes-based (Svelte 5) que envuelve IntersectionObserver y lo expone como Svelte action. Centraliza el patrón "haz algo cuando un elemento entre en viewport" que cada deck reimplementaba.

Demo · triggerOnce: false

Haz scroll en la caja: el estado vuelve a false al salir del viewport.

fuera de viewport

Haz scroll dentro de esta caja ↓

. . .
target · oculto
. . .

Demo · triggerOnce: true

Una vez que el target entra, el observer se desconecta y el estado se queda en true.

fuera de viewport

Haz scroll dentro de esta caja ↓

. . .
target · oculto
. . .

Uso

my-component.svelte
<script>
  import { useIntersectionObserver } from '@codigosinsiesta/theme';
  const observer = useIntersectionObserver({ threshold: 0.3, triggerOnce: true });
</script>

<div use:observer.target class:visible={observer.isVisible}>
  ...
</div>

El mismo observer puede aplicarse a N nodos. isVisible será true mientras cualquiera de ellos esté intersectando.

API

OptionTipoDefaultDescripción
thresholdnumber | number[]0Igual que IntersectionObserverInit.threshold.
rootMarginstring'0px'Margen alrededor del root.
rootElement | nullnullViewport ancestral.
triggerOncebooleanfalseSi true, desconecta tras la primera intersección.

Devuelve:

FieldTipoDescripción
targetSvelte actionAplícalo con use:observer.target.
isVisibleboolean (reactivo)true si algún nodo observado está intersectando.
entryIntersectionObserverEntry | nullÚltima entry registrada — útil para leer intersectionRatio.

Casos de uso

  • Decks: disparar animaciones cuando un slide se activa.
  • Sitios CsS (portfolio, landings): animar barras de skills, items de timeline, contadores de stats al hacer scroll.
  • Lazy-load: combinar con triggerOnce para cargar contenido pesado solo cuando aparece.