Skip to content
Signature

Reveal

Staggered in-view entrance for a group of items (reduced-motion aware).

● LIVE
Throughput
SEC // 0x4A2
847req/s
increase 12.4%
Latency
SEC // 0x4A3
38ms
decrease 3.1%
Uptime
SEC // 0x4A4
99.9%
increase 0.2%
Sessions
SEC // 0x4A5
1.2K
increase 4.8%
Traces
SEC // 0x4A6
12/hr
decrease 22%
Queue
SEC // 0x4A7
0jobs
no change 0%
npx shadcn@latest add https://okibi.cndr.dev/r/reveal.json

Installation

Install the theme first, then add the component:

npx shadcn@latest add https://okibi.cndr.dev/r/reveal.json

Install the required dependencies:

npm install motion

Copy the source from the Code tab above into components/ui/reveal.tsx. It uses the cn helper and the okibi theme tokens — install the theme first if you haven't.

Usage

import { Reveal } from "@/components/ui/reveal"

<Reveal stagger={0.08}>
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
</Reveal>

Examples

Stagger

Tune the inter-child delay with stagger to cascade a grid of items into view.

● LIVE
CH // 0x01
CH // 0x02
CH // 0x03
CH // 0x04
CH // 0x05
CH // 0x06

API Reference

Reveal

PropTypeDefaultDescription
staggernumber0.06Seconds between each child's entrance.
oncebooleantruePlay once, or every time the group enters the viewport.

Accessibility

  • Purely a decorative entrance wrapper — it adds no role or landmark and is transparent to assistive tech.
  • Semantics are inherited entirely from the children, so list, grid, and heading structure is preserved.
  • Honors prefers-reduced-motion: children render in their final position with an identical wrapper and no animation.
  • Each child is wrapped in a min-w-0 h-full element, which affects direct-child and nth-child selectors in the parent grid or flex layout.

Guidelines

Do

  • Wrap a grid or row of Cards, Readouts, or list items to bring a panel to life on scroll-in.
  • Tune stagger to pace the cascade; the default is 0.06 seconds between children.
  • Give reorderable or conditional children stable keys so entrances do not mis-associate.

Don't

  • Do not rely on it for meaning or focus order — it is decoration over content that must stand on its own.
  • Do not wrap a single block taller than the viewport, which may never reach the visibility threshold to reveal.
  • Do not nest layout-critical selectors that assume children are direct, since each is wrapped.

On this page