denberek_obsidian-agent-fleet/styles.css

4734 lines
92 KiB
CSS

/* ═══════════════════════════════════════════════════════
Agent Fleet Dashboard — Obsidian Plugin Styles
Uses af- prefix to avoid conflicts.
Catppuccin-inspired palette with Obsidian variable fallbacks.
═══════════════════════════════════════════════════════ */
/* ─── Custom Properties ─── */
.af-root {
--af-bg-primary: var(--background-primary);
--af-bg-secondary: var(--background-secondary);
--af-bg-tertiary: var(--background-secondary-alt, var(--background-secondary));
--af-bg-card: var(--background-primary);
--af-bg-card-hover: var(--background-modifier-hover);
--af-bg-surface: var(--background-modifier-form-field);
--af-bg-input: var(--background-secondary);
--af-border: var(--background-modifier-border);
--af-border-hover: var(--background-modifier-border-hover, var(--background-modifier-border));
--af-text-primary: var(--text-normal);
--af-text-secondary: var(--text-muted);
--af-text-muted: var(--text-faint);
--af-text-faint: var(--text-faint);
--af-accent: var(--interactive-accent);
--af-accent-hover: var(--interactive-accent-hover, var(--interactive-accent));
--af-accent-bg: rgba(var(--interactive-accent-rgb, 137, 180, 250), 0.1);
/* Semantic colors */
--af-green: #a6e3a1;
--af-green-bg: rgba(166, 227, 161, 0.1);
--af-yellow: #f9e2af;
--af-yellow-bg: rgba(249, 226, 175, 0.1);
--af-red: #f38ba8;
--af-red-bg: rgba(243, 139, 168, 0.1);
--af-blue: #89b4fa;
--af-blue-bg: rgba(137, 180, 250, 0.1);
--af-purple: #cba6f7;
--af-purple-bg: rgba(203, 166, 247, 0.1);
--af-orange: #fab387;
--af-orange-bg: rgba(250, 179, 135, 0.1);
--af-radius-sm: 6px;
--af-radius-md: 10px;
--af-radius-lg: 14px;
--af-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.15);
--af-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.15);
--af-transition: 150ms ease;
}
/* ─── Root & Layout ─── */
.af-root {
height: 100%;
overflow: hidden;
font-size: 13px;
line-height: 1.5;
}
.af-app {
display: grid;
grid-template-columns: 1fr;
height: 100%;
position: relative;
}
/* ─── Sidebar (Left Panel) ─── */
.af-sidebar {
padding: 0;
font-size: 13px;
}
.af-sidebar-section {
padding: 8px 0;
border-bottom: 1px solid var(--background-modifier-border);
}
.af-sidebar-section:last-child {
border-bottom: none;
}
.af-sidebar-section-header {
padding: 8px 16px 6px;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.8px;
color: var(--text-faint);
text-transform: uppercase;
}
.af-sidebar-nav-item {
display: flex;
align-items: center;
gap: 10px;
padding: 6px 16px;
cursor: pointer;
transition: background 150ms ease;
border-radius: 4px;
margin: 1px 6px;
}
.af-sidebar-nav-item:hover {
background: var(--background-modifier-hover);
}
.af-sidebar-nav-icon {
display: flex;
align-items: center;
color: var(--text-muted);
flex-shrink: 0;
}
.af-sidebar-nav-icon svg {
width: 16px;
height: 16px;
}
.af-sidebar-nav-label {
flex: 1;
font-size: 13px;
}
.af-sidebar-badge {
background: var(--interactive-accent);
color: var(--text-on-accent, white);
padding: 0px 6px;
border-radius: 10px;
font-size: 10px;
font-weight: 600;
min-width: 18px;
text-align: center;
}
.af-sidebar-empty {
padding: 10px 16px;
color: var(--text-faint);
font-size: 12px;
font-style: italic;
}
.af-sidebar-agent-item {
display: flex;
align-items: center;
gap: 10px;
padding: 5px 16px;
cursor: pointer;
transition: background 150ms ease;
border-radius: 4px;
margin: 1px 6px;
}
.af-sidebar-agent-item:hover {
background: var(--background-modifier-hover);
}
.af-sidebar-agent-dot {
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
}
.af-sidebar-agent-dot.idle { background: var(--af-green, #a6e3a1); }
.af-sidebar-agent-dot.running { background: var(--af-yellow, #f9e2af); animation: af-pulse 2s ease-in-out infinite; }
.af-sidebar-agent-dot.error { background: var(--af-red, #f38ba8); }
.af-sidebar-agent-dot.pending { background: var(--af-blue, #89b4fa); }
.af-sidebar-agent-dot.disabled { background: var(--text-faint); }
.af-sidebar-agent-name {
font-size: 12px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.af-sidebar-action-item {
display: flex;
align-items: center;
gap: 10px;
padding: 5px 16px;
cursor: pointer;
transition: background 150ms ease;
color: var(--text-muted);
border-radius: 4px;
margin: 1px 6px;
font-size: 12px;
}
.af-sidebar-action-item:hover {
background: var(--background-modifier-hover);
color: var(--interactive-accent);
}
.af-sidebar-action-icon {
display: flex;
align-items: center;
}
.af-sidebar-action-icon svg {
width: 14px;
height: 14px;
}
/* ─── Main Content ─── */
.af-main-content {
display: flex;
flex-direction: column;
overflow: hidden;
}
/* ─── Top Bar ─── */
.af-top-bar {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 20px;
background: var(--af-bg-secondary);
border-bottom: 1px solid var(--af-border);
min-height: 46px;
}
.af-top-bar-title {
font-weight: 600;
font-size: 14px;
display: flex;
align-items: center;
gap: 8px;
}
.af-top-bar-icon svg {
width: 18px;
height: 18px;
}
.af-breadcrumb {
color: var(--af-text-muted);
font-size: 12px;
display: flex;
gap: 6px;
align-items: center;
}
.af-breadcrumb-sep {
display: flex;
align-items: center;
color: var(--af-text-faint);
}
.af-breadcrumb-sep svg {
width: 14px;
height: 14px;
}
.af-top-bar-spacer {
flex: 1;
}
/* ─── Search ─── */
.af-search-wrap {
position: relative;
display: flex;
align-items: center;
gap: 8px;
border: 1px solid var(--af-border);
border-radius: var(--af-radius-sm);
background: var(--af-bg-input);
padding: 0 10px;
width: 280px;
transition: width var(--af-transition), border-color var(--af-transition);
}
.af-search-wrap:focus-within {
width: 340px;
border-color: var(--af-accent);
}
.af-search-icon {
display: flex;
align-items: center;
color: var(--af-text-muted);
flex-shrink: 0;
}
.af-search-icon svg {
width: 14px;
height: 14px;
}
.af-search-input {
padding: 6px 0;
font-size: 12px;
border: none !important;
background: none !important;
color: var(--af-text-primary);
flex: 1;
min-width: 0;
outline: none !important;
box-shadow: none !important;
}
.af-search-results {
position: absolute;
top: 100%;
right: 0;
width: 320px;
max-height: 360px;
overflow-y: auto;
background: var(--af-bg-card);
border: 1px solid var(--af-border);
border-radius: var(--af-radius-md);
box-shadow: var(--af-shadow-md);
z-index: 50;
margin-top: 4px;
}
.af-search-result-item {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
cursor: pointer;
font-size: 12px;
transition: background var(--af-transition);
}
.af-search-result-item:hover {
background: var(--af-bg-card-hover);
}
.af-search-result-icon {
display: flex;
align-items: center;
color: var(--af-text-muted);
}
.af-search-result-icon svg {
width: 14px;
height: 14px;
}
/* ─── Status Pills ─── */
.af-status-pills {
display: flex;
gap: 6px;
}
.af-pill {
display: inline-flex;
align-items: center;
gap: 5px;
padding: 3px 10px;
border-radius: 20px;
font-size: 11px;
font-weight: 500;
}
.af-pill.green { background: var(--af-green-bg); color: var(--af-green); }
.af-pill.yellow { background: var(--af-yellow-bg); color: var(--af-yellow); }
.af-pill.red { background: var(--af-red-bg); color: var(--af-red); }
.af-pill.blue { background: var(--af-blue-bg); color: var(--af-blue); }
.af-dot {
width: 6px;
height: 6px;
border-radius: 50%;
background: currentColor;
display: inline-block;
}
.af-dot.pulse,
.pulse {
animation: af-pulse 2s ease-in-out infinite;
}
@keyframes af-pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.3; }
}
/* ─── Tab Bar ─── */
.af-tab-bar {
display: flex;
border-bottom: 1px solid var(--af-border);
padding: 0 16px;
gap: 2px;
overflow-x: auto;
}
.af-tab-item {
padding: 8px 14px;
font-size: 12px;
font-weight: 500;
color: var(--af-text-muted);
transition: color 0.15s ease;
cursor: pointer;
-webkit-appearance: none;
appearance: none;
background: none !important;
background-color: transparent !important;
border: none !important;
border-bottom: 2px solid transparent !important;
border-radius: 0 !important;
box-shadow: none !important;
outline: none !important;
margin: 0;
white-space: nowrap;
display: inline-flex;
align-items: center;
gap: 6px;
}
.af-tab-item:hover {
color: var(--af-text-secondary);
}
.af-tab-item.active {
color: var(--af-accent);
border-bottom-color: var(--af-accent) !important;
font-weight: 600;
}
.af-tab-item.active .af-tab-icon {
color: var(--af-accent);
}
.af-tab-icon {
display: flex;
align-items: center;
}
.af-tab-icon svg {
width: 14px;
height: 14px;
}
.af-badge {
background: var(--af-accent-bg);
color: var(--af-accent);
padding: 1px 6px;
border-radius: 10px;
font-size: 10px;
font-weight: 600;
}
.af-badge-warn {
background: var(--af-orange-bg);
color: var(--af-orange);
}
/* ─── Page Container ─── */
.af-page {
flex: 1;
overflow: auto;
}
/* ─── Dashboard Page ─── */
.af-dashboard {
padding: 20px;
}
.af-dash-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 14px;
margin-bottom: 20px;
}
/* ─── Charts Row ─── */
.af-charts-row {
display: grid;
grid-template-columns: 1fr 200px;
gap: 14px;
margin-bottom: 20px;
}
.af-chart-section {
min-height: 0;
}
.af-chart-body {
padding: 16px;
}
.af-chart-body-center {
display: flex;
align-items: center;
justify-content: center;
}
.af-chart-bar,
.af-chart-donut {
display: block;
}
/* ─── Streaming Output Cards ─── */
.af-streaming-section {
margin-bottom: 20px;
}
.af-streaming-card {
background: var(--af-bg-card);
border: 1px solid var(--af-yellow-bg);
border-left: 3px solid var(--af-yellow);
border-radius: var(--af-radius-md);
margin-top: 10px;
overflow: hidden;
}
.af-streaming-card-header {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 14px;
font-weight: 600;
font-size: 12px;
border-bottom: 1px solid var(--af-border);
}
.af-streaming-card-agent {
font-weight: 600;
}
.af-streaming-card-task {
color: var(--af-text-secondary);
font-weight: 400;
}
.af-streaming-output {
padding: 10px 14px;
font-family: var(--font-monospace);
font-size: 11px;
line-height: 1.5;
color: var(--af-text-secondary);
height: 72px; /* ~4 lines at 11px * 1.5 line-height */
overflow-y: auto;
white-space: pre-wrap;
background: var(--af-bg-primary);
}
/* ─── Stat Cards ─── */
.af-stat-card {
background: var(--af-bg-card);
border: 1px solid var(--af-border);
border-radius: var(--af-radius-lg);
padding: 18px;
transition: all var(--af-transition);
}
.af-stat-card:hover {
border-color: var(--af-border-hover);
}
.af-stat-label {
color: var(--af-text-muted);
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.5px;
margin-bottom: 8px;
display: flex;
align-items: center;
gap: 6px;
}
.af-stat-icon svg {
width: 14px;
height: 14px;
}
.af-stat-value {
font-size: 28px;
font-weight: 700;
}
.af-stat-value-suffix {
color: var(--af-text-faint);
font-size: 14px;
margin-left: 4px;
}
.af-stat-sub {
color: var(--af-text-muted);
font-size: 11px;
margin-top: 4px;
}
/* ─── Dashboard Split ─── */
.af-dash-split {
display: grid;
grid-template-columns: 1fr 380px;
gap: 14px;
}
/* ─── Section Card ─── */
.af-section-card {
background: var(--af-bg-card);
border: 1px solid var(--af-border);
border-radius: var(--af-radius-lg);
overflow: hidden;
margin-bottom: 14px;
}
.af-section-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 14px 18px;
border-bottom: 1px solid var(--af-border);
}
.af-section-title {
font-weight: 600;
font-size: 13px;
display: flex;
align-items: center;
gap: 8px;
}
.af-section-title svg {
width: 16px;
height: 16px;
}
.af-section-actions {
display: flex;
gap: 6px;
}
/* ─── Icons ─── */
.af-icon svg {
width: 16px;
height: 16px;
}
.af-meta-icon {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.af-meta-icon svg {
width: 12px;
height: 12px;
}
.af-btn-icon {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.af-btn-icon svg {
width: 12px;
height: 12px;
}
.af-icon-back {
transform: rotate(180deg);
}
/* ─── Buttons ─── */
/* ─── Outlined Buttons ─── */
.af-btn-sm {
padding: 5px 12px;
border-radius: var(--af-radius-sm);
font-size: 11px;
font-weight: 500;
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 5px;
transition: all var(--af-transition);
/* Secondary (default): white/light stroke + text */
-webkit-appearance: none;
appearance: none;
background: none !important;
background-color: transparent !important;
color: var(--af-text-secondary);
border: 1px solid var(--af-border);
box-shadow: none !important;
}
.af-btn-sm:hover {
color: var(--af-text-primary);
border-color: var(--af-text-muted);
}
.af-btn-sm .af-btn-icon {
display: inline-flex;
align-items: center;
}
.af-btn-sm .af-btn-icon svg {
width: 13px;
height: 13px;
}
/* Primary: blue stroke + icon + label */
.af-btn-sm.primary {
color: var(--af-accent);
border-color: var(--af-accent);
}
.af-btn-sm.primary:hover {
color: var(--af-accent-hover);
border-color: var(--af-accent-hover);
background: var(--af-accent-bg) !important;
}
.af-btn-sm.primary .af-btn-icon {
color: var(--af-accent);
}
/* Danger: red stroke + icon + label */
.af-btn-sm.danger {
color: var(--af-red);
border-color: rgba(243, 139, 168, 0.4);
}
.af-btn-sm.danger:hover {
border-color: var(--af-red);
background: var(--af-red-bg) !important;
}
.af-btn-sm.danger .af-btn-icon {
color: var(--af-red);
}
/* ─── Confirm Delete Modal ─── */
.af-confirm-delete-modal {
max-width: 480px;
}
.af-delete-header {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 16px;
}
.af-delete-header h3 {
margin: 0;
font-size: 16px;
}
.af-delete-header-icon {
color: var(--af-red);
display: flex;
align-items: center;
}
.af-delete-header-icon svg {
width: 22px;
height: 22px;
}
.af-delete-summary {
margin-bottom: 14px;
font-size: 13px;
color: var(--af-text-secondary);
}
.af-delete-impact-list {
margin: 8px 0 0 20px;
padding: 0;
}
.af-delete-impact-list li {
margin-bottom: 4px;
font-size: 13px;
}
.af-delete-preserved {
color: var(--af-text-muted);
font-style: italic;
}
.af-delete-note {
font-size: 12px;
color: var(--af-text-muted);
padding: 10px 12px;
background: var(--af-bg-surface);
border-radius: var(--af-radius-sm);
margin-bottom: 16px;
}
.af-delete-actions {
display: flex;
justify-content: flex-end;
gap: 8px;
margin-top: 16px;
}
.af-delete-confirm-btn {
background: var(--af-red) !important;
color: white !important;
border: none !important;
padding: 6px 16px;
border-radius: var(--af-radius-sm);
font-weight: 600;
font-size: 13px;
cursor: pointer;
display: flex;
align-items: center;
gap: 6px;
}
.af-delete-confirm-btn:hover {
opacity: 0.9;
}
.af-delete-btn-icon {
display: flex;
align-items: center;
order: -1;
}
.af-delete-btn-icon svg {
width: 14px;
height: 14px;
}
.af-btn-xs {
padding: 3px 10px;
font-size: 10px;
}
/* ─── Activity Timeline ─── */
.af-timeline {
padding: 0;
}
.af-timeline-item {
display: flex;
gap: 12px;
padding: 12px 18px;
border-bottom: 1px solid var(--af-border);
transition: background var(--af-transition);
cursor: pointer;
}
.af-timeline-item:last-child {
border-bottom: none;
}
.af-timeline-item:hover {
background: var(--af-bg-card-hover);
}
.af-tl-icon {
width: 32px;
height: 32px;
border-radius: var(--af-radius-sm);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.af-tl-icon svg {
width: 16px;
height: 16px;
}
.af-tl-icon.success { background: var(--af-green-bg); color: var(--af-green); }
.af-tl-icon.error { background: var(--af-red-bg); color: var(--af-red); }
.af-tl-icon.running { background: var(--af-yellow-bg); color: var(--af-yellow); }
.af-tl-icon.warning { background: var(--af-yellow-bg); color: var(--af-yellow); }
.af-tl-icon.pending { background: var(--af-blue-bg); color: var(--af-blue); }
.af-tl-body {
flex: 1;
min-width: 0;
}
.af-tl-title {
font-weight: 500;
font-size: 12px;
display: flex;
gap: 6px;
align-items: center;
}
.af-agent-tag {
color: var(--af-accent);
}
.af-tl-desc {
color: var(--af-text-muted);
font-size: 11px;
margin-top: 2px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.af-tl-meta {
color: var(--af-text-faint);
font-size: 10px;
margin-top: 3px;
display: flex;
gap: 10px;
}
/* ─── Agent Mini List (Dashboard sidebar) ─── */
.af-agent-mini-list {
padding: 6px 0;
}
.af-agent-mini {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 18px;
border-bottom: 1px solid var(--af-border);
cursor: pointer;
transition: background var(--af-transition);
}
.af-agent-mini:last-child {
border-bottom: none;
}
.af-agent-mini:hover {
background: var(--af-bg-card-hover);
}
.af-agent-avatar {
width: 34px;
height: 34px;
border-radius: var(--af-radius-md);
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
font-weight: 700;
flex-shrink: 0;
}
.af-agent-avatar svg {
width: 16px;
height: 16px;
}
.af-agent-avatar.idle { background: var(--af-green-bg); color: var(--af-green); }
.af-agent-avatar.running { background: var(--af-yellow-bg); color: var(--af-yellow); }
.af-agent-avatar.error { background: var(--af-red-bg); color: var(--af-red); }
.af-agent-avatar.pending { background: var(--af-blue-bg); color: var(--af-blue); }
.af-agent-avatar.disabled { background: var(--af-bg-surface); color: var(--af-text-faint); }
.af-agent-info {
flex: 1;
min-width: 0;
}
.af-agent-name {
font-weight: 600;
font-size: 12px;
}
.af-agent-desc {
color: var(--af-text-muted);
font-size: 11px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.af-agent-status-dot {
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
}
.af-agent-status-dot.idle { background: var(--af-green); }
.af-agent-status-dot.running { background: var(--af-yellow); animation: af-pulse 2s ease-in-out infinite; }
.af-agent-status-dot.error { background: var(--af-red); }
.af-agent-status-dot.pending { background: var(--af-blue); }
.af-agent-status-dot.disabled { background: var(--af-text-faint); }
/* ─── Quick Run ─── */
.af-quick-run {
padding: 14px 18px;
border-top: 1px solid var(--af-border);
}
.af-quick-run-label {
font-weight: 600;
font-size: 11px;
color: var(--af-text-muted);
text-transform: uppercase;
letter-spacing: 0.5px;
margin-bottom: 8px;
display: flex;
align-items: center;
gap: 4px;
}
.af-quick-run-row {
display: flex;
gap: 8px;
}
.af-select {
flex: 1;
font-size: 12px;
padding: 5px 10px;
background: var(--af-bg-input);
border: 1px solid var(--af-border);
border-radius: var(--af-radius-sm);
color: var(--af-text-primary);
}
/* ─── Approval Banner ─── */
.af-approval-banner {
background: var(--af-blue-bg);
border: 1px solid rgba(137, 180, 250, 0.2);
border-radius: var(--af-radius-md);
padding: 12px 16px;
margin-bottom: 14px;
display: flex;
align-items: center;
gap: 12px;
}
.af-approval-icon {
color: var(--af-blue);
display: flex;
align-items: center;
}
.af-approval-icon svg {
width: 20px;
height: 20px;
}
.af-approval-text {
flex: 1;
}
.af-approval-title {
font-weight: 600;
font-size: 12px;
color: var(--af-blue);
}
.af-approval-desc {
font-size: 11px;
color: var(--af-text-secondary);
}
.af-approval-actions {
display: flex;
gap: 6px;
}
.af-btn-approve {
padding: 5px 14px;
border-radius: var(--af-radius-sm);
background: var(--af-green);
color: var(--af-bg-tertiary);
font-weight: 600;
font-size: 11px;
cursor: pointer;
border: none;
display: inline-flex;
align-items: center;
gap: 4px;
}
.af-btn-reject {
padding: 5px 14px;
border-radius: var(--af-radius-sm);
background: var(--af-red-bg);
color: var(--af-red);
font-weight: 600;
font-size: 11px;
border: 1px solid rgba(243, 139, 168, 0.2);
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 4px;
}
/* ─── Agents Page ─── */
.af-agents-page {
padding: 20px;
}
.af-agents-toolbar {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 16px;
}
.af-page-title {
font-weight: 600;
font-size: 16px;
}
.af-toolbar-spacer {
flex: 1;
}
.af-agents-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(420px, 1fr));
gap: 14px;
}
/* ─── Agent Card ─── */
.af-agent-card {
background: var(--af-bg-card);
border: 1px solid var(--af-border);
border-radius: var(--af-radius-lg);
padding: 18px;
transition: all var(--af-transition);
cursor: pointer;
}
.af-agent-card:hover {
border-color: var(--af-border-hover);
}
.af-agent-card.disabled {
opacity: 0.6;
}
.af-agent-card-header {
display: flex;
align-items: flex-start;
gap: 12px;
margin-bottom: 14px;
}
.af-agent-card-avatar {
width: 42px;
height: 42px;
border-radius: var(--af-radius-md);
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
}
.af-agent-card-avatar svg {
width: 20px;
height: 20px;
}
.af-agent-card-avatar.idle { background: var(--af-green-bg); color: var(--af-green); }
.af-agent-card-avatar.running { background: var(--af-yellow-bg); color: var(--af-yellow); }
.af-agent-card-avatar.error { background: var(--af-red-bg); color: var(--af-red); }
.af-agent-card-avatar.pending { background: var(--af-blue-bg); color: var(--af-blue); }
.af-agent-card-avatar.disabled { background: var(--af-bg-surface); color: var(--af-text-faint); }
.af-agent-card-titleblock {
flex: 1;
min-width: 0;
}
.af-agent-card-name {
font-weight: 600;
font-size: 14px;
margin-bottom: 2px;
}
.af-agent-card-desc {
color: var(--af-text-secondary);
font-size: 12px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* Toggle switch */
.af-agent-card-toggle {
width: 36px;
height: 20px;
border-radius: 10px;
background: var(--af-border);
position: relative;
cursor: pointer;
transition: background var(--af-transition);
flex-shrink: 0;
}
.af-agent-card-toggle.on {
background: var(--af-accent);
}
.af-agent-card-toggle::after {
content: "";
position: absolute;
width: 16px;
height: 16px;
border-radius: 50%;
background: white;
top: 2px;
left: 2px;
transition: transform var(--af-transition);
}
.af-agent-card-toggle.on::after {
transform: translateX(16px);
}
/* Agent stats */
.af-agent-card-stats {
display: flex;
gap: 16px;
margin-bottom: 14px;
}
.af-agent-stat {
display: flex;
flex-direction: column;
}
.af-agent-stat-value {
font-weight: 600;
font-size: 16px;
}
.af-agent-stat-label {
color: var(--af-text-muted);
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.3px;
}
/* Skills tags */
.af-agent-card-skills {
display: flex;
flex-wrap: wrap;
gap: 4px;
margin-bottom: 14px;
}
.af-skill-tag {
padding: 2px 8px;
border-radius: 4px;
font-size: 10px;
font-weight: 500;
background: var(--af-purple-bg);
color: var(--af-purple);
}
/* Agent card footer */
.af-agent-card-footer {
display: flex;
justify-content: space-between;
align-items: center;
padding-top: 12px;
border-top: 1px solid var(--af-border);
}
.af-agent-card-meta {
color: var(--af-text-muted);
font-size: 11px;
}
.af-agent-card-actions {
display: flex;
gap: 4px;
}
/* ─── Channel card validation issues (shown below footer on .af-agent-card) ─── */
.af-channel-issues {
margin-top: 12px;
padding: 10px 12px;
border: 1px solid var(--af-red);
border-radius: var(--af-radius-md);
background: var(--af-red-bg);
color: var(--af-red);
font-size: 11px;
line-height: 1.5;
}
.af-channel-issue-row + .af-channel-issue-row {
margin-top: 4px;
}
/* Heartbeat indicator on agent cards */
.af-heartbeat-indicator {
display: inline-flex;
align-items: center;
margin-left: 6px;
color: var(--af-green);
opacity: 0.7;
vertical-align: middle;
}
.af-heartbeat-indicator svg {
width: 14px;
height: 14px;
}
/* Channel form — agent checkboxes */
.af-form-checkboxes {
display: flex;
flex-wrap: wrap;
gap: 8px 16px;
}
.af-form-checkbox-row {
display: flex;
align-items: center;
gap: 6px;
margin: 2px 0;
font-size: 12px;
color: var(--af-text-primary);
cursor: pointer;
}
.af-form-checkbox-row input[type="checkbox"] {
margin: 0;
}
.af-form-checkbox-label {
display: flex;
align-items: center;
gap: 4px;
font-size: 13px;
cursor: pointer;
}
/* ─── Agent Detail Page ─── */
.af-agent-detail-page,
.af-task-detail-page {
padding: 20px;
}
.af-breadcrumb-link {
cursor: pointer;
color: var(--af-text-muted);
}
.af-breadcrumb-link:hover {
color: var(--af-accent);
}
.af-detail-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20px;
gap: 16px;
}
.af-detail-header-left {
display: flex;
align-items: center;
gap: 14px;
min-width: 0;
flex: 1;
}
.af-detail-header-left .af-agent-card-avatar {
flex-shrink: 0;
}
.af-detail-header-left > div:last-child {
min-width: 0;
}
.af-detail-header-name {
font-weight: 700;
font-size: 18px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.af-detail-header-desc {
color: var(--af-text-muted);
font-size: 12px;
margin-top: 2px;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.af-detail-header-actions {
display: flex;
gap: 6px;
}
.af-detail-tabs {
display: flex;
border-bottom: 1px solid var(--af-border);
margin-bottom: 20px;
gap: 0;
}
.af-detail-tab {
padding: 8px 16px;
font-size: 12px;
font-weight: 500;
color: var(--af-text-muted);
transition: color 0.15s ease;
cursor: pointer;
-webkit-appearance: none;
appearance: none;
background: none !important;
background-color: transparent !important;
border: none !important;
border-bottom: 2px solid transparent !important;
border-radius: 0 !important;
box-shadow: none !important;
outline: none !important;
margin: 0;
display: flex;
align-items: center;
gap: 6px;
}
.af-detail-tab:hover {
color: var(--af-text-secondary);
}
.af-detail-tab.active {
color: var(--af-accent);
border-bottom-color: var(--af-accent) !important;
}
.af-detail-tab.active .af-tab-icon {
color: var(--af-accent);
}
.af-detail-tab-content {
min-height: 200px;
}
.af-detail-skills-list {
padding: 14px 18px;
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.af-config-form {
padding: 14px 18px;
}
.af-config-prompt-section {
margin-top: 16px;
}
.af-detail-value-row {
display: flex;
align-items: center;
gap: 8px;
}
.af-run-list-item {
display: flex;
gap: 12px;
padding: 12px 18px;
border-bottom: 1px solid var(--af-border);
transition: background var(--af-transition);
cursor: pointer;
}
.af-run-list-item:hover {
background: var(--af-bg-card-hover);
}
/* ─── Approvals Page ─── */
.af-approvals-page {
padding: 20px;
}
.af-approvals-list {
padding: 0;
}
.af-approval-item {
display: flex;
gap: 12px;
padding: 14px 18px;
border-bottom: 1px solid var(--af-border);
align-items: flex-start;
}
.af-approval-item:last-child {
border-bottom: none;
}
.af-approval-item-icon {
width: 32px;
height: 32px;
border-radius: var(--af-radius-sm);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.af-approval-item-icon svg {
width: 16px;
height: 16px;
}
.af-approval-item-icon.pending { background: var(--af-blue-bg); color: var(--af-blue); }
.af-approval-item-icon.approved { background: var(--af-green-bg); color: var(--af-green); }
.af-approval-item-icon.rejected { background: var(--af-red-bg); color: var(--af-red); }
.af-approval-item-body {
flex: 1;
min-width: 0;
}
.af-approval-item-title {
font-weight: 600;
font-size: 13px;
}
.af-approval-item-meta {
color: var(--af-text-muted);
font-size: 11px;
margin-top: 2px;
}
.af-approval-item-reason {
color: var(--af-text-secondary);
font-size: 11px;
margin-top: 4px;
font-style: italic;
}
.af-approval-item-actions {
display: flex;
gap: 6px;
flex-shrink: 0;
align-items: center;
}
/* ─── Kanban Page ─── */
.af-kanban-page {
padding: 20px;
display: flex;
flex-direction: column;
height: 100%;
}
.af-kanban-toolbar {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 14px;
flex-shrink: 0;
}
.af-kanban-board {
display: flex;
gap: 14px;
flex: 1;
overflow-x: auto;
padding-bottom: 12px;
}
.af-kanban-column {
min-width: 260px;
max-width: 300px;
flex-shrink: 0;
background: var(--af-bg-secondary);
border: 1px solid var(--af-border);
border-radius: var(--af-radius-lg);
display: flex;
flex-direction: column;
max-height: calc(100vh - 200px);
transition: border-color var(--af-transition), background var(--af-transition);
}
.af-kanban-running { border-color: rgba(249, 226, 175, 0.3); }
.af-kanban-review { border-color: rgba(137, 180, 250, 0.3); }
.af-kanban-failed { border-color: rgba(243, 139, 168, 0.15); }
/* Drag and drop states */
.af-kanban-column.af-drag-over {
background: var(--af-accent-bg);
border-color: var(--af-accent);
}
.af-kanban-card.af-dragging {
opacity: 0.4;
}
.af-kanban-card-grip {
position: absolute;
top: 8px;
left: 4px;
color: var(--af-text-faint);
cursor: grab;
opacity: 0;
transition: opacity var(--af-transition);
}
.af-kanban-card-grip svg {
width: 14px;
height: 14px;
}
.af-kanban-card:hover .af-kanban-card-grip {
opacity: 0.6;
}
.af-kanban-col-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 14px;
border-bottom: 1px solid var(--af-border);
flex-shrink: 0;
}
.af-kanban-col-title {
font-weight: 600;
font-size: 12px;
display: flex;
align-items: center;
gap: 8px;
}
.af-kanban-col-title svg {
width: 14px;
height: 14px;
}
.af-kanban-col-count {
background: var(--af-bg-surface);
padding: 1px 7px;
border-radius: 10px;
font-size: 10px;
color: var(--af-text-muted);
}
.af-kanban-col-body {
flex: 1;
overflow-y: auto;
padding: 10px;
display: flex;
flex-direction: column;
gap: 8px;
}
.af-kanban-empty {
color: var(--af-text-faint);
font-size: 11px;
text-align: center;
padding: 20px 0;
}
.af-kanban-card {
background: var(--af-bg-card);
border: 1px solid var(--af-border);
border-radius: var(--af-radius-md);
padding: 12px;
cursor: pointer;
transition: all var(--af-transition);
position: relative;
}
.af-kanban-card:hover {
border-color: var(--af-border-hover);
}
/* Priority left border indicators */
.af-kanban-card.af-priority-critical { border-left: 3px solid #ef4444; }
.af-kanban-card.af-priority-high { border-left: 3px solid #f59e0b; }
.af-kanban-card.af-priority-medium { border-left: 3px solid #3b82f6; }
.af-kanban-card.af-priority-low { border-left: 3px solid var(--af-text-secondary); }
.af-kanban-card-running {
border-color: rgba(249, 226, 175, 0.3);
}
.af-kanban-card-failed {
border-color: rgba(243, 139, 168, 0.2);
}
.af-kanban-card-cancelled {
border-color: var(--af-yellow-bg);
}
.af-kanban-card-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 8px;
margin-bottom: 6px;
}
.af-kanban-card-title {
font-weight: 500;
font-size: 12px;
flex: 1;
min-width: 0;
}
.af-kanban-card-status {
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
margin-top: 3px;
}
.af-kanban-card-status.active { background: var(--af-green); }
.af-kanban-card-status.inactive { background: var(--af-text-faint); }
.af-kanban-card-agent {
display: flex;
align-items: center;
gap: 5px;
margin-bottom: 8px;
}
.af-kanban-card-agent-icon {
display: flex;
align-items: center;
color: var(--af-text-muted);
}
.af-kanban-card-agent-icon svg {
width: 12px;
height: 12px;
}
.af-kanban-card-agent-name {
font-size: 11px;
color: var(--af-accent);
}
/* ─── Inline Schedule Controls ─── */
.af-schedule-time-selects {
display: flex;
align-items: center;
gap: 4px;
}
.af-schedule-colon {
font-weight: 600;
color: var(--af-text-muted);
}
.af-form-select-sm {
width: auto;
min-width: 70px;
flex: none;
}
.af-schedule-day-buttons {
display: flex;
gap: 4px;
flex-wrap: wrap;
}
.af-schedule-day-btn {
padding: 4px 10px;
font-size: 11px;
font-weight: 500;
border-radius: var(--af-radius-sm);
border: 1px solid var(--af-border);
background: none !important;
color: var(--af-text-muted);
cursor: pointer;
transition: all var(--af-transition);
-webkit-appearance: none;
appearance: none;
}
.af-schedule-day-btn:hover {
border-color: var(--af-accent);
color: var(--af-text-primary);
}
.af-schedule-day-btn.active {
border-color: var(--af-accent);
color: var(--af-accent);
background: var(--af-accent-bg) !important;
}
/* Toggle alignment */
.af-form-row-toggle {
align-items: center;
}
.af-form-toggle {
margin: 0;
}
.af-kanban-card-footer {
display: flex;
justify-content: space-between;
align-items: center;
}
.af-kanban-card-schedule {
font-size: 10px;
color: var(--af-text-muted);
display: flex;
align-items: center;
gap: 4px;
}
.af-kanban-card-tags {
display: flex;
gap: 3px;
}
.af-kanban-card-tag {
padding: 1px 6px;
border-radius: 3px;
font-size: 9px;
font-weight: 500;
}
.af-kanban-card-tag.monitoring { background: var(--af-blue-bg); color: var(--af-blue); }
.af-kanban-card-tag.devops { background: var(--af-orange-bg); color: var(--af-orange); }
.af-kanban-card-tag.sample { background: var(--af-purple-bg); color: var(--af-purple); }
.af-kanban-card-tag.default { background: var(--af-bg-surface); color: var(--af-text-muted); }
.af-kanban-card-error {
padding: 6px 0;
font-size: 11px;
color: var(--af-red);
display: flex;
align-items: center;
gap: 4px;
}
.af-kanban-progress {
margin: 8px 0;
}
.af-kanban-progress-track {
background: var(--af-bg-surface);
border-radius: 4px;
height: 4px;
overflow: hidden;
}
.af-kanban-progress-bar {
background: var(--af-yellow);
height: 100%;
width: 0%;
border-radius: 4px;
}
.af-kanban-progress-bar-real {
transition: width 1s linear;
}
.af-kanban-stop-btn {
-webkit-appearance: none;
appearance: none;
display: flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
padding: 0;
margin: 0;
border: none;
background: transparent !important;
box-shadow: none;
color: var(--af-red, #ef4444);
cursor: pointer;
opacity: 0.5;
transition: opacity 0.15s ease;
margin-left: auto;
flex-shrink: 0;
}
.af-kanban-stop-btn:hover {
opacity: 1;
}
.af-kanban-stop-btn svg {
width: 14px;
height: 14px;
}
.af-kanban-col-add {
padding: 10px 14px;
border-top: 1px solid var(--af-border);
flex-shrink: 0;
}
.af-kanban-col-add button {
width: 100%;
padding: 6px;
border-radius: var(--af-radius-sm);
color: var(--af-text-muted);
font-size: 11px;
transition: all var(--af-transition);
border: 1px dashed var(--af-border);
background: none;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
gap: 4px;
}
.af-kanban-col-add button:hover {
color: var(--af-accent);
border-color: var(--af-accent);
background: var(--af-accent-bg);
}
/* ─── Priority Badge (detail page) ─── */
.af-priority-badge {
display: inline-block;
padding: 2px 8px;
border-radius: var(--af-radius-sm);
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.af-priority-badge.critical { background: rgba(239, 68, 68, 0.15); color: #ef4444; }
.af-priority-badge.high { background: rgba(245, 158, 11, 0.15); color: #f59e0b; }
.af-priority-badge.medium { background: rgba(59, 130, 246, 0.15); color: #3b82f6; }
.af-priority-badge.low { background: var(--af-bg-surface); color: var(--af-text-secondary); }
/* ─── Schedule body toggle ─── */
.af-schedule-body {
padding-left: 4px;
}
/* ─── Runs / History Page ─── */
.af-runs-page {
padding: 20px;
}
.af-runs-toolbar {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 14px;
}
.af-runs-table {
width: 100%;
background: var(--af-bg-card);
border: 1px solid var(--af-border);
border-radius: var(--af-radius-lg);
overflow: hidden;
}
.af-runs-table table {
width: 100%;
border-collapse: collapse;
}
.af-runs-table th {
text-align: left;
padding: 10px 16px;
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.3px;
color: var(--af-text-muted);
background: var(--af-bg-secondary);
border-bottom: 1px solid var(--af-border);
}
.af-runs-table td {
padding: 10px 16px;
font-size: 12px;
border-bottom: 1px solid var(--af-border);
}
.af-runs-table tr:last-child td {
border-bottom: none;
}
.af-runs-table tr {
cursor: pointer;
transition: background var(--af-transition);
}
.af-runs-table tbody tr:hover td {
background: var(--af-bg-card-hover);
}
/* ─── Status Badge ─── */
.af-status-badge {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px 8px;
border-radius: 4px;
font-size: 11px;
font-weight: 500;
white-space: nowrap;
}
.af-status-badge span {
display: inline-flex;
align-items: center;
}
.af-status-badge svg {
width: 12px;
height: 12px;
}
.af-status-badge.success { background: var(--af-green-bg); color: var(--af-green); }
.af-status-badge.failure { background: var(--af-red-bg); color: var(--af-red); }
.af-status-badge.running { background: var(--af-yellow-bg); color: var(--af-yellow); }
.af-status-badge.pending { background: var(--af-blue-bg); color: var(--af-blue); }
.af-status-badge.timeout { background: var(--af-orange-bg); color: var(--af-orange); }
.af-status-badge.cancelled { background: var(--af-yellow-bg); color: var(--af-yellow); }
.af-mono {
font-family: var(--font-monospace);
font-size: 11px;
}
.af-agent-link {
color: var(--af-accent);
cursor: pointer;
}
/* ─── Skills Page ─── */
.af-skills-page {
padding: 20px;
}
.af-skills-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: 14px;
margin-top: 14px;
}
.af-skill-card {
background: var(--af-bg-card);
border: 1px solid var(--af-border);
border-radius: var(--af-radius-lg);
padding: 18px;
transition: all var(--af-transition);
}
.af-skill-card:hover {
border-color: var(--af-border-hover);
}
.af-skill-card-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
}
.af-skill-card-icon {
margin-bottom: 10px;
color: var(--af-purple);
}
.af-skill-card-icon svg {
width: 24px;
height: 24px;
}
.af-skill-card-name {
font-weight: 600;
font-size: 13px;
margin-bottom: 4px;
}
.af-skill-card-desc {
color: var(--af-text-secondary);
font-size: 11px;
margin-bottom: 12px;
}
.af-skill-card-agents {
display: flex;
gap: 4px;
flex-wrap: wrap;
}
.af-skill-card-agent-tag {
padding: 2px 6px;
border-radius: 3px;
font-size: 10px;
background: var(--af-accent-bg);
color: var(--af-accent);
}
/* ─── Slideover ─── */
.af-slideover-overlay {
position: absolute;
inset: 0;
background: rgba(0, 0, 0, 0.5);
z-index: 100;
}
.af-slideover {
position: absolute;
top: 0;
right: 0;
width: 480px;
max-width: 90%;
height: 100%;
background: var(--af-bg-secondary);
border-left: 1px solid var(--af-border);
z-index: 101;
display: flex;
flex-direction: column;
}
.af-slideover-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 16px 20px;
border-bottom: 1px solid var(--af-border);
}
.af-slideover-title {
font-weight: 600;
font-size: 14px;
}
/* Close buttons use Obsidian's native clickable-icon class */
.af-slideover-body {
flex: 1;
overflow-y: auto;
padding: 20px;
}
.af-slideover-section {
margin-bottom: 20px;
}
.af-slideover-section-title {
font-weight: 600;
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--af-text-muted);
margin-bottom: 10px;
}
.af-detail-row {
display: flex;
align-items: flex-start;
gap: 12px;
padding: 6px 0;
border-bottom: 1px solid var(--af-border);
}
.af-detail-label {
color: var(--af-text-muted);
font-size: 12px;
width: 100px;
flex-shrink: 0;
}
.af-detail-value {
font-size: 12px;
font-weight: 500;
flex: 1;
word-break: break-word;
}
.af-detail-value.af-accent {
color: var(--af-accent);
}
.af-output-block {
background: var(--af-bg-primary);
border: 1px solid var(--af-border);
border-radius: var(--af-radius-sm);
padding: 12px;
font-family: var(--font-monospace);
font-size: 11px;
line-height: 1.6;
color: var(--af-text-secondary);
max-height: 300px;
overflow-y: auto;
white-space: pre-wrap;
}
.af-slideover-actions {
display: flex;
gap: 8px;
margin-top: 12px;
}
/* ─── Schedule Editor ─── */
.af-schedule-editor {
max-width: 400px;
}
.af-schedule-time-row {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 0 16px;
}
.af-schedule-select {
width: 70px;
}
.af-schedule-day-row {
display: flex;
gap: 4px;
padding: 8px 0 16px;
flex-wrap: wrap;
}
.af-schedule-day-btn {
padding: 4px 10px;
border-radius: var(--af-radius-sm);
font-size: 11px;
font-weight: 500;
border: 1px solid var(--background-modifier-border);
background: none;
cursor: pointer;
color: var(--text-muted);
transition: all 150ms ease;
}
.af-schedule-day-btn.active {
background: var(--interactive-accent);
color: var(--text-on-accent, white);
border-color: var(--interactive-accent);
}
.af-schedule-day-btn:hover {
border-color: var(--interactive-accent);
}
.af-schedule-preview {
padding: 10px 0 16px;
font-size: 12px;
color: var(--text-muted);
}
.af-schedule-preview code {
background: var(--background-modifier-form-field);
padding: 2px 6px;
border-radius: 4px;
font-size: 12px;
}
/* ─── Empty State ─── */
.af-empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 60px 20px;
color: var(--af-text-muted);
grid-column: 1 / -1;
text-align: center;
}
.af-empty-icon {
margin-bottom: 12px;
opacity: 0.5;
color: var(--af-text-faint);
}
.af-empty-icon svg {
width: 40px;
height: 40px;
}
.af-empty-label {
font-size: 14px;
font-weight: 500;
margin-bottom: 4px;
}
.af-empty-sublabel {
font-size: 12px;
}
/* ─── Responsive ─── */
@media (max-width: 1000px) {
.af-dash-grid {
grid-template-columns: repeat(2, 1fr);
}
.af-dash-split {
grid-template-columns: 1fr;
}
.af-charts-row {
grid-template-columns: 1fr;
}
}
/* ═══════════════════════════════════════════════════════
Legacy sidebar styles (backward compatibility)
═══════════════════════════════════════════════════════ */
.agent-fleet-view {
padding: 12px;
}
.agent-fleet-header,
.agent-fleet-actions {
display: flex;
gap: 8px;
align-items: center;
justify-content: space-between;
}
.agent-fleet-card,
.agent-fleet-section,
.agent-fleet-issues {
border: 1px solid var(--background-modifier-border);
border-radius: 10px;
padding: 10px;
margin-bottom: 10px;
}
.agent-fleet-card-title {
font-weight: 600;
}
.agent-fleet-card-subtitle,
.agent-fleet-meta {
color: var(--text-muted);
margin-top: 4px;
}
.agent-fleet-task-list {
margin: 8px 0 0 16px;
}
.agent-fleet-textarea {
width: 100%;
margin: 8px 0 16px;
}
/* ─── Create Agent Modal ─── */
.af-create-agent-modal {
max-width: 600px;
width: 600px;
}
.af-create-header {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 16px;
}
.af-create-header h3 {
margin: 0;
font-size: 16px;
font-weight: 700;
}
.af-create-header-icon {
color: var(--interactive-accent);
display: flex;
align-items: center;
}
.af-create-header-icon svg {
width: 22px;
height: 22px;
}
.af-create-scroll {
max-height: 60vh;
overflow-y: auto;
padding-right: 4px;
}
.af-create-section {
margin-bottom: 18px;
padding-bottom: 16px;
border-bottom: 1px solid var(--background-modifier-border);
}
.af-create-section:last-child {
border-bottom: none;
margin-bottom: 0;
}
.af-create-section-header {
display: flex;
align-items: center;
gap: 8px;
font-weight: 600;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--text-muted);
margin-bottom: 12px;
}
.af-create-section-icon {
display: flex;
align-items: center;
color: var(--interactive-accent);
}
.af-create-section-icon svg {
width: 14px;
height: 14px;
}
.af-create-textarea {
width: 100%;
min-height: 80px;
padding: 10px 12px;
font-size: 12px;
font-family: var(--font-monospace);
line-height: 1.5;
background: var(--background-modifier-form-field);
border: 1px solid var(--background-modifier-border);
border-radius: 6px;
color: var(--text-normal);
resize: vertical;
margin-top: 4px;
}
.af-create-textarea:focus {
border-color: var(--interactive-accent);
outline: none;
}
.af-create-subsection-label {
font-size: 12px;
font-weight: 600;
color: var(--text-muted);
margin-bottom: 6px;
margin-top: 10px;
}
.af-create-skills-grid {
display: flex;
flex-direction: column;
gap: 6px;
margin-bottom: 10px;
}
.af-create-skill-item {
display: flex;
align-items: flex-start;
gap: 8px;
padding: 6px 8px;
border-radius: 6px;
background: var(--background-secondary);
transition: background 150ms ease;
}
.af-create-skill-item:hover {
background: var(--background-modifier-hover);
}
.af-create-skill-item input[type="checkbox"] {
margin-top: 2px;
flex-shrink: 0;
}
.af-create-skill-label {
display: flex;
flex-direction: column;
gap: 1px;
min-width: 0;
}
.af-create-skill-name {
font-size: 12px;
font-weight: 600;
}
.af-create-skill-desc {
font-size: 11px;
color: var(--text-muted);
}
.af-create-footer {
display: flex;
justify-content: flex-end;
gap: 8px;
margin-top: 16px;
padding-top: 14px;
border-top: 1px solid var(--background-modifier-border);
}
.af-create-submit-btn {
background: var(--interactive-accent) !important;
color: var(--text-on-accent, white) !important;
border: none !important;
padding: 6px 18px;
border-radius: 6px;
font-weight: 600;
font-size: 13px;
cursor: pointer;
display: flex;
align-items: center;
gap: 6px;
}
.af-create-submit-btn:hover {
opacity: 0.9;
}
.af-create-btn-icon {
display: flex;
align-items: center;
order: -1;
}
.af-create-btn-icon svg {
width: 14px;
height: 14px;
}
/* ─── Create Agent Full Page ─── */
.af-create-agent-page {
padding: 20px;
max-width: 800px;
}
.af-create-form {
display: flex;
flex-direction: column;
gap: 6px;
margin-top: 16px;
}
.af-create-form .af-create-section {
background: var(--af-bg-card);
border: 1px solid var(--af-border);
border-radius: var(--af-radius-lg);
padding: 18px;
}
.af-create-form .af-create-section-header {
display: flex;
align-items: center;
gap: 8px;
font-weight: 600;
font-size: 13px;
margin-bottom: 14px;
color: var(--af-text-primary);
}
.af-create-form .af-create-section-icon {
display: flex;
align-items: center;
color: var(--af-accent);
}
.af-create-form .af-create-section-icon svg {
width: 16px;
height: 16px;
}
.af-form-row {
display: flex;
align-items: flex-start;
gap: 12px;
margin-bottom: 10px;
}
/* Form toggles reuse .af-agent-card-toggle styles */
.af-form-field-wrap {
flex: 1;
display: flex;
flex-direction: column;
min-width: 0;
}
.af-form-label {
width: 130px;
flex-shrink: 0;
font-size: 12px;
font-weight: 500;
color: var(--af-text-secondary);
padding-top: 7px;
line-height: 1;
}
.af-form-desc {
font-size: 10px;
color: var(--af-text-muted);
font-weight: 400;
margin-top: 2px;
}
/* Info-icon tooltip — replaces verbose subtitles on form labels */
.af-form-tooltip {
display: inline-flex;
align-items: center;
justify-content: center;
width: 14px;
height: 14px;
margin-left: 4px;
color: var(--af-text-faint);
cursor: help;
position: relative;
vertical-align: middle;
}
.af-form-tooltip svg {
width: 12px;
height: 12px;
}
.af-form-tooltip .af-tooltip-text {
display: none;
position: absolute;
left: 50%;
bottom: calc(100% + 6px);
transform: translateX(-50%);
background: var(--af-bg-card);
border: 1px solid var(--af-border);
border-radius: var(--af-radius-md);
padding: 6px 10px;
font-size: 11px;
font-weight: 400;
color: var(--af-text-secondary);
min-width: 220px;
max-width: 400px;
white-space: normal;
z-index: 100;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
pointer-events: none;
line-height: 1.4;
}
.af-form-tooltip:hover .af-tooltip-text {
display: block;
}
.af-tooltip-text {
text-transform: none;
letter-spacing: normal;
}
.af-form-sublabel {
font-size: 11px;
font-weight: 600;
color: var(--af-text-muted);
margin-bottom: 6px;
margin-top: 10px;
text-transform: uppercase;
letter-spacing: 0.3px;
}
.af-form-input {
flex: 1;
padding: 6px 10px;
font-size: 12px;
border: 1px solid var(--af-border);
border-radius: var(--af-radius-sm);
background: var(--af-bg-input);
color: var(--af-text-primary);
}
.af-form-input:focus {
border-color: var(--af-accent);
outline: none;
}
.af-form-input-sm {
max-width: 80px;
}
.af-form-select {
flex: 1;
padding: 6px 10px;
font-size: 12px;
border: 1px solid var(--af-border);
border-radius: var(--af-radius-sm);
background: var(--af-bg-input);
color: var(--af-text-primary);
}
.af-create-prompt-textarea {
width: 100%;
padding: 10px 12px;
font-size: 12px;
font-family: var(--font-monospace);
line-height: 1.6;
background: var(--af-bg-input);
border: 1px solid var(--af-border);
border-radius: var(--af-radius-sm);
color: var(--af-text-primary);
resize: vertical;
margin-top: 8px;
}
.af-create-prompt-textarea:focus {
border-color: var(--af-accent);
outline: none;
}
.af-create-config-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 4px 20px;
}
.af-create-agent-page .af-create-footer {
margin-top: 20px;
padding: 16px 0;
border-top: 1px solid var(--af-border);
display: flex;
justify-content: flex-end;
gap: 8px;
}
.af-create-submit {
font-size: 13px;
padding: 6px 18px;
}
/* ─── Chat View (standalone panel) ─── */
.af-chat-view-container {
display: flex;
flex-direction: column;
height: 100%;
overflow: hidden;
}
.af-chat-view-header {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 14px;
border-bottom: 1px solid var(--af-border);
flex-shrink: 0;
}
.af-chat-view-agent-select {
flex: 1;
font-size: 13px;
font-weight: 500;
padding: 6px 10px;
border-radius: 6px;
border: 1px solid var(--af-border);
background: var(--af-card-bg);
color: var(--af-text-primary);
}
.af-chat-view-new-btn {
white-space: nowrap;
flex-shrink: 0;
}
.af-chat-view-empty {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 12px;
padding: 40px 20px;
color: var(--af-text-muted);
flex: 1;
}
.af-chat-view-empty-icon {
color: var(--af-text-muted);
opacity: 0.4;
}
.af-chat-view-empty-icon svg {
width: 32px;
height: 32px;
}
.af-chat-view-empty-text {
font-size: 14px;
font-weight: 500;
text-align: center;
color: var(--af-text-primary);
}
.af-chat-view-empty-hint {
font-size: 12px;
text-align: center;
color: var(--af-text-secondary);
margin-top: 4px;
}
/* ── Code Block Copy Button ── */
/* Hide Obsidian's native copy button in chat */
.af-chat-bubble .copy-code-button {
display: none !important;
}
/* Our code block copy button — matches af-chat-copy-btn style */
.af-code-copy-btn {
position: absolute;
top: 6px;
right: 6px;
display: flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
padding: 0;
margin: 0;
border: none;
border-radius: 4px;
background: transparent;
color: var(--af-text-secondary);
cursor: pointer;
opacity: 0;
transition: opacity 0.15s ease, background 0.15s ease;
}
.af-chat-bubble pre:hover .af-code-copy-btn {
opacity: 0.7;
}
.af-code-copy-btn:hover {
opacity: 1 !important;
background: var(--af-border);
}
.af-code-copy-btn.copied {
opacity: 1 !important;
color: var(--af-green);
}
.af-code-copy-btn svg {
width: 14px;
height: 14px;
}
/* ── Chat Attach Button ── */
.af-chat-attach-btn {
-webkit-appearance: none;
appearance: none;
display: flex;
align-items: center;
justify-content: center;
width: 18px;
height: 18px;
padding: 0;
margin: 0;
border: none;
background: transparent !important;
box-shadow: none;
outline: none;
color: var(--af-text-secondary);
cursor: pointer;
flex-shrink: 0;
opacity: 0.45;
transition: opacity 0.15s ease;
}
.af-chat-attach-btn:hover {
opacity: 1;
background: transparent !important;
}
.af-chat-attach-btn:active,
.af-chat-attach-btn:focus {
background: transparent !important;
box-shadow: none;
}
.af-chat-attach-btn.af-chat-stop-mode {
color: var(--af-red, #ef4444);
opacity: 0.7;
}
.af-chat-attach-btn.af-chat-stop-mode:hover {
opacity: 1;
}
.af-chat-attach-btn svg {
width: 18px;
height: 18px;
}
/* ── Chat Input Row alignment ── */
.af-chat-input-row {
display: flex;
align-items: center;
gap: 8px;
}
/* ── Chat Attachment Pills ── */
.af-chat-pills-row {
display: flex;
flex-wrap: wrap;
gap: 6px;
/* Align with input: attach btn (18px) + gap (8px) */
padding: 0 12px 8px calc(18px + 8px);
}
.af-chat-pill {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 3px 8px 3px 6px;
border-radius: 12px;
background: var(--af-card-bg);
border: 1px solid var(--af-border);
font-size: 11px;
color: var(--af-text-secondary);
max-width: 200px;
}
.af-chat-pill-icon {
display: flex;
flex-shrink: 0;
}
.af-chat-pill-icon svg {
width: 12px;
height: 12px;
opacity: 0.6;
}
.af-chat-pill-name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.af-chat-pill-remove {
display: flex;
cursor: pointer;
opacity: 0.5;
flex-shrink: 0;
margin-left: 2px;
}
.af-chat-pill-remove:hover {
opacity: 1;
}
.af-chat-pill-remove svg {
width: 12px;
height: 12px;
}
/* Inline attachment pills shown above user messages */
.af-chat-bubble-attachments {
display: flex;
flex-wrap: wrap;
gap: 4px;
justify-content: flex-end;
padding: 0 4px 4px 0;
}
.af-chat-pill-inline {
cursor: default;
opacity: 0.7;
font-size: 10px;
padding: 2px 6px 2px 4px;
}
/* Drag-over highlight for image drops */
.af-chat-input-dragover {
outline: 2px dashed var(--af-blue);
outline-offset: -2px;
border-radius: 8px;
}
/* ─── Chat Slideover ─── */
.af-slideover.af-chat-slideover {
width: 540px;
}
.af-chat-header-title {
display: flex;
align-items: center;
gap: 8px;
}
.af-chat-header-actions {
display: flex;
align-items: center;
gap: 6px;
}
.af-chat-header-icon {
display: flex;
align-items: center;
color: var(--af-accent);
}
.af-chat-header-icon svg {
width: 16px;
height: 16px;
}
.af-chat-messages {
flex: 1;
overflow-y: auto;
padding: 16px;
display: flex;
flex-direction: column-reverse;
overflow-anchor: auto !important;
}
.af-chat-messages-inner {
display: flex;
flex-direction: column;
gap: 10px;
}
.af-chat-bubble {
max-width: 85%;
padding: 10px 14px;
border-radius: var(--af-radius-md);
font-size: 13px;
line-height: 1.55;
white-space: pre-wrap;
word-break: break-word;
user-select: text;
-webkit-user-select: text;
position: relative;
overflow: visible;
}
.af-chat-bubble:hover .af-chat-copy-btn {
opacity: 1 !important;
}
.af-chat-copy-btn {
position: absolute;
top: 4px;
right: 4px;
width: 24px;
height: 24px;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
background: var(--af-bg-secondary);
border: none;
color: var(--af-text-muted);
cursor: pointer;
opacity: 0;
transition: opacity 150ms ease, color 150ms ease;
padding: 0;
z-index: 2;
}
.af-chat-copy-btn svg {
width: 12px;
height: 12px;
}
.af-chat-copy-btn:hover {
color: var(--af-accent);
}
.af-chat-copy-btn.copied {
color: var(--af-green);
opacity: 1;
}
.af-chat-bubble-user {
align-self: flex-end;
background: transparent;
color: var(--af-text-primary);
border: 1px solid var(--af-accent);
border-bottom-right-radius: var(--af-radius-sm);
}
.af-chat-bubble-assistant {
align-self: flex-start;
background: var(--af-bg-surface);
color: var(--af-text-primary);
border: 1px solid var(--af-border);
border-bottom-left-radius: var(--af-radius-sm);
}
/* Compact markdown — shared by chat bubbles + run output */
.af-compact-md {
font-family: inherit;
font-size: 13px;
white-space: normal;
line-height: 1.5;
}
.af-compact-md p {
margin: 0 0 4px 0;
}
.af-compact-md p:last-child {
margin-bottom: 0;
}
.af-compact-md h1,
.af-compact-md h2,
.af-compact-md h3,
.af-compact-md h4,
.af-compact-md h5,
.af-compact-md h6 {
font-size: 13px;
font-weight: 600;
margin: 6px 0 2px 0;
padding: 0;
}
.af-compact-md > :first-child {
margin-top: 0;
}
.af-compact-md ul,
.af-compact-md ol {
margin: 2px 0;
padding-left: 18px;
}
.af-compact-md li {
margin: 0;
padding: 0;
}
.af-compact-md li > p {
margin: 0;
}
.af-compact-md hr {
margin: 4px 0;
border: none;
border-top: 1px solid var(--af-border);
}
.af-compact-md strong {
font-weight: 600;
color: var(--af-text-primary);
}
.af-compact-md table {
border-collapse: collapse;
font-size: 12px;
margin: 4px 0;
width: 100%;
}
.af-compact-md th,
.af-compact-md td {
border: 1px solid var(--af-border);
padding: 3px 8px;
text-align: left;
}
.af-compact-md th {
font-weight: 600;
background: var(--af-bg-secondary);
}
.af-compact-md code {
font-size: 12px;
background: var(--af-bg-secondary);
padding: 1px 4px;
border-radius: 3px;
}
.af-compact-md pre {
margin: 4px 0;
padding: 8px;
background: var(--af-bg-secondary);
border-radius: var(--af-radius-sm);
overflow-x: auto;
font-size: 12px;
}
.af-compact-md pre code {
background: none;
padding: 0;
}
.af-compact-md blockquote {
margin: 2px 0;
padding: 2px 0 2px 10px;
border-left: 3px solid var(--af-accent);
color: var(--af-text-secondary);
}
.af-chat-bubble-error {
align-self: stretch;
background: rgba(243, 139, 168, 0.12);
color: var(--af-red);
border: 1px solid var(--af-red);
border-radius: var(--af-radius-sm);
font-size: 12px;
}
/* ─── Activity indicator ─── */
.af-chat-activity {
align-self: flex-start;
font-size: 12px;
color: var(--af-text-muted);
padding: 6px 14px;
font-style: italic;
animation: af-chat-pulse 2s ease-in-out infinite;
}
@keyframes af-chat-pulse {
0%, 100% { opacity: 0.6; }
50% { opacity: 1; }
}
/* ─── Tool call summary ─── */
.af-chat-tool-summary {
align-self: flex-start;
max-width: 85%;
font-size: 12px;
}
.af-chat-tool-summary details {
border: 1px solid var(--af-border);
border-radius: var(--af-radius-sm);
background: var(--af-bg-surface);
overflow: hidden;
}
.af-chat-tool-summary summary {
padding: 6px 10px;
cursor: pointer;
color: var(--af-text-muted);
display: flex;
align-items: center;
gap: 4px;
user-select: none;
font-size: 11px;
}
.af-chat-tool-summary summary:hover {
color: var(--af-text-primary);
background: var(--af-bg-secondary);
}
.af-chat-tool-icon {
display: inline-flex;
align-items: center;
}
.af-chat-tool-icon svg {
width: 12px;
height: 12px;
}
.af-chat-tool-list {
padding: 4px 10px 8px 10px;
border-top: 1px solid var(--af-border);
}
.af-chat-tool-item {
display: flex;
gap: 8px;
align-items: baseline;
padding: 2px 0;
font-family: var(--font-monospace);
font-size: 11px;
line-height: 1.5;
color: var(--af-text-muted);
}
.af-chat-tool-name {
color: var(--af-text-secondary);
white-space: nowrap;
font-weight: 500;
}
.af-chat-tool-cmd {
color: var(--af-text-muted);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 280px;
}
.af-chat-streaming-dot {
display: flex;
gap: 5px;
padding: 10px 14px;
align-self: flex-start;
}
.af-chat-streaming-dot span {
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--af-text-muted);
animation: af-chat-bounce 1.2s ease-in-out infinite;
}
.af-chat-streaming-dot span:nth-child(2) {
animation-delay: 0.2s;
}
.af-chat-streaming-dot span:nth-child(3) {
animation-delay: 0.4s;
}
@keyframes af-chat-bounce {
0%, 60%, 100% {
opacity: 0.3;
transform: scale(0.8);
}
30% {
opacity: 1;
transform: scale(1);
}
}
.af-chat-working-indicator {
font-size: 11px;
color: var(--af-text-secondary);
padding: 0 0 6px 0;
opacity: 0.8;
}
.af-chat-input-area {
border-top: 1px solid var(--af-border);
padding: 12px 16px 16px 16px;
background: transparent;
flex-shrink: 0;
}
.af-chat-input-row {
position: relative;
display: flex;
}
.af-chat-input {
width: 100%;
resize: none;
border: 1px solid var(--af-border);
border-radius: var(--af-radius-md);
padding: 8px 44px 8px 12px;
background: var(--af-bg-surface);
color: var(--af-text-primary);
font-size: 13px;
line-height: 1.5;
min-height: 32px;
max-height: 160px;
font-family: inherit;
overflow-y: hidden;
}
.af-chat-input:focus {
outline: none;
border-color: var(--af-accent);
box-shadow: 0 0 0 2px var(--af-accent-bg, rgba(var(--interactive-accent-rgb, 126, 101, 230), 0.15));
}
.af-chat-input:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.af-chat-send-btn {
-webkit-appearance: none;
appearance: none;
display: flex;
align-items: center;
justify-content: center;
width: 18px;
height: 18px;
padding: 0;
margin: 0;
border: none;
background: transparent !important;
box-shadow: none;
outline: none;
color: var(--af-text-secondary);
cursor: pointer;
flex-shrink: 0;
opacity: 0.45;
transition: opacity 0.15s ease;
}
.af-chat-send-btn .af-btn-icon {
display: flex;
align-items: center;
justify-content: center;
color: inherit;
}
.af-chat-send-btn .af-btn-icon svg {
width: 18px;
height: 18px;
}
.af-chat-send-btn:hover:not(:disabled) {
opacity: 1;
background: transparent !important;
}
.af-chat-send-btn:active,
.af-chat-send-btn:focus {
background: transparent !important;
box-shadow: none;
}
.af-chat-send-btn:disabled {
opacity: 0.15;
cursor: not-allowed;
}
/* ─── Icon Picker Modal ─── */
.af-icon-picker-modal {
width: 500px;
max-width: 100%;
padding: 12px;
display: flex;
flex-direction: column;
gap: 8px;
}
.af-icon-picker-search {
width: 100%;
box-sizing: border-box;
padding: 7px 10px;
border-radius: var(--af-radius-sm);
border: 1px solid var(--af-border);
background: var(--af-bg-input);
color: var(--af-text-primary);
font-size: 13px;
outline: none;
}
.af-icon-picker-search:focus {
border-color: var(--af-accent);
box-shadow: 0 0 0 2px var(--af-accent-bg);
}
.af-icon-picker-scroll {
max-height: 380px;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 12px;
}
.af-icon-picker-section {
display: flex;
flex-direction: column;
gap: 6px;
}
.af-icon-picker-section-label {
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--af-text-muted);
padding: 0 2px;
}
.af-icon-picker-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(36px, 1fr));
gap: 3px;
}
.af-icon-picker-item {
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
border-radius: var(--af-radius-sm);
cursor: pointer;
color: var(--af-text-secondary);
transition: background var(--af-transition), color var(--af-transition);
}
.af-icon-picker-item svg {
width: 16px;
height: 16px;
pointer-events: none;
}
.af-icon-picker-item:hover {
background: var(--af-bg-card-hover);
color: var(--af-text-primary);
}
.af-icon-picker-item.selected {
background: var(--af-accent-bg);
color: var(--af-accent);
}
/* ─── Avatar Picker Button (edit form) ─── */
.af-avatar-picker-btn {
display: flex;
align-items: center;
gap: 8px;
padding: 5px 10px;
border-radius: var(--af-radius-sm);
border: 1px solid var(--af-border);
background: var(--af-bg-input);
color: var(--af-text-primary);
cursor: pointer;
font-size: 13px;
transition: border-color var(--af-transition), background var(--af-transition);
}
.af-avatar-picker-btn:hover {
border-color: var(--af-accent);
background: var(--af-bg-card-hover);
}
.af-avatar-picker-preview {
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
color: var(--af-accent);
}
.af-avatar-picker-preview svg {
width: 16px;
height: 16px;
}
.af-avatar-picker-label {
color: var(--af-text-secondary);
font-size: 12px;
}
/* ─── Sidebar card avatar ─── */
.agent-fleet-card-avatar {
display: inline-flex;
align-items: center;
justify-content: center;
width: 18px;
height: 18px;
margin-right: 5px;
flex-shrink: 0;
vertical-align: middle;
}
.agent-fleet-card-avatar svg {
width: 14px;
height: 14px;
}
/* ═══════════════════════════════════════════════════════
MCP Servers Page
═══════════════════════════════════════════════════════ */
.af-mcp-card {
background: var(--af-bg-card);
border: 1px solid var(--af-border);
border-radius: var(--af-radius-lg);
padding: 18px;
transition: all var(--af-transition);
cursor: pointer;
}
.af-mcp-card:hover {
border-color: var(--af-border-hover);
}
.af-mcp-meta {
display: flex;
align-items: center;
gap: 6px;
flex-wrap: wrap;
}
.af-mcp-type-badge {
display: inline-block;
padding: 1px 7px;
border-radius: 4px;
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
background: var(--af-bg-surface);
color: var(--af-text-secondary);
border: 1px solid var(--af-border);
vertical-align: middle;
}
.af-mcp-status-badge {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px 8px;
border-radius: 10px;
font-size: 11px;
font-weight: 500;
white-space: nowrap;
}
.af-mcp-status-badge.connected {
background: var(--af-green-bg);
color: var(--af-green);
}
.af-mcp-status-badge.needs-auth {
background: var(--af-yellow-bg);
color: var(--af-yellow);
}
.af-mcp-status-badge.error,
.af-mcp-status-badge.disconnected {
background: var(--af-red-bg);
color: var(--af-red);
}
.af-mcp-status-badge > span {
display: inline-flex;
align-items: center;
}
.af-mcp-status-badge svg {
width: 12px;
height: 12px;
flex-shrink: 0;
}
/* Status dot for edit form checklist */
.af-mcp-status-dot {
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
margin-right: 4px;
}
.af-mcp-status-dot.connected { background: var(--af-green); }
.af-mcp-status-dot.needs-auth { background: var(--af-yellow); }
.af-mcp-status-dot.error,
.af-mcp-status-dot.disconnected { background: var(--af-red); }
.af-mcp-command {
font-family: var(--font-monospace);
font-size: 11px;
color: var(--af-text-secondary);
margin-top: 10px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* ─── MCP Card: Description ─── */
.af-mcp-description {
font-size: 12px;
color: var(--af-text-secondary);
margin-top: 8px;
line-height: 1.5;
}
/* ─── MCP Card: Tool Footer ─── */
.af-mcp-tool-footer {
margin-top: 10px;
}
.af-mcp-tool-count {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 11px;
color: var(--af-text-faint);
}
.af-mcp-tool-count svg {
width: 12px;
height: 12px;
}
.af-mcp-tool-chips {
display: flex;
flex-wrap: wrap;
gap: 4px;
margin-top: 8px;
}
.af-mcp-tool-chip {
display: inline-block;
padding: 2px 7px;
border-radius: 4px;
font-size: 10px;
font-family: var(--font-monospace);
background: var(--af-bg-surface);
color: var(--af-text-secondary);
border: 1px solid var(--af-border);
}
.af-mcp-tool-chip-more {
color: var(--af-text-faint);
font-family: var(--font-interface);
font-style: italic;
border: 1px dashed var(--af-border);
background: transparent;
}
/* ─── MCP Detail Slideover ─── */
.af-mcp-detail-description {
font-size: 12px;
color: var(--af-text-secondary);
line-height: 1.6;
white-space: pre-wrap;
max-height: 200px;
overflow-y: auto;
}
.af-mcp-tool-detail {
padding: 10px 12px;
background: var(--af-bg-surface);
border: 1px solid var(--af-border);
border-radius: var(--af-radius);
margin-bottom: 8px;
}
.af-mcp-tool-detail-header {
display: flex;
align-items: center;
gap: 8px;
}
.af-mcp-tool-detail-name {
display: inline-flex;
align-items: center;
gap: 4px;
font-family: var(--font-monospace);
font-size: 12px;
font-weight: 600;
color: var(--af-text-primary);
}
.af-mcp-tool-detail-name svg {
width: 12px;
height: 12px;
opacity: 0.5;
}
.af-mcp-tool-param-count {
font-size: 10px;
color: var(--af-text-faint);
padding: 1px 6px;
border-radius: 4px;
background: var(--af-bg-card);
border: 1px solid var(--af-border);
}
.af-mcp-tool-detail-desc {
font-size: 11px;
color: var(--af-text-secondary);
margin-top: 6px;
line-height: 1.5;
}
.af-mcp-tool-detail-desc summary {
cursor: pointer;
user-select: none;
}
.af-mcp-tool-detail-full {
margin-top: 6px;
white-space: pre-wrap;
font-size: 11px;
color: var(--af-text-secondary);
max-height: 200px;
overflow-y: auto;
padding: 6px 0;
}
.af-mcp-tool-params {
margin-top: 8px;
display: flex;
flex-direction: column;
gap: 4px;
}
.af-mcp-tool-param {
display: flex;
align-items: baseline;
gap: 6px;
font-size: 11px;
flex-wrap: wrap;
}
.af-mcp-tool-param-name {
font-family: var(--font-monospace);
font-weight: 500;
color: var(--af-text-primary);
}
.af-mcp-tool-param-type {
font-family: var(--font-monospace);
font-size: 10px;
color: var(--af-text-faint);
padding: 0 4px;
border-radius: 3px;
background: var(--af-bg-card);
border: 1px solid var(--af-border);
}
.af-mcp-tool-param-required {
font-size: 9px;
font-weight: 600;
text-transform: uppercase;
color: var(--af-yellow);
letter-spacing: 0.05em;
}
.af-mcp-tool-param-desc {
color: var(--af-text-faint);
font-size: 10px;
}
/* ─── MCP Tool Item (simple list fallback) ─── */
.af-mcp-tool-item {
font-family: var(--font-monospace);
font-size: 12px;
padding: 4px 8px;
background: var(--af-bg-surface);
border-radius: 4px;
margin-bottom: 4px;
color: var(--af-text-secondary);
}
/* ── MCP Discovery Progress ── */
.af-mcp-progress {
margin: 0 0 20px 0;
padding: 16px 20px;
background: var(--af-card-bg);
border: 1px solid var(--af-border);
border-radius: 10px;
}
.af-mcp-progress-header {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 12px;
}
.af-mcp-spinner {
display: flex;
gap: 4px;
align-items: center;
}
.af-mcp-spinner span {
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--af-blue);
animation: af-mcp-bounce 1.2s infinite ease-in-out;
}
.af-mcp-spinner span:nth-child(2) {
animation-delay: 0.15s;
}
.af-mcp-spinner span:nth-child(3) {
animation-delay: 0.3s;
}
@keyframes af-mcp-bounce {
0%, 60%, 100% { opacity: 0.3; transform: scale(0.8); }
30% { opacity: 1; transform: scale(1.1); }
}
.af-mcp-progress-label {
font-size: 13px;
font-weight: 500;
color: var(--af-text-primary);
}
.af-mcp-progress-bar {
height: 4px;
border-radius: 2px;
background: var(--af-border);
overflow: hidden;
margin-bottom: 8px;
}
.af-mcp-progress-fill {
height: 100%;
border-radius: 2px;
background: var(--af-blue);
transition: width 0.4s ease;
}
.af-mcp-progress-fill-slow {
/* When tool discovery is running (the slow phase), add a shimmer */
background: linear-gradient(
90deg,
var(--af-blue) 0%,
color-mix(in srgb, var(--af-blue) 60%, white) 50%,
var(--af-blue) 100%
);
background-size: 200% 100%;
animation: af-mcp-shimmer 1.5s infinite linear;
}
@keyframes af-mcp-shimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
.af-mcp-progress-detail {
font-size: 11px;
color: var(--af-text-secondary);
letter-spacing: 0.01em;
}
/* ── MCP Auth Button ── */
.af-mcp-auth-row {
padding: 10px 0 0;
border-top: 1px solid var(--af-border);
margin-top: 10px;
}
.af-mcp-auth-row .af-btn-sm {
width: 100%;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
}
.af-mcp-auth-row .af-btn-sm svg {
width: 14px;
height: 14px;
}
.af-spin {
display: inline-flex;
animation: af-spin 1s linear infinite;
}
@keyframes af-spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.af-mcp-hint-row {
font-size: 11px;
color: var(--af-text-secondary);
padding: 8px 0 0;
border-top: 1px solid var(--af-border);
margin-top: 10px;
}
.af-mcp-hint-row .af-link {
cursor: pointer;
text-decoration: underline;
opacity: 0.8;
}
.af-mcp-hint-row .af-link:hover {
opacity: 1;
}
/* ── MCP Slideover Actions ── */
.af-slideover-section .af-btn-sm {
margin-top: 6px;
}
.af-slideover-section .af-btn-sm + .af-btn-sm {
margin-left: 8px;
}
/* ── MCP Disabled State ── */
.af-mcp-card-disabled {
opacity: 0.55;
}
.af-mcp-card-disabled:hover {
opacity: 0.75;
}
.af-mcp-status-badge.disabled {
color: var(--af-text-secondary);
background: var(--af-border);
}
/* ── MCP Agent Config List ── */
.af-mcp-agent-item {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 12px;
border-radius: 8px;
background: var(--af-card-bg);
border: 1px solid var(--af-border);
}
.af-mcp-agent-label {
flex: 1;
min-width: 0;
}
.af-mcp-agent-name-row {
display: flex;
align-items: center;
gap: 8px;
}
.af-mcp-agent-tool-count {
font-size: 11px;
color: var(--af-text-secondary);
margin-left: auto;
white-space: nowrap;
}
.af-mcp-agent-tool-count.af-muted {
opacity: 0.6;
font-style: italic;
}
/* ── MCP Overview (Agent Detail) ── */
.af-mcp-overview-list {
display: flex;
flex-direction: column;
gap: 6px;
padding: 14px 18px;
}
.af-mcp-overview-row {
display: flex;
align-items: center;
gap: 8px;
}
.af-mcp-overview-name {
font-size: 13px;
font-weight: 500;
color: var(--af-text-primary);
}
.af-mcp-overview-tools {
font-size: 11px;
color: var(--af-text-secondary);
margin-left: auto;
}
.af-mcp-overview-tools.af-muted {
opacity: 0.6;
font-style: italic;
}
/* ── Model picker ── */
.af-model-picker {
display: flex;
flex-direction: column;
gap: 6px;
width: 100%;
}
.af-mp-select {
width: 100%;
}
.af-mp-custom-input {
font-family: var(--font-monospace, SFMono-Regular, Menlo, monospace);
font-size: 12px;
}
/* ── Chat stats strip (terminal-style) ── */
.af-chat-stats {
display: flex;
align-items: center;
/* Align with input: attach btn (18px) + gap (8px), plus a small inset so
* the model name breathes rather than hugging the textarea edge. */
padding: 6px 12px 0 calc(18px + 8px + 10px);
min-height: 12px;
font-family: var(--font-monospace, SFMono-Regular, Menlo, monospace);
font-size: 10px;
line-height: 1;
color: var(--af-text-faint);
}
.af-chat-stats-muted {
color: transparent;
}
/* One-line row: `<model> <bar> <pct>` — space-between for nice separation. */
.af-chat-stats-line {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
gap: 12px;
}
.af-chat-stats-model {
color: var(--af-text-secondary);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.af-chat-stats-ctx {
display: inline-flex;
align-items: baseline;
gap: 6px;
color: var(--af-text-faint);
flex-shrink: 0;
}
.af-chat-stats-bar {
/* Render the blocks at a reduced size so the bar reads as a thin rule
* rather than competing vertically with the model name. */
font-size: 8px;
line-height: 1;
letter-spacing: 0;
color: var(--af-text-secondary);
}
.af-chat-stats-pct {
color: var(--af-text-secondary);
min-width: 28px;
text-align: right;
}
.af-chat-stats-ctx.warn .af-chat-stats-bar,
.af-chat-stats-ctx.warn .af-chat-stats-pct {
color: var(--color-orange, #e8a23a);
}
/* Transient compact notice in the stats strip. Intentionally muted — it's
* informational ("we just summarized to free up context"), not an error. */
.af-chat-stats-compact {
color: var(--af-text-secondary);
font-size: 0.85em;
opacity: 0.85;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* ── Chat threading ── */
/* Thread badge: mirrors the `.af-chat-tool-summary summary` treatment —
* bordered rounded pill, surface bg, muted text, darker-bg on hover. Keeps
* thread and tool-calls affordances visually consistent. */
/* Affordances row — a horizontal flex container that hosts the thread
* badge and the tool-calls summary side-by-side under an assistant bubble.
* `flex-start` alignment keeps the two buttons flush at the top even when
* the tool-calls <details> is expanded and its block height grows below. */
.af-chat-affordances {
align-self: flex-start;
display: flex;
align-items: flex-start;
flex-wrap: wrap;
gap: 8px;
}
/* The tool-summary already sets `align-self: flex-start` for its messages-list
* position, but inside the affordances row we want it to sit on the
* baseline next to the thread badge — reset. */
.af-chat-affordances .af-chat-tool-summary {
align-self: auto;
}
/* Inside the affordances row, keep the original `<details>` + `<summary>` +
* `.af-chat-tool-list` structure so that expanding the tool-calls pill
* reads as ONE bordered component (summary on top, list below, single
* border wraps both). Height matching is done by sizing the inner summary
* so that summary+border == thread-badge total height. */
.af-thread-badge,
.af-chat-affordances .af-chat-tool-summary,
.af-chat-affordances .af-chat-tool-summary details,
.af-chat-affordances .af-chat-tool-summary summary {
font-size: 11px;
line-height: 1.4;
box-sizing: border-box;
margin: 0;
}
/* Border lives on <details> (wraps summary + list). `overflow: hidden`
* clips the list's corners to the details radius. */
.af-chat-affordances .af-chat-tool-summary details {
border: 1px solid var(--af-border);
border-radius: var(--af-radius-sm);
background: var(--af-bg-surface);
overflow: hidden;
}
/* Summary is the button surface — no border of its own (its parent
* details provides one). Height 26px + details' 2px border = 28px total,
* matching the thread badge exactly. */
.af-chat-affordances .af-chat-tool-summary summary {
height: 26px;
padding: 0 10px;
display: flex;
align-items: center;
gap: 4px;
color: var(--af-text-muted);
list-style: none;
cursor: pointer;
user-select: none;
}
.af-chat-affordances .af-chat-tool-summary summary:hover {
color: var(--af-text-primary);
background: var(--af-bg-secondary);
}
/* Thread badge keeps its own border because it has no details wrapper —
* full 28px with border+padding baked in. */
.af-thread-badge {
height: 28px;
}
.af-chat-affordances .af-chat-tool-summary summary::-webkit-details-marker {
display: none;
}
.af-chat-affordances .af-chat-tool-summary summary::marker {
content: "";
}
/* When open, a subtle separator line sits between summary and list —
* both wrapped by the outer details border, so the whole thing reads as a
* single component. */
.af-chat-affordances .af-chat-tool-summary details[open] summary {
border-bottom: 1px solid var(--af-border);
}
.af-chat-affordances .af-chat-tool-summary .af-chat-tool-list {
border: none;
background: transparent;
padding: 6px 10px 8px 10px;
}
/* Mirrors `.af-chat-tool-summary summary` one-for-one. Rendered as a
* `<div role="button">` rather than `<button>` to avoid Obsidian's global
* button styling (`--interactive-normal` bg, etc.) bleeding through. */
.af-thread-badge {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 6px 10px;
border: 1px solid var(--af-border);
border-radius: var(--af-radius-sm);
background: var(--af-bg-surface);
color: var(--af-text-muted);
font-size: 11px;
cursor: pointer;
user-select: none;
box-shadow: none;
outline: none;
}
.af-thread-badge:hover {
color: var(--af-text-primary);
background: var(--af-bg-secondary);
}
.af-thread-badge:active,
.af-thread-badge:focus {
box-shadow: none;
outline: none;
}
.af-thread-badge svg {
width: 12px;
height: 12px;
}
.af-thread-badge.expanded {
color: var(--af-text-primary);
background: var(--af-bg-secondary);
border-color: var(--af-accent);
}
.af-thread-badge-label {
line-height: 1;
}
/* Thread container: nested region under the anchor bubble, read as an
* indented sidebar-style subconversation. */
.af-thread-container {
margin: 2px 0 14px 0;
padding: 10px 12px 10px 14px;
border-left: 2px solid var(--af-accent);
background: var(--af-bg-surface);
border-radius: 0 var(--af-radius-md) var(--af-radius-md) 0;
align-self: stretch;
}
.af-thread-wrap {
display: flex;
flex-direction: column;
gap: 10px;
}
.af-thread-messages {
display: flex;
flex-direction: column;
gap: 8px;
}
/* Thread bubbles: same visual language as main chat (accent-fill for user,
* surface-fill with border for assistant, asymmetric tail corner) but
* denser — smaller font, tighter padding, lower max-width — to read as a
* compact subconversation. */
.af-thread-bubble {
max-width: 82%;
padding: 7px 11px;
border-radius: var(--af-radius-md);
font-size: 12px;
line-height: 1.5;
white-space: pre-wrap;
word-break: break-word;
position: relative;
}
.af-thread-bubble-user {
align-self: flex-end;
background: transparent;
color: var(--af-text-primary);
border: 1px solid var(--af-accent);
border-bottom-right-radius: var(--af-radius-sm);
}
.af-thread-bubble-assistant {
align-self: flex-start;
background: var(--background-primary);
color: var(--af-text-primary);
border: 1px solid var(--af-border);
border-bottom-left-radius: var(--af-radius-sm);
}
/* Compact markdown tweaks so assistant thread bubbles stay tight. */
.af-thread-bubble-assistant.af-compact-md {
font-size: 12px;
}
/* Thread composer reuses the main .af-chat-input-row so attach/input/send
* styles are inherited verbatim — the one knob is a slightly smaller input
* height to match the thread's density. */
.af-thread-composer {
padding-top: 2px;
}
.af-thread-input {
font-size: 12px;
min-height: 28px;
max-height: 120px;
}
.af-thread-error {
padding: 6px 10px;
border-radius: var(--af-radius-sm);
background: rgba(243, 139, 168, 0.12);
color: var(--af-red);
border: 1px solid var(--af-red);
font-size: 11px;
align-self: stretch;
}
/* ── Wiki Keepers settings section ── */
.af-wk-list {
margin: 8px 0 16px 0;
display: flex;
flex-direction: column;
gap: 6px;
}
.af-wk-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 12px;
border: 1px solid var(--af-border);
border-radius: var(--af-radius-sm);
background: var(--af-bg-surface);
}
.af-wk-row-left {
display: flex;
align-items: baseline;
gap: 12px;
}
.af-wk-name {
font-weight: 500;
color: var(--af-text-primary);
}
.af-wk-scope {
font-size: 11px;
color: var(--af-text-secondary);
font-family: var(--font-monospace, SFMono-Regular, Menlo, monospace);
}
.af-wk-empty {
padding: 10px 12px;
color: var(--af-text-muted);
font-style: italic;
font-size: 12px;
}
.af-wk-row-actions {
display: flex;
gap: 6px;
}
.af-wk-row-btn {
font-size: 11px;
padding: 4px 10px;
border: 1px solid var(--af-border);
border-radius: var(--af-radius-sm);
background: var(--af-bg-card);
color: var(--af-text-secondary);
cursor: pointer;
}
.af-wk-row-btn:hover {
background: var(--af-bg-secondary);
color: var(--af-text-primary);
}
.af-wk-row-btn-danger:hover {
color: var(--af-red);
border-color: var(--af-red);
}
/* ── Add / Edit Wiki Keeper modal ── */
.af-wk-modal .af-wk-banner {
padding: 10px 12px;
background: var(--af-bg-surface);
border: 1px solid var(--af-border);
border-radius: var(--af-radius-sm);
color: var(--af-text-secondary);
font-size: 12px;
line-height: 1.5;
margin-bottom: 16px;
}
.af-wk-modal .af-wk-banner strong {
color: var(--af-text-primary);
}
.af-wk-modal .af-wk-section-h {
margin: 18px 0 8px 0;
font-size: 12px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--af-text-secondary);
border-bottom: 1px solid var(--af-border);
padding-bottom: 4px;
}
.af-wk-modal .af-wk-name-preview {
color: var(--af-text-secondary);
font-size: 12px;
margin: 4px 0 16px 0;
font-family: var(--font-monospace, SFMono-Regular, Menlo, monospace);
}
.af-wk-modal-footer {
display: flex;
justify-content: flex-end;
gap: 8px;
margin-top: 20px;
padding-top: 12px;
border-top: 1px solid var(--af-border);
}
.af-wk-schedule-block {
margin-bottom: 12px;
}
/* ── Run-detail transcript disclosure ── */
.af-run-transcript {
margin-top: 12px;
border-top: 1px solid var(--af-border);
padding-top: 10px;
}
.af-run-transcript > summary {
display: inline-flex;
align-items: center;
gap: 6px;
list-style: none;
cursor: pointer;
font-size: 11px;
color: var(--af-text-muted);
padding: 4px 8px;
border: 1px solid var(--af-border);
border-radius: var(--af-radius-sm);
background: var(--af-bg-surface);
user-select: none;
}
.af-run-transcript > summary:hover {
color: var(--af-text-primary);
background: var(--af-bg-secondary);
}
.af-run-transcript > summary::-webkit-details-marker { display: none; }
.af-run-transcript > summary::marker { content: ""; }
.af-run-transcript-icon svg {
width: 12px;
height: 12px;
}
.af-run-transcript-meta {
color: var(--af-text-faint);
font-size: 10px;
margin-left: 4px;
}
.af-run-transcript-body {
margin-top: 10px;
padding-top: 10px;
border-top: 1px dashed var(--af-border);
opacity: 0.92;
}
.af-wk-schedule-block .af-form-hint {
font-size: 12px;
color: var(--af-text-secondary);
margin-bottom: 6px;
}
/* ─── Chat: conversations side rail ───────────────────────────────────── */
/* Adjacent to the messages column inside the chat view, this rail lists all
* parallel conversations for the currently-selected agent. Styled to match
* the plugin-level left sidebar (af-sidebar-*) so it reads as a first-class
* part of the plugin, not a bolted-on widget. */
.af-chat-view-body {
display: flex;
flex: 1;
min-height: 0;
overflow: hidden;
}
.af-chat-main {
display: flex;
flex-direction: column;
flex: 1;
min-width: 0;
overflow: hidden;
}
.af-chat-convo-panel {
width: 200px;
flex-shrink: 0;
border-right: 1px solid var(--af-border);
background: var(--af-bg-secondary);
display: flex;
flex-direction: column;
overflow-y: auto;
overflow-x: hidden;
}
/* Collapsed state — hidden from layout entirely. The toggle button in the
* header reveals it again. */
.af-chat-convo-panel.collapsed {
display: none;
}
.af-chat-convo-header {
/* Left edge (margin 6 + padding 10 = 16px) lines up with the rows below. */
padding: 10px 10px 4px;
margin: 0 6px;
font-size: 12px;
font-weight: 600;
line-height: 1.4;
color: var(--af-text-secondary);
}
/* "+ New chat" — sits at the top of the rail, styled as a list row (not a
* button) so it belongs with the conversation list visually. */
.af-chat-convo-new {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 10px;
margin: 2px 6px 6px;
border-radius: 4px;
cursor: pointer;
color: var(--af-text-secondary);
transition: background var(--af-transition), color var(--af-transition);
font-size: 12px;
}
.af-chat-convo-new:hover {
background: var(--background-modifier-hover);
color: var(--af-accent);
}
.af-chat-convo-new-icon {
display: inline-flex;
align-items: center;
}
.af-chat-convo-new-icon svg {
width: 14px;
height: 14px;
}
.af-chat-convo-list {
display: flex;
flex-direction: column;
padding: 0 0 12px;
}
/* Conversation row — two-line layout (name on top, "12 msgs · 2h ago" below)
* mirroring the way Slack/ChatGPT list DMs/chats. Hover reveals the trash. */
.af-chat-convo-item {
position: relative;
padding: 6px 10px;
margin: 1px 6px;
border-radius: 4px;
cursor: pointer;
transition: background var(--af-transition);
/* Reserve a fixed gutter for the trash button so the row doesn't shift
* width when it appears on hover. */
padding-right: 30px;
}
.af-chat-convo-item:hover {
background: var(--background-modifier-hover);
}
.af-chat-convo-item.active {
background: var(--af-accent-bg);
}
.af-chat-convo-item.active .af-chat-convo-name {
color: var(--af-accent);
font-weight: 600;
}
.af-chat-convo-name {
font-size: 12px;
color: var(--af-text-primary);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
line-height: 1.4;
}
/* Inline-rename input — replaces the name span in place. Styled to match
* the row's existing typography so the swap is visually quiet. */
.af-chat-convo-name-input {
font-size: 12px;
line-height: 1.4;
padding: 1px 4px;
margin: -1px -4px;
border: 1px solid var(--af-accent);
border-radius: 3px;
background: var(--af-card-bg);
color: var(--af-text-primary);
width: 100%;
outline: none;
}
.af-chat-convo-meta {
font-size: 10px;
color: var(--af-text-faint);
margin-top: 1px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* Trash button — fades in on row hover. `.active` rows show it on focus
* too so keyboard users can reach it via Tab. */
.af-chat-convo-trash {
position: absolute;
top: 50%;
right: 6px;
transform: translateY(-50%);
display: inline-flex;
align-items: center;
justify-content: center;
width: 22px;
height: 22px;
padding: 0;
background: transparent;
border: none;
border-radius: 4px;
color: var(--af-text-faint);
cursor: pointer;
opacity: 0;
transition: opacity var(--af-transition), color var(--af-transition), background var(--af-transition);
}
.af-chat-convo-item:hover .af-chat-convo-trash,
.af-chat-convo-trash:focus-visible {
opacity: 1;
}
.af-chat-convo-trash:hover {
color: var(--af-red);
background: var(--af-red-bg, rgba(243, 139, 168, 0.12));
}
.af-chat-convo-trash svg {
width: 13px;
height: 13px;
}
/* Collapse toggle in the chat-view header — small icon button, no border,
* intentionally lower-emphasis than the agent dropdown next to it. */
/* Styling comes from Obsidian's native `clickable-icon` (transparent at rest,
* native hover). Match Obsidian's `.sidebar-toggle-button` icon sizing exactly:
* the large icon size (18px) + its stroke width (1.75px) — a plain clickable-icon
* would otherwise inherit the smaller default and render ~2px short. */
.af-chat-convo-collapse-btn {
flex-shrink: 0;
--icon-size: var(--icon-l);
--icon-stroke: var(--icon-l-stroke-width);
}
/* Obsidian sidebar-toggle reproduction: the inner bar is a filled rounded rect
* anchored at the left whose width animates between Obsidian's two states —
* wide pill when the panel is open (default), thin line when collapsed. */
.af-convo-toggle-bar {
width: 24%;
fill: currentColor;
stroke: none;
transition: width 120ms ease-in-out;
}
.af-chat-convo-collapse-btn.is-collapsed .af-convo-toggle-bar {
width: 8.33%;
}