diff --git a/src/renderer/src/components/sidebar/WorktreeCardDetailSection.tsx b/src/renderer/src/components/sidebar/WorktreeCardDetailSection.tsx new file mode 100644 index 00000000000..54d2d246e84 --- /dev/null +++ b/src/renderer/src/components/sidebar/WorktreeCardDetailSection.tsx @@ -0,0 +1,23 @@ +import React from 'react' +import { cn } from '@/lib/utils' + +type WorktreeCardDetailSectionProps = React.HTMLAttributes +type WorktreeCardDetailSectionContentProps = React.HTMLAttributes + +export function WorktreeCardDetailSection({ + className, + ...props +}: WorktreeCardDetailSectionProps): React.JSX.Element { + return
+} + +export function WorktreeCardDetailSectionContent({ + className, + ...props +}: WorktreeCardDetailSectionContentProps): React.JSX.Element { + return ( + // Why: section titles stay at hovercard level 0; only each section's body + // is inset so stacked metadata remains visually scannable. +
+ ) +} diff --git a/src/renderer/src/components/sidebar/WorktreeCardMeta.tsx b/src/renderer/src/components/sidebar/WorktreeCardMeta.tsx index 7cae07d29ab..6e80ede0c26 100644 --- a/src/renderer/src/components/sidebar/WorktreeCardMeta.tsx +++ b/src/renderer/src/components/sidebar/WorktreeCardMeta.tsx @@ -13,6 +13,10 @@ import { SelectedTextCopyMenu } from '@/components/SelectedTextCopyMenu' import CommentMarkdown from './CommentMarkdown' import { PullRequestIcon } from './WorktreeCardHelpers' import { WORKTREE_NATIVE_CONTEXT_MENU_ATTR } from './WorktreeContextMenu' +import { + WorktreeCardDetailSection, + WorktreeCardDetailSectionContent +} from './WorktreeCardDetailSection' import { IssueStateBadge, LinearStateBadge, @@ -300,7 +304,7 @@ export function WorktreeCardDetailsHover({ > {issue && ( -
+ } label={`Issue #${issue.number}`} @@ -325,7 +329,7 @@ export function WorktreeCardDetailsHover({ } /> -
+
{issue.title}
@@ -339,12 +343,12 @@ export function WorktreeCardDetailsHover({ ))}
)} -
-
+ + )} {linearIssue && ( -
+ } label={`Linear ${linearIssue.identifier}`} @@ -366,7 +370,7 @@ export function WorktreeCardDetailsHover({ } /> -
+
{linearIssue.title}
@@ -383,12 +387,12 @@ export function WorktreeCardDetailsHover({ ))}
)} - -
+ + )} {review && reviewLabel && reviewProvider && ( -
+ } label={`${reviewLabel} #${review.number}`} @@ -410,7 +414,7 @@ export function WorktreeCardDetailsHover({ } /> -
+
{review.title}
@@ -420,12 +424,12 @@ export function WorktreeCardDetailsHover({
)} - -
+ + )} {hasComment(comment) && ( -
+ } label="Notes" @@ -435,13 +439,13 @@ export function WorktreeCardDetailsHover({ } /> -
+ -
-
+ + )} {detailsAfter} diff --git a/src/renderer/src/components/sidebar/WorktreeCardPorts.test.tsx b/src/renderer/src/components/sidebar/WorktreeCardPorts.test.tsx index ea03cfe7626..774b0dc30d4 100644 --- a/src/renderer/src/components/sidebar/WorktreeCardPorts.test.tsx +++ b/src/renderer/src/components/sidebar/WorktreeCardPorts.test.tsx @@ -47,5 +47,9 @@ describe('WorktreeCardPortsDetails', () => { expect(markup).toContain('dev.preview.localhost:58941') expect(markup).toContain('aria-label="Copy dev.preview.localhost:58941"') + expect(markup).toContain( + '
+
Live Ports @@ -224,12 +228,12 @@ export function WorktreeCardPortsDetails({ {ports.length}
-
+ {ports.map((port) => ( ))} -
-
+ + ) }