// ============================================================================ // Agent Status Badge — per spec Section 7.3 // Colored pill with dot indicator and optional pulse animation. // ============================================================================ $badge-height: 24px; $dot-size: 8px; $border-radius: 12px; $font-size: 12px; $font-weight: 500; $padding-x: 8px; $gap: 6px; @use 'sass:color'; // Status color palette $color-active: #22c55e; // green-500 $color-idle: #9ca3af; // gray-400 $color-thinking: #3b82f6; // blue-500 $color-error: #ef4444; // red-500 $color-offline: #9ca3af; // gray-400 // Background tints (12% opacity for soft pill background) $bg-active: rgba($color-active, 0.12); $bg-idle: rgba($color-idle, 0.12); $bg-thinking: rgba($color-thinking, 0.12); $bg-error: rgba($color-error, 0.12); $bg-offline: rgba($color-offline, 0.12); // --------------------------------------------------------------------------- // Base pill // --------------------------------------------------------------------------- .badge { display: inline-flex; align-items: center; height: $badge-height; padding: 0 $padding-x; border-radius: $border-radius; gap: $gap; font-size: $font-size; font-weight: $font-weight; line-height: 1; white-space: nowrap; user-select: none; } // --------------------------------------------------------------------------- // Dot indicator // --------------------------------------------------------------------------- .badge__dot { width: $dot-size; height: $dot-size; border-radius: 50%; flex-shrink: 0; } // --------------------------------------------------------------------------- // Label text // --------------------------------------------------------------------------- .badge__label { line-height: 1; } // --------------------------------------------------------------------------- // Status color variants // --------------------------------------------------------------------------- .badge--active { background: $bg-active; color: color.adjust($color-active, $lightness: -10%); .badge__dot { background: $color-active; } } .badge--idle { background: $bg-idle; color: color.adjust($color-idle, $lightness: -15%); .badge__dot { background: $color-idle; } } .badge--thinking { background: $bg-thinking; color: color.adjust($color-thinking, $lightness: -10%); .badge__dot { background: $color-thinking; } } .badge--error { background: $bg-error; color: color.adjust($color-error, $lightness: -10%); .badge__dot { background: $color-error; } } .badge--offline { background: $bg-offline; color: color.adjust($color-offline, $lightness: -15%); .badge__dot { background: $color-offline; } } // --------------------------------------------------------------------------- // Pulse animation — applied when status is active, thinking, or error // --------------------------------------------------------------------------- .badge--pulse { .badge__dot { animation: pulse-dot 2s ease-in-out infinite; } } // Active: 2s pulse .badge--active.badge--pulse .badge__dot { animation-duration: 2s; } // Thinking: 3s pulse .badge--thinking.badge--pulse .badge__dot { animation-duration: 3s; } // Error: 0.8s pulse (fast, urgent) .badge--error.badge--pulse .badge__dot { animation-duration: 0.8s; } @keyframes pulse-dot { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.4; transform: scale(1.5); } }