CUB-45: AgentCard final integration with sub-components

- Assemble AgentCard from AgentStatusBadge, TaskProgressBar, QuickJumpButton
- All 6 inputs functional: status, task, progress, sessionKey, channel, lastActivity
- Left-border accent matches status color (Active: #38BDF8, Idle: #2DD4BF, Thinking: #A78BFA, Error: #F87171)
- Accessibility: role="article" on card, aria-labels on all sections
- Uses tactical dark mode CSS variables from CUB-47
- Added @Input() to QuickJumpButton sessionKey for parent binding
- JumpClick output forwarded from AgentCard
- Build passes, type checking passes
This commit is contained in:
cubecraft-agents[bot]
2026-04-26 13:36:45 +00:00
parent 8d0adeb2e9
commit 8341503a39
17 changed files with 1009 additions and 1 deletions

View File

@@ -0,0 +1,99 @@
<!-- ============================================================================
Agent Card — Final Integration (CUB-45)
Assembles: AgentStatusBadge, TaskProgressBar, QuickJumpButton
Layout: left-border accent, aria-labels, role="article"
========================================================================== -->
<article
class="agent-card"
[class]="'agent-card--' + status()"
[attr.aria-label]="'Agent card: ' + status() + ' status, task: ' + (task() || 'none')"
[attr.role]="'article'"
[style.--agent-status-color]="statusColorVar()"
[style.--agent-status-bg]="statusBgVar()"
>
<!-- Left border accent (4px, matching status color) -->
<div
class="agent-card__accent"
[attr.aria-hidden]="'true'"
></div>
<!-- Card body -->
<div class="agent-card__body">
<!-- Header row: Status Badge + channel + last activity -->
<div class="agent-card__header">
<div class="agent-card__status-row">
<!-- Sub-component: Agent Status Badge -->
<app-agent-status-badge
[status]="status()"
[attr.aria-label]="status() + ' status'"
/>
</div>
<div class="agent-card__meta">
@if (channel()) {
<span
class="agent-card__channel text-mono"
[attr.aria-label]="'Channel: ' + channel()"
>
<mat-icon
class="agent-card__channel-icon"
fontIcon="forum"
[inline]="true"
[attr.aria-hidden]="'true'"
></mat-icon>
{{ channel() }}
</span>
}
<span
class="agent-card__last-activity text-mono"
[attr.aria-label]="'Last activity: ' + lastActivityText()"
>
{{ lastActivityText() }}
</span>
</div>
</div>
<!-- Task description -->
@if (task()) {
<p
class="agent-card__task"
[attr.aria-label]="'Current task: ' + task()"
>
{{ task() }}
</p>
}
<!-- Sub-component: Task Progress Bar -->
@if (showProgress()) {
<div
class="agent-card__progress"
[attr.aria-label]="'Task progress: ' + progress() + '%'"
>
<app-task-progress-bar
[progress]="progress()"
[showElapsed]="showElapsed()"
/>
</div>
}
<!-- Footer: session key (truncated) + Quick-Jump button -->
<div class="agent-card__footer">
<span
class="agent-card__session text-mono"
[matTooltip]="sessionKey()"
[attr.aria-label]="'Session key: ' + sessionKey()"
>
{{ truncatedSessionKey() }}
</span>
<!-- Sub-component: Quick-Jump Button -->
<app-quick-jump-button
[sessionKey]="sessionKey()"
(jumpClick)="onJumpClick($event)"
[attr.aria-label]="'Jump to agent session'"
/>
</div>
</div>
</article>