Skip to content

Commit da8b15d

Browse files
feat: Allow clicking links in non-interactive mode. (#719)
* Allow clicking links in non-interactive mode. * better embed ux when interactivity=false --------- Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
1 parent 8efbdf3 commit da8b15d

File tree

4 files changed

+49
-1
lines changed

4 files changed

+49
-1
lines changed

examples/with-script-in-browser/components/ExampleApp.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ export default function ExampleApp({
105105
const [zenModeEnabled, setZenModeEnabled] = useState(false);
106106
const [gridModeEnabled, setGridModeEnabled] = useState(false);
107107
const [renderScrollbars, setRenderScrollbars] = useState(false);
108+
const [interactive, setInteractive] = useState(false);
108109
const [blobUrl, setBlobUrl] = useState<string>("");
109110
const [canvasUrl, setCanvasUrl] = useState<string>("");
110111
const [exportWithDarkMode, setExportWithDarkMode] = useState(false);
@@ -194,6 +195,7 @@ export default function ExampleApp({
194195
viewModeEnabled,
195196
zenModeEnabled,
196197
renderScrollbars,
198+
interactive,
197199
gridModeEnabled,
198200
theme,
199201
name: "Custom name of drawing",
@@ -722,6 +724,14 @@ export default function ExampleApp({
722724
/>
723725
Render scrollbars
724726
</label>
727+
<label>
728+
<input
729+
type="checkbox"
730+
checked={interactive}
731+
onChange={() => setInteractive(!interactive)}
732+
/>
733+
interactive
734+
</label>
725735
<label>
726736
<input
727737
type="checkbox"

excalidraw-app/App.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -962,6 +962,7 @@ const ExcalidrawWrapper = () => {
962962
},
963963
},
964964
}}
965+
interactive={true}
965966
langCode={langCode}
966967
renderCustomStats={renderCustomStats}
967968
detectScroll={false}

packages/excalidraw/components/App.tsx

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6491,6 +6491,42 @@ class App extends React.Component<AppProps, AppState> {
64916491
event: React.PointerEvent<HTMLCanvasElement>,
64926492
) => {
64936493
if (this.props.interactive === false) {
6494+
// Handle link detection for non-interactive mode
6495+
const scenePointer = viewportCoordsToSceneCoords(event, this.state);
6496+
6497+
const hitElement = this.getElementAtPosition(
6498+
scenePointer.x,
6499+
scenePointer.y,
6500+
{ preferSelected: true, includeLockedElements: true },
6501+
);
6502+
6503+
this.hitLinkElement = this.getElementLinkAtPosition(
6504+
scenePointer,
6505+
hitElement,
6506+
);
6507+
6508+
if (this.hitLinkElement) {
6509+
setCursor(this.interactiveCanvas, CURSOR_TYPE.POINTER);
6510+
if (
6511+
!isEmbeddableElement(this.hitLinkElement) ||
6512+
isPointHittingLinkIcon(
6513+
this.hitLinkElement,
6514+
this.scene.getNonDeletedElementsMap(),
6515+
this.state,
6516+
pointFrom(scenePointer.x, scenePointer.y),
6517+
)
6518+
) {
6519+
showHyperlinkTooltip(
6520+
this.hitLinkElement,
6521+
this.state,
6522+
this.scene.getNonDeletedElementsMap(),
6523+
);
6524+
}
6525+
} else {
6526+
hideHyperlinkToolip();
6527+
setCursor(this.interactiveCanvas, CURSOR_TYPE.AUTO);
6528+
}
6529+
64946530
return false;
64956531
}
64966532

packages/excalidraw/renderer/interactiveScene.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1455,7 +1455,8 @@ const _renderInteractiveScene = ({
14551455
if (
14561456
!appState.multiElement &&
14571457
!appState.newElement &&
1458-
!appState.selectedLinearElement?.isEditing
1458+
!appState.selectedLinearElement?.isEditing &&
1459+
app.props.interactive !== false
14591460
) {
14601461
const showBoundingBox = hasBoundingBox(
14611462
selectedElements,

0 commit comments

Comments
 (0)