Vibary.ai
← Vibe Coding

Video Buffer Ring

The frame dims and a turning arc holds over it, then dissolves outward on resume.

loadingminimalcalmautomatic · looping · starter · ~0.9s
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.

339 lines · react + motion only
import { useEffect, useState } from "react";
import { motion, useReducedMotion } from "motion/react";

/**
 * Vibary · Video Buffer Ring
 *
 * A stall, handled honestly: the frame dims, a ring turns over it while
 * the buffered range keeps creeping forward, and on resume the ring

About this pattern

A stall handled honestly. A scrim fades over the still — a dim rather than a blur, so the picture stays readable and the work stays on the compositor — and an arc turns above it at a constant linear rate, because an eased turn reads as a stutter, which is the one thing a buffering indicator must never suggest. Underneath, the buffered range keeps creeping forward while the played range is frozen solid: bytes are arriving, the playhead is not moving, and both facts are visible at a glance. On resume the arc expands slightly as it fades, so the stall ends with a release instead of a cut. Reduced motion keeps the dim, the frozen playhead and the announced status, and stops the turn.

Video player stallLive stream reconnectAudio bufferingEmbedded product tour

Where it shows up

Screens we drew to show where this motion usually sits. Illustrations, not captures of any product.

  • 4:12 / 9:48
    Media player

    Playback stalls behind a dimmed frame while the buffered range keeps extending.

Related patterns