@vibes.diy/vibe-runtime 14.3.168 → 14.3.173

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,44 @@
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
2
+ import { lazySeam } from "./lazy-seam.js";
3
+ export const worldControlsSeam = lazySeam(() => import("./world-controls.js"));
4
+ function detectTouch() {
5
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function")
6
+ return false;
7
+ return (window.matchMedia("(pointer: coarse)").matches ||
8
+ ("ontouchstart" in window && window.matchMedia("(hover: hover)").matches === false));
9
+ }
10
+ export function useWorldControls(rootRef, options) {
11
+ const optionsRef = useRef(options);
12
+ optionsRef.current = options;
13
+ const [locked, setLocked] = useState(false);
14
+ const [isTouch, setTouch] = useState(detectTouch);
15
+ const [keys] = useState(() => new Set());
16
+ const attached = useRef(undefined);
17
+ useEffect(() => {
18
+ const el = rootRef.current;
19
+ if (el === null)
20
+ return;
21
+ let live = true;
22
+ worldControlsSeam.run((m) => {
23
+ if (live === false)
24
+ return;
25
+ attached.current = m.attachWorldControls({ el, options: optionsRef, sink: { keys, setLocked, setTouch } });
26
+ });
27
+ return () => {
28
+ live = false;
29
+ attached.current?.detach();
30
+ attached.current = undefined;
31
+ };
32
+ }, [rootRef, keys]);
33
+ const tick = useCallback((dt) => {
34
+ attached.current?.tick(dt);
35
+ }, []);
36
+ const requestLock = useCallback(() => {
37
+ const el = rootRef.current;
38
+ if (el === null || typeof el.requestPointerLock !== "function")
39
+ return;
40
+ void Promise.resolve(el.requestPointerLock()).catch(() => undefined);
41
+ }, [rootRef]);
42
+ return useMemo(() => ({ isTouch, locked, requestLock, keys, tick }), [isTouch, locked, requestLock, keys, tick]);
43
+ }
44
+ //# sourceMappingURL=use-world-controls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-world-controls.js","sourceRoot":"","sources":["../jsr/use-world-controls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { UseWorldControlsOptions, WorldControlsTune } from "./use-world-controls.js";
2
+ interface DesktopArgs {
3
+ readonly el: HTMLElement;
4
+ readonly options: {
5
+ readonly current: UseWorldControlsOptions;
6
+ };
7
+ readonly sink: {
8
+ readonly keys: Set<string>;
9
+ setLocked(locked: boolean): void;
10
+ };
11
+ }
12
+ export declare function isElement(t: EventTarget | null): t is Element;
13
+ export declare function onOwnControl(el: HTMLElement, target: EventTarget | null): boolean;
14
+ export declare function attachDesktopControls(args: DesktopArgs & {
15
+ readonly defaults: WorldControlsTune;
16
+ }): {
17
+ detach(): void;
18
+ };
19
+ export {};
@@ -0,0 +1,219 @@
1
+ import { exception2Result } from "@adviser/cement";
2
+ const CLICK_SLOP_PX = 6;
3
+ const CLAIMED_KEYS = new Set([
4
+ "KeyW",
5
+ "KeyA",
6
+ "KeyS",
7
+ "KeyD",
8
+ "ArrowUp",
9
+ "ArrowDown",
10
+ "ArrowLeft",
11
+ "ArrowRight",
12
+ "Space",
13
+ "ShiftLeft",
14
+ "ShiftRight",
15
+ ]);
16
+ const TYPING = 'input, textarea, select, [contenteditable]:not([contenteditable="false"]), [role=textbox]';
17
+ function isTyping(focused) {
18
+ if ("isContentEditable" in focused && focused.isContentEditable === true)
19
+ return true;
20
+ return focused.closest(TYPING) !== null;
21
+ }
22
+ function keyboardIsOurs(el) {
23
+ if (document.pointerLockElement === el)
24
+ return true;
25
+ const focused = document.activeElement;
26
+ if (focused !== null && isTyping(focused))
27
+ return false;
28
+ return focused === null || focused === document.body || focused === document.documentElement || el.contains(focused);
29
+ }
30
+ const OWN_CONTROLS = "button, input, textarea, select, a[href], [role=button], [contenteditable=true], [data-world-controls-ignore]";
31
+ export function isElement(t) {
32
+ return t !== null && "closest" in t && typeof t.closest === "function";
33
+ }
34
+ export function onOwnControl(el, target) {
35
+ if (isElement(target) === false)
36
+ return false;
37
+ const control = target.closest(OWN_CONTROLS);
38
+ return control !== null && control !== el && el.contains(control);
39
+ }
40
+ function held(keys, codes) {
41
+ return codes.some((c) => keys.has(c)) ? 1 : 0;
42
+ }
43
+ function moveFromKeys(keys) {
44
+ const x = held(keys, ["KeyD", "ArrowRight"]) - held(keys, ["KeyA", "ArrowLeft"]);
45
+ const y = held(keys, ["KeyS", "ArrowDown"]) - held(keys, ["KeyW", "ArrowUp"]);
46
+ const len = Math.hypot(x, y);
47
+ return len === 0 ? { x: 0, y: 0 } : { x: x / len, y: y / len };
48
+ }
49
+ function tuneOf(options, defaults) {
50
+ return { ...defaults, ...options.tune };
51
+ }
52
+ export function attachDesktopControls(args) {
53
+ const { el, options, sink } = args;
54
+ const keys = sink.keys;
55
+ const claimed = new Set();
56
+ let moving = { x: 0, y: 0 };
57
+ function opts() {
58
+ return options.current;
59
+ }
60
+ function emitMove() {
61
+ const next = moveFromKeys(keys);
62
+ if (next.x === moving.x && next.y === moving.y)
63
+ return;
64
+ moving = next;
65
+ opts().onMove?.(next.x, next.y);
66
+ }
67
+ function clearKeys() {
68
+ const had = [...keys];
69
+ keys.clear();
70
+ claimed.clear();
71
+ for (const code of had)
72
+ opts().onKey?.(code, false);
73
+ emitMove();
74
+ }
75
+ function isLocked() {
76
+ return document.pointerLockElement === el;
77
+ }
78
+ function onKeyDown(e) {
79
+ if (e.metaKey || e.ctrlKey || e.altKey) {
80
+ clearKeys();
81
+ return;
82
+ }
83
+ if (keyboardIsOurs(el) === false)
84
+ return;
85
+ if (e.repeat === false) {
86
+ keys.add(e.code);
87
+ if (opts().onKey?.(e.code, true) === true)
88
+ claimed.add(e.code);
89
+ emitMove();
90
+ }
91
+ if (CLAIMED_KEYS.has(e.code) || claimed.has(e.code))
92
+ e.preventDefault();
93
+ }
94
+ function onKeyUp(e) {
95
+ if (keys.delete(e.code) === false)
96
+ return;
97
+ claimed.delete(e.code);
98
+ opts().onKey?.(e.code, false);
99
+ emitMove();
100
+ }
101
+ function onMouseMove(e) {
102
+ if (isLocked() === false)
103
+ return;
104
+ const t = tuneOf(opts(), args.defaults);
105
+ const mx = Math.max(-t.mouseSpikePx, Math.min(t.mouseSpikePx, e.movementX));
106
+ const my = Math.max(-t.mouseSpikePx, Math.min(t.mouseSpikePx, e.movementY));
107
+ if (mx === 0 && my === 0)
108
+ return;
109
+ opts().onLook?.(mx * t.mouseSpeed, my * t.mouseSpeed);
110
+ }
111
+ function onLockChange() {
112
+ sink.setLocked(isLocked());
113
+ if (isLocked() === false)
114
+ clearKeys();
115
+ }
116
+ let drag;
117
+ function onPointerDown(e) {
118
+ if (e.pointerType !== "mouse")
119
+ return;
120
+ if (isLocked()) {
121
+ const r = el.getBoundingClientRect();
122
+ const cx = r.left + r.width / 2;
123
+ const cy = r.top + r.height / 2;
124
+ if (e.button === 0)
125
+ opts().onTap?.(cx, cy);
126
+ else if (e.button === 2)
127
+ opts().onHold?.(cx, cy);
128
+ return;
129
+ }
130
+ if (opts().mode !== "free")
131
+ return;
132
+ if (e.button !== 0 && e.button !== 2)
133
+ return;
134
+ if (onOwnControl(el, e.target))
135
+ return;
136
+ drag = { x: e.clientX, y: e.clientY, lastX: e.clientX, lastY: e.clientY, t: e.timeStamp, button: e.button, moved: false };
137
+ exception2Result(() => el.setPointerCapture(e.pointerId));
138
+ }
139
+ function onPointerMove(e) {
140
+ if (e.pointerType !== "mouse" || drag === undefined)
141
+ return;
142
+ const dx = e.clientX - drag.lastX;
143
+ const dy = e.clientY - drag.lastY;
144
+ drag.lastX = e.clientX;
145
+ drag.lastY = e.clientY;
146
+ if (Math.abs(e.clientX - drag.x) + Math.abs(e.clientY - drag.y) > CLICK_SLOP_PX)
147
+ drag.moved = true;
148
+ if (drag.moved === false || (dx === 0 && dy === 0))
149
+ return;
150
+ const k = tuneOf(opts(), args.defaults).orbitSpeed;
151
+ opts().onLook?.(dx * k, dy * k);
152
+ }
153
+ function onPointerUp(e) {
154
+ if (e.pointerType !== "mouse" || drag === undefined)
155
+ return;
156
+ const d = drag;
157
+ drag = undefined;
158
+ if (e.type !== "pointerup" || d.moved || opts().mode !== "free")
159
+ return;
160
+ const long = e.timeStamp - d.t >= tuneOf(opts(), args.defaults).holdMs;
161
+ if (d.button === 2 || long)
162
+ opts().onHold?.(e.clientX, e.clientY);
163
+ else
164
+ opts().onTap?.(e.clientX, e.clientY);
165
+ }
166
+ function onContextMenu(e) {
167
+ if (opts().mode === "free" || isLocked())
168
+ e.preventDefault();
169
+ }
170
+ function onFocusIn(e) {
171
+ if (isElement(e.target) && isTyping(e.target))
172
+ clearKeys();
173
+ }
174
+ function onBlur() {
175
+ drag = undefined;
176
+ clearKeys();
177
+ }
178
+ function onWheel(e) {
179
+ if (opts().mode !== "free" || e.deltaY === 0)
180
+ return;
181
+ e.preventDefault();
182
+ opts().onPinch?.(1 + Math.sign(e.deltaY) * tuneOf(opts(), args.defaults).wheelStep);
183
+ }
184
+ el.addEventListener("wheel", onWheel, { passive: false });
185
+ el.addEventListener("pointerdown", onPointerDown);
186
+ el.addEventListener("pointermove", onPointerMove);
187
+ el.addEventListener("pointerup", onPointerUp);
188
+ el.addEventListener("pointercancel", onPointerUp);
189
+ el.addEventListener("contextmenu", onContextMenu);
190
+ document.addEventListener("focusin", onFocusIn);
191
+ document.addEventListener("mousemove", onMouseMove);
192
+ document.addEventListener("pointerlockchange", onLockChange);
193
+ window.addEventListener("keydown", onKeyDown);
194
+ window.addEventListener("keyup", onKeyUp);
195
+ window.addEventListener("blur", onBlur);
196
+ if (isLocked())
197
+ sink.setLocked(true);
198
+ return {
199
+ detach() {
200
+ el.removeEventListener("wheel", onWheel);
201
+ el.removeEventListener("pointerdown", onPointerDown);
202
+ el.removeEventListener("pointermove", onPointerMove);
203
+ el.removeEventListener("pointerup", onPointerUp);
204
+ el.removeEventListener("pointercancel", onPointerUp);
205
+ el.removeEventListener("contextmenu", onContextMenu);
206
+ document.removeEventListener("focusin", onFocusIn);
207
+ document.removeEventListener("mousemove", onMouseMove);
208
+ document.removeEventListener("pointerlockchange", onLockChange);
209
+ window.removeEventListener("keydown", onKeyDown);
210
+ window.removeEventListener("keyup", onKeyUp);
211
+ window.removeEventListener("blur", onBlur);
212
+ keys.clear();
213
+ claimed.clear();
214
+ if (isLocked())
215
+ document.exitPointerLock();
216
+ },
217
+ };
218
+ }
219
+ //# sourceMappingURL=world-controls-desktop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world-controls-desktop.js","sourceRoot":"","sources":["../jsr/world-controls-desktop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { UseWorldControlsOptions, WorldControlsTune } from "./use-world-controls.js";
2
+ export declare const WORLD_CONTROLS_TUNE: WorldControlsTune;
3
+ export interface WorldControlsSink {
4
+ readonly keys: Set<string>;
5
+ setLocked(locked: boolean): void;
6
+ setTouch(touch: boolean): void;
7
+ }
8
+ export interface AttachWorldControlsArgs {
9
+ readonly el: HTMLElement;
10
+ readonly options: {
11
+ readonly current: UseWorldControlsOptions;
12
+ };
13
+ readonly sink: WorldControlsSink;
14
+ }
15
+ export interface WorldControlsAttached {
16
+ tick(dt: number): void;
17
+ detach(): void;
18
+ }
19
+ export declare function fovFor(size: {
20
+ readonly width: number;
21
+ readonly height: number;
22
+ }): number;
23
+ export declare function tuneOf(options: UseWorldControlsOptions): WorldControlsTune;
24
+ export declare function attachWorldControls(args: AttachWorldControlsArgs): WorldControlsAttached;