/* === 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: 30px; --detail-control-border-radius: var(--radius-md); display: flex; align-items: stretch; flex-wrap: nowrap; gap: var(--space-xs); } .detail-priority-chip { gap: var(--space-xs); min-height: var(--detail-priority-control-min-height); padding-block: var(--space-xs); box-sizing: border-box; /* FNXC:TaskDetail 2026-07-05-00:00: FN-7585 — override `.card-priority-badge`'s transparent border with a real, visible border so the `normal` level (no `--low/--high/--urgent` tint) still renders as a bordered box instead of borderless text, matching the Execution-mode toggle and Oversight chip/trigger. */ border-width: var(--btn-border-width); border-color: var(--border); border-radius: var(--detail-control-border-radius); } .detail-priority-chip--saving { opacity: 0.75; } /* FNXC:TaskDetail 2026-07-05-12:00: FN-7597 — the untinted `normal` priority level has no `--low/--high/--urgent` tint, so without this rule it renders as a bordered-but-empty shell while the Oversight chip's `--off` level always gets a neutral, token-based background (`.card-oversight-badge--off` in TaskCard.css). Give `.detail-priority-chip`'s `normal` state the SAME neutral `color-mix(... var(--text-muted) ...)` treatment so the two dropdowns read as one consistent control style. Scoped to the detail chip (not a global `.card-priority-badge--normal` rule) so the read-only TaskCard priority badge (out of scope) is untouched. */ .detail-priority-chip.card-priority-badge--normal { background: color-mix(in srgb, var(--text-muted) 12%, transparent); color: var(--text-muted); } /* FNXC:TaskDetail 2026-07-05-13:30: FN-7601 — the FN-7585 base `.detail-priority-chip` rule pins `border-color: var(--border)` for every level, so once the chip shrank to a compact 30px box the only remaining differentiator (the ~15-18% tint backgrounds inherited from `.card-priority-badge--{low,high,urgent}`) reads as the same washed-out box for low vs high. Give each non-neutral level its own tinted border AND a stronger background on top of the shared base/normal rules above (higher specificity via the `.detail-priority-chip.card-priority-badge--X` compound selector) so low/high/urgent are unmistakably distinct colors at a glance, while normal keeps the FN-7597 neutral treatment and the FN-7585 shared border-width/radius/min-height stay untouched. Scoped to `.detail-priority-chip` so the read-only `.card-priority-badge--{low,high,urgent}` tints in TaskCard.css (out of scope) are unaffected. */ .detail-priority-chip.card-priority-badge--low { background: color-mix(in srgb, var(--color-info) 22%, transparent); border-color: color-mix(in srgb, var(--color-info) 65%, var(--border)); color: var(--color-info); } .detail-priority-chip.card-priority-badge--high { background: color-mix(in srgb, var(--color-warning) 28%, transparent); border-color: color-mix(in srgb, var(--color-warning) 65%, var(--border)); color: var(--color-warning); } .detail-priority-chip.card-priority-badge--urgent { background: color-mix(in srgb, var(--color-error) 30%, transparent); border-color: color-mix(in srgb, var(--color-error) 65%, var(--border)); color: var(--color-error-dark); } .detail-priority-select { border: 0; background: transparent; color: inherit; font: inherit; cursor: pointer; padding: 0; min-height: inherit; } .detail-priority-select:focus-visible { outline: none; box-shadow: var(--focus-ring-strong); border-radius: var(--radius-sm); } .detail-priority-select:disabled { cursor: wait; } /* FNXC:TaskDetail 2026-07-05-12:00: FN-7597 — drop the Priority-only forced uppercase on the select/option so its typography matches `.detail-oversight-select` exactly (which relies on the ancestor `.card-*-badge` label's own `text-transform: uppercase` instead of redeclaring it here). Visual case is unchanged since the label already uppercases its content; this only removes a duplicated, drift-prone override. */ .detail-priority-select option { color: var(--text); background: var(--surface); } .detail-execution-mode-toggle { display: inline-flex; align-items: center; gap: var(--space-xs); min-height: var(--detail-priority-control-min-height); padding-block: var(--space-xs); box-sizing: border-box; /* FNXC:TaskDetail 2026-07-05-00:00: FN-7585 — pin the same shared border/radius token set as the Priority and Oversight controls even though `.btn` already applies a border, so a future change to `.btn`'s defaults cannot silently desync this cluster. */ border-width: var(--btn-border-width); border-color: var(--border); border-radius: var(--detail-control-border-radius); } .detail-execution-mode-toggle svg { width: 1em; height: 1em; } .detail-execution-mode-toggle--fast { color: var(--color-warning); } .detail-execution-mode-toggle--fast svg { color: var(--color-warning); background: color-mix(in srgb, var(--color-warning) 20%, transparent); border-radius: var(--radius-pill); padding: var(--space-xs); box-shadow: var(--glow-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 `