Vibary.ai
← Vibe Coding

Skeleton to Content

Breathing placeholders hand off to the real content in one cross-fade and a small lift.

loadingcalmminimalautomatic · finite · starter · ~1.8s
Variant

The animated component in this preview is rendered from the canonical file shown here. The surrounding demo shell only provides context and is not part of the copied code.

287 lines · react + motion only
import { useEffect, useState } from "react";
import type { CSSProperties, ReactNode } from "react";
import { motion, useReducedMotion } from "motion/react";

/**
 * Vibary · Skeleton to Content
 *
 * Placeholder blocks breathe while data is in flight, then the real

About this pattern

The default loading state for anything that fetches: feeds, dashboards, profile panels. Placeholder blocks breathe on a slow cycle so the surface reads as alive rather than frozen, then the real content cross-fades over them and lifts a few pixels into place. Placeholder and content share a single grid cell, so the panel is already the right size before the data lands — the hand-off never shoves the rest of the page around, which is what separates this from simply swapping one block for another.

Feed loadingDashboard panelProfile loadSearch results