fix(dashboard): collapse empty Planning footer; Planning header matches Mission (icon/gap/title/divider)

- .planning-view-footer:empty -> display:none (no reserved space / divider band when empty); legitimate composer + start-planning footers untouched.
- Planning embedded header icon -> var(--todo), title-row gap -> space-sm, h3 -> 1.125rem/600/var(--text), border-bottom divider -> matches mission-manager__header exactly. Mission already had a single divider (no doubled line); documented the invariant.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
gsxdsm
2026-06-22 11:14:23 -07:00
parent a9b0e6c0d1
commit b4e4013869
3 changed files with 37 additions and 3 deletions

View File

@@ -54,6 +54,10 @@
}
/* ── Header ── */
/*
FNXC:MissionManager 2026-06-23-03:00:
Exactly ONE divider sits under the Missions header — this header's own border-bottom. The scroll body, split, sidebar, and detail-pane add NO border-top, so there is no doubled/extra divider line below the header (verified in DOM: only this element carries a horizontal border in the header region). Planning's embedded header is matched to this single-divider treatment. Do not add a second border-top to the body/split/sidebar.
*/
.mission-manager__header {
flex-shrink: 0;
display: flex;

View File

@@ -94,17 +94,33 @@ Embedded planning must blend into the main content like Command Center: no panel
}
/*
FNXC:Planning 2026-06-23-02:00:
The embedded planning header now matches MissionManager's inline header (mission-manager__header--inline) EXACTLY: var(--surface) background, padding var(--space-lg) var(--space-xl), no bottom divider, and the shared 1.125rem title metric. This aligns the top header and the spacing between header and the two-pane body with Missions (previously the header used 0 0 var(--space-md) padding + a transparent fill, which read inconsistently next to Missions).
FNXC:Planning 2026-06-23-03:00:
The embedded planning header must be a visual SIBLING of MissionManager's inline header (mission-manager__header--inline). Matched values, copied exactly from MissionManager.css:
- background: var(--surface), padding: var(--space-lg) var(--space-xl) (= 16px 24px)
- a single bottom divider border-bottom: 1px solid var(--border) — Missions renders exactly ONE divider under its header (verified: only .mission-manager__header carries it; the split/sidebar add none), so Planning matches that single clean line. Previously Planning had NO divider, which read inconsistently next to Missions.
- title: 1.125rem / 600 / var(--text) via the h3 rule below (font-weight/color come from the base .modal-header h3).
- icon: var(--todo) tint + flex-shrink:0, identical to .mission-manager__header-icon (the shared icon-triage tint was a different brown, so it is overridden here).
- gap icon<->title: var(--space-sm) (= 8px), identical to .mission-manager__header-title. Scoped to the embedded planning header so the shared .detail-title-row (TaskDetailModal) keeps its own 10px gap.
*/
.planning-modal--embedded .modal-header--embedded {
padding: var(--space-lg) var(--space-xl);
background: var(--surface);
border-bottom: none;
border-bottom: 1px solid var(--border);
}
.planning-modal--embedded .modal-header--embedded .detail-title-row {
gap: var(--space-sm);
}
.planning-modal--embedded .modal-header--embedded .detail-title-row > svg {
color: var(--todo);
flex-shrink: 0;
}
.planning-modal--embedded .modal-header--embedded h3 {
font-size: 1.125rem;
font-weight: 600;
color: var(--text);
letter-spacing: normal;
}
@@ -508,6 +524,16 @@ The New session button must look EXACTLY like Missions' primary sidebar create b
flex-shrink: 0;
}
/*
FNXC:Planning 2026-06-23-03:00:
An empty footer must NOT reserve vertical space or paint its divider band. When .planning-view-footer renders with no children (e.g. the initial / no-active-session state once its action is absent), collapse it to zero so the embedded Planning view shows no dead footer band. Footers WITH content (the Start-Planning button in initial, and the .planning-actions composer in an active session) are untouched — :empty only matches when there are no element/text children.
*/
.planning-view-footer:empty {
display: none;
padding: 0;
border-top: none;
}
.planning-advanced-disclosure {
width: 100%;
max-width: 520px;

View File

@@ -1926,6 +1926,10 @@ export function PlanningModeModal({ isOpen, onClose, onTaskCreated, onTasksCreat
<ChevronLeft size={18} />
</button>
)}
{/*
FNXC:Planning 2026-06-23-03:00:
Header icon mirrors MissionManager's <Target size={20} className="mission-manager__header-icon" />: same size (20) and same var(--todo) tint + flex-shrink:0, applied via the scoped .planning-modal--embedded .modal-header--embedded .detail-title-row > svg rule (it overrides the shared icon-triage brown so the two headers read as siblings).
*/}
<Lightbulb size={20} className="icon-triage" />
<h3>{t("planning.title", "Planning Mode")}</h3>
</div>