Jakubantalik/thinking-orbs
Dotted thought-orb loading indicators for AI & agent UIs, 9 tuned types, two sizes, auto dark/light
About Jakubantalik/thinking-orbs
Jakubantalik/thinking-orbs is an open-source project on GitHub, mainly written in TypeScript. Dotted thought-orb loading indicators for AI & agent UIs, 9 tuned types, two sizes, auto dark/light It currently holds 3,097 stars and 247 forks with 20 open issues, and was last pushed on 2026-08-16 (repository created 2026-07-21).
Project Overview
Git Homed tracks it on the Today's Trending board, currently at rank #25 with 203 new stars today.
GitHub Repository Details
README
thinking-orbs
Dotted thought-orb loading indicators for AI & agent UIs. Nine hand-tuned animated states, each shipped at two purpose-tuned sizes, rendered on a plain 2D canvas — no WebGL, no filters, works identically in Chrome, Safari and Firefox.
Live demo · Repository · Report an issue
Install
npm install thinking-orbs
Quick start
import { ThinkingOrb } from 'thinking-orbs';
function Status() {
return ;
}
States
Nine verbs an agent can be doing, each a distinct animation:
{/ particles on tilted orbits /}
{/ a scan meridian sweeps a dotted globe /}
{/ bands scramble, then click back solved /}
{/ a waveform rolls through the rings /}
{/ a constellation wires itself /}
{/ three strands plait around the sphere /}
{/ an undulating multi-band sash /}
{/ a ring slowly morphing /}
{/ dotted outline: circle → triangle → square /}
Sizes
Two tuned presets — separate designs, not a scale factor. 64 for chat-avatar scale, 20 for inline-text scale. Each carries its own dot count, dot size and speed tuning:
Theme
Strictly monochrome — light ink for dark backgrounds, dark ink for light backgrounds — with the mode picked automatically from the host project:
{/ default — detects from the project /}
{/ pin: light dots for dark backgrounds /}
{/ pin: dark dots for light backgrounds /}
auto resolves in three layers and updates live when any of them change:
1. an ancestor data-theme="dark|light" attribute or dark/light class (the Tailwind / shadcn convention), watched via MutationObserver;
2. otherwise prefers-color-scheme, subscribed for live OS theme switches;
3. SSR-safe — the canvas paints only on the client, after the theme has resolved.
Other props
All other ` props (className, style, data-*`, …) pass through.
Accessibility & performance
role="img"with a sensible per-statearia-labelout of the box.prefers-reduced-motion: reducerenders a static representative frame — no animation — and still follows the live theme.- Every instance pauses automatically when scrolled offscreen (
IntersectionObserver) or when the tab is hidden, and resumes in phase — all instances share one clock. - Plain 2D canvas arcs only: no
ctx.filter, no SVG filters, no WebGL — the same pixels everywhere, cheap on low-end devices. Device-pixel-ratio capped at 2.
License
MIT © Jakub Antalik