The scroll is the timeline.A rolagem é a timeline.
Scroll-linked motion that ships in the Velora stylesheet, driven by the browser's own scroll timeline with no script. Every demo on this page is live, so scroll and watch it move. Two native CSS techniques that sit alongside the core close the page.Movimento ligado à rolagem que já vem na folha de estilo do Velora, conduzido pela própria timeline de rolagem do navegador, sem script. Cada demo desta página é ao vivo: role e veja se mover. Duas técnicas nativas de CSS que acompanham o core fecham a página.

Scroll as the clock.Rolagem como relógio.
vl-scroll ties a primitive to the scroll position instead of a timer. The element is scrubbed forward while you scroll down and back while you scroll up. Each block below is one value. Cinema zoom, the heavier camera move, is shown on the Cinema page.vl-scroll liga uma primitiva à posição de rolagem em vez de a um timer. O elemento avança enquanto você rola para baixo e volta quando rola para cima. Cada bloco abaixo é um valor. O cinema zoom, o movimento de câmera mais pesado, aparece na página Cinema.
CodeCódigo
<div vl-scroll="reveal">…</div>
<div vl-scroll="media-zoom">…</div>
<div vl-scroll="parallax">…</div>Choose where the motion lives.Escolha onde o movimento vive.
vl-range decides which part of the element's pass through the viewport drives the motion. Every block below is the same reveal. Only the range changes, from a quick entry to the middle of the screen.vl-range decide qual parte da passagem do elemento pela viewport conduz o movimento. Cada bloco abaixo é o mesmo reveal. Só o intervalo muda, de uma entrada rápida até o meio da tela.
CodeCódigo
<div vl-scroll="reveal" vl-range="entry-short">…</div>
<div vl-scroll="reveal" vl-range="entry">…</div>
<div vl-scroll="reveal" vl-range="entry-long">…</div>Cards that pile up as you scroll.Cartões que se empilham conforme você rola.
Each card is sticky. The one behind scales down and dims while the next covers it. The index of each card comes from :nth-child, so any number of cards works with no extra markup.Cada cartão é sticky. O de trás diminui e escurece enquanto o próximo o cobre. O índice de cada cartão vem de :nth-child, então qualquer quantidade de cartões funciona sem marcação extra.
It scales back when the second one claims the stage.Ele recua quando o segundo toma o palco.
The one behind retreats while this one settles in.O de trás recua enquanto este se acomoda.
Offset and spread tune how far each card sits from the one before.Deslocamento e abertura ajustam a distância de cada cartão em relação ao anterior.
It stays at full size and the stack clears the viewport.Ele fica em tamanho total e a pilha libera a viewport.
CodeCódigo
<div class="vl-stack-cards">
<article class="vl-stack-card">
Card 1
</article>
<article class="vl-stack-card">
Card 2
</article>
</div>
/* Tune with variables
--vl-stack-offset
distance from the top
--vl-stack-spread
step between cards
--vl-stack-scale-to
--vl-stack-dim-to
how far the card behind
retreats */A shadow that says there is more.Uma sombra que diz que há mais.
The top shadow appears only after you scroll down, and the bottom one disappears at the end. It is four background layers, two of them attached to the content, so no event or observer is needed.A sombra de cima só aparece depois que você rola para baixo, e a de baixo some no fim. São quatro camadas de background, duas delas presas ao conteúdo, então não é preciso evento nem observer.
↓ Scroll inside the box↓ Role dentro da caixaScroll shadows are a purely visual hint. They add no markup and nothing for a screen reader to announce, so the box stays a plain scrollable region.Sombras de rolagem são só uma dica visual. Não adicionam marcação nem nada para um leitor de tela anunciar, então a caixa continua sendo uma região rolável simples.
The shadow layers are fixed to the box. Two cover layers scroll with the content and hide each shadow exactly when you reach that edge.As camadas de sombra ficam fixas na caixa. Duas camadas de cobertura rolam com o conteúdo e escondem cada sombra exatamente quando você chega àquela borda.
Because the effect lives in the background, it works on any container with overflow, and the size is a single variable: --vl-scroll-shadow-size.Como o efeito vive no background, funciona em qualquer container com overflow, e o tamanho é uma única variável: --vl-scroll-shadow-size.
Keep the region focusable with tabindex="0" and give it a label, so keyboard users can scroll it too.Mantenha a região focável com tabindex="0" e dê a ela um rótulo, para que usuários de teclado também possam rolá-la.
That is the whole technique: gradients, background-attachment and a surface colour to match.Essa é a técnica inteira: gradientes, background-attachment e uma cor de superfície combinando.
Two ways to uncover an image.Duas formas de descobrir uma imagem.
img-reveal opens from the centre with a small scale. wipe-reveal sweeps from the left edge. Both run while the element enters the viewport.img-reveal abre a partir do centro com uma pequena escala. wipe-reveal varre a partir da borda esquerda. Ambos rodam enquanto o elemento entra na viewport.

