From 38de47bdd4b83947118023b10d88f196546c8984 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Wed, 26 Aug 2026 16:50:59 -0700 Subject: [PATCH] improvement(canvas): improve code tooltip readability --- packages/emcn/src/components/popover/popover.tsx | 8 +++++--- .../workflow-renderer/src/lib/code-hover-card.tsx | 9 +++++++-- .../src/lib/overflow-span-mount.test.tsx | 14 ++++++++++---- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/packages/emcn/src/components/popover/popover.tsx b/packages/emcn/src/components/popover/popover.tsx index 38cb02e2de3..8efe883c9d4 100644 --- a/packages/emcn/src/components/popover/popover.tsx +++ b/packages/emcn/src/components/popover/popover.tsx @@ -363,8 +363,8 @@ interface PopoverContentProps disablePortal?: boolean /** Maximum height in pixels */ maxHeight?: number - /** Maximum width in pixels. Enables text truncation when set. */ - maxWidth?: number + /** Maximum width in pixels or as a CSS length. Enables text truncation when set. */ + maxWidth?: number | string /** Minimum width in pixels */ minWidth?: number /** @@ -537,7 +537,9 @@ const PopoverContent = React.forwardRef< const effectiveMaxWidth = maxWidth !== undefined - ? `${maxWidth}px` + ? typeof maxWidth === 'number' + ? `${maxWidth}px` + : maxWidth : appearance === 'tooltip' ? `min(${TOOLTIP_MAX_WIDTH_PX}px, calc(100vw - 2rem))` : undefined diff --git a/packages/workflow-renderer/src/lib/code-hover-card.tsx b/packages/workflow-renderer/src/lib/code-hover-card.tsx index ee8eeca2652..afc74d47cd4 100644 --- a/packages/workflow-renderer/src/lib/code-hover-card.tsx +++ b/packages/workflow-renderer/src/lib/code-hover-card.tsx @@ -17,6 +17,7 @@ const OPEN_DELAY_MS = 300 const TRIGGER_EXIT_GRACE_MS = 600 const CONTENT_EXIT_GRACE_MS = 120 const CODE_TOOLTIP_MAX_HEIGHT_PX = 256 +const CODE_TOOLTIP_MAX_WIDTH = 'min(480px, calc(100vw - 2rem))' interface CodeHoverCardProps { preview: CodePreview @@ -24,7 +25,7 @@ interface CodeHoverCardProps { children: ReactNode } -/** Interactive, two-axis-scrollable source preview anchored to a canvas code chip. */ +/** Interactive, vertically scrollable source preview anchored to a canvas code chip. */ export function CodeHoverCard({ preview, className, children }: CodeHoverCardProps) { const [open, setOpen] = useState(false) const contentId = useId() @@ -164,6 +165,7 @@ export function CodeHoverCard({ preview, className, children }: CodeHoverCardPro collisionPadding={16} appearance='tooltip' maxHeight={CODE_TOOLTIP_MAX_HEIGHT_PX} + maxWidth={CODE_TOOLTIP_MAX_WIDTH} onPointerEnter={clearCloseTimer} onPointerLeave={() => scheduleClose(CONTENT_EXIT_GRACE_MS)} onFocus={clearCloseTimer} @@ -174,9 +176,12 @@ export function CodeHoverCard({ preview, className, children }: CodeHoverCardPro diff --git a/packages/workflow-renderer/src/lib/overflow-span-mount.test.tsx b/packages/workflow-renderer/src/lib/overflow-span-mount.test.tsx index b3bdc203dba..d9271dbe847 100644 --- a/packages/workflow-renderer/src/lib/overflow-span-mount.test.tsx +++ b/packages/workflow-renderer/src/lib/overflow-span-mount.test.tsx @@ -68,10 +68,16 @@ describe('OverflowSpan code preview', () => { const preview = document.querySelector('[data-code-hover-card]') expect(preview).toHaveTextContent('line 20') expect(preview).toHaveClass('w-fit', 'max-w-[min(16rem,calc(100vw-2rem))]', 'shadow-sm') - expect(preview).toHaveStyle({ maxWidth: 'min(256px, calc(100vw - 2rem))' }) - expect(preview?.querySelector('.overflow-x-auto')).toHaveClass('overflow-y-auto') - expect(preview?.querySelector('.tabular-nums')).toBeNull() - expect(preview?.querySelector('pre')).toHaveClass('px-2', 'py-1.5', 'text-caption', 'leading-5') + expect(preview).toHaveStyle({ maxWidth: 'min(480px, calc(100vw - 2rem))' }) + expect(preview?.querySelector('.overflow-x-hidden')).toHaveClass('overflow-y-auto') + expect(preview?.querySelector('.tabular-nums')).toHaveTextContent('1') + expect(preview?.querySelector('.code-editor-theme > div')).toHaveStyle({ paddingLeft: '8px' }) + expect(preview?.querySelector('pre')).toHaveClass( + 'whitespace-pre-wrap', + 'break-words', + 'text-caption', + 'leading-5' + ) }) it('stays open while the pointer crosses into the scrollable preview', () => {