USAL.js

Ultimate Scroll Animation Library

@usal/react npm package @usal/solid npm package @usal/svelte npm package @usal/vue npm package @usal/lit npm package @usal/angular npm package
9KB
Minified Size
60FPS
Performance
Zero
Dependencies
40+
Animations

Quick Start

CDN

<script src="https://cdn.usal.dev/latest"></script>

NPM

# Install
npm install usal

# Framework-specific packages:
npm install @usal/react
npm install @usal/solid
npm install @usal/svelte
npm install @usal/vue
npm install @usal/lit
npm install @usal/angular

Framework Setup

// Installed via CDN, initializes automatically, instance in window.USAL

// React (Next.js)
import { USALProvider } from '@usal/react';
<USALProvider>{children}</USALProvider>

// Solid (SolidStart)
import { USALProvider } from '@usal/solid';
<USALProvider>{props.children}</USALProvider>

// Svelte (SvelteKit)
import { usal, createUSAL } from '@usal/svelte';
const usalInstance = createUSAL();

// Vue (Nuxt)
export default defineNuxtConfig({
modules: ['@usal/vue/nuxt']

// Lit
import { usal, useUSAL } from '@usal/lit';
const usalInstance = useUSAL();

// Angular
import { USALModule } from '@usal/angular';
@Component({imports: [USALModule]})
export class AppComponent

Basic Animations

Fade Center
fade
Fade Up
fade-u
Fade Down
fade-d
Fade Left
fade-l
Fade Right
fade-r
Fade Up-Left
fade-ul
Fade Up-Right
fade-ur
Fade Down-Left
fade-dl
Fade Down-Right
fade-dr
<div data-usal="fade-u">Fade Up</div>
<div data-usal="fade-dr duration-800">Fade Down-Right</div>

Zoom Animations

ZoomIn Center
zoomin
ZoomIn Up
zoomin-u
ZoomIn Down
zoomin-d
ZoomIn Left
zoomin-l
ZoomIn Right
zoomin-r
ZoomIn Up-Left
zoomin-ul
ZoomIn Up-Right
zoomin-ur
ZoomIn Down-Left
zoomin-dl
ZoomIn Down-Right
zoomin-dr
ZoomOut Center
zoomout
ZoomOut Up
zoomout-u
ZoomOut Down
zoomout-d
ZoomOut Left
zoomout-l
ZoomOut Right
zoomout-r
ZoomOut Up-Left
zoomout-ul
ZoomOut Up-Right
zoomout-ur
ZoomOut Down-Left
zoomout-dl
ZoomOut Down-Right
zoomout-dr
<div data-usal="zoomin">Scale from 60% to 100%</div>
<div data-usal="zoomout-ur blur duration-1200">Complex zoom</div>

Flip Animations

Flip Default
flip
Flip Up
flip-u
Flip Down
flip-d
Flip Left
flip-l
Flip Right
flip-r
Flip Up-Left
flip-ul
Flip Up-Right
flip-ur
Flip Down-Left
flip-dl
Flip Down-Right
flip-dr
<div data-usal="flip-u">3D flip from top</div>
<div data-usal="flip-dr duration-1500">Diagonal flip</div>

Text Split Animations

Each Word Appears Separately

Each Letter Appears Separately

Zoom Out With Blur Per Word

Modern web development is all about smooth user experiences. Dream big, code bigger, animate everything in between.

Fluid Weight Animation

SHIMMER LETTER BY LETTER

<p data-usal="fade-u split-word split-delay-200">Each Word</p>
<p data-usal="fade-u split-letter split-delay-50">Each Letter</p>
<h2 data-usal="text-fluid split-letter duration-2500">Fluid Weight</h2>
<p data-usal="text-shimmer split-letter duration-1000">Shimmer</p>

Count Animations

1234
Users
98.5%
Success Rate
$42,350
Revenue
4.9/5
Rating
<div data-usal="count-[1234] duration-2000">1234</div>
<div data-usal="count-[98.5] duration-2500">98.5%</div>

Modifiers & Options

Once (no repeat)
fade-u once
Linear easing
zoomin linear
Ease easing
flip-r ease
Ease-in easing
fade-d ease-in
Ease-out easing
zoomout ease-out
2s + Blur
fade-ul blur duration-2000
1s delay
flip-d delay-1000
50% threshold
zoomin-r threshold-50
<div data-usal="fade-u once">Animate only once</div>
<div data-usal="zoomin linear">Linear easing</div>
<div data-usal="fade-ul blur duration-2000">With blur</div>

Cards & Timing

Instant Animation

fade-u delay-0 duration-800

200ms Delay

zoomin delay-200 duration-1000

400ms Delay

flip-r delay-400 duration-1200

600ms Delay + Blur

fade-ur delay-600 duration-1500 blur

Split Items Animation

  • Item A
  • Item B
  • Item C
  • Item D
  • Item E
  • Item F
  • Item G
  • Item H
<ul data-usal="split-item split-fade-r split-delay-100">
  <li>First item</li>
  <li>Second item</li>
  <li>Third item</li>
</ul>

Dynamic Content Test

// Add items dynamically
const item = document.createElement('div');
item.textContent = 'New Item';
item.setAttribute('data-usal', 'fade-u duration-800');
parent.appendChild(item);

API Documentation

Property Values

Available Animations
Core animation types
// Basic animations
fade, fade-u, fade-d, fade-l, fade-r
fade-ul, fade-ur, fade-dl, fade-dr

// Zoom in animations
zoomin, zoomin-u, zoomin-d, zoomin-l, zoomin-r
zoomin-ul, zoomin-ur, zoomin-dl, zoomin-dr

// Zoom out animations
zoomout, zoomout-u, zoomout-d, zoomout-l, zoomout-r
zoomout-ul, zoomout-ur, zoomout-dl, zoomout-dr

// Flip animations
flip, flip-u, flip-d, flip-l, flip-r
flip-ul, flip-ur, flip-dl, flip-dr
Split Animations
Animate text parts individually
// Split by words
split-word

// Split by letters
split-letter

// Split by child items
split-item

// Split with custom animation
split-fade-r, split-fade-u, split-zoomin

// Split delay in milliseconds
split-delay-50, split-delay-100
Count Animation
Animate numbers from 0 to target
// count-[1234], count-[98.5], count-[42,350]
count-[number]
Modifiers
Animation behavior modifiers
// Duration in milliseconds
duration-500, duration-1000, duration-2000

// Delay in milliseconds
delay-200, delay-500, delay-1000

// Easing functions
linear, ease, ease-in, ease-out

// Other modifiers
blur, once, threshold-50
Text Effects
Special text animations (for letters, use with split-letter)
// Shimmer effect
text-shimmer

// Fluid weight animation
text-fluid

Property Names

data-usal
Main animation attribute
<!-- Vanilla JS -->
<div data-usal="fade duration-500">Content</div>

<!-- React/Next.js -->
<div data-usal="fade duration-500">Content</div>

<!-- Solid/SolidStart -->
<div data-usal="fade duration-500">Content</div>

<!-- Svelte/SvelteKit -->
<div use:usal={'fade duration-500'}>Content</div>

<!-- Vue/Nuxt -->
<div v-usal="'fade duration-500'">Content</div>

<!-- Lit -->
<div ${usal('fade duration-500')}>Content</div>

<!-- Angular -->
<div [usal]="'fade duration-500'">Content</div>
data-usal-id
Unique identifiers control animation reactivity
<!-- Automatic ID (re-animates when element is recreated) -->
<div data-usal="fade-u">Auto ID</div>

<!-- Custom ID (prevents re-animation) -->
<div data-usal="fade-u" data-usal-id="unique-element">Fixed ID</div>
Tip: For large elements (>100vh), use lower thresholds like threshold-5 or threshold-10 to ensure animations trigger properly.

JavaScript API

window.USAL.config(options)
Configure or reconfigure at any time
// Initial configuration
window.USAL.config({
  maxConcurrent: 100,    // Max concurrent animations
  duration: 1000,       // Default duration (ms)
  delay: 0,             // Default delay (ms)
  threshold: 30,        // Default threshold (%)
  splitDelay: 30,       // Default split delay (ms)
  once: false           // Run animation only once
});

// Can be reconfigured later
window.USAL.config({
  duration: 2000,       // Change duration
  threshold: 50         // Change threshold
});
window.USAL.destroy()
Clean up and remove all animations
// Clean up when done
window.USAL.destroy();

Framework Comparison