Developer documentation

Orravo FX v3.0.0

A vanilla-JS animation engine for WordPress. 22 modules across reveal, pointer, type, background, navigation, decoration, and utility packs. Around 8KB gzipped. IntersectionObserver, requestAnimationFrame, GPU transforms. prefers-reduced-motion aware.

WordPress plugin No database tables GPL-2.0+ Free forever v3.0.0 · stable
01 · Overview

What Orravo FX does

Drop a data-orv-fx="<module>" attribute on any element. The engine wires up the right behaviour. There are 22 built-in modules covering scroll-reveal, parallax, sticky-media scrollytelling, count-up, marquee, magnetic cursor, image compare, lazy Lottie, and 14 more. No jQuery. No GSAP. No build step.

📐
22 modules, 7 packs
Reveal, pointer, type, background, navigation, decoration, utility. Each module is independently toggleable from the admin.
~8KB gzipped engine
Lite build is around 8KB; full build with all modules is around 14KB. Conditional load can shrink that further per page.
🧠
Reduced-motion aware
Modules either skip animation entirely or fall back to a fade-only path when prefers-reduced-motion is requested.
🎯
IntersectionObserver based
No scroll listeners. No layout thrashing. Modules pause when the host scrolls off-screen or the tab is hidden.
🧩
Open module API
Register a third-party module with Orv_FX_Modules::register(). The engine treats it like a core module.
🔌
REST + WP-CLI
REST endpoints for engine and module config. WP-CLI commands for site audits and module management.
🛡️
CSP-strict mode
Refuses inline injection when csp_strict is on. Everything goes through enqueued bundles.
🪶
No database tables
All settings live in the orravo_fx_settings option. Nothing else to clean up at uninstall.
02 · Installation

Get it on your site

Standard WordPress plugin install. PHP 8.0+, WordPress 6.0+. No external services, no API keys.

1
Download orravo-fx-3.0.0.zip from the Orravo plugins page.
2
In the WP admin, go to Plugins → Add New → Upload Plugin, choose the zip, click Install.
3
Activate Orravo FX. A new top-level Orravo FX menu appears in the sidebar.
4
Open the new menu. The Overview tab shows engine status, asset paths, and quick toggles for every module.
Already shipping a different motion library? Orravo FX coexists peacefully. There are no global symbol collisions; the engine only owns the OrvFX namespace and listens for the orv-fx:* custom events.
03 · Quick Start

Your first three modules

Open any post or page in Gutenberg, switch a paragraph block to the Code Editor view, and paste this. Save, view the page, scroll.

html<h2 data-orv-fx="text-split" data-orv-ts-by="word" data-orv-ts-stagger="80">Each word lands in turn.</h2>

<p data-orv-fx="scroll-reveal">This paragraph fades and slides up as it enters the viewport.</p>

<div data-orv-fx="count-up">
  We have shipped <span data-orv-cu-to="14820">0</span> events this season.
</div>
Every module attribute is namespaced under data-orv-*. There are no inline scripts, no shortcodes, and no Gutenberg block dependencies. Plain HTML, anywhere it can render.
04 · Reveal pack

Scroll Reveal

Fades and slides children into view as the host enters the viewport. Optional per-child stagger.

AttributeTypeDefaultNotes
data-orv-fx="scroll-reveal"triggerrequiredopts the host element in
data-orv-sr-staggernumber0per-child delay multiplier (0 = no stagger)
data-orv-sr-distancepx32vertical slide distance
data-orv-sr-durationms700animation duration
html<div data-orv-fx="scroll-reveal" data-orv-sr-stagger="2">
  <h2>Lead</h2>
  <p>Each child fades in 120ms after the previous one.</p>
  <a href="/cta">Read the case study</a>
</div>
05 · Reveal pack

Reveal Blur

Same trigger as Scroll Reveal, with a frosted-glass filter:blur drop. Use sparingly; blur is a compositing op.

html<h1 data-orv-fx="reveal-blur">Hero appears from a blur</h1>
06 · Reveal pack

