Skip to content

Commit af889be

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 <[email protected]>
1 parent e046bec commit af889be

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
@@ -6466,6 +6466,42 @@ class App extends React.Component<AppProps, AppState> {
64666466
event: React.PointerEvent<HTMLCanvasElement>,
64676467
) => {
64686468
if (this.props.interactive === false) {
6469+
// Handle link detection for non-interactive mode
6470+
const scenePointer = viewportCoordsToSceneCoords(event, this.state);
6471+
6472+
const hitElement = this.getElementAtPosition(
6473+
scenePointer.x,
6474+
scenePointer.y,
6475+
{ preferSelected: true, includeLockedElements: true },
6476+
);
6477+
6478+
this.hitLinkElement = this.getElementLinkAtPosition(
6479+
scenePointer,
6480+
hitElement,
6481+
);
6482+
6483+
if (this.hitLinkElement) {
6484+
setCursor(this.interactiveCanvas, CURSOR_TYPE.POINTER);
6485+
if (
6486+
!isEmbeddableElement(this.hitLinkElement) ||
6487+
isPointHittingLinkIcon(
6488+
this.hitLinkElement,
6489+
this.scene.getNonDeletedElementsMap(),
6490+
this.state,
6491+
pointFrom(scenePointer.x, scenePointer.y),
6492+
)
6493+
) {
6494+
showHyperlinkTooltip(
6495+
this.hitLinkElement,
6496+
this.state,
6497+
this.scene.getNonDeletedElementsMap(),
6498+
);
6499+
}
6500+
} else {
6501+
hideHyperlinkToolip();
6502+
setCursor(this.interactiveCanvas, CURSOR_TYPE.AUTO);
6503+
}
6504+
64696505
return false;
64706506
}
64716507

packages/excalidraw/renderer/interactiveScene.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1277,7 +1277,8 @@ const _renderInteractiveScene = ({
12771277
if (
12781278
!appState.multiElement &&
12791279
!appState.newElement &&
1280-
!appState.selectedLinearElement?.isEditing
1280+
!appState.selectedLinearElement?.isEditing &&
1281+
app.props.interactive !== false
12811282
) {
12821283
const showBoundingBox = hasBoundingBox(
12831284
selectedElements,

0 commit comments

Comments
 (0)