diff --git a/.changeset/fn-9124-mission-cta-top.md b/.changeset/fn-9124-mission-cta-top.md new file mode 100644 index 0000000000..28ddcde263 --- /dev/null +++ b/.changeset/fn-9124-mission-cta-top.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": patch +--- + +summary: Plan New Mission now sits at the top of the mission list and is slightly taller. +category: fix +dev: Replaced footer CTA wrappers with top mission-manager__sidebar-cta-bar and mission-list__header-actions containers using calc(var(--space-lg) * 2 + var(--space-sm)); removed the duplicate empty-state CTA. diff --git a/docs/missions.md b/docs/missions.md index 14dffee1a5..b02c1d48af 100644 --- a/docs/missions.md +++ b/docs/missions.md @@ -144,7 +144,7 @@ This keeps member execution isolated per task while still routing member landing Use the Mission Manager UI to create missions and build hierarchy interactively. -On mobile, Mission Manager surfaces the primary **Plan New Mission** CTA at the top of the mission list for faster access, while desktop keeps the split-layout sidebar CTA anchored in the bottom action region as the primary entry point. +Mission Manager anchors the primary **Plan New Mission** CTA at the top of the mission list on both mobile stacked and desktop split layouts. The secondary **Create** manual-create link sits beneath it, and both primary controls use the same slightly taller tokenized height. While the inline create form is open, the CTA is suppressed cleanly without leaving an empty container; each surface retains only one primary planning control. Mission detail refreshes now preserve expanded milestone/slice state and keep the selected milestone expanded, so persisted milestone acceptance criteria remain visible across live updates. diff --git a/packages/dashboard/app/components/MissionManager.css b/packages/dashboard/app/components/MissionManager.css index a9ec6e4cce..c94f0bb69e 100644 --- a/packages/dashboard/app/components/MissionManager.css +++ b/packages/dashboard/app/components/MissionManager.css @@ -225,19 +225,23 @@ Title metric matches the shared ViewHeader (1.125rem) so the Missions header rea box-shadow: var(--focus-ring-strong); } -/* Desktop split-only sidebar footer action bar for mission creation CTA. */ -.mission-manager__sidebar-footer { +/* +FNXC:MissionsUI 2026-08-16-14:48: +The desktop CTA bar stays above the scrolling mission list so planning is immediately reachable. +*/ +.mission-manager__sidebar-cta-bar { display: flex; + flex-direction: column; align-items: center; justify-content: center; gap: var(--space-sm); padding: var(--space-md); - border-top: var(--btn-border-width) solid var(--border); + border-bottom: var(--btn-border-width) solid var(--border); } .mission-manager__sidebar-cta { width: 100%; - min-height: calc(var(--space-lg) * 2 + var(--space-xs)); + min-height: calc(var(--space-lg) * 2 + var(--space-sm)); justify-content: center; gap: var(--space-sm); font-size: inherit; @@ -388,11 +392,6 @@ primary CTA while every production presentation can open the merge-aware form. color: var(--text-muted); } -.mission-manager__empty-cta { - margin-top: var(--space-sm); - gap: var(--space-sm); -} - /* ── Status Badge ── */ .mission-status-badge { display: inline-flex; @@ -556,11 +555,12 @@ primary CTA while every production presentation can open the merge-aware form. } /* -FNXC:MissionsMobile 2026-06-22-18:00: -Narrow/mobile Missions puts Plan New Mission at the bottom of the list, using the same compact primary button proportions as Chat's New Chat action instead of a large top CTA. +FNXC:MissionsUI 2026-08-16-14:48: +Mobile Missions keeps Plan New Mission above the list for immediate reachability. The shared tokenized height matches the desktop sidebar CTA while preserving the compact button treatment. */ .mission-list__primary-cta { width: 100%; + min-height: calc(var(--space-lg) * 2 + var(--space-sm)); justify-content: center; gap: var(--space-sm); } @@ -580,12 +580,6 @@ Narrow/mobile Missions puts Plan New Mission at the bottom of the list, using th font-weight: 600; } -.mission-list__footer { - display: flex; - flex-direction: column; - gap: var(--space-sm); -} - .mission-list__resume-actions { display: flex; flex-wrap: wrap; @@ -594,20 +588,20 @@ Narrow/mobile Missions puts Plan New Mission at the bottom of the list, using th margin-inline-start: auto; } -.mission-list__footer-actions { +.mission-list__header-actions { display: flex; + flex-direction: column; gap: var(--space-sm); } -/* Desktop split-only: list footer actions live in sidebar header, so hide duplicated footer buttons. */ -.mission-manager__sidebar .mission-list__footer-actions { +/* +FNXC:MissionsUI 2026-08-16-14:48: +Desktop owns the CTA in its sidebar bar, so the shared list header cannot duplicate it. +*/ +.mission-manager__sidebar .mission-list__header-actions { display: none; } -.mission-list__footer-actions .mission-list__manual-create-link { - align-self: center; -} - /* ── Inline Form Card ── */ .mission-form-card { display: flex; diff --git a/packages/dashboard/app/components/MissionManager.tsx b/packages/dashboard/app/components/MissionManager.tsx index 901c236e7a..f4a7f68da0 100644 --- a/packages/dashboard/app/components/MissionManager.tsx +++ b/packages/dashboard/app/components/MissionManager.tsx @@ -5293,14 +5293,30 @@ export function MissionManager({ isOpen, isInline = false, onClose, addToast, pr ); }); - const renderMissionListContent = ({ hideBottomButtons = false }: { hideBottomButtons?: boolean } = {}) => { + const renderMissionListContent = ({ hideListCta = false }: { hideListCta?: boolean } = {}) => { const persistedInterviewMissions = missions.filter((mission) => mission.interviewState === "in_progress"); const standardMissions = missions.filter((mission) => mission.interviewState !== "in_progress"); - const showBottomPlanButton = !hideBottomButtons; + const showListCta = !hideListCta; return (