Dialog Stack
StableFluxo de várias etapas apresentado como uma pilha de cartas: a etapa ativa é o painel da frente e as anteriores ficam como bordas acima dele. É um único dialog com várias etapas, não vários dialogs — o primitive Dialog (Base UI) é dono de modalidade, portal, overlay, foco, Escape, descarte e estado de abertura, e a recipe é dona do workflow. Apenas a etapa ativa monta conteúdo, então não sobram títulos duplicados nem campos focáveis invisíveis atrás dela.
Instalação
npx up-web-ds add dialog-stackPreview
Basic
With Fields
Six Steps
Disable Overlay Close
Controlled
All states
Basic
With Fields
Six Steps
Clickable Navigation
Disable Overlay Close
Controlled
Usage
Props
DialogStack
Estende React.ComponentProps<'div'> & Pick<DialogProps, 'disableOverlayClose'>. Aceita também os atributos padrão de um elemento React (280 não listados).
DialogStackTrigger
Estende React.ComponentProps< typeof DialogTrigger >. Aceita também os atributos padrão de um elemento React (284 não listados).
DialogStackOverlay
Estende React.ComponentProps<'div'>. Aceita também os atributos padrão de um elemento React (280 não listados).
DialogStackBody
Estende React.ComponentProps<'div'>. Aceita também os atributos padrão de um elemento React (280 não listados).
DialogStackContent
Estende React.ComponentProps<'div'>. Aceita também os atributos padrão de um elemento React (280 não listados).
DialogStackHeader
Estende React.ComponentProps<typeof DialogHeader>. Aceita também os atributos padrão de um elemento React (280 não listados).
DialogStackTitle
Estende React.ComponentProps<typeof DialogTitle>. Aceita também os atributos padrão de um elemento React (275 não listados).
DialogStackDescription
Estende React.ComponentProps< typeof DialogDescription >. Aceita também os atributos padrão de um elemento React (275 não listados).
DialogStackNext
Estende StepButtonProps. Aceita também os atributos padrão de um elemento React (285 não listados).
DialogStackPrevious
Estende StepButtonProps. Aceita também os atributos padrão de um elemento React (285 não listados).
Composition
O gatilho e o corpo são irmãos dentro do DialogStack. Cada filho do DialogStackBody é uma etapa, na ordem em que aparece; só a ativa renderiza.
Metadata
Notas de acessibilidade
Teclado e leitor de tela verificados por teste (Vitest) e em navegador (tests/e2e/dialog-stack.spec.ts, Chromium desktop e mobile, light e dark). Abre pelo gatilho e pelo teclado; fecha por Escape, pelo DialogClose e por pressão fora. O foco entra na etapa ativa ao abrir, fica preso enquanto está aberta — medido no navegador, porque o jsdom não implementa `inert` —, permanece dentro do dialog na troca de etapa e volta ao gatilho ao fechar. Existe exatamente um `role="dialog"`, um `dialog-title` e um conteúdo de etapa em qualquer passo, nomeado e descrito pela etapa atual: etapas anteriores e futuras não deixam heading, descrição, campo nem botão no documento. Sem `clickable`, as bordas da pilha são `aria-hidden` e ficam fora da árvore de acessibilidade; com `clickable`, cada uma é um `<button type="button">` nomeado (“Voltar para a etapa N”), dentro do popup e portanto ao alcance do teclado. Axe sem violações WCAG 2.2 AA com a pilha aberta, em light e dark. Toque verificado em viewport de 375px com emulação de toque: com `clickable`, a faixa exposta de cada borda tem piso de 24px (`MIN_TARGET`), acima do mínimo de 24x24 da WCAG 2.2 SC 2.5.8 — o upstream expõe 10px, e essa é uma diferença deliberada que vale só no modo interativo; a pilha decorativa mantém o espaçamento do upstream. Reduced motion verificado em navegador com prefers-reduced-motion: reduce: `motion-reduce:transition-none` remove o tween das bordas e elas já aparecem na profundidade nova; a animação de entrada e saída do popup não é condicionada, porque é o `animationend` dela que o Base UI espera para desmontar, e o descarte continua funcionando. Na troca de etapa, o conteúdo entra com fade e um deslocamento de 0,5rem conforme a direção (de baixo ao avançar, de cima ao voltar) e a borda da etapa deixada para trás cresce a partir do topo do painel; sob reduce, o deslocamento é condicionado a `motion-safe:` e some, o fade permanece encurtado para `duration-fast`, e o crescimento da borda lê a duração da transição dela, que é `none`, e não toca. Todas as etapas têm a altura da maior (`equalHeight`, padrão ligado), medida numa camada invisível, `inert` e `aria-hidden` que existe só durante um layout e é removida antes do paint, então o painel e a pilha não se deslocam entre etapas.
Classificação
- Layer
- Recipe
- Domínio
- Domain-free (compartilhado)
- Categoria
- overlay
- Status
- Stable
Origem e distribuição
- Fonte
- kibo registry / dialog-stack
- Licença
- MIT
- Distribuição
- Interna
Acessibilidade
- Teclado: revisado
- Leitor de tela: revisado
- Touch: revisado
- Reduced motion: revisado
Dependências
- Pacotes
- Nenhuma
- Ícones
- Nenhum
- Usado por
- Nenhum ainda