Angular Lightbox
Lightbox de galería de imágenes y vídeos a pantalla completa para Angular, con @reelkit/angular-lightbox.
Características
Instalación
npm install @reelkit/angular-lightbox @reelkit/angular lucide-angularIconos
Los controles por defecto usan lucide-angular para los iconos. Si prefieres otra librería de iconos, usa los slots de plantilla rkLightboxControls y rkLightboxNavigation para poner los tuyos.
Uso básico
Importa los estilos y el componente standalone RkLightboxOverlayComponent en el array imports de tu componente.
import { Component } from '@angular/core';
import {
RkLightboxOverlayComponent,
type LightboxItem,
} from '@reelkit/angular-lightbox';
import '@reelkit/angular-lightbox/styles.css';
const images: LightboxItem[] = [
{
src: '/cdn/samples/images/image-01.jpg',
title: 'Mountain River',
description: 'A beautiful mountain river',
},
{
src: '/cdn/samples/images/image-02.jpg',
title: 'Snowy Peaks',
},
{
src: '/cdn/samples/images/image-03.jpg',
title: 'Misty Forest',
description: 'Morning fog over the forest canopy',
},
{
src: '/cdn/samples/images/image-04.jpg',
title: 'Autumn Trail',
},
{
src: '/cdn/samples/images/image-05.jpg',
title: 'Ocean Cliff',
description: 'Dramatic cliffs above the Pacific',
},
{
src: '/cdn/samples/images/image-06.jpg',
title: 'Desert Dunes',
},
];
@Component({
selector: 'app-root',
standalone: true,
imports: [RkLightboxOverlayComponent],
template: `
<div style="display:grid;grid-template-columns:repeat(3,1fr);gap:8px">
@for (img of images; track img.src; let i = $index) {
<button (click)="openIndex = i" style="aspect-ratio:4/3;cursor:pointer">
<img [src]="img.src" style="width:100%;height:100%;object-fit:cover" />
</button>
}
</div>
<rk-lightbox-overlay
[isOpen]="openIndex !== null"
[items]="images"
[initialIndex]="openIndex ?? 0"
(closed)="openIndex = null"
/>
`,
})
export class AppComponent {
images = images;
openIndex: number | null = null;
}Slots de plantilla
Las directivas de slots de plantilla permiten personalizar por completo la interfaz del overlay sin tener que copiar el componente. Cada slot recibe un objeto de contexto con tipos estrictos.
| Directiva | Tipo del contexto | Descripción |
|---|---|---|
| [rkLightboxControls] | LightboxControlsContext | Sustituye la barra de controles superior (botón de cerrar, contador, botón de pantalla completa) |
| [rkLightboxNavigation] | LightboxNavContext | Sustituye las flechas de anterior y siguiente |
| [rkLightboxInfo] | LightboxInfoContext | Sustituye el overlay inferior con degradado del título y la descripción |
| [rkLightboxSlide] | LightboxSlideContext | Sustituye el contenido de cada slide (necesario para los slides de vídeo) |
| [rkLightboxLoading] | { $implicit: activeIndex, item } | Indicador de carga propio |
| [rkLightboxError] | { $implicit: activeIndex, item } | Indicador de error propio |
import {
RkLightboxOverlayComponent,
RkLightboxControlsDirective,
RkLightboxNavigationDirective,
RkLightboxInfoDirective,
RkCloseButtonComponent,
RkCounterComponent,
RkFullscreenButtonComponent,
type LightboxItem,
type LightboxControlsContext,
type LightboxNavContext,
} from '@reelkit/angular-lightbox';
@Component({
selector: 'app-root',
standalone: true,
imports: [
RkLightboxOverlayComponent,
RkLightboxControlsDirective,
RkLightboxNavigationDirective,
RkLightboxInfoDirective,
RkCloseButtonComponent,
RkCounterComponent,
RkFullscreenButtonComponent,
],
template: `
<rk-lightbox-overlay [isOpen]="isOpen" [items]="images" (closed)="isOpen = false">
<!-- Custom controls bar -->
<ng-template rkLightboxControls
let-onClose="onClose"
let-activeIndex="activeIndex"
let-count="count"
let-isFullscreen="isFullscreen"
let-onToggleFullscreen="onToggleFullscreen">
<div style="position:absolute;top:0;left:0;right:0;padding:12px;
display:flex;align-items:center;justify-content:space-between">
<rk-close-button (clicked)="onClose()" />
<rk-counter [currentIndex]="activeIndex + 1" [count]="count" />
<rk-fullscreen-button
[isFullscreen]="isFullscreen"
(toggled)="onToggleFullscreen()" />
</div>
</ng-template>
<!-- Custom navigation -->
<ng-template rkLightboxNavigation
let-onPrev="onPrev"
let-onNext="onNext"
let-activeIndex="activeIndex"
let-count="count">
<button (click)="onPrev()" [disabled]="activeIndex === 0">←</button>
<button (click)="onNext()" [disabled]="activeIndex === count - 1">→</button>
</ng-template>
<!-- Custom info overlay -->
<ng-template rkLightboxInfo let-item let-index="index">
<div style="position:absolute;bottom:0;left:0;right:0;padding:16px;
background:linear-gradient(transparent,rgba(0,0,0,0.6))">
<h3 style="color:#fff">{{ item.title }}</h3>
<p style="color:rgba(255,255,255,0.7)">{{ item.description }}</p>
</div>
</ng-template>
</rk-lightbox-overlay>
`,
})
export class AppComponent {
images: LightboxItem[] = [];
isOpen = false;
}Compatibilidad con vídeo
Los slides de vídeo se activan con el slot de plantilla rkLightboxSlide y el RkLightboxVideoSlideComponent. Así, las galerías que solo necesitan imágenes no incluyen el reproductor de vídeo en el bundle.
import {
RkLightboxOverlayComponent,
RkLightboxSlideDirective,
RkLightboxVideoSlideComponent,
type LightboxItem,
type LightboxSlideContext,
} from '@reelkit/angular-lightbox';
@Component({
selector: 'app-root',
standalone: true,
imports: [
RkLightboxOverlayComponent,
RkLightboxSlideDirective,
RkLightboxVideoSlideComponent,
],
template: `
<rk-lightbox-overlay [isOpen]="isOpen" [items]="items" (closed)="isOpen = false">
<ng-template rkLightboxSlide
let-item
let-size="size"
let-isActive="isActive">
@if (item.type === 'video') {
<rk-lightbox-video-slide
[item]="item"
[size]="size"
[isActive]="isActive"
/>
} @else {
<img [src]="item.src"
[style.width.px]="size[0]"
[style.height.px]="size[1]"
style="object-fit:contain" />
}
</ng-template>
</rk-lightbox-overlay>
`,
})
export class AppComponent {
isOpen = false;
items: LightboxItem[] = [
{ src: '/photo.jpg', title: 'Photo' },
{ src: '/clip.mp4', type: 'video', poster: '/clip-thumb.jpg', title: 'Video' },
];
}Pantalla completa
Usa fullscreenSignal, requestFullscreen y exitFullscreen de @reelkit/angular para observar o cambiar el estado de pantalla completa.
import { fullscreenSignal, requestFullscreen, exitFullscreen } from '@reelkit/angular';
@Component({ ... })
export class AppComponent {
readonly isFullscreen = fullscreenSignal();
toggle(container: HTMLElement): void {
if (this.isFullscreen()) {
exitFullscreen();
} else {
requestFullscreen(container);
}
}
}Estado en la URL
Ver la demo en vivo →RkLightboxUrlOverlayComponent es un componente aparte cuyo estado abierto vive en la barra de direcciones. Crea un controlador con createOverlayUrlState y pásalo como [controller]: la galería se abre sola cuando el parámetro nombra un slide y se cierra cuando desaparece. Los enlaces se pueden compartir y el botón de volver cierra la galería en lugar de salir de la página.
Claves incluidas
Puedes apuntar a los slides con una clave incluida: pasa con spread urlIndexKey (por posición) o urlStableIdKey (por un id estable) al controlador; las dos se reexportan desde @reelkit/angular. Consulta la guía del estado en la URL y la API del core.
import { RkLightboxUrlOverlayComponent } from '@reelkit/angular-lightbox';
import { createOverlayUrlState, urlIndexKey, urlStableIdKey } from '@reelkit/angular';
@Component({
imports: [RkLightboxUrlOverlayComponent, RouterLink],
template: `
@for (image of images(); track image.src; let i = $index) {
<a [routerLink]="[]" [queryParams]="{ photo: i }">
<img [src]="image.src" alt="" />
</a>
}
<rk-lightbox-url-overlay [controller]="photo" [items]="images()" />
`,
})
export class GalleryComponent {
protected readonly images = signal(photos);
protected readonly photo = createOverlayUrlState({
param: 'photo',
...urlIndexKey(() => this.images().length),
});
}Llámalo en un contexto de inyección, como el inicializador de un campo o el constructor. Se conecta al momento y se libera con DestroyRef, así que un componente destruido con la galería abierta no deja ningún listener detrás. Todas las opciones están en la referencia de la API de Angular.
- Abrir añade una entrada al historial. Pasar slides la sustituye, así que N pasos no añaden entradas y volver una vez siempre sale de la galería.
- Volver solo cierra cuando la galería se abrió desde dentro de la aplicación, es decir, cuando el enlace añadió una entrada. Un enlace compartido abierto directamente en una pestaña nueva no tiene historial detrás, así que el botón de volver del navegador sale del sitio; el botón ✕ o Escape quitan el parámetro en el sitio y se quedan.
- Un parámetro que no nombra ningún slide (un marcador desfasado, un valor editado a mano) se quita de la URL en lugar de dejarlo apuntando a un slide que no se puede abrir.
- Los slots de plantilla funcionan igual: el componente de URL hace él mismo las seis consultas de slots y pasa cada plantilla a la galería, así que
rkLightboxControlsy los demás van dentro de él exactamente como irían dentro derk-lightbox-overlay. - En una aplicación con router, pasa un adaptador basado en
Router. Escribir en el historial a espaldas del Router deja su ubicación desfasada y su siguiente navegación pierde el parámetro.
En una aplicación con router, pasa un adaptador. Escribir en el historial a espaldas del Router deja su ubicación desfasada y su siguiente navegación pierde el parámetro, así que crea un adaptador basado en Router y pásalo como adapter:
import { createRouterUrlAdapter } from '@reelkit/angular/ng-router-url-adapter';
const adapter = createRouterUrlAdapter();
const photo = createOverlayUrlState({
param: 'photo',
adapter,
...urlIndexKey(() => this.images().length),
});Enlaces estables. El índice es posicional: un ?photo=3 guardado abre otra imagen en cuanto la lista se reordena. urlStableIdKey usa como clave el id estable de cada elemento y recorre la lista actual; una sola llamada cubre el caso habitual.
const photo = createOverlayUrlState({
param: 'photo',
...urlStableIdKey({ items: () => this.images() }),
});Pasa hashCodec: base64UrlCodec para codificar el id en base64url en la URL: es una ofuscación reversible, no un hash criptográfico.
Si usas otro campo como clave (un slug) o paginas un feed infinito con locateAsync, crea tú el codec (el formato) y el locator (la búsqueda):
const photo = createOverlayUrlState({
param: 'photo',
codec: { decode: (raw) => raw, encode: (id) => id },
locator: {
locate: (id) => this.images().findIndex((x) => x.id === id),
identify: (index) => this.images()[index].id,
},
});Galerías infinitas o paginadas. locate es síncrono, así que solo responde por las imágenes ya cargadas: un enlace compartido a la imagen 400 de un feed que ha cargado 20 no encuentra nada. locateAsync es la alternativa y solo se llama cuando locate falla: carga las páginas que necesites y devuelve el índice que resulte tener la identidad. Mientras está pendiente, la galería sigue cerrada y el parámetro no se toca, así que el enlace directo sobrevive a la carga; null o un rechazo quitan el parámetro.
Atajo
¿Usas el id del elemento como clave? Sáltate el codec y el locator hechos a mano y pasa locateAsync directamente a urlStableIdKey({ items, locateAsync }) (carga cuando no lo encuentra y después devuelve el índice). La versión más completa de abajo es para usar otro campo como clave o para tener el control total.
const photo = createOverlayUrlState({
param: 'photo',
codec: { decode: (raw) => raw, encode: (id) => id },
locator: {
locate: (id) => this.images().findIndex((x) => x.id === id),
identify: (index) => this.images()[index].id,
locateAsync: async (id) => {
const loaded = await loadById(id); // or loadUntil(id) — fetch just that one, or page up to it
if (!loaded) return null; // exhausted — link names no item
this.images.set(loaded); // commit; the overlay renders from this
return loaded.findIndex((x) => x.id === id); // wherever it landed
},
},
});Inputs de RkLightboxUrlOverlayComponent
Acepta todos los inputs de rk-lightbox-overlay salvo isOpen, que se sustituye por un controlador. Los outputs son los mismos closed y slideChange; la URL controla el cierre, así que closed es un aviso y no el mecanismo.
| Input | Tipo | Por defecto | Descripción |
|---|---|---|---|
controller | UrlStateController | required | Controlador de createOverlayUrlState. Su posición decide si la galería está abierta y qué slide muestra; el componente escribe a través de él al cambiar de slide y al cerrar. |
Inputs de RkLightboxOverlayComponent
| Input | Tipo | Por defecto | Descripción |
|---|---|---|---|
isOpen | boolean | obligatorio | Controla la visibilidad; con false el overlay se quita del DOM |
items | LightboxItem[] | obligatorio | Array de elementos del lightbox (imágenes o vídeos) |
initialIndex | number | 0 | Índice, empezando en cero, del elemento visible al principio |
transitionFn | TransitionTransformFn | slideTransition | Función de transición entre slides. Importa una incluida (slideTransition, flipTransition, lightboxFadeTransition, lightboxZoomTransition) o pasa una propia. Si se omite, se usa slideTransition. |
showInfo | boolean | true | Indica si se renderiza el overlay de información con el título y la descripción |
showControls | boolean | true | Indica si se renderiza la barra de controles superior (cerrar, contador, pantalla completa) |
showNavigation | boolean | true | Indica si se renderizan las flechas de anterior y siguiente |
transitionDuration | number | 300 | Duración de la animación de los slides en ms |
swipeDistanceFactor | number | 0.12 | Fracción mínima de la distancia de deslizamiento (0–1) para cambiar de slide |
swipeToCloseDirection | 'up' | 'down' | 'up' | Dirección del gesto de deslizar para cerrar en móvil |
loop | boolean | false | Indica si el slider pasa del último slide al primero |
enableNavKeys | boolean | true | Activa la navegación con las teclas de flecha |
enableWheel | boolean | true | Activa la navegación con la rueda del ratón |
wheelDebounceMs | number | 200 | Duración del debounce de los eventos de la rueda en ms |
ariaLabel | string | 'Image gallery' | Etiqueta accesible de la región del diálogo |
Outputs de RkLightboxOverlayComponent
| Output | Tipo | Descripción |
|---|---|---|
closed | EventEmitter<void> | Se emite cuando el usuario cierra el lightbox |
slideChange | EventEmitter<number> | Se emite cuando cambia el índice del slide activo |
Interfaz LightboxItem
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
src | string | sí | URL de la imagen o el vídeo |
type | 'image' | 'video' | no | Tipo de elemento. Por defecto es 'image' |
poster | string | no | Imagen en miniatura de los vídeos |
title | string | no | Título que se muestra en el overlay de información |
description | string | no | Descripción que se muestra debajo del título |
width | number | no | Ancho intrínseco de la imagen en píxeles |
height | number | no | Alto intrínseco de la imagen en píxeles |
Tipos de contexto de los slots de plantilla
| Tipo | Campos |
|---|---|
LightboxControlsContext | { item, onClose, activeIndex, count, isFullscreen, onToggleFullscreen } |
LightboxNavContext | { item, onPrev, onNext, activeIndex, count } |
LightboxInfoContext | { $implicit: LightboxItem, index } |
LightboxSlideContext | { $implicit: LightboxItem, index, size: [number, number], isActive, onReady, onWaiting, onError } |
Transiciones
Pasa cualquier TransitionTransformFn con el input transitionFn. Si importas solo la transición que usas, el bundler puede descartar el resto con tree-shaking. Si se omite, se usa slideTransition.
| Función | Origen | Descripción |
|---|---|---|
slideTransition | @reelkit/angular-lightbox | Deslizamiento horizontal estándar (por defecto) |
lightboxFadeTransition | @reelkit/angular-lightbox | Fundido cruzado entre imágenes |
flipTransition | @reelkit/angular-lightbox | Efecto 3D de volteo de tarjeta |
lightboxZoomTransition | @reelkit/angular-lightbox | Zoom de un tamaño menor al tamaño normal |
import {
RkLightboxOverlayComponent,
lightboxFadeTransition,
} from '@reelkit/angular-lightbox';
@Component({
imports: [RkLightboxOverlayComponent],
template: `
<rk-lightbox-overlay
[isOpen]="isOpen"
[items]="images"
[transitionFn]="lightboxFadeTransition"
(closed)="isOpen = false"
/>
`,
})
export class GalleryComponent {
protected readonly lightboxFadeTransition = lightboxFadeTransition;
}Carga de contenido y gestión de errores
Si usas el slot de plantilla rkLightboxSlide, el contexto ofrece tres callbacks del ciclo de vida para indicar el estado de carga. El lightbox sigue el estado de cada slide y muestra un spinner o un icono de error según corresponda. Un precargador de contenido guarda en caché las URLs rotas, así que al volver a un slide que falló no se reintenta.
Callbacks del ciclo de vida
| Callback | Tipo | Descripción |
|---|---|---|
onReady | () => void | Indica que el contenido del slide se ha cargado bien (por ejemplo, la imagen se ha decodificado) |
onWaiting | () => void | Indica que el contenido del slide se está cargando (muestra el spinner) |
onError | () => void | Indica que el contenido del slide no se ha podido cargar (muestra el icono de error) |
Conectar los callbacks en rkLightboxSlide
<rk-lightbox-overlay [isOpen]="isOpen" [items]="items" (closed)="isOpen = false">
<ng-template rkLightboxSlide
let-item
let-size="size"
let-isActive="isActive"
let-onReady="onReady"
let-onWaiting="onWaiting"
let-onError="onError">
@if (item.type === 'video') {
<rk-lightbox-video-slide
[item]="item"
[size]="size"
[isActive]="isActive"
/>
} @else {
<img [src]="item.src"
[style.width.px]="size[0]"
[style.height.px]="size[1]"
style="object-fit:contain"
(load)="onReady()"
(error)="onError()" />
}
</ng-template>
</rk-lightbox-overlay>Plantilla de carga propia
Usa la directiva rkLightboxLoading para sustituir el spinner por defecto.
<rk-lightbox-overlay [isOpen]="isOpen" [items]="items" (closed)="isOpen = false">
<ng-template rkLightboxLoading let-index let-item="item">
<div style="display:flex;flex-direction:column;align-items:center;color:#fff">
<span>Loading image {{ index + 1 }}...</span>
<span style="opacity:0.6">{{ item.title }}</span>
</div>
</ng-template>
</rk-lightbox-overlay>Plantilla de error propia
Usa la directiva rkLightboxError para sustituir el icono de error por defecto.
<rk-lightbox-overlay [isOpen]="isOpen" [items]="items" (closed)="isOpen = false">
<ng-template rkLightboxError let-index let-item="item">
<div style="display:flex;flex-direction:column;align-items:center;color:#ef4444">
<span>Failed to load</span>
<span style="opacity:0.6">{{ item.title ?? item.src }}</span>
</div>
</ng-template>
</rk-lightbox-overlay>Clases CSS
Todas las clases CSS son normales (no scoped), así que puedes apuntar a ellas con selectores más específicos en una hoja de estilos cargada después de @reelkit/angular-lightbox/styles.css. Para cambiar colores, tamaños y z-index, es mejor usar las propiedades personalizadas de CSS de la sección Temas de más abajo.
| Clase | Componente | Descripción |
|---|---|---|
.rk-lightbox-overlay | Overlay | Contenedor raíz (fondo a pantalla completa) |
.rk-lightbox-top-shade | Overlay | Degradado superior detrás de los controles |
.rk-lightbox-spinner | Overlay | Spinner de carga por defecto |
.rk-lightbox-img-error | Overlay | Contenedor del estado de error (imagen rota) |
.rk-lightbox-img-error-text | Overlay | Texto del estado de error |
.rk-lightbox-swipe-hint | Overlay | Pista de deslizamiento en móvil |
.rk-lightbox-empty | Overlay | Texto del estado vacío |
.rk-lightbox-controls-left | Controls | Contenedor de los controles de arriba a la izquierda |
.rk-lightbox-btn | Controls | Botón de control (pantalla completa, etc.) |
.rk-lightbox-close | Controls | Botón de cerrar |
.rk-lightbox-counter | Controls | Chip del contador de imágenes |
.rk-lightbox-nav | Navigation | Flecha de navegación (anterior y siguiente) |
.rk-lightbox-nav-prev | Navigation | Flecha de anterior |
.rk-lightbox-nav-next | Navigation | Flecha de siguiente |
.rk-lightbox-info | Info | Contenedor del título y la descripción |
.rk-lightbox-title | Info | Título de la imagen |
.rk-lightbox-description | Info | Descripción de la imagen |
.rk-lightbox-slide | Slide | Contenedor del slide |
.rk-lightbox-img | Slide | Elemento de imagen |
.rk-lightbox-video-container | VideoSlide | Contenedor del slide de vídeo (opcional) |
.rk-lightbox-video-element | VideoSlide | Elemento de vídeo (opcional) |
.rk-lightbox-video-poster | VideoSlide | Imagen del póster del vídeo (opcional) |
.rk-lightbox-video-error | VideoSlide | Contenedor del estado de error del vídeo |
Temas
Cada color, tamaño, z-index y transición vive en una propiedad personalizada de CSS. Sobrescribe una o varias en :root (o en cualquier ancestro del lightbox) para cambiar el tema sin tocar el código de los componentes. Los tokens coinciden con los del lightbox de React, así que los cambios sirven para los dos bindings.
| Token | Por defecto | Controla |
|---|---|---|
--rk-lightbox-overlay-bg | #000 | Color del fondo a pantalla completa |
--rk-lightbox-overlay-z | 9999 | z-index del overlay |
--rk-lightbox-top-shade-height | 80px | Altura del degradado superior |
--rk-lightbox-top-shade-bg | linear-gradient(rgba(0,0,0,0.6), transparent) | Color del degradado superior |
--rk-lightbox-edge-padding | 16px | Separación del borde de cerrar / navegación / controles de arriba a la izquierda |
--rk-lightbox-controls-gap | 12px | Espacio entre los controles de arriba a la izquierda |
--rk-lightbox-transition | 0.2s | Duración de la transición de los botones al pasar el ratón |
--rk-lightbox-blur | 8px | Radio del desenfoque de fondo de botones y chips |
--rk-lightbox-btn-bg | rgba(0, 0, 0, 0.5) | Fondo por defecto de los botones de cerrar, navegación y pequeños |
--rk-lightbox-btn-bg-hover | rgba(255, 255, 255, 0.2) | Fondo al pasar el ratón de los botones de cerrar, navegación y pequeños |
--rk-lightbox-btn-fg | #fff | Color del icono de los botones de cerrar, navegación y pequeños |
--rk-lightbox-btn-size | 36px | Tamaño de los botones pequeños (pantalla completa, etc.) |
--rk-lightbox-close-size | 40px | Tamaño del botón de cerrar |
--rk-lightbox-nav-size | 48px | Tamaño de las flechas de anterior y siguiente |
--rk-lightbox-nav-opacity | 0.7 | Opacidad en reposo de las flechas de anterior y siguiente |
--rk-lightbox-counter-fg | #fff | Color del texto del contador |
--rk-lightbox-counter-bg | rgba(0, 0, 0, 0.5) | Fondo del chip del contador |
--rk-lightbox-counter-size | 14px | Tamaño de letra del contador |
--rk-lightbox-counter-padding | 6px 12px | Relleno del chip del contador |
--rk-lightbox-counter-radius | 20px | border-radius del chip del contador |
--rk-lightbox-spinner-size | 28px | Ancho y alto del spinner por defecto |
--rk-lightbox-spinner-duration | 0.8s | Duración de la rotación del spinner |
--rk-lightbox-error-fg | rgba(255, 255, 255, 0.4) | Color del icono y el texto de error |
--rk-lightbox-info-bg | linear-gradient(transparent, rgba(0,0,0,0.8)) | Degradado del fondo del pie |
--rk-lightbox-info-padding | 24px | Relleno interior del pie |
--rk-lightbox-title-size | 18px | Tamaño de letra del título |
--rk-lightbox-description-size | 14px | Tamaño de letra de la descripción |
--rk-lightbox-hint-fg | rgba(255, 255, 255, 0.5) | Color del texto de la pista de deslizamiento |
--rk-lightbox-hint-bg | rgba(0, 0, 0, 0.3) | Fondo del chip de la pista de deslizamiento |
--rk-lightbox-video-bg | #000 | Fondo de las bandas detrás del <video> |
Pega el fragmento de abajo en una hoja de estilos cargada después de @reelkit/angular-lightbox/styles.css.
/* Brand the lightbox */
:root {
--rk-lightbox-overlay-bg: #0f172a;
--rk-lightbox-btn-bg: rgba(99, 102, 241, 0.65);
--rk-lightbox-btn-bg-hover: rgba(168, 85, 247, 0.85);
--rk-lightbox-nav-size: 56px;
--rk-lightbox-counter-bg: rgba(99, 102, 241, 0.65);
--rk-lightbox-info-bg: linear-gradient(
transparent,
rgba(99, 102, 241, 0.55) 60%,
rgba(168, 85, 247, 0.85)
);
}Accesibilidad
La raíz del overlay es un diálogo modal (role="dialog", aria-modal="true"). Usa el input ariaLabel para cambiar lo que anuncia el lector de pantalla; por defecto es "Image gallery". Cada slide lleva role="group", aria-roledescription="slide" y un aria-label formado por el título de la imagen y la posición.
El lightbox captura el foco al abrirse y lo devuelve al disparador al cerrarse. Tab y Mayús+Tab recorren los elementos enfocables de dentro; el foco que sale (un clic fuera, un foco por código) vuelve dentro. Está implementado con captureFocusForReturn y createFocusTrap de @reelkit/core.
Atajos de teclado
| Tecla | Acción |
|---|---|
ArrowLeft | Imagen anterior |
ArrowRight | Imagen siguiente |
Escape | Cierra el lightbox (o sale de la pantalla completa si está activa) |