ImageGallery

Galería horizontal con scroll, drag y flechas

stable v1.0.0

Preview

En uso real sangra a 100vw (rompe la columna de contenido). En desktop aquí se acota al recuadro para no taparse con la barra lateral (el scroll y las flechas son los reales); en móvil sangra a ancho completo como en producción, por eso el siguiente slide asoma.

Comportamiento

ContextoComportamiento
Móvil (≤767px)Scroll táctil, snap al inicio, slides de 90vw con peek. Flechas ocultas.
Desktop (≥768px)Drag con el ratón, flechas, altura fija de 400px.
El grupo cabe en pantallais-fit: scroll desactivado, track centrado, flechas ocultas.
Al inicio / al finalLa flecha correspondiente se oculta (is-hidden).
Carga de imagenCada imagen aparece con fade; el fit se re-mide según cargan.
Drag > 5pxSe suprime el click final: arrastrar no dispara un enlace.

Lenis (opcional, por sitio)

Lenis no es dependencia del sistema. La galería usa solo APIs de scroll nativas. El contenedor lleva data-lenis-prevent-touch: si el sitio usa Lenis, le devuelve el scroll táctil horizontal al navegador; si no lo usa, el atributo es inerte y el componente se comporta igual. Degrada limpio sin configuración.

Props

PropTipoDefault
images{ src, alt }[]n/a
labelstring'Galería de imágenes'
prevLabelstring'Imagen anterior'
nextLabelstring'Imagen siguiente'

Restricciones

  • Sangra a 100vw: rompe cualquier columna de contenido, a propósito.
  • Altura desktop fija (400px, object-fit: cover): retrato y paisaje se recortan a esa banda.
  • Asume ratio de aspecto consistente entre las imágenes de un grupo. En móvil los slides usan height: auto y el track align-items: stretch: todos igualan al más alto, así que una imagen de otro ratio deja un hueco debajo. Alimenta cada galería con imágenes del mismo ratio.
  • Scrollbar oculta por diseño; las flechas y el drag son la affordance en desktop.
  • Labels en español por defecto; otros idiomas pasan label / prevLabel / nextLabel.

Decisiones

DecisiónPor qué
Flechas SVG, no Unicode ← / →Las flechas Unicode se pintan como emoji a color en algunas plataformas: el mismo bug que LinkArrow evita. SVG con currentColor se mantiene tipográfico. Dos componentes del sistema no pueden contradecirse.
Lenis como hook inerte, no dependenciaQuitarlo rompería el scroll táctil en sitios con Lenis; exigirlo impondría una dependencia que el sistema no posee. Inerte-cuando-ausente cumple ambas.
Labels como prop, default españolEl sitio de referencia y el workbench son español; el default deja a los consumidores actuales idénticos. Otros idiomas lo sobreescriben.
Re-medir al cargar imágenesEl ancho del track depende de las imágenes; medir antes de cargar da mal resultado y un ResizeObserver no lo recupera una vez is-fit fija el ancho.
Suprimir click tras dragSin eso, arrastrar sobre una imagen enlazada navegaría al soltar. El umbral de 5px separa la intención.