From e7030755e9a9eb55791c40bae4068472e8cecbfb Mon Sep 17 00:00:00 2001 From: Trang Doan Date: Wed, 9 Sep 2026 16:28:32 -0400 Subject: [PATCH 1/5] ENG-1356 Add hover icon button to convert canvas images into discourse nodes Hovering a tldraw image shape now shows a convert button that opens the create node dialog with the type picker enabled and an image preview. The existing right-click Convert To path is unchanged; its upload and shape-replacement steps move into shared helpers used by both flows. Co-Authored-By: Claude Fable 5.1 --- apps/roam/src/components/ModifyNodeDialog.tsx | 15 +++ apps/roam/src/components/canvas/Tldraw.tsx | 4 +- .../canvas/convertShapeToDiscourseNode.ts | 64 +++++++++++ .../canvas/overlays/CanvasOverlays.tsx | 10 ++ .../canvas/overlays/ImageConvertOverlay.tsx | 108 ++++++++++++++++++ .../src/components/canvas/uiOverrides.tsx | 58 +++------- .../content/roam/guides/using-the-canvas.mdx | 6 +- 7 files changed, 219 insertions(+), 46 deletions(-) create mode 100644 apps/roam/src/components/canvas/convertShapeToDiscourseNode.ts create mode 100644 apps/roam/src/components/canvas/overlays/CanvasOverlays.tsx create mode 100644 apps/roam/src/components/canvas/overlays/ImageConvertOverlay.tsx diff --git a/apps/roam/src/components/ModifyNodeDialog.tsx b/apps/roam/src/components/ModifyNodeDialog.tsx index 06a0f9958..6cdc94e91 100644 --- a/apps/roam/src/components/ModifyNodeDialog.tsx +++ b/apps/roam/src/components/ModifyNodeDialog.tsx @@ -58,6 +58,7 @@ export type ModifyNodeDialogProps = { text: string; uid: string; action: string; + nodeType?: string; }) => Promise; onClose: () => void; }; @@ -371,6 +372,7 @@ const ModifyNodeDialog = ({ text: content.text, uid: content.uid, action: "create", + nodeType: selectedNodeType?.type, }); onClose(); @@ -480,6 +482,7 @@ const ModifyNodeDialog = ({ text: formattedTitle, uid: newPageUid, action: "create", + nodeType: selectedNodeType?.type, }); } else { // Edit mode: update the existing block @@ -515,6 +518,7 @@ const ModifyNodeDialog = ({ text: updatedContent, uid: sourceBlockUid || content.uid, action: "edit", + nodeType: selectedNodeType?.type, }); } onClose(); @@ -592,6 +596,17 @@ const ModifyNodeDialog = ({ + {imageUrl && ( + + )} + {/* Referenced Node Input */} {referencedNode && !isContentLocked && mode === "create" && (