docs/platforms/mac/icon.md
Author: steipete · Updated: 2025-12-06 · Scope: macOS app (apps/macos)
appearsDisabled; no motion.AppState.triggerVoiceEars(ttl: nil) when the wake word is heard, keeping earBoostActive=true while the utterance is captured. Ears scale up (1.9x), get circular ear holes for readability, then drop via stopVoiceEars() after 1s of silence. Only fired from the in-app voice pipeline.AppState.isWorking=true drives a “tail/leg scurry” micro-motion: faster leg wiggle and slight offset while work is in-flight. Currently toggled around WebChat agent runs; add the same toggle around other long tasks when you wire them.Wiring points
AppState.triggerVoiceEars(ttl: nil) on trigger and stopVoiceEars() after 1s of silence to match the capture window.AppStateStore.shared.setWorking(true/false) around work spans (already done in WebChat agent call). Keep spans short and reset in defer blocks to avoid stuck animations.Shapes & sizes
CritterIconRenderer.makeIcon(blink:legWiggle:earWiggle:earScale:earHoles:).1.0; voice boost sets earScale=1.9 and toggles earHoles=true without changing overall frame (18×18 pt template image rendered into a 36×36 px Retina backing store).Behavioral notes