Sticky Media

Apple-style scrollytelling. A pinned media slot crossfades as panels enter view.

AttributeWhereNotes
data-orv-fx="sticky-media"section rootopts the section in
data-orv-stk-targetmedia childthe element that gets pinned and crossfaded
data-orv-stk-imgpanel childrenimage URL to swap into the target on entry
07 · Reveal pack

SVG Line Draw

Animates SVG strokes from undrawn to drawn when the element scrolls into view. Uses stroke-dasharray + stroke-dashoffset.

html<div data-orv-fx="svg-line-draw" data-orv-sld-dur="1400">
  <svg viewBox="0 0 100 100">
    <path d="M10 50 Q50 10 90 50 T170 50" stroke="#000" fill="none" stroke-width="2"/>
  </svg>
</div>
08 · Background pack

Parallax Layers

Multi-speed layered parallax inside a container. rAF-throttled. Speeds expressed in vh per scroll unit.

AttributeWhereNotes
data-orv-fx="parallax-layers"containeropts the container in
data-orv-px-speedeach childsigned number; negative drifts up, positive drifts down
09 · Background pack

Particles Background

Lightweight canvas particle field that fills the host. Pauses when off-screen.

AttributeTypeNotes
data-orv-pb-countnumberparticles per host
data-orv-pb-colorcolorRGBA preferred for low-opacity dust
data-orv-pb-speednumberdrift speed multiplier
10 · Background pack

Hover Glow

Cursor-following spotlight gradient inside the host. Updates two CSS variables on mousemove. No canvas, no rAF.

html<div data-orv-fx="hover-glow" data-orv-hg-color="rgba(255,106,43,.4)" data-orv-hg-radius="320">
  Hover me
</div>
11 · Type pack

Count Up

Numeric counters animate from zero on first viewport entry. Suffixes preserved (%, $, K, M).

AttributeTypeDefaultNotes
data-orv-cu-tostringrequiredfinal value, suffix and prefix preserved
data-orv-cu-durms1200animation duration
data-orv-cu-easingenumout-cubiclinear / out-cubic / out-expo
12 · Type pack

Text Split

Wraps text in per-word or per-letter spans and reveals them on scroll with a stagger.

html<h2 data-orv-fx="text-split" data-orv-ts-by="word" data-orv-ts-stagger="80">
  Hello kinetic web
</h2>
13 · Type pack

Kinetic Typography

Headlines scale based on viewport position: largest at the centre, smallest at the edges.

AttributeTypeNotes
data-orv-kt-minnumberminimum scale (e.g. 0.85)
data-orv-kt-maxnumbermaximum scale (e.g. 1.15)
14 · Type pack

Text Shimmer

A soft highlight loops across the text via background-clip:text. Pairs well with kinetic typography for hero blocks.

15 · Type pack

Text Cycle

Rotates through child elements at an interval, fading between them. Great for "We make X. We make Y." hero patterns.

html<span data-orv-fx="text-cycle" data-orv-tc-dur="2400">
  <span>fast</span>
  <span>simple</span>
  <span>quiet</span>
</span>
16 · Pointer pack

Magnetic Cursor

Element drifts toward the cursor when nearby. Opt-in via dedicated attribute. No-op on touch devices.

AttributeTypeDefault
data-orv-magflagopts in
data-orv-mag-strengthnumber 0 to 10.3
17 · Pointer pack

Tilt

Pointer-tracked 3D card tilt. Configurable max rotation and perspective.

AttributeTypeDefault
data-orv-tilt-maxdeg12
data-orv-tilt-persppx800
18 · Pointer pack

Cursor Trail

A small eased dot follows the cursor inside the host element. Pointer-only; no-ops on touch.

19 · Decoration pack

Marquee + Rich Marquee

Infinitely scrolling text or logo strip. Pauses on hover and on focus. Speed is set via the --orv-fx-mq-speed custom property. Rich Marquee adds an edge-fade mask and auto-cloning.

