Skip to content

Commit 38de47b

Browse files
committed
improvement(canvas): improve code tooltip readability
1 parent 1afaf46 commit 38de47b

3 files changed

Lines changed: 22 additions & 9 deletions

File tree

packages/emcn/src/components/popover/popover.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -363,8 +363,8 @@ interface PopoverContentProps
363363
disablePortal?: boolean
364364
/** Maximum height in pixels */
365365
maxHeight?: number
366-
/** Maximum width in pixels. Enables text truncation when set. */
367-
maxWidth?: number
366+
/** Maximum width in pixels or as a CSS length. Enables text truncation when set. */
367+
maxWidth?: number | string
368368
/** Minimum width in pixels */
369369
minWidth?: number
370370
/**
@@ -537,7 +537,9 @@ const PopoverContent = React.forwardRef<
537537

538538
const effectiveMaxWidth =
539539
maxWidth !== undefined
540-
? `${maxWidth}px`
540+
? typeof maxWidth === 'number'
541+
? `${maxWidth}px`
542+
: maxWidth
541543
: appearance === 'tooltip'
542544
? `min(${TOOLTIP_MAX_WIDTH_PX}px, calc(100vw - 2rem))`
543545
: undefined

packages/workflow-renderer/src/lib/code-hover-card.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,15 @@ const OPEN_DELAY_MS = 300
1717
const TRIGGER_EXIT_GRACE_MS = 600
1818
const CONTENT_EXIT_GRACE_MS = 120
1919
const CODE_TOOLTIP_MAX_HEIGHT_PX = 256
20+
const CODE_TOOLTIP_MAX_WIDTH = 'min(480px, calc(100vw - 2rem))'
2021

2122
interface CodeHoverCardProps {
2223
preview: CodePreview
2324
className: string
2425
children: ReactNode
2526
}
2627

27-
/** Interactive, two-axis-scrollable source preview anchored to a canvas code chip. */
28+
/** Interactive, vertically scrollable source preview anchored to a canvas code chip. */
2829
export function CodeHoverCard({ preview, className, children }: CodeHoverCardProps) {
2930
const [open, setOpen] = useState(false)
3031
const contentId = useId()
@@ -164,6 +165,7 @@ export function CodeHoverCard({ preview, className, children }: CodeHoverCardPro
164165
collisionPadding={16}
165166
appearance='tooltip'
166167
maxHeight={CODE_TOOLTIP_MAX_HEIGHT_PX}
168+
maxWidth={CODE_TOOLTIP_MAX_WIDTH}
167169
onPointerEnter={clearCloseTimer}
168170
onPointerLeave={() => scheduleClose(CONTENT_EXIT_GRACE_MS)}
169171
onFocus={clearCloseTimer}
@@ -174,9 +176,12 @@ export function CodeHoverCard({ preview, className, children }: CodeHoverCardPro
174176
<Code.Viewer
175177
code={preview.code}
176178
language={preview.language}
179+
showGutter
180+
wrapText
177181
density='compact'
182+
paddingLeft={8}
178183
highlightWorkflowReferences
179-
className='max-h-[min(16rem,calc(100vh-2rem))] min-h-0 rounded-none border-0 bg-[var(--bg)] shadow-none dark:bg-[var(--bg)]'
184+
className='max-h-[min(16rem,calc(100vh-2rem))] min-h-0 overflow-x-hidden rounded-none border-0 bg-[var(--bg)] shadow-none dark:bg-[var(--bg)]'
180185
/>
181186
</PopoverContent>
182187
</Popover>

packages/workflow-renderer/src/lib/overflow-span-mount.test.tsx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,16 @@ describe('OverflowSpan code preview', () => {
6868
const preview = document.querySelector('[data-code-hover-card]')
6969
expect(preview).toHaveTextContent('line 20')
7070
expect(preview).toHaveClass('w-fit', 'max-w-[min(16rem,calc(100vw-2rem))]', 'shadow-sm')
71-
expect(preview).toHaveStyle({ maxWidth: 'min(256px, calc(100vw - 2rem))' })
72-
expect(preview?.querySelector('.overflow-x-auto')).toHaveClass('overflow-y-auto')
73-
expect(preview?.querySelector('.tabular-nums')).toBeNull()
74-
expect(preview?.querySelector('pre')).toHaveClass('px-2', 'py-1.5', 'text-caption', 'leading-5')
71+
expect(preview).toHaveStyle({ maxWidth: 'min(480px, calc(100vw - 2rem))' })
72+
expect(preview?.querySelector('.overflow-x-hidden')).toHaveClass('overflow-y-auto')
73+
expect(preview?.querySelector('.tabular-nums')).toHaveTextContent('1')
74+
expect(preview?.querySelector('.code-editor-theme > div')).toHaveStyle({ paddingLeft: '8px' })
75+
expect(preview?.querySelector('pre')).toHaveClass(
76+
'whitespace-pre-wrap',
77+
'break-words',
78+
'text-caption',
79+
'leading-5'
80+
)
7581
})
7682

7783
it('stays open while the pointer crosses into the scrollable preview', () => {

0 commit comments

Comments
 (0)