npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@proto-cool/cascade

v1.0.3

Published

A lightweight TypeScript library for easily defining smooth, performant animations when elements enter the viewport.

Readme

@proto-cool/cascade

A lightweight TypeScript library for easily defining smooth, performant animations when elements enter the viewport.

npm version License: MIT

Features

  • 🚀 Zero Configuration - Add a single data attribute to any element and it animates when scrolled into view
  • Performant - Built on the Motion animation library with optimized viewport detection
  • 🎨 Versatile - Multiple animation types including fade, slide, scale, and custom spring physics
  • 🔧 Customizable - Configure animations globally or per-element using data attributes
  • 📱 Responsive - Works perfectly across all device sizes
  • Accessible - Includes fallbacks for users with JavaScript disabled
  • 🧩 Modular - Use only what you need, minimal bundle size

Installation

# Using pnpm (recommended)
pnpm add @proto-cool/cascade

# Using npm
npm install @proto-cool/cascade

# Using yarn
yarn add @proto-cool/cascade

Quick Start

  1. Import and enable the library:
//Import the CSS to have items invisible by default
import "@proto-cool/cascade/cascade.css";

// Import the `cascade` object for access to enable() and noscript
import cascade from "@proto-cool/cascade";

// Initialize Cascade with default settings
cascade.enable();
  1. Add the data attribute to any HTML element:
<!-- Basic fade animation when element enters viewport -->
<div data-cascade="fadeIn">I'll fade in when visible</div>

<!-- Slide animation with custom delay -->
<div data-cascade="fadeInUp" data-cascade-delay="0.5">
    I'll fade in, sliding upwards, after a delay of half a second
</div>
  1. Add noscript fallback for accessibility:

Add this to your HTML <head> for users with JavaScript disabled:

<!-- Copy this noscript tag to your head section -->
<noscript>
    <style>
        /* Show all elements with data-cascade attribute when JS is disabled */
        [data-cascade] {
            opacity: 1 !important;
        }
    </style>
</noscript>

<!-- Or use the provided noscript string: -->
<head>
    <!-- your other head content -->
    <script>
        document.write(cascade.noscript);
    </script>
</head>

Configuration

Global Configuration

Customize the default behavior for all animations:

cascade.enable({
    // Animation timing defaults
    duration: 0.8, // Animation duration in seconds
    delay: 0, // Delay before animation starts

    // Animation type default
    type: "spring", // 'spring' | 'tween' | 'keyframes' | 'decay' | 'inertia'

    // Intersection observer defaults
    margin: "0px", // Root margin (e.g. '50px' or '10% 20px')
    amount: 0.2, // Trigger when 20% visible (0-1, 'some', or 'all')

    // Spring physics defaults (when type = 'spring')
    bounce: 0.25, // Spring bounciness
    damping: 10, // Spring damping
    stiffness: 100, // Spring stiffness

    // Tween easing defaults (when type = 'tween')
    ease: "easeInOut", // Easing function

    // Animation repeat defaults
    repeat: 0, // Number of repeats (0 = no repeat)
    repeatType: "loop", // 'loop' | 'reverse' | 'mirror'
    repeatDelay: 0, // Delay between repeats
});

Per-Element Configuration

Override settings on individual elements using data attributes:

<div
    data-cascade="bounceIn"
    data-cascade-duration="1.2"
    data-cascade-delay="0.3"
    data-cascade-bounce="0.4"
    data-cascade-ease="easeInOut"
>
    Customized animation
</div>

Available Animations

This package offers a variety of ready-to-use animation presets designed for common UI effects.
Below is a summary of each animation and what it does:

| Name | Description | | ------------ | ------------------------------------------------------- | | fadeIn | Fades in an element from transparent to visible. | | fadeInZoom | Fades in while zooming in from 80% to full size. | | fadeInUp | Fades in while moving upward into place. | | fadeInDown | Fades in while moving downward into place. | | fadeInLeft | Fades in while moving in from the right. | | fadeInRight | Fades in while moving in from the left. | | fadeOut | Fades out an element from visible to transparent. | | fadeOutZoom | Fades out while shrinking (zooming out to 70%). | | fadeOutUp | Fades out while moving upward out of view. | | fadeOutDown | Fades out while moving downward out of view. | | fadeOutLeft | Fades out while moving leftward out of view. | | fadeOutRight | Fades out while moving rightward out of view. | | bounceIn | Bounces in, scaling up and settling to full size. | | bounceOut | Bounces out, expanding slightly then shrinking away. | | flipIn | Flips in along the Y axis, rotating from 90° to 0°. | | flipOut | Flips out along the Y axis, rotating from 0° to 90°. | | rotateIn | Rotates in, spinning from -180° to 0° while fading in. | | rotateOut | Rotates out, spinning from 0° to 180° while fading out. |

Example usage:

<div data-cascade="fadeIn">Fade in</div>
<div data-cascade="fadeInZoom">Zoom in</div>
<div data-cascade="FadeInUp">Slide up in</div>
<div data-cascade="flipIn">Flip in</div>
<div data-cascade="bounceIn">Bounce in</div>

Advanced Usage

Custom Intersection Margins

Adjust when animations trigger relative to the viewport:

<!-- Animation starts when element is 100px away from entering viewport -->
<div data-cascade="fadeIn" data-cascade-margin="100px"></div>

<!-- Different margins for each side (top, right, bottom, left) -->
<div data-cascade="fadeIn" data-cascade-margin="50px 0px 0px 0px"></div>

Animation Amount Threshold

Control how much of the element must be visible to trigger the animation:

<!-- Trigger when 50% of element is visible -->
<div data-cascade="fadeIn" data-cascade-amount="0.5"></div>

<!-- Trigger when any part of element is visible -->
<div data-cascade="fadeIn" data-cascade-amount="some"></div>

<!-- Trigger when element is fully visible -->
<div data-cascade="FadeIn" data-cascade-amount="all"></div>

Custom Animation Physics

Fine-tune spring animations with custom physics parameters:

<!-- Extra bouncy spring animation -->
<div
    data-cascade="bounceIn"
    data-cascade-bounce="0.8"
    data-cascade-stiffness="200"
    data-cascade-damping="5"
>
    Bouncy content
</div>

Browser Support

Cascade works in all modern browsers that support the Intersection Observer API (Chrome, Firefox, Safari, Edge).

Development

# Install dependencies
pnpm install

# Build the library
pnpm run build

# Format code with Prettier
pnpm run format

TypeScript Support

Cascade is written in TypeScript and includes full type definitions:

import cascade from "@proto-cool/cascade";
import type { AnimationOptions } from "@proto-cool/cascade";

const options: Partial<AnimationOptions> = {
    duration: 1.2,
    type: "spring",
    bounce: 0.3,
};

cascade.enable(options);

License

MIT © protocol7