Declarative web animation

CSS animations using HTML attributes.

data-kui compiles into real @keyframes and native scroll-driven timelines — no animation loop, no runtime once it's compiled. JavaScript is reserved for the handful of effects that genuinely can't be done any other way: dragging, text splitting, reading scroll position.

Standalone · MIT · zero JS runtime dependency for CSS-rendered effects

Close portrait in monochrome yellow, autumn leaves resting over closed eyes
Portrait in a green jumpsuit against a matching green backdrop, one leg raised

One attribute. One compiled animation.

Author the effect name, timing, and parameters directly on the element. The parser resolves it once against a channel model that keeps unrelated effects from fighting over the same CSS property, then hands the rest to the browser's own compositor.

<h2 data-kui="fade-up 800ms">
  Disjoint channels compose
  without a conflict.
</h2>

Disjoint channels compose without a conflict.

Three things it actually does

tilt-3d

CSS-native

Entrances, 3D tilt, and reveals run as real @keyframes on the compositor thread. They keep running if a script is slow, blocked, or never loads at all.

beam-border

JavaScript only where necessary

Drag, gesture, text-splitting, and scroll-position effects are JS-prepared — every other primitive in the catalog needs none of it.

border-glow

Scroll-driven, not scroll-listened

Pins, parallax, and scrollytelling prefer native animation-timeline: view(), falling back to one shared scheduler rather than a listener per effect.

~237 named effects

from 29 primitives across 15 catalog categories — entrance, scroll mechanics, 3D, text, forms, navigation, gestures, and more.

Text

Astronaut in a white spacesuit helmet, a glowing cyan HUD readout across the visor, blurred string lights behind
Animate.

typewriter

Number

Woman in profile wearing a mirrored wraparound visor, lit in a bold orange-to-red gradient
0 named effects

count-up

Combo · launch countdown

Woman kneeling on a checkered floor wearing a VR headset, arms raised, in a dark studio lit by two strip lights
Launching 237

fade-blur-up + count-down · delayed 500ms

Ship it in two lines.

Standalone, MIT-licensed, framework-agnostic. No product or CMS coupling — drop the two files in and start authoring data-kui attributes.

npm install kuinetic
<script src="./kuinetic.all.js"></script>
<link rel="stylesheet" href="./kuinetic.css">
<script src="./kuinetic.js"></script>
<script>
  kuinetic.kuinetic({ observe: true }).start()
</script>