html<div data-orv-fx="marquee" style="--orv-fx-mq-speed:30s">
  <div class="orv-fx-mq__track">
    <span>Free shipping</span>
    <span>30-day returns</span>
    <span>Made in Lagos</span>
  </div>
</div>
20 · Utility pack

Image Compare

Before/after slider with a keyboard-accessible drag handle. Arrow keys move the divider; Home and End jump to extremes.

ClassWhere
.orv-fx-icroot, also takes data-orv-fx="image-compare"
.orv-fx-ic__beforebefore image wrapper
.orv-fx-ic__afterafter image wrapper
.orv-fx-ic__handledraggable divider
21 · Decoration pack

Lazy Lottie

Lazy-loads lottie-web from a CDN only when the host scrolls into view. Zero cost on pages that do not use the module.

AttributeTypeNotes
data-orv-lt-urlurlJSON animation file
data-orv-lt-loop0/1looping playback
data-orv-lt-autoplay0/1play on load
data-orv-lt-onscroll0/1defer fetch until viewport entry
data-orv-lt-static0/1render first frame only, no playback
22 · Decoration pack

Confetti Burst

DOM-particle confetti on click, on scroll, or via programmatic trigger.

AttributeTypeNotes
data-orv-cb-triggerenumclick / scroll / manual
data-orv-cb-countnumberparticles per burst
23 · Navigation pack

Section Anchors

Smooth-scrolls in-page anchor links inside the host with a configurable header offset, then writes the hash to the URL.

html<nav data-orv-fx="section-anchors" data-orv-sa-offset="-80">
  <a href="#chapter-1">Chapter 1</a>
  <a href="#chapter-2">Chapter 2</a>
</nav>
24 · Navigation pack

Page Transitions

Fades the page on first paint and on internal-link clicks. Uses the View Transitions API where supported, falls back to an opacity fade.

25 · Navigation pack

Focus Trail

A traveling outline that follows keyboard focus through descendants of the host. Helps keyboard users keep their place.

26 · Engine

prefers-reduced-motion handling

The engine reads the OS-level prefers-reduced-motion setting on boot. Modules respond in one of two ways: full skip (parallax, marquee, particles, kinetic) or fade-only fallback (scroll-reveal, text-split, sticky-media).

You can override per site in Settings. Set reduced_motion_override to auto (respect OS), force-on (suppress all motion regardless of OS), or force-off (always animate, ignore OS). Default is auto.

Forcing motion off is rarely the right call. The OS-level setting reflects an explicit user preference; overriding it can cause real harm to vestibular-disorder users. The force-off option exists for staging environments and demos only.
27 · Engine

Performance notes

Bundle size, GPU usage, and the rules the engine follows to stay invisible.

  • Bundle size: lite build is ~8KB gzipped, full build is ~14KB. Conditional load (Settings) drops the engine entirely on pages that do not use it.
  • GPU transforms only: all motion uses transform and opacity. No animating top, left, width, or height.
  • IntersectionObserver: no scroll listeners on window. Hosts that scroll off-screen pause their work.
  • requestAnimationFrame throttling: parallax, count-up, and tilt all batch updates to a single rAF tick per frame.
  • Tab-hidden pause: the engine listens for visibilitychange and pauses canvas-based modules (particles, cursor trail) when the tab is backgrounded.
  • Loading strategy: Settings → loading_strategy = monolithic (one engine.js) or per-module (each module is its own lazy chunk fetched on first match).
28 · Engine

Custom events

The engine emits four custom events on window or on the element. Wire them to analytics, error reporting, or your test harness.

EventTargetDetail
orv-fx:readywindowfires after the engine completes its first DOM scan
orv-fx:module-initelementper-module init; detail contains module + el
orv-fx:module-errorwindowfires when a module throws during init
orv-fx:module-load-failedwindowfires when a lazy-loaded module bundle 404s
jswindow.addEventListener('orv-fx:ready', () => {
  console.log('[orv-fx] booted, first scan complete');
});

