/* === Detail Modal === */ .task-detail-content { display: flex; flex-direction: column; height: 100%; min-width: 0; min-height: 0; } .modal.task-detail-modal { width: 100%; height: 100%; min-width: 0; min-height: 0; overflow: hidden; } /* FNXC:TaskDetail 2026-06-22-20:00: The gray top header band (task id + column badge) was over-padded. Trim its vertical padding for a more compact band, scoped to the task-detail header so the shared global .modal-header (used by other modals) is unaffected. Keep horizontal padding from --modal-padding; only the block padding shrinks. */ .task-detail-content > .modal-header { padding-block: var(--space-sm); } .detail-title-row { display: flex; align-items: center; gap: var(--space-sm); } .detail-id { font-family: var(--font-mono); font-size: 13px; font-weight: 600; color: var(--text-muted); } .detail-column-badge { font-size: 0.6875rem; padding: calc(var(--space-xs) / 2) var(--space-sm); border-radius: var(--radius-pill); font-weight: 600; letter-spacing: 0.03125rem; text-transform: uppercase; } /* FNXC:WorkflowBadges 2026-06-30-00:00: Task detail workflow badges share the board badge's slight token-based icon-to-label gap so the canonical metadata badge stays readable while preserving inline truncation and timestamp ownership. */ .detail-workflow-badge { column-gap: calc(var(--space-xs) / 2); font-size: 0.6875rem; padding: calc(var(--space-xs) / 2) var(--space-sm); border-radius: var(--radius-pill); font-weight: 600; letter-spacing: 0.03125rem; display: inline-flex; align-items: center; flex: 0 1 auto; min-width: 0; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-muted); background: var(--surface-raised); border: 1px solid var(--border); } .badge-triage { background: var(--status-triage-bg); color: var(--triage); } .badge-todo { background: var(--status-todo-bg); color: var(--todo); } .badge-in-progress { background: var(--status-in-progress-bg); color: var(--in-progress); } .badge-in-review { background: var(--status-in-review-bg); color: var(--in-review); } .badge-done { background: var(--status-done-bg); color: var(--done); } /* FNXC:TaskDetailLayout 2026-08-01-00:48: FN-8634 requires perceived-empty shell insets to remain symmetric for Task Detail modal, pop-out, embedded, and responsive shells in both scrollbar states. A painted track occupies its end-side band, so the padded content must not share the scrolling element that owns it. Keep shell content padding on `.detail-body-content`; `.detail-body` owns scrolling only. Activity's non-Interventions first-row end clearance remains deliberately asymmetric and child-local so `.activity-expand-toggle--overlay` cannot cover log text (FN-8166/FN-8624). It is excluded from shell-inset symmetry; FN-7581 Interventions remains at zero clearance. */ .detail-body { padding: 0; min-width: 0; overflow-x: hidden; overflow-y: auto; scrollbar-color: var(--border) transparent; scrollbar-width: thin; flex: 1; /* FNXC:TaskDetailTabKeepAlive 2026-07-22-12:55: Containing block for kept-alive tab bodies (KeepAliveView): their hidden state is position:absolute inset:0, so a hidden terminal/planner-chat body consumes no layout space beside the active tab while keeping a real box for xterm-safe geometry. */ position: relative; } .detail-body-content { min-width: 0; padding: calc(var(--space-lg) + var(--space-xs)); } .detail-body::-webkit-scrollbar { width: 6px; } .detail-body::-webkit-scrollbar-track { background: transparent; } .detail-body::-webkit-scrollbar-thumb { background: var(--border); border-radius: var(--radius-sm); } .detail-body::-webkit-scrollbar-thumb:hover { background: var(--text-muted); } /* When Activity → Raw Logs is active, switch to flex layout so the log section can stretch to fill the remaining space above the action bar. The detail-body itself should NOT scroll; the agent-log-viewer scrolls instead. */ .detail-body--agent-log { display: flex; flex-direction: column; overflow-y: hidden; } /* FNXC:TaskDetailPadding 2026-07-01-12:00: Task-detail tabs share the `.detail-body` outer content inset so switching Activity, planner Chat, Plan, or standard sections does not shift the shell padding. Chat-like tabs may only change flex and internal-scroll ownership here; transcript/composer spacing stays inside their own surfaces. FNXC:TaskDetailLayout 2026-08-01-00:58: FN-8634 moves shell padding into `.detail-body-content` to leave the scrollbar outside the content inset. When a tab delegates scrolling to an inner surface, that wrapper must preserve the previous direct-child flex contract so the transcript and agent log still fill the modal. */ .detail-body--chat, .detail-body--planner-chat { display: flex; flex-direction: column; min-height: 0; overflow-y: hidden; } .detail-body--agent-log > .detail-body-content, .detail-body--chat > .detail-body-content, .detail-body--planner-chat > .detail-body-content { display: flex; flex: 1; flex-direction: column; min-height: 0; } .detail-title { font-size: 18px; font-weight: 600; margin-bottom: var(--space-md); overflow-wrap: anywhere; word-break: break-word; } .detail-title--collapsed { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2; overflow: hidden; } /* FNXC:TaskDetail 2026-06-22-20:00: Summarize-as-title is an in-field affordance, not a separate full-width row: it sits inline with the title, pinned to the far right and bottom of the title area. Use a nowrap flex row where the title flexes to fill and the button is pushed right (margin-left:auto) and bottom-aligned (align-self:flex-end). The button shrinks to its content so it never steals title space. */ .detail-heading-row { display: flex; align-items: flex-end; flex-wrap: nowrap; gap: var(--space-sm); margin-bottom: var(--space-md); } .detail-heading-row .detail-title { margin-bottom: 0; flex: 1 1 auto; min-width: 0; } .detail-summarize-title-btn { display: inline-flex; align-items: center; gap: var(--space-xs); background: none; border: none; color: var(--text-dim); font-size: 0.8125rem; padding: 0; cursor: pointer; text-align: right; margin-left: auto; align-self: flex-end; flex: 0 0 auto; white-space: nowrap; } .detail-summarize-title-btn:hover:not(:disabled) { color: var(--text); } .detail-summarize-title-btn:focus-visible { outline: none; box-shadow: var(--focus-ring-strong); } .detail-summarize-title-btn:disabled { opacity: 0.5; cursor: not-allowed; } .detail-description-toggle { display: block; background: none; border: none; color: var(--text-dim); font-size: 13px; padding: 2px 0; margin-bottom: var(--space-md); cursor: pointer; text-align: left; } .detail-description-toggle:hover { color: var(--text); } /* FNXC:TaskDetailMeta 2026-06-13-17:32: The task-detail modal metadata must keep priority, execution mode, provenance, PR context, and timestamps in one horizontal row that wraps as needed instead of stacking each child as a separate line. */ .detail-meta { display: flex; align-items: center; flex-wrap: wrap; gap: var(--space-sm) var(--space-md); font-size: 12px; color: var(--text-muted); margin-bottom: var(--space-lg); } .detail-provenance { display: flex; align-items: center; gap: var(--space-xs); margin-top: 0; margin-bottom: 0; color: var(--text-muted); } .detail-provenance svg { width: 1em; height: 1em; } .detail-provenance-link { padding: 0; border: 0; background: transparent; color: var(--todo); cursor: pointer; text-decoration: none; font: inherit; } .detail-provenance-link:hover { text-decoration: underline; } .detail-provenance-link:focus-visible { outline: none; box-shadow: var(--focus-ring-strong); border-radius: var(--radius-sm); } .detail-provenance-context { display: inline-block; max-width: 32ch; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: bottom; } .detail-timestamps { display: inline-flex; align-items: center; flex-wrap: nowrap; gap: var(--space-xs); color: var(--text-dim); margin-top: 0; } .detail-timestamp-item { display: inline-flex; align-items: baseline; gap: var(--space-xs); } .detail-timestamp-label { color: var(--text-muted); } .detail-timestamp-separator { color: var(--text-dim); } @media (max-width: 768px) { /* FNXC:TaskDetail 2026-06-22-20:00: Keep summarize-as-title pinned bottom-right inline with the title on mobile too (no wrap to a separate row), matching the desktop in-field affordance. */ .detail-heading-row { align-items: flex-end; } .detail-summarize-title-btn { flex-shrink: 0; } .detail-meta { align-items: center; gap: var(--space-sm); } /* FNXC:PlannerOversight 2026-07-04-17:00: FN-7517: the oversight-controls cluster (priority + execution-mode + the Oversight trigger) must wrap without overflowing the mobile modal width rather than forcing horizontal scroll. FNXC:PlannerOversight 2026-07-05-00:00: FN-7604: the level-select/nudge/stop/explain controls collapse behind the single `.detail-oversight-menu-trigger` button at EVERY viewport now (no longer a mobile-only branch), so the cluster only ever needs to fit priority + execution-mode + the trigger on one row; `flex-wrap: wrap` remains as a safety fallback so the cluster never forces horizontal scroll if it still overflows at very narrow widths. The `.detail-oversight-menu` positioning (`right: 0`) is already declared once on the base rule above and applies at every width, so no mobile-only override is needed here. */ .detail-meta-inline-controls { /* FNXC:QuickAddActionRow 2026-07-20-12:00: FN-8421 keeps the Task Detail action row at the mobile touch floor while the default compact Quick Add alias serves desktop and tablet widths. */ --detail-priority-control-min-height: var(--quick-entry-action-row-height-mobile); flex-wrap: wrap; } .detail-provenance { align-items: center; } /* FNXC:TaskDetailWorkflow 2026-06-30-07:37: Task details show workflow identity in the Updated timestamp section across desktop and mobile. Keep the canonical badge inline with Created/Updated metadata so header rows, embedded detail hosts, and mobile back-header details do not render duplicate workflow badges or empty mobile-only shells. */ .detail-timestamps { display: flex; align-items: center; flex-wrap: nowrap; } .detail-provenance-context { max-width: 20ch; } .detail-timestamp-item { align-items: baseline; flex-wrap: nowrap; } } .detail-meta-inline-controls { /* FNXC:TaskDetail 2026-06-22-20:00: Priority chip and speed (execution-mode) toggle share one min-height token so they render at identical, equal height. Reduced from the old calc(space-2xl + space-xs) (~too tall) to a compact 30px that stays legible and tappable. Both controls also get trimmed vertical padding to match. FNXC:TaskDetail 2026-07-05-00:00: FN-7585 — Priority, Execution-mode, and Oversight (both the desktop chip and the mobile overflow-trigger variant) previously diverged: Priority inherited `.card-priority-badge`'s pill radius with a *transparent* border (so the common `normal` level rendered as borderless text), while Execution-mode and the Oversight mobile trigger are `.btn.btn-sm` pills with `--radius-md` and a visible `--border` color. Add one shared `--detail-control-border-radius` token here so all four controls resolve the same border-radius from a single source; each control below also pins the same `--btn-border-width` width and `--border` color so the cluster reads as one uniform control group. Only the border/radius/size are unified — per-level tint backgrounds (priority low/high/urgent, oversight observe/steer/autonomous/off, execution-mode fast) are untouched. */ /* FNXC:QuickAddActionRow 2026-07-20-12:00: FN-8421 completes FN-8287's shared-square contract. Desktop and tablet must alias Quick Add's compact control token, not make every action equally tall with the former space-calc box; the mobile rule above raises the same alias to the touch-floor token. */ --detail-priority-control-min-height: var(--quick-entry-action-row-height-desktop); --detail-control-border-radius: var(--radius-md); display: flex; align-items: stretch; flex-wrap: nowrap; gap: var(--space-xs); } /* FNXC:TaskDetail 2026-07-17-17:30: FN-8287 extends the FN-7585/FN-7633 height-pinned pattern into one square-box rule for every inline action: the FN-8194/FN-8209 attach, GitHub, and priority icons now share the oversight and execution-mode controls' tokenized height, width, border, and radius. Pinning both dimensions prevents theme-specific space or icon tokens from making this cluster visually uneven. */ .detail-inline-attach, .detail-inline-github-toggle, .detail-priority-trigger, .detail-oversight-menu-trigger, .detail-execution-mode-toggle { height: var(--detail-priority-control-min-height); min-height: var(--detail-priority-control-min-height); width: var(--detail-priority-control-min-height); min-width: var(--detail-priority-control-min-height); box-sizing: border-box; border-width: var(--btn-border-width); border-color: var(--border); border-radius: var(--detail-control-border-radius); } /* FNXC:TaskDetailModalResponsive 2026-07-19-12:00: FN-8396 requires every inline action icon to resolve to `--icon-size-sm` at all desktop, tablet, and mobile widths. The global `.btn-icon > svg` rule cannot reach ProviderIcon's wrapped SVG, so keep this descendant rule scoped to Task Detail instead of changing global button behavior or adding an explicit size prop to the Oversight Eye/EyeOff icons. */ .detail-meta-inline-controls svg { width: var(--icon-size-sm); height: var(--icon-size-sm); flex-shrink: 0; } /* FNXC:QuickAddActionRow 2026-07-17-12:00: FN-8209: Task Detail uses the same compact icon-only priority affordance as Quick Add. Keep the picker anchored to its trigger so it remains usable when the metadata row wraps at mobile widths. */ .detail-priority-picker { position: relative; display: inline-flex; align-items: stretch; } .detail-priority-picker-dropdown { position: absolute; top: calc(100% + var(--space-xs)); right: 0; z-index: 50; display: flex; flex-direction: column; min-width: calc(var(--space-2xl) + var(--space-2xl) + var(--space-md)); background: var(--surface); border: var(--btn-border-width) solid var(--border); border-radius: var(--radius-md); box-shadow: var(--shadow-md); overflow: hidden; } .detail-priority-picker-heading, .detail-priority-picker-option { display: flex; align-items: center; gap: var(--space-xs); padding: var(--space-sm); } .detail-priority-picker-heading { color: var(--text-muted); font-size: var(--font-size-xs); } .detail-priority-picker-option { width: 100%; border: 0; background: transparent; color: var(--text); cursor: pointer; font: inherit; text-align: left; } .detail-priority-picker-option:hover, .detail-priority-picker-option.selected { background: color-mix(in srgb, var(--accent) 14%, transparent); } .detail-priority-picker-option:focus-visible { outline: none; box-shadow: var(--focus-ring-strong); } /* FNXC:TaskDetail 2026-07-17-00:00: FN-8243 — restore the tokenized `.detail-priority-select:focus-visible` rule required by css-hygiene-scan.test.ts's focus-coverage allow-list. The base `.detail-priority-select` styling was dropped during the FN-8209 Priority select→picker migration, but the hygiene allow-list still expects this focus-visible selector. Use `--focus-ring-strong` to match the sibling `.detail-oversight-select` / `.detail-priority-picker-option` focus rules; no raw colors so the tokenized-focus assertion stays green. */ .detail-priority-select:focus-visible { outline: none; box-shadow: var(--focus-ring-strong); border-radius: var(--radius-sm); } .detail-priority-picker-option:disabled { cursor: wait; } .detail-execution-mode-toggle { display: inline-flex; align-items: center; gap: var(--space-xs); } .detail-execution-mode-toggle--fast { color: var(--color-warning); } .detail-execution-mode-toggle--saving { opacity: 0.75; } .detail-execution-mode-toggle:disabled { cursor: wait; } /* FNXC:PlannerOversight 2026-07-04-17:00: FN-7517 task-detail planner-overseer controls (quick level-change select, manual nudge / stop / explain buttons, explain panel). Reuses the same `.card-oversight-badge--*` status-color modifiers FN-7516's TaskCard badge already declares (see TaskCard.css) so oversight-level color stays a single semantic source. FNXC:PlannerOversight 2026-07-05-00:00: FN-7604 — the desktop-only `.detail-oversight-chip` wrapper (the inline quick-level-change chip rendered outside the overflow menu) was removed along with the desktop inline branch it styled; the level select now renders only inside `.detail-oversight-menu-item--select` (see below). `.detail-oversight-select` itself stays — the dropdown menu item reuses this class for the native `