vl-effect="img-reveal"
vl-effect="wipe-reveal"Scroll down, move sideways.Role para baixo, mova para o lado.
The page scrolls vertically and the track slides horizontally. Readers never touch a horizontal scrollbar, and the section pins while it plays. Each panel also turns toward the centre: it lies flat when it is centred and tilts more the farther it is from it.A página rola na vertical e a trilha desliza na horizontal. Ninguém precisa tocar numa barra de rolagem horizontal, e a seção fica fixa enquanto toca. Cada painel também se vira para o centro: fica plano quando está centralizado e inclina mais quanto mais longe dele.
↓ Scroll the page↓ Role a página



CodeCódigo
<section class="vl-horizontal-section" style="--vl-h-travel-end:-60rem">
<div class="vl-horizontal-section__pin">
<div class="vl-horizontal-section__track">…panels…</div>
</div>
</section>
/* --vl-h-travel-end how far the track slides left
--vl-h-section-height scroll distance, 300vh by default */Two strips, opposite directions.Duas faixas, direções opostas.
Both strips are tied to the page scroll. The top one drifts right while the bottom one drifts left.As duas faixas estão ligadas à rolagem da página. A de cima desliza para a direita enquanto a de baixo desliza para a esquerda.
↓ Scroll the page↓ Role a páginaCodeCódigo
<div vl-effect="counter-scroll"
style="--vl-counter-from:-20%; --vl-counter-to:20%">…</div>Each item arrives on its own.Cada item chega por conta própria.
Every direct child has its own view timeline, so items animate in as each one enters the viewport. There is no shared stagger to maintain.Todo filho direto tem sua própria view timeline, então os itens animam conforme cada um entra na viewport. Não há stagger compartilhado para manter.
↓ Scroll slowly↓ Role devagar- 01Declare the intentDeclare a intenção
- 02Name the channelNomeie o canal
- 03Set the parameterDefina o parâmetro
- 04Compose the sceneComponha a cena
- 05Let the browser run itDeixe o navegador executar
CodeCódigo
<ul vl-children="list-enter">
<li>Item 1</li>
<li>Item 2</li>
</ul>One attribute, three moods.Um atributo, três climas.
vl-motion rescales the shared timing, travel and easing tokens for a whole subtree. The markup inside is identical in all three.vl-motion reescala os tokens compartilhados de tempo, deslocamento e easing de toda uma subárvore. A marcação dentro é idêntica nos três.
For hero moments.Para momentos de herói.
For dense interfaces.Para interfaces densas.
Reduced motion by author choice.Movimento reduzido por escolha do autor.
The engine also honors prefers-reduced-motion for every mode.O motor também respeita prefers-reduced-motion em todos os modos.
CodeCódigo
<section vl-motion="cinematic">…</section>
<section vl-motion="subtle">…</section>
<section vl-motion="still">…</section>Two browser features worth knowing.Dois recursos do navegador que vale conhecer.
These are plain CSS and HTML, not Velora attributes. They need a recent Chromium and fall back to an instant open and close elsewhere. Shown here as techniques Velora pages can use alongside the core.São CSS e HTML puros, não atributos do Velora. Precisam de um Chromium recente e, nos demais, abrem e fecham instantaneamente. Mostrados aqui como técnicas que páginas Velora podem usar junto com o core.
Opens with no script. Escape and a click outside close it. This is a popover, not a modal dialog: the page behind stays interactive.Abre sem script. Escape e um clique fora fecham. É um popover, não um diálogo modal: a página de trás continua interativa.
ArchitectureArquitetura
Only one item opens at a time because the details share a name.Só um item abre por vez porque os details compartilham um nome.
MotionMovimento
The height animates from zero to its content with no measured values.A altura anima de zero até o conteúdo, sem valores medidos.
FallbackFallback
Where unsupported, the panel opens and closes instantly and stays fully usable.Onde não há suporte, o painel abre e fecha instantaneamente e continua totalmente utilizável.
CodeCódigo
:root { interpolate-size: allow-keywords; }
details::details-content { block-size: 0; overflow: clip;
transition: block-size .4s, content-visibility .4s allow-discrete; }
details[open]::details-content { block-size: auto; }
.panel[popover] { transition: opacity .3s, transform .3s, overlay .3s allow-discrete, display .3s allow-discrete; }
.panel:popover-open { opacity: 1; }
@starting-style { .panel:popover-open { opacity: 0; } }Both techniques are Chromium-first (Chrome 131 and later for the accordion). Check support before relying on them.As duas técnicas são Chromium primeiro (Chrome 131 ou superior para o acordeão). Verifique o suporte antes de depender delas.
Pages that change like scenes.Páginas que mudam como cenas.
Navigating between pages uses the browser's View Transitions. One attribute on <html> picks the preset, and this site uses velora, diagonal blinds on the Cut angle. No script runs to animate it.A navegação entre páginas usa as View Transitions do navegador. Um atributo em <html> escolhe o preset, e este site usa velora, persianas diagonais no ângulo do Cut. Nenhum script roda para animar.
| PresetPreset | SignatureAssinatura | Duration (old / new)Duração (saída / entrada) | StatusStatus |
|---|---|---|---|
velora | Diagonal blinds open on the Cut angle (--vl-cut-angle, --vl-vt-slice)Persianas diagonais se abrem no ângulo do Cut (--vl-cut-angle, --vl-vt-slice) | 0.7s | Default · ExperimentalPadrão · Experimental |
wipe | Vertical clip-path curtainCortina vertical com clip-path | 0.5 / 0.55s | In the distributionNa distribuição |
glide | Horizontal slide, 8%Slide horizontal, 8% | 0.48 / 0.52s | In the distributionNa distribuição |
iris | Circular reveal from the centreRevelação circular a partir do centro | 0.55 / 0.6s | In the distributionNa distribuição |
cinema | Blur, inset frame and brightness liftBlur, moldura interna e brilho | 0.85 / 0.9s | In the distributionNa distribuição |
snap | Short move with spring easingMovimento curto com easing de mola | 0.35 / 0.4s | In the distributionNa distribuição |
CodeCódigo
<html vl-page-transition="velora">
<!-- omit the attribute for the Velora default preset -->
<!-- shared elements keep one name across pages -->
<a class="vl-vt-shared-brand">…</a>
<nav class="vl-vt-shared-nav">…</nav>- Shared classesClasses compartilhadas
vl-vt-shared-hero-media-nav-brand-card - Needs a browser with cross-document View Transitions. Elsewhere navigation is instant.Requer um navegador com View Transitions entre documentos. Nos demais, a navegação é instantânea.
- Reduced motion shortens every transition to 0.12s, linear.Movimento reduzido encurta toda transição para 0,12 s, linear.
- Not in scope single-page transitions need JavaScript, so they are not zero-runtime and stay outside the core contract.Fora do escopo transições em página única precisam de JavaScript, então não são zero-runtime e ficam fora do contrato do core.
Some things never leave.Algumas coisas nunca saem.
Header, side navigation, a player or a dock should not fade out and back in on every page. Give them a persistence class: the browser captures them as their own layer, so only the page content runs the transition while they stay put.Cabeçalho, navegação lateral, um player ou um dock não devem sumir e voltar a cada página. Dê a eles uma classe de persistência: o navegador os captura como camada própria, então só o conteúdo da página roda a transição enquanto eles ficam no lugar.
| ClassClasse | RegionRegião |
|---|---|
vl-vt-persist-header | Site headerCabeçalho do site |
vl-vt-persist-sidebar | Side navigationNavegação lateral |
vl-vt-persist-dock | Bottom dock or toolbarDock ou barra de ferramentas inferior |
vl-vt-persist-player | Media playerPlayer de mídia |
vl-vt-persist-footer | Footer that must not moveRodapé que não deve se mover |
- Rule use one class per region, once per page, and keep the same position and size on every page.Regra use uma classe por região, uma vez por página, e mantenha a mesma posição e tamanho em todas as páginas.
- What it is a visual guarantee: the region is not cross-faded. It is not the same DOM node, so open menus and focus reset on navigation.O que é uma garantia visual: a região não faz crossfade. Não é o mesmo nó do DOM, então menus abertos e foco são reiniciados na navegação.
- True no-reload needs single-page routing with JavaScript, which stays outside the zero-runtime core.Sem recarregar de verdade exige roteamento de página única com JavaScript, que fica fora do core zero-runtime.
- Fallback browsers without cross-document view transitions navigate normally.Fallback navegadores sem view transitions entre documentos navegam normalmente.