componentes / lightbox
Lightbox
Visualizador de imagens em tela cheia com navegação, contador e legendas.
Como usar
Um `role="dialog"` modal renderizado em portal: o foco fica preso, o scroll da página é travado, Esc fecha e ←/→ navegam (com volta ao início). `open` e `index` podem ser controlados; sem eles guarda o próprio estado (`defaultOpen`, `defaultIndex`). O foco volta ao elemento de origem ao fechar, a menos que `onCloseAutoFocus` chame `preventDefault()`.
preview
Lightbox.tsx
import { useState } from "react";import { Lightbox } from "vaiperui"; const [open, setOpen] = useState(false); <button onClick={() => setOpen(true)}>Abrir</button><Lightbox open={open} onOpenChange={setOpen} items={[ { src: "/photos/road.jpg", alt: "Mountain road", caption: "Road" }, { src: "/photos/sky.jpg", alt: "Starry sky" }, ]}/>Padrão
preview
padrao.tsx
<Lightbox open={open} onOpenChange={setOpen} items={items} />Props
| Prop | Valores | Padrão | Descrição |
|---|---|---|---|
| items | { src, alt, caption? }[] | — | Imagens a mostrar |
| open / defaultOpen | boolean | false | Visibilidade controlada / inicial |
| onOpenChange | (open: boolean) => void | nenhum | Chamado quando pede para fechar |
| index / defaultIndex | number | 0 | Imagem controlada / inicial |
| onIndexChange | (index: number) => void | nenhum | Chamado quando a imagem muda |
| label | string | Image viewer | Nome acessível do diálogo |
| closeLabel / previousLabel / nextLabel | string | Close / Previous image / Next image | Nomes acessíveis dos botões |
| counterLabel | (index, total) => string | 1 / 6 | Texto do contador |
| onCloseAutoFocus | (event: Event) => void | nenhum | Ao fechar; preventDefault() evita devolver o foco |
Acessibilidade
- O visualizador é um `role="dialog"` com `aria-modal="true"`, nomeado por `label`, renderizado em um portal.
- Ao abrir, o foco vai para dentro e o Tab circula dentro do diálogo (focus trap); a rolagem da página fica bloqueada enquanto está aberto.
- Ao fechar, o foco volta ao elemento que o tinha antes, a menos que `onCloseAutoFocus` chame `preventDefault()`.
- Fechar, anterior e próxima são botões reais nomeados por `closeLabel`, `previousLabel` e `nextLabel`; anterior/próxima só existem com mais de uma imagem e dão a volta.
- A imagem usa seu `alt`, dentro de um `<figure>` com a `caption` como `<figcaption>`.
- O contador (`counterLabel`, ex.: `2 / 5`) é uma região `aria-live="polite"`, então a troca de imagem é anunciada.
Teclado
| Tecla | Ação |
|---|---|
| Esc | Fecha o visualizador |
| ArrowLeft / ArrowRight | Imagem anterior / próxima (com mais de uma) |
| Tab / Shift+Tab | Circula pelos botões dentro do diálogo |
Tenha em mente
- Todo item precisa de um `alt`; o componente não gera um.
- Clicar no fundo escuro também fecha, mas é um atalho de mouse; quem usa teclado fecha com Esc ou o botão de fechar. Traduza os rótulos para o idioma da página.