// ───────────────────────────────────────────────────────────────────────────── // Component: Agent Coordination Hub (.agents-* prefix) // File: src/scss/components/_agents.scss // // Visual rules only — colors, typography, backgrounds, borders, animations. // Structural layout lives in pages/_agents.scss. // ───────────────────────────────────────────────────────────────────────────── // ── Page header ─────────────────────────────────────────────────────────────── .agents-wrap { font-family: var(--font-mono); } .agents-hd { border-bottom: 1px solid var(--border-default); } .agents-hd-title { font-size: 1.1rem; font-weight: 600; letter-spacing: 0.04em; color: var(--text-primary); svg { opacity: 0.7; } } .agents-hd-repo { font-size: 0.8rem; color: var(--text-muted); } .agents-hd-live { font-size: 0.72rem; letter-spacing: 0.08em; color: var(--color-success); } .agents-hd-live-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--color-success); box-shadow: 0 0 6px var(--color-success); animation: agents-pulse 2s ease-in-out infinite; } @keyframes agents-pulse { 0%, 100% { opacity: 1; box-shadow: 0 0 6px var(--color-success); } 50% { opacity: 0.5; box-shadow: 0 0 2px var(--color-success); } } // ── Sub-navigation ──────────────────────────────────────────────────────────── .agents-subnav-link { border: 1px solid var(--border-default); border-radius: 4px; font-size: 0.78rem; letter-spacing: 0.04em; color: var(--text-muted); text-decoration: none; transition: border-color 0.15s, color 0.15s; &:hover { border-color: var(--color-accent); color: var(--color-accent); } } // ── Cards / panels ──────────────────────────────────────────────────────────── .agents-card { border: 1px solid var(--border-default); border-radius: 6px; background: var(--bg-surface); } .agents-card-title { font-size: 0.7rem; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--text-muted); } // ── Active agent list ───────────────────────────────────────────────────────── .agents-active-count { font-size: 0.85rem; font-weight: 600; color: var(--color-success); &::before { content: "● "; font-size: 0.6rem; } } .agents-agent-item a { font-size: 0.8rem; color: var(--color-accent); text-decoration: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: block; &:hover { text-decoration: underline; } } .agents-no-active { font-size: 0.78rem; color: var(--text-muted); font-style: italic; } // ── Task queue bar chart ────────────────────────────────────────────────────── .agents-queue-row { font-size: 0.78rem; } .agents-queue-label { color: var(--text-muted); text-align: right; } .agents-queue-track { height: 8px; background: var(--bg-base); border: 1px solid var(--border-default); border-radius: 2px; overflow: hidden; } .agents-queue-fill { height: 100%; border-radius: 2px; transition: width 0.3s ease; } .agents-queue-fill--pending { background: var(--color-accent); } .agents-queue-fill--claimed { background: var(--color-warning); box-shadow: 0 0 4px var(--color-warning); } .agents-queue-fill--done { background: var(--color-success); } .agents-queue-fill--failed { background: var(--color-danger); } .agents-queue-count { color: var(--text-muted); text-align: right; } // ── Reservations table ──────────────────────────────────────────────────────── .agents-reservations-title { font-size: 0.7rem; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--text-muted); } .agents-reservations-count { font-size: 0.75rem; color: var(--text-muted); } .agents-table { width: 100%; border-collapse: collapse; font-size: 0.78rem; th { text-align: left; color: var(--text-muted); font-weight: 400; font-size: 0.7rem; letter-spacing: 0.05em; text-transform: uppercase; border-bottom: 1px solid var(--border-default); } td { border-bottom: 1px solid color-mix(in srgb, var(--border-default) 40%, transparent); vertical-align: middle; } tr:last-child td { border-bottom: none; } tr:hover td { background: color-mix(in srgb, var(--bg-surface) 60%, transparent); } } .agents-symbol-addr { font-family: var(--font-mono); color: var(--text-primary); max-width: 280px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .agents-agent-chip { display: inline-block; background: color-mix(in srgb, var(--color-accent) 12%, transparent); border: 1px solid color-mix(in srgb, var(--color-accent) 30%, transparent); border-radius: 10px; font-size: 0.72rem; color: var(--color-accent); white-space: nowrap; } .agents-ttl { color: var(--text-muted); font-size: 0.75rem; white-space: nowrap; } .agents-ttl--expiring { color: var(--color-warning); } // ── Event stream ────────────────────────────────────────────────────────────── .agents-stream { border: 1px solid var(--border-default); border-radius: 6px; background: var(--bg-base); overflow: hidden; } .agents-stream-hd { background: var(--bg-surface); border-bottom: 1px solid var(--border-default); font-size: 0.7rem; color: var(--text-muted); letter-spacing: 0.06em; } .agents-stream-cursor { font-family: var(--font-mono); color: var(--text-muted); } .agents-stream-row { font-size: 0.76rem; transition: background 0.1s; &:hover { background: color-mix(in srgb, var(--bg-surface) 60%, transparent); } } .agents-stream-dot { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; } .agents-stream-dot--reservation { background: var(--color-accent); box-shadow: 0 0 4px var(--color-accent); } .agents-stream-dot--heartbeat { background: var(--color-success); } .agents-stream-dot--claim { background: var(--color-warning); box-shadow: 0 0 4px var(--color-warning); } .agents-stream-dot--release { background: var(--text-muted); } .agents-stream-dot--task { background: color-mix(in srgb, var(--color-accent) 60%, var(--color-success)); } .agents-stream-dot--intent { background: var(--text-muted); } .agents-stream-dot--default { background: var(--text-muted); } .agents-stream-kind { font-size: 0.7rem; font-weight: 600; letter-spacing: 0.04em; color: var(--text-muted); } .agents-stream-kind--muted { color: var(--text-muted); } .agents-stream-detail { color: var(--text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .agents-stream-detail--muted { color: var(--text-muted); } // ── Shard map ───────────────────────────────────────────────────────────────── .agents-shard-meta { font-size: 0.8rem; color: var(--text-muted); } .agents-shard-card { border: 1px solid var(--border-default); border-radius: 6px; background: var(--bg-surface); } .agents-shard-card--assigned { border-color: color-mix(in srgb, var(--color-accent) 40%, transparent); } .agents-shard-num { font-size: 0.65rem; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; color: var(--text-muted); } .agents-shard-symbols { font-size: 1rem; font-weight: 600; color: var(--text-primary); } .agents-shard-detail { font-size: 0.72rem; color: var(--text-muted); } .agents-shard-assigned { font-size: 0.75rem; color: var(--color-accent); &::before { content: "● "; font-size: 0.55rem; } } .agents-shard-unassigned { font-size: 0.75rem; color: var(--text-muted); &::before { content: "○ "; font-size: 0.55rem; } } .agents-shard-sym-unit { font-size: 0.7rem; font-weight: 400; color: var(--text-muted); } .agents-shard-assigned-link { color: inherit; text-decoration: none; } // ── Empty state ─────────────────────────────────────────────────────────────── .agents-empty { color: var(--text-muted); font-size: 0.85rem; } .agents-empty-icon { opacity: 0.35; } .agents-empty-hint { font-size: 0.75rem; color: var(--text-muted); font-style: italic; } // ── Forecast ────────────────────────────────────────────────────────────────── .agents-forecast-title { font-size: 0.7rem; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--text-muted); border-bottom: 1px solid var(--border-default); } .agents-forecast-title-sub { font-size: 0.7rem; font-weight: 400; text-transform: none; letter-spacing: 0; color: var(--text-muted); } .agents-conflict-ok { border: 1px solid color-mix(in srgb, var(--color-success) 30%, transparent); border-radius: 6px; background: color-mix(in srgb, var(--color-success) 6%, transparent); color: var(--color-success); font-size: 0.82rem; } .agents-conflict-item { border: 1px solid color-mix(in srgb, var(--color-danger) 35%, transparent); border-radius: 6px; background: color-mix(in srgb, var(--color-danger) 5%, transparent); } .agents-conflict-addr { font-family: var(--font-mono); font-size: 0.82rem; color: var(--color-danger); svg { vertical-align: -1px; margin-right: 3px; } } .agents-blast-icon { color: var(--color-warning); flex-shrink: 0; } .agents-blast-addr { font-family: var(--font-mono); color: var(--text-primary); } .agents-blast-count { color: var(--text-muted); font-size: 0.75rem; white-space: nowrap; } .agents-blast-reserved { color: var(--color-warning); font-size: 0.65rem; letter-spacing: 0.08em; text-transform: uppercase; border: 1px solid color-mix(in srgb, var(--color-warning) 35%, transparent); border-radius: 3px; } // ── Agent profile page ──────────────────────────────────────────────────────── .agents-profile-name { font-size: 1.15rem; font-weight: 700; letter-spacing: 0.02em; color: var(--text-primary); } .agents-profile-meta { font-size: 0.78rem; color: var(--text-muted); } .agents-profile-meta-key { color: var(--text-muted); } .agents-profile-meta-val { color: var(--text-primary); font-weight: 500; } .agents-profile-meta-item--hint { color: var(--text-muted); font-style: italic; } .agents-profile-section-title { font-size: 0.7rem; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--text-muted); border-bottom: 1px solid var(--border-default); } .agents-profile-section-count { display: inline-flex; align-items: center; justify-content: center; min-width: 18px; height: 18px; padding: 0 5px; border-radius: 9px; background: var(--bg-overlay); color: var(--text-primary); font-size: 0.65rem; font-weight: 700; } // ── Task rows ───────────────────────────────────────────────────────────────── .agents-task-row { font-size: 0.8rem; border-bottom: 1px solid color-mix(in srgb, var(--border-default) 40%, transparent); &:last-child { border-bottom: none; } } .agents-task-id { font-family: var(--font-mono); font-size: 0.72rem; color: var(--text-muted); flex-shrink: 0; } .agents-task-title { color: var(--text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .agents-task-status { font-size: 0.68rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; flex-shrink: 0; border-radius: 3px; } .agents-task-status--pending { color: var(--text-muted); border: 1px solid var(--border-default); } .agents-task-status--claimed { color: var(--color-warning); border: 1px solid color-mix(in srgb, var(--color-warning) 35%, transparent); } .agents-task-status--completed { color: var(--color-success); border: 1px solid color-mix(in srgb, var(--color-success) 35%, transparent); } .agents-task-status--failed { color: var(--color-danger); border: 1px solid color-mix(in srgb, var(--color-danger) 35%, transparent); } .agents-task-priority { font-size: 0.72rem; color: var(--text-muted); flex-shrink: 0; } // ── Commit rows ─────────────────────────────────────────────────────────────── .agents-commit-row { font-size: 0.8rem; border-bottom: 1px solid color-mix(in srgb, var(--border-default) 40%, transparent); &:last-child { border-bottom: none; } } .agents-commit-id { font-family: var(--font-mono); font-size: 0.72rem; color: var(--color-accent); flex-shrink: 0; } .agents-commit-msg { color: var(--text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .agents-commit-signed { font-size: 0.65rem; letter-spacing: 0.06em; color: var(--color-success); flex-shrink: 0; opacity: 0.8; } // ── Misc ────────────────────────────────────────────────────────────────────── .agents-back { font-size: 0.78rem; color: var(--text-muted); text-decoration: none; &:hover { color: var(--color-accent); } } .agents-hint { font-size: 0.75rem; color: var(--text-muted); } .agents-section-empty { font-size: 0.8rem; color: var(--text-muted); } .agents-section-empty-hint { font-style: italic; }