oxyn
All components

Square Breath

2D

A flat square of dots that grows and shrinks together, one slow inhale and exhale per loop. Add ripple and the center breathes a beat before the edge.

square-breath.tsx

Installation

Install with the shadcn CLI, or copy the component file. It only needs React.

npx shadcn@latest add https://your-domain.com/r/square-breath.json

Usage

Updates live with the parameters you set.

import { SquareBreath } from "@/components/square-breath";

export function Thinking() {
  return (
    <SquareBreath />
  );
}

Props

PropTypeDefaultDescription
dotShape"round" | "square""round"Shape of each dot.
dotSizenumber2.5Resting dot size in px.
scalenumber1.5How many times larger a dot grows at the peak of the animation.
densitynumber11Dots across the width of the sheet.
sizenumber160Width and height of the orb in px.
durationnumber2.4Seconds for one full breath (grow, then shrink).
gapnumber0.2Seconds to rest between breaths.
ripplenumber0Seconds the edge lags behind the center. 0 breathes in sync.
minOpacitynumber0.25Opacity of resting dots. Dots at full size are always fully opaque.
colorstring"#e4e4e7"Dot color.
pausedbooleanfalseCoast to a stop on the current frame without unmounting. Turning it off eases back up to speed.
labelstring"Thinking"Accessible name; the wrapper is role="status".
className / style——Spread onto the wrapper div, along with any other div props.