Files
fusion/packages/dashboard/app/components/ActiveAgentsPanel.css
gsxdsm e946ce9a89 feat(dashboard): hoist Active Agents panel above main list, show next heartbeat
Move ActiveAgentsPanel between AgentMetricsBar and the main agent
collection so live work is visible without scrolling past the whole
agent directory. Add a "Next heartbeat in Xs" line to each card
footer (or "Heartbeat overdue" when negative), driven by
runtimeConfig.heartbeatIntervalMs with the dashboard default fallback.
Give cards a pointer cursor + hover/focus styling so the existing
click-to-select behavior is discoverable.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 14:26:58 -07:00

179 lines
3.5 KiB
CSS

/* === Active Agents Panel === */
.active-agents-panel {
margin-top: var(--space-xl);
margin-bottom: var(--space-lg);
}
.active-agents-panel-header {
display: flex;
align-items: center;
gap: var(--space-sm);
font-size: 13px;
font-weight: 600;
color: var(--text-muted);
margin-bottom: var(--space-md);
}
.active-agents-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: var(--space-md);
}
.live-agent-card {
display: flex;
flex-direction: column;
gap: var(--space-sm);
padding: var(--space-md);
background: var(--card);
border: 1px solid var(--border);
border-radius: var(--radius-md);
cursor: pointer;
transition: background 0.15s, border-color 0.15s;
}
.live-agent-card:hover {
background: var(--bg-hover);
border-color: var(--border-strong, var(--border));
}
.live-agent-card:focus-visible {
outline: 2px solid var(--accent, var(--color-primary));
outline-offset: 2px;
}
.live-agent-card-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-sm);
}
.live-agent-card-name {
display: flex;
align-items: center;
gap: var(--space-sm);
font-weight: 600;
font-size: 13px;
}
.live-agent-pulse {
width: 8px;
height: 8px;
background: var(--color-success);
border-radius: 50%;
animation: pulse 1.5s infinite;
}
.live-agent-task {
font-family: var(--font-mono);
}
.live-agent-card-transcript {
font-family: var(--font-mono);
font-size: 11px;
line-height: 1.5;
color: var(--text-muted);
max-height: 120px;
overflow-y: auto;
}
.live-agent-card-empty {
display: flex;
flex-direction: column;
gap: var(--space-xs);
}
.live-agent-card-status {
font-style: normal;
font-weight: 500;
color: var(--text-primary);
opacity: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.live-agent-card-status-sub {
font-style: italic;
opacity: 0.6;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.live-agent-card-line {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.live-agent-card-footer {
display: flex;
align-items: center;
justify-content: space-between;
font-size: calc(var(--space-sm) + var(--space-xs) * 0.75);
color: var(--text-muted);
padding-top: var(--space-sm);
border-top: 1px solid var(--border);
}
.live-agent-streaming-dot {
color: var(--color-success);
animation: pulse 1.5s infinite;
}
.live-agent-card-footer-actions {
display: flex;
align-items: center;
gap: var(--space-sm);
}
.live-agent-card-footer-meta {
display: flex;
align-items: center;
gap: var(--space-sm);
flex-wrap: wrap;
min-width: 0;
}
.live-agent-card-next-heartbeat {
color: var(--text-muted);
font-size: 11px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.live-agent-card-logs-btn {
display: inline-flex;
align-items: center;
gap: var(--space-xs);
padding: var(--space-xs) var(--space-sm);
font-size: 11px;
color: var(--text-secondary);
background: transparent;
border: 1px solid var(--border);
border-radius: var(--radius-sm);
cursor: pointer;
transition: background 0.15s, color 0.15s, border-color 0.15s;
}
.live-agent-card-logs-btn:hover {
background: var(--bg-hover);
color: var(--text-primary);
border-color: var(--border-strong, var(--border));
}
@media (max-width: 768px) {
.active-agents-grid {
grid-template-columns: 1fr;
}
.live-agent-card {
min-width: 0;
overflow: hidden;
}
}