diff --git a/packages/dashboard/app/components/PlanningModeModal.css b/packages/dashboard/app/components/PlanningModeModal.css index a30e28049d..dafef36be6 100644 --- a/packages/dashboard/app/components/PlanningModeModal.css +++ b/packages/dashboard/app/components/PlanningModeModal.css @@ -1664,8 +1664,11 @@ its refinement menu remain reachable at the bottom of bounded desktop and mobile /* FNXC:PlanningMode 2026-07-21-09:15: Desktop Planning panes already own their framed surfaces, so their scroll content must sit flush and their action rows must share a compact baseline. Scope these overrides to Planning's pane wrappers and desktop breakpoint so shared Mission/Milestone interview classes and compact safe-area padding retain their existing presentation. + +FNXC:PlanningMode 2026-07-21-18:41: +Tablet (769–1024) keeps the same two-pane shell as desktop but previously fell below the 1025px flush gate, so the right plan pane still stacked scroll padding + card chrome. Lower the gate to 769px so tablet inherits the flush pane treatment; phone (≤768) keeps its own mobile flush block. */ -@media (min-width: 1025px) { +@media (min-width: 769px) { .planning-question-pane .planning-question-scroll, .planning-plan-pane .planning-plan-scroll { padding: 0; @@ -2213,14 +2216,13 @@ mobile and desktop offer the same View task / Return to sessions choices. } /* - FNXC:PlanningMode 2026-07-21-16:47: - Mobile keeps a compact card inset and rounded panes because only one pane is visible at a time; - clear the desktop column divider so a solo question/plan card is not edged by a right border. + FNXC:PlanningMode 2026-07-21-18:34: + Mobile question and plan-review panes were double-inset: workspace gutter + scroll padding + nested card chrome on top of the pane frame. Drop the outer gutter and pane chrome so content sits flush edge-to-edge like desktop, keep a light tab strip inset, and leave readable content padding on the question panel / plan document only. Clear the desktop column divider so a solo question/plan card is not edged by a right border. */ .planning-workspace { grid-template-columns: minmax(0, 1fr); - gap: var(--space-md); - padding: var(--space-md); + gap: 0; + padding: 0; } .planning-question-pane { @@ -2240,6 +2242,7 @@ mobile and desktop offer the same View task / Return to sessions choices. display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-xs); + margin: var(--space-sm) var(--space-sm) 0; padding: var(--space-xs); border: solid var(--btn-border-width) var(--border); border-radius: var(--radius-lg); @@ -2287,9 +2290,33 @@ mobile and desktop offer the same View task / Return to sessions choices. .planning-plan-pane, .planning-question-pane { - border: solid var(--btn-border-width) color-mix(in srgb, var(--border) 82%, transparent); - border-radius: var(--radius-lg); - box-shadow: var(--shadow-sm); + border: none; + border-radius: 0; + box-shadow: none; + } + + /* + FNXC:PlanningMode 2026-07-21-18:34: + Scope flush scroll overrides to Planning's pane wrappers so shared Mission/Milestone interview + classes keep their existing mobile view-scroll padding. + */ + .planning-question-pane .planning-question-scroll, + .planning-plan-pane .planning-plan-scroll { + padding: 0; + } + + .planning-question-pane .planning-question-panel { + background: var(--surface); + border: none; + border-radius: 0; + padding: var(--space-md) var(--space-lg) var(--space-lg); + } + + .planning-plan-pane .planning-plan-document { + width: 100%; + padding: var(--space-lg); + border-radius: 0; + box-shadow: none; } /* FNXC:PlanningMode 2026-06-22-15:30: this legacy full-viewport sheet sizing diff --git a/packages/dashboard/app/components/__tests__/PlanningModeModal.css.test.ts b/packages/dashboard/app/components/__tests__/PlanningModeModal.css.test.ts index 67ae999ebe..8d5d99bd0b 100644 --- a/packages/dashboard/app/components/__tests__/PlanningModeModal.css.test.ts +++ b/packages/dashboard/app/components/__tests__/PlanningModeModal.css.test.ts @@ -7,7 +7,8 @@ const PLANNING_CSS_PATH = resolve(__dirname, "..", "PlanningModeModal.css"); const TABLET_SUMMARY_ACTIONS_QUERY = "@media (min-width: 769px) and (max-width: 1024px)"; const MOBILE_ACTIONS_QUERY = "@media (max-width: 768px)"; const MOBILE_PLANNING_SHELL_QUERY = "@media (max-width: 768px), (max-height: 480px)"; -const DESKTOP_PLANNING_WORKSPACE_QUERY = "@media (min-width: 1025px)"; +/* FNXC:PlanningMode 2026-07-21-18:41: flush pane rules cover tablet + desktop (two-pane shell). */ +const DESKTOP_PLANNING_WORKSPACE_QUERY = "@media (min-width: 769px)"; function loadPlanningCss(): string { return readFileSync(PLANNING_CSS_PATH, "utf-8"); @@ -86,25 +87,31 @@ describe("PlanningModeModal CSS responsive action contract", () => { expect(findRule(mobileCss, ".planning-workspace--mobile-tab-question,\n .planning-workspace--mobile-tab-plan")).toMatch(/"tabs"\s*"content"/); expect(findRule(mobileCss, ".planning-workspace-tabs")).toMatch(/display\s*:\s*grid\s*;/); expect(findRule(mobileCss, ".planning-workspace--mobile-tab-question .planning-plan-pane,\n .planning-workspace--mobile-tab-plan .planning-question-pane")).toMatch(/display\s*:\s*none\s*;/); - // Mobile restores a compact card inset because only one pane is visible at a time. - expect(findRule(mobileCss, ".planning-workspace")).toMatch(/padding\s*:\s*var\(--space-md\)\s*;/); + // FNXC:PlanningMode 2026-07-21-18:34: mobile question/plan review sit flush — no outer workspace gutter or nested pane chrome. + expect(findRule(mobileCss, ".planning-workspace")).toMatch(/padding\s*:\s*0\s*;/); + expect(findRule(mobileCss, ".planning-workspace")).toMatch(/gap\s*:\s*0\s*;/); expect(findRule(mobileCss, ".planning-question-pane")).toMatch(/border-right\s*:\s*none\s*;/); + expect(findRule(mobileCss, ".planning-plan-pane,\n .planning-question-pane")).toMatch(/border\s*:\s*none\s*;/); + expect(findRule(mobileCss, ".planning-plan-pane,\n .planning-question-pane")).toMatch(/border-radius\s*:\s*0\s*;/); + expect(findRule(mobileCss, ".planning-question-pane .planning-question-scroll,\n .planning-plan-pane .planning-plan-scroll")).toMatch(/padding\s*:\s*0\s*;/); + expect(findRule(mobileCss, ".planning-question-pane .planning-question-panel")).toMatch(/border\s*:\s*none\s*;/); + expect(findRule(mobileCss, ".planning-plan-pane .planning-plan-document")).toMatch(/padding\s*:\s*var\(--space-lg\)\s*;/); }); - it("keeps desktop planning content flush inside both panes with compact aligned action rows", () => { + it("keeps tablet and desktop planning content flush inside both panes with compact aligned action rows", () => { const css = loadPlanningCss(); - const desktopCss = getMediaBlocks(css, DESKTOP_PLANNING_WORKSPACE_QUERY).join("\n"); - const flushScrollRule = findRule(desktopCss, ".planning-question-pane .planning-question-scroll,\n .planning-plan-pane .planning-plan-scroll"); - const desktopQuestionPanelRule = findRule(desktopCss, ".planning-question-pane .planning-question-panel"); - const desktopPlanDocumentRule = findRule(desktopCss, ".planning-plan-pane .planning-plan-document"); - const sharedActionsRule = findRule(desktopCss, ".planning-question-pane .planning-actions,\n .planning-plan-actions"); - const sharedButtonsRule = findRule(desktopCss, ".planning-question-pane .planning-actions .btn,\n .planning-plan-actions .btn"); + const twoPaneCss = getMediaBlocks(css, DESKTOP_PLANNING_WORKSPACE_QUERY).join("\n"); + const flushScrollRule = findRule(twoPaneCss, ".planning-question-pane .planning-question-scroll,\n .planning-plan-pane .planning-plan-scroll"); + const questionPanelRule = findRule(twoPaneCss, ".planning-question-pane .planning-question-panel"); + const planDocumentRule = findRule(twoPaneCss, ".planning-plan-pane .planning-plan-document"); + const sharedActionsRule = findRule(twoPaneCss, ".planning-question-pane .planning-actions,\n .planning-plan-actions"); + const sharedButtonsRule = findRule(twoPaneCss, ".planning-question-pane .planning-actions .btn,\n .planning-plan-actions .btn"); expect(flushScrollRule).toMatch(/padding\s*:\s*0\s*;/); - expect(desktopQuestionPanelRule).toMatch(/border\s*:\s*none\s*;/); - expect(desktopQuestionPanelRule).toMatch(/border-radius\s*:\s*0\s*;/); - expect(desktopPlanDocumentRule).toMatch(/width\s*:\s*100%\s*;/); - expect(desktopPlanDocumentRule).toMatch(/box-shadow\s*:\s*none\s*;/); + expect(questionPanelRule).toMatch(/border\s*:\s*none\s*;/); + expect(questionPanelRule).toMatch(/border-radius\s*:\s*0\s*;/); + expect(planDocumentRule).toMatch(/width\s*:\s*100%\s*;/); + expect(planDocumentRule).toMatch(/box-shadow\s*:\s*none\s*;/); expect(sharedActionsRule).toMatch(/padding\s*:\s*var\(--space-sm\) var\(--space-xl\)\s*;/); expect(sharedButtonsRule).toMatch(/min-height\s*:\s*calc\(var\(--space-2xl\) \+ var\(--space-sm\)\)\s*;/);