diff --git a/packages/workflow-renderer/src/lib/overflow-span.tsx b/packages/workflow-renderer/src/lib/overflow-span.tsx
new file mode 100644
index 00000000000..65437f0d8a5
--- /dev/null
+++ b/packages/workflow-renderer/src/lib/overflow-span.tsx
@@ -0,0 +1,25 @@
+import { FloatingTooltip, isTextClipped, useFloatingTooltip } from '@sim/emcn'
+
+interface OverflowSpanProps {
+ value: string
+ className: string
+}
+
+/**
+ * Truncated span that reveals its full value in a floating tooltip when — and
+ * only when — the text is actually clipped. Never use a native `title`
+ * attribute here: on the canvas it pops the browser's raw, unstyled tooltip
+ * with the full untruncated value (including raw code/JSON) over the graph.
+ */
+export function OverflowSpan({ value, className }: OverflowSpanProps) {
+ const { state, handlers } = useFloatingTooltip(isTextClipped)
+
+ return (
+ <>
+
+ {value}
+
+
+ >
+ )
+}
diff --git a/packages/workflow-renderer/src/workflow-block/sub-block-row-view.tsx b/packages/workflow-renderer/src/workflow-block/sub-block-row-view.tsx
index 01930cdcac1..7be0b0bb7b6 100644
--- a/packages/workflow-renderer/src/workflow-block/sub-block-row-view.tsx
+++ b/packages/workflow-renderer/src/workflow-block/sub-block-row-view.tsx
@@ -1,4 +1,5 @@
import { cn } from '@sim/emcn'
+import { OverflowSpan } from '../lib/overflow-span'
/**
* Props for the pure subblock summary row. The container resolves the value —
@@ -22,22 +23,18 @@ export interface SubBlockRowViewProps {
export function SubBlockRowView({ title, displayValue, isMonospace }: SubBlockRowViewProps) {
return (
-
- {title}
-
+ />
{displayValue !== undefined && (
-
- {displayValue}
-
+ />
)}
)
diff --git a/packages/workflow-renderer/src/workflow-block/workflow-block-view.tsx b/packages/workflow-renderer/src/workflow-block/workflow-block-view.tsx
index 3b7dbb36cec..cf43c63796d 100644
--- a/packages/workflow-renderer/src/workflow-block/workflow-block-view.tsx
+++ b/packages/workflow-renderer/src/workflow-block/workflow-block-view.tsx
@@ -2,6 +2,7 @@ import type { ComponentType, ReactNode, Ref } from 'react'
import { Badge, cn, handleKeyboardActivation, Tooltip } from '@sim/emcn'
import { Handle, Position } from 'reactflow'
import { HANDLE_POSITIONS } from '../dimensions'
+import { OverflowSpan } from '../lib/overflow-span'
import { tileIconColorClass } from '../lib/tile-icon-color'
import type { BlockRunStatus } from '../types'
import { SubBlockRowView } from './sub-block-row-view'
@@ -212,15 +213,13 @@ export function WorkflowBlockView({
)}
/>
-
- {name}
-
+ />
{isWorkflowSelector &&