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:
@@ -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>
|
||||
Reference in New Issue
Block a user