From 57254b3ce277cc4e47f0f73652d9ffac14ed0b92 Mon Sep 17 00:00:00 2001 From: Renn F Date: Wed, 15 Jul 2026 17:56:12 +0200 Subject: [PATCH] =?UTF-8?q?feat(panel):=20dense=20tooltip=20pass=20?= =?UTF-8?q?=E2=80=94=20projects,=20products,=20social,=20KB,=20business,?= =?UTF-8?q?=20settings,=20notifications=20(178=20tips)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Density bar: every dialog field, column header, filter, badge, and status pill explains itself — grounded in the backend (ladder normalization, rate-limit park/probe, self-hosted fallback, reindex scope). Disabled buttons span-wrap so tips fire; tabs re-assert data-state. --- .../app/(dashboard)/notifications/page.tsx | 88 +++++-- panel/src/app/(dashboard)/settings/page.tsx | 4 +- .../business/company-scorecard-card.tsx | 12 +- panel/src/components/business/goals-tab.tsx | 74 +++--- panel/src/components/business/pitches-tab.tsx | 47 ++-- .../src/components/business/secretary-tab.tsx | 74 +++--- .../conventions/conventions-tab.tsx | 228 +++++++++++------- .../dashboard/social-history-section.tsx | 15 +- .../dashboard/video-pipeline-strip.tsx | 12 +- .../components/dashboard/video-post-queue.tsx | 52 ++-- .../src/components/dashboard/x-post-queue.tsx | 28 ++- .../knowledge-base/kb-category-nav.tsx | 9 +- .../knowledge-base/kb-category-view.tsx | 18 +- .../components/knowledge-base/kb-filters.tsx | 18 +- .../knowledge-base/kb-result-card.tsx | 24 +- .../knowledge-base/kb-stats-card.tsx | 8 +- .../knowledge-base/knowledge-base-browser.tsx | 189 ++++++++++----- .../knowledge-base/mentor-answer-display.tsx | 69 +++--- .../components/knowledge-base/mentor-chat.tsx | 67 ++--- .../knowledge-base/mentor-query-input.tsx | 40 ++- .../knowledge-base/rag-answer-display.tsx | 9 +- .../notifications/notification-bell.tsx | 24 +- .../products/create-product-dialog.tsx | 45 ++-- .../products/edit-product-dialog.tsx | 31 ++- .../src/components/products/product-table.tsx | 34 ++- .../projects/create-project-dialog.tsx | 76 ++++-- .../projects/edit-project-dialog.tsx | 114 ++++++--- .../projects/environment-ladder-editor.tsx | 119 +++++---- .../components/projects/project-filters.tsx | 55 +++-- .../components/projects/project-selector.tsx | 11 +- .../src/components/projects/project-table.tsx | 62 +++-- .../rate-limit/rate-limit-banner.tsx | 29 ++- .../components/settings/ai-routing-card.tsx | 24 +- .../settings/feature-flags-card.tsx | 16 +- .../settings/self-hosted-section.tsx | 66 ++--- .../settings/telegram-credentials-card.tsx | 23 +- .../settings/tiktok-credentials-card.tsx | 23 +- .../settings/x-credentials-card.tsx | 23 +- 38 files changed, 1205 insertions(+), 655 deletions(-) diff --git a/panel/src/app/(dashboard)/notifications/page.tsx b/panel/src/app/(dashboard)/notifications/page.tsx index c161bd3a..34f1c35f 100644 --- a/panel/src/app/(dashboard)/notifications/page.tsx +++ b/panel/src/app/(dashboard)/notifications/page.tsx @@ -17,6 +17,11 @@ import { Skeleton } from "@/components/ui/skeleton"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { OfflineState } from "@/components/ui/offline-state"; import { HelpTip } from "@/components/ui/help-tip"; +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from "@/components/ui/tooltip"; import { usePageRefresh } from "@/hooks"; import { Bell, @@ -114,20 +119,26 @@ function NotificationCard({
{notification.subject} - - {notification.priority} - - {!notification.is_read && ( - - New + + + {notification.priority} + + {!notification.is_read && ( + + + New + + )} {notification.requires_ack && !notification.is_acknowledged && ( - - Needs Ack - + + + Needs Ack + + )} {notification.related_task_id && ( - All - - Unread {data && data.unread_count > 0 && `(${data.unread_count})`} - - - Pending{" "} - {data && - data.pending_ack_count > 0 && - `(${data.pending_ack_count})`} - + {/* TooltipTrigger's asChild Slot merge injects its own data-state + onto the trigger, colliding with Radix Tabs' own literal + data-state (same trap as task-tabs.tsx) — reassert the real + selection state explicitly so the active-tab highlight + survives the merge. */} + + + + All + + + + Every notification you've received, read or not + + + + + + Unread {data && data.unread_count > 0 && `(${data.unread_count})`} + + + Notifications you haven't opened yet + + + + + Pending{" "} + {data && + data.pending_ack_count > 0 && + `(${data.pending_ack_count})`} + + + + Notifications still waiting on your acknowledgement + + diff --git a/panel/src/app/(dashboard)/settings/page.tsx b/panel/src/app/(dashboard)/settings/page.tsx index b33fc110..5a463546 100644 --- a/panel/src/app/(dashboard)/settings/page.tsx +++ b/panel/src/app/(dashboard)/settings/page.tsx @@ -121,7 +121,9 @@ export default function SettingsPage() {
- + + +

Show icons only in the sidebar

diff --git a/panel/src/components/business/company-scorecard-card.tsx b/panel/src/components/business/company-scorecard-card.tsx index 350fb710..2e56fac5 100644 --- a/panel/src/components/business/company-scorecard-card.tsx +++ b/panel/src/components/business/company-scorecard-card.tsx @@ -96,7 +96,9 @@ interface DeliverySectionProps { function DeliverySection({ delivery }: DeliverySectionProps) { return (
- Delivery + + Delivery +
Spend
- 30-day spend + + 30-day spend + ${spend_30d_usd.toFixed(2)}
{projected_monthly_usd !== null && (
- Projected monthly + + Projected monthly + ${projected_monthly_usd.toFixed(2)} diff --git a/panel/src/components/business/goals-tab.tsx b/panel/src/components/business/goals-tab.tsx index 9920aa25..7146dc34 100644 --- a/panel/src/components/business/goals-tab.tsx +++ b/panel/src/components/business/goals-tab.tsx @@ -101,16 +101,20 @@ function ObjectivesEditor({ Objective #{rowIdx + 1} - + + + + +
{keys.map((key) => (
@@ -132,15 +136,19 @@ function ObjectivesEditor({
))}
- + + + + +
); } @@ -297,7 +305,9 @@ function GoalsForm({ goals, refetch }: GoalsFormProps) { {/* North star */}
- + + +