/* === Detail Modal === */ .task-detail-content { display: flex; flex-direction: column; height: 100%; min-width: 0; min-height: 0; } .modal.task-detail-modal { width: min(95vw, 800px); max-width: 95vw; min-width: 480px; height: 85vh; min-height: 480px; max-height: calc(100dvh - var(--overlay-padding-top, 10vh) - 16px); overflow: hidden; resize: both; } /* 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); } .detail-body { padding: calc(var(--space-lg) + var(--space-xs)); min-width: 0; overflow-x: hidden; overflow-y: auto; scrollbar-color: var(--border) transparent; scrollbar-width: thin; flex: 1; } .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. */ .detail-body--chat, .detail-body--planner-chat { display: flex; flex-direction: column; min-height: 0; overflow-y: hidden; } .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 { 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. */ --detail-priority-control-min-height: calc(var(--space-lg) + var(--space-lg) + var(--space-xs)); --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: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); padding-block: 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 `