From dcd2f84e69aa465d47f648195554ed386ea96227 Mon Sep 17 00:00:00 2001 From: Renn F Date: Wed, 15 Jul 2026 18:04:00 +0200 Subject: [PATCH] =?UTF-8?q?feat(panel):=20dense=20tooltip=20pass=20?= =?UTF-8?q?=E2=80=94=20work=20surfaces=20(270=20tips)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task lifecycle actions get a 25-action tip map, every dialog field and git panel control annotated; fixes two round-1 disabled-button tips that could never fire and a double data-state stamp on tab-progress. --- panel/src/app/(dashboard)/prompter/page.tsx | 30 +- .../app/(dashboard)/tasks/[taskId]/page.tsx | 37 ++- panel/src/app/(dashboard)/tasks/page.tsx | 9 +- .../git/__tests__/code-snippet.test.tsx | 3 + panel/src/components/git/code-snippet.tsx | 19 +- .../src/components/git/git-actions-panel.tsx | 281 +++++++++++------- panel/src/components/git/git-branch-panel.tsx | 135 +++++---- panel/src/components/git/git-browser.tsx | 43 +-- panel/src/components/git/git-diff-viewer.tsx | 37 ++- panel/src/components/git/git-log-panel.tsx | 28 +- panel/src/components/git/git-status-panel.tsx | 20 +- .../components/kanban/core/kanban-board.tsx | 65 ++-- .../components/kanban/core/kanban-card.tsx | 20 +- .../components/kanban/core/kanban-column.tsx | 18 +- .../components/prompter/batch-review-card.tsx | 20 +- .../prompter/board-review-sent-card.tsx | 34 ++- .../src/components/prompter/chat-composer.tsx | 23 +- .../src/components/prompter/chat-messages.tsx | 7 +- .../prompter/draft-proposal-card.tsx | 42 +-- panel/src/components/prompter/intake-form.tsx | 34 ++- .../src/components/prompter/success-card.tsx | 42 +-- .../tasks/acceptance-criteria-editor.tsx | 70 +++-- .../tasks/approve-and-start-button.tsx | 55 ++-- .../components/tasks/create-task-dialog.tsx | 95 ++++-- .../components/tasks/dependency-selector.tsx | 116 +++++--- .../components/tasks/docs-status-badge.tsx | 72 +++-- .../src/components/tasks/edit-task-dialog.tsx | 65 ++-- .../src/components/tasks/git-status-badge.tsx | 10 +- .../src/components/tasks/markdown-editor.tsx | 24 +- panel/src/components/tasks/task-actions.tsx | 159 ++++++---- .../__tests__/tab-progress-collapse.test.tsx | 12 +- .../task-detail-readability.test.tsx | 8 +- .../tasks/task-detail/acceptance-criteria.tsx | 24 +- .../tasks/task-detail/checkpoint-card.tsx | 35 ++- .../tasks/task-detail/progress-timeline.tsx | 23 +- .../tasks/task-detail/subtasks-list.tsx | 40 +-- .../tasks/task-detail/tab-collision.tsx | 24 +- .../tasks/task-detail/tab-commits.tsx | 71 +++-- .../tasks/task-detail/tab-dependencies.tsx | 249 ++++++++++------ .../tasks/task-detail/tab-findings.tsx | 33 +- .../tasks/task-detail/tab-notes.tsx | 77 +++-- .../tasks/task-detail/tab-overview.tsx | 46 +-- .../components/tasks/task-detail/tab-plan.tsx | 226 ++++++++------ .../tasks/task-detail/tab-progress.tsx | 212 +++++++------ .../tasks/task-detail/task-action-dialogs.tsx | 186 ++++++++---- .../tasks/task-detail/task-breadcrumb.tsx | 19 +- .../tasks/task-detail/task-description.tsx | 4 +- .../tasks/task-detail/task-header.tsx | 129 +++++--- .../tasks/task-detail/task-metadata.tsx | 230 ++++++++------ .../tasks/task-detail/work-session-card.tsx | 90 +++--- panel/src/components/tasks/task-filters.tsx | 190 ++++++------ panel/src/components/tasks/task-selector.tsx | 10 +- panel/src/components/tasks/task-table.tsx | 280 ++++++++++------- .../src/components/tasks/task-type-badge.tsx | 37 ++- .../work-sessions/work-session-filters.tsx | 82 +++-- .../work-sessions/work-session-table.tsx | 150 ++++++---- 56 files changed, 2554 insertions(+), 1546 deletions(-) diff --git a/panel/src/app/(dashboard)/prompter/page.tsx b/panel/src/app/(dashboard)/prompter/page.tsx index 8f451c02..83abf9b2 100644 --- a/panel/src/app/(dashboard)/prompter/page.tsx +++ b/panel/src/app/(dashboard)/prompter/page.tsx @@ -3,6 +3,7 @@ import { useEffect, useRef } from "react"; import { Loader2, Sparkles, X } from "lucide-react"; import { Button } from "@/components/ui/button"; +import { HelpTip } from "@/components/ui/help-tip"; import { usePrompter } from "@/hooks/use-prompter"; import { Team } from "@/types"; import { @@ -77,16 +78,25 @@ export default function PrompterPage() { {/* End chat — reap the agent and return to the form (any chat state) */} {!showForm && state !== "success" && ( - + + {/* disabled sets pointer-events:none on the Button, which would + swallow hover — the tip sits on a wrapping span instead. */} + + + + )} diff --git a/panel/src/app/(dashboard)/tasks/[taskId]/page.tsx b/panel/src/app/(dashboard)/tasks/[taskId]/page.tsx index 0cd333f9..667ed112 100644 --- a/panel/src/app/(dashboard)/tasks/[taskId]/page.tsx +++ b/panel/src/app/(dashboard)/tasks/[taskId]/page.tsx @@ -29,6 +29,7 @@ import { AlertTriangle, ArrowLeft } from "lucide-react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { toast } from "sonner"; +import { HelpTip } from "@/components/ui/help-tip"; interface TaskDetailPageProps { params: Promise<{ taskId: string }>; @@ -415,12 +416,14 @@ export default function TaskDetailPage({ params }: TaskDetailPageProps) { if (error || !task) { return (
- - - + + + + + @@ -432,9 +435,11 @@ export default function TaskDetailPage({ params }: TaskDetailPageProps) { "The task you're looking for doesn't exist or has been deleted."}

- - - + + + + +
@@ -474,12 +479,14 @@ export default function TaskDetailPage({ params }: TaskDetailPageProps) { task.team !== Team.MAIN_PM && (
{task.team === Team.BOARD && ( - + + + )}
diff --git a/panel/src/app/(dashboard)/tasks/page.tsx b/panel/src/app/(dashboard)/tasks/page.tsx index 4fc229eb..5ce971eb 100644 --- a/panel/src/app/(dashboard)/tasks/page.tsx +++ b/panel/src/app/(dashboard)/tasks/page.tsx @@ -18,6 +18,7 @@ import type { TaskFilters as TaskApiFilters } from "@/lib/api/tasks"; import { Skeleton } from "@/components/ui/skeleton"; import { usePageRefresh } from "@/hooks"; import { useScrollRestorationStore } from "@/lib/stores"; +import { HelpTip } from "@/components/ui/help-tip"; function TasksPageContent() { const router = useRouter(); @@ -304,9 +305,11 @@ function TasksPageContent() {

Tasks

-

- Manage and track all tasks across teams -

+ +

+ Manage and track all tasks across teams +

+
diff --git a/panel/src/components/git/__tests__/code-snippet.test.tsx b/panel/src/components/git/__tests__/code-snippet.test.tsx index c6a48e5f..b77393bb 100644 --- a/panel/src/components/git/__tests__/code-snippet.test.tsx +++ b/panel/src/components/git/__tests__/code-snippet.test.tsx @@ -71,6 +71,9 @@ describe("CodeSnippet", () => { // The active line's content is "b"; its row carries the highlight class. const row = screen.getByText("b").parentElement; expect(row?.className).toContain("bg-blue-500/15"); + // The active line's number is now a real HelpTip trigger (Radix injects + // data-state via asChild), not a bare span. + expect(screen.getByText("2").getAttribute("data-state")).toBe("closed"); }); it("renders the fail-open hint on an error", () => { diff --git a/panel/src/components/git/code-snippet.tsx b/panel/src/components/git/code-snippet.tsx index cbe64ca4..56339931 100644 --- a/panel/src/components/git/code-snippet.tsx +++ b/panel/src/components/git/code-snippet.tsx @@ -4,6 +4,7 @@ import { useGitFile } from "@/hooks/use-git"; import { Skeleton } from "@/components/ui/skeleton"; import { ScrollArea } from "@/components/ui/scroll-area"; import { cn } from "@/lib/utils"; +import { HelpTip } from "@/components/ui/help-tip"; interface CodeSnippetProps { branch: string | null | undefined; @@ -64,9 +65,11 @@ export function CodeSnippet({ "bg-blue-500/15 ring-1 ring-inset ring-blue-500/30", )} > - - {lineNo} - + + + {lineNo} + + {text || " "}
); @@ -74,10 +77,12 @@ export function CodeSnippet({ {data.truncated && ( -

- showing lines {data.start_line}–{data.start_line + lines.length - 1}{" "} - of {data.total_lines} -

+ +

+ showing lines {data.start_line}– + {data.start_line + lines.length - 1} of {data.total_lines} +

+
)}
); diff --git a/panel/src/components/git/git-actions-panel.tsx b/panel/src/components/git/git-actions-panel.tsx index 769faaec..f24f99ca 100644 --- a/panel/src/components/git/git-actions-panel.tsx +++ b/panel/src/components/git/git-actions-panel.tsx @@ -150,28 +150,51 @@ export function GitActionsPanel({ open={showCommitDialog} onOpenChange={handleCommitDialogOpenChange} > - - - + + + + + Commit Changes
- + + +