Skip to content
Velora
Showcase
Truth layer

Compatibility

Support levels come from packages/catalog/compatibility-matrix.json — generated with the preset registry (Oct 18, 2026), not marketing copy.

Registry · 144 presets

Baseline targets: Chrome 124+, Safari 18+, Firefox 128+.Documented targets; verified by Playwright E2E (Chromium, Firefox, WebKit) in CI.

Test here

Scroll inside the frame to trigger view-linked motion. Use Replay to run again.

Reduced motion safe

Enable Reduce motion in OS settings — travel collapses, loops stop

vl-enter="fade-up" vl-timeline="view"

Support levels

LevelMeaning
stableRequired behavior with a documented safe path
progressiveFeature-detected enhancement over a working fallback
experimentalMotion Lab first; never required for the public experience

Execution contract

Future-first, never future-only. HTML attributes express intent; browser features remain implementation details.

  1. baseline: Semantic content, layout and interaction remain usable.
  2. fallback: A supported CSS path preserves the feature intent.
  3. native: The browser executes the most capable standards-based path.
  4. frontier: Experimental syntax is isolated by capability detection.

CSS primitives matrix

Primitive × browser status from the generated matrix. Interactive version lives on the Showcase.

PrimitiveStatusChromeSafariFirefoxDetectionFallbackReduced motion
CSS Animations / TransitionsstablestablestablestablebaselineFinal static styles; content remains visibleDecorative travel collapses and continuous loops stop
@layerstablestablestablestablebaselineDocumented browser baseline; semantic HTML remains usable outside itNot motion-specific
Scroll-driven animationsstablestablestableprogressive@supports (animation-timeline: view())Time-based animation; content visibleScroll-linked travel is removed or reduced to a static final state
view-timeline-name / timeline-scopestablestablestableprogressive@supports (timeline-scope: --vl-probe)Time-based scene clockScene content resolves without scroll-linked travel
@starting-style + allow-discretestablestablestablestable@supports (transition-behavior: allow-discrete)Instant state changeState changes immediately
position: sticky ([vl-stage])stablestablestablestable@supports (position: sticky)Block flowStage remains readable without choreography
:has()progressivestablestablestable@supports selector(:has(*)):hover / :focus-withinState remains available without decorative travel
sibling-index() / sibling-count()progressivestablestableprogressive@supports (animation-delay: calc(1ms * sibling-index()))nth-child lists (≤12 children)Distributed delays collapse
Typed attr()progressiveprogressiveprogressiveprogressive@supports (--vl-probe: attr(data-vl-probe type(<number>)))Enum value fallbacksTyped values cannot override the reduced-motion layer
if()experimentalexperimentalexperimentalunsupported@supports (width: if(style(--vl-probe: 1): 1px; else: 2px))Baseline attribute selectorsBaseline selectors retain reduced-motion overrides
calc-size()progressiveprogressiveprogressiveunsupported@supports (height: calc-size(auto, size))Fixed size expandDisclosure resolves immediately
offset-pathprogressivestablestableprogressive@supports (offset-path: path('M0,0 L1,1'))Static layoutPath travel is removed
::scroll-markerexperimentalexperimentalunsupportedunsupported@supports selector(::scroll-marker)Native scrolling and authored navigation controls remain availableNavigation remains instant and usable
View Transitions API (MPA)stablestablestableunsupported@supports (view-transition-name: none)Instant navigationTransition pseudo-elements animate for effectively zero duration

Where to verify