Boot and loading
Two waits: a record that is about to arrive, and a start-up with no known duration.
See it
Left: three avatar slots that load and arrive. LoadingMark holds the silhouette until ready; the live mark underneath is mounted the whole time, paused, so the swap is a cross-fade and not a first frame against nothing. Right: a boot that has been going on long enough to say so.
The slots are given state="spawning" and nothing else: the live mark is paused until ready, so its state clock starts at the cross-fade, the gather belt plays, and two seconds later the renderer moves to idle on its own. LoadingMark does not forward onSettle; a host that needs to know uses a CharacterMark directly once the record is in hand. BootLoop reports the cycle count from an effect rather than the interval, so a host that re-renders on the callback cannot restart the timer mid-cycle.
When to use it
Two different waits. The first is the agent's own record arriving — a few hundred milliseconds where the avatar slot is empty and the layout is about to shift. The second is something starting up with no known duration, where a progress bar would lie. The character handles both: a silhouette of the face that is coming, then an arrival; or steady activity that is honest about not knowing when it will end.
Components
LoadingMark— the character's own silhouette as a shimmering mask, cross-fading to the live mark onready.BootLoop— an indeterminate wait inside a device bezel;onCyclelets the host escalate.CharacterMark—loading,spawning,onSettle.MarkStageProvider— a page of placeholders that all flip at once should share one engine when they do.HudPlate— thesyncdial is the one for a boot: a lifecycle rather than a fraction.idleuntil the connection is attempted,syncingwhile it is,doneorerrorwhen it lands. Useprogressonly if the host has a real fraction; a ring that fills at a made-up rate is a progress bar that lies with extra steps.
How the states move
spawning is a moment, not a condition. A host would otherwise write the same timeout to leave it, so the renderer owns the clock and reports the move through onSettle(from, to). Reduced motion skips the flourish and still fires the settle.
What each state looks like
| State | Eyes | Mouth | Effect | Id | HUD | |
|---|---|---|---|---|---|---|
loadingLoading | dot → dotLook | none | spinner | 0536 | — | |
spawningSpawning | dotWide → dot | dot | gather | 08 | — | |
workingWorking | dotDown → dot → dotDown | none | arc | 1632 | gauge | |
thinkingThinking | dotLook → dotUp → dotLook | flat | dots | 30 | context | |
idleIdle | dot → dot → dot → dotLeft → dot → dotRight | none | — | 02 | — |
whirl is two incommensurate sines on each axis, so the drift never repeats within the time anyone waits. gather spirals five particles in over two seconds and then behaves like progress. working has no belt at all — its eyes narrow and its body leans — which is why BootLoop pairs it with thinking: the alternation between a belt and no belt is the activity.
Next
- BootLoop — a procedurally generated start-up
- Belts and particles — how belt states are drawn