Estados del icono de la barra de menú

Autor: steipete · Actualizado: 2025-12-06 · Alcance: app macOS (apps/macos)

  • Inactivo: Animación normal del icono (parpadeo, movimiento ocasional).
  • Pausado: El elemento de estado usa appearsDisabled; sin movimiento.
  • Activación por voz (orejas grandes): El detector de activación por voz llama a AppState.triggerVoiceEars(ttl: nil) cuando se escucha la palabra de activación, manteniendo earBoostActive=true mientras se captura la pronunciación. Las orejas se agrandan (1.9x), obtienen agujeros circulares para legibilidad, y luego bajan vía stopVoiceEars() tras 1s de silencio. Solo se dispara desde el pipeline de voz de la app.
  • Trabajando (agente activo): AppState.isWorking=true impulsa un micro-movimiento de “cola/patas corriendo”: movimiento de patas más rápido y ligero desplazamiento mientras hay trabajo en curso. Actualmente se alterna en las ejecuciones del agente de WebChat; añade el mismo toggle en otras tareas largas cuando las conectes.

Puntos de conexión

  • Activación por voz: el runtime/tester llama a AppState.triggerVoiceEars(ttl: nil) al activarse y stopVoiceEars() tras 1s de silencio para coincidir con la ventana de captura.
  • Actividad del agente: configura AppStateStore.shared.setWorking(true/false) alrededor de los períodos de trabajo (ya implementado en la llamada del agente de WebChat). Mantén los períodos cortos y resetea en bloques defer para evitar animaciones atascadas.

Formas y tamaños

  • El icono base se dibuja en CritterIconRenderer.makeIcon(blink:legWiggle:earWiggle:earScale:earHoles:).
  • La escala de orejas por defecto es 1.0; el boost de voz establece earScale=1.9 y alterna earHoles=true sin cambiar el frame general (imagen de plantilla de 18×18 pt renderizada en un backing store Retina de 36×36 px).
  • El movimiento usa wiggle de patas hasta ~1.0 con un pequeño temblor horizontal; es aditivo a cualquier wiggle de inactividad existente.

Notas de comportamiento

  • No hay toggle externo de CLI/broker para orejas/trabajando; mantenlo interno a las señales propias de la app para evitar parpadeo accidental.
  • Mantén los TTLs cortos (<10s) para que el icono vuelva al estado base rápidamente si un trabajo se cuelga.