diff --git a/apps/sim/app/workspace/[workspaceId]/components/resource/components/resource-header/resource-header.tsx b/apps/sim/app/workspace/[workspaceId]/components/resource/components/resource-header/resource-header.tsx
index a28d735a1f8..df0960385c5 100644
--- a/apps/sim/app/workspace/[workspaceId]/components/resource/components/resource-header/resource-header.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/components/resource/components/resource-header/resource-header.tsx
@@ -33,7 +33,6 @@ import { ArrowUpLeft } from 'lucide-react'
import { createPortal } from 'react-dom'
import { TITLE_BAR_LANE_PT } from '@/components/page-header-bar'
import { InlineRenameInput } from '@/app/workspace/[workspaceId]/components/inline-rename-input'
-import { FloatingOverflowText } from '@/app/workspace/[workspaceId]/components/resource/components/floating-overflow-text'
export interface DropdownOption {
label: string
@@ -195,10 +194,9 @@ export const ResourceHeader = memo(function ResourceHeader({
{TitleIcon && }
{titleLabel && (
-
+
+ {titleLabel}
+
)}
)}
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/document.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/document.tsx
index f34ed657dbc..0f014c6a00d 100644
--- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/document.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/document.tsx
@@ -21,11 +21,7 @@ import type {
SelectableConfig,
SortConfig,
} from '@/app/workspace/[workspaceId]/components'
-import {
- EMPTY_CELL_PLACEHOLDER,
- FloatingOverflowText,
- Resource,
-} from '@/app/workspace/[workspaceId]/components'
+import { EMPTY_CELL_PLACEHOLDER, Resource } from '@/app/workspace/[workspaceId]/components'
import {
ChunkContextMenu,
ChunkEditor,
@@ -948,13 +944,9 @@ export function Document({
cells: {
content: {
content: (
-
+
-
+
),
},
index: {
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx
index f5f988ec658..c89a42a609f 100644
--- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx
@@ -18,9 +18,12 @@ import {
chipContentLabelClass,
chipVariants,
cn,
+ FloatingTooltip,
+ isTextClipped,
Loader,
Tooltip,
Trash,
+ useFloatingTooltip,
} from '@sim/emcn'
import { Database, DatabaseX } from '@sim/emcn/icons'
import { createLogger } from '@sim/logger'
@@ -177,6 +180,39 @@ interface TagValue {
value: string
}
+/**
+ * Tags cell for the documents table. Shows the joined tag values inline and
+ * reveals the full `name: value` breakdown only when the inline text is
+ * actually clipped — an un-truncated cell already says everything the tooltip
+ * would.
+ */
+function DocumentTagsCell({ tags }: { tags: TagValue[] }) {
+ const { state, handlers } = useFloatingTooltip(isTextClipped)
+
+ return (
+ <>
+ e.stopPropagation()}
+ onKeyDown={(e) => e.stopPropagation()}
+ {...handlers}
+ >
+ {tags.map((tag) => tag.value).join(', ')}
+
+
+
+ {tags.map((tag) => (
+
+ {tag.displayName}: {tag.value}
+
+ ))}
+
+
+ >
+ )
+}
+
/**
* Computes tag values for a document
*/
@@ -1057,7 +1093,6 @@ export function KnowledgeBase({
const DocIcon = ConnectorIcon || getDocumentIcon(doc.mimeType, doc.filename)
const tags = getDocumentTags(doc, tagDefinitions)
- const tagsDisplayText = tags.map((t) => t.value).join(', ')
const statusCell: ResourceCell =
doc.processingStatus === 'failed' && doc.processingError
@@ -1076,34 +1111,7 @@ export function KnowledgeBase({
: { content: getStatusBadge(doc) }
const tagsCell: ResourceCell =
- tags.length === 0
- ? { label: null }
- : {
- content: (
-
-
- e.stopPropagation()}
- onKeyDown={(e) => e.stopPropagation()}
- >
- {tagsDisplayText}
-
-
-
-
- {tags.map((tag) => (
-
- {tag.displayName}:{' '}
- {tag.value}
-
- ))}
-
-
-
- ),
- }
+ tags.length === 0 ? { label: null } : { content: }
return {
id: doc.id,
diff --git a/packages/workflow-renderer/src/note/note-block-view.tsx b/packages/workflow-renderer/src/note/note-block-view.tsx
index 4b0a3e50159..c66369f9e97 100644
--- a/packages/workflow-renderer/src/note/note-block-view.tsx
+++ b/packages/workflow-renderer/src/note/note-block-view.tsx
@@ -4,6 +4,7 @@ import { Streamdown } from 'streamdown'
import 'streamdown/styles.css'
import { cn, handleKeyboardActivation } from '@sim/emcn'
import { getEmbedInfo } from '@sim/utils/media-embed'
+import { OverflowSpan } from '../lib/overflow-span'
const EMBED_SCALE = 0.78
const EMBED_INVERSE_SCALE = `${(1 / EMBED_SCALE) * 100}%`
@@ -217,15 +218,13 @@ export function NoteBlockView({
diff --git a/packages/workflow-renderer/src/subflow/subflow-node-view.tsx b/packages/workflow-renderer/src/subflow/subflow-node-view.tsx
index 335a97b4591..f2eea5eef62 100644
--- a/packages/workflow-renderer/src/subflow/subflow-node-view.tsx
+++ b/packages/workflow-renderer/src/subflow/subflow-node-view.tsx
@@ -3,6 +3,7 @@ import { Badge, cn, handleKeyboardActivation } from '@sim/emcn'
import { RepeatIcon, SplitIcon } from 'lucide-react'
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, DiffStatus } from '../types'
@@ -171,15 +172,13 @@ export function SubflowNodeView({
)}
/>
-
- {blockName}
-
+ />
{!isEnabled && disabled}
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 87c4ac824b4..9fac04f93f7 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
@@ -33,13 +33,14 @@ export function SubBlockRowView({ title, displayValue, isMonospace }: SubBlockRo
className='min-w-0 truncate text-[var(--text-tertiary)] text-sm capitalize'
/>
{displayValue !== undefined && (
-
+ >
+ {displayValue}
+
)}
)