Motion Effects
Prefer channels v2: vl-enter, vl-scroll, vl-hover, etc.vl-effect remains a legacy/composite escape hatch. All motion is CSS-only — zero animation runtime JavaScript. See Attribute Reference.
Generated registry · Oct 18, 2026
base (3) · effect (46) · enter (26) · exit (4) · hover (7) · loop (24) · page transition (5) · scene (5) · scroll (19) · state (5)
Full searchable registry:Showcase catalog· source packages/catalog/ via pnpm generate:catalog
How channels work
Scroll inside the frame to trigger view-linked motion. Use Replay to run again.
Channel-first
Prefer vl-enter, vl-scroll, vl-hover — not legacy vl-effect
vl-enter="fade-up" vl-timeline="view"Pick the channel that owns the behavior, then add vl-timeline when you need a progress model:
<!-- Entrance (preferred) -->
<h1 vl-enter="fade-up">Heading</h1>
<!-- Viewport-gated enter -->
<div vl-in-view>
<p vl-enter="fade-up" vl-timeline="view">Content</p>
</div>
<!-- Scroll-linked -->
<img vl-scroll="media-zoom" vl-timeline="view" alt="" />
<!-- Legacy composite (avoid for new work) -->
<div vl-effect="blur-in" vl-timeline="view">…</div>Entrance presets (vl-enter)
26 presets from the generated catalog (Oct 18, 2026). Prefer channels for new markup — not legacy vl-effect.
Affect the element itself. Best combined with vl-timeline="view" for scroll-driven reveals.
| Value | Status | Reduced motion |
|---|---|---|
3d-entry | stable | static |
blur-in | stable | static |
blur-lift | stable | static |
clip-rise | stable | static |
cut-reveal | experimental | static |
depth-enter | stable | static |
fade-down | stable | static |
fade-in | stable | static |
fade-up | stable | static |
flow-in | stable | static |
focus | stable | static |
glide-in | stable | static |
mask-sweep | stable | static |
pop-in | stable | static |
reveal-3d | stable | static |
reveal-cinematic | stable | static |
rise-3d | stable | static |
scale-in | stable | static |
slide-left | stable | static |
slide-right | stable | static |
spring-3d | stable | static |
text-reveal | stable | static |
text-reveal-down | stable | static |
text-reveal-up | stable | static |
tilt-in | stable | static |
unfold | stable | static |
CSS Variable Hooks (Entrance)
<div
vl-effect="fade-up"
style="
--vl-motion-duration: 600ms; /* override speed */
--vl-motion-distance: 2rem; /* override travel distance */
--vl-motion-ease: var(--vl-ease-spring); /* override easing */
">
Custom entrance
</div>Live Demo — entrance
Scroll inside the frame to trigger view-linked motion. Use Replay to run again.
Opacity + translate Y.
Cinematic blur dissolve.
Perspective rotateX entry.
vl-enter="fade-up|blur-in|reveal-3d" vl-timeline="view"Interaction presets (vl-hover)
Applied via vl-hover on interactive elements — no timeline needed.7 presets in the generated catalog.
Lift + shadow
Primary glow ring
vl-hover="hover-lift"| Value | Status | Reduced motion |
|---|---|---|
border-trace | stable | static |
gradient-sweep | stable | static |
hover-glow | stable | static |
hover-lift | stable | static |
hover-slice | experimental | static |
icon-shift | stable | static |
underline-expand | stable | static |
<!-- hover-lift on a card -->
<div class="vl-card" vl-effect="hover-lift">
Hover me
</div>
<!-- underline-expand on a nav link -->
<a href="/about" vl-effect="underline-expand">About</a>
<!-- icon-shift on a CTA -->
<a href="/docs" vl-effect="icon-shift">
Read the docs
<svg aria-hidden="true"><!-- arrow icon --></svg>
</a>Touch devices: Hover effects automatically disable via @media (hover: none).
Scroll presets (vl-scroll)
Scroll-linked transforms. 19 presets — usually paired with vl-timeline="view" unless the preset is inherently scroll-driven.
| Value | Status | Reduced motion |
|---|---|---|
cinema-zoom | stable | static |
crossfade | stable | static |
defocus | experimental | static |
depth-drift | stable | static |
depth-push | stable | static |
ink-scrub | experimental | static |
letterbox | experimental | static |
media-zoom | stable | static |
parallax | stable | static |
path | stable | static |
refocus | experimental | static |
reveal | stable | static |
ring-scroll | experimental | static |
rotate-scroll | stable | static |
scroll-horizontal | stable | static |
scroll-marquee | stable | static |
scroll-scale | stable | static |
text-highlight | stable | static |
text-scrub | experimental | static |
Loop presets (vl-loop / vl-loop-effect)
Continuous ambient motion. 0 presets — loops stop under prefers-reduced-motion.
| Value | Status | Reduced motion |
|---|
State Effects
Used with toggled elements like accordions, drawers, and panels. Typically paired with[open], a class toggle, or :checked:
| Value | Description |
|---|---|
accordion | Height + opacity transition for disclosure panels. Use with interpolate-size: allow-keywords (included in Velora reset). |
drawer | Transform + opacity + visibility transition with transition-behavior: allow-discrete. |
panel-swap | Opacity + quick transform for tab panel swaps. |
<!-- Use the .vl-accordion component for a complete implementation -->
<details class="vl-accordion">
<summary>Question</summary>
<div class="vl-accordion__content">Answer text</div>
</details>Continuous / Ambient Effects
See the generated loop preset table above. Examples below use legacy vl-effect — prefer vl-loop / vl-loop-effect for new markup.
<!-- Floating hero illustration -->
<img src="hero-visual.png" alt="" vl-effect="float" />
<!-- Breathing glow on a live badge -->
<span class="vl-badge" vl-effect="glow-breathe">Live</span>
<!-- Shimmer skeleton -->
<div
vl-effect="shimmer"
style="
height: 1rem;
border-radius: var(--vl-radius-md);
background: linear-gradient(
90deg,
var(--vl-bg-surface-elevated) 0%,
var(--vl-bg-surface) 50%,
var(--vl-bg-surface-elevated) 100%
);
background-size: 200% auto;
">
</div>Text Reveal Effects
Clip-path-based reveals designed for headlines. Apply to heading elements for editorial impact.
| Value | Direction | Description |
|---|---|---|
text-reveal | Left → right | Horizontal clip sweep across text |
text-reveal-up | Bottom → top | Text rises up from a clipped baseline |
text-reveal-down | Top → bottom | Text falls into view from above |
<h1 vl-effect="text-reveal-up" vl-timeline="view">
Premium interfaces start here
</h1>Cinema / Scroll Effects
These effects use animation-timeline: view(block) internally. They are inherently scroll-driven and do not need vl-timeline="view" added separately.
| Value | Range | Description |
|---|---|---|
cinema-zoom | entry 0% exit 100% | Slow zoom + focus shift tied to scroll position. Ken Burns feel for hero images. |
parallax | cover | Vertical parallax shift as element scrolls through viewport. |
typewriter | N/A (time-based) | CSS typewriter effect with blinking caret. Configure with --vl-type-duration and --vl-type-steps. |
<!-- Cinema zoom on a hero image -->
<img src="hero.jpg" alt="Hero" vl-effect="cinema-zoom" />
<!-- Parallax section background -->
<div vl-effect="parallax">
<img src="bg.jpg" alt="" />
</div>
<!-- Typewriter with custom timing -->
<p
vl-effect="typewriter"
style="--vl-type-duration: 3s; --vl-type-steps: 40;">
Building the future of motion design.
</p>Speed Modifier
Override the animation duration category with vl-speed:
<div vl-effect="fade-up" vl-speed="fast">Quick reveal</div>
<div vl-effect="flow-in" vl-speed="slow">Slow dramatic reveal</div>| Value | Duration |
|---|---|
fast | --vl-duration-fast (150ms) |
normal | --vl-duration-normal (300ms) |
slow | --vl-duration-slow (500ms) |
Depth Modifier
Control the translation distance with vl-depth:
<div vl-effect="fade-up" vl-depth="1">Subtle — 0.75rem travel</div>
<div vl-effect="fade-up" vl-depth="4">Dramatic — 4rem travel</div>| Value | --vl-motion-distance |
|---|---|
1 | 0.75rem |
2 | 1.5rem |
3 | 2.5rem |
4 | 4rem |
Accessibility
All vl-effect animations automatically disable via:
@media (prefers-reduced-motion: reduce) {
[vl-effect] {
animation: none !important;
}
}Interaction effects (hover-lift, hover-glow) also disable on touch devices via @media (hover: none).
Browser Support
Entrance, interaction, state, and continuous effects work in all modern browsers (Chrome 89+, Firefox 90+, Safari 15+).
Scroll-driven effects (cinema-zoom, parallax, vl-timeline="view") require Chrome 115+ / Edge 115+. A graceful fallback is included via@supports not (animation-timeline: view(block)) — these elements simply appear in their final state on unsupported browsers.