AI atmosphere
How AI surfaces move and glow: slow, warm and continuous, so they read as present without asking for attention. For what AI marks look like, see the AI indicators component.

AI indicators: the AI pill, provenance and the HITL rule
The thermal orb
The AI drawer's empty state (AiEmptyGreeting). A 120px blob with a lopsided radius, sand into terracotta, blurred 16px and screened onto the tray, with a crisp 20px AiSparkle held still at its centre as a sibling, so the blur never reaches it.
.aiEmptyStateOrb {
width: 120px;
height: 120px;
border-radius: 42% 58% 70% 30% / 45% 45% 55% 55%;
background: radial-gradient(circle at 30% 30%,
var(--sand) 0%, var(--primary-bright) 45%, var(--primary) 80%, transparent 100%);
filter: blur(16px);
opacity: 0.75;
mix-blend-mode: screen;
animation: aiBlobBreathe var(--duration-ambient) var(--ease-thermal-drift) infinite alternate;
}The thermal gradient
One radiant field in one layer: a sand core, a terracotta ring, fading into the ground. Warm spectrum only, so the assistant reads as one identity on the orb, the composer rim and the header mark. It is the one sanctioned gradient in the system.
--gradient-thermal-diffuse for washes, and --gradient-chakra-orbit (sand, primary-bright, primary at 135deg) for the strokes of rotating rings. An SVG stroke cannot take a CSS gradient, so AiChakraRing repeats those stops in its own linearGradient.
Breathing
Ambient motion changes only opacity and rotation, never size or shape (gate C14): a morphing or scaling shape gets clipped, and reads as loading. The orb's fixed lopsided radius turning a slow quarter turn is what makes it seem to drift.
| Motion | Duration | Easing | What moves |
|---|---|---|---|
| Orb breathing | 6000ms, alternate | --ease-thermal-drift | Opacity 0.7 to 0.9, rotation 0 to 90deg |
| Chakra ring | 12s, linear, continuous | linear | Rotation of the ring only; the sparkle never turns |
--duration-ambient (6000ms) is the floor for continuous ambient loops. Slower is allowed; faster stops reading as ambient and starts reading as a spinner.
The chakra ring
The header AI trigger: a serrated sun ring around the sparkle. The ring turns one revolution every 12 seconds, unhurried and continuous, and only while the AI drawer is open. Closing the drawer PAUSES it rather than removing the animation, so it never snaps back to zero and the next open carries on from where it stopped.
The spin lives on the ring's inner group (the host passes spinClassName), so it never overrides the scale the host puts on the outer element. The sparkle sits above it and never rotates: a spinning star is the loading idiom.
Reduced motion
Under prefers-reduced-motion every ambient loop stops and the surface settles to a still, legible state. The warmth and the core stay; only the motion goes.
- The orb stops turning and breathing, rounds off to a circle and rests at 0.7 opacity.
- The chakra ring stops; the sparkle and the ring stay where they are.
- No surface depends on motion to say anything. A paused ring still marks the AI trigger.