HomeLab

frilo / motion library · v1.0

The mark, in motion

Two components built from one mark. Thinking: nine agent states for AI and voice interfaces. Coin Bloom: the brand animation, where sixteen edge-on coins open and return to the logo. Monochrome, dependency-free, one shared clock.

Listening
"Find the Q3 invoices from Mercor…"

Nine states

64 px for the avatar slot, 20 px inline with text. Each size is tuned separately, not scaled.

Working on it

Workingstate="working"

A coin flip orbits the ring with a loader tail. The canonical spinner.

Searching the repository

Searchingstate="searching"

A scan beam sweeps round; coins turn to face it and dim behind it.

Solving the query

Solvingstate="solving"

Coins scramble in angle, turn and distance, then snap back into the mark.

Listening

Listeningstate="listening"

Rays lengthen with a travelling waveform. Takes the live mic level.

Connecting to Gmail

Connectingstate="connecting"

The mark assembles token by token, each landing edge-on, then resets.

Merging sources

Weavingstate="weaving"

Two strands braid round the ring, one pushing out as the other pulls in.

Writing the reply

Composingstate="composing"

An undulating sash of half-open coins. Rises with the voice level while speaking.

Ready

Breathingstate="breathing"

The mark breathes in size and light; tokens stay edge-on and crisp. Idle.

Structuring the answer

Shapingstate="shaping"

Tokens gather into four stacks, hold, then fan back out into the mark.

Mapping

What each orb state did, and how the mark says the same thing.

StateOrb todayfrilo mark
workingParticles on tilted orbitsA coin flip orbits the ring with a loader tail. The canonical spinner.
searchingA scan meridian sweeps a globeA scan beam sweeps round; coins turn to face it and dim behind it.
solvingBands scramble, then click backCoins scramble in angle, turn and distance, then snap back into the mark.
listeningA waveform rolls through ringsRays lengthen with a travelling waveform. Takes the live mic level.
connectingA constellation wires itselfThe mark assembles token by token, each landing edge-on, then resets.
weavingThree strands plait a sphereTwo strands braid round the ring, one pushing out as the other pulls in.
composingAn undulating multi-band sashAn undulating sash of half-open coins. Rises with the voice level while speaking.
breathingA ring slowly morphingThe mark breathes in size and light; tokens stay edge-on and crisp. Idle.
shapingDotted outline: circle, triangle, squareTokens gather into four stacks, hold, then fan back out into the mark.

Coin Bloom

The logo animation. Every ray is a coin seen edge-on; the loop opens them on an expo curve and lands back on the exact mark.

Signature3.2s · cubic-bezier(.87,0,.13,1) · 0.38s stagger

Eighteen variations across tempo, stagger order, turn, space and proportion live in the Motion Lab, with a bench to tune and export each one.

Open the Motion Lab

Install

One script, no build step. Or the React wrapper, which keeps the thinking-orbs props so the import is the only change.

HTML
<script src="/lab/frilo-thinking.js"></script>

<frilo-thinking state="searching" size="64"></frilo-thinking>
<frilo-thinking state="working" size="20"></frilo-thinking>
React
- import { ThinkingOrb } from 'thinking-orbs';
+ import { ThinkingOrb } from './frilo-thinking-react';

<ThinkingOrb state="listening" size={64} level={mic} />

API

Attributes on the element, props in React.

PropTypeDefaultNotes
stateworking · searching · solving · listening · connecting · weaving · composing · breathing · shapingworkingSame nine verbs as the orbs.
size64 · 2064Two tuned designs: 16 coins at 64, 8 heavier coins at 20. Other sizes use the nearest tuning.
speednumber1Multiplier on the state's tuned tempo.
pausedbooleanfalseFreezes on the current frame.
themeauto · dark · lightautoAuto reads an ancestor data-theme or dark/light class, then the OS setting. Live.
level0 to 1noneNew. Voice amplitude for listening and composing. Set el.level from a mic analyser every frame; it costs no re-render.
aria-labelstringper stateOverrides the default label, for example "Analysing repository…".

Accessibility and performance

  • Announced. role="img" with a label per state.
  • Reduced motion. Renders one representative still frame per state, and still follows the theme.
  • One clock. Every instance shares a single animation frame and stays in phase.
  • Pauses itself. Offscreen instances and hidden tabs stop drawing.
  • Real 3D, no WebGL. Each ray is a token with two faces and a shaded rim, drawn with CSS 3D transforms on the GPU. About 12 KB.

frilo motion library · Sep 2026 · Orlando Jimenez