From 62eb15f7a7d0ea7faef2cd128a27957494ca6088 Mon Sep 17 00:00:00 2001 From: Neil <4138956+nwparker@users.noreply.github.com> Date: Thu, 21 May 2026 01:54:52 -0700 Subject: [PATCH] Apply live ports styling to status bar popup (#2507) --- .../{sidebar => }/SelectedTextCopyMenu.tsx | 0 .../components/sidebar/WorktreeCardMeta.tsx | 2 +- .../components/sidebar/WorktreeCardPorts.tsx | 2 +- .../status-bar/PortsStatusSegment.tsx | 180 ++++++++++-------- 4 files changed, 98 insertions(+), 86 deletions(-) rename src/renderer/src/components/{sidebar => }/SelectedTextCopyMenu.tsx (100%) diff --git a/src/renderer/src/components/sidebar/SelectedTextCopyMenu.tsx b/src/renderer/src/components/SelectedTextCopyMenu.tsx similarity index 100% rename from src/renderer/src/components/sidebar/SelectedTextCopyMenu.tsx rename to src/renderer/src/components/SelectedTextCopyMenu.tsx diff --git a/src/renderer/src/components/sidebar/WorktreeCardMeta.tsx b/src/renderer/src/components/sidebar/WorktreeCardMeta.tsx index 83f37fa8480..7cae07d29ab 100644 --- a/src/renderer/src/components/sidebar/WorktreeCardMeta.tsx +++ b/src/renderer/src/components/sidebar/WorktreeCardMeta.tsx @@ -9,10 +9,10 @@ import { Tooltip, TooltipTrigger, TooltipContent } from '@/components/ui/tooltip import { CircleDot, ExternalLink, GitMerge, MonitorUp, Pencil, StickyNote } from 'lucide-react' import { cn } from '@/lib/utils' import { LinearIcon } from '@/components/icons/LinearIcon' +import { SelectedTextCopyMenu } from '@/components/SelectedTextCopyMenu' import CommentMarkdown from './CommentMarkdown' import { PullRequestIcon } from './WorktreeCardHelpers' import { WORKTREE_NATIVE_CONTEXT_MENU_ATTR } from './WorktreeContextMenu' -import { SelectedTextCopyMenu } from './SelectedTextCopyMenu' import { IssueStateBadge, LinearStateBadge, diff --git a/src/renderer/src/components/sidebar/WorktreeCardPorts.tsx b/src/renderer/src/components/sidebar/WorktreeCardPorts.tsx index c9c5756aa75..078c2e51651 100644 --- a/src/renderer/src/components/sidebar/WorktreeCardPorts.tsx +++ b/src/renderer/src/components/sidebar/WorktreeCardPorts.tsx @@ -5,6 +5,7 @@ import { useAppStore } from '@/store' import { HoverCard, HoverCardContent, HoverCardTrigger } from '@/components/ui/hover-card' import { Button } from '@/components/ui/button' import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip' +import { SelectedTextCopyMenu } from '@/components/SelectedTextCopyMenu' import { getActiveRuntimeTarget } from '@/runtime/runtime-rpc-client' import { addressForPort, @@ -16,7 +17,6 @@ import { } from '@/lib/workspace-port-actions' import type { WorkspacePort } from '../../../../shared/workspace-ports' import { WORKTREE_NATIVE_CONTEXT_MENU_ATTR } from './WorktreeContextMenu' -import { SelectedTextCopyMenu } from './SelectedTextCopyMenu' type WorktreeCardPortsProps = { ports: WorkspacePort[] diff --git a/src/renderer/src/components/status-bar/PortsStatusSegment.tsx b/src/renderer/src/components/status-bar/PortsStatusSegment.tsx index 7e2abc76b3b..b76e98608ad 100644 --- a/src/renderer/src/components/status-bar/PortsStatusSegment.tsx +++ b/src/renderer/src/components/status-bar/PortsStatusSegment.tsx @@ -27,6 +27,7 @@ import { getWorkspacePortGroups, type WorkspacePortGroup } from '@/lib/workspace-port-groups' +import { SelectedTextCopyMenu } from '@/components/SelectedTextCopyMenu' import { STATUS_BAR_CONTEXT_MENU_EXEMPT_PROPS } from './status-bar-context-menu-policy' import type { WorkspacePort } from '../../../../shared/workspace-ports' @@ -53,7 +54,7 @@ function PortAction({ type="button" variant="ghost" size="icon-xs" - className="size-6 text-muted-foreground hover:text-foreground" + className="size-5 text-muted-foreground hover:text-foreground disabled:pointer-events-none disabled:text-muted-foreground/35" aria-label={label} onClick={onClick} disabled={disabled} @@ -109,7 +110,7 @@ function PortRow({ (event: React.MouseEvent) => { event.stopPropagation() void window.api.ui.writeClipboardText(addressForPort(port)) - toast.success(`Copied :${port.port}`) + toast.success(`Copied ${port.port}`) }, [port] ) @@ -130,7 +131,7 @@ function PortRow({ toast.error(result.reason) return } - toast.success(`Stopped process on :${port.port}`) + toast.success(`Stopped process on ${port.port}`) setWorkspacePortScanRefreshing(true) try { const scan = await scanWorkspacePortsForTarget(runtimeTarget) @@ -148,29 +149,38 @@ function PortRow({ ) return ( -
-
-
- :{port.port} - {processLabel} +
+ + {port.port} + +
+
+ + + + {processLabel} + + + + {processLabel} + + +
+ + + + + + + + + +
-
+
{external ? port.kind : addressForPort(port)}
-
- - - - - - - {canStop && ( - - - - )} -
) } @@ -257,72 +267,74 @@ export function PortsStatusSegment({ iconOnly }: PortsStatusSegmentProps): React className="w-[24rem] max-w-[calc(100vw-2rem)] p-0" onOpenAutoFocus={(event) => event.preventDefault()} > -
-
- - Ports + +
+
+ + Ports +
+ + {workspacePortCount} workspace · {externalPorts.length} external +
- - {workspacePortCount} workspace · {externalPorts.length} external - -
- {scan?.unavailableReason ? ( -
- Port scan unavailable on {scan.platform}: {scan.unavailableReason} -
- ) : ( -
- {workspaceGroups.length > 0 ? ( - workspaceGroups.map((group) => ( - - )) - ) : ( -
- {refreshing ? 'Scanning for workspace ports...' : 'No workspace ports detected'} -
- )} - -
- - {externalOpen && ( -
- {externalPorts.length > 0 ? ( - externalPorts.map((port) => ( - - )) - ) : ( -
- No external ports detected -
- )} + {scan?.unavailableReason ? ( +
+ Port scan unavailable on {scan.platform}: {scan.unavailableReason} +
+ ) : ( +
+ {workspaceGroups.length > 0 ? ( + workspaceGroups.map((group) => ( + + )) + ) : ( +
+ {refreshing ? 'Scanning for workspace ports...' : 'No workspace ports detected'}
)} -
-
- )} + +
+ + {externalOpen && ( +
+ {externalPorts.length > 0 ? ( + externalPorts.map((port) => ( + + )) + ) : ( +
+ No external ports detected +
+ )} +
+ )} +
+
+ )} + )