From 915d4b028ac48ddaa2f7a081e23cbc3ef12fcba2 Mon Sep 17 00:00:00 2001 From: gsxdsm Date: Mon, 22 Jun 2026 12:16:07 -0700 Subject: [PATCH] fix(dashboard): unify movable task detail header --- packages/dashboard/app/App.tsx | 14 ++--- .../app/components/DocumentsView.tsx | 21 +++++++- .../app/components/FloatingWindow.css | 23 ++++++++ .../app/components/FloatingWindow.tsx | 53 +++++++++++++------ .../dashboard/app/components/GoalsView.css | 5 ++ .../dashboard/app/components/ListView.tsx | 19 ------- .../app/components/TaskDetailModal.tsx | 14 +++++ .../dashboard/app/components/ViewHeader.css | 44 +++++++++++++++ .../__tests__/DocumentsView.test.tsx | 12 ++++- .../__tests__/FloatingWindow.test.tsx | 24 +++++++++ .../TaskDetailModal.rendering.test.tsx | 21 ++++++++ packages/dashboard/app/styles.css | 5 ++ 12 files changed, 209 insertions(+), 46 deletions(-) diff --git a/packages/dashboard/app/App.tsx b/packages/dashboard/app/App.tsx index 2c3d8a35ca..7516c44066 100644 --- a/packages/dashboard/app/App.tsx +++ b/packages/dashboard/app/App.tsx @@ -13,7 +13,6 @@ import { Header, useViewportMode } from "./components/Header"; import { Board } from "./components/Board"; import { TaskCard } from "./components/TaskCard"; import { ListView } from "./components/ListView"; -import { Maximize2 } from "lucide-react"; import { TaskDetailContent } from "./components/TaskDetailModal"; import { FloatingWindow } from "./components/FloatingWindow"; import { ProjectOverview } from "./components/ProjectOverview"; @@ -1755,6 +1754,7 @@ function AppInner() { projectId={currentProject?.id} addToast={addToast} onOpenDetail={openDetailTask} + onOpenArtifactTaskDetail={popOutTaskDetail} onSendSelectionToTask={modalManager.openNewTaskWithDescription} /> @@ -2516,6 +2516,9 @@ function AppInner() { {/* FNXC:FloatingWindow 2026-06-22-20:45: One movable, resizable, non-blocking FloatingWindow per popped-out task. Each hosts the same embedded TaskDetailContent List/Board use, wired to the same App task handlers. Live row preferred by id; falls back to the snapshot. Terminal/destructive actions and the window close button both remove the entry. Multiple entries → multiple coexisting windows; FloatingWindow's per-window z-counter handles focus-to-front so the clicked one comes on top. + + FNXC:TaskDetail 2026-06-22-12:20: + Task pop-outs use TaskDetailContent's own gray header as the only visible header, matching the one-header fixed task modal while keeping FloatingWindow drag/resize. The generic Maximize title chrome is hidden; close now lives beside edit inside the task header. */} {poppedOutTasks.map((snapshot) => { const liveTask = tasks.find((candidate) => candidate.id === snapshot.id) ?? snapshot; @@ -2524,13 +2527,10 @@ function AppInner() { -