À propos du projet
# thinking-orbs
Indicateurs de chargement en forme d'orbes pointillés pour les interfaces IA et agents. Neuf états animés réglés à la main, chacun fourni en deux tailles adaptées, rendus sur un canvas 2D simple — pas de WebGL, pas de filtres, fonctionne à l'identique dans Chrome, Safari et Firefox.
[Démo en direct](https://orbs.jakubantalik.com) · [Dépôt](https://github.com/Jakubantalik/thinking-orbs) · [Signaler un problème](https://github.com/Jakubantalik/thinking-orbs/issues)
## Installation
```bash
npm install thinking-orbs
```
## Démarrage rapide
```tsx
import { ThinkingOrb } from 'thinking-orbs';
function Status() {
return <ThinkingOrb state="searching" size={64} />;
}
```
## États
Neuf verbes qu'un agent peut effectuer, chacun avec une animation distincte :
```tsx
<ThinkingOrb state="working" /> {/* particules sur orbites inclinées */}
<ThinkingOrb state="searching" /> {/* un méridien de balayage parcourt un globe pointillé */}
<ThinkingOrb state="solving" /> {/* les bandes se brouillent, puis se réassemblent */}
<ThinkingOrb state="listening" /> {/* une forme d'onde défile à travers les anneaux */}
<ThinkingOrb state="connecting" /> {/* une constellation se connecte */}
<ThinkingOrb state="weaving" /> {/* trois brins se tressent autour de la sphère */}
<ThinkingOrb state="composing" /> {/* une écharpe ondulante à plusieurs bandes */}
<ThinkingOrb state="breathing" /> {/* un anneau qui se transforme lentement */}
<ThinkingOrb state="shaping" /> {/* contour pointillé : cercle → triangle → carré */}
```
## Tailles
Deux préréglages réglés — des designs distincts, pas un facteur d'échelle. `64` pour l'échelle avatar de chat, `20` pour l'échelle texte en ligne. Chacun a son propre nombre de points, taille de points et réglage de vitesse :
```tsx
<ThinkingOrb state="working" size={64} />
<ThinkingOrb state="working" size={20} />
```
## Thème
Strictement monochrome — encre claire pour fonds sombres, encre sombre pour fonds clairs — avec le mode choisi automatiquement depuis le projet hôte :
```tsx
<ThinkingOrb theme="auto" /> {/* défaut — détecte depuis le projet */}
<ThinkingOrb theme="dark" /> {/* fixe : points clairs pour fonds sombres */}
<ThinkingOrb theme="light" /> {/* fixe : points sombres pour fonds clairs */}
```
`auto` se résout en trois couches et se met à jour en direct quand l'une d'elles change :
1. un attribut `data-theme="dark|light"` ancêtre ou une classe `dark`/`light` (la convention Tailwind / shadcn), surveillé via `MutationObserver` ;
2. sinon `prefers-color-scheme`, abonné pour les changements de thème système en direct ;
3. sûr pour SSR — le canvas ne peint que côté client, après que le thème soit résolu.
## Autres props
```tsx
<ThinkingOrb
state="solving"
size={20}
speed={1.5} // multiplicateur sur la vitesse intégrée du préréglage
paused={false} // geler sur l'image actuelle
aria-label="Analyse du dépôt…" // remplace le défaut par état
/>
```
Toutes les autres props `<canvas>` (`className`, `style`, `data-*`, …) sont transmises.
## Accessibilité et performance
- `role="img"` avec un `aria-label` par état par défaut.
- `prefers-reduced-motion: reduce` affiche une image représentative statique — pas d'animation — et suit toujours le thème en direct.
- Chaque instance se met en pause automatiquement quand elle est hors écran (`IntersectionObserver`) ou quand l'onglet est masqué, et reprend en phase — toutes les instances partagent une horloge commune.
- Uniquement des arcs de canvas 2D : pas de `ctx.filter`, pas de filtres SVG, pas de WebGL — les mêmes pixels partout, économique sur les appareils bas de gamme. Le ratio de pixels de l'appareil est plafonné à 2.
## Licence
MIT © Jakub Antalik
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.