document.addEventListener('orv-fx:module-init', (ev) => {
  const { module, el } = ev.detail;
  sendBeacon('/track/fx-init', { module, path: location.pathname });
}, true);

window.addEventListener('orv-fx:module-load-failed', (ev) => {
  console.error('[orv-fx] module 404', ev.detail);
});
29 · Reference

Settings reference

Every key in the orravo_fx_settings option, with its default and what it does.

KeyDefaultNotes
modules_enabledall trueper-module on/off map
enabled_packsall trueper-pack toggle (reveal, pointer, type, background, navigation, decoration, utility)
defer_scripttrueadd defer attribute to engine bundle
force_disablefalsekill switch; engine does not load anywhere
debugfalseverbose engine logging to console
reduced_motion_overrideautoauto / force-on / force-off
delete_on_uninstallfalseremove the option row at uninstall
conditional_loadfalseonly enqueue on pages that use a data-orv-fx attribute
loading_strategymonolithicmonolithic / per-module
designer_modefalsevisual editor highlights for active modules
csp_strictfalserefuse inline injection
prefer_css_scrollfalseprefer CSS scroll-timeline where supported
30 · Reference

Frequently asked

Is this another GSAP wrapper?
No. Every module is hand-written vanilla JS using IntersectionObserver, requestAnimationFrame, and CSS transforms. No GSAP, no anime.js, no third-party animation library. The only optional external dependency is lottie-web, lazy-loaded from a CDN only when the Lottie module finds an element to mount.
How do I disable a module I don't use?
In the WP admin, open Orravo FX → Modules. Toggle the module off. With conditional_load on (Settings tab), disabled modules are not even shipped in the engine bundle on pages that do not use them.
Can I add my own module?
Yes. From any plugin or mu-plugin call Orv_FX_Modules::register('my-fx', [...]) with your meta. The engine treats third-party modules identically to core ones; they appear in the admin, they get the same lifecycle hooks, they emit the same custom events.
What happens at uninstall?
If delete_on_uninstall is true (Settings), the orravo_fx_settings option is removed. Otherwise the option stays in place so a reinstall picks up exactly where you left off. There are no custom database tables to clean up.
Does it work with page builders (Elementor, Bricks, Divi)?
Yes. Every module is a plain HTML data attribute. Add data-orv-fx="..." to any element via the builder's custom attributes panel. No widget, no shortcode, no integration shim required.
What if my CSP forbids inline scripts?
Set csp_strict = true in Settings. The engine then refuses to inject inline styles or scripts; everything goes through the enqueued bundle. Page Transitions module degrades gracefully on CSP-strict pages where the View Transitions API would otherwise need a small inline shim.
31 · Reference

Changelog

v3.0.0
2026-05 · stable
  • Module API: Orv_FX_Modules::register() for first-class third-party modules
  • Module aliases: rename modules without breaking existing markup
  • Per-pack toggles in admin (reveal, pointer, type, background, navigation, decoration, utility)
  • Loading strategy switch: monolithic engine.js or per-module lazy chunks
  • CSP-strict mode
  • Conditional load: skip the bundle entirely on pages with no data-orv-fx attributes
  • Designer mode: visual highlights in the editor for active modules
  • WP-CLI: wp orv-fx audit, wp orv-fx modules
  • REST API for engine + module config
  • Site Health integration: dependency graph, broken-requires detector
  • Customizer integration for per-template overrides
  • Page Transitions module (View Transitions API + fade fallback)
  • Section Anchors module (smooth-scroll + URL hash)
  • Focus Trail module
  • Text Shimmer, Text Cycle, Reveal Blur, Rich Marquee modules
  • Confetti Burst module
  • Particles Background, Hover Glow, Cursor Trail modules
  • Kinetic Typography module
  • Engine events: orv-fx:ready, orv-fx:module-init, orv-fx:module-error, orv-fx:module-load-failed
✦ Need help?

Got a question about Orravo FX?

Reach out directly. Kenneth replies within 24 hours.