Same grammar.Mesma gramática.
Styled with this site's tokens.Estilizado com os tokens deste site.
Velora's motion core does not own your look. It also respects people who do not want motion. Live demos with Tailwind and plain CSS, what it weighs, how fast it runs, then the package surface and a real site.O motion core do Velora não é dono do seu visual. Ele também respeita quem não quer movimento. Demos ao vivo com Tailwind e CSS puro, quanto pesa, quão rápido roda, depois a superfície do pacote e um site real.

Both cards use the same vl-* attributes. One is styled like this site. The other uses plain utility-style CSS with a different palette and shape. The motion does not change.Os dois cartões usam os mesmos atributos vl-*. Um é estilizado como este site. O outro usa CSS puro estilo utilitário, com outra paleta e forma. O movimento não muda.
Styled with this site's tokens.Estilizado com os tokens deste site.
Styled with unrelated CSS: rounded, colored, serif.Estilizado com CSS alheio: arredondado, colorido, serifado.
<article class="your-card" vl-enter="fade-up">
<h3 vl-enter="text-reveal-up">Same grammar.</h3>
</article>This panel is built with real Tailwind utility classes, compiled for this page without Tailwind's reset. The motion on it is only vl-* attributes. No class names collide and no script runs.Este painel é construído com classes utilitárias reais do Tailwind, compiladas para esta página sem o reset do Tailwind. O movimento nele são apenas atributos vl-*. Nenhum nome de classe colide e nenhum script roda.
Tailwind hostHost Tailwind
Layout is Tailwind.O layout é Tailwind.
Color is Tailwind.A cor é Tailwind.
Motion is Velora.O movimento é Velora.
<!-- Tailwind owns look. Velora owns motion. -->
<link rel="stylesheet" href="tailwind.css"> <!-- your utilities -->
<link rel="stylesheet" href="@veloracss.io/css/motion-core"> <!-- motion only -->
<h3 class="text-3xl font-semibold" vl-enter="text-reveal-up">…</h3>
<div class="grid gap-3 sm:grid-cols-3" vl-children="cascade" vl-stagger="120ms">
<article class="rounded-xl bg-zinc-900 p-4 ring-1 ring-zinc-800"
vl-hover="hover-lift">…</article>
</div>Minified, then gzip. Velora ships CSS, so there is nothing to parse as a script and no runtime to start. The scroll library is shown for scale only: it is a general engine, and Velora's number includes the whole attribute catalog.Minificado, depois gzip. O Velora entrega CSS, então não há nada para interpretar como script nem runtime para iniciar. A biblioteca de scroll aparece só como escala: é um motor geral, e o número do Velora inclui todo o catálogo de atributos.
Brotli: motion-core 15.4 kB, core + extended 21.9 kB, full 41.7 kB, GSAP + ScrollTrigger 40.0 kB. Built with esbuild from packages/css/src.Brotli: motion-core 15,4 kB, core + extended 21,9 kB, completo 41,7 kB, GSAP + ScrollTrigger 40,0 kB. Gerado com esbuild a partir de packages/css/src.
The same job twice: 60 cards that fade up as they reach the viewport, on a 390 px screen. One page uses vl-enter, the other GSAP with ScrollTrigger. Median of 5 runs in Chromium 141 on one machine, unthrottled and with the CPU slowed 4×.O mesmo trabalho duas vezes: 60 cartões que sobem com fade ao chegar na viewport, numa tela de 390 px. Uma página usa vl-enter, a outra GSAP com ScrollTrigger. Mediana de 5 execuções no Chromium 141 em uma máquina, sem limitação e com a CPU 4× mais lenta.
| PagePágina | CPUCPU | Ready (DOMContentLoaded)Pronto (DOMContentLoaded) | Script run on loadScript na carga | Main-thread work while scrollingTrabalho da thread principal durante a rolagem |
|---|---|---|---|---|
| No motion (baseline)Sem movimento (linha de base) | 1× | 17 ms | 0 ms | 323 ms |
| Velora | 1× | 19 ms | 0 ms | 370 ms |
| GSAP + ScrollTrigger | 1× | 100 ms | 49 ms | 592 ms |
| No motion (baseline)Sem movimento (linha de base) | 4× | 103 ms | 0 ms | 1218 ms |
| Velora | 4× | 77 ms | 0.2 ms | 1417 ms |
| GSAP + ScrollTrigger | 4× | 409 ms | 224 ms | 2455 ms |
Limits: one scenario on one machine over localhost, so network time is not measured (see weight above). Velora had one long task at 4× while the stylesheet was parsed; GSAP had two. This says nothing about other scenes, other machines or real phones. The table is a single run; repeated runs varied widely, so read it as one sample, not a benchmark.Limites: um cenário em uma máquina via localhost, então o tempo de rede não é medido (veja o peso acima). O Velora teve uma tarefa longa a 4× enquanto a folha de estilo era interpretada; o GSAP teve duas. Isso não diz nada sobre outras cenas, outras máquinas ou celulares reais. A tabela é uma única rodada; repetições variaram muito, então leia como uma amostra, não como benchmark.
<!-- Velora page: stylesheet only, no script -->
<link rel="stylesheet" href="motion-core.min.css">
<article class="c" vl-enter="fade-up">…</article> <!-- ×60 -->
<!-- Script page: same cards -->
<script src="gsap.min.js"></script><script src="ScrollTrigger.min.js"></script>
<script>
gsap.registerPlugin(ScrollTrigger);
document.querySelectorAll(".c").forEach(c =>
gsap.from(c, { opacity: 0, y: 24, duration: .6, ease: "power2.out",
scrollTrigger: { trigger: c, start: "top 85%" } }));
</script>Only what the measurements above support, plus what follows from how Velora is built.Apenas o que as medições acima sustentam, mais o que decorre de como o Velora é construído.
Under prefers-reduced-motion the core stops enter, exit and loop motion, and authors can force a resting state with vl-motion="still". This site also holds every scroll-linked channel still. Both squares carry the same loop. The right one sits still.Sob prefers-reduced-motion o core interrompe o movimento de entrada, saída e loop, e autores podem forçar um estado de repouso com vl-motion="still". Este site também mantém parado todo canal ligado à rolagem. Os dois quadrados carregam o mesmo loop. O da direita fica parado.
Looping motion is continuous. Use it sparingly and keep it off body text.Movimento em loop é contínuo. Use com moderação e não aplique em texto corrido.
Contrast ratios below were computed from this site's own colour tokens in Chromium, in light and dark. The keyboard check tabbed through every page. What was not tested is listed at the end.As razões de contraste abaixo foram calculadas a partir dos tokens de cor deste site no Chromium, em claro e escuro. A checagem de teclado percorreu todas as páginas com Tab. O que não foi testado está listado no fim.
| PairPar | LightClaro | DarkEscuro | ResultResultado |
|---|---|---|---|
| Body text on backgroundTexto do corpo sobre o fundo | 15.22 : 1 | 16.09 : 1 | AA passPassa AA |
| Body text on surfaceTexto do corpo sobre a superfície | 16.59 : 1 | 15.04 : 1 | AA passPassa AA |
| Muted text on backgroundTexto suave sobre o fundo | 5.79 : 1 | 6.93 : 1 | AA passPassa AA |
| Muted text on surfaceTexto suave sobre a superfície | 6.32 : 1 | 6.48 : 1 | AA passPassa AA |
| Accent on backgroundDestaque sobre o fundo | 4.99 : 1 | 8.64 : 1 | AA passPassa AA |
| Hairline borders on backgroundFiletes sobre o fundo | 1.51 : 1 | 1.97 : 1 | Decorative, below 3 : 1Decorativo, abaixo de 3 : 1 |
AA for text is 4.5 : 1. Hairlines separate areas but never carry meaning alone, since controls also change fill or show a ring.AA para texto é 4,5 : 1. Os filetes separam áreas mas nunca carregam significado sozinhos, já que os controles também mudam o preenchimento ou mostram um anel.
vl-motion="still" forces the resting state for a subtree.vl-motion="still" força o estado de repouso para uma subárvore.<a class="vl-skip-link" href="#top">Skip to content</a>
<main id="top">…</main>
:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }Entry points of the @veloracss.io/css package on npm (npm install @veloracss.io/css). Pick the smallest one that fits your interface.Pontos de entrada do pacote @veloracss.io/css no npm (npm install @veloracss.io/css). Escolha o menor que serve à sua interface.
| Entry pointPonto de entrada | RoleFunção |
|---|---|
@veloracss.io/css | Full bundlePacote completo |
@veloracss.io/css/base | Base layerCamada base |
@veloracss.io/css/motion-core | Host-agnostic motionMovimento independente de host |
@veloracss.io/css/motion-extended | Extended motion recipesReceitas de movimento estendidas |
@veloracss.io/css/theme | Optional Skins and theme layerSkins opcionais e camada de tema |
@veloracss.io/css/components-core | Core componentsComponentes do core |
@veloracss.io/css/transitions | Page transition stylesEstilos de transição de página |
@veloracss.io/css/premium | Additional visual stylesEstilos visuais adicionais |
@veloracss.io/css/overrides | Override layerCamada de overrides |
@veloracss.io/css/full | Alias of the full bundleAlias do pacote completo |
SKIF Brasil runs Velora on WordPress with a custom plugin.A SKIF Brasil roda o Velora em WordPress com um plugin próprio.