feat(input): add DOM event command adapters

This commit is contained in:
syntaxbullet
2026-07-03 09:37:25 +02:00
parent 91436086a8
commit dd1b892034
3 changed files with 67 additions and 0 deletions

42
input/dom.ts Normal file
View File

@@ -0,0 +1,42 @@
import type { KeybindEvent } from "./keyboard";
import type { PointerInputEvent, WheelInputEvent } from "./pointer";
export function keybindEventFromKeyboardEvent(event: KeyboardEvent): KeybindEvent {
return {
key: event.key,
code: event.code,
altKey: event.altKey,
ctrlKey: event.ctrlKey,
metaKey: event.metaKey,
shiftKey: event.shiftKey,
};
}
function normalizePointerType(pointerType: string): PointerInputEvent["pointerType"] {
if (pointerType === "pen" || pointerType === "touch") return pointerType;
return "mouse";
}
export function pointerInputEventFromPointerEvent(event: PointerEvent): PointerInputEvent {
return {
pointerId: event.pointerId,
pointerType: normalizePointerType(event.pointerType),
position: { x: event.offsetX, y: event.offsetY },
buttons: event.buttons,
altKey: event.altKey,
ctrlKey: event.ctrlKey,
metaKey: event.metaKey,
shiftKey: event.shiftKey,
};
}
export function wheelInputEventFromWheelEvent(event: WheelEvent): WheelInputEvent {
return {
position: { x: event.offsetX, y: event.offsetY },
delta: { x: event.deltaX, y: event.deltaY },
altKey: event.altKey,
ctrlKey: event.ctrlKey,
metaKey: event.metaKey,
shiftKey: event.shiftKey,
};
}

View File

@@ -1,3 +1,9 @@
export {
keybindEventFromKeyboardEvent,
pointerInputEventFromPointerEvent,
wheelInputEventFromWheelEvent,
} from "./dom";
export type { CommandKeybind, GlobalKeybindConsumer, Keybind, KeybindEvent, KeybindMap } from "./keyboard"; export type { CommandKeybind, GlobalKeybindConsumer, Keybind, KeybindEvent, KeybindMap } from "./keyboard";
export { handleKeybind, keybindFromEvent } from "./keyboard"; export { handleKeybind, keybindFromEvent } from "./keyboard";
export type { GlobalPointerConsumer, GlobalWheelConsumer, PointerInputEvent, WheelInputEvent } from "./pointer"; export type { GlobalPointerConsumer, GlobalWheelConsumer, PointerInputEvent, WheelInputEvent } from "./pointer";
export { handleViewportWheel } from "./viewport";

19
input/viewport.ts Normal file
View File

@@ -0,0 +1,19 @@
import type { Dispatch } from "@commands/dispatcher";
import type { GlobalWheelConsumer, WheelInputEvent } from "./pointer";
export function handleViewportWheel(options: {
event: WheelInputEvent;
globalConsumer: GlobalWheelConsumer;
dispatch: Dispatch;
currentZoom: number;
}): boolean {
if (options.globalConsumer(options.event)) return true;
const zoomFactor = Math.exp(-options.event.delta.y * 0.001);
options.dispatch("viewport.zoomAroundPoint", {
zoom: options.currentZoom * zoomFactor,
point: options.event.position,
});
return true;
}