Primitivedata-display

Lens

Stable

Uma lupa que segue o ponteiro sobre o conteúdo que ela cobre: um círculo que mostra a mesma área ampliada, sem tirar nada de lugar. Serve para detalhe — a textura de um produto, um trecho de um gráfico, o recorte de uma captura de tela. A cópia ampliada é a mesma coisa duas vezes, então ela fica fora da árvore de acessibilidade; o conteúdo embaixo continua inteiro.

Instalação

npx up-web-ds add lens

Preview

Basic

registry · protocolo 3@up-web-ds/dialog-stack

sha256:9f2c1ab · 4.1 kB · stable · internal

Over An Image

Placa de teste AMOSTRA

Loupe

Placa de teste LOUPE
Placa de teste SPOT

Parked

Placa de teste PARADA

Pinned

Placa de teste FIXA

With Content

registry privadods.upwebstudio.com.br

Cada `/r/*` exige um Bearer token; sem credencial, 401.

Ver a página de ajuda

All states

Basic

registry · protocolo 3@up-web-ds/dialog-stack

sha256:9f2c1ab · 4.1 kB · stable · internal

Over An Image

Placa de teste AMOSTRA

Loupe

Placa de teste LOUPE
Placa de teste SPOT

Parked

Placa de teste PARADA

Pinned

Placa de teste FIXA

With Content

registry privadods.upwebstudio.com.br

Cada `/r/*` exige um Bearer token; sem credencial, 401.

Ver a página de ajuda

Usage

@/components/ui/lens
import { Lens } from '@/components/ui/lens'
Lens
<Lens ariaLabel="Registro de publicação, com lupa">
  <div className="flex max-w-sm flex-col gap-1 rounded-xl border border-border bg-card p-5">
    <span className="type-caption text-muted-foreground">
      registry · protocolo 3
    </span>
    <span className="font-heading type-body font-semibold">
      @up-web-ds/dialog-stack
    </span>
    <p className="font-mono type-caption text-muted-foreground">
      sha256:9f2c1ab · 4.1 kB · stable · internal
    </p>
  </div>
</Lens>

Props

Props de Lens
PropTypeDefaultDescription
children, obrigatóriaReact.ReactNodesem valor padrãoThe content the lens magnifies. It is rendered twice: once plainly, and once scaled inside the circle.
ariaLabelstring'Zoom Area'Accessible name for the area the lens covers.
defaultPositionPositionsem valor padrãoWhere the circle rests before the pointer arrives. Leaving it out hides the lens until hover.
durationnumber0.1How long the circle takes to appear, in seconds. Ignored when the reader has asked for reduced motion.
isStaticbooleanfalsePins the circle at `position` instead of following the pointer.
lensColorstring'black'Colour of the mask that cuts the circle out. It is a mask, so only its opacity matters — any fully opaque colour gives the same circle.
lensSizenumber170Diameter of the circle, in pixels.
positionPosition{ x: 0, y: 0 }Where the circle sits when `isStatic` is set.
zoomFactornumber1.3How much the circle magnifies. Must be at least 1.

prop obrigatória.

Metadata

Notas de acessibilidade

Verificado em tests/e2e/lens.spec.ts no Chromium desktop e mobile, em light e dark, com Axe sem violações WCAG 2.2 AA. Teclado: a lupa é um realce de ponteiro sobre conteúdo que já está inteiro embaixo dela, então não há nada para operar — ela não entra na sequência de tabulação e não captura foco, verificado em navegador e por teste. Isso é uma mudança deliberada em relação ao upstream, registrada no ingestion record: lá havia tabIndex={0} com role="region" e um handler de Escape, mas nenhuma tecla movia a lupa, então era uma parada de tabulação que não fazia nada. Quem precisa de ampliação por teclado tem o zoom do navegador e a lupa do sistema, que ampliam tudo e não só este recorte. Leitor de tela verificado por teste e pela árvore de acessibilidade do navegador: a camada ampliada é aria-hidden, porque é o mesmo conteúdo uma segunda vez — lê-lo de novo, em outra ordem, seria ruído —, e `ariaLabel` nomeia a região que a lupa cobre; cada instância precisa de um nome próprio, porque dois landmarks com o mesmo nome é violação de landmark-unique. Elementos interativos dentro do conteúdo continuam alcançáveis: a camada ampliada não os duplica na árvore nem os cobre para o teclado. Touch verificado em viewport de 375px com emulação de toque: não há alvo próprio — a lupa reage a ponteiro — e o conteúdo embaixo permanece tocável; a área não provoca rolagem horizontal. Reduced motion verificado em navegador com prefers-reduced-motion: reduce e por teste: o movimento é animado em JavaScript, então motion-safe: não o alcança e a política é useReducedMotion() — o círculo continua aparecendo, porque aparecer é a função, mas chega sem crescer e com duração zero.

Classificação

Layer
Primitive
Domínio
Domain-free (compartilhado)
Categoria
data-display
Status
Stable

Origem e distribuição

Fonte
magic registry / lens
Licença
MIT
Distribuição
Interna

Acessibilidade

  • Teclado: revisado
  • Leitor de tela: revisado
  • Touch: revisado
  • Reduced motion: revisado

Dependências

Pacotes
motion
Ícones
Nenhum
Construído sobre
Nenhum
Usado por
Nenhum ainda