Angular Lightbox

Lightbox de galería de imágenes y vídeos a pantalla completa para Angular, con @reelkit/angular-lightbox.

Ver la demo en vivo →

Características

Imágenes y vídeo
Slides de vídeo incluidos
Gestos táctiles
Desliza para navegar
Deslizar para cerrar
Desliza hacia arriba para cerrar
Teclado
Flechas + Escape
Pantalla completa
API compatible con todos los navegadores
Transiciones
Deslizar, fundido, volteo, zoom
Precarga
Las imágenes contiguas se cargan antes
Botón de sonido
Silencio por slide
Estados de carga
Spinner y slot propio
Gestión de errores
Icono de error y slot propio
Slots de plantilla
6 zonas de slots personalizables
OnPush
Señales de Angular + OnPush
Estado en la URL
Enlaces que se pueden compartir y guardar

Instalación

bash
npm install @reelkit/angular-lightbox @reelkit/angular lucide-angular
Iconos

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.

gallery.component.ts
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.

DirectivaTipo del contextoDescripción
[rkLightboxControls]LightboxControlsContextSustituye la barra de controles superior (botón de cerrar, contador, botón de pantalla completa)
[rkLightboxNavigation]LightboxNavContextSustituye las flechas de anterior y siguiente
[rkLightboxInfo]LightboxInfoContextSustituye el overlay inferior con degradado del título y la descripción
[rkLightboxSlide]LightboxSlideContextSustituye 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
typescript
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">&#8592;</button>
        <button (click)="onNext()" [disabled]="activeIndex === count - 1">&#8594;</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.

typescript
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.

typescript
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.

typescript
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 rkLightboxControls y los demás van dentro de él exactamente como irían dentro de rk-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:

typescript
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.

typescript
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):

typescript
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.

typescript
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.

InputTipoPor defectoDescripción
controllerUrlStateControllerrequiredControlador 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

InputTipoPor defectoDescripción
isOpenbooleanobligatorioControla la visibilidad; con false el overlay se quita del DOM
itemsLightboxItem[]obligatorioArray de elementos del lightbox (imágenes o vídeos)
initialIndexnumber0Índice, empezando en cero, del elemento visible al principio
transitionFnTransitionTransformFnslideTransitionFunción de transición entre slides. Importa una incluida (slideTransition, flipTransition, lightboxFadeTransition, lightboxZoomTransition) o pasa una propia. Si se omite, se usa slideTransition.
showInfobooleantrueIndica si se renderiza el overlay de información con el título y la descripción
showControlsbooleantrueIndica si se renderiza la barra de controles superior (cerrar, contador, pantalla completa)
showNavigationbooleantrueIndica si se renderizan las flechas de anterior y siguiente
transitionDurationnumber300Duración de la animación de los slides en ms
swipeDistanceFactornumber0.12Fracció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
loopbooleanfalseIndica si el slider pasa del último slide al primero
enableNavKeysbooleantrueActiva la navegación con las teclas de flecha
enableWheelbooleantrueActiva la navegación con la rueda del ratón
wheelDebounceMsnumber200Duración del debounce de los eventos de la rueda en ms
ariaLabelstring'Image gallery'Etiqueta accesible de la región del diálogo

Outputs de RkLightboxOverlayComponent

OutputTipoDescripción
closedEventEmitter<void>Se emite cuando el usuario cierra el lightbox
slideChangeEventEmitter<number>Se emite cuando cambia el índice del slide activo

Interfaz LightboxItem

CampoTipoObligatorioDescripción
srcstringURL de la imagen o el vídeo
type'image' | 'video'noTipo de elemento. Por defecto es 'image'
posterstringnoImagen en miniatura de los vídeos
titlestringnoTítulo que se muestra en el overlay de información
descriptionstringnoDescripción que se muestra debajo del título
widthnumbernoAncho intrínseco de la imagen en píxeles
heightnumbernoAlto intrínseco de la imagen en píxeles

Tipos de contexto de los slots de plantilla

TipoCampos
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ónOrigenDescripción
slideTransition@reelkit/angular-lightboxDeslizamiento horizontal estándar (por defecto)
lightboxFadeTransition@reelkit/angular-lightboxFundido cruzado entre imágenes
flipTransition@reelkit/angular-lightboxEfecto 3D de volteo de tarjeta
lightboxZoomTransition@reelkit/angular-lightboxZoom de un tamaño menor al tamaño normal
typescript
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

CallbackTipoDescripción
onReady() => voidIndica que el contenido del slide se ha cargado bien (por ejemplo, la imagen se ha decodificado)
onWaiting() => voidIndica que el contenido del slide se está cargando (muestra el spinner)
onError() => voidIndica que el contenido del slide no se ha podido cargar (muestra el icono de error)

Conectar los callbacks en rkLightboxSlide

html
<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.

html
<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.

html
<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.

ClaseComponenteDescripción
.rk-lightbox-overlayOverlayContenedor raíz (fondo a pantalla completa)
.rk-lightbox-top-shadeOverlayDegradado superior detrás de los controles
.rk-lightbox-spinnerOverlaySpinner de carga por defecto
.rk-lightbox-img-errorOverlayContenedor del estado de error (imagen rota)
.rk-lightbox-img-error-textOverlayTexto del estado de error
.rk-lightbox-swipe-hintOverlayPista de deslizamiento en móvil
.rk-lightbox-emptyOverlayTexto del estado vacío
.rk-lightbox-controls-leftControlsContenedor de los controles de arriba a la izquierda
.rk-lightbox-btnControlsBotón de control (pantalla completa, etc.)
.rk-lightbox-closeControlsBotón de cerrar
.rk-lightbox-counterControlsChip del contador de imágenes
.rk-lightbox-navNavigationFlecha de navegación (anterior y siguiente)
.rk-lightbox-nav-prevNavigationFlecha de anterior
.rk-lightbox-nav-nextNavigationFlecha de siguiente
.rk-lightbox-infoInfoContenedor del título y la descripción
.rk-lightbox-titleInfoTítulo de la imagen
.rk-lightbox-descriptionInfoDescripción de la imagen
.rk-lightbox-slideSlideContenedor del slide
.rk-lightbox-imgSlideElemento de imagen
.rk-lightbox-video-containerVideoSlideContenedor del slide de vídeo (opcional)
.rk-lightbox-video-elementVideoSlideElemento de vídeo (opcional)
.rk-lightbox-video-posterVideoSlideImagen del póster del vídeo (opcional)
.rk-lightbox-video-errorVideoSlideContenedor 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.

TokenPor defectoControla
--rk-lightbox-overlay-bg#000Color del fondo a pantalla completa
--rk-lightbox-overlay-z9999z-index del overlay
--rk-lightbox-top-shade-height80pxAltura del degradado superior
--rk-lightbox-top-shade-bglinear-gradient(rgba(0,0,0,0.6), transparent)Color del degradado superior
--rk-lightbox-edge-padding16pxSeparación del borde de cerrar / navegación / controles de arriba a la izquierda
--rk-lightbox-controls-gap12pxEspacio entre los controles de arriba a la izquierda
--rk-lightbox-transition0.2sDuración de la transición de los botones al pasar el ratón
--rk-lightbox-blur8pxRadio del desenfoque de fondo de botones y chips
--rk-lightbox-btn-bgrgba(0, 0, 0, 0.5)Fondo por defecto de los botones de cerrar, navegación y pequeños
--rk-lightbox-btn-bg-hoverrgba(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#fffColor del icono de los botones de cerrar, navegación y pequeños
--rk-lightbox-btn-size36pxTamaño de los botones pequeños (pantalla completa, etc.)
--rk-lightbox-close-size40pxTamaño del botón de cerrar
--rk-lightbox-nav-size48pxTamaño de las flechas de anterior y siguiente
--rk-lightbox-nav-opacity0.7Opacidad en reposo de las flechas de anterior y siguiente
--rk-lightbox-counter-fg#fffColor del texto del contador
--rk-lightbox-counter-bgrgba(0, 0, 0, 0.5)Fondo del chip del contador
--rk-lightbox-counter-size14pxTamaño de letra del contador
--rk-lightbox-counter-padding6px 12pxRelleno del chip del contador
--rk-lightbox-counter-radius20pxborder-radius del chip del contador
--rk-lightbox-spinner-size28pxAncho y alto del spinner por defecto
--rk-lightbox-spinner-duration0.8sDuración de la rotación del spinner
--rk-lightbox-error-fgrgba(255, 255, 255, 0.4)Color del icono y el texto de error
--rk-lightbox-info-bglinear-gradient(transparent, rgba(0,0,0,0.8))Degradado del fondo del pie
--rk-lightbox-info-padding24pxRelleno interior del pie
--rk-lightbox-title-size18pxTamaño de letra del título
--rk-lightbox-description-size14pxTamaño de letra de la descripción
--rk-lightbox-hint-fgrgba(255, 255, 255, 0.5)Color del texto de la pista de deslizamiento
--rk-lightbox-hint-bgrgba(0, 0, 0, 0.3)Fondo del chip de la pista de deslizamiento
--rk-lightbox-video-bg#000Fondo 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.

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

TeclaAcción
ArrowLeftImagen anterior
ArrowRightImagen siguiente
EscapeCierra el lightbox (o sale de la pantalla completa si está activa)