Skip to content

Commit 41571ea

Browse files
feat(front-component-renderer): forward offset/movement coordinates on serialised events (#20046)
## Summary Adds `offsetX`, `offsetY`, `movementX`, `movementY` to `SerializedEventData` and the host event serialiser so apps can reason about element-relative pointer positions without trying to read the host element's bounding rect (which is impossible from a remote-DOM worker). ## Motivation I was building a front-component with click-to-drop-pin and trackpad pan/zoom (custom OSM tile renderer). Two real bugs surfaced from the current event-serialisation surface: 1. **Wheel pan/zoom was broken.** The host already forwards `deltaX`/`deltaY`, but app authors naturally read them off the React-style event handler argument as `e.deltaX`/`e.deltaY`. Because remote-DOM bridges everything via `RemoteEvent extends CustomEvent<Detail>`, the payload actually arrives at `e.detail.deltaX`. Reading the wrong place gives `undefined`, and `undefined < 0 === false`, so every wheel notch zoomed in the same direction. App code now uses `e.detail`, but this was a sharp papercut worth flagging in docs / a helper (separate change). 2. **Element-local click coords are unobtainable from a worker.** With only `clientX/Y`, an app needs the stage's bounding rect to translate viewport coordinates to local — which can't be read across the worker boundary. `offsetX`/`offsetY` close that gap with a one-read solution. `movementX`/`movementY` round out the set for any future drag-style interactions if `mousemove` later joins the allow-list.
1 parent 570038a commit 41571ea

2 files changed

Lines changed: 10 additions & 0 deletions

File tree

packages/twenty-front-component-renderer/src/constants/SerializedEventData.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ export type SerializedEventData = {
1010
pageY?: number;
1111
screenX?: number;
1212
screenY?: number;
13+
offsetX?: number;
14+
offsetY?: number;
15+
movementX?: number;
16+
movementY?: number;
1317
button?: number;
1418
buttons?: number;
1519
key?: string;

packages/twenty-front-component-renderer/src/host/utils/createHtmlHostWrapper.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,12 @@ const serializeEvent = (event: unknown): SerializedEventData => {
8181
if ('pageY' in domEvent) serialized.pageY = domEvent.pageY as number;
8282
if ('screenX' in domEvent) serialized.screenX = domEvent.screenX as number;
8383
if ('screenY' in domEvent) serialized.screenY = domEvent.screenY as number;
84+
if ('offsetX' in domEvent) serialized.offsetX = domEvent.offsetX as number;
85+
if ('offsetY' in domEvent) serialized.offsetY = domEvent.offsetY as number;
86+
if ('movementX' in domEvent)
87+
serialized.movementX = domEvent.movementX as number;
88+
if ('movementY' in domEvent)
89+
serialized.movementY = domEvent.movementY as number;
8490
if ('button' in domEvent) serialized.button = domEvent.button as number;
8591
if ('buttons' in domEvent) serialized.buttons = domEvent.buttons as number;
8692

0 commit comments

Comments
 (0)