Files
fusion/packages/dashboard/app/styles.css
2026-04-24 22:54:44 -07:00

4552 lines
96 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* === Reset & Tokens === */
*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
/* === Utility Classes === */
.visually-hidden {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
/* === Touch Target Utility ===
Ensures interactive elements meet the 44px minimum touch target
recommended by Apple HIG and WCAG 2.5.8. Apply to interactive
elements that are too small on mobile (links, small buttons, icons). */
.touch-target {
min-width: 44px;
min-height: 44px;
display: inline-flex;
align-items: center;
justify-content: center;
}
/* === Design Tokens (Theme-Agnostic Defaults) === */
:root {
/* Typography */
--font-primary: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
--font-mono: "SF Mono", Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
/* Spacing Scale */
--space-xs: 4px;
--space-sm: 8px;
--space-md: 12px;
--space-lg: 16px;
--space-xl: 24px;
--space-2xl: 32px;
/* Border Radius Scale */
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 12px;
--radius-xl: 16px;
--radius-pill: 10px;
/* Component-specific tokens */
--btn-padding: var(--space-sm) var(--space-lg);
--btn-border-width: 1px;
--card-padding: 10px 12px;
--modal-padding: var(--space-lg) 20px;
--header-padding: var(--space-md) var(--space-xl);
--column-gap: var(--space-md);
--board-padding: var(--space-lg) var(--space-xl);
/* Layout tokens for fixed footer (ExecutorStatusBar) */
--header-height: 57px;
--executor-footer-height: 0px;
--executor-footer-height-mobile: 0px;
/* PWA standalone mode bottom gap (FN-1626): extra breathing room for iOS home indicator */
--standalone-bottom-gap: 0px;
/* Shadow tokens */
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.1);
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);
--shadow-lg: 0 4px 24px rgba(0, 0, 0, 0.4);
--shadow-glow: 0 0 8px rgba(88, 166, 255, 0.3);
--glow-success: 0 0 8px rgba(46, 160, 67, 0.3);
--glow-warning: 0 0 8px rgba(227, 179, 65, 0.3);
--glow-danger: 0 0 8px rgba(248, 81, 73, 0.3);
--focus-ring: 0 0 0 2px rgba(88, 166, 255, 0.15);
--focus-ring-strong: 0 0 0 2px rgba(88, 166, 255, 0.3);
/* Animation tokens */
--transition-instant: 0.1s ease;
--transition-fast: 0.15s ease;
--transition-normal: 0.2s ease;
--transition-slow: 0.3s ease;
/* Backward-compatible aliases */
--radius: var(--radius-md);
--shadow: var(--shadow-lg);
/* Mobile breakpoint tokens (documentation only): CSS custom properties cannot be used directly in @media query conditions. */
--mobile-breakpoint: 768px;
--tablet-breakpoint: 1024px;
--small-breakpoint: 480px;
--xsmall-breakpoint: 640px;
}
:root {
--bg: #0d1117;
--surface: #161b22;
--card: #21262d;
--card-hover: #282e36;
/* Neutral transient hover/press surface. Theme contract: defined in :root, light mode, and every color-theme block. */
--surface-hover: color-mix(in srgb, var(--surface) 90%, var(--text) 10%);
/* Semantic neutral surface tiers for subtle fills, section headers, compact chips, and emphasized hover states. */
--surface-subtle: color-mix(in srgb, var(--surface) 96%, var(--text) 4%);
--surface-muted: color-mix(in srgb, var(--surface) 94%, var(--text) 6%);
--surface-emphasis: color-mix(in srgb, var(--surface) 92%, var(--text) 8%);
--surface-hover-strong: color-mix(in srgb, var(--surface) 88%, var(--text) 12%);
--bg-secondary: color-mix(in srgb, var(--surface) 70%, var(--card));
--bg-tertiary: color-mix(in srgb, var(--surface) 40%, var(--card));
--border: #30363d;
--text: #e6edf3;
--text-muted: #8b949e;
--text-dim: #484f58;
--triage: #d29922;
--todo: #58a6ff;
--in-progress: #00e5ff;
--in-progress-rgb: 0, 229, 255;
--in-review: #3fb950;
--done: #8b949e;
--color-success: #3fb950;
--color-error: #f85149;
--color-error-dark: #da3633;
--color-muted: #8b949e;
--color-info: #1f6feb;
--color-warning: #ca8a04;
/* Workflow Step type / state colors */
--ws-pre-merge: #3b82f6;
--ws-post-merge: #0ea58c;
--ws-info: #06b6d4;
--ws-warning: #ca8a04;
--ws-success: #22c55e;
--ws-error: #ef4444;
--ws-error-dark: #dc2626;
--ws-teal: #0ea58c;
--ws-quality: #3b82f6;
--ws-security: #ef4444;
/* Status background tokens (theme-aware via color-mix) */
--status-triage-bg: color-mix(in srgb, var(--triage) 15%, transparent);
--status-triage-bg-deep: color-mix(in srgb, var(--triage) 20%, transparent);
--status-todo-bg: color-mix(in srgb, var(--todo) 15%, transparent);
--status-in-progress-bg: color-mix(in srgb, var(--in-progress) 15%, transparent);
--status-in-review-bg: color-mix(in srgb, var(--in-review) 15%, transparent);
--status-done-bg: color-mix(in srgb, var(--done) 15%, transparent);
--status-archived-bg: color-mix(in srgb, var(--text-muted, #8b949e) 10%, transparent);
--status-done-bg-deep: color-mix(in srgb, var(--done) 20%, transparent);
--status-error-bg: color-mix(in srgb, var(--color-error-dark, #da3633) 15%, transparent);
--status-error-bg-deep: color-mix(in srgb, var(--color-error-dark, #da3633) 20%, transparent);
/* Executor status bar state accents */
--executor-status-error-bg: color-mix(in srgb, var(--color-error) 8%, transparent);
/* Logo & branding tokens */
--logo-accent: var(--todo);
/* Task-creation CTA tokens */
--cta-bg: #238636;
--cta-border: #2ea043;
--cta-text: #fff;
--cta-bg-hover: #2ea043;
--cta-border-hover: #3fb950;
--cta-glow: 0 0 8px rgba(46, 160, 67, 0.3);
/* === Agent State Colors === */
--state-idle-bg: rgba(139, 148, 158, 0.15);
--state-idle-text: #8b949e;
--state-idle-border: #8b949e;
--state-active-bg: rgba(46, 160, 67, 0.15);
--state-active-text: #3fb950;
--state-active-border: #3fb950;
--state-paused-bg: rgba(227, 179, 65, 0.15);
--state-paused-text: #e3b541;
--state-paused-border: #e3b541;
--state-error-bg: rgba(248, 81, 73, 0.15);
--state-error-text: #f85149;
--state-error-border: #f85149;
/* === Mission & Milestone Status Colors === */
--mission-planning-bg: color-mix(in srgb, var(--triage) 15%, transparent);
--mission-planning-text: var(--triage);
--mission-active-bg: color-mix(in srgb, var(--in-review) 15%, transparent);
--mission-active-text: var(--in-review);
--mission-blocked-bg: color-mix(in srgb, var(--color-error) 15%, transparent);
--mission-blocked-text: var(--color-error);
--mission-complete-bg: color-mix(in srgb, #3b82f6 15%, transparent);
--mission-complete-text: #3b82f6;
--mission-archived-bg: var(--bg-tertiary);
--mission-archived-text: var(--text-secondary);
/* === Slice Status Colors === */
--slice-pending-bg: color-mix(in srgb, var(--triage) 15%, transparent);
--slice-pending-text: var(--triage);
--slice-active-bg: color-mix(in srgb, var(--in-review) 15%, transparent);
--slice-active-text: var(--in-review);
--slice-complete-bg: color-mix(in srgb, #3b82f6 15%, transparent);
--slice-complete-text: #3b82f6;
/* === Feature (Task) Status Colors === */
--feature-defined-bg: color-mix(in srgb, var(--triage) 15%, transparent);
--feature-defined-text: var(--triage);
--feature-triaged-bg: color-mix(in srgb, #a855f7 15%, transparent);
--feature-triaged-text: #a855f7;
--feature-in-progress-bg: color-mix(in srgb, var(--in-review) 15%, transparent);
--feature-in-progress-text: var(--in-review);
--feature-done-bg: color-mix(in srgb, #3b82f6 15%, transparent);
--feature-done-text: #3b82f6;
/* === Autopilot State Colors === */
--autopilot-inactive-bg: color-mix(in srgb, #94a3b8 15%, transparent);
--autopilot-inactive-text: #94a3b8;
--autopilot-watching-bg: color-mix(in srgb, var(--in-review) 15%, transparent);
--autopilot-watching-text: var(--in-review);
--autopilot-activating-bg: color-mix(in srgb, #3b82f6 15%, transparent);
--autopilot-activating-text: #3b82f6;
--autopilot-completing-bg: color-mix(in srgb, #a855f7 15%, transparent);
--autopilot-completing-text: #a855f7;
/* === Loop State Colors === */
--loop-idle-bg: var(--bg-tertiary);
--loop-idle-text: var(--text-secondary);
--loop-idle-indicator: var(--text-dim);
--loop-implementing-bg: color-mix(in srgb, var(--in-review) 15%, transparent);
--loop-implementing-text: var(--in-review);
--loop-implementing-indicator: var(--in-review);
--loop-validating-bg: color-mix(in srgb, var(--color-warning) 15%, transparent);
--loop-validating-text: var(--color-warning);
--loop-validating-indicator: var(--color-warning);
--loop-needs-fix-bg: color-mix(in srgb, #f97316 15%, transparent);
--loop-needs-fix-text: #f97316;
--loop-needs-fix-indicator: #f97316;
--loop-passed-bg: color-mix(in srgb, var(--color-success) 15%, transparent);
--loop-passed-text: var(--color-success);
--loop-passed-indicator: var(--color-success);
--loop-blocked-bg: color-mix(in srgb, var(--color-error) 15%, transparent);
--loop-blocked-text: var(--color-error);
--loop-blocked-indicator: var(--color-error);
/* === Assertion Status Colors === */
--assertion-pending-bg: color-mix(in srgb, var(--triage) 15%, transparent);
--assertion-pending-text: var(--triage);
--assertion-passed-bg: color-mix(in srgb, var(--color-success) 15%, transparent);
--assertion-passed-text: var(--color-success);
--assertion-failed-bg: color-mix(in srgb, var(--color-error) 15%, transparent);
--assertion-failed-text: var(--color-error);
--assertion-blocked-bg: color-mix(in srgb, var(--color-warning) 15%, transparent);
--assertion-blocked-text: var(--color-warning);
/* === Interview Modal Icon Colors === */
--icon-milestone: var(--triage);
--icon-slice: var(--in-review);
--icon-feature: #3b82f6;
/* === Accent Color === */
--accent: #7c5cbf;
/* === Log Entry Background Tokens === */
--log-tool-bg: color-mix(in srgb, var(--accent) 8%, transparent);
--log-success-bg: color-mix(in srgb, var(--color-success) 6%, transparent);
--log-error-bg: color-mix(in srgb, var(--color-error) 6%, transparent);
/* === Mailbox compose FAB & badges === */
--fab-bg: var(--todo);
--fab-text: #fff;
/* === Mission autopilot indicators === */
--autopilot-pulse: var(--color-success);
--autopilot-icon: #eab308;
--autopilot-shadow: rgba(34, 197, 94, 0.4);
/* === Mission toggle & badge backgrounds === */
--toggle-checked-bg: rgba(34, 197, 94, 0.2);
--meta-badge-bg: rgba(63, 185, 80, 0.1);
/* === Mission event type colors (semantic — adapted for light in [data-theme="light"]) === */
--event-error-text: #fca5a5;
--event-state-text: #93c5fd;
--event-task-text: #6ee7b7;
--event-slice-text: #fcd34d;
--event-autopilot-text: #d8b4fe;
--event-error-bg: rgba(239, 68, 68, 0.15);
--event-state-bg: rgba(59, 130, 246, 0.15);
--event-task-bg: rgba(16, 185, 129, 0.15);
--event-slice-bg: rgba(245, 158, 11, 0.15);
--event-autopilot-bg: rgba(168, 85, 247, 0.15);
/* === Card mission badge === */
--badge-mission-text: #a78bfa;
--badge-mission-text-hover: #c4b5fd;
--badge-mission-bg: rgba(167, 139, 250, 0.12);
--badge-mission-bg-hover: rgba(167, 139, 250, 0.22);
/* === Terminal background === */
--terminal-bg: #1e1e1e;
/* === Model combobox favorite star === */
--star-idle: #6b7280;
--star-active: #f59e0b;
}
html,
body {
height: 100%;
font-family: var(--font-primary);
background: var(--bg);
color: var(--text);
overflow: hidden;
}
#root {
height: 100%;
display: flex;
flex-direction: column;
min-height: 0;
overflow: hidden;
}
/* === Buttons === */
.btn {
padding: var(--btn-padding);
border-style: solid;
border-width: var(--btn-border-width);
border-color: var(--border);
border-radius: var(--radius-md);
background: var(--card);
color: var(--text);
font-size: 13px;
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 6px;
transition:
background var(--transition-fast),
border-color var(--transition-fast),
transform var(--transition-fast),
box-shadow var(--transition-fast);
}
.btn:hover {
background: var(--card-hover);
border-color: var(--text-muted);
}
.btn:focus-visible {
box-shadow: var(--focus-ring-strong);
border-color: var(--todo);
outline: none;
}
.btn:active {
transform: scale(0.97);
}
/* Primary buttons use CTA tokens so colors adapt to the selected color theme */
.btn-primary {
background: var(--cta-bg);
border-color: var(--cta-border);
color: var(--cta-text);
}
.btn-primary:hover {
background: var(--cta-bg-hover);
border-color: var(--cta-border-hover);
box-shadow: var(--cta-glow);
}
/* Theme-driven task-creation CTA — uses tokens so every color theme updates consistently */
.btn-task-create {
background: var(--cta-bg);
border-color: var(--cta-border);
color: var(--cta-text);
}
.btn-task-create:hover {
background: var(--cta-bg-hover);
border-color: var(--cta-border-hover);
box-shadow: var(--cta-glow);
}
.btn-danger {
background: var(--color-error-dark);
border-color: var(--color-error);
color: #fff;
}
.btn-danger:hover {
background: var(--color-error);
box-shadow: var(--glow-danger);
}
.btn-warning {
background: var(--triage);
border-color: color-mix(in srgb, var(--triage) 80%, white);
color: #fff;
}
.btn-warning:hover {
background: color-mix(in srgb, var(--triage) 80%, white);
box-shadow: var(--glow-warning);
}
.btn-secondary {
background: var(--surface);
border: 1px solid var(--border);
color: var(--text);
}
.btn-secondary:hover {
background: var(--card-hover);
border-color: var(--text-muted);
}
.btn-secondary:active {
transform: scale(0.97);
}
.btn-secondary:focus-visible {
box-shadow: var(--focus-ring-strong);
border-color: var(--todo);
}
.btn-sm {
padding: 4px 10px;
font-size: 12px;
display: inline-flex;
align-items: center;
gap: 4px;
}
/* === Button Modifiers (BEM style) === */
.btn--sm {
padding: 4px 8px;
font-size: 12px;
display: inline-flex;
align-items: center;
gap: 4px;
}
.btn--primary {
background: var(--todo);
color: var(--bg);
border-color: var(--todo);
}
.btn--primary:hover {
background: color-mix(in srgb, var(--todo) 80%, white);
border-color: color-mix(in srgb, var(--todo) 80%, white);
}
.btn--danger {
background: var(--color-error);
color: #fff;
border-color: var(--color-error);
}
.btn--danger:hover {
background: var(--color-error-dark);
border-color: var(--color-error-dark);
}
.btn--warning {
background: var(--triage);
color: var(--bg);
border-color: var(--triage);
}
.btn--warning:hover {
opacity: 0.9;
}
/* === Board === */
.board {
display: grid;
grid-template-columns: repeat(6, minmax(260px, 1fr));
gap: var(--column-gap);
padding: var(--board-padding);
height: 100%;
overflow-x: auto;
overflow-y: hidden;
scroll-snap-type: x proximity;
scroll-padding-inline: 50%;
scrollbar-color: var(--border) transparent;
scrollbar-width: thin;
}
.board::-webkit-scrollbar {
height: 6px;
}
.board::-webkit-scrollbar-track {
background: transparent;
}
.board::-webkit-scrollbar-thumb {
background: var(--border);
border-radius: var(--radius-sm);
}
.column {
display: flex;
flex-direction: column;
background: var(--surface);
border-radius: var(--radius-lg);
border: 1px solid var(--border);
overflow: hidden;
min-width: 0;
min-height: 0;
transition: border-color var(--transition-normal);
scroll-snap-align: center;
}
.column.drag-over {
border-color: var(--todo);
box-shadow: inset 0 0 0 1px var(--todo);
}
.column-header {
display: flex;
align-items: center;
gap: var(--space-sm);
padding: calc(var(--space-lg) - 2px) calc(var(--space-lg) - 2px) 0;
}
.column-dot {
width: 10px;
height: 10px;
border-radius: 50%;
}
.dot-triage {
background: var(--triage);
}
.dot-todo {
background: var(--todo);
}
.dot-in-progress {
background: var(--in-progress);
}
.dot-in-review {
background: var(--in-review);
}
.dot-done {
background: var(--done);
}
.dot-archived {
background: var(--text-muted);
}
.column-header h2 {
font-size: 14px;
font-weight: 600;
flex: 1;
}
.column-count {
font-size: 12px;
color: var(--text-muted);
background: var(--card);
padding: calc(var(--space-xs) / 2) var(--space-sm);
border-radius: var(--radius-xl);
min-width: 24px;
text-align: center;
}
@keyframes count-flash-bg {
from {
background: var(--color-success);
}
to {
background: var(--card);
}
}
.column-count.count-flash {
animation: count-flash-bg 1400ms ease-out;
}
.column-desc {
font-size: 11px;
color: var(--text-dim);
padding: var(--space-xs) calc(var(--space-lg) - 2px) calc(var(--space-md) - 2px);
}
.column-body {
flex: 1;
overflow-y: auto;
overflow-x: hidden;
padding: var(--space-xs) var(--space-sm) var(--space-sm);
display: flex;
flex-direction: column;
gap: calc(var(--space-sm) - 2px);
}
.column-body::-webkit-scrollbar {
width: 4px;
}
.column-body::-webkit-scrollbar-track {
background: transparent;
}
.column-body::-webkit-scrollbar-thumb {
background: var(--border);
border-radius: var(--radius-sm);
}
/* === Cards === */
.card {
background: var(--card);
border: 1px solid var(--border);
border-radius: var(--radius-md);
padding: var(--card-padding);
cursor: grab;
transition:
background var(--transition-fast),
border-color var(--transition-fast),
transform var(--transition-fast),
opacity var(--transition-normal);
user-select: none;
touch-action: pan-x pan-y;
}
.card:hover {
background: var(--card-hover);
border-color: var(--text-muted);
}
.card:focus-visible {
box-shadow: var(--focus-ring-strong);
border-color: var(--todo);
outline: none;
}
.card:active {
cursor: grabbing;
}
.card.dragging {
opacity: 0.4;
transform: scale(0.98);
}
.card.file-drop-target {
border: 2px dashed var(--todo);
background: rgba(88, 166, 255, 0.08);
}
/* Agent-active glow: animated border glow when an agent is actively working on a task.
Uses the in-progress column color to stay consistent with the theme. */
.card.agent-active {
border-color: var(--in-progress);
box-shadow:
0 0 8px rgba(var(--in-progress-rgb), 0.4),
0 0 20px rgba(var(--in-progress-rgb), 0.15);
animation: agent-glow 2.5s ease-in-out infinite;
}
@keyframes agent-glow {
0%,
100% {
box-shadow:
0 0 8px rgba(var(--in-progress-rgb), 0.4),
0 0 20px rgba(var(--in-progress-rgb), 0.15);
}
50% {
box-shadow:
0 0 12px rgba(var(--in-progress-rgb), 0.6),
0 0 28px rgba(var(--in-progress-rgb), 0.25);
}
}
.card-header {
display: flex;
align-items: center;
gap: 6px;
margin-bottom: var(--space-xs);
}
.card-id {
display: inline-block;
font-size: 11px;
font-weight: 600;
color: var(--text-muted);
font-family: var(--font-mono);
}
.card-title {
font-size: 13px;
line-height: 1.4;
word-break: break-word;
}
/* z-index + position: relative so .card-dep-badge tooltip renders above .card-title */
.card-meta {
display: flex;
align-items: center;
gap: var(--space-sm);
margin-top: var(--space-sm);
font-size: 11px;
color: var(--text-dim);
position: relative;
z-index: 1;
}
.card-status-badge {
display: inline-flex;
align-items: center;
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
padding: 2px 8px;
border-radius: var(--radius-pill);
}
.card-status-badge.pulsing {
animation: pulse 1.5s ease-in-out infinite;
}
.card-status-badge.failed {
background: var(--status-error-bg);
color: var(--color-error-dark);
}
.card-status-badge.stuck {
background: var(--status-triage-bg-deep);
color: var(--triage);
animation: stuck-pulse 2s ease-in-out infinite;
}
.card-status-badge.paused {
background: var(--status-done-bg-deep);
color: var(--text-muted, #8b949e);
}
.card-status-badge.awaiting-approval {
background: var(--status-triage-bg-deep);
color: var(--triage);
}
.card-status-badge--triage {
background: var(--status-triage-bg);
color: var(--triage);
}
.card-status-badge--todo {
background: var(--status-todo-bg);
color: var(--todo);
}
.card-status-badge--in-progress {
background: var(--status-in-progress-bg);
color: var(--in-progress);
}
.card-status-badge--in-review {
background: var(--status-in-review-bg);
color: var(--in-review);
}
.card-status-badge--done {
background: var(--status-done-bg);
color: var(--done);
}
.card-status-badge--archived {
background: var(--status-archived-bg);
color: var(--text-muted, #8b949e);
}
.card.stuck {
border-left: 3px solid var(--triage);
background: color-mix(in srgb, var(--triage) 6%, transparent);
}
@keyframes stuck-pulse {
0%, 100% {
opacity: 1;
}
50% {
opacity: 0.65;
}
}
/* Size badge: positioned in card header, subtle color coding for effort estimation */
.card-size-badge {
display: inline-flex;
align-items: center;
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
padding: 2px 8px;
border-radius: var(--radius-pill);
}
/* Size S: subtle green tint (low effort) */
.card-size-badge.size-s {
background: color-mix(in srgb, var(--color-success) 15%, transparent);
color: var(--color-success);
}
/* Size M: neutral tint (medium effort) */
.card-size-badge.size-m {
background: color-mix(in srgb, var(--text-muted) 15%, transparent);
color: var(--text-muted);
}
/* Size L: subtle amber tint (higher effort) */
.card-size-badge.size-l {
background: color-mix(in srgb, var(--triage) 15%, transparent);
color: var(--triage);
}
.card-priority-badge {
display: inline-flex;
align-items: center;
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.4px;
padding: 2px 8px;
border-radius: var(--radius-pill);
}
.card-priority-badge--low {
background: color-mix(in srgb, var(--color-info) 15%, transparent);
color: var(--color-info);
}
.card-priority-badge--high {
background: color-mix(in srgb, var(--color-warning) 18%, transparent);
color: var(--color-warning);
}
.card-priority-badge--urgent {
background: color-mix(in srgb, var(--color-error) 20%, transparent);
color: var(--color-error-dark);
}
.card.failed {
border-left: 3px solid var(--color-error-dark);
}
/* Error display on failed task cards */
.card-error {
display: flex;
align-items: flex-start;
gap: 6px;
margin: 6px 0;
padding: 6px var(--space-sm);
background: rgba(218, 54, 51, 0.1);
border: 1px solid rgba(218, 54, 51, 0.3);
border-radius: var(--radius);
font-size: 11px;
color: var(--color-error-dark);
line-height: 1.4;
}
.card-error-icon {
flex-shrink: 0;
font-size: 12px;
}
.card-error-text {
word-break: break-word;
}
/* Awaiting manual plan approval: amber left border + subtle pulsing background to signal human review needed.
Distinct from agent-active (purple glow), failed (red left border + error block), and paused (dimmed opacity). */
.card.awaiting-approval {
border-left: 3px solid var(--triage);
background: rgba(210, 153, 34, 0.06);
animation: approval-pulse 3s ease-in-out infinite;
}
@keyframes approval-pulse {
0%,
100% {
background: rgba(210, 153, 34, 0.06);
}
50% {
background: rgba(210, 153, 34, 0.12);
}
}
.card.paused {
opacity: 0.55;
border-left: 3px solid var(--text-secondary, #888);
cursor: default;
}
@keyframes pulse {
0%,
100% {
opacity: 1;
}
50% {
opacity: 0.5;
}
}
.card-dep-badge {
display: inline-flex;
align-items: center;
gap: 3px;
font-size: 11px;
color: var(--triage);
position: relative;
cursor: default;
}
.card-dep-badge.clickable {
cursor: pointer;
transition: color var(--transition-fast), text-decoration var(--transition-fast);
}
.card-dep-badge.clickable:hover {
color: var(--todo);
text-decoration: underline;
}
.card-dep-list {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: var(--space-xs);
}
.card-scope-badge {
display: inline-flex;
align-items: center;
gap: 3px;
font-size: 11px;
color: var(--in-progress);
position: relative;
cursor: default;
}
.card-scope-badge[data-tooltip]:hover::after {
content: attr(data-tooltip);
position: absolute;
bottom: 100%;
left: 50%;
transform: translateX(-50%);
background: var(--bg-card);
color: var(--text);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
padding: var(--space-xs) var(--space-sm);
font-size: 11px;
white-space: nowrap;
z-index: 10;
pointer-events: none;
margin-bottom: var(--space-xs);
box-shadow: var(--shadow-md);
}
/* Mission badge: clickable link to mission from task card */
.card-mission-badge {
display: inline-flex;
align-items: center;
gap: 3px;
font-size: 10px;
font-weight: 600;
font-family: var(--font-mono);
color: var(--badge-mission-text);
background: var(--badge-mission-bg);
padding: 2px 6px;
border-radius: var(--radius-pill);
cursor: pointer;
transition: color var(--transition-fast), background var(--transition-fast);
max-width: 110px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.card-mission-badge:hover {
color: var(--badge-mission-text-hover);
background: var(--badge-mission-bg-hover);
}
.card-agent-row {
display: flex;
align-items: center;
gap: var(--space-xs);
margin-top: var(--space-xs);
}
.card-agent-badge {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 10px;
font-weight: 600;
color: var(--text-muted);
background: color-mix(in srgb, var(--text-muted) 18%, transparent);
border: 1px solid color-mix(in srgb, var(--text-muted) 35%, transparent);
padding: 2px 6px;
border-radius: var(--radius-pill);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.card-agent-badge-text {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.card-agent-badge--loading {
animation: pulse 1.5s ease-in-out infinite;
}
.card-progress {
display: flex;
align-items: center;
gap: var(--space-sm);
margin-top: var(--space-sm);
}
.card-session-files {
display: inline-flex;
align-items: center;
gap: 6px;
margin-top: var(--space-sm);
padding: 0;
border: none;
background: transparent;
color: var(--text-muted);
font-size: 12px;
cursor: pointer;
}
.card-session-files:hover {
color: var(--text);
}
.card-session-files:disabled {
cursor: default;
opacity: 0.7;
}
.card-progress-bar {
flex: 1;
height: 3px;
background: var(--border);
border-radius: 2px;
overflow: hidden;
}
.card-progress-fill {
height: 100%;
border-radius: 2px;
transition: width 0.3s;
}
.card-progress-label {
font-size: 11px;
font-weight: 600;
color: var(--text-muted);
font-family: var(--font-mono);
flex-shrink: 0;
}
/* Steps toggle and list */
.card-steps-toggle {
display: flex;
align-items: center;
gap: var(--space-xs);
margin-top: 6px;
min-height: calc(var(--space-xl) + var(--space-md));
padding: var(--space-xs) 0;
background: none;
border: none;
cursor: pointer;
font-size: calc(var(--space-sm) + var(--space-xs) * 0.75);
color: var(--text-muted);
transition: color var(--transition-fast);
}
.card-steps-toggle:hover {
color: var(--text);
}
.card-steps-toggle:focus-visible {
box-shadow: var(--focus-ring-strong);
border-radius: var(--radius-sm);
}
.card-steps-toggle-icon {
transition: transform var(--transition-normal);
}
.card-steps-toggle-icon.expanded {
transform: rotate(180deg);
}
.card-steps-list {
display: flex;
flex-direction: column;
gap: var(--space-xs);
margin-top: var(--space-sm);
max-height: 200px;
overflow-y: auto;
}
.card-step-item {
display: flex;
align-items: center;
gap: 6px;
font-size: 12px;
}
.card-step-dot {
width: 6px;
height: 6px;
border-radius: 50%;
flex-shrink: 0;
}
.card-step-dot--pending {
background: var(--border);
}
.card-step-dot--in-progress {
background: var(--todo);
}
.card-step-dot--done {
background: var(--color-success);
}
.card-step-dot--skipped {
background: var(--text-dim);
}
.card-step-dot--failed {
background: var(--color-error-dark);
}
.card-step-name {
flex: 1;
min-width: 0;
color: var(--text-muted);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.card-step-name.completed {
text-decoration: line-through;
opacity: 0.6;
}
.card-step-workflow-badge {
margin-left: auto;
padding: 0 var(--space-xs);
border-radius: var(--radius-pill);
border: 1px solid var(--border);
font-size: calc(var(--space-sm) + var(--space-xs) * 0.25);
color: var(--text-muted);
background: var(--surface);
white-space: nowrap;
}
.card-step-workflow-badge--pre-merge {
color: var(--in-review);
background: var(--status-in-review-bg);
border-color: color-mix(in srgb, var(--in-review) 35%, var(--border));
}
.card-step-workflow-badge--post-merge {
color: var(--done);
background: var(--status-done-bg);
border-color: color-mix(in srgb, var(--done) 35%, var(--border));
}
/* Animation for initializing spinner */
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.animate-spin {
animation: spin 1s linear infinite;
}
/* === Modals === */
.modal-overlay {
display: none;
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.6);
backdrop-filter: blur(4px);
/* Must remain above sticky top banners (e.g. onboarding/session resume cards). */
z-index: 100;
justify-content: center;
align-items: flex-start;
padding-top: var(--overlay-padding-top, 10vh);
}
.modal-overlay.open {
display: flex;
}
.modal {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
width: 480px;
max-height: 80vh;
box-shadow: var(--shadow-lg);
display: flex;
flex-direction: column;
}
.modal-lg {
width: 640px;
}
.modal-md {
width: min(520px, calc(100vw - 32px));
}
.modal-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: var(--modal-padding);
border-bottom: 1px solid var(--border);
background: rgba(0, 0, 0, 0.1);
}
.modal-header h3 {
font-size: 15px;
font-weight: 600;
letter-spacing: 0.3px;
}
.modal-close {
background: none;
border: none;
color: var(--text-muted);
font-size: 22px;
cursor: pointer;
padding: 0 4px;
line-height: 1;
}
.modal-close:hover {
color: var(--text);
}
.modal-close:focus-visible {
box-shadow: var(--focus-ring-strong);
outline: none;
border-radius: var(--radius-sm);
}
.modal-send-to-background {
width: 28px;
height: 28px;
border-radius: 50%;
border: none;
background: transparent;
color: var(--text-secondary);
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
.modal-send-to-background:hover {
color: var(--text-primary);
}
.modal-send-to-background:focus-visible {
box-shadow: var(--focus-ring-strong);
outline: none;
}
.modal-actions {
display: flex;
justify-content: flex-end;
gap: 10px;
padding: var(--modal-padding);
border-top: 1px solid var(--border);
background: rgba(0, 0, 0, 0.05);
}
.modal-actions-left {
display: flex;
gap: 10px;
margin-right: auto;
}
.modal-actions-right {
display: flex;
gap: 10px;
}
.modal-body {
padding: var(--space-lg) 20px;
overflow-y: auto;
flex: 1;
}
.import-preview-list {
margin: 8px 0;
padding-left: 20px;
font-size: 12px;
color: var(--text-muted);
}
.import-preview-list li {
margin: 4px 0;
}
/* === Forms === */
.form-group {
padding: 0 var(--space-xl);
margin-top: var(--space-lg);
}
.form-group:last-of-type {
margin-bottom: var(--space-sm);
}
.form-group label {
display: block;
font-size: 12px;
font-weight: 600;
color: var(--text-muted);
margin-bottom: 6px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.optional {
font-weight: 400;
text-transform: none;
letter-spacing: 0;
}
.form-group input:not([type="checkbox"]),
.form-group textarea {
width: 100%;
padding: var(--space-sm) var(--space-md);
background: var(--bg);
border: 1px solid var(--border);
border-radius: var(--radius-md);
color: var(--text);
font-size: 14px;
font-family: inherit;
outline: none;
transition:
border-color var(--transition-fast),
box-shadow var(--transition-fast);
}
.form-group input:not([type="checkbox"]):focus,
.form-group textarea:focus {
border-color: var(--todo);
box-shadow: var(--focus-ring);
}
.form-group input[type="checkbox"] {
width: 16px;
height: 16px;
padding: 0;
margin: 0;
accent-color: var(--todo);
cursor: pointer;
border-radius: var(--radius-sm);
transition: box-shadow var(--transition-fast);
}
.form-group input[type="checkbox"]:focus-visible {
box-shadow: var(--focus-ring-strong);
outline: none;
}
.checkbox-label {
display: flex !important;
align-items: center;
gap: var(--space-sm);
text-transform: none !important;
letter-spacing: 0 !important;
font-weight: 500 !important;
color: var(--text) !important;
font-size: 13px !important;
cursor: pointer;
}
.form-group textarea {
resize: vertical;
}
/* === Select Styling === */
.form-group select {
width: 100%;
padding: 8px 32px 8px 12px;
background: var(--bg);
border: 1px solid var(--border);
border-radius: var(--radius);
color: var(--text);
font-size: 14px;
font-family: inherit;
outline: none;
cursor: pointer;
appearance: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%238b949e' d='M2 4l4 4 4-4'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 10px center;
transition:
border-color var(--transition-fast),
box-shadow var(--transition-fast);
}
.form-group select:focus {
border-color: var(--todo);
box-shadow: var(--focus-ring);
}
.form-group select:hover:not(:focus) {
border-color: var(--text-dim);
}
.form-group select optgroup {
background: var(--surface);
color: var(--text-muted);
font-weight: 600;
}
.form-group select option {
background: var(--surface);
color: var(--text);
padding: var(--space-xs) var(--space-sm);
}
/* === Global Input & Select Classes === */
.input,
.form-input {
background: var(--surface);
color: var(--text);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
padding: 6px 10px;
font-size: 13px;
font-family: var(--font-primary);
outline: none;
transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
}
.input:focus,
.form-input:focus {
border-color: var(--todo);
box-shadow: var(--focus-ring);
}
.input::placeholder,
.form-input::placeholder {
color: var(--text-dim);
}
.select {
background: var(--surface);
color: var(--text);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
padding: 6px 10px;
font-size: 13px;
font-family: var(--font-primary);
cursor: pointer;
outline: none;
transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
}
.select:focus {
border-color: var(--todo);
box-shadow: var(--focus-ring);
}
/* === Helper Text & Field Errors === */
.form-group small {
display: block;
margin-top: 6px;
font-size: 12px;
color: var(--text-muted);
line-height: 1.4;
overflow-wrap: break-word;
word-break: break-word;
}
.form-group .field-error {
color: var(--color-error);
font-weight: 500;
}
/* === Heartbeat Multiplier === */
.heartbeat-multiplier-group {
display: flex;
flex-direction: column;
gap: var(--space-sm);
}
.heartbeat-multiplier-controls {
display: flex;
align-items: center;
gap: var(--space-md);
}
.heartbeat-multiplier-slider {
flex: 1;
min-height: calc(var(--space-2xl) + var(--space-md));
}
.heartbeat-multiplier-value {
min-width: calc(var(--space-2xl) + var(--space-xl));
color: var(--text-muted);
font-family: var(--font-mono);
font-size: var(--space-md);
text-align: right;
}
.heartbeat-multiplier-preset {
max-width: calc(var(--space-2xl) * 4);
}
input[type="range"] {
-webkit-appearance: none;
appearance: none;
width: 100%;
height: calc(var(--space-sm) - var(--space-xs) / 2);
border-radius: var(--radius-sm);
background: var(--border);
outline: none;
}
input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: calc(var(--space-lg) + var(--space-xs) / 2);
height: calc(var(--space-lg) + var(--space-xs) / 2);
border-radius: var(--radius-pill);
background: var(--todo);
border: var(--btn-border-width) solid var(--surface);
cursor: pointer;
}
input[type="range"]::-moz-range-thumb {
width: calc(var(--space-lg) + var(--space-xs) / 2);
height: calc(var(--space-lg) + var(--space-xs) / 2);
border-radius: var(--radius-pill);
background: var(--todo);
border: var(--btn-border-width) solid var(--surface);
cursor: pointer;
}
input[type="range"]:focus-visible {
box-shadow: var(--focus-ring-strong);
}
/* === Settings Layout === */
.settings-layout {
display: flex;
flex: 1;
flex-direction: row;
min-height: 0;
overflow: hidden;
}
.settings-mobile-section-picker {
display: none;
}
.settings-sidebar {
width: 170px;
min-width: 170px;
border-right: 1px solid var(--border);
display: flex;
flex-direction: column;
overflow-y: auto;
padding: 10px 8px;
gap: 2px;
background: rgba(0, 0, 0, 0.1);
scrollbar-color: var(--border) transparent;
scrollbar-width: thin;
}
.settings-sidebar::-webkit-scrollbar {
width: 6px;
}
.settings-sidebar::-webkit-scrollbar-track {
background: transparent;
}
.settings-sidebar::-webkit-scrollbar-thumb {
background: var(--border);
border-radius: var(--radius-sm);
}
.settings-sidebar::-webkit-scrollbar-thumb:hover {
background: var(--text-muted);
}
.settings-nav-item {
display: block;
width: 100%;
padding: var(--space-sm) var(--space-md);
font-size: 13px;
font-weight: 500;
color: var(--text-muted);
background: none;
border: none;
border-left: 3px solid transparent;
border-radius: 0 var(--radius) var(--radius) 0;
cursor: pointer;
text-align: left;
transition:
background var(--transition-fast),
color var(--transition-fast),
border-color var(--transition-fast);
}
.settings-nav-item:hover {
background: var(--bg);
color: var(--text);
border-left-color: var(--border);
}
.settings-nav-item:focus-visible {
box-shadow: var(--focus-ring-strong);
outline: none;
}
.settings-nav-item.active {
background: var(--bg);
color: var(--todo);
font-weight: 600;
border-left-color: var(--todo);
}
/* Settings group headers - visual separators between global and project sections */
.settings-group-header {
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--text-muted);
padding: var(--space-md) var(--space-md) var(--space-xs);
margin-top: var(--space-sm);
user-select: none;
}
.settings-group-header:first-child {
margin-top: 0;
}
.settings-content {
flex: 1;
overflow-x: hidden;
overflow-y: auto;
padding: 4px 0 12px;
scrollbar-color: var(--border) transparent;
scrollbar-width: thin;
}
.settings-content::-webkit-scrollbar {
width: 6px;
}
.settings-content::-webkit-scrollbar-track {
background: transparent;
}
.settings-content::-webkit-scrollbar-thumb {
background: var(--border);
border-radius: var(--radius-sm);
}
.settings-content::-webkit-scrollbar-thumb:hover {
background: var(--text-muted);
}
.settings-content > * {
animation: settingsFadeIn var(--transition-normal);
}
@keyframes settingsFadeIn {
from {
opacity: 0;
transform: translateY(4px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.settings-section-heading {
font-size: 14px;
font-weight: 600;
padding: var(--space-lg) var(--space-xl) var(--space-md);
margin: 0 var(--space-xl) 0;
color: var(--text);
border-bottom: 1px solid var(--border);
margin-bottom: var(--space-xs);
}
/* Spacing modifier for settings-section-heading that need extra top margin */
.settings-section-heading--spaced {
margin-top: var(--space-xl);
}
/* Scope indicators in sidebar nav items */
.settings-scope-icon {
margin-right: 6px;
display: inline-flex;
vertical-align: middle;
color: var(--text-muted);
}
/* Scope banner above section content */
.settings-scope-banner {
display: flex;
align-items: center;
gap: var(--space-sm);
padding: var(--space-sm) var(--space-xl);
margin: 0 var(--space-xl) var(--space-xs);
font-size: 12px;
border-radius: var(--radius);
color: var(--text-muted);
}
.settings-scope-global {
background: color-mix(in srgb, var(--color-info) 8%, transparent);
border-left: 3px solid color-mix(in srgb, var(--color-info) 40%, transparent);
}
.settings-scope-project {
background: color-mix(in srgb, var(--color-success) 8%, transparent);
border-left: 3px solid color-mix(in srgb, var(--color-success) 40%, transparent);
}
.settings-scope-mixed {
background: color-mix(in srgb, var(--triage) 8%, transparent);
border-left: 3px solid color-mix(in srgb, var(--triage) 40%, transparent);
}
/* Helper note styling for Settings sections — aligns with form-group horizontal gutters */
.settings-note {
display: block;
padding: 0 var(--space-xl);
margin-top: var(--space-xs);
font-size: 12px;
color: var(--text-muted);
}
@media (max-width: 768px) {
.settings-note {
padding: 0 var(--space-lg);
}
}
/* === Notifications Settings === */
.ntfy-advanced-disclosure {
margin-top: var(--space-md);
border: var(--btn-border-width) solid var(--border);
border-radius: var(--radius-md);
background: var(--surface);
}
.ntfy-advanced-disclosure > summary {
cursor: pointer;
list-style: none;
padding: var(--space-sm) var(--space-md);
font-size: 12px;
font-weight: 600;
color: var(--text);
}
.ntfy-advanced-disclosure > summary::-webkit-details-marker {
display: none;
}
.ntfy-advanced-content {
padding: 0 var(--space-md) var(--space-md);
display: flex;
flex-direction: column;
gap: var(--space-sm);
}
/* === Memory Settings === */
.memory-status-message {
display: flex;
gap: var(--space-md);
align-items: center;
justify-content: space-between;
margin-bottom: var(--space-md);
}
.memory-status-message span {
min-width: 0;
}
.memory-retrieval-test {
margin-top: var(--space-lg);
}
.memory-test-result {
margin: 0 var(--space-xl) var(--space-lg);
padding: var(--space-md);
border: var(--btn-border-width) solid var(--border);
border-radius: var(--radius-md);
background: var(--card);
}
.memory-test-result strong,
.memory-test-result span {
color: var(--text);
font-size: 12px;
}
.memory-test-result small {
display: block;
margin-top: var(--space-xs);
color: var(--text-muted);
font-size: 12px;
}
.memory-test-result ul {
margin: var(--space-md) 0 0;
padding: 0;
list-style: none;
}
.memory-test-result li {
padding-top: var(--space-sm);
border-top: var(--btn-border-width) solid var(--border);
}
.memory-test-result li + li {
margin-top: var(--space-sm);
}
.memory-test-result p {
margin: var(--space-xs) 0 0;
color: var(--text-muted);
font-size: 12px;
line-height: 1.5;
overflow-wrap: anywhere;
}
.memory-editor-section {
margin-top: var(--space-lg);
}
.memory-file-summary {
display: grid;
grid-template-columns: auto minmax(0, 1fr);
gap: var(--space-xs) var(--space-md);
align-items: center;
margin: 0 var(--space-xl) var(--space-md);
padding: var(--space-md);
border: var(--btn-border-width) solid var(--border);
border-radius: var(--radius-md);
background: var(--card);
}
.memory-file-summary span {
display: inline-flex;
align-items: center;
justify-content: center;
padding: var(--space-xs) var(--space-sm);
border-radius: var(--radius-pill);
color: var(--color-info);
background: color-mix(in srgb, var(--color-info) 12%, transparent);
font-size: 11px;
font-weight: 600;
}
.memory-file-summary strong {
min-width: 0;
overflow-wrap: anywhere;
color: var(--text);
font-family: var(--font-mono);
font-size: 12px;
}
.memory-file-summary small {
grid-column: 2;
color: var(--text-muted);
font-size: 12px;
}
.memory-editor-frame {
min-height: 50vh;
border: var(--btn-border-width) solid var(--border);
border-radius: var(--radius-md);
overflow: hidden;
display: flex;
flex-direction: column;
}
/* === Auth Provider Cards === */
.auth-section-hint {
padding: 12px 16px;
margin-bottom: 12px;
background: var(--bg-tertiary);
border-radius: var(--radius);
font-size: 13px;
color: var(--text-muted);
border-left: 3px solid var(--text-muted);
}
.auth-provider-group {
margin-bottom: 16px;
}
.auth-group-label {
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--text-muted);
margin-bottom: 8px;
padding: 0 4px;
}
.auth-provider-card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius-md);
margin-bottom: 8px;
overflow: hidden;
transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
}
.auth-provider-card:hover {
border-color: var(--text-dim);
}
.auth-provider-card--authenticated {
border-color: color-mix(in srgb, var(--color-success) 40%, var(--border));
background: color-mix(in srgb, var(--color-success) 5%, var(--surface));
}
.auth-provider-card--authenticated:hover {
border-color: color-mix(in srgb, var(--color-success) 60%, var(--border));
}
.auth-provider-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 16px;
gap: 12px;
}
.auth-provider-info {
display: flex;
align-items: center;
gap: 10px;
flex-wrap: wrap;
flex: 1;
min-width: 0;
}
.auth-provider-info strong {
font-weight: 500;
color: var(--text);
}
.auth-status-badge {
display: inline-flex;
align-items: center;
gap: var(--space-xs);
padding: 3px 8px;
border-radius: var(--radius-pill);
font-size: 11px;
font-weight: 600;
letter-spacing: 0.3px;
white-space: nowrap;
}
.auth-status-badge.authenticated {
background: color-mix(in srgb, var(--color-success) 20%, transparent);
color: var(--color-success);
}
.auth-status-badge.not-authenticated {
background: color-mix(in srgb, var(--color-error) 15%, transparent);
color: var(--color-error);
}
/* === Provider Connection Status Badges (FN-1901) === */
.auth-status-badge.connected {
background: color-mix(in srgb, var(--color-success) 20%, transparent);
color: var(--color-success);
}
.auth-status-badge.pending {
background: color-mix(in srgb, var(--color-info) 15%, transparent);
color: var(--color-info);
}
.auth-status-badge.not-connected {
background: color-mix(in srgb, var(--color-error) 15%, transparent);
color: var(--color-error);
}
.auth-status-badge.skipped {
background: color-mix(in srgb, var(--color-warning) 15%, transparent);
color: var(--color-warning);
}
.auth-status-badge.retry {
background: color-mix(in srgb, var(--color-warning) 20%, transparent);
color: var(--color-warning);
cursor: pointer;
}
.auth-hint {
display: block;
padding: 12px 4px 0;
font-size: 12px;
color: var(--text-muted);
border-top: 1px solid var(--border);
margin-top: 8px;
}
.auth-login-instructions {
margin-top: var(--space-sm);
margin-bottom: 0;
padding: var(--space-sm) var(--space-md);
border: 1px solid color-mix(in srgb, var(--color-info) 35%, var(--border));
border-radius: var(--radius-md);
background: color-mix(in srgb, var(--color-info) 8%, transparent);
color: var(--text);
line-height: 1.5;
white-space: pre-wrap;
}
.auth-apikey-section {
display: flex;
flex-direction: column;
gap: 4px;
align-items: flex-end;
flex-shrink: 0;
}
.auth-apikey-input-row {
display: flex;
gap: 6px;
align-items: center;
}
.auth-apikey-input {
background: var(--bg-input);
border: 1px solid var(--border);
border-radius: 6px;
color: var(--text);
padding: 6px 10px;
font-size: 13px;
width: 180px;
font-family: monospace;
}
.auth-apikey-input:focus {
outline: none;
border-color: var(--accent);
box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.2);
}
.auth-apikey-input:disabled {
opacity: 0.6;
}
.auth-apikey-progress {
font-size: calc(var(--space-sm) + var(--space-xs) * 0.75);
color: var(--text-muted);
padding-right: 4px;
}
.auth-apikey-error {
font-size: 11px;
color: var(--color-error);
padding-right: 4px;
}
/* === Key Hint === */
.auth-key-hint {
font-family: var(--font-mono);
font-size: 12px;
color: var(--text-muted);
display: inline-block;
margin-top: var(--space-xs);
user-select: none;
}
.settings-empty-state {
padding: 12px 20px;
font-size: 13px;
}
.settings-muted {
color: var(--text-muted);
}
.settings-loading {
text-align: center;
}
/* === Model Lane Status Badges === */
.settings-lane-badge {
display: inline-flex;
align-items: center;
padding: 2px 8px;
border-radius: 10px;
font-size: 11px;
font-weight: 500;
white-space: nowrap;
}
.settings-lane-badge--override {
background-color: color-mix(in srgb, var(--color-accent) 20%, transparent);
color: var(--color-accent);
}
.settings-lane-badge--inherited {
background-color: color-mix(in srgb, var(--color-text-muted) 15%, transparent);
color: var(--text-muted);
}
.settings-description {
font-size: 13px;
color: var(--text-secondary);
margin-bottom: var(--space-md);
line-height: 1.5;
}
/* === Settings: Model Presets === */
.settings-model-presets {
display: flex;
flex-direction: column;
gap: var(--space-md);
}
.settings-preset-list {
display: flex;
flex-direction: column;
gap: var(--space-sm);
}
.settings-preset-item {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: var(--space-md);
padding: var(--space-md);
border: var(--btn-border-width) solid var(--border);
border-radius: var(--radius-md);
background: var(--card);
}
.settings-preset-item-meta {
display: flex;
flex-direction: column;
gap: var(--space-xs);
min-width: 0;
}
.settings-preset-item-meta strong {
color: var(--text);
overflow-wrap: anywhere;
}
.settings-preset-summary {
font-size: 12px;
overflow-wrap: anywhere;
}
.settings-preset-item-actions {
display: flex;
gap: var(--space-xs);
flex-wrap: wrap;
justify-content: flex-end;
}
.settings-preset-actions {
display: flex;
justify-content: flex-start;
}
.settings-preset-editor {
display: flex;
flex-direction: column;
gap: var(--space-md);
padding: var(--space-md);
border: var(--btn-border-width) solid var(--border);
border-radius: var(--radius-md);
background: color-mix(in srgb, var(--surface) 85%, var(--card));
}
.settings-preset-editor-fields {
display: flex;
flex-direction: column;
gap: var(--space-sm);
}
.settings-preset-editor .form-group {
padding: 0;
}
.settings-preset-editor-actions {
justify-content: flex-start;
margin-top: 0;
padding: 0;
}
.settings-preset-auto-select {
margin-top: var(--space-sm);
}
.settings-preset-size-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: var(--space-sm);
}
.settings-preset-size-row {
padding: 0;
}
/* === Task Comments === */
.comments-header-row {
justify-content: space-between;
gap: var(--space-md);
}
.comments-author-row {
display: flex;
align-items: center;
gap: var(--space-sm);
}
.comments-actions-row {
display: flex;
gap: var(--space-sm);
}
.comments-edit-form {
display: grid;
gap: var(--space-sm);
margin-top: var(--space-sm);
}
.comments-edit-actions {
display: flex;
gap: var(--space-sm);
justify-content: flex-end;
}
.comments-outcome-text {
white-space: pre-wrap;
}
.comments-compose-form {
display: grid;
gap: var(--space-sm);
margin-top: var(--space-md);
}
/* Comment textareas use --surface so they remain visible against the
task detail modal's --card / --bg panels (in light mode --bg and
--card are both #ffffff, which made the box blend in). */
.comments-compose-form .spec-editor-feedback,
.comments-edit-form .spec-editor-feedback {
background: var(--surface);
}
.comments-type-toggle {
display: flex;
gap: var(--space-sm);
}
.comments-guidance-hint {
font-size: 0.875rem;
color: var(--text-muted);
}
.comments-footer-row {
display: flex;
justify-content: space-between;
align-items: center;
}
.comments-char-count {
font-size: 0.75rem;
}
.comments-char-count--over {
color: var(--color-error);
}
/* === PR Section === */
.pr-section-icon {
vertical-align: middle;
margin-right: var(--space-sm);
}
.pr-section-icon--sm {
vertical-align: middle;
margin-right: var(--space-xs);
}
.pr-hint--muted {
opacity: 0.8;
font-size: 13px;
}
.pr-hint--subtle {
margin-top: var(--space-sm);
opacity: 0.7;
font-size: 12px;
}
.pr-card--status {
border: 1px solid var(--border);
border-radius: var(--radius-md);
padding: var(--space-md);
}
.pr-header {
display: flex;
align-items: center;
gap: var(--space-sm);
margin-bottom: var(--space-sm);
}
.pr-status-icon {
font-size: 16px;
}
.pr-status-badge {
padding: 2px var(--space-sm);
border-radius: var(--radius-lg);
font-size: 12px;
font-weight: 500;
text-transform: capitalize;
}
/* PR status badge theme-aware colors */
.pr-status-badge--open {
background: var(--status-in-review-bg);
color: var(--in-review);
}
.pr-status-badge--closed {
background: var(--status-error-bg);
color: var(--color-error-dark);
}
.pr-status-badge--merged {
background: color-mix(in srgb, var(--in-progress) 15%, transparent);
color: var(--in-progress);
}
/* PR card status background */
.pr-card--status-open {
background: var(--status-in-review-bg);
}
.pr-card--status-closed {
background: var(--status-error-bg);
}
.pr-card--status-merged {
background: color-mix(in srgb, var(--in-progress) 15%, transparent);
}
/* GitHub badge base styles */
.card-github-badge {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 10px;
font-weight: 600;
padding: 2px 6px;
border-radius: var(--radius-pill);
cursor: pointer;
white-space: nowrap;
}
/* GitHub badge theme-aware colors */
.card-github-badge--open {
background: color-mix(in srgb, var(--in-review) 20%, transparent);
color: var(--in-review);
}
.card-github-badge--closed {
background: color-mix(in srgb, var(--color-error) 20%, transparent);
color: var(--color-error);
}
.card-github-badge--merged {
background: color-mix(in srgb, var(--in-progress) 20%, transparent);
color: var(--in-progress);
}
.card-github-badge--completed {
background: color-mix(in srgb, var(--in-progress) 20%, transparent);
color: var(--in-progress);
}
.card-github-badge--not-planned {
background: color-mix(in srgb, var(--text-muted, #8b949e) 15%, transparent);
color: var(--text-muted, #8b949e);
}
.pr-number {
font-size: 14px;
opacity: 0.8;
}
.pr-spacer {
flex: 1;
}
.pr-refresh-btn {
padding: var(--space-xs) var(--space-sm);
}
.pr-title {
font-weight: 500;
margin-bottom: var(--space-sm);
}
.pr-meta {
font-size: 12px;
opacity: 0.7;
margin-bottom: var(--space-sm);
}
.pr-meta-arrow {
margin: 0 var(--space-sm);
}
.pr-hint--info {
margin-bottom: var(--space-sm);
font-size: 12px;
}
.pr-footer {
display: flex;
align-items: center;
gap: var(--space-md);
}
.pr-comments {
display: flex;
align-items: center;
gap: var(--space-xs);
}
.pr-link {
display: flex;
align-items: center;
gap: var(--space-xs);
color: var(--todo);
text-decoration: none;
font-size: 12px;
}
.pr-link:hover {
text-decoration: underline;
}
/* === Merge Details Card === */
.merge-details-card {
border: 1px solid var(--border);
border-radius: var(--radius-md);
padding: var(--space-md);
}
/* === Markdown Prose === */
.markdown-body {
font-size: 13px;
line-height: 1.6;
color: var(--text);
word-break: break-word;
}
.markdown-body h1,
.markdown-body h2,
.markdown-body h3,
.markdown-body h4 {
color: var(--text);
font-weight: 600;
margin-top: 1.2em;
margin-bottom: 0.5em;
line-height: 1.3;
}
.markdown-body h1 {
font-size: 1.4em;
border-bottom: 1px solid var(--border);
padding-bottom: 0.3em;
}
.markdown-body h2 {
font-size: 1.2em;
border-bottom: 1px solid var(--border);
padding-bottom: 0.3em;
}
.markdown-body h3 {
font-size: 1.05em;
}
.markdown-body h4 {
font-size: 1em;
color: var(--text-muted);
}
.markdown-body h1:first-child,
.markdown-body h2:first-child,
.markdown-body h3:first-child,
.markdown-body h4:first-child {
margin-top: 0;
}
.markdown-body p {
margin: 0.6em 0;
}
.markdown-body ul,
.markdown-body ol {
padding-left: 1.6em;
margin: 0.5em 0;
}
.markdown-body ul {
list-style: disc;
}
.markdown-body ol {
list-style: decimal;
}
.markdown-body li {
margin: 0.25em 0;
}
.markdown-body li > ul,
.markdown-body li > ol {
margin: 0.15em 0;
}
.markdown-body code {
background: var(--card);
border-radius: var(--radius-sm);
padding: 0.15em 0.4em;
font-size: 0.9em;
font-family: var(--font-mono);
}
.markdown-body pre {
background: var(--card);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: var(--space-md);
overflow-x: auto;
margin: 0.6em 0;
}
.markdown-body pre > code {
background: none;
padding: 0;
border-radius: 0;
font-size: 0.85em;
}
.markdown-body a {
color: var(--todo);
text-decoration: none;
}
.markdown-body a:hover {
text-decoration: underline;
}
.markdown-body blockquote {
border-left: 3px solid var(--border);
padding: 0.3em 0.8em;
margin: 0.6em 0;
color: var(--text-muted);
}
.markdown-body table {
border-collapse: collapse;
width: 100%;
margin: 0.6em 0;
font-size: 0.9em;
}
.markdown-body th,
.markdown-body td {
border: 1px solid var(--border);
padding: 6px 10px;
text-align: left;
}
.markdown-body th {
background: var(--card);
font-weight: 600;
}
.markdown-body input[type="checkbox"] {
margin-right: 0.4em;
vertical-align: middle;
accent-color: var(--todo);
}
.markdown-body hr {
border: none;
border-top: 1px solid var(--border);
margin: 1em 0;
}
.markdown-body strong {
color: var(--text);
}
.markdown-body em {
font-style: italic;
}
.markdown-body img {
max-width: 100%;
border-radius: var(--radius);
}
.detail-deps {
margin-top: var(--space-lg);
}
.detail-deps h4 {
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--text-muted);
margin-bottom: 6px;
}
.detail-dep-list {
list-style: none;
font-size: 13px;
}
.detail-dep-item {
display: flex;
align-items: center;
padding: 4px 0;
}
.detail-dep-link {
color: var(--todo);
font-family: var(--font-mono);
cursor: pointer;
transition: text-decoration var(--transition-fast);
text-decoration: none;
display: inline-flex;
align-items: center;
gap: 6px;
max-width: 100%;
}
.detail-dep-link:hover {
text-decoration: underline;
}
.detail-dep-link:focus {
outline: 1px solid var(--todo);
outline-offset: 2px;
border-radius: 2px;
}
.detail-dep-id {
font-family: var(--font-mono);
font-weight: 500;
flex-shrink: 0;
}
.detail-dep-label {
color: var(--text-muted);
font-family: var(--font-primary);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.detail-agent-section {
margin-top: var(--space-lg);
}
.detail-meta-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-sm);
}
.detail-meta-label {
display: inline-flex;
align-items: center;
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--text-muted);
}
.detail-agent-actions {
position: relative;
display: inline-flex;
align-items: center;
}
.detail-agent-chip {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 4px 8px;
border: 1px solid var(--border);
border-radius: 9999px;
background: var(--surface);
color: var(--text);
font-size: 12px;
}
.detail-agent-clear {
display: inline-flex;
align-items: center;
justify-content: center;
width: 18px;
height: 18px;
border: none;
border-radius: 50%;
background: transparent;
color: var(--text-dim);
cursor: pointer;
}
.detail-agent-clear:hover {
background: var(--card-hover);
color: var(--text);
}
.detail-agent-actions > .agent-picker-dropdown {
position: absolute;
top: calc(100% + var(--space-xs));
right: 0;
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
min-width: 240px;
max-width: 320px;
max-height: 240px;
overflow-y: auto;
z-index: 220;
box-shadow: var(--shadow-lg);
}
.agent-picker-loading,
.agent-picker-empty {
padding: 10px 12px;
font-size: 12px;
color: var(--text-dim);
}
.agent-picker-item {
width: 100%;
display: flex;
align-items: center;
gap: var(--space-sm);
padding: 6px 12px;
font-size: 12px;
color: var(--text);
text-align: left;
background: transparent;
border: none;
cursor: pointer;
}
.agent-picker-item:hover,
.agent-picker-item.selected {
background: var(--card-hover);
}
.agent-picker-name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
flex: 1;
}
.agent-picker-role {
font-family: var(--font-mono);
color: var(--text-muted);
flex-shrink: 0;
}
/* === Step Progress === */
.detail-step-progress {
margin-top: var(--space-lg);
}
.detail-step-progress h4 {
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--text-muted);
margin-bottom: var(--space-sm);
}
.step-progress-wrapper {
display: flex;
align-items: center;
gap: var(--space-md);
}
.step-progress-bar {
flex: 1;
display: flex;
gap: 2px;
height: 8px;
}
.step-progress-segment {
flex: 1;
height: 100%;
border-radius: 2px;
transition: filter 0.15s ease, transform 0.15s ease;
cursor: pointer;
position: relative;
}
.step-progress-segment:hover {
filter: brightness(1.2);
transform: scaleY(1.1);
}
.step-progress-segment[data-tooltip]:hover::after {
content: attr(data-tooltip);
position: absolute;
bottom: 100%;
left: 50%;
transform: translateX(-50%);
background: var(--surface);
color: var(--text);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
padding: var(--space-xs) var(--space-sm);
font-size: 11px;
white-space: nowrap;
z-index: 10;
pointer-events: none;
margin-bottom: var(--space-xs);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
}
.step-progress-label {
font-size: 11px;
font-weight: 600;
color: var(--text-muted);
font-family: var(--font-mono);
flex-shrink: 0;
}
.step-progress-empty {
font-size: 13px;
color: var(--text-dim);
opacity: 0.7;
}
/* === Activity Timeline === */
.detail-activity {
margin-top: 20px;
}
.detail-activity-list {
display: flex;
flex-direction: column;
gap: 0;
}
.detail-log-truncated {
margin-bottom: var(--space-md);
padding: var(--space-sm) var(--space-md);
border: var(--btn-border-width) solid var(--border);
border-radius: var(--radius-md);
color: var(--text-muted);
background: var(--surface);
}
.detail-log-entry {
padding: 8px 0 8px 14px;
border-left: 2px solid var(--border);
position: relative;
}
.detail-log-entry::before {
content: "";
position: absolute;
left: -4px;
top: 13px;
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--text-dim);
}
.detail-log-entry:first-child::before {
background: var(--todo);
}
.detail-log-header {
display: flex;
flex-direction: column;
gap: 2px;
}
.detail-log-timestamp {
font-size: 11px;
color: var(--text-muted);
font-family: var(--font-mono);
}
.detail-log-action {
font-size: 13px;
color: var(--text);
line-height: 1.4;
}
.detail-log-outcome {
margin-top: 6px;
padding: var(--space-sm) var(--space-md);
background: var(--surface);
border-left: 3px solid var(--border);
border-radius: 0 var(--radius) var(--radius) 0;
font-size: 12px;
line-height: 1.5;
color: var(--text);
white-space: pre-wrap;
word-break: break-word;
}
.detail-log-empty {
font-size: 13px;
color: var(--text-dim);
padding: 12px 0;
}
/* === Toasts === */
.toast-container {
position: fixed;
bottom: 20px;
right: 20px;
z-index: 200;
display: flex;
flex-direction: column-reverse;
gap: var(--space-sm);
}
.toast {
padding: 10px 16px;
border-radius: var(--radius);
font-size: 13px;
color: #fff;
animation: toast-in 0.25s ease-out;
box-shadow: var(--shadow);
}
.toast-success {
background: var(--cta-bg);
}
.toast-error {
background: var(--color-error-dark);
}
.toast-info {
background: var(--color-info);
}
@media (max-width: 768px) {
.toast-container {
bottom: calc(var(--mobile-nav-height, 44px) + var(--executor-footer-height, 0px) + var(--standalone-bottom-gap, 0px) + env(safe-area-inset-bottom, 0px) + var(--space-lg) + var(--space-2xl));
right: 8px;
left: 8px;
}
.toast {
width: 100%;
font-size: 14px;
}
}
@keyframes toast-in {
from {
opacity: 0;
transform: translateY(12px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* === Worktree Groups === */
.worktree-group {
background: var(--surface);
border-left: 3px solid var(--in-progress);
border-radius: var(--radius);
padding: var(--space-sm);
margin-bottom: var(--space-sm);
display: flex;
flex-direction: column;
gap: 6px;
}
.worktree-group-header {
display: flex;
align-items: center;
gap: 6px;
font-size: 12px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--text-muted);
padding: 2px 4px;
}
.worktree-icon {
font-size: 12px;
line-height: 1;
}
.worktree-label {
font-family: var(--font-mono);
}
/* Queued preview cards */
.card.queued {
opacity: 0.55;
border-style: dashed;
cursor: default;
}
.card.queued:hover {
cursor: default;
}
.card.queued:active {
cursor: default;
}
.queued-badge {
display: inline-flex;
align-items: center;
gap: 3px;
font-size: 11px;
color: var(--todo);
}
/* === Card Inline Editing === */
/* Card in edit mode - highlighted border matching column theme */
.card.card-editing {
border: 1px solid var(--todo);
border-left: 3px solid var(--todo);
background: var(--card);
cursor: default;
}
.card.card-editing[data-column="triage"] {
border-color: var(--triage);
border-left-color: var(--triage);
}
.card.card-editing[data-column="todo"] {
border-color: var(--todo);
border-left-color: var(--todo);
}
/* Edit content container */
.card-editing-content {
display: flex;
flex-direction: column;
gap: var(--space-sm);
}
/* Description textarea in edit mode - follows InlineCreateCard patterns */
.card-edit-desc-textarea {
width: 100%;
padding: 6px 8px;
background: transparent;
border: 1px solid transparent;
color: var(--text);
font-size: 13px;
font-family: inherit;
outline: none;
resize: none;
overflow: hidden;
line-height: 1.4;
min-height: 80px;
transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
}
.card-edit-desc-textarea:focus {
border-color: var(--todo);
box-shadow: var(--focus-ring);
border-radius: var(--radius);
}
.card-edit-desc-textarea::placeholder {
color: var(--text-dim);
}
.card-edit-desc-textarea:disabled {
opacity: 0.6;
cursor: not-allowed;
}
/* Card header actions container - groups size badge and buttons on the right */
.card-header-actions {
display: flex;
align-items: center;
gap: 6px;
margin-left: auto;
}
/* Edit button - visible on hover */
.card-edit-btn {
display: flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
padding: 0;
background: transparent;
border: none;
border-radius: var(--radius-sm);
color: var(--text-muted);
cursor: pointer;
opacity: 0;
transition: opacity 0.15s, background 0.15s, color 0.15s;
}
.card:hover .card-edit-btn {
opacity: 1;
}
.card-edit-btn:hover {
background: var(--border);
color: var(--text);
}
.card-edit-btn:focus {
opacity: 1;
outline: 1px solid var(--todo);
outline-offset: 1px;
}
/* Delete button - visible on hover for triage column */
.card-delete-btn {
display: flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
padding: 0;
background: transparent;
border: none;
border-radius: var(--radius-sm);
color: var(--text-secondary);
cursor: pointer;
opacity: 0;
transition: opacity 0.15s, color 0.15s;
}
.card:hover .card-delete-btn {
opacity: 1;
}
.card-delete-btn:hover {
color: var(--color-error, #f85149);
}
.card-delete-btn:focus {
outline: 2px solid var(--accent);
outline-offset: 1px;
opacity: 1;
}
/* Archive/Unarchive buttons */
.card-archive-btn,
.card-unarchive-btn {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 2px 8px;
margin-left: 8px;
font-size: 11px;
font-weight: 500;
background: var(--card);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
color: var(--text-muted);
cursor: pointer;
opacity: 0;
transition: opacity 0.15s, background 0.15s, color 0.15s, border-color 0.15s;
}
.card:hover .card-archive-btn,
.card:hover .card-unarchive-btn {
opacity: 1;
}
.card-archive-btn:hover,
.card-unarchive-btn:hover {
background: var(--card-hover);
color: var(--text);
border-color: var(--border-hover);
}
.card-archive-btn:focus,
.card-unarchive-btn:focus {
opacity: 1;
outline: 1px solid var(--todo);
outline-offset: 1px;
}
/* Send Back button and dropdown */
.card-send-back {
position: relative;
}
.card-send-back-btn {
display: inline-flex;
align-items: center;
gap: 2px;
padding: 2px 8px;
margin-left: 8px;
font-size: 11px;
font-weight: 500;
background: var(--card);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
color: var(--text-muted);
cursor: pointer;
opacity: 0;
transition: opacity 0.15s, background 0.15s, color 0.15s, border-color 0.15s;
}
.card:hover .card-send-back-btn {
opacity: 1;
}
.card-send-back-btn:hover {
background: var(--card-hover);
color: var(--text);
border-color: var(--border-hover);
}
.card-send-back-btn:focus {
opacity: 1;
outline: 1px solid var(--todo);
outline-offset: 1px;
}
.card-send-back-menu {
position: absolute;
top: calc(100% + 4px);
right: 0;
z-index: 50;
min-width: 100px;
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius-md);
box-shadow: var(--shadow-md);
overflow: hidden;
}
.card-send-back-menu-item {
display: block;
width: 100%;
padding: 6px 12px;
font-size: 12px;
font-weight: 400;
color: var(--text);
background: transparent;
border: none;
cursor: pointer;
text-align: left;
transition: background 0.1s;
}
.card-send-back-menu-item:hover {
background: var(--surface-hover);
}
.card-send-back-menu-item:focus {
outline: none;
background: var(--surface-hover);
}
/* Loading state during save */
.card-edit-loading {
display: flex;
align-items: center;
gap: var(--space-sm);
margin-top: var(--space-xs);
font-size: calc(var(--space-sm) + var(--space-xs) * 0.75);
color: var(--text-muted);
}
.card-edit-loading-spinner {
width: 12px;
height: 12px;
border: 2px solid var(--border);
border-top-color: var(--todo);
border-radius: 50%;
animation: spin 1s linear infinite;
}
.card-edit-loading-text {
font-size: calc(var(--space-sm) + var(--space-xs) * 0.75);
color: var(--text-muted);
}
/* === Inline Create Card === */
.inline-create-card {
background: var(--card);
border: 1px solid var(--todo);
border-left: 3px solid var(--todo);
border-radius: var(--radius);
padding: 10px 12px;
display: flex;
flex-direction: column;
gap: var(--space-sm);
}
.inline-create-input {
width: 100%;
padding: 6px 8px;
background: transparent;
border: none;
color: var(--text);
font-size: 13px;
font-family: inherit;
outline: none;
resize: none;
overflow: hidden;
line-height: 1.4;
}
.inline-create-input:focus {
border-bottom: 1px solid var(--todo);
box-shadow: 0 1px 0 0 var(--todo);
}
.inline-create-input::placeholder {
color: var(--text-dim);
}
/* Inline Create Card textarea wrap for expand button positioning */
.inline-create-textarea-wrap {
position: relative;
flex: 1;
min-width: 0;
width: 100%;
}
/* Inline Create Card expand button - bottom-right of textarea */
.inline-create-expand-btn {
position: absolute;
bottom: 6px;
right: 32px;
padding: 4px;
opacity: 0.6;
transition: opacity var(--transition-fast);
z-index: 1;
}
.inline-create-expand-btn:hover {
opacity: 1;
}
/* Inline Create Card fullscreen mode */
.inline-create-input--fullscreen {
flex: 1;
padding-right: 70px;
min-height: unset;
resize: none;
border-radius: var(--radius-md);
font-size: 15px;
line-height: 1.6;
}
/* Inline Create Card Toggle Button */
.inline-create-toggle {
display: inline-flex;
align-items: center;
justify-content: center;
padding: var(--space-xs);
height: 28px;
width: 28px;
flex-shrink: 0;
background: transparent;
border: 1px solid transparent;
border-radius: var(--radius-sm);
color: var(--text-muted);
cursor: pointer;
transition: all var(--transition-fast);
}
.inline-create-toggle:hover {
background: var(--card-hover);
border-color: var(--border);
color: var(--text);
}
.inline-create-toggle:focus-visible {
outline: 2px solid var(--focus-ring);
outline-offset: 2px;
}
/* Inline Create Card Main Row */
.inline-create-main-row {
display: flex;
align-items: flex-start;
gap: var(--space-sm);
}
.inline-create-main-row .inline-create-input {
flex: 1;
min-width: 0;
}
/* Collapsed state */
.inline-create-card--collapsed {
padding: 8px 10px;
}
.inline-create-card--collapsed .inline-create-input {
min-height: 28px;
}
/* Expanded state */
.inline-create-card--expanded {
padding: 10px 12px;
}
.inline-create-card--expanded .inline-create-input {
min-height: 32px;
}
.inline-create-footer {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: var(--space-sm);
flex-wrap: wrap;
}
.inline-create-controls {
display: flex;
align-items: center;
gap: var(--space-sm);
flex: 1 1 auto;
flex-wrap: wrap;
min-width: 0;
}
.inline-create-actions {
display: flex;
align-items: center;
gap: var(--space-sm);
margin-left: auto;
}
.inline-create-hint {
font-size: 11px;
color: var(--text-dim);
margin-left: auto;
}
.inline-create-previews {
display: flex;
flex-wrap: wrap;
gap: var(--space-sm);
margin-bottom: var(--space-md);
max-height: 120px;
overflow-y: auto;
padding: 2px;
}
.inline-create-preview {
position: relative;
width: 48px;
height: 48px;
border: 1px solid var(--border);
border-radius: var(--radius-sm);
overflow: hidden;
background: var(--card);
flex-shrink: 0;
}
.inline-create-preview img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.inline-create-preview-remove {
position: absolute;
top: 2px;
right: 2px;
display: flex;
align-items: center;
justify-content: center;
background: rgba(0, 0, 0, 0.6);
color: #fff;
border: none;
border-radius: 50%;
width: 16px;
height: 16px;
cursor: pointer;
font-size: 10px;
line-height: 1;
padding: 0;
transition: background 0.15s ease;
}
.inline-create-preview-remove:hover {
background: rgba(248, 81, 73, 0.9);
}
.dep-trigger-wrap {
position: relative;
}
.agent-trigger-wrap {
position: relative;
}
.inline-create-model-wrap {
position: relative;
}
.dep-trigger,
.inline-create-model-trigger {
font-size: 12px;
padding: 3px 8px;
}
.inline-create-priority-wrap {
display: inline-flex;
align-items: center;
}
.inline-create-priority-select {
max-width: 180px;
}
.dep-dropdown {
position: absolute;
top: 100%;
left: 0;
margin-top: var(--space-xs);
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
min-width: 280px;
max-width: 400px;
max-height: 320px;
overflow-y: auto;
z-index: 200;
box-shadow: var(--shadow-lg);
}
/* Portal-rendered dependency dropdown - uses fixed positioning from JS */
.dep-dropdown--portal {
position: fixed !important;
top: auto;
left: auto;
margin-top: 0;
}
/* Portal-rendered agent picker dropdown - uses fixed positioning from JS */
.agent-picker-dropdown--portal {
position: fixed !important;
top: auto;
left: auto;
margin-top: 0;
z-index: 201;
}
.dep-dropdown-search-header {
position: sticky;
top: 0;
padding: 6px 12px;
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.4px;
color: var(--text-muted);
background: var(--surface);
border-bottom: 1px solid var(--border);
z-index: 1;
}
.dep-dropdown-search {
position: sticky;
top: 0;
width: 100%;
box-sizing: border-box;
padding: 6px 12px;
font-size: 12px;
font-family: inherit;
background: var(--surface);
border: none;
border-bottom: 1px solid var(--border);
color: var(--text);
outline: none;
z-index: 1;
}
.dep-dropdown-search::placeholder {
color: var(--text-dim);
}
.dep-dropdown-search:focus {
border-bottom-color: var(--accent, #58a6ff);
}
.dep-dropdown-empty {
padding: 10px 12px;
font-size: 12px;
color: var(--text-dim);
}
.dep-dropdown-item {
display: flex;
align-items: center;
gap: var(--space-sm);
padding: 6px 12px;
font-size: 12px;
cursor: pointer;
transition: background 0.1s;
}
.dep-dropdown-item:hover {
background: var(--card-hover);
}
.dep-dropdown-item.selected {
background: rgba(88, 166, 255, 0.15);
}
.dep-dropdown-id {
font-family: var(--font-mono);
font-weight: 600;
color: var(--text-muted);
flex-shrink: 0;
}
.dep-dropdown-title {
color: var(--text);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* === AI Refine Menu === */
.refine-trigger-wrap {
position: relative;
}
.refine-menu {
position: absolute;
top: 100%;
left: 0;
margin-top: var(--space-xs);
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
min-width: 200px;
max-width: 280px;
z-index: 100;
overflow: hidden;
}
.refine-menu--portal {
position: fixed;
z-index: 1000;
min-width: 200px;
max-width: calc(100vw - 16px);
margin-top: 0;
}
.refine-button {
display: inline-flex;
align-items: center;
gap: var(--space-xs);
}
.refine-button--loading {
opacity: 0.7;
cursor: not-allowed;
}
.refine-menu-item {
padding: 10px 14px;
cursor: pointer;
transition: background 0.1s ease;
border-bottom: 1px solid var(--border);
}
.refine-menu-item:last-child {
border-bottom: none;
}
.refine-menu-item:hover {
background: var(--card-hover);
}
.refine-menu-item-title {
font-weight: 500;
font-size: 13px;
color: var(--text);
margin-bottom: 2px;
}
.refine-menu-item-desc {
font-size: 12px;
color: var(--text-muted);
line-height: 1.4;
}
/* NewTaskModal description with refine button */
.description-label-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-sm);
}
.description-auto-save-status {
font-size: 11px;
color: var(--color-success);
opacity: 0;
text-transform: none;
letter-spacing: 0;
transition: opacity var(--transition-fast);
}
.description-auto-save-status.is-visible {
opacity: 1;
}
.description-with-refine {
position: relative;
}
/* Description expand button positioning.
The expand button sits in the top-right corner of the description textarea.
When the Refine button is visible (non-empty description), the expand button
is offset left (right: 40px) to avoid overlap. When Refine is absent (empty
description), the expand button sits flush in the corner (right: 8px). */
.description-expand-btn {
position: absolute;
top: 8px;
right: 8px; /* Default: flush placement when Refine is absent */
}
/* Offset placement when Refine button is visible (non-empty description) */
.description-expand-btn--offset {
right: 40px;
}
.description-fullscreen-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: var(--space-md);
font-size: 13px;
font-weight: 600;
color: var(--text-muted);
}
.description--fullscreen {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 10000;
background: var(--surface);
padding: var(--space-lg);
display: flex;
flex-direction: column;
}
.description--fullscreen textarea {
flex: 1;
padding-right: 70px;
min-height: unset;
resize: none;
border-radius: var(--radius-md);
font-size: 15px;
line-height: 1.6;
}
.description--fullscreen .refine-button {
position: fixed;
top: 8px;
right: 8px;
z-index: 10001;
}
.description--fullscreen .description-expand-btn {
position: fixed;
top: 8px;
right: 40px;
z-index: 10001;
}
/* AI-assisted description actions — sits directly below description in TaskForm */
.task-form-description-actions {
display: flex;
align-items: center;
gap: 6px;
margin-top: 4px;
margin-bottom: 4px;
flex-wrap: wrap;
}
.description-with-refine .refine-button {
position: absolute;
top: 8px;
right: 8px;
}
.description-with-refine textarea {
padding-right: 70px; /* Make room for the refine button */
}
.refine-menu--modal {
right: 0;
left: auto;
top: calc(100% + 4px);
}
.inline-create-model-dropdown {
position: absolute;
top: 100%;
left: 0;
margin-top: var(--space-xs);
width: min(320px, calc(100vw - 32px));
max-width: calc(100vw - 32px);
padding: var(--space-md);
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
display: flex;
flex-direction: column;
gap: 10px;
z-index: 500;
box-shadow: var(--shadow);
}
.inline-create-model-row {
display: flex;
flex-direction: column;
gap: 6px;
}
.inline-create-model-label {
font-size: 12px;
font-weight: 600;
color: var(--text-muted);
}
.inline-create-model-select {
width: 100%;
min-width: 0;
padding: 7px 10px;
background: var(--card);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
color: var(--text);
font-size: 12px;
font-family: inherit;
outline: none;
}
.inline-create-model-select:focus {
border-color: var(--todo);
box-shadow: var(--focus-ring);
}
.inline-create-model-empty {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-sm);
font-size: 12px;
color: var(--text-dim);
}
.inline-create-model-row .model-badge {
width: fit-content;
}
@media (max-width: 640px) {
.inline-create-actions {
width: 100%;
justify-content: space-between;
margin-left: 0;
}
.inline-create-hint {
margin-left: 0;
}
.inline-create-model-dropdown {
left: 0;
right: auto;
width: min(360px, calc(100vw - 48px));
max-width: calc(100vw - 48px);
}
}
/* === Empty state === */
.empty-column {
display: flex;
align-items: center;
justify-content: center;
height: 80px;
font-size: 12px;
color: var(--text-dim);
border: 1px dashed var(--border);
border-radius: var(--radius);
margin: 4px;
}
/* Auto-merge toggle */
.auto-merge-toggle {
display: flex;
align-items: center;
gap: 6px;
cursor: pointer;
user-select: none;
margin-left: auto;
}
.auto-merge-toggle input {
display: none;
}
.toggle-slider {
position: relative;
width: 28px;
height: 16px;
background: var(--border);
border-radius: var(--radius-md);
transition: background var(--transition-normal);
flex-shrink: 0;
}
.toggle-slider::after {
content: "";
position: absolute;
top: 2px;
left: 2px;
width: 12px;
height: 12px;
background: var(--card);
border-radius: 50%;
transition: transform var(--transition-normal);
}
.auto-merge-toggle input:checked + .toggle-slider {
background: var(--in-review);
}
.auto-merge-toggle input:checked + .toggle-slider::after {
transform: translateX(12px);
}
.toggle-label {
font-size: calc(var(--space-sm) + var(--space-xs) * 0.75);
color: var(--text-muted);
white-space: nowrap;
}
/* === Mobile Responsive Overrides ===
Cross-cutting mobile rules only. Component-specific overrides have been
moved into co-located @media blocks at the bottom of each component's
.css file in app/components/. */
@media (max-width: 768px) {
/* Prevent iOS Safari auto-zoom on focus: all inputs must be >= 16px */
input[type="text"],
input[type="search"],
input[type="email"],
input[type="password"],
input[type="number"],
input[type="url"],
input[type="tel"],
input:not([type]),
select,
textarea {
font-size: 16px;
}
/* Prevent ancestor elements from producing a second horizontal scrollbar */
html,
body {
overflow: hidden;
}
#root {
overflow: hidden;
padding-top: env(safe-area-inset-top, 0px);
padding-bottom: env(safe-area-inset-bottom, 0px);
padding-left: env(safe-area-inset-left, 0px);
padding-right: env(safe-area-inset-right, 0px);
}
/* Prevent horizontal overflow from wide content */
* {
max-width: 100vw;
}
pre,
code,
.code-block {
overflow-x: auto;
max-width: 100%;
word-break: break-all;
word-break: break-word;
}
img,
svg {
max-width: 100%;
}
img {
height: auto;
}
table {
display: block;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
max-width: 100%;
}
/* Global touch target enforcement on mobile */
.btn:not(.btn-icon):not(.btn-badge):not(.btn-sm):not(.btn--sm) {
min-height: 36px;
}
.btn-icon {
min-width: 36px;
min-height: 36px;
}
/* Column-header action buttons (e.g. archive) stay compact */
.column-header .btn-icon {
min-width: 28px;
min-height: 28px;
}
input[type="text"],
input[type="search"],
input[type="email"],
input[type="password"],
input[type="number"],
input[type="url"],
select,
textarea {
min-height: 36px;
}
/* Dropdown items and overflow menu actions */
.dep-dropdown-item,
.mobile-overflow-item,
.mobile-overflow-split-toggle,
.list-column-dropdown-item {
min-height: 36px;
}
/* Small tappable controls — adequate touch sizing for mobile */
.view-toggle-btn,
.header-search-clear,
.inline-create-toggle,
.quick-entry-toggle,
.modal-edit-btn,
.gm-icon-btn,
.activity-log-clear,
.terminal-tab-close,
.workflow-results-edit-toggle,
.agent-tree__toggle,
.quick-chat-panel-input button {
min-width: 36px;
min-height: 36px;
}
/* Document mode toggle: ensure adequate touch target on mobile */
.document-mode-toggle {
min-width: 36px;
min-height: 36px;
}
/* Board: flex layout with single horizontal scroll + snap */
.board {
display: flex;
overflow-x: auto;
overflow-y: hidden;
-webkit-overflow-scrolling: touch;
scroll-snap-type: x mandatory;
scroll-padding-inline: calc(50% - 140px);
scroll-behavior: smooth;
scrollbar-width: none;
padding: var(--space-md);
padding-bottom: var(--space-md);
gap: var(--space-md);
height: 100%;
}
.board::-webkit-scrollbar {
display: none;
}
.board > .column {
width: 280px;
min-width: 280px;
flex-shrink: 0;
scroll-snap-align: center;
}
/* Column header: natural height from padding and font is sufficient */
/* Column count badge: slightly wider on mobile for tapping */
.column-count {
min-width: 28px;
}
/* Mobile header: collapsible search and overflow menu */
.mobile-search-trigger {
display: flex;
align-items: center;
justify-content: center;
}
/* Mobile search expanded - inside header-floating-search container */
.mobile-search-expanded {
width: 100%;
}
/* Mobile: compact node label, no dropdown */
.header-node-selector--mobile {
margin-right: var(--space-xs);
cursor: default;
}
.header-node-selector--mobile .node-status-indicator {
font-size: 11px;
padding: 2px var(--space-xs);
}
.header-node-selector--mobile .node-status-indicator__name {
max-width: 80px;
font-weight: 400;
}
/* Modal: full-screen on mobile (cross-cutting overlay/modal base chrome) */
.modal-overlay,
.agent-detail-overlay,
.agent-dialog-overlay,
.chat-new-dialog-backdrop,
.workflow-output-modal-overlay {
padding-top: 0;
align-items: stretch;
}
.modal,
.modal-lg,
.modal-md,
.gm-modal {
width: 100%;
max-width: 100%;
height: 100vh;
height: 100dvh;
max-height: 100vh;
max-height: 100dvh;
border-radius: 0;
border: none;
padding-bottom: env(safe-area-inset-bottom, 0px);
}
/* Settings modal: use the section picker as the only mobile navigation */
.settings-layout {
flex-direction: column;
min-height: 0;
}
.settings-mobile-section-picker {
display: flex;
flex-direction: column;
gap: var(--space-xs);
padding: var(--space-md) var(--space-lg);
border-bottom: var(--btn-border-width) solid var(--border);
background: var(--surface);
}
.settings-mobile-section-picker label {
color: var(--text-muted);
font-weight: 600;
text-transform: uppercase;
}
.settings-mobile-section-picker select {
width: 100%;
}
.settings-mobile-section-picker select:focus-visible {
outline: none;
border-color: var(--todo);
box-shadow: var(--focus-ring-strong);
}
.settings-sidebar {
display: none;
}
.settings-nav-item {
display: flex;
align-items: center;
justify-content: center;
gap: 4px;
border-left: none;
border-bottom: 2px solid transparent;
border-radius: var(--radius) var(--radius) 0 0;
padding: 6px 12px;
white-space: nowrap;
}
.settings-nav-item:hover {
border-left-color: transparent;
border-bottom-color: var(--border);
}
.settings-nav-item.active {
border-left-color: transparent;
border-bottom-color: var(--todo);
}
/* Hide group headers on mobile - they don't fit well in horizontal scroll row */
.settings-group-header {
display: none;
}
.settings-scope-icon {
margin-right: 0;
}
.settings-content {
flex: 1;
min-height: 0;
overflow-x: hidden;
overflow-y: auto;
}
.settings-content .form-group small {
overflow-wrap: break-word;
word-break: break-all;
}
.settings-content input,
.settings-content select,
.settings-content textarea {
font-size: 16px;
}
.settings-section-heading {
padding: var(--space-lg) var(--space-lg) var(--space-md);
margin: 0 var(--space-lg) 0;
}
.form-group {
padding: 0 14px;
}
.settings-scope-banner {
padding: var(--space-sm) var(--space-lg);
}
.settings-empty-state {
padding: 12px 14px;
}
.memory-editor-frame {
min-height: 45vh;
}
.memory-file-summary {
grid-template-columns: 1fr;
margin: 0 var(--space-lg) var(--space-md);
}
.memory-status-message {
align-items: stretch;
flex-direction: column;
}
.memory-file-summary span {
justify-content: flex-start;
}
.memory-file-summary small {
grid-column: auto;
}
.settings-description {
padding: 0 var(--space-lg);
}
.settings-content .btn,
.settings-preset-item-actions .btn {
min-height: 36px;
}
.auth-provider-row {
flex-wrap: wrap;
padding: 12px 14px;
gap: var(--space-sm);
}
.auth-section-hint {
margin: 0 14px 12px;
padding: 10px 14px;
}
.auth-provider-group {
margin-bottom: 12px;
}
.auth-group-label {
padding: 0 14px;
}
.auth-provider-card {
margin: 0 14px 8px;
}
.auth-provider-header {
flex-wrap: wrap;
padding: 10px 14px;
gap: 10px;
}
.auth-provider-info {
width: 100%;
flex-basis: 100%;
}
.auth-apikey-section {
width: 100%;
flex-basis: 100%;
align-items: stretch;
}
.auth-apikey-input-row {
flex-wrap: wrap;
}
.auth-apikey-input {
flex: 1;
min-width: 120px;
width: auto;
}
.auth-apikey-input-row .btn {
flex-shrink: 0;
}
.auth-hint {
padding: 12px 14px 0;
}
.backup-list ul {
max-height: 220px;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
/* Card edit button: always visible on mobile (no hover) */
.card-edit-btn {
opacity: 1;
width: 32px;
height: 32px;
margin-right: -8px;
margin-top: -8px;
margin-bottom: -8px;
border-radius: var(--radius-md);
}
.card-edit-btn svg {
width: 16px;
height: 16px;
}
/* Card delete button: always visible on mobile (no hover) */
.card-delete-btn {
opacity: 1;
width: 32px;
height: 32px;
margin-right: -8px;
margin-top: -8px;
margin-bottom: -8px;
border-radius: var(--radius-md);
}
.card-delete-btn svg {
width: 16px;
height: 16px;
}
/* Git Manager remote edit buttons: always visible on mobile (no hover) */
.gm-remote-edit-btn {
opacity: 1;
width: 36px;
height: 36px;
margin-right: -8px;
margin-top: -8px;
margin-bottom: -8px;
border-radius: var(--radius-md);
}
.gm-remote-edit-btn svg {
width: 16px;
height: 16px;
}
/* Card: always show action buttons on mobile (no hover state) */
.card-header-actions {
gap: 4px;
flex-shrink: 0;
}
.card-archive-btn,
.card-unarchive-btn {
opacity: 1;
padding: 4px 10px;
}
/* Card: compact progress bar on narrow cards */
.card-progress {
gap: var(--space-xs);
}
.card-progress-label {
font-size: 10px;
min-width: 30px;
}
.card-steps-toggle {
padding: var(--space-xs) 0;
}
/* Card: smaller status badges for 280px width */
.card-status-badge {
font-size: 9px;
padding: 1px 6px;
}
.card-mission-badge {
max-width: 80px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* Card: wrap dependency badges */
.card-dep-list {
flex-wrap: wrap;
}
/* Inline create: fit within 280px column */
.inline-create-card {
max-width: 100%;
box-sizing: border-box;
}
.inline-create-main-row {
gap: var(--space-xs);
}
.inline-create-input {
font-size: 16px;
}
/* Inline create: mobile-friendly touch sizing */
.inline-create-toggle {
min-width: 36px;
min-height: 36px;
flex-shrink: 0;
}
/* Inline create: wrap footer controls at 280px */
.inline-create-controls {
flex-wrap: wrap;
gap: var(--space-xs);
}
.inline-create-controls .btn {
min-height: 36px;
font-size: 12px;
}
.inline-create-priority-select {
min-height: 36px;
}
/* Inline create: constrain dependency dropdown to card width */
.dep-dropdown {
left: 0;
right: 0;
min-width: 0;
width: 100%;
max-width: 100%;
max-height: 200px;
}
.refine-menu--modal {
left: 14px;
right: 14px;
}
/* Settings modal: model preset controls stack cleanly on narrow screens */
.settings-model-presets {
gap: var(--space-sm);
}
.settings-preset-item {
flex-direction: column;
align-items: stretch;
padding: var(--space-sm) var(--space-md);
}
.settings-preset-item-actions {
justify-content: flex-start;
}
.settings-preset-editor {
padding: var(--space-sm) var(--space-md);
}
.settings-preset-editor-actions {
flex-wrap: wrap;
}
.settings-preset-size-grid {
grid-template-columns: 1fr;
gap: var(--space-xs);
}
}
/* === Tablet Responsive Tier (769px1024px) === */
/* Cross-cutting tablet rules only. Component-specific tablet overrides
live in co-located @media blocks in app/components/. */
@media (min-width: 769px) and (max-width: 1024px) {
/* (no cross-cutting tablet rules at present) */
}
/* === Badge Base === */
.badge {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 11px;
font-weight: 600;
padding: 2px 8px;
border-radius: var(--radius-pill);
white-space: nowrap;
}
.badge--sm {
font-size: 10px;
padding: 1px 6px;
}
/* === Mobile scroll fixes for view containers ============================== */
/* Many top-level "view" components use a flex column with height:100% +
overflow:hidden on the root and overflow-y:auto on the content area. On
mobile the content area can fail to scroll because flex children default to
min-height:auto, which prevents the inner area from being smaller than its
intrinsic content. Force min-height:0 so overflow-y:auto actually kicks in. */
@media (max-width: 768px) {
/* Wrapped in :is() so legacy CSS-regression tests that match per-selector
base rules (e.g. /\.mailbox-view\s*\{[^}]*\}/) don't pick this up as the
"first" definition for any individual selector. */
:is(.insights-view, .memory-view, .dev-server-view, .skills-view,
.documents-view, .roadmaps-view, .nodes-management-overlay,
.agents-view, .chat-view, .mission-manager, .mailbox-view) {
min-height: 0;
}
:is(.insights-view-content, .memory-view-content, .skills-view-content,
.documents-view-content, .agents-view-content, .chat-thread,
.mission-detail, .mission-manager__body, .mailbox-content) {
min-height: 0;
-webkit-overflow-scrolling: touch;
overscroll-behavior: contain;
}
}
/* === Global utility classes (rescued from misclassified extractions) ====== */
.text-muted { color: var(--text-muted); }
.text-secondary { color: var(--text-secondary, var(--text-muted)); }
.text-dim { color: var(--text-dim, var(--text-muted)); }