@kgdiff/renderer 0.0.0-stage → 0.1.0
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.
- package/LICENSE +21 -0
- package/README.md +53 -2
- package/dist/atlas.d.ts +55 -0
- package/dist/atlas.d.ts.map +1 -0
- package/dist/atlas.js +132 -0
- package/dist/atlas.js.map +1 -0
- package/dist/camera.d.ts +116 -0
- package/dist/camera.d.ts.map +1 -0
- package/dist/camera.js +368 -0
- package/dist/camera.js.map +1 -0
- package/dist/color.d.ts +12 -0
- package/dist/color.d.ts.map +1 -0
- package/dist/color.js +51 -0
- package/dist/color.js.map +1 -0
- package/dist/ctx.d.ts +57 -0
- package/dist/ctx.d.ts.map +1 -0
- package/dist/ctx.js +28 -0
- package/dist/ctx.js.map +1 -0
- package/dist/draw/background.d.ts +33 -0
- package/dist/draw/background.d.ts.map +1 -0
- package/dist/draw/background.js +105 -0
- package/dist/draw/background.js.map +1 -0
- package/dist/draw/badges.d.ts +26 -0
- package/dist/draw/badges.d.ts.map +1 -0
- package/dist/draw/badges.js +82 -0
- package/dist/draw/badges.js.map +1 -0
- package/dist/draw/collapsed.d.ts +15 -0
- package/dist/draw/collapsed.d.ts.map +1 -0
- package/dist/draw/collapsed.js +67 -0
- package/dist/draw/collapsed.js.map +1 -0
- package/dist/draw/edges.d.ts +14 -0
- package/dist/draw/edges.d.ts.map +1 -0
- package/dist/draw/edges.js +115 -0
- package/dist/draw/edges.js.map +1 -0
- package/dist/draw/glyphs.d.ts +31 -0
- package/dist/draw/glyphs.d.ts.map +1 -0
- package/dist/draw/glyphs.js +114 -0
- package/dist/draw/glyphs.js.map +1 -0
- package/dist/draw/halos.d.ts +19 -0
- package/dist/draw/halos.d.ts.map +1 -0
- package/dist/draw/halos.js +91 -0
- package/dist/draw/halos.js.map +1 -0
- package/dist/draw/labels.d.ts +55 -0
- package/dist/draw/labels.d.ts.map +1 -0
- package/dist/draw/labels.js +300 -0
- package/dist/draw/labels.js.map +1 -0
- package/dist/draw/link.d.ts +25 -0
- package/dist/draw/link.d.ts.map +1 -0
- package/dist/draw/link.js +122 -0
- package/dist/draw/link.js.map +1 -0
- package/dist/draw/nodes.d.ts +13 -0
- package/dist/draw/nodes.d.ts.map +1 -0
- package/dist/draw/nodes.js +165 -0
- package/dist/draw/nodes.js.map +1 -0
- package/dist/draw/shapes.d.ts +7 -0
- package/dist/draw/shapes.d.ts.map +1 -0
- package/dist/draw/shapes.js +26 -0
- package/dist/draw/shapes.js.map +1 -0
- package/dist/draw/view.d.ts +36 -0
- package/dist/draw/view.d.ts.map +1 -0
- package/dist/draw/view.js +16 -0
- package/dist/draw/view.js.map +1 -0
- package/dist/frame-cache.d.ts +103 -0
- package/dist/frame-cache.d.ts.map +1 -0
- package/dist/frame-cache.js +349 -0
- package/dist/frame-cache.js.map +1 -0
- package/dist/index.d.ts +162 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/input.d.ts +81 -0
- package/dist/input.d.ts.map +1 -0
- package/dist/input.js +329 -0
- package/dist/input.js.map +1 -0
- package/dist/labels.d.ts +103 -0
- package/dist/labels.d.ts.map +1 -0
- package/dist/labels.js +203 -0
- package/dist/labels.js.map +1 -0
- package/dist/math.d.ts +33 -0
- package/dist/math.d.ts.map +1 -0
- package/dist/math.js +138 -0
- package/dist/math.js.map +1 -0
- package/dist/minimap.d.ts +56 -0
- package/dist/minimap.d.ts.map +1 -0
- package/dist/minimap.js +501 -0
- package/dist/minimap.js.map +1 -0
- package/dist/paint-stats.d.ts +17 -0
- package/dist/paint-stats.d.ts.map +1 -0
- package/dist/paint-stats.js +23 -0
- package/dist/paint-stats.js.map +1 -0
- package/dist/paint.d.ts +64 -0
- package/dist/paint.d.ts.map +1 -0
- package/dist/paint.js +197 -0
- package/dist/paint.js.map +1 -0
- package/dist/pick.d.ts +26 -0
- package/dist/pick.d.ts.map +1 -0
- package/dist/pick.js +125 -0
- package/dist/pick.js.map +1 -0
- package/dist/renderer.d.ts +28 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +470 -0
- package/dist/renderer.js.map +1 -0
- package/dist/smooth-zoom.d.ts +21 -0
- package/dist/smooth-zoom.d.ts.map +1 -0
- package/dist/smooth-zoom.js +52 -0
- package/dist/smooth-zoom.js.map +1 -0
- package/dist/spatial.d.ts +26 -0
- package/dist/spatial.d.ts.map +1 -0
- package/dist/spatial.js +103 -0
- package/dist/spatial.js.map +1 -0
- package/dist/text.d.ts +36 -0
- package/dist/text.d.ts.map +1 -0
- package/dist/text.js +123 -0
- package/dist/text.js.map +1 -0
- package/package.json +47 -3
- package/src/atlas.ts +171 -0
- package/src/camera.ts +482 -0
- package/src/color.ts +58 -0
- package/src/ctx.ts +102 -0
- package/src/draw/background.ts +139 -0
- package/src/draw/badges.ts +93 -0
- package/src/draw/collapsed.ts +86 -0
- package/src/draw/edges.ts +135 -0
- package/src/draw/glyphs.ts +168 -0
- package/src/draw/halos.ts +101 -0
- package/src/draw/labels.ts +399 -0
- package/src/draw/link.ts +157 -0
- package/src/draw/nodes.ts +184 -0
- package/src/draw/shapes.ts +36 -0
- package/src/draw/view.ts +37 -0
- package/src/frame-cache.ts +382 -0
- package/src/index.ts +161 -0
- package/src/input.ts +370 -0
- package/src/labels.ts +269 -0
- package/src/math.ts +185 -0
- package/src/minimap.ts +545 -0
- package/src/paint-stats.ts +38 -0
- package/src/paint.ts +235 -0
- package/src/pick.ts +173 -0
- package/src/renderer.ts +539 -0
- package/src/smooth-zoom.ts +65 -0
- package/src/spatial.ts +94 -0
- package/src/text.ts +130 -0
package/dist/input.js
ADDED
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { clamp } from './math.js';
|
|
2
|
+
/** A press that moves less than this (px) is a click, not a drag. */
|
|
3
|
+
export const DRAG_THRESHOLD = 4;
|
|
4
|
+
/** Wheel events closer than this (ms) belong to one gesture and keep its classification. */
|
|
5
|
+
export const WHEEL_GESTURE_GAP = 160;
|
|
6
|
+
/** Minimum release speed (px/ms) that starts an inertial glide. */
|
|
7
|
+
export const GLIDE_START_SPEED = 0.1;
|
|
8
|
+
/** Release speeds are capped (px/ms) so a jittery flick cannot fling the graph away. */
|
|
9
|
+
export const GLIDE_MAX_SPEED = 6;
|
|
10
|
+
/** macOS mouse wheels report multiples of this delta (with acceleration). */
|
|
11
|
+
const MAC_WHEEL_STEP = 4.000244140625;
|
|
12
|
+
export function createWheelMemory() {
|
|
13
|
+
return { last: Number.NEGATIVE_INFINITY, intent: null };
|
|
14
|
+
}
|
|
15
|
+
function isMacWheelStep(a) {
|
|
16
|
+
const n = a / MAC_WHEEL_STEP;
|
|
17
|
+
return n >= 1 && Math.abs(n - Math.round(n)) < 1e-6;
|
|
18
|
+
}
|
|
19
|
+
/** Whether a vertical pixel delta looks like a discrete mouse-wheel notch. */
|
|
20
|
+
export function isNotchDelta(deltaY) {
|
|
21
|
+
const a = Math.abs(deltaY);
|
|
22
|
+
if (a === 0)
|
|
23
|
+
return false;
|
|
24
|
+
return isMacWheelStep(a) || (a >= 50 && Number.isInteger(a));
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Classify a wheel event. Events of one gesture keep the first event's intent, because a
|
|
28
|
+
* fast trackpad flick can produce large integer deltas that look like a mouse notch.
|
|
29
|
+
*/
|
|
30
|
+
export function classifyWheel(e, memory, now) {
|
|
31
|
+
let intent;
|
|
32
|
+
if (e.ctrlKey || e.metaKey) {
|
|
33
|
+
intent = e.deltaMode !== 0 || isNotchDelta(e.deltaY) ? 'notch' : 'pinch';
|
|
34
|
+
}
|
|
35
|
+
else if (memory.intent !== null &&
|
|
36
|
+
memory.intent !== 'pinch' &&
|
|
37
|
+
now - memory.last < WHEEL_GESTURE_GAP) {
|
|
38
|
+
intent = memory.intent;
|
|
39
|
+
}
|
|
40
|
+
else if (e.deltaMode !== 0) {
|
|
41
|
+
intent = 'notch';
|
|
42
|
+
}
|
|
43
|
+
else if (e.deltaX !== 0) {
|
|
44
|
+
intent = 'pan';
|
|
45
|
+
}
|
|
46
|
+
else if (e.wheelDeltaY !== undefined && e.wheelDeltaY !== 0) {
|
|
47
|
+
intent = e.wheelDeltaY === -3 * e.deltaY ? 'pan' : 'notch';
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
intent = isNotchDelta(e.deltaY) ? 'notch' : 'pan';
|
|
51
|
+
}
|
|
52
|
+
memory.last = now;
|
|
53
|
+
memory.intent = intent;
|
|
54
|
+
return intent;
|
|
55
|
+
}
|
|
56
|
+
/** Wheel deltas in css px (line and page modes converted). */
|
|
57
|
+
export function wheelPixels(e, pageHeight) {
|
|
58
|
+
const m = e.deltaMode === 1 ? 16 : e.deltaMode === 2 ? Math.max(pageHeight, 1) : 1;
|
|
59
|
+
return { x: e.deltaX * m, y: e.deltaY * m };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Zoom factor for a vertical wheel delta (px). Pinch deltas follow the native pinch scale
|
|
63
|
+
* (`exp(−dy / 100)`); notches zoom ≈ 1.33× per 100 px notch, macOS steps ≈ 1.1× each.
|
|
64
|
+
*/
|
|
65
|
+
export function wheelZoomFactor(intent, deltaY) {
|
|
66
|
+
if (intent === 'pinch')
|
|
67
|
+
return Math.exp(-clamp(deltaY, -50, 50) / 100);
|
|
68
|
+
const a = Math.abs(deltaY);
|
|
69
|
+
const dy = isMacWheelStep(a) ? Math.sign(deltaY) * Math.round(a / MAC_WHEEL_STEP) * 33 : deltaY;
|
|
70
|
+
return 2 ** (-clamp(dy, -240, 240) / 240);
|
|
71
|
+
}
|
|
72
|
+
/** Release velocity from the last ~100 ms of pointer samples (ring buffer, allocation-free). */
|
|
73
|
+
export class VelocityTracker {
|
|
74
|
+
t = new Float64Array(8);
|
|
75
|
+
x = new Float64Array(8);
|
|
76
|
+
y = new Float64Array(8);
|
|
77
|
+
n = 0;
|
|
78
|
+
head = 0;
|
|
79
|
+
reset() {
|
|
80
|
+
this.n = 0;
|
|
81
|
+
this.head = 0;
|
|
82
|
+
}
|
|
83
|
+
add(t, x, y) {
|
|
84
|
+
this.t[this.head] = t;
|
|
85
|
+
this.x[this.head] = x;
|
|
86
|
+
this.y[this.head] = y;
|
|
87
|
+
this.head = (this.head + 1) % 8;
|
|
88
|
+
if (this.n < 8)
|
|
89
|
+
this.n++;
|
|
90
|
+
}
|
|
91
|
+
/** px/ms; zero when the pointer rested for more than 50 ms before `now`. */
|
|
92
|
+
velocity(now, window = 100) {
|
|
93
|
+
if (this.n < 2)
|
|
94
|
+
return { x: 0, y: 0 };
|
|
95
|
+
const newest = (this.head + 7) % 8;
|
|
96
|
+
const tn = this.t[newest] ?? 0;
|
|
97
|
+
if (now - tn > 50)
|
|
98
|
+
return { x: 0, y: 0 };
|
|
99
|
+
let oldest = newest;
|
|
100
|
+
for (let i = 1; i < this.n; i++) {
|
|
101
|
+
const j = (newest - i + 8) % 8;
|
|
102
|
+
if (tn - (this.t[j] ?? 0) > window)
|
|
103
|
+
break;
|
|
104
|
+
oldest = j;
|
|
105
|
+
}
|
|
106
|
+
const dt = tn - (this.t[oldest] ?? 0);
|
|
107
|
+
if (dt <= 0)
|
|
108
|
+
return { x: 0, y: 0 };
|
|
109
|
+
let vx = ((this.x[newest] ?? 0) - (this.x[oldest] ?? 0)) / dt;
|
|
110
|
+
let vy = ((this.y[newest] ?? 0) - (this.y[oldest] ?? 0)) / dt;
|
|
111
|
+
const speed = Math.hypot(vx, vy);
|
|
112
|
+
if (speed > GLIDE_MAX_SPEED) {
|
|
113
|
+
vx *= GLIDE_MAX_SPEED / speed;
|
|
114
|
+
vy *= GLIDE_MAX_SPEED / speed;
|
|
115
|
+
}
|
|
116
|
+
return { x: vx, y: vy };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/** Wire input listeners on `el`; returns a function that removes all of them. */
|
|
120
|
+
export function attachInput(el, host) {
|
|
121
|
+
const pointers = new Map();
|
|
122
|
+
const tracker = new VelocityTracker();
|
|
123
|
+
const wheelMemory = createWheelMemory();
|
|
124
|
+
let downX = 0;
|
|
125
|
+
let downY = 0;
|
|
126
|
+
let lastX = 0;
|
|
127
|
+
let lastY = 0;
|
|
128
|
+
let dragging = false;
|
|
129
|
+
/** The gesture involved two pointers: never a click, no inertia. */
|
|
130
|
+
let multi = false;
|
|
131
|
+
let pinchX = 0;
|
|
132
|
+
let pinchY = 0;
|
|
133
|
+
let pinchD = 0;
|
|
134
|
+
let gesture = false;
|
|
135
|
+
let gestureScale = 1;
|
|
136
|
+
const local = (e) => {
|
|
137
|
+
const r = el.getBoundingClientRect();
|
|
138
|
+
return [e.clientX - r.left, e.clientY - r.top];
|
|
139
|
+
};
|
|
140
|
+
const pinchState = () => {
|
|
141
|
+
const it = pointers.values();
|
|
142
|
+
const a = it.next().value;
|
|
143
|
+
const b = it.next().value;
|
|
144
|
+
if (!a || !b)
|
|
145
|
+
return [0, 0, 0];
|
|
146
|
+
return [(a.x + b.x) / 2, (a.y + b.y) / 2, Math.hypot(a.x - b.x, a.y - b.y)];
|
|
147
|
+
};
|
|
148
|
+
const beginPinch = () => {
|
|
149
|
+
[pinchX, pinchY, pinchD] = pinchState();
|
|
150
|
+
};
|
|
151
|
+
const onDown = (e) => {
|
|
152
|
+
if (e.pointerType === 'mouse' && e.button !== 0 && e.button !== 1)
|
|
153
|
+
return;
|
|
154
|
+
if (e.button === 1)
|
|
155
|
+
e.preventDefault();
|
|
156
|
+
const [x, y] = local(e);
|
|
157
|
+
try {
|
|
158
|
+
el.setPointerCapture(e.pointerId);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// Capture is best effort (synthetic events, detached elements).
|
|
162
|
+
}
|
|
163
|
+
pointers.set(e.pointerId, { x, y });
|
|
164
|
+
host.camera.interrupt();
|
|
165
|
+
if (pointers.size === 1) {
|
|
166
|
+
downX = lastX = x;
|
|
167
|
+
downY = lastY = y;
|
|
168
|
+
dragging = false;
|
|
169
|
+
multi = false;
|
|
170
|
+
tracker.reset();
|
|
171
|
+
tracker.add(host.now(), x, y);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
multi = true;
|
|
175
|
+
beginPinch();
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
const onMove = (e) => {
|
|
179
|
+
const [x, y] = local(e);
|
|
180
|
+
const p = pointers.get(e.pointerId);
|
|
181
|
+
if (!p) {
|
|
182
|
+
if (pointers.size === 0)
|
|
183
|
+
host.hover(x, y);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
p.x = x;
|
|
187
|
+
p.y = y;
|
|
188
|
+
if (pointers.size >= 2) {
|
|
189
|
+
const [cx, cy, d] = pinchState();
|
|
190
|
+
if (pinchD > 0 && d > 0)
|
|
191
|
+
host.camera.zoomNow(d / pinchD, cx, cy);
|
|
192
|
+
host.camera.panNow(cx - pinchX, cy - pinchY);
|
|
193
|
+
pinchX = cx;
|
|
194
|
+
pinchY = cy;
|
|
195
|
+
pinchD = d;
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
if (!dragging) {
|
|
199
|
+
if (Math.hypot(x - downX, y - downY) < DRAG_THRESHOLD)
|
|
200
|
+
return;
|
|
201
|
+
dragging = true;
|
|
202
|
+
host.dragging(true);
|
|
203
|
+
}
|
|
204
|
+
host.camera.panNow(x - lastX, y - lastY);
|
|
205
|
+
lastX = x;
|
|
206
|
+
lastY = y;
|
|
207
|
+
tracker.add(host.now(), x, y);
|
|
208
|
+
};
|
|
209
|
+
const onUp = (e) => {
|
|
210
|
+
if (!pointers.delete(e.pointerId))
|
|
211
|
+
return;
|
|
212
|
+
const [x, y] = local(e);
|
|
213
|
+
if (pointers.size === 1) {
|
|
214
|
+
// Pinch → one finger left: keep panning with it from where it is.
|
|
215
|
+
const rest = pointers.values().next().value;
|
|
216
|
+
if (rest) {
|
|
217
|
+
lastX = rest.x;
|
|
218
|
+
lastY = rest.y;
|
|
219
|
+
}
|
|
220
|
+
tracker.reset();
|
|
221
|
+
if (!dragging) {
|
|
222
|
+
dragging = true;
|
|
223
|
+
host.dragging(true);
|
|
224
|
+
}
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
if (pointers.size > 1) {
|
|
228
|
+
beginPinch();
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
const cancelled = e.type === 'pointercancel';
|
|
232
|
+
if (dragging) {
|
|
233
|
+
host.dragging(false);
|
|
234
|
+
if (!cancelled && !multi) {
|
|
235
|
+
const v = tracker.velocity(host.now());
|
|
236
|
+
if (Math.hypot(v.x, v.y) > GLIDE_START_SPEED)
|
|
237
|
+
host.camera.glide(v.x, v.y);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
else if (!multi && !cancelled) {
|
|
241
|
+
host.click(x, y, e);
|
|
242
|
+
}
|
|
243
|
+
dragging = false;
|
|
244
|
+
multi = false;
|
|
245
|
+
};
|
|
246
|
+
const onLeave = () => {
|
|
247
|
+
if (pointers.size === 0)
|
|
248
|
+
host.leave();
|
|
249
|
+
};
|
|
250
|
+
const onWheel = (e) => {
|
|
251
|
+
e.preventDefault();
|
|
252
|
+
if (gesture && e.ctrlKey)
|
|
253
|
+
return; // Safari also reports the pinch as gesture events.
|
|
254
|
+
let [x, y] = local(e);
|
|
255
|
+
if (!Number.isFinite(x) || !Number.isFinite(y)) {
|
|
256
|
+
x = el.clientWidth / 2;
|
|
257
|
+
y = el.clientHeight / 2;
|
|
258
|
+
}
|
|
259
|
+
const sample = {
|
|
260
|
+
deltaX: e.deltaX,
|
|
261
|
+
deltaY: e.deltaY,
|
|
262
|
+
deltaMode: e.deltaMode,
|
|
263
|
+
ctrlKey: e.ctrlKey,
|
|
264
|
+
metaKey: e.metaKey,
|
|
265
|
+
wheelDeltaY: 'wheelDeltaY' in e ? Number(e.wheelDeltaY) : undefined,
|
|
266
|
+
};
|
|
267
|
+
const intent = classifyWheel(sample, wheelMemory, host.now());
|
|
268
|
+
const d = wheelPixels(sample, el.clientHeight);
|
|
269
|
+
if (intent === 'pan') {
|
|
270
|
+
host.camera.interrupt();
|
|
271
|
+
host.camera.panNow(-d.x, -d.y);
|
|
272
|
+
}
|
|
273
|
+
else if (intent === 'pinch') {
|
|
274
|
+
host.camera.interrupt();
|
|
275
|
+
host.camera.zoomNow(wheelZoomFactor('pinch', d.y), x, y);
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
host.camera.touched = true;
|
|
279
|
+
host.camera.zoomSmooth(wheelZoomFactor('notch', d.y), x, y);
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
const onDblClick = (e) => {
|
|
283
|
+
const [x, y] = local(e);
|
|
284
|
+
host.dblclick(x, y, e);
|
|
285
|
+
};
|
|
286
|
+
const onGestureStart = (e) => {
|
|
287
|
+
e.preventDefault();
|
|
288
|
+
if (pointers.size >= 2)
|
|
289
|
+
return; // Touch pinch is handled through pointer events.
|
|
290
|
+
gesture = true;
|
|
291
|
+
gestureScale = 1;
|
|
292
|
+
host.camera.interrupt();
|
|
293
|
+
};
|
|
294
|
+
const onGestureChange = (e) => {
|
|
295
|
+
e.preventDefault();
|
|
296
|
+
if (!gesture || pointers.size >= 2)
|
|
297
|
+
return;
|
|
298
|
+
const g = e;
|
|
299
|
+
if (!(g.scale > 0))
|
|
300
|
+
return;
|
|
301
|
+
const [x, y] = local(g);
|
|
302
|
+
host.camera.zoomNow(g.scale / gestureScale, x, y);
|
|
303
|
+
gestureScale = g.scale;
|
|
304
|
+
};
|
|
305
|
+
const onGestureEnd = (e) => {
|
|
306
|
+
e.preventDefault();
|
|
307
|
+
gesture = false;
|
|
308
|
+
};
|
|
309
|
+
const listeners = [
|
|
310
|
+
['pointerdown', onDown],
|
|
311
|
+
['pointermove', onMove],
|
|
312
|
+
['pointerup', onUp],
|
|
313
|
+
['pointercancel', onUp],
|
|
314
|
+
['pointerleave', onLeave],
|
|
315
|
+
['wheel', onWheel, { passive: false }],
|
|
316
|
+
['dblclick', onDblClick],
|
|
317
|
+
['gesturestart', onGestureStart, { passive: false }],
|
|
318
|
+
['gesturechange', onGestureChange, { passive: false }],
|
|
319
|
+
['gestureend', onGestureEnd, { passive: false }],
|
|
320
|
+
];
|
|
321
|
+
for (const [type, fn, opts] of listeners)
|
|
322
|
+
el.addEventListener(type, fn, opts);
|
|
323
|
+
return () => {
|
|
324
|
+
for (const [type, fn, opts] of listeners)
|
|
325
|
+
el.removeEventListener(type, fn, opts);
|
|
326
|
+
pointers.clear();
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"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"}
|
package/dist/labels.d.ts
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Greedy label placement in screen space (docs/visual-language.md §Level of detail).
|
|
3
|
+
*
|
|
4
|
+
* Labels are placed by priority (desc; ties by `order`, so placement is deterministic). Each
|
|
5
|
+
* tries its candidate positions in order and takes the first that does not overlap anything
|
|
6
|
+
* placed before it (labels, badges, node discs). Overlap tests use a uniform grid, so a frame
|
|
7
|
+
* with n labels costs O(n) expected.
|
|
8
|
+
*/
|
|
9
|
+
import type { LabelVisual } from '@kgdiff/scene';
|
|
10
|
+
/** Gap (px) between a node's edge and a label beside it. */
|
|
11
|
+
export declare const LABEL_SIDE_GAP = 6;
|
|
12
|
+
/** Breathing room (px) kept between placed boxes. */
|
|
13
|
+
export declare const LABEL_PAD = 2;
|
|
14
|
+
/** Candidate sides. */
|
|
15
|
+
export declare const SIDE_BELOW = 0;
|
|
16
|
+
export declare const SIDE_RIGHT = 1;
|
|
17
|
+
export declare const SIDE_ABOVE = 2;
|
|
18
|
+
export declare const SIDE_LEFT = 3;
|
|
19
|
+
export declare const SIDE_CENTER = 4;
|
|
20
|
+
/** Node labels try below, right, above, left. */
|
|
21
|
+
export declare const MODE_NODE = 0;
|
|
22
|
+
/** Edge / glyph labels try centred on the anchor, then above, then below it. */
|
|
23
|
+
export declare const MODE_POINT = 1;
|
|
24
|
+
/** Fixed boxes (collapsed pills): centred on the anchor or not at all. */
|
|
25
|
+
export declare const MODE_FIXED = 2;
|
|
26
|
+
/** One label block (a primary line with an optional secondary line under it). */
|
|
27
|
+
export interface LabelRequest {
|
|
28
|
+
/** Anchor (node centre or edge midpoint), css px. */
|
|
29
|
+
x: number;
|
|
30
|
+
y: number;
|
|
31
|
+
/** Clearance around the anchor (node radius on screen), px. */
|
|
32
|
+
r: number;
|
|
33
|
+
/** Block size, px. */
|
|
34
|
+
w: number;
|
|
35
|
+
h: number;
|
|
36
|
+
/** Distance below the node edge for the `below` candidate (and above for `above`), px. */
|
|
37
|
+
offset: number;
|
|
38
|
+
priority: number;
|
|
39
|
+
/** Tie-breaker: lower wins. */
|
|
40
|
+
order: number;
|
|
41
|
+
mode: number;
|
|
42
|
+
/** Collapsed-group index for pills, -1 for labels. */
|
|
43
|
+
pill: number;
|
|
44
|
+
placed: boolean;
|
|
45
|
+
side: number;
|
|
46
|
+
bx: number;
|
|
47
|
+
by: number;
|
|
48
|
+
alpha: number;
|
|
49
|
+
primary: LabelVisual | null;
|
|
50
|
+
secondary: LabelVisual | null;
|
|
51
|
+
textP: string;
|
|
52
|
+
textS: string;
|
|
53
|
+
fontP: string;
|
|
54
|
+
fontS: string;
|
|
55
|
+
wP: number;
|
|
56
|
+
wS: number;
|
|
57
|
+
hP: number;
|
|
58
|
+
hS: number;
|
|
59
|
+
/** Offset of the secondary line from the block top, px. */
|
|
60
|
+
dyS: number;
|
|
61
|
+
}
|
|
62
|
+
export declare function createRequest(): LabelRequest;
|
|
63
|
+
/** Region labels must stay in. With `strictX`, boxes may not cross x0 / x1 (swipe divider). */
|
|
64
|
+
export interface LabelClip {
|
|
65
|
+
x0: number;
|
|
66
|
+
y0: number;
|
|
67
|
+
x1: number;
|
|
68
|
+
y1: number;
|
|
69
|
+
strictX: boolean;
|
|
70
|
+
}
|
|
71
|
+
/** Uniform-grid index of occupied screen rectangles. */
|
|
72
|
+
export declare class CollisionGrid {
|
|
73
|
+
private cell;
|
|
74
|
+
private cols;
|
|
75
|
+
private rows;
|
|
76
|
+
private x0;
|
|
77
|
+
private y0;
|
|
78
|
+
private cells;
|
|
79
|
+
private touched;
|
|
80
|
+
private rects;
|
|
81
|
+
private n;
|
|
82
|
+
/** Clear and cover [x0, x0 + width] × [y0, y0 + height] with `cell`-px cells. */
|
|
83
|
+
reset(x0: number, y0: number, width: number, height: number, cell?: number): void;
|
|
84
|
+
get count(): number;
|
|
85
|
+
insert(x: number, y: number, w: number, h: number): void;
|
|
86
|
+
overlaps(x: number, y: number, w: number, h: number): boolean;
|
|
87
|
+
private col;
|
|
88
|
+
private row;
|
|
89
|
+
}
|
|
90
|
+
/** Top-left of a candidate box (written by `candidateBox`, so placement never allocates). */
|
|
91
|
+
export declare const candidate: {
|
|
92
|
+
x: number;
|
|
93
|
+
y: number;
|
|
94
|
+
};
|
|
95
|
+
/** Top-left of `req`'s box for a candidate side, written into `candidate`. */
|
|
96
|
+
export declare function candidateBox(req: LabelRequest, side: number): typeof candidate;
|
|
97
|
+
/**
|
|
98
|
+
* Place `requests` (sorted in place by priority) against `grid`, which may already hold
|
|
99
|
+
* obstacles. Sets `placed`, `side`, `bx`, `by` on each request and inserts placed boxes.
|
|
100
|
+
* Returns the number of labels placed.
|
|
101
|
+
*/
|
|
102
|
+
export declare function placeLabels(requests: LabelRequest[], grid: CollisionGrid, clip: LabelClip): number;
|
|
103
|
+
//# sourceMappingURL=labels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../src/labels.ts"],"names":[],"mappings":"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"}
|
package/dist/labels.js
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { rectsOverlap } from './math.js';
|
|
2
|
+
/** Gap (px) between a node's edge and a label beside it. */
|
|
3
|
+
export const LABEL_SIDE_GAP = 6;
|
|
4
|
+
/** Breathing room (px) kept between placed boxes. */
|
|
5
|
+
export const LABEL_PAD = 2;
|
|
6
|
+
/** Candidate sides. */
|
|
7
|
+
export const SIDE_BELOW = 0;
|
|
8
|
+
export const SIDE_RIGHT = 1;
|
|
9
|
+
export const SIDE_ABOVE = 2;
|
|
10
|
+
export const SIDE_LEFT = 3;
|
|
11
|
+
export const SIDE_CENTER = 4;
|
|
12
|
+
/** Node labels try below, right, above, left. */
|
|
13
|
+
export const MODE_NODE = 0;
|
|
14
|
+
/** Edge / glyph labels try centred on the anchor, then above, then below it. */
|
|
15
|
+
export const MODE_POINT = 1;
|
|
16
|
+
/** Fixed boxes (collapsed pills): centred on the anchor or not at all. */
|
|
17
|
+
export const MODE_FIXED = 2;
|
|
18
|
+
export function createRequest() {
|
|
19
|
+
return {
|
|
20
|
+
x: 0,
|
|
21
|
+
y: 0,
|
|
22
|
+
r: 0,
|
|
23
|
+
w: 0,
|
|
24
|
+
h: 0,
|
|
25
|
+
offset: 0,
|
|
26
|
+
priority: 0,
|
|
27
|
+
order: 0,
|
|
28
|
+
mode: MODE_NODE,
|
|
29
|
+
pill: -1,
|
|
30
|
+
placed: false,
|
|
31
|
+
side: SIDE_BELOW,
|
|
32
|
+
bx: 0,
|
|
33
|
+
by: 0,
|
|
34
|
+
alpha: 1,
|
|
35
|
+
primary: null,
|
|
36
|
+
secondary: null,
|
|
37
|
+
textP: '',
|
|
38
|
+
textS: '',
|
|
39
|
+
fontP: '',
|
|
40
|
+
fontS: '',
|
|
41
|
+
wP: 0,
|
|
42
|
+
wS: 0,
|
|
43
|
+
hP: 0,
|
|
44
|
+
hS: 0,
|
|
45
|
+
dyS: 0,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/** Uniform-grid index of occupied screen rectangles. */
|
|
49
|
+
export class CollisionGrid {
|
|
50
|
+
cell = 64;
|
|
51
|
+
cols = 1;
|
|
52
|
+
rows = 1;
|
|
53
|
+
x0 = 0;
|
|
54
|
+
y0 = 0;
|
|
55
|
+
cells = [[]];
|
|
56
|
+
touched = [];
|
|
57
|
+
rects = new Float64Array(4 * 256);
|
|
58
|
+
n = 0;
|
|
59
|
+
/** Clear and cover [x0, x0 + width] × [y0, y0 + height] with `cell`-px cells. */
|
|
60
|
+
reset(x0, y0, width, height, cell = 64) {
|
|
61
|
+
for (const c of this.touched)
|
|
62
|
+
this.cells[c].length = 0;
|
|
63
|
+
this.touched.length = 0;
|
|
64
|
+
this.n = 0;
|
|
65
|
+
this.cell = cell;
|
|
66
|
+
this.x0 = x0;
|
|
67
|
+
this.y0 = y0;
|
|
68
|
+
this.cols = Math.max(1, Math.ceil(width / cell));
|
|
69
|
+
this.rows = Math.max(1, Math.ceil(height / cell));
|
|
70
|
+
const need = this.cols * this.rows;
|
|
71
|
+
while (this.cells.length < need)
|
|
72
|
+
this.cells.push([]);
|
|
73
|
+
}
|
|
74
|
+
get count() {
|
|
75
|
+
return this.n;
|
|
76
|
+
}
|
|
77
|
+
insert(x, y, w, h) {
|
|
78
|
+
if (this.rects.length < (this.n + 1) * 4) {
|
|
79
|
+
const next = new Float64Array(this.rects.length * 2);
|
|
80
|
+
next.set(this.rects);
|
|
81
|
+
this.rects = next;
|
|
82
|
+
}
|
|
83
|
+
const id = this.n++;
|
|
84
|
+
const o = id * 4;
|
|
85
|
+
this.rects[o] = x;
|
|
86
|
+
this.rects[o + 1] = y;
|
|
87
|
+
this.rects[o + 2] = w;
|
|
88
|
+
this.rects[o + 3] = h;
|
|
89
|
+
const c0 = this.col(x);
|
|
90
|
+
const c1 = this.col(x + w);
|
|
91
|
+
const r0 = this.row(y);
|
|
92
|
+
const r1 = this.row(y + h);
|
|
93
|
+
for (let r = r0; r <= r1; r++) {
|
|
94
|
+
for (let c = c0; c <= c1; c++) {
|
|
95
|
+
const idx = r * this.cols + c;
|
|
96
|
+
const list = this.cells[idx];
|
|
97
|
+
if (list.length === 0)
|
|
98
|
+
this.touched.push(idx);
|
|
99
|
+
list.push(id);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
overlaps(x, y, w, h) {
|
|
104
|
+
const c0 = this.col(x);
|
|
105
|
+
const c1 = this.col(x + w);
|
|
106
|
+
const r0 = this.row(y);
|
|
107
|
+
const r1 = this.row(y + h);
|
|
108
|
+
const rects = this.rects;
|
|
109
|
+
for (let r = r0; r <= r1; r++) {
|
|
110
|
+
for (let c = c0; c <= c1; c++) {
|
|
111
|
+
const list = this.cells[r * this.cols + c];
|
|
112
|
+
for (let i = 0; i < list.length; i++) {
|
|
113
|
+
const o = list[i] * 4;
|
|
114
|
+
if (rectsOverlap(x, y, w, h, rects[o], rects[o + 1], rects[o + 2], rects[o + 3])) {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
col(x) {
|
|
123
|
+
const c = Math.floor((x - this.x0) / this.cell);
|
|
124
|
+
return c < 0 ? 0 : c >= this.cols ? this.cols - 1 : c;
|
|
125
|
+
}
|
|
126
|
+
row(y) {
|
|
127
|
+
const r = Math.floor((y - this.y0) / this.cell);
|
|
128
|
+
return r < 0 ? 0 : r >= this.rows ? this.rows - 1 : r;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function byPriority(a, b) {
|
|
132
|
+
return b.priority - a.priority || a.order - b.order;
|
|
133
|
+
}
|
|
134
|
+
const NODE_SIDES = [SIDE_BELOW, SIDE_RIGHT, SIDE_ABOVE, SIDE_LEFT];
|
|
135
|
+
const POINT_SIDES = [SIDE_CENTER, SIDE_ABOVE, SIDE_BELOW];
|
|
136
|
+
const FIXED_SIDES = [SIDE_CENTER];
|
|
137
|
+
/** Top-left of a candidate box (written by `candidateBox`, so placement never allocates). */
|
|
138
|
+
export const candidate = { x: 0, y: 0 };
|
|
139
|
+
/** Top-left of `req`'s box for a candidate side, written into `candidate`. */
|
|
140
|
+
export function candidateBox(req, side) {
|
|
141
|
+
const { x, y, r, w, h } = req;
|
|
142
|
+
let bx;
|
|
143
|
+
let by;
|
|
144
|
+
if (req.mode === MODE_FIXED) {
|
|
145
|
+
bx = x - w / 2;
|
|
146
|
+
by = y - h / 2;
|
|
147
|
+
}
|
|
148
|
+
else if (req.mode === MODE_POINT) {
|
|
149
|
+
bx = x - w / 2;
|
|
150
|
+
by = side === SIDE_ABOVE ? y - h - 4 : side === SIDE_BELOW ? y + 4 : y - h / 2;
|
|
151
|
+
}
|
|
152
|
+
else if (side === SIDE_RIGHT) {
|
|
153
|
+
bx = x + r + LABEL_SIDE_GAP;
|
|
154
|
+
by = y - h / 2;
|
|
155
|
+
}
|
|
156
|
+
else if (side === SIDE_ABOVE) {
|
|
157
|
+
bx = x - w / 2;
|
|
158
|
+
by = y - r - req.offset - h;
|
|
159
|
+
}
|
|
160
|
+
else if (side === SIDE_LEFT) {
|
|
161
|
+
bx = x - r - LABEL_SIDE_GAP - w;
|
|
162
|
+
by = y - h / 2;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
bx = x - w / 2;
|
|
166
|
+
by = y + r + req.offset;
|
|
167
|
+
}
|
|
168
|
+
candidate.x = bx;
|
|
169
|
+
candidate.y = by;
|
|
170
|
+
return candidate;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Place `requests` (sorted in place by priority) against `grid`, which may already hold
|
|
174
|
+
* obstacles. Sets `placed`, `side`, `bx`, `by` on each request and inserts placed boxes.
|
|
175
|
+
* Returns the number of labels placed.
|
|
176
|
+
*/
|
|
177
|
+
export function placeLabels(requests, grid, clip) {
|
|
178
|
+
requests.sort(byPriority);
|
|
179
|
+
let placed = 0;
|
|
180
|
+
for (const req of requests) {
|
|
181
|
+
req.placed = false;
|
|
182
|
+
const sides = req.mode === MODE_FIXED ? FIXED_SIDES : req.mode === MODE_POINT ? POINT_SIDES : NODE_SIDES;
|
|
183
|
+
for (const side of sides) {
|
|
184
|
+
const { x: bx, y: by } = candidateBox(req, side);
|
|
185
|
+
const { w, h } = req;
|
|
186
|
+
if (bx + w < clip.x0 || bx > clip.x1 || by + h < clip.y0 || by > clip.y1)
|
|
187
|
+
continue;
|
|
188
|
+
if (clip.strictX && (bx < clip.x0 || bx + w > clip.x1))
|
|
189
|
+
continue;
|
|
190
|
+
if (grid.overlaps(bx, by, w, h))
|
|
191
|
+
continue;
|
|
192
|
+
grid.insert(bx - LABEL_PAD, by - LABEL_PAD, w + 2 * LABEL_PAD, h + 2 * LABEL_PAD);
|
|
193
|
+
req.placed = true;
|
|
194
|
+
req.side = side;
|
|
195
|
+
req.bx = bx;
|
|
196
|
+
req.by = by;
|
|
197
|
+
placed++;
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return placed;
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=labels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels.js","sourceRoot":"","sources":["../src/labels.ts"],"names":[],"mappings":"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